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

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

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

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

Is this page helpful?

Зміст

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