MirrorPoolGitHub →

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.

Terminal
$ 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.md

How it works

From YAML to actionable report in seconds.

01

Write YAML

Describe your Solana transactions and expected outcomes in a simple YAML file.

02

Build & Simulate

MirrorPool constructs the transaction and sends it to Solana's simulateTransaction RPC — a dry-run with no real SOL spent.

03

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.

test.yml
- 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 --html

GitHub Action

- uses: deepanshu-yd/mirrorpool@v1
  with:
    rpc-url: ${{ secrets.SOLANA_RPC_URL }}