PembayaranLangganan

Delegasi Tetap

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:

  1. Buat klien dengan penandatangan pengguna dan plugin langganan.
  2. Turunkan token account pengguna dan PDA Subscription Authority.
  3. Inisialisasi Subscription Authority jika belum ada.
  4. 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_000 berarti 1 token.
  • Jalankan initSubscriptionAuthority hanya saat akun Subscription Authority belum ada.
  • expiryTs adalah 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?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.