اختبار الرموز المميزة

يعني اختبار منطق الرموز المميزة على سولانا إعداد عمليات الإصدار، وtoken account، والصلاحيات قبل أن تتمكن من اختبار منطق التحويل الذي يهمك فعلاً. إضافة tokenProgram() من @solana-program/token تُبسّط هذا الإعداد إلى عدد قليل من استدعاءات الوظائف — وتتولى إنشاء associated token account تلقائياً.

التثبيت

pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token

إنشاء عملية إصدار

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();
// Verify
const mintAccount = await client.token.accounts.mint.fetch(newMint.address);
console.log(mintAccount.data.supply); // 0n
console.log(mintAccount.data.decimals); // 9

إصدار الرموز المميزة

mintToATA يُصدر الرموز المميزة إلى associated token account الخاص بالمالك. إذا لم يكن associated token account موجوداً، فسيتم إنشاؤه في نفس المعاملة.

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 هو فحص أمان — يجب أن يتطابق مع عدد الخانات العشرية للإصدار بدقة، وإلا سيرفض Token Program المعاملة بالخطأ 0x24. وهذا يمنع الإصدار الخاطئ لعدد أكبر من الرموز المميزة بمقدار 1000 مرة.

تحويل الرموز المميزة

transferToATA ينقل الرموز المميزة بين المستخدمين. يتم إنشاء associated token account الخاص بالمستلم تلقائياً عند الحاجة.

const alice = await generateKeyPairSigner();
const bob = await generateKeyPairSigner();
// Mint to Alice
await 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 Bob
await client.token.instructions
.transferToATA({
mint: newMint.address,
authority: alice,
recipient: bob.address,
amount: 400_000_000_000n,
decimals: 9
})
.sendTransaction();

authority هو الموقّع الذي يمتلك الرموز المميزة المصدر. تستنتج الإضافة كلاً من associated token account المصدر والوجهة من عناوينهما مضافاً إليها عملية الإصدار.

التحقق من الأرصدة

لقراءة أرصدة الرموز المميزة، استخرج عنوان associated token account باستخدام findAssociatedTokenPda وجلب الحساب المفكوك:

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_000n
console.log(aliceAccount.data.mint); // newMint.address
console.log(aliceAccount.data.owner); // alice.address

الكسور العشرية

تكون كميات الرموز المميزة دائمًا بالوحدات الخام. 1000 رمز مميز بـ 9 كسور عشرية يساوي 1_000_000_000_000n، وليس 1000n.

// USDC has 6 decimals
const oneUSDC = 10n ** 6n; // 1_000_000n
// SOL has 9 decimals
const oneSOL = 10n ** 9n; // 1_000_000_000n

استخدم دائمًا BigInt لكميات الرموز المميزة. دالة Number في JavaScript تفقد الدقة فوق 2^53.

مرجع الإضافة

الطريقةالوصف
client.token.instructions.createMint()إنشاء mint account جديد لرمز SPL
client.token.instructions.mintToATA()صك الرموز المميزة إلى associated token account الخاص بالمالك (يُنشئ associated token account عند الحاجة)
client.token.instructions.transferToATA()نقل الرموز المميزة إلى associated token account الخاص بالمستلم (يُنشئ associated token account عند الحاجة)
client.token.accounts.mint.fetch()جلب mint account وفك ترميزه
client.token.accounts.token.fetch()جلب token account وفك ترميزه

الأخطاء الشائعة

الخطأالسببالحل
custom program error: 0x24decimals لا يتطابق مع mint accountاستخدم نفس قيمة الكسور العشرية التي مررتها إلى createMint
AccountNotFoundالحساب غير موجود بعدتأكد من إنشاء mint account قبل الصك
InsufficientFundsلا توجد lamport كافية لدفع rentقم بإسقاط جوي لـ SOL إضافي إلى الدافع
OwnerMismatchالبرنامج الخاطئ يمتلك الحسابتحقق من معرّف البرنامج

Is this page helpful?

جدول المحتويات

تعديل الصفحة