التثبيت
تأكد من توفر جميع التبعيات اللازمة:
cargo add --dev litesvm litesvm-token solana-sdk spl-token spl-associated-token-account
أساسيات رموز SPL
في سولانا، إنشاء token account هو عملية تتم على خطوتين.
إنشاء Mint Account
- لا يحتوي على رصيد من الرموز
- يحتفظ بجميع المعلومات العامة للرمز، مثل إجمالي المعروض، والكسور العشرية، والصلاحية، وما إلى ذلك.
- يوجد mint account واحد لكل رمز
- المالك هو Token Program (TokenKeg أو Token 2022)
إنشاء Token Account
- يخزّن الرصيد لرمز SPL محدد
- يحتفظ بـ mint account لتحديد رمز SPL الموجود في هذا الحساب
- يمكن أن تكون هناك عدة token accounts لـ mint account واحد
- المالك هو من يتحكم في الرموز داخل هذا الحساب
أنواع Token Accounts
Regular Token Account
يخزّن token account رصيدك لرمز SPL محدد:
// Can create token accounts at ANY addresslet token_account = Keypair::new(); // Random addresslet create_ix = system_instruction::create_account(&payer.pubkey(),&token_account.pubkey(), // Any address you wantrent,165, // Token account size&spl_token::id(),);let init_ix = spl_token::instruction::initialize_account(&spl_token::id(),&token_account.pubkey(),&mint,&owner.pubkey(),)?;
✓ المميزات
- •إمكانية إنشاء حسابات متعددة لنفس mint/owner
- •مرونة عالية - يمكن استخدام أي عنوان
✗ العيوب
- •غير حتمي - يلزم تتبع العناوين يدويًا
- •يجب على المستلم إخبارك بالحساب الذي تُرسل إليه
- •يُسبب ارتباكًا عند وجود حسابات متعددة
متى تستخدمه: الحسابات المؤقتة/حسابات الضمان، الحسابات المملوكة للبرنامج ذات المنطق المخصص، عند الحاجة إلى حسابات متعددة للرمز نفسه، واستراتيجيات DeFi المتقدمة.
associated token account (ATA)
الـ ATA هو token account على عنوان PDA حتمي:
// ATA address is ALWAYS the same for owner + mintlet ata = get_associated_token_address(&owner.pubkey(), &mint);// Address derived from: [owner_pubkey, token_program_id, mint]
كيفية اشتقاق عنوان الـ ATA:
// ATA is a PDA owned by the Associated Token Programlet (ata, bump) = Pubkey::find_program_address(&[owner.as_ref(),spl_token::id().as_ref(),mint.as_ref(),],&spl_associated_token_account::id(), // ATA program);
✓ المزايا
- •حساب معياري واحد لكل زوج مالك/سك
- •حتمي - يمكن لأي شخص حساب العنوان
- •يُبسّط عمليات الدفع - يكفي عنوان المحفظة وعنوان السك
- •الاصطلاح القياسي عبر جميع تطبيقات سولانا
✗ العيوب
- •يمكن امتلاك ATA واحد فقط لكل زوج مالك/سك (حسب التصميم)
موصى به في معظم الحالات: تطبيقات المحافظ، وبروتوكولات DeFi، ومقتنيات NFT، وأنظمة الدفع، وأي عمليات نقل للرموز تواجه المستخدم.
مثال سريع
إليك مثالاً كاملاً لإنشاء mint للرمز وسك الرموز:
use litesvm::LiteSVM;use litesvm_token::{get_spl_account,spl_token::{native_mint::DECIMALS, state::Account as TokenAccount},CreateAccount, CreateMint, MintTo, Transfer,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_create_and_mint_tokens() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();// Create a token account for the payerlet token_account = CreateAccount::new(&mut svm, &payer, &mint).owner(&payer.pubkey()).send().unwrap();// Mint tokens into the payer's token accountMintTo::new(&mut svm, &payer, &mint, &token_account, 1000).owner(&payer).send().unwrap();// Verify balancelet token_account: TokenAccount = get_spl_account(&svm, &token_account).unwrap();let account_balance = token_account.amount;assert_eq!(account_balance, 1000)}
المفاهيم الأساسية
الكسور العشرية للرمز
تستخدم معظم الرموز الكسور العشرية لتمثيل المبالغ الجزئية:
// SOL has 9 decimalslet one_sol = 10_u64.pow(9); // 1_000_000_000 lamports// USDC has 6 decimalslet one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC// Always account for decimals in calculationslet amount_tokens = 100;let amount_raw = amount_tokens * 10_u64.pow(decimals as u32);
العلاقات بين الحسابات
يُعدّ فهم العلاقات بين الحسابات أمراً بالغ الأهمية:
- حساب Mint: يُعرّف الرمز (العرض، والكسور العشرية، والصلاحيات)
- token account: يحتفظ بالرموز لمالك محدد
- associated token account: token account حتمي لزوج المالك+mint
- سلطة Mint: يمكنها إنشاء رموز جديدة
- سلطة التجميد: يمكنها تجميد token account (اختياري)
استكشاف الأخطاء وإصلاحها
الأخطاء الشائعة
| الخطأ | السبب | الحل |
|---|---|---|
AccountNotFound | محاولة استخدام حساب غير موجود | تأكد من إنشاء الحساب قبل استخدامه |
AccountAlreadyInitialized | محاولة تهيئة حساب مُهيَّأ بالفعل | تحقق من وجود الحساب قبل إنشائه |
InsufficientFunds | عدم كفاية lamport للـ rent أو الرموز للتحويل | تأكد من توفر تمويل/سك كافٍ |
OwnerMismatch | الحساب مملوك لبرنامج خاطئ | تحقق من معرّف البرنامج الصحيح عند الإنشاء |
Is this page helpful?