Документация SolanaLiteSVMRustДополнительные контейнерыlitesvm-utils

Быстрый старт

Установка

Убедитесь, что у вас есть все необходимые зависимости:

cargo add --dev litesvm litesvm-utils

Что такое litesvm-utils?

Крейт litesvm-utils предоставляет основные вспомогательные трейты и утилиты, которые упрощают тестирование программ Solana. Он сокращает типичный шаблонный код для тестирования с 30+ строк до минимального, читаемого кода благодаря эргономичному API.

Трейт TestHelpers

  • Создание пополненных аккаунтов одним вызовом метода
  • Простая настройка token мints и token accounts
  • Получение PDA без шаблонного кода
  • Управление slot-ами для тестирования на основе времени

Трейт AssertionHelpers — Проверка состояний аккаунтов (существует, закрыт, владелец) — Верификация балансов token account и объёмов выпуска mint — Проверка балансов SOL — Валидация длин данных аккаунта

Трейт TransactionHelpers — Выполнение инструкций с расширенной обработкой результатов — Проверка успешности или сбоя транзакции — Проверка конкретных кодов ошибок — Просмотр логов транзакций и вычислительных единиц

LiteSVMBuilder - Паттерн fluent builder для настройки тестового окружения - Деплой программ с помощью цепочки методов - Удобные статические фабричные методы

Быстрый пример

Вот полный пример, демонстрирующий возможности 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();

Обзор трейтов

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-токена
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 слотов

AssertionHelpers

МетодОписание
assert_account_exists(pubkey)Вызывает панику, если аккаунт не существует
assert_account_closed(pubkey)Вызывает панику, если аккаунт существует и содержит данные/лампорты
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?