Solana'da token mantığını test etmek, asıl test etmek istediğiniz transfer
mantığına geçmeden önce mint'leri, token account'ları ve yetki sahiplerini
kurmanız anlamına gelir. tokenProgram() eklentisi, @solana-program/token'den
bu kurulumu birkaç metod çağrısına indirger — ve ATA oluşturmayı otomatik olarak
halleder.
Kurulum
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Mint Oluşturma
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";import { tokenProgram } from "@solana-program/token";const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(tokenProgram());client.svm.airdrop(client.payer.address, lamports(10_000_000_000n));const mintAuthority = await generateKeyPairSigner();const newMint = await generateKeyPairSigner();await client.token.instructions.createMint({newMint,decimals: 9,mintAuthority: mintAuthority.address}).sendTransaction();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.log(mintAccount.data.decimals); // 9
Token Basma
mintToATA, token'ları bir sahibin associated token account'ına yayınlar. ATA
mevcut değilse, aynı işlem içinde oluşturulur.
await client.token.instructions.mintToATA({mint: newMint.address,owner: client.payer.address,mintAuthority,amount: 1_000_000_000_000n, // 1000 tokens (9 decimals)decimals: 9}).sendTransaction();
decimals parametresi bir güvenlik kontrolüdür — mint'in ondalık basamak
sayısıyla tam olarak eşleşmesi gerekir; aksi takdirde Token Program işlemi
0x24 hatasıyla reddeder. Bu, yanlışlıkla 1000 kat fazla token basılmasını
önler.
Token Transferi
transferToATA, token'ları kullanıcılar arasında taşır. Gerekirse alıcının
associated token account'ı otomatik olarak oluşturulur.
const alice = await generateKeyPairSigner();const bob = await generateKeyPairSigner();// Mint to Aliceawait client.token.instructions.mintToATA({mint: newMint.address,owner: alice.address,mintAuthority,amount: 1_000_000_000_000n,decimals: 9}).sendTransaction();// Transfer 400 tokens from Alice to Bobawait client.token.instructions.transferToATA({mint: newMint.address,authority: alice,recipient: bob.address,amount: 400_000_000_000n,decimals: 9}).sendTransaction();
authority, kaynak token'lara sahip olan imzacıdır. Eklenti, hem kaynak hem de
hedef ATA'yı adreslerinden ve mint'ten türetir.
Bakiyeleri Doğrulama
Token bakiyelerini okumak için, ATA adresini findAssociatedTokenPda ile
türetin ve çözümlenmiş hesabı alın:
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const [aliceAta] = await findAssociatedTokenPda({owner: alice.address,mint: newMint.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const aliceAccount = await client.token.accounts.token.fetch(aliceAta);console.log(aliceAccount.data.amount); // 600_000_000_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.log(aliceAccount.data.owner); // alice.address
Ondalık Basamaklar
Token miktarları her zaman ham birimlerdir. 9 ondalık basamaklı 1000 token,
1_000_000_000_000n değerindedir, 1000n değil.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Token miktarları için her zaman BigInt kullanın. JavaScript'in Number
değeri 2^53 üzerinde hassasiyetini yitirir.
Eklenti Referansı
| Metod | Açıklama |
|---|---|
client.token.instructions.createMint() | Yeni bir SPL token mint oluşturur |
client.token.instructions.mintToATA() | Bir sahibin ATA'sına token basar (gerekirse ATA oluşturur) |
client.token.instructions.transferToATA() | Token'ları alıcının ATA'sına aktarır (gerekirse ATA oluşturur) |
client.token.accounts.mint.fetch() | Bir mint account alır ve çözümler |
client.token.accounts.token.fetch() | Bir token account alır ve çözümler |
Yaygın Hatalar
| Hata | Neden | Çözüm |
|---|---|---|
custom program error: 0x24 | decimals mint ile eşleşmiyor | createMint'ye geçirdiğiniz ondalık basamak değerini kullanın |
AccountNotFound | Hesap henüz mevcut değil | Token basmadan önce mint'in oluşturulduğundan emin olun |
InsufficientFunds | rent için yeterli lamport yok | Ödeyiciye daha fazla SOL airdrop yapın |
OwnerMismatch | Hesabın sahibi yanlış program | Program ID'sini kontrol edin |
Is this page helpful?