يعني اختبار منطق الرموز المميزة على سولانا إعداد عمليات الإصدار، و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();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.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 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 هو الموقّع الذي يمتلك الرموز المميزة المصدر. تستنتج الإضافة كلاً من
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_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.log(aliceAccount.data.owner); // alice.address
الكسور العشرية
تكون كميات الرموز المميزة دائمًا بالوحدات الخام. 1000 رمز مميز بـ 9 كسور عشرية
يساوي 1_000_000_000_000n، وليس 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst 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: 0x24 | decimals لا يتطابق مع mint account | استخدم نفس قيمة الكسور العشرية التي مررتها إلى createMint |
AccountNotFound | الحساب غير موجود بعد | تأكد من إنشاء mint account قبل الصك |
InsufficientFunds | لا توجد lamport كافية لدفع rent | قم بإسقاط جوي لـ SOL إضافي إلى الدافع |
OwnerMismatch | البرنامج الخاطئ يمتلك الحساب | تحقق من معرّف البرنامج |
Is this page helpful?