PłatnościSubskrypcje

Cykliczne delegowanie

Cykliczne delegowanie pozwala użytkownikowi zatwierdzić inny portfel lub usługę do pobierania środków do limitu, który resetuje się w każdym okresie.

Ten przewodnik zachowuje widoczność wszystkich elementów. Najpierw wyprowadzasz konta, inicjalizujesz Subscription Authority w razie potrzeby, tworzysz cykliczne delegowanie, a następnie używasz tego PDA delegowania do transferów.

Instalacja

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

Tworzenie delegowania

Konfiguracja składa się z czterech części:

  1. Utwórz klienta z podpisującym użytkownikiem i wtyczką subskrypcji.
  2. Wyprowadź token account użytkownika, PDA Subscription Authority oraz PDA cyklicznego delegowania.
  3. Zainicjalizuj Subscription Authority, jeśli jeszcze nie istnieje.
  4. Utwórz cykliczne delegowanie z kwotą okresu, długością okresu, czasem rozpoczęcia i wygaśnięciem.
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();

Transfer z delegowania

Delegat podpisuje każdy transfer. Program sprawdza bieżący okres i odrzuca transfery, które przekroczyłyby pozostały limit okresu.

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();

Cofnij delegację

Delegujący może w każdej chwili cofnąć delegację cykliczną. Cofnięcie zamyka PDA delegacji i zwraca jej rent do podpisującego.

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

Uwagi

  • amountPerPeriod jest w jednostkach bazowych. Dla tokena z 6 miejscami dziesiętnymi, 1_000_000 oznacza 1 tokena.
  • Program odrzuca transfery przekraczające pozostały limit w bieżącym okresie.
  • Po rozpoczęciu następnego okresu, pobrany limit jest resetowany.
  • Użytkownik podpisuje transakcje konfiguracji i cofnięcia. Delegat podpisuje transfery.

Is this page helpful?

Spis treści

Edytuj stronę