Simulate Solana transactions
on every PR.
Catch transaction failures before mainnet. MirrorPool dry-runs your Solana transactions against a real RPC — no wallet, no gas fees, no state changes.
$ npx mirrorpool run .mirrorpool
🔬 MirrorPool
━━━━━━━━━━━━━━━━━━━━━━━━
📁 Loading tests from: .mirrorpool
🔌 RPC: https://api.devnet.solana.com
🧪 Tests found: 1
✅ SOL Transfer — 500 CU (320ms)
- SOL change: -0.000004210 SOL
📝 Report saved: .mirrorpool-results/summary.mdHow it works
From YAML to actionable report in seconds.
Write YAML
Describe your Solana transactions and expected outcomes in a simple YAML file.
Build & Simulate
MirrorPool constructs the transaction and sends it to Solana's simulateTransaction RPC — a dry-run with no real SOL spent.
Check & Report
Assertions are evaluated, regressions are detected, and rich reports are generated for your PR.
Everything you need
Ship Solana transactions with confidence.
No wallet required
Simulation runs with sigVerify: false — no private keys, no setup.
No gas costs
simulateTransaction is a dry-run. Zero SOL consumed, zero state changed.
State assertions
Declare expected SOL and token balance changes with tolerance for variable fees.
Log matching
Assert regex patterns in program execution logs to verify behavior.
Snapshot regression
Detect when a passing test starts failing or when compute units drift by more than 20%.
Rich reports
Dark-themed HTML reports with balance changes, program logs, inner instructions, and assertion results.
Quick start
One command to run. One minute to set up in CI.
- name: SOL Transfer
rpc: https://api.devnet.solana.com
instructions:
- programId: "11111111111111111111111111111111"
accounts:
- { pubkey: "$SENDER", isSigner: true, isWritable: true }
- { pubkey: "$RECEIVER", isSigner: false, isWritable: true }
data:
amount: 1000
assertions:
expectSuccess: true
computeUnits:
max: 500
stateAssertions:
- type: solBalance
account: "$SENDER"
exactChange: "-1000"
tolerance: "5000"CLI
npx mirrorpool run .mirrorpool --htmlGitHub Action
- uses: deepanshu-yd/mirrorpool@v1
with:
rpc-url: ${{ secrets.SOLANA_RPC_URL }}