Sabit yetkilendirme, bir kullanıcının başka bir cüzdan veya hizmete belirli bir
token miktarına kadar çekim yapmasına izin vermesini sağlar. Her başarılı
transfer, kalan izin miktarını azaltır. Süresiz yetkilendirme için
expiryTs = 0 kullanın.
Bu rehber, akışı görünür tutar. Her kod parçası SDK fonksiyonlarını doğrudan kullanır, böylece hangi hesabın türetildiğini, hangi talimatın gönderildiğini ve hangi imzalayanın her adımı ödediğini veya yetkilendirdiğini görebilirsiniz.
Kurulum
pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token
Yetkilendirme Oluşturma
Kurulum dört bölümden oluşur:
- Kullanıcı imzalayıcı ve abonelik eklentisi ile bir istemci oluşturun.
- Kullanıcının token hesabını ve Abonelik Yetkilisi PDA'sını türetin.
- Henüz mevcut değilse Abonelik Yetkilisini başlatın.
- Sabit yetkilendirmeyi oluşturun ve sonraki transferler için PDA'sını türetin.
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,});
Yetkilendirmeden Transfer Yapma
Yetkilendirilen taraf transferi imzalar. SDK'ya aynı yetkilendirme PDA'sı, kullanıcının token hesabı ve alıcının token hesabı gereklidir.
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();
Delegasyonu İptal Etme
Delege eden kişi, delegasyonu istediği zaman iptal edebilir. İptal işlemi, delegasyon PDA'sını kapatır ve rent'ini imzalayana geri döndürür.
await client.subscriptions.instructions.revokeDelegation({authority: userSigner,delegationAccount: delegationPda,}).sendTransaction();
Notlar
- Kullanıcının token account'u başlatmadan önce mevcut olmalıdır.
- Miktarlar temel birimler cinsinden verilir. 6 ondalıklı bir token için
1_000_000,1token anlamına gelir. initSubscriptionAuthoritykomutunu yalnızca Subscription Authority hesabı henüz mevcut olmadığında çalıştırın.- Kullanıcı kurulum ve iptal işlemlerini imzalar. Delege edilen kişi transferleri imzalar.
Is this page helpful?