BetalingenAbonnementen

Terugkerende Delegatie

Een terugkerende delegatie stelt een gebruiker in staat om een andere wallet of service goed te keuren om tot een limiet op te nemen die elke periode opnieuw wordt ingesteld.

Deze handleiding houdt de bewegende onderdelen zichtbaar. Je leidt eerst de accounts af, initialiseert indien nodig de Subscription Authority, creëert de terugkerende delegatie en gebruikt vervolgens die delegatie-PDA voor overdrachten.

Installatie

pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token

Creëer De Delegatie

De opzet bestaat uit vier onderdelen:

  1. Creëer een client met de gebruikersondertekenaar en subscripties-plugin.
  2. Leid het token account van de gebruiker, Subscription Authority PDA en terugkerende delegatie-PDA af.
  3. Initialiseer de Subscription Authority als deze nog niet bestaat.
  4. Creëer de terugkerende delegatie met het periodebedrag, periodelengte, starttijd en vervaldatum.
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();

Overdracht Vanuit De Delegatie

De gemachtigde ondertekent elke overdracht. Het programma controleert de huidige periode en weigert overdrachten die de resterende limiet van de periode zouden overschrijden.

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();

De Delegatie Intrekken

De delegeerder kan de terugkerende delegatie op elk moment intrekken. Intrekken sluit de delegatie-PDA af en retourneert de rent aan de ondertekenaar.

await client.subscriptions.instructions
.revokeDelegation({
authority: userSigner,
delegationAccount: delegationPda,
})
.sendTransaction();

Opmerkingen

  • amountPerPeriod is in basiseenheden. Voor een token met 6 decimalen betekent 1_000_000 1 token.
  • Het programma weigert overdrachten die het resterende tegoed van de huidige periode overschrijden.
  • Zodra de volgende periode begint, wordt het opgenomen bedrag gereset.
  • De gebruiker ondertekent de setup- en intrekkingstransacties. De gedelegeerde ondertekent de overdrachten.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.