ΠληρωμέςΣυνδρομές

Επαναλαμβανόμενη Εξουσιοδότηση

Μια επαναλαμβανόμενη εξουσιοδότηση επιτρέπει σε έναν χρήστη να εγκρίνει ένα άλλο πορτοφόλι ή υπηρεσία να αποσύρει μέχρι ένα όριο που επαναφέρεται σε κάθε περίοδο.

Αυτός ο οδηγός διατηρεί τα κινούμενα μέρη ορατά. Πρώτα παράγετε τους λογαριασμούς, αρχικοποιείτε την Αρχή Συνδρομής αν χρειάζεται, δημιουργείτε την επαναλαμβανόμενη εξουσιοδότηση και στη συνέχεια χρησιμοποιείτε αυτό το PDA εξουσιοδότησης για μεταφορές.

Εγκατάσταση

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

Δημιουργία της Εξουσιοδότησης

Η ρύθμιση αποτελείται από τέσσερα μέρη:

  1. Δημιουργήστε έναν πελάτη με τον υπογράφοντα χρήστη και το plugin συνδρομών.
  2. Παράγετε το token account του χρήστη, το PDA της Αρχής Συνδρομής και το PDA της επαναλαμβανόμενης εξουσιοδότησης.
  3. Αρχικοποιήστε την Αρχή Συνδρομής αν δεν υπάρχει ακόμα.
  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 της εξουσιοδότησης και επιστρέφει το rent στον υπογράφοντα.

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

Σημειώσεις

  • Το amountPerPeriod είναι σε βασικές μονάδες. Για ένα token 6 δεκαδικών ψηφίων, το 1_000_000 σημαίνει 1 token.
  • Το πρόγραμμα απορρίπτει μεταφορές που υπερβαίνουν το υπόλοιπο όριο της τρέχουσας περιόδου.
  • Μόλις ξεκινήσει η επόμενη περίοδος, το ποσό που έχει αποσυρθεί επαναφέρεται.
  • Ο χρήστης υπογράφει τις συναλλαγές εγκατάστασης και ανάκλησης. Ο εξουσιοδοτημένος υπογράφει τις μεταφορές.

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.