ÖdemelerAbonelikler

Sabit Yetkilendirme

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:

  1. Kullanıcı imzalayıcı ve abonelik eklentisi ile bir istemci oluşturun.
  2. Kullanıcının token hesabını ve Abonelik Yetkilisi PDA'sını türetin.
  3. Henüz mevcut değilse Abonelik Yetkilisini başlatın.
  4. 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, 1 token anlamına gelir.
  • initSubscriptionAuthority komutunu 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?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.