MaksutEdistyneet maksut

Käyttöoikeudet

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ötapausMiten delegointi auttaa
MaksunkäsittelijätKauppias myöntää käsittelijälle luvan selvittää transaktiot
Automatisoitu palkanlaskentaKassaosasto hyväksyy palkanlaskentapalvelun maksamaan palkat
SulkutilitOstaja delegoi sulkutiliagentille ehdollista vapauttamista varten
KaupankäyntialustatKäyttäjä hyväksyy pörssin toteuttamaan kauppoja puolestaan
Korttien myöntäminenKä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 account
mint: usdcMintAddress, // USDC mint
delegate: delegateAddress, // Account receiving permission
owner: ownerKeypair, // You (must sign)
amount: 1_000_000_000n, // 1,000 USDC in base units
decimals: 6
});

Parametrit:

  • source: Token account, joka myöntää luvan
  • delegate: Tili, joka saa käyttöoikeuden
  • owner: Token accountin nykyinen omistaja (täytyy allekirjoittaa transaktio)
  • amount: Maksimimäärä tokeneita, jotka delegaatti voi siirtää
  • decimals: Tokenin desimaalit validointia varten (estää desimaaliviat)

Demo

Approve Delegate
// Generate keypairs for sender and delegate
const 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 tokens
const { client, mint, senderAta } = await demoSetup(sender);
console.log("\nMint Address:", mint.address);
console.log("Sender ATA:", senderAta);
// =============================================================================
// Approve Delegate
// =============================================================================
// Create instruction to approve delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const 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 set
const tokenData = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenData.data);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

Delegaatin peruuttaminen

Poista kaikki käyttöoikeudet nykyiseltä delegaatilta:

import { getRevokeInstruction } from "@solana-program/token";
const revokeInstruction = getRevokeInstruction({
source: tokenAccountAddress, // Your token account
owner: 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

Revoke Delegate
// Generate keypairs for sender and delegate
const 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 tokens
const { 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 delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const 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 set
const tokenDataAfterApprove = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenDataAfterApprove.data);
// =============================================================================
// Transaction 2: Revoke Delegate
// =============================================================================
// Create instruction to revoke delegate
const revokeInstruction = getRevokeInstruction({
source: senderAta,
owner: sender
});
// Send revoke transaction
const 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 revoked
const tokenDataAfterRevoke = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenDataAfterRevoke.data);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

Siirto delegaattina

Kun toimit delegaattina, käytä tavallista siirtoa mutta allekirjoita delegaatin keypairilla omistajan sijaan:

Transfer as Delegate
import { getTransferCheckedInstruction } from "@solana-program/token";
const transferInstruction = getTransferCheckedInstruction({
source: ownerTokenAccount, // The account you have permission to spend from
mint: usdcMintAddress,
destination: recipientTokenAccount,
authority: delegateKeypair, // You (the delegate) sign, not the owner
amount: 100_000_000n, // 100 USDC
decimals: 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

Transfer as Delegate
// Generate keypairs for sender, delegate, and recipient
const 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 tokens
const { 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 delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const 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 owner
const transferInstruction = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: delegate, // Delegate signs this transaction
amount: 500_000n, // 0.5 tokens with 6 decimals
decimals: 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 signs
instructions: [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
// =============================================================================
Console
Click to execute the code.

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

Check Delegation Status
// 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 delegate
const tokenWithDelegate = await fetchToken(client.runtime.rpc, ataWithDelegate);
console.log("Token Account with Delegate:", tokenWithDelegate);
// Fetch token account without delegate
const tokenWithoutDelegate = await fetchToken(
client.runtime.rpc,
ataWithoutDelegate
);
console.log("\nToken Account without Delegate:", tokenWithoutDelegate);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

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ökohtaDelegointiTäysi säilytys
Tokenien omistusKäyttäjä säilyttääKäyttäjä siirtää säilyttäjälle
Käyttöoikeuden hallintaRajoitettu hyväksyttyyn määräänTäysi pääsy siirrettyihin varoihin
PeruuttaminenVälitön, omistajan toimestaVaatii säilyttäjän yhteistyötä
RiskialtistusRajoitettu hyväksyttyyn määräänKoko saldo
Vaadittu luottamusRajallinenKorkea

Delegointi tarjoaa keskitien – mahdollistaa automaattiset maksut samalla kun riskialtistus rajoittuu hyväksyttyyn määrään.

Liittyvät resurssit

ResurssiKuvaus
Approve DelegateKuinka myöntää toiselle tilille lupa käyttää token accountistasi.
Revoke DelegateKuinka poistaa olemassa oleva delegaatti ja peruuttaa sen käyttöoikeudet.
Transfer TokenKuinka siirtää tokeneita token accountien välillä.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä