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 unit dasar. Untuk token dengan 6 desimal, 1_000_000 berarti 1 token.
  • 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?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.