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

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

Фіксоване делегування дозволяє користувачеві схвалити інший гаманець або сервіс для виведення до визначеної фіксованої суми токенів. Кожна успішна передача зменшує залишковий ліміт. Використовуйте 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 ще не існує.
  • expiryTs є жорстким обмеженням: після його настання перекази не виконуються, а спонсор може повернути rent. Пільгового періоду витрат немає.
  • Користувач підписує транзакції налаштування та відкликання. Делегат підписує перекази.

Is this page helpful?

Зміст

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