ПлатежіПідписки

Фіксоване делегування

Фіксоване делегування дозволяє користувачеві схвалити інший гаманець або сервіс для виведення до визначеної фіксованої суми токенів. Кожна успішна передача зменшує залишковий ліміт. Використовуйте expiryTs = 0 для відсутності терміну дії.

Цей посібник зберігає прозорість процесу. Кожен фрагмент використовує функції SDK безпосередньо, тож ви можете бачити, який обліковий запис виводиться, яка інструкція надсилається і який підписувач оплачує або авторизує кожен крок.

Встановлення

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

Створення делегування

Налаштування складається з чотирьох частин:

  1. Створити клієнт з підписувачем користувача та плагіном підписок.
  2. Вивести token account користувача та PDA Subscription Authority.
  3. Ініціалізувати Subscription Authority, якщо він ще не існує.
  4. Створити фіксоване делегування та вивести його 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?

Зміст

Редагувати сторінку