وثائق سولاناLiteSVMRustصناديق إضافيةlitesvm-token

البداية السريعة

التثبيت

تأكد من توفر جميع التبعيات اللازمة:

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 address
let token_account = Keypair::new(); // Random address
let create_ix = system_instruction::create_account(
&payer.pubkey(),
&token_account.pubkey(), // Any address you want
rent,
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 + mint
let 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 Program
let (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 it
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();
// Create a new SPL token mint with the payer as the mint authority
let mint = CreateMint::new(&mut svm, &payer)
.authority(&payer.pubkey())
.decimals(DECIMALS)
.send()
.unwrap();
// Create a token account for the payer
let token_account = CreateAccount::new(&mut svm, &payer, &mint)
.owner(&payer.pubkey())
.send()
.unwrap();
// Mint tokens into the payer's token account
MintTo::new(&mut svm, &payer, &mint, &token_account, 1000)
.owner(&payer)
.send()
.unwrap();
// Verify balance
let token_account: TokenAccount = get_spl_account(&svm, &token_account).unwrap();
let account_balance = token_account.amount;
assert_eq!(account_balance, 1000)
}

المفاهيم الأساسية

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

تستخدم معظم الرموز الكسور العشرية لتمثيل المبالغ الجزئية:

// SOL has 9 decimals
let one_sol = 10_u64.pow(9); // 1_000_000_000 lamports
// USDC has 6 decimals
let one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC
// Always account for decimals in calculations
let 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?