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

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

التثبيت

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

cargo add --dev litesvm litesvm-utils

ما هي litesvm-utils؟

توفر حزمة litesvm-utils سمات مساعدة أساسية وأدوات مساعدة تُبسّط اختبار برامج سولانا. إذ تُقلّص الكود النمطي الشائع في الاختبارات من أكثر من 30 سطرًا إلى كود موجز وسهل القراءة عبر واجهات برمجية سلسة.

سمة TestHelpers

  • إنشاء حسابات ممولة باستدعاء طريقة واحدة
  • إعداد token mints وtoken account بسهولة
  • اشتقاق PDAs دون كود نمطي
  • إدارة slot للاختبارات المبنية على الوقت

سمة AssertionHelpers - التحقق من حالات الحسابات (موجود، مغلق، مالك) - التحقق من أرصدة token account وإمدادات token mints - فحص أرصدة SOL - التحقق من أطوال بيانات الحسابات

سمة TransactionHelpers - تنفيذ التعليمات مع معالجة غنية للنتائج - التأكد من نجاح أو فشل المعاملات - التحقق من رموز الأخطاء المحددة - فحص سجلات المعاملات ووحدات الحوسبة

LiteSVMBuilder - نمط بناء سلس لإعداد بيئة الاختبار - نشر البرامج باستخدام تسلسل الطرق - طرق مصنع ثابتة ومريحة

مثال سريع

إليك مثالًا متكاملًا يُظهر قوة litesvm-utils:

use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_with_utils() {
let mut svm = LiteSVM::new();
// Create funded accounts in one line
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Create a token mint easily
let mint = svm.create_token_mint(&alice, 9).unwrap();
// Create associated token accounts (returns Pubkey)
let alice_ata = svm.create_associated_token_account(&mint.pubkey(), &alice).unwrap();
let bob_ata = svm.create_associated_token_account(&mint.pubkey(), &bob).unwrap();
// Mint tokens
svm.mint_to(&mint.pubkey(), &alice_ata, &alice, 1000).unwrap();
// Assert balances
svm.assert_token_balance(&alice_ata, 1000);
svm.assert_token_balance(&bob_ata, 0);
// Execute a SOL transfer with rich result handling
let transfer_ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
LAMPORTS_PER_SOL,
);
let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();
result.assert_success();
// Verify the transfer
svm.assert_sol_balance(&bob.pubkey(), LAMPORTS_PER_SOL);
}

الفوائد الرئيسية

قبل litesvm-utils

// Creating a funded account manually
let keypair = Keypair::new();
let airdrop_tx = Transaction::new_signed_with_payer(
&[system_instruction::transfer(
&payer.pubkey(),
&keypair.pubkey(),
lamports,
)],
Some(&payer.pubkey()),
&[&payer],
svm.latest_blockhash(),
);
svm.send_transaction(airdrop_tx).unwrap();

بعد litesvm-utils

// One line to create a funded account
let keypair = svm.create_funded_account(lamports).unwrap();

نظرة عامة على الـ Trait

TestHelpers

الطريقةالقيمة المُعادةالوصف
create_funded_account(lamports)Result<Keypair>ينشئ keypair ويموّله
create_funded_accounts(count, lamports)Result<Vec<Keypair>>ينشئ عدة keypairs مموّلة
create_token_mint(authority, decimals)Result<Keypair>ينشئ عملة SPL token mint
create_token_account(mint, owner)Result<Keypair>ينشئ token account عادياً
create_associated_token_account(mint, owner)Result<Pubkey>ينشئ ATA ويُعيد عنوانه
mint_to(mint, account, authority, amount)Result<()>يصكّ رموزاً إلى حساب
derive_pda(seeds, program_id)(Pubkey, u8)يشتق PDA مع bump seed
get_pda(seeds, program_id)Pubkeyيُعيد عنوان PDA فقط
get_pda_with_bump(seeds, program_id)(Pubkey, u8)اسم بديل لـ derive_pda
get_current_slot()u64يُعيد الـ slot الحالي
advance_slot(slots)()يُقدّم الوقت بمقدار N من الـ slots

AssertionHelpers

الطريقةالوصف
assert_account_exists(pubkey)يُوقف التنفيذ إذا لم يكن الحساب موجوداً
assert_account_closed(pubkey)يُوقف التنفيذ إذا كان الحساب موجوداً وبه بيانات/lamports
assert_token_balance(account, amount)يتحقق من رصيد الرموز
assert_sol_balance(pubkey, lamports)يتحقق من رصيد SOL
assert_mint_supply(mint, supply)يتحقق من إجمالي إمداد العملة
assert_account_owner(pubkey, owner)يتحقق من مالك الحساب
assert_account_data_len(pubkey, len)يتحقق من طول البيانات

TransactionHelpers

الطريقةالقيمة المُعادةالوصف
send_instruction(ix, signers)Result<TransactionResult, TransactionError>يُرسل تعليمة واحدة
send_instructions(ixs, signers)Result<TransactionResult, TransactionError>يُرسل تعليمات متعددة في معاملة واحدة
send_transaction_result(tx)Result<TransactionResult, TransactionError>يُرسل Transaction خاماً

استكشاف الأخطاء وإصلاحها

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

الخطأالسببالحل
AccountNotFoundمحاولة استخدام حساب غير موجوداستخدم create_funded_account أولاً
InsufficientFundsلا يوجد عدد كافٍ من lamports لإتمام المعاملةزِد مبلغ التمويل الأولي
OwnerMismatchالحساب مملوك من قِبل برنامج خاطئتحقق من معرّف البرنامج الصحيح
AssertionFailedالرصيد أو الحالة لا تتطابق مع المتوقعراجع منطق الاختبار لديك

Is this page helpful?

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

تعديل الصفحة