Фіксоване делегування дозволяє користувачеві схвалити інший гаманець або сервіс
для виведення до визначеної фіксованої суми токенів. Кожна успішна передача
зменшує залишковий ліміт. Використовуйте expiryTs = 0 для відсутності терміну
дії.
Цей посібник зберігає прозорість процесу. Кожен фрагмент використовує функції SDK безпосередньо, тож ви можете бачити, який обліковий запис виводиться, яка інструкція надсилається і який підписувач оплачує або авторизує кожен крок.
Встановлення
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Створення делегування
Налаштування складається з чотирьох частин:
- Створити клієнт з підписувачем користувача та плагіном підписок.
- Вивести token account користувача та PDA Subscription Authority.
- Ініціалізувати Subscription Authority, якщо він ще не існує.
- Створити фіксоване делегування та вивести його PDA для подальших передач.
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,});
Передача з делегування
Делегат підписує передачу. SDK потребує той самий PDA делегування, token account користувача та token account отримувача.
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();
Відкликання делегування
Делегатор може відкликати делегування в будь-який момент. Відкликання закриває PDA делегування та повертає його rent підписанту.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Примітки
- Token account користувача має існувати перед ініціалізацією.
- Суми вказані в базових одиницях. Для токена з 6 десятковими знаками,
1_000_000означає1токен. - Виконуйте
initSubscriptionAuthorityлише тоді, коли акаунт Subscription Authority ще не існує. - Користувач підписує транзакції налаштування та відкликання. Делегат підписує перекази.
Is this page helpful?