MaksutTilaukset

Toistuva delegointi

Toistuva delegointi mahdollistaa käyttäjän hyväksyä toisen lompakon tai palvelun nostamaan varoja rajaan asti, joka nollautuu joka jakso.

Tämä ohje pitää liikkuvat osat näkyvinä. Johdat tilit ensin, alustat Subscription Authorityn tarvittaessa, luot toistuvan delegoinnin ja käytät sitten delegointi-PDA:ta siirtoihin.

Asennus

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

Luo delegointi

Asetuksessa on neljä osaa:

  1. Luo asiakasohjelma käyttäjän allekirjoittajalla ja tilausten lisäosalla.
  2. Johda käyttäjän token account, Subscription Authority PDA ja toistuvan delegoinnin PDA.
  3. Alusta Subscription Authority, jos sitä ei ole vielä olemassa.
  4. Luo toistuva delegointi jakson määrällä, jakson pituudella, aloitusajalla ja vanhentumisajalla.
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();

Siirrä varoista delegoinnista

Delegaatin saaja allekirjoittaa jokaisen siirron. Ohjelma tarkistaa nykyisen jakson ja hylkää siirrot, jotka ylittäisivät jakson jäljellä olevan määrän.

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

Delegoinnin peruuttaminen

Delegoija voi peruuttaa toistuvan delegoinnin milloin tahansa. Peruuttaminen sulkee delegointi-PDA:n ja palauttaa sen vuokran allekirjoittajalle.

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

Huomautukset

  • amountPerPeriod on perusyksiköissä. 6-desimaalisen tokenin kohdalla 1_000_000 tarkoittaa 1 tokenia.
  • Ohjelma hylkää siirrot, jotka ylittävät nykyisen jakson jäljellä olevan käyttörajan.
  • Kun seuraava jakso alkaa, nostettu määrä nollautuu.
  • Käyttäjä allekirjoittaa asetusten määritys- ja peruutustapahtumat. Valtuutettu allekirjoittaa siirrot.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.