Una delega fissa consente a un utente di autorizzare un altro wallet o servizio
a prelevare fino a un importo fisso di token. Ogni trasferimento andato a buon
fine riduce il limite residuo. Usa expiryTs = 0 per nessuna scadenza.
Questa guida mantiene il flusso visibile. Ogni snippet utilizza direttamente le funzioni SDK in modo da poter vedere quale account viene derivato, quale istruzione viene inviata e quale firmatario paga o autorizza ogni passaggio.
Installazione
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Creare la Delega
La configurazione prevede quattro parti:
- Creare un client con il firmatario utente e il plugin di sottoscrizioni.
- Derivare il token account dell'utente e il PDA Subscription Authority.
- Inizializzare Subscription Authority se non esiste ancora.
- Creare la delega fissa e derivare il suo PDA per i trasferimenti successivi.
import { address, createClient } from '@solana/kit';import { solanaLocalRpc } from '@solana/kit-plugin-rpc';import { signer } from '@solana/kit-plugin-signer';import { findAssociatedTokenPda, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';import {fetchMaybeSubscriptionAuthority,findFixedDelegationPda,findSubscriptionAuthorityPda,subscriptionsProgram,} from '@solana/subscriptions';const client = createClient().use(signer(userSigner)).use(solanaLocalRpc({ rpcUrl: 'http://127.0.0.1:8899' })).use(subscriptionsProgram());const tokenMint = address('TOKEN_MINT_ADDRESS_HERE');const delegatee = address('DELEGATEE_WALLET_ADDRESS_HERE');const nonce = 0n;const amount = 1_000_000n;const expiryTs = BigInt(Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 30);const [userAta] = await findAssociatedTokenPda({mint: tokenMint,owner: userSigner.address,tokenProgram: TOKEN_PROGRAM_ADDRESS,});const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({user: userSigner.address,tokenMint,});const subscriptionAuthority = await fetchMaybeSubscriptionAuthority(client.rpc,subscriptionAuthorityPda,);if (!subscriptionAuthority.exists) {await client.subscriptions.instructions.initSubscriptionAuthority({tokenMint,tokenProgram: TOKEN_PROGRAM_ADDRESS,userAta,}).sendTransaction();}await client.subscriptions.instructions.createFixedDelegation({tokenMint,delegatee,nonce,amount,expiryTs,}).sendTransaction();const [delegationPda] = await findFixedDelegationPda({subscriptionAuthority: subscriptionAuthorityPda,delegator: userSigner.address,delegatee,nonce,});
Trasferire dalla Delega
Il delegatario firma il trasferimento. L'SDK necessita dello stesso PDA di delega, del token account dell'utente e del token account del destinatario.
const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');await client.subscriptions.instructions.transferFixed({delegatee: delegateeSigner,delegator: userSigner.address,delegatorAta: userAta,tokenMint,delegationPda,amount: 100_000n,receiverAta,tokenProgram: TOKEN_PROGRAM_ADDRESS,}).sendTransaction();
Revoca della Delega
Il delegante può revocare la delega in qualsiasi momento. La revoca chiude il PDA di delega e restituisce la rent al firmatario.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Note
- Il token account dell'utente deve esistere prima dell'inizializzazione.
- Gli importi sono espressi in unità base. Per un token a 6 decimali,
1_000_000significa1token. - Esegui
initSubscriptionAuthoritysolo quando l'account Subscription Authority non esiste già. - L'utente firma le transazioni di configurazione e revoca. Il delegatario firma i trasferimenti.
Is this page helpful?