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

Σταθερή Εξουσιοδότηση

Μια σταθερή εξουσιοδότηση επιτρέπει σε έναν χρήστη να εγκρίνει ένα άλλο πορτοφόλι ή υπηρεσία να αποσύρει έως ένα σταθερό ποσό token. Κάθε επιτυχημένη μεταφορά μειώνει το υπόλοιπο όριο. Χρησιμοποιήστε expiryTs = 0 για απεριόριστη λήξη.

Αυτός ο οδηγός διατηρεί τη ροή ορατή. Κάθε απόσπασμα χρησιμοποιεί τις συναρτήσεις του SDK απευθείας ώστε να μπορείτε να δείτε ποιος λογαριασμός παράγεται, ποια εντολή αποστέλλεται και ποιος υπογράφων πληρώνει ή εξουσιοδοτεί κάθε βήμα.

Εγκατάσταση

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

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

Η ρύθμιση έχει τέσσερα μέρη:

  1. Δημιουργήστε έναν client με τον υπογράφοντα χρήστη και το plugin συνδρομών.
  2. Παράγετε το token account του χρήστη και το PDA της Αρχής Συνδρομής.
  3. Αρχικοποιήστε την Αρχή Συνδρομής εάν δεν υπάρχει ακόμη.
  4. Δημιουργήστε τη σταθερή εξουσιοδότηση και παράγετε το PDA της για μεταγενέστερες μεταφορές.
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,
findFixedDelegationPda,
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 nonce = 0n;
const amount = 1_000_000n;
const expiryTs = BigInt(Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 30);
const [userAta] = await findAssociatedTokenPda({
mint: tokenMint,
owner: userSigner.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
});
const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({
user: userSigner.address,
tokenMint,
});
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
.createFixedDelegation({
tokenMint,
delegatee,
nonce,
amount,
expiryTs,
})
.sendTransaction();
const [delegationPda] = await findFixedDelegationPda({
subscriptionAuthority: subscriptionAuthorityPda,
delegator: userSigner.address,
delegatee,
nonce,
});

Μεταφορά από την Εξουσιοδότηση

Ο εξουσιοδοτημένος υπογράφει τη μεταφορά. Το SDK χρειάζεται το ίδιο PDA εξουσιοδότησης, το token account του χρήστη και το token account του παραλήπτη.

const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');
await client.subscriptions.instructions
.transferFixed({
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();

Σημειώσεις

  • Ο token account του χρήστη πρέπει να υπάρχει πριν την αρχικοποίηση.
  • Τα ποσά είναι σε βασικές μονάδες. Για ένα token με 6 δεκαδικά ψηφία, το 1_000_000 σημαίνει 1 token.
  • Εκτελέστε το initSubscriptionAuthority μόνο όταν ο λογαριασμός Subscription Authority δεν υπάρχει ήδη.
  • Ο χρήστης υπογράφει τις συναλλαγές αρχικοποίησης και ανάκλησης. Ο εξουσιοδοτούμενος υπογράφει τις μεταφορές.

Is this page helpful?

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

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