Eine feste Delegation ermöglicht es einem Benutzer, einer anderen Wallet oder
einem Dienst zu genehmigen, bis zu einem festgelegten Token-Betrag abzubuchen.
Jede erfolgreiche Übertragung verringert das verbleibende Kontingent. Verwenden
Sie expiryTs = 0 für unbegrenzte Gültigkeit.
Diese Anleitung hält den Ablauf transparent. Jeder Codeausschnitt verwendet die SDK-Funktionen direkt, sodass Sie sehen können, welches Konto abgeleitet wird, welche Anweisung gesendet wird und welcher Signer jeden Schritt bezahlt oder autorisiert.
Installation
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Delegation erstellen
Die Einrichtung besteht aus vier Teilen:
- Erstellen Sie einen Client mit dem Benutzer-Signer und dem Subscriptions-Plugin.
- Leiten Sie das Token-Konto des Benutzers und die Subscription Authority PDA ab.
- Initialisieren Sie die Subscription Authority, falls sie noch nicht existiert.
- Erstellen Sie die feste Delegation und leiten Sie deren PDA für spätere Übertragungen ab.
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,});
Übertragung von der Delegation
Der Delegierte signiert die Übertragung. Das SDK benötigt dieselbe Delegations-PDA, das Token-Konto des Benutzers und das Token-Konto des Empfängers.
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();
Delegation widerrufen
Der Delegierende kann die Delegation jederzeit widerrufen. Beim Widerrufen wird das Delegations-PDA geschlossen und die Miete an den Signer zurückerstattet.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Hinweise
- Das Token-Konto des Benutzers muss vor der Initialisierung existieren.
- Beträge sind in Basiseinheiten angegeben. Bei einem Token mit 6 Dezimalstellen
bedeutet
1_000_000gleich1Token. - Führen Sie
initSubscriptionAuthoritynur aus, wenn das Subscription Authority-Konto noch nicht existiert. - Der Benutzer signiert Einrichtungs- und Widerrufs-Transaktionen. Der Delegierte signiert Überweisungen.
Is this page helpful?