PembayaranLangganan
Delegasi berulang memungkinkan pengguna menyetujui dompet atau layanan lain untuk menarik hingga batas tertentu yang disetel ulang setiap periode.
Panduan ini menjaga agar semua komponen tetap terlihat. Anda menurunkan akun terlebih dahulu, menginisialisasi Subscription Authority jika diperlukan, membuat delegasi berulang, lalu menggunakan PDA delegasi tersebut untuk transfer.
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 subscriptions.
- Turunkan token account pengguna, PDA Subscription Authority, dan PDA delegasi berulang.
- Inisialisasi Subscription Authority jika belum ada.
- Buat delegasi berulang dengan jumlah periode, panjang periode, waktu mulai, dan kedaluwarsa.
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,findRecurringDelegationPda,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 now = BigInt(Math.floor(Date.now() / 1000));const nonce = 0n;const amountPerPeriod = 1_000_000n;const periodLengthS = 86_400n;const startTs = now;const expiryTs = now + periodLengthS * 30n;const [userAta] = await findAssociatedTokenPda({mint: tokenMint,owner: userSigner.address,tokenProgram: TOKEN_PROGRAM_ADDRESS,});const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({user: userSigner.address,tokenMint,});const [delegationPda] = await findRecurringDelegationPda({subscriptionAuthority: subscriptionAuthorityPda,delegator: userSigner.address,delegatee,nonce,});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.createRecurringDelegation({tokenMint,delegatee,nonce,amountPerPeriod,periodLengthS,startTs,expiryTs,}).sendTransaction();
Transfer Dari Delegasi
Delegatee menandatangani setiap transfer. Program memeriksa periode saat ini dan menolak transfer yang akan melebihi sisa kuota periode tersebut.
const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');await client.subscriptions.instructions.transferRecurring({delegatee: delegateeSigner,delegator: userSigner.address,delegatorAta: userAta,tokenMint,delegationPda,amount: 100_000n,receiverAta,tokenProgram: TOKEN_PROGRAM_ADDRESS,}).sendTransaction();
Mencabut Delegasi
Delegator dapat mencabut delegasi berulang kapan saja. Pencabutan akan menutup PDA delegasi dan mengembalikan biaya sewa ke penandatangan.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Catatan
amountPerPerioddalam unit dasar. Untuk token dengan 6 desimal,1_000_000berarti1token.- Program menolak transfer yang melebihi sisa kuota periode saat ini.
- Setelah periode berikutnya dimulai, jumlah yang ditarik akan direset.
- Pengguna menandatangani transaksi pengaturan dan pencabutan. Delegatee menandatangani transfer.
Is this page helpful?