ПлатежіПідписки
Повторювана делегація дозволяє користувачу схвалити інший гаманець або сервіс для зняття коштів у межах ліміту, який скидається щоперіоду.
Цей посібник дозволяє тримати всі компоненти на виду. Спочатку ви отримуєте облікові записи, ініціалізуєте Subscription Authority за потреби, створюєте повторювану делегацію, а потім використовуєте цей PDA делегування для переказів.
Встановлення
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Створення делегування
Налаштування складається з чотирьох частин:
- Створіть клієнт з підписантом користувача та плагіном підписок.
- Отримайте token account користувача, PDA Subscription Authority та PDA повторюваної делегації.
- Ініціалізуйте Subscription Authority, якщо він ще не існує.
- Створіть повторювану делегацію із сумою періоду, тривалістю періоду, часом початку та закінчення.
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?