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

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

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

Αυτός ο οδηγός διατηρεί τα κινούμενα μέρη ορατά. Πρώτα παράγετε τους λογαριασμούς, αρχικοποιείτε την Αρχή Συνδρομής αν χρειάζεται, δημιουργείτε την επαναλαμβανόμενη εξουσιοδότηση και στη συνέχεια χρησιμοποιείτε αυτό το 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.
  • Το πρόγραμμα απορρίπτει μεταφορές που υπερβαίνουν το εναπομείναν όριο της τρέχουσας περιόδου.
  • Μόλις ξεκινήσει η επόμενη περίοδος, το ποσό που έχει αναληφθεί μηδενίζεται.
  • Το expiryTs είναι σκληρό όριο: μόλις παρέλθει, οι μεταφορές αποτυγχάνουν και ο χορηγός μπορεί να ανακτήσει rent. Δεν υπάρχει περίοδος χάριτος για τον χρόνο εκτέλεσης.
  • Ορίστε το startTs σε 0 για να ξεκινήσει η ανάθεση όταν η συναλλαγή καταχωρηθεί στο chain αντί για σε σταθερή χρονική στιγμή. Αυτό διευρύνει το παράθυρο για να υπογράψει ο χρήστης και να ολοκληρωθεί η εισαγωγή. Όταν το κάνετε αυτό, το expiryTs πρέπει να είναι μη μηδενικό — μια ανάθεση τύπου start-on-landing δεν μπορεί επίσης να οριστεί ώστε να μην λήγει ποτέ.
  • Ο χρήστης υπογράφει τις συναλλαγές ρύθμισης και ανάκλησης. Ο εκπρόσωπος υπογράφει τις μεταφορές.

Is this page helpful?

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

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