Agave 4.4.1 is rolling out to providers — check before it reaches you

Your RPC says 200. Does your app agree?

SlotCheck replays the transactions, accounts and history your app actually reads against your own Solana endpoint — then runs the answers through your decoder. Raw response and app path get separate verdicts, so you know which one broke

Local. Read-only. Your keys never leave the machine
slotcheck — ~/app
❯
Where it breaks

One request, five separate answers

Every check is split along the path a response takes into your app. The summary never folds them into one “healthy”

POSTyour endpointallowlisted read
TransportHTTP, TLS, timeout, 429
RPC capabilityJSON-RPC error, rejected params
Data coveragenull, retention, archive tier
Consistencygolden fields, network, slots
raw artifact saved · sha256
App decodeyour trusted adapter
report.html5 verdictsper check, never folded
HTTP 200 with a JSON-RPC error

The wire worked. The method didn't

Transportpass
RPC capabilityfail
Data coveragenot run
Consistencynot run
App decodenot run
Correct raw transaction, decoder crashes

Data is there. Your app path breaks

Transportpass
RPC capabilitypass
Data coveragepass
Consistencypass
App decodefail
null for an archived signature

Absent at observation — not a wrong balance

Transportpass
RPC capabilitypass
Data coverageunknown
Consistencyincomparable
App decodenot run
Endpoint on another network

Genesis mismatch stops every dependent probe

Transportpass
RPC capabilitypass
Data coveragenot run
Consistencyfail
App decodenot run
passmatched the golden record or the rulefailobserved and wrongunknownnot enough evidence to sayunsupportedthe endpoint or adapter refuses itincomparableconditions differ — no number givennot runbudget, dependency or stage skipped
A real catch

The RPC was fine. The upgrade wasn't

Run run_6dc49f72 replays 10 mainnet transactions after an adapter bump to 2.4.0. Raw bytes match golden on every one — and 2 reverted routes decode with the error pinned on the wrong instruction

  • Raw sha256 identical to the approved record
  • Target moved 4.4.0 → 4.4.1 between runs — logged, not blamed
  • Same pack, same config: the diff isolates the adapter
tx-02 · v0APP_ERR_INDEX_MISMAP

Reverted Jupiter route, 33 loaded accounts

2t9oTQrsP7aPg6…EAjUmJvWoksLnj ↗
Transportpass
RPC capabilitypass
Data coveragepass
Consistencypass
App decodefail

Raw response matches golden byte-for-byte (sha256 d29f1ad47f…). The adapter attributed meta.err InstructionError[1] to inner instruction #1 instead of top-level instruction #1. The RPC is fine; the app path is not

version0
slot466555938
meta.err{InstructionError:[1,{Custom:6001}]}
account keys7 static + 14 writable + 19 readonly loaded
instructions5 top-level · 13 inner · max stack 3
compute units176441
The P0 matrix

Six read methods. Nothing else

The allowlist is the product. Parameters are validated before a call, finalized is the default, and results from different commitments are never compared as equal

01

Identity & capabilities

getGenesisHash · getVersion

The network you meant, and the version it reports. A version string is evidence — never proof of a feature

02

Checkpoint & freshness

getSlot · finalized

Target and reference read inside a ≤2 s bracket, three times. Otherwise freshness is incomparable, not a fake lag number

03

Historical transactions

getTransaction

Your signatures with an explicit version and encoding. Full response, error or null — each against the golden fields

04

Message decoding

Saved raw → adapter

Version, static and loaded accounts in order, instruction indexes, CPI depth and meta result — through your trusted adapter

05

Account reads

getAccountInfo

Owner, encoding, bytes and selected layout. Moving balances are never treated as an invariant

06

History pages

getSignaturesForAddress

Bounded before/until windows with a known ending checkpoint. Duplicates at page joins handled and shown

Built to be boring

It can't touch production

The plan is hashed before any live request. A new scope means a new plan. When the budget runs out, remaining checks are not run — never pass

Your profilehttps://mainnet.example-rpc.com/v2/8f1c…e92a?region=fra
In the reportprod-primary · https://mainnet.•••••••.com/•••••
≤ 2endpoints per runone target, one optional reference
≤ 300requests per runestimated up front, counted live
≤ 2concurrent calls10 s timeout, 10 MiB response cap
≤ 5history pages per fixturebounded before / until
0write methodssend, simulate, sign and airdrop refused
0redirects followedAuthorization never forwarded to another host
429honours Retry-Aftereach retry its own attempt in the journal
30 dlocal retentiondeletion confirmed by the owner
Not another leaderboard

Public benchmarks rank providers. SlotCheck checks yours

Public RPC benchmarkSlotCheck
EndpointShared public endpointsYour private endpoint and plan
InputsGeneric method mixSignatures and accounts your app reads
CorrectnessResponse shape and freshnessGolden records with provenance + your decoder
Where it failsEndpoint scoreWire, capability, coverage, consistency or app
CredentialsNot applicableStay local, redacted in every export
OutputA rankingA report you can diff before you upgrade
Plans

The CLI is free. The upkeep isn't

Teams pay for what goes stale: fixture packs reviewed against every SDK and Agave release, a CI gate, and run history the team can share

Local
Free
  • CLI: validate · plan · probe · decode · recheck · compare · report
  • Your own fixture packs
  • One trusted adapter
  • Offline recheck of saved artifacts
  • Static HTML + JSON reports
Install
Team
$149/ month
or $112 paid in $SLOTCHECK — 25% off
  • Maintained packs: Jupiter, Token-2022, ALT-heavy, archival, failed-tx meta
  • Two reviewers per golden record
  • CI gate on pull requests
  • Opt-in shared run history
  • Alerts when a pack fixture regresses
Browse the packs
Infra
Custom
  • Extra adapters for your SDK stack
  • Several providers per profile
  • Pack built from your production signatures
  • Runbook and handover
Talk to us
FAQ

Straight answers

Run it before the next upgrade

Pick five signatures your app can't live without. Ten minutes later you know whether the next SDK or provider version reads them the same way

npx slotcheck@0.9.3 initQuickstart