PłatnościSubskrypcje

Delegacja o stałej kwocie

Delegacja o stałej kwocie pozwala użytkownikowi zatwierdzić innemu portfelowi lub usłudze pobieranie tokenów do ustalonego limitu. Każdy udany transfer zmniejsza pozostały limit. Użyj expiryTs = 0 aby nie ustawiać daty wygaśnięcia.

Ten przewodnik przedstawia przepływ w sposób przejrzysty. Każdy fragment kodu wykorzystuje funkcje SDK bezpośrednio, dzięki czemu widać, które konto jest pochodne, która instrukcja jest wysyłana oraz który sygnatariusz płaci lub autoryzuje każdy krok.

Instalacja

pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token

Tworzenie delegacji

Konfiguracja składa się z czterech części:

  1. Utwórz klienta z sygnatariuszem użytkownika i wtyczką subskrypcji.
  2. Wyprowadź token account użytkownika i PDA Subscription Authority.
  3. Zainicjalizuj Subscription Authority, jeśli jeszcze nie istnieje.
  4. Utwórz delegację o stałej kwocie i wyprowadź jej PDA do późniejszych transferów.
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,
});

Transfer z delegacji

Delegat podpisuje transfer. SDK wymaga tego samego PDA delegacji, token account użytkownika oraz token account odbiorcy.

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();

Cofnięcie delegacji

Delegujący może w każdej chwili cofnąć delegację. Cofnięcie zamyka PDA delegacji i zwraca rent podpisującemu.

await client.subscriptions.instructions
.revokeDelegation({
authority: userSigner,
delegationAccount: delegationPda,
})
.sendTransaction();

Uwagi

  • Konto tokenów użytkownika musi istnieć przed inicjalizacją.
  • Kwoty są wyrażone w jednostkach bazowych. Dla tokena z 6 miejscami dziesiętnymi 1_000_000 oznacza 1 tokena.
  • Uruchom initSubscriptionAuthority tylko wtedy, gdy konto Subscription Authority jeszcze nie istnieje.
  • Użytkownik podpisuje transakcje konfiguracji i cofnięcia. Delegat podpisuje transfery.

Is this page helpful?

Spis treści

Edytuj stronę