Delegacja o stałej kwocie pozwala użytkownikowi zatwierdzić innemu portfelowi
lub usłudze pobieranie tokenów do ustalonego limitu. Każdy udany transfer
zmniejsza pozostały limit. Użyj expiryTs = 0 aby nie ustawiać daty
wygaśnięcia.
Ten przewodnik przedstawia przepływ w sposób przejrzysty. Każdy fragment kodu wykorzystuje funkcje SDK bezpośrednio, dzięki czemu widać, które konto jest pochodne, która instrukcja jest wysyłana oraz który sygnatariusz płaci lub autoryzuje każdy krok.
Instalacja
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Tworzenie delegacji
Konfiguracja składa się z czterech części:
- Utwórz klienta z sygnatariuszem użytkownika i wtyczką subskrypcji.
- Wyprowadź token account użytkownika i PDA Subscription Authority.
- Zainicjalizuj Subscription Authority, jeśli jeszcze nie istnieje.
- Utwórz delegację o stałej kwocie i wyprowadź jej PDA do późniejszych transferów.
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,});
Transfer z delegacji
Delegat podpisuje transfer. SDK wymaga tego samego PDA delegacji, token account użytkownika oraz token account odbiorcy.
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();
Cofnięcie delegacji
Delegujący może w każdej chwili cofnąć delegację. Cofnięcie zamyka PDA delegacji i zwraca rent podpisującemu.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Uwagi
- Konto tokenów użytkownika musi istnieć przed inicjalizacją.
- Kwoty są wyrażone w jednostkach bazowych. Dla tokena z 6 miejscami
dziesiętnymi
1_000_000oznacza1tokena. - Uruchom
initSubscriptionAuthoritytylko wtedy, gdy konto Subscription Authority jeszcze nie istnieje. - Użytkownik podpisuje transakcje konfiguracji i cofnięcia. Delegat podpisuje transfery.
Is this page helpful?