litesvm is a fast and lightweight library for testing Solana programs. It works by creating an in-process Solana VM optimized for program developers. This makes it much faster to run and compile than alternatives like solana-program-test and solana-test-validator. In a further break from tradition, it has an ergonomic API with sane defaults and extensive configurability for those who want it.
cargo add --dev litesvmuse litesvm::LiteSVM;
use solana_address::Address;
use solana_keypair::Keypair;
use solana_message::Message;
use solana_signer::Signer;
use solana_system_interface::instruction::transfer;
use solana_transaction::Transaction;
let from_keypair = Keypair::new();
let from = from_keypair.pubkey();
let to = Address::new_unique();
let mut svm = LiteSVM::new();
svm.airdrop(&from, 10_000).unwrap();
let instruction = transfer(&from, &to, 64);
let tx = Transaction::new(
&[&from_keypair],
Message::new(&[instruction], Some(&from)),
svm.latest_blockhash(),
);
let tx_res = svm.send_transaction(tx).unwrap();
let from_account = svm.get_account(&from);
let to_account = svm.get_account(&to);
assert_eq!(from_account.unwrap().lamports, 4936);
assert_eq!(to_account.unwrap().lamports, 64);Beyond simple transfers, litesvm supports:
- Program loading β load compiled
.sofiles withadd_program_from_fileor raw bytes withadd_program. Pull programs from mainnet/devnet usingsolana program dump. - Simulation β dry-run a transaction without committing state changes using
simulate_transaction. - Time travel β overwrite the
Clocksysvar withset_sysvar::<Clock>(), or jump to a future slot withwarp_to_slot. - Arbitrary account writes β use
set_accountto write any account state bypassing runtime checks (e.g. give a test wallet a large USDC balance without owning the mint keypair). - Compute budget control β override compute unit limits and heap size with
with_compute_budget. - Transaction history β look up past transactions by signature with
get_transaction; configure history capacity withwith_transaction_history. - Sigverify control β disable signature checking with
with_sigverify(false)to speed up tests that don't need signing. - Custom syscalls β register custom BPF syscalls with
with_custom_syscall. - Register tracing β capture BPF register traces (requires the
register-tracingfeature flag).
litesvm-token provides ergonomic helpers for testing SPL Token programs. Rather than hand-rolling the instructions for creating mints, token accounts, and ATAs, it exposes a builder-style API covering the full range of token operations: CreateMint, CreateAssociatedTokenAccount, MintTo, Transfer, Burn, Approve, and their checked variants, plus authority management (SetAuthority, FreezeAccount, ThawAccount).
cargo add --dev litesvm-tokenSee the SPL token testing guide for a full walkthrough.
litesvm-loader provides helpers for working with Solana's upgradeable BPF loader in LiteSVM. It wraps the repetitive deployment flow for upgradeable programs by creating the buffer account, writing program bytes in chunks, deploying the program, and exposing a helper for changing the upgrade authority.
cargo add --dev litesvm-loaderSee the loader API docs for the available helpers.
litesvm-utils dramatically reduces test boilerplate through three ergonomic traits that extend LiteSVM:
TestHelpersβ create funded accounts, token mints, and ATAs; derive PDAs; and manipulate slots, all in a single method call.AssertionHelpersβ readable one-liner assertions for account existence, ownership, SOL/token balances, and account data length.TransactionHelpersβ execute instructions and assert success, failure, or specific error codes without manually constructing transactions.
It also ships a LiteSVMBuilder for fluent, chainable test environment setup. The crate is framework-agnostic and works with native, Anchor, and SPL programs.
cargo add --dev litesvm-utilsSee the litesvm-utils testing guide for a full walkthrough.
anchor-litesvm brings Anchor-native testing to LiteSVM with syntax mirroring anchor-client β but with no RPC overhead. It's the recommended way to test Anchor programs with LiteSVM.
AnchorContextβ manages theLiteSVMinstance, payer, and program in one place. UseAnchorLiteSVM::build_with_program()to set up the full test environment in a single call.Programbuilder β fluent, type-safe instruction building viaaccounts(),args(), andinstruction(), using the client types generated bydeclare_program!from your IDL.- Account deserialization β automatically fetches and deserializes Anchor accounts (including PDAs), handling discriminators for you.
- Event parsing β extracts and deserializes typed events from transaction logs.
cargo add --dev anchor-litesvmSee the anchor-litesvm testing guide for a full walkthrough.
- Full documentation: litesvm.com
- Full API reference: docs.rs/litesvm
- Node.js wrapper:
litesvmon npm β seecrates/node-litesvmfor its README and tutorial
The tests in this repo use some test programs you need to build first (Solana CLI >= 1.18.8 required):
cd crates/litesvm/test_programs && cargo build-sbf
Then just run cargo test.
