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 desimaalin tokenille 1_000_000 tarkoittaa 1 tokenia.
  • Ohjelma hylkää siirrot, jotka ylittävät kuluvan jakson jäljellä olevan käyttörajan.
  • Kun seuraava jakso alkaa, nostettu määrä nollautuu.
  • expiryTs on ehdoton raja: kun se ylittyy, siirrot epäonnistuvat ja sponsori voi periä rent takaisin. Käyttöaikaan ei liity siirtymäaikaa.
  • Aseta startTs arvoon 0 käynnistääksesi delegoinnin, kun transaktio kirjautuu lohkoketjuun kiinteän ajan sijaan. Tämä laajentaa aikaikkunaa käyttäjän allekirjoituksen hankkimiseen ja käyttöönoton suorittamiseen. Tässä tapauksessa expiryTs on oltava nollasta poikkeava — käynnistymiseen perustuva delegointi ei voi myöskään olla asetettu vanhenemaan ikinä.
  • Käyttäjä allekirjoittaa asetuksen ja peruutuksen transaktiot. Valtuutettu allekirjoittaa siirrot.

Is this page helpful?

Sisällysluettelo

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