MaksutTilaukset
Kiinteä delegointi antaa käyttäjän hyväksyä toisen lompakon tai palvelun
nostamaan enintään kiinteän token-määrän. Jokainen onnistunut siirto vähentää
jäljellä olevaa rajaa. Käytä expiryTs = 0 ilman vanhenemisaikaa.
Tämä opas pitää kulun näkyvänä. Jokainen koodinpätkä käyttää SDK-funktioita suoraan, joten näet, mikä tili johdetaan, mikä käsky lähetetään ja mikä allekirjoittaja maksaa tai valtuuttaa kunkin vaiheen.
Asennus
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Luo delegointi
Asetuksilla on neljä osaa:
- Luo asiakas käyttäjän allekirjoittajalla ja tilausten lisäosalla.
- Johda käyttäjän token-tili ja Subscription Authority PDA.
- Alusta Subscription Authority, jos sitä ei ole vielä olemassa.
- Luo kiinteä delegointi ja johda sen PDA myöhempiä siirtoja varten.
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,findFixedDelegationPda,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 nonce = 0n;const amount = 1_000_000n;const expiryTs = BigInt(Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 30);const [userAta] = await findAssociatedTokenPda({mint: tokenMint,owner: userSigner.address,tokenProgram: TOKEN_PROGRAM_ADDRESS,});const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({user: userSigner.address,tokenMint,});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.createFixedDelegation({tokenMint,delegatee,nonce,amount,expiryTs,}).sendTransaction();const [delegationPda] = await findFixedDelegationPda({subscriptionAuthority: subscriptionAuthorityPda,delegator: userSigner.address,delegatee,nonce,});
Siirrä delegoinnista
Valtuutettu allekirjoittaa siirron. SDK tarvitsee saman delegoinnin PDA:n, käyttäjän token-tilin ja vastaanottajan token-tilin.
const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');await client.subscriptions.instructions.transferFixed({delegatee: delegateeSigner,delegator: userSigner.address,delegatorAta: userAta,tokenMint,delegationPda,amount: 100_000n,receiverAta,tokenProgram: TOKEN_PROGRAM_ADDRESS,}).sendTransaction();
Delegoinnin peruuttaminen
Delegoija voi peruuttaa delegoinnin milloin tahansa. Peruuttaminen sulkee delegointi-PDA:n ja palauttaa sen vuokran allekirjoittajalle.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Huomautukset
- Käyttäjän token account -tilin on oltava olemassa ennen alustusta.
- Määrät ovat perusyksiköissä. 6-desimaalin tokenille
1_000_000tarkoittaa1tokenia. - Suorita
initSubscriptionAuthorityvain, kun Subscription Authority -tiliä ei vielä ole olemassa. - Käyttäjä allekirjoittaa asetukset ja peruutustapahtumat. Valtuutettu allekirjoittaa siirrot.
Is this page helpful?