Solanan Token Programs tukee delegointia – toisen tilin valtuuttamista siirtämään tokeneita token-tililtäsi tiettyyn rajaan asti. Tämä mahdollistaa käyttötapaukset kuten automatisoidut maksut, sulkutilit ja kolmannen osapuolen maksunkäsittely luopumatta varojen hallinnasta.
Miten delegointi toimii
Kun hyväksyt delegaatin, valtuutat tietyn tilin siirtämään tokeneita puolestasi:
- Omistaja säilyttää hallinnan: omistat edelleen tokenit ja voit siirtää tai peruuttaa milloin tahansa
- Rajoitettu käyttö: delegaatti voi siirtää vain hyväksyttyyn määrään asti
- Yksi delegaatti per tili: jokaisella token-tilillä voi olla vain yksi aktiivinen delegaatti
- Uusi hyväksyntä korvaa vanhan: uuden delegaatin hyväksyminen peruuttaa automaattisesti edellisen
Delegointi ei ole säilytyspalvelu. Delegaatti voi käyttää tokeneita rajaan asti, mutta ei voi käyttää tai tyhjentää tiliä hyväksytyn määrän yli. Omistaja voi peruuttaa milloin tahansa.
Liiketoiminnan käyttötapaukset
| Käyttötapaus | Miten delegointi auttaa |
|---|---|
| Maksunkäsittelijät | Kauppias myöntää käsittelijälle luvan selvittää transaktiot |
| Automatisoitu palkanlaskenta | Kassaosasto hyväksyy palkanlaskentapalvelun maksamaan palkat |
| Sulkutilit | Ostaja delegoi sulkutiliagentille ehdollista vapauttamista varten |
| Kaupankäyntialustat | Käyttäjä hyväksyy pörssin toteuttamaan kauppoja puolestaan |
| Korttien myöntäminen | Käyttäjä hyväksyy kortinmyöntäjän veloittamaan ostokset token-tililtään |
Delegaatin hyväksyminen
Myönnä toiselle tilille lupa käyttää tokeneja tililtäsi:
import { getApproveCheckedInstruction } from "@solana-program/token";// Approve delegate to spend up to 1,000 USDC (6 decimals)const approveInstruction = getApproveCheckedInstruction({source: tokenAccountAddress, // Your token accountmint: usdcMintAddress, // USDC mintdelegate: delegateAddress, // Account receiving permissionowner: ownerKeypair, // You (must sign)amount: 1_000_000_000n, // 1,000 USDC in base unitsdecimals: 6});
Parametrit:
source: Token account, joka myöntää luvandelegate: Tili, joka saa käyttöoikeudenowner: Token accountin nykyinen omistaja (täytyy allekirjoittaa transaktio)amount: Maksimimäärä tokeneita, jotka delegaatti voi siirtäädecimals: Tokenin desimaalit validointia varten (estää desimaaliviat)
Demo
// Generate keypairs for sender and delegateconst sender = (await generateKeypair()).signer;const delegate = (await generateKeypair()).signer;console.log("Sender Address:", sender.address);console.log("Delegate Address:", delegate.address);// Demo Setup: Create client, mint account, token account, and fund with initial tokensconst { client, mint, senderAta } = await demoSetup(sender);console.log("\nMint Address:", mint.address);console.log("Sender ATA:", senderAta);// =============================================================================// Approve Delegate// =============================================================================// Create instruction to approve delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst signature = await client.transaction.prepareAndSend({authority: sender,instructions: [approveInstruction]});console.log("\n=== Approve Delegate ===");console.log("Transaction Signature:", signature);// Fetch token account data to show delegate is setconst tokenData = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenData.data);// =============================================================================// Demo Setup Helper Function// =============================================================================
Delegaatin peruuttaminen
Poista kaikki käyttöoikeudet nykyiseltä delegaatilta:
import { getRevokeInstruction } from "@solana-program/token";const revokeInstruction = getRevokeInstruction({source: tokenAccountAddress, // Your token accountowner: ownerKeypair // You (must sign)});
Revoke poistaa kaikki delegaatin oikeudet – osittaista peruutusta ei ole. Jos haluat pienentää rajaa, hyväksy sama delegaatti pienemmällä summalla.
Demo
// Generate keypairs for sender and delegateconst sender = (await generateKeypair()).signer;const delegate = (await generateKeypair()).signer;console.log("Sender Address:", sender.address);console.log("Delegate Address:", delegate.address);// Demo Setup: Create client, mint account, token account, and fund with initial tokensconst { client, mint, senderAta } = await demoSetup(sender);console.log("\nMint Address:", mint.address);console.log("Sender ATA:", senderAta);// =============================================================================// Transaction 1: Approve Delegate// =============================================================================// Create instruction to approve delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst approveSignature = await client.transaction.prepareAndSend({authority: sender,instructions: [approveInstruction]});console.log("\n=== Transaction 1: Approve Delegate ===");console.log("Transaction Signature:", approveSignature);// Fetch token account data to show delegate is setconst tokenDataAfterApprove = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenDataAfterApprove.data);// =============================================================================// Transaction 2: Revoke Delegate// =============================================================================// Create instruction to revoke delegateconst revokeInstruction = getRevokeInstruction({source: senderAta,owner: sender});// Send revoke transactionconst revokeSignature = await client.transaction.prepareAndSend({authority: sender,instructions: [revokeInstruction]});console.log("\n=== Transaction 2: Revoke Delegate ===");console.log("Transaction Signature:", revokeSignature);// Fetch token account data to show delegate is revokedconst tokenDataAfterRevoke = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenDataAfterRevoke.data);// =============================================================================// Demo Setup Helper Function// =============================================================================
Siirto delegaattina
Kun toimit delegaattina, käytä tavallista siirtoa mutta allekirjoita delegaatin keypairilla omistajan sijaan:
import { getTransferCheckedInstruction } from "@solana-program/token";const transferInstruction = getTransferCheckedInstruction({source: ownerTokenAccount, // The account you have permission to spend frommint: usdcMintAddress,destination: recipientTokenAccount,authority: delegateKeypair, // You (the delegate) sign, not the owneramount: 100_000_000n, // 100 USDCdecimals: 6});
Siirto onnistuu, jos:
- Lähdetilillä on riittävä saldo
- Delegaatti allekirjoittaa transaktion
Jokainen siirto vähentää jäljellä olevaa käyttörajaa. Kun käyttöraja saavuttaa nollan, delegaatti ei voi enää siirtää tokeneita.
Demo
// Generate keypairs for sender, delegate, and recipientconst sender = (await generateKeypair()).signer;const delegate = (await generateKeypair()).signer;const recipient = (await generateKeypair()).signer;console.log("Sender Address:", sender.address);console.log("Delegate Address:", delegate.address);console.log("Recipient Address:", recipient.address);// Demo Setup: Create client, mint account, token accounts, and fund with initial tokensconst { client, mint, senderAta, recipientAta } = await demoSetup(sender,delegate,recipient);console.log("\nMint Address:", mint.address);console.log("Sender ATA:", senderAta);console.log("Recipient ATA:", recipientAta);// =============================================================================// Transaction 1: Approve Delegate// =============================================================================// Create instruction to approve delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst approveSignature = await client.transaction.prepareAndSend({authority: sender,instructions: [approveInstruction]});console.log("\n=== Transaction 1: Approve Delegate ===");console.log("Delegate Address:", delegate.address);console.log("Transaction Signature:", approveSignature);// =============================================================================// Fetch Token Account Data to Demonstrate Delegate is Set// =============================================================================const tokenAccountData = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenAccountData.data);// =============================================================================// Transaction 2: Transfer Using Delegate// =============================================================================// Create instruction to transfer tokens using delegate// Note: delegate is the authority here, not the ownerconst transferInstruction = getTransferCheckedInstruction({source: senderAta,mint: mint.address,destination: recipientAta,authority: delegate, // Delegate signs this transactionamount: 500_000n, // 0.5 tokens with 6 decimalsdecimals: 6});// Send transfer transaction// Delegate pays for the transaction and authorizes the transfer (sender not needed)const transferSignature = await client.transaction.prepareAndSend({authority: delegate, // Delegate pays fee and signsinstructions: [transferInstruction]});// =============================================================================// Fetch Final Token Account Balances// =============================================================================const finalSenderToken = await fetchToken(client.runtime.rpc, senderAta);const finalRecipientToken = await fetchToken(client.runtime.rpc, recipientAta);console.log("\n=== Transaction 2: Transfer Using Delegate ===");console.log("Transaction Signature:", transferSignature);console.log("\nSender Token Account Data:", finalSenderToken.data);console.log("\nRecipient Token Account Data:", finalRecipientToken.data);// =============================================================================// Demo Setup Helper Function// =============================================================================
Delegoinnin tilan tarkistaminen
Tarkista token accountista sen nykyinen delegaatti ja jäljellä oleva käyttöraja:
import { fetchToken } from "@solana-program/token";const tokenAccount = await fetchToken(rpc, tokenAccountAddress);if (tokenAccount.data.delegate) {console.log("Delegate:", tokenAccount.data.delegate);console.log("Remaining allowance:", tokenAccount.data.delegatedAmount);} else {console.log("No delegate set");}
Demo
// Demo Setup: Create client, mint, two token accounts (one with delegate, one without)const { client, ataWithDelegate, ataWithoutDelegate } = await demoSetup();// =============================================================================// Fetch Token Accounts// =============================================================================// Fetch token account with delegateconst tokenWithDelegate = await fetchToken(client.runtime.rpc, ataWithDelegate);console.log("Token Account with Delegate:", tokenWithDelegate);// Fetch token account without delegateconst tokenWithoutDelegate = await fetchToken(client.runtime.rpc,ataWithoutDelegate);console.log("\nToken Account without Delegate:", tokenWithoutDelegate);// =============================================================================// Demo Setup Helper Function// =============================================================================
Turvallisuusnäkökohdat
Tilin omistajille:
- Hyväksy vain luotettavia delegaatteja
- Aseta mahdollisimman pieni tarpeellinen käyttöraja
- Peruuta delegoinnit, kun niitä ei enää tarvita
- Seuraa tilejäsi odottamattomien siirtojen varalta
Palveluntarjoajille (delegaateille):
- Kerro selkeästi käyttäjille pyydetty käyttöraja
- Toteuta asianmukainen avaintenhallinta delegaattitilillesi
- Seuraa käyttöoikeuden kulutusta pyytääksesi uudelleenhyväksyntää ennen rajojen täyttymistä
Delegointi vs. säilytys
| Näkökohta | Delegointi | Täysi säilytys |
|---|---|---|
| Tokenien omistus | Käyttäjä säilyttää | Käyttäjä siirtää säilyttäjälle |
| Käyttöoikeuden hallinta | Rajoitettu hyväksyttyyn määrään | Täysi pääsy siirrettyihin varoihin |
| Peruuttaminen | Välitön, omistajan toimesta | Vaatii säilyttäjän yhteistyötä |
| Riskialtistus | Rajoitettu hyväksyttyyn määrään | Koko saldo |
| Vaadittu luottamus | Rajallinen | Korkea |
Delegointi tarjoaa keskitien – mahdollistaa automaattiset maksut samalla kun riskialtistus rajoittuu hyväksyttyyn määrään.
Liittyvät resurssit
| Resurssi | Kuvaus |
|---|---|
| Approve Delegate | Kuinka myöntää toiselle tilille lupa käyttää token accountistasi. |
| Revoke Delegate | Kuinka poistaa olemassa oleva delegaatti ja peruuttaa sen käyttöoikeudet. |
| Transfer Token | Kuinka siirtää tokeneita token accountien välillä. |
Is this page helpful?