MaksutTilaukset
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:
- Luo asiakasohjelma käyttäjän allekirjoittajalla ja tilausten lisäosalla.
- Johda käyttäjän token account, Subscription Authority PDA ja toistuvan delegoinnin PDA.
- Alusta Subscription Authority, jos sitä ei ole vielä olemassa.
- 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
amountPerPeriodon perusyksiköissä. 6 desimaalin tokenille1_000_000tarkoittaa1tokenia.- Ohjelma hylkää siirrot, jotka ylittävät kuluvan jakson jäljellä olevan käyttörajan.
- Kun seuraava jakso alkaa, nostettu määrä nollautuu.
expiryTson ehdoton raja: kun se ylittyy, siirrot epäonnistuvat ja sponsori voi periä rent takaisin. Käyttöaikaan ei liity siirtymäaikaa.- Aseta
startTsarvoon0kä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ä tapauksessaexpiryTson 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?