Mollusk
Mollusk SVM is a lightweight Rust harness for executing single instructions against compiled BPF programs. Use it when you want instruction-level tests without LiteSVM's full transaction API or a running validator.
Search across all documentation pages
Mollusk SVM is a lightweight Rust harness for executing single instructions against compiled BPF programs. Use it when you want instruction-level tests without LiteSVM's full transaction API or a running validator.
Quick-reference recipe card - copy-paste ready.
use mollusk_svm::Mollusk;
use solana_sdk::instruction::{AccountMeta, Instruction};
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let result = mollusk.process_instruction(&ix, &account_store);
assert!(result.program_result.is_ok());When to reach for this:
use mollusk_svm::{Mollusk, result::Check};
use solana_sdk::{
account::Account,
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
#[test]
fn process_deposit() {
let program_id = Pubkey::new_unique();
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let user = Pubkey::new_unique();
let vault = Pubkey::new_unique();
let accounts = vec![
(user, Account::default()),
(vault, Account::default()),
];
let ix = Instruction {
program_id,
accounts: vec![
AccountMeta::new(user, true),
AccountMeta::new(vault, false),
],
data: vec![0], // deposit discriminator
};
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[Check::success()],
);
}What this demonstrates:
process_and_validate_instruction runs ix and asserts success checks.target/deploy artifact from cargo build-sbf.Check enum validates success, error codes, and log patterns.| Aspect | Mollusk | LiteSVM 0.6.x |
|---|---|---|
| API level | Instruction | Transaction |
| CU metrics | Built-in checks | Available in errors |
| CPI support | Yes | Yes |
| Clock control | Manual accounts | Sysvar helpers |
use mollusk_svm::result::Check;
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[
Check::success(),
Check::compute_units(45_000..=60_000),
],
);Account::data..so mismatch. Fix: Consistent cargo build-sbf profile in CI.is_signer on meta without signature verification in mollusk context. Fix: Pair with LiteSVM tx tests for signature paths.account.owner = program_id.| Alternative | Use When | Don't Use When |
|---|---|---|
| LiteSVM | Full transaction flows | Only need ix-level |
| anchor test | Anchor IDL clients | Rust-only developers |
| Trident fuzz | Random inputs | Deterministic regression |
No - pure in-process execution.
Yes - load Anchor .so and pass discriminator bytes in instruction data.
Use Check::err(solana_sdk::program_error::ProgramError::Custom(code)).
Yes - Check::compute_units with inclusive range bounds.
Include callee program accounts and load dependent program ELFs into mollusk.
Mollusk is maintained for instruction-focused tests; prefer it for new Rust-only projects.
cargo test after anchor build or cargo build-sbf - fast layer in pipeline.
Set sufficient lamports on accounts to satisfy rent-exempt minimums.
Not for process_instruction - transaction-level concerns use LiteSVM instead.
Keep mollusk-svm crate updated alongside Solana SDK 2.x / Agave toolchain pins.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 16, 2026