Ö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

  • Başlatma öncesinde kullanıcının token account hesabının mevcut olması gerekir.
  • Miktarlar temel birimler cinsindendir. 6 ondalık basamaklı bir token için 1_000_000, 1 token anlamına gelir.
  • initSubscriptionAuthority'i yalnızca Subscription Authority hesabı henüz mevcut olmadığında çalıştırın.
  • expiryTs kesin bir sınırdır: bu süre geçtikten sonra transferler başarısız olur ve sponsor rent bedelini geri alabilir. Harcama süresi için ek bir tolerans süresi yoktur.
  • Kullanıcı, kurulum ve iptal işlemlerini imzalar. Yetkili kişi ise transferleri imzalar.

Is this page helpful?

İçindekiler

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