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 dengan 6 desimal,
1_000_000berarti1token. - Jalankan
initSubscriptionAuthorityhanya saat akun Subscription Authority belum ada. expiryTsadalah batas keras: setelah terlewati, transfer gagal dan sponsor dapat memulihkan rent. Tidak ada masa tenggang pengeluaran.- Pengguna menandatangani transaksi setup dan revoke. Delegatee menandatangani transfer.
Is this page helpful?