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

Повторювана делегація

Повторювана делегація дозволяє користувачу схвалити інший гаманець або сервіс для зняття коштів у межах ліміту, який скидається щоперіоду.

Цей посібник дозволяє тримати всі компоненти на виду. Спочатку ви отримуєте облікові записи, ініціалізуєте Subscription Authority за потреби, створюєте повторювану делегацію, а потім використовуєте цей PDA делегування для переказів.

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

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

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

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

  1. Створіть клієнт з підписантом користувача та плагіном підписок.
  2. Отримайте token account користувача, PDA Subscription Authority та PDA повторюваної делегації.
  3. Ініціалізуйте Subscription Authority, якщо він ще не існує.
  4. Створіть повторювану делегацію із сумою періоду, тривалістю періоду, часом початку та закінчення.
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,
findRecurringDelegationPda,
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 now = BigInt(Math.floor(Date.now() / 1000));
const nonce = 0n;
const amountPerPeriod = 1_000_000n;
const periodLengthS = 86_400n;
const startTs = now;
const expiryTs = now + periodLengthS * 30n;
const [userAta] = await findAssociatedTokenPda({
mint: tokenMint,
owner: userSigner.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
});
const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({
user: userSigner.address,
tokenMint,
});
const [delegationPda] = await findRecurringDelegationPda({
subscriptionAuthority: subscriptionAuthorityPda,
delegator: userSigner.address,
delegatee,
nonce,
});
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
.createRecurringDelegation({
tokenMint,
delegatee,
nonce,
amountPerPeriod,
periodLengthS,
startTs,
expiryTs,
})
.sendTransaction();

Переказ із делегування

Делегат підписує кожен переказ. Програма перевіряє поточний період і відхиляє перекази, які перевищують залишковий ліміт періоду.

const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');
await client.subscriptions.instructions
.transferRecurring({
delegatee: delegateeSigner,
delegator: userSigner.address,
delegatorAta: userAta,
tokenMint,
delegationPda,
amount: 100_000n,
receiverAta,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
})
.sendTransaction();

Відкликання делегування

Делегатор може відкликати повторюване делегування в будь-який момент. Відкликання закриває PDA делегування та повертає його оренду підписанту.

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

Примітки

  • amountPerPeriod вказується в базових одиницях. Для токена з 6 десятковими знаками 1_000_000 означає 1 токена.
  • Програма відхиляє перекази, що перевищують залишок ліміту поточного періоду.
  • Після початку наступного періоду знята сума скидається.
  • Користувач підписує транзакції налаштування та відкликання. Делегат підписує перекази.

Is this page helpful?

Зміст

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