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.
Recipe
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:
- Native Rust program development without Anchor TS.
- Benchmarking instruction CU usage in tests.
- Validating account ordering independent of client SDK.
- Quick regression on instruction data parsing.
Working Example
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_instructionruns ix and asserts success checks.- Account store is explicit tuple list of pubkey + Account state.
- Program path points to
target/deployartifact fromcargo build-sbf.
Deep Dive
How It Works
- Mollusk loads ELF and invokes entrypoint with provided accounts.
- Returns detailed execution result including CU consumption.
Checkenum validates success, error codes, and log patterns.- Composes with Solana SDK types - no RPC layer.
Mollusk vs LiteSVM
| 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 |
Rust Notes
use mollusk_svm::result::Check;
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[
Check::success(),
Check::compute_units(45_000..=60_000),
],
);Gotchas
- Empty account data - Default accounts lack discriminator. Fix: Serialize Anchor account data into
Account::data. - Wrong program path - Debug vs release
.somismatch. Fix: Consistentcargo build-sbfprofile in CI. - Signer flags only -
is_signeron meta without signature verification in mollusk context. Fix: Pair with LiteSVM tx tests for signature paths. - Missing owner - Account owner must match expected program for deserialization. Fix: Set
account.owner = program_id. - Token CPI - Need token program loaded in mollusk config. Fix: Add SPL program bytes per mollusk docs.
- Check too strict CU - Upgrades change CU. Fix: Use ranges, not exact values.
Alternatives
| 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 |
FAQs
Do I need a validator for Mollusk?
No - pure in-process execution.
Does Mollusk support Anchor programs?
Yes - load Anchor .so and pass discriminator bytes in instruction data.
How do I assert custom errors?
Use Check::err(solana_sdk::program_error::ProgramError::Custom(code)).
Can I measure CU?
Yes - Check::compute_units with inclusive range bounds.
How do I test CPI chains?
Include callee program accounts and load dependent program ELFs into mollusk.
Mollusk vs program-test crate?
Mollusk is maintained for instruction-focused tests; prefer it for new Rust-only projects.
CI setup?
cargo test after anchor build or cargo build-sbf - fast layer in pipeline.
Account rent?
Set sufficient lamports on accounts to satisfy rent-exempt minimums.
Blockhash needed?
Not for process_instruction - transaction-level concerns use LiteSVM instead.
Agave 4.1.1 compatibility?
Keep mollusk-svm crate updated alongside Solana SDK 2.x / Agave toolchain pins.
Related
- LiteSVM - transaction-level tests
- Testing CPIs & PDAs - account graphs
- Program Size & CU Discipline - CU budgets
- Testing Basics - pyramid placement
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.