MaksutTilaukset

Kiinteä delegointi

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:

  1. Luo asiakas käyttäjän allekirjoittajalla ja tilausten lisäosalla.
  2. Johda käyttäjän token-tili ja Subscription Authority PDA.
  3. Alusta Subscription Authority, jos sitä ei ole vielä olemassa.
  4. 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_000 tarkoittaa 1 tokenia.
  • Suorita initSubscriptionAuthority vain, kun Subscription Authority -tiliä ei vielä ole olemassa.
  • Käyttäjä allekirjoittaa asetukset ja peruutustapahtumat. Valtuutettu allekirjoittaa siirrot.

Is this page helpful?

Sisällysluettelo

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