PembayaranLangganan

Delegasi Berulang

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:

  1. Buat klien dengan penandatangan pengguna dan plugin subscriptions.
  2. Turunkan token account pengguna, PDA Subscription Authority, dan PDA delegasi berulang.
  3. Inisialisasi Subscription Authority jika belum ada.
  4. 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

  • amountPerPeriod dalam satuan dasar. Untuk token 6 desimal, 1_000_000 berarti 1 token.
  • Program menolak transfer yang melebihi sisa allowance periode saat ini.
  • Setelah periode berikutnya dimulai, jumlah yang ditarik akan direset.
  • expiryTs adalah batas keras: setelah melewatinya, transfer akan gagal dan sponsor dapat memulihkan rent. Tidak ada masa tenggang waktu pengeluaran.
  • Tetapkan startTs ke 0 untuk memulai delegasi saat transaksi mendarat di chain, bukan pada waktu yang ditentukan. Ini memperluas jendela waktu untuk mendapatkan pengguna agar menandatangani dan bergabung. Saat Anda melakukan ini, expiryTs harus bernilai non-zero — sebuah delegasi start-on-landing tidak dapat juga diatur agar tidak pernah kedaluwarsa.
  • Pengguna menandatangani transaksi setup dan revoke. Delegatee menandatangani transfer.

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.