Now decoding Meteora DLMM

Books that prove themselves

The audit-ready subledger for Solana treasuries. Every swap, fee claim and multisig payout — decoded, mathematically reconciled (Δ = 0) and sealed for your independent auditor.

sig 4xQm…9fKeslot 291,442,108
{ "ix": 0, "program": "ComputeBudget", "SetPriority": 12000 }
{ "ix": 1, "program": "JUP6Lkb…", "route": { "hops": 3 },
"inner": [
"Whirlpool::swap SOL → USDC",
"Meteora::dlmm_swap USDC → JUP",
"Raydium::swap_base_in JUP → USDC" ] }
{ "fee": 5000, "cu": 312884, "logs": 41 }
ledger outputdecoding…
Jupiter · Swap out−120.00 SOLDr — / Cr SOL Holdings
Jupiter · Swap in+18,402.11 USDCDr USDC Holdings / Cr —
Solana · Priority fee−0.000132 SOLDr Gas Expense / Cr SOL Holdings
rule jupiter.route.v6 → swap.rebalance

Decoders for the protocols your treasury actually uses

JupiterMeteoraRaydiumKaminoSquadsToken-2022
01 · The problem

Solana breaks normal crypto accounting

Generic tools read token transfers. Solana's value moves through inner instructions, temporary accounts and program-held fees. These are the five cases we see break books most often.

4–8 accounts

One swap routes SOL → mSOL → USDC → JUP through intermediate WSOL and ATA accounts. Generic tools book 3 phantom swaps and a fake realized gain on every hop.

transfer SOL → wsol_ata 2.000000
swap wSOL → mSOL 1.8721
swap mSOL → USDC 341.22
swap USDC → JUP 412.90
closeAcct wsol_ata → owner 0.00204
MerkleBooks: Collapses the route to one economic event: 2.000 SOL disposed, 412.90 JUP acquired, rent refund netted against fees.
Generic tax tools
Read SPL transfers only
Enterprise subledgers
EVM-first, Solana via CSV
MerkleBooks
Inner-ix + CPI decoding, per slot
How it works

Built for the month-end close

Every entry decoded, balanced against chain state, reviewed, and sealed into an export that reproduces byte for byte.

Merkle-sealed entries

Every ledger line hashes into one root. Any entry can be proven back to its signature.

Pre-balance0.00
+Inflows0.00
−Outflows0.00
−Fees0.00
Post-balance50,620.00

Balance invariant

If pre + in − out − fees ≠ post, it doesn't pass. No silent misses.

Kamino withdraw — unknown reserve
decoder missing account
Squads transfer 50,000 USDC
needs counterparty memo
Token-2022 transfer fee
confidence 71%

Review queue

Uncertain items get flagged. Approve, reclassify or attach a memo.

q3-audit-pack.csv
rulesetv1.4.0
decoderv2.3.1
slots289,104,000 → 291,442,108
entries4,812
root0x9f3a…c71e
QuickBooksXeroCPA pack

Deterministic export

Pinned ruleset, decoder and slot range. Same inputs, same bytes, every time.

02 · Double-entry engine

Real journal entries, not a CSV of transfers

Every decoded event posts balanced debits and credits to your chart of accounts — mapped to the codes your controller and auditor already use.

JE-2026-09-0418 · sig 4hVt…9wQe · slot 291,004,118
CodeAccountDebitCreditMemo
1010-SOLAssets : Current : Vaults : Squads Primary (SOL)61.530.4102 SOL @ $150.00
1020-USDCAssets : Current : Vaults : Squads Primary (USDC)83.88bins 8422–8423
5200-GASExpenses : Network : Base + Priority Fees0.030.000185 SOL
1010-SOLAssets : Current : Vaults : Squads Primary (SOL)0.03fee payer
4100-YIELDRevenue : DeFi Yield : DLMM Fee Accrual145.41RULE_DLMM_CLAIM_01
Σ totals (USD)145.44145.44balanced · Δ 0.00
Your COA, imported

Pull account codes from QuickBooks, Xero or NetSuite. Map once; every rule respects it.

Price at the slot

Fair value from the block timestamp, with the price source and pool recorded on the line.

Cost basis per lot

FIFO, HIFO or specific-ID — chosen per entity, locked per close.

03 · Month-end close

Five steps from chain to closed books

Same inputs, same ruleset, same output — every time. That's what lets an auditor re-run your close instead of trusting it.

Ingest

Replay every confirmed slot in the period from our own archival index. No RPC sampling.

slot 288,112,000 → 294,870,512
41,208 txs
04 · Coverage

Decoders we publish, version and test

Narrow on purpose. Each decoder is pinned to a program ID, tested against a fixture set of mainnet transactions, and versioned into every audit seal.

ProtocolProgram IDInstructionsVer.Fixture pass
Jupiter Aggregator v6
JUP6LkbZ…TaV4route · sharedAccountsRoute · exactOutRoute3.2.0
99.6%
Meteora DLMM
LBUZKhRx…PwxoclaimFee · addLiquidityByWeight · removeLiquidity2.1.4
99.1%
Squads v4
SQDS4ep6…2pCfvaultTransactionExecute · batchExecute1.8.0
100.0%
Kamino Lend
KLend2g3…gmjDdepositReserveLiquidity · borrowObligationLiquidity1.3.2
98.4%
Token-2022
TokenzQd…xuEbtransferCheckedWithFee · withdrawWithheld1.1.0
99.9%
Raydium CLMMbeta
CAMMCzo5…rWqKswapV2 · increaseLiquidityV2 · collectFees0.9.1
96.2%
Jito tip accounts
96gYZGLn…5 +7system transfer (tip set match)1.0.3
100.0%
Drift v2Q1 2027
dRiftyHA…33UHplacePerpOrder · settlePnl · deposit—
planned

Unknown programs are never guessed. They route to the review queue with the raw instruction attached.

05 · Proof

Don't trust us. Re-run it.

'Cryptographically reconciled' means three concrete things: every line links to a signature and slot, the whole set is sealed by one Merkle root, and the ruleset that produced it is pinned so anyone can reproduce it.

seal.json
{
  "entity": "Example DAO Treasury",
  "period": "2026-07-01/2026-09-30",
  "slot_range": [288112000, 294870512],
  "wallets": 12,
  "ruleset_version": "mb-rules-2026.09.2",
  "decoder_engine": "2.4.1",
  "price_source": "pyth+pool-twap@slot",
  "line_items": 41208,
  "merkle_root": "9f3a1d…7b04c21e",
  "invariant": { "wallets_balanced": 12, "max_delta": "0.00" },
  "reviewed_by": ["controller", "external_cpa"]
}
terminal
verifier is MIT-licensed and runs offline
Traceability

Each ledger line carries signature, slot, instruction index and the rule that fired.

Tamper-evidence

Change one cent on one line and the Merkle root no longer matches the seal.

Reproducibility

Pinned ruleset, decoder and price source. Same slot range in, same books out.

06 · Deliverables

What your auditor actually receives

Three artifacts from one sealed close. Each carries the same Merkle root in its header.

journal_2026-Q3.csvroot 9f3a1d…c21e
Date,JournalNo,Account,Debit,Credit,Memo
2026-09-14,JE-0418,1010-SOL,61.53,,DLMM claim · 4hVt…9wQe
2026-09-14,JE-0418,1020-USDC,83.88,,DLMM claim · 4hVt…9wQe
2026-09-14,JE-0418,5200-GAS,0.03,,priority fee
2026-09-14,JE-0418,1010-SOL,,0.03,fee payer
2026-09-14,JE-0418,4100-YIELD,,145.41,RULE_DLMM_CLAIM_01
Architecture & precision

Why multi-chain subledgers break on Solana

Most crypto accounting tools were engineered for Ethereum’s linear execution model. Solana’s nested invocations, bin shifts and micro-fees leave them guessing.

CapabilityMerkleBooksMulti-chain subledgersSpreadsheets / scripts
Solana engine
Native runtime decoder

Unpacks nested CPIs, Token-2022 fee extensions and Jito tips.

EVM-first adapter

Inner instructions often land as “Unknown contract”.

None

Custom RPC scripts break on every protocol upgrade.

Reconciliation rule
Invariant Δ = 0

Pre + In − Out − Fee = Post. Unknowns go to review, never faked.

Heuristic matching

Obvious transfers tie out; multi-hop swaps are a black box.

Manual formulas

Missed fees and decimal errors go unnoticed.

Audit defense
Merkle-sealed workpapers

SHA-256 leaves, pinned ruleset, open CLI verifier.

Static CSV export

No tamper evidence or rule transparency for auditors.

Editable spreadsheet

No version pinning; heavy auditor scrutiny.

DeFi depth
Protocol decoders

Meteora DLMM claims, Jupiter exact-out, Kamino collateral.

Generic transfers

Can’t separate yield harvest from principal.

Manual entry

20–40 hrs/month matching signatures.

Onboarding
Paste an address

Squads vault or any treasury. Ledger in seconds.

Sales gate

Demo calls, security review, annual contract.

Immediate

But labor-intensive every single month.

Price
$499 – $1,499 / mo

Published pricing. Cancel anytime.

$20k – $60k+ / yr

Plus implementation fees.

Hidden cost

$15k–$30k extra CPA cleanup at year-end.

01

The end of “Unknown contract interaction”

A Jupiter route through three pools becomes one GAAP entry: Dr target asset, Cr source asset, Dr network fee — not three orphan transfers.

02

Audit-ready math, not best-effort matching

Every line is held to the balance invariant down to the lamport before it is sealed under a Merkle root.

03

Built for Squads from day zero

No private keys, no sales rep. Paste a public vault address and inspect the subledger immediately.

Competitor pricing and capabilities are estimates from public information and may change.

Pricing

Priced for treasuries

Billed on monthly transaction volume. Every plan includes the balance invariant.

Treasury
$499/mo
  • 1 treasury · 3 wallets
  • 2,500 tx / month
  • Jupiter, Meteora, Raydium
  • CSV export
Get started
Fundpopular
$1,499/mo
  • 5 treasuries · Squads
  • 25,000 tx / month
  • Review queue & close
  • Sealed CPA audit pack
  • 2 auditor seats
Get started
Institution
Custom
  • Unlimited treasuries
  • Custom decoders
  • Ruleset versioning & SLA
  • Unlimited auditor seats
Talk to us
07 · Controls

Built for the people who sign off

Read-only
public addresses only
Role-based
preparer · reviewer · auditor
Immutable log
every reclass is recorded
Period lock
sealed closes can't be edited

No. MerkleBooks is read-only. You give us public wallet or Squads vault addresses; we never sign anything.

MerkleBooks prepares records and evidence. It does not issue audit opinions or tax advice.
Get started

Close the month in hours, not weeks