Solana · TypeScript · Native SVM

Test Solana
programs at
native speed.

A TypeScript harness that drives the real Solana SVM directly — no validator, no WASM, no subprocess. Millisecond feedback on every change.

View on GitHub
~0ms
startup time
5
platform binaries
native
SVM execution
zero
toolchain for SPL
5
weekly downloads

Why svmforge

before
solana-test-validator
Startup3–10s
Processrequired
Speedreal validator
Accountsvia RPC
CIpainful
existing
solana-bankrun
Startup~100ms
Processnone
SpeedWASM
Accountsgood
CImanageable
now
svmforge
Startup~0ms
Processnone
Speednative binary
Accountsfull
CIone command

Capabilities

Everything you need.

01
Core

Pure SVM execution

Calls directly into the same Solana SVM that mainnet validators use. No bank layer, no AccountsDB, no subprocess — just your program executing in pure isolation.

typescript
const result = svm.processInstruction(ix, accounts);

console.log(result.success);              // true
console.log(result.computeUnitsConsumed); // 3842n
console.log(result.resultingAccounts);    // final state

Test output

See exactly what runs.

Every test reports exact compute units, real account state, and program error codes. No mocks. No stubs. The actual SVM result.

svmforge — test runner
$SBF_OUT_DIR=./target/deploy npm test
PASS __test__/index.spec.ts
system transfer succeeds150 CU
checks lamports after transfer150 CU
multi-step chain — state flows298 CU
transaction rollback on failure
MolluskContext — persists state301 CU
warpToSlot — clock advances92 CU
PASS __test__/escrow.spec.ts
Initialize — stores beneficiary + amount3842 CU
Initialize — fails if already initialized2901 CU
Release — transfers lamports to beneficiary4120 CU
Release — wrong beneficiary (err 3)2340 CU
Cancel — returns funds to depositor3890 CU
Context — full escrow flow, auto state8102 CU
Test Suites:2 passed, 2 total
Tests:60 passed, 60 total
Time:1.928s
Startup:~0ms (no validator)
Exact CU per instruction
Know precisely how many compute units each instruction costs before deploying.
Real account balances
Inspect lamports, data bytes, and owner after every execution.
Program error codes
Failing tests show the exact error code your program returned.
Sub-2s full suite
60 tests including real BPF program — under 2 seconds. No warmup.

Get started

From zero to passing
tests in minutes.

01

Install

02

Write your test

typescript
import { MolluskSvm, systemAccount, checkSuccess, checkAccountLamports } from 'svmforge';

const svm = new MolluskSvm(PROGRAM_ID, 'target/deploy/my_program');

svm.processAndValidateInstruction(
  transferIx(ALICE, BOB, 500_000_000n),
  [
    { pubkey: ALICE, account: systemAccount(1_000_000_000n) },
    { pubkey: BOB,   account: systemAccount(0n) },
  ],
  [checkSuccess(), checkAccountLamports(BOB, 500_000_000n)],
);
03

Run

Stateful multi-step context
typescript
const ctx = MolluskContext.createDefault();
ctx.setAccount(ALICE, systemAccount(10_000_000_000n));
ctx.setAccount(BOB,   systemAccount(0n));

ctx.processInstruction(transferIx(ALICE, BOB, 1_000_000_000n));
ctx.processInstruction(transferIx(ALICE, BOB, 2_000_000_000n));

// State persists automatically between calls
console.log(ctx.getAccount(ALICE)?.lamports); // 7_000_000_000n
Works with any framework
AnchorPinocchioQuasarNative RustRaw BPF

svmforge loads the compiled .so binary — it has no knowledge of the framework used to write the program.

No validator.
No friction.

Just your program, your accounts, and the real SVM. Start in under a minute.