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-desimaalisen tokenin kohdalla1_000_000tarkoittaa1tokenia.- 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?