Delegasi tetap memungkinkan pengguna menyetujui dompet atau layanan lain untuk
menarik hingga jumlah token yang tetap. Setiap transfer yang berhasil mengurangi
sisa alokasi. Gunakan expiryTs = 0 untuk tidak ada kedaluwarsa.
Panduan ini menjaga alur tetap terlihat. Setiap cuplikan menggunakan fungsi SDK secara langsung sehingga Anda dapat melihat akun mana yang diturunkan, instruksi mana yang dikirim, dan penandatangan mana yang membayar atau mengotorisasi setiap langkah.
Instalasi
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Membuat Delegasi
Pengaturan memiliki empat bagian:
- Buat klien dengan penandatangan pengguna dan plugin langganan.
- Turunkan token account pengguna dan PDA Subscription Authority.
- Inisialisasi Subscription Authority jika belum ada.
- Buat delegasi tetap dan turunkan PDA-nya untuk transfer selanjutnya.
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 Dari Delegasi
Penerima delegasi menandatangani transfer. SDK memerlukan PDA delegasi yang sama, token account pengguna, dan token account penerima.
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();
Mencabut Delegasi
Pendelegasi dapat mencabut delegasi kapan saja. Pencabutan akan menutup PDA delegasi dan mengembalikan rent-nya ke penandatangan.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Catatan
- Token account pengguna harus ada sebelum inisialisasi.
- Jumlah dalam satuan dasar. Untuk token 6 desimal,
1_000_000berarti1token. - Jalankan
initSubscriptionAuthorityhanya ketika akun Subscription Authority belum ada. - Pengguna menandatangani transaksi setup dan revoke. Penerima delegasi menandatangani transfer.
Is this page helpful?