Μια σταθερή εξουσιοδότηση επιτρέπει σε έναν χρήστη να εγκρίνει ένα άλλο
πορτοφόλι ή υπηρεσία να αποσύρει έως ένα σταθερό ποσό token. Κάθε επιτυχημένη
μεταφορά μειώνει το υπόλοιπο όριο. Χρησιμοποιήστε expiryTs = 0 για απεριόριστη
λήξη.
Αυτός ο οδηγός διατηρεί τη ροή ορατή. Κάθε απόσπασμα χρησιμοποιεί τις συναρτήσεις του SDK απευθείας ώστε να μπορείτε να δείτε ποιος λογαριασμός παράγεται, ποια εντολή αποστέλλεται και ποιος υπογράφων πληρώνει ή εξουσιοδοτεί κάθε βήμα.
Εγκατάσταση
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Δημιουργία της Εξουσιοδότησης
Η ρύθμιση έχει τέσσερα μέρη:
- Δημιουργήστε έναν client με τον υπογράφοντα χρήστη και το plugin συνδρομών.
- Παράγετε το token account του χρήστη και το PDA της Αρχής Συνδρομής.
- Αρχικοποιήστε την Αρχή Συνδρομής εάν δεν υπάρχει ακόμη.
- Δημιουργήστε τη σταθερή εξουσιοδότηση και παράγετε το 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σημαίνει1token. - Εκτελέστε το
initSubscriptionAuthorityμόνο όταν ο λογαριασμός Subscription Authority δεν υπάρχει ήδη. - Ο χρήστης υπογράφει τις συναλλαγές αρχικοποίησης και ανάκλησης. Ο εξουσιοδοτούμενος υπογράφει τις μεταφορές.
Is this page helpful?