SlotCheck docs
A local CLI and a static report. It reads from the endpoints you name, with the methods it allows, inside the budget you set — and nothing else
Install
Node 20+ on macOS, Linux or WSL. The trusted adapter ships inside the package; nothing is downloaded at run time
npm i -g slotcheck@0.9.3 slotcheck --version # 0.9.3 · adapters: app-decoder 2.4.0
Quickstart
- Init a profile.
slotcheck initwritesslotcheck.ymland asks for an alias — not a URL - Point the alias at a secret.
export SLOTCHECK_PRIMARY_URL=…or store it in the OS keychain - Add fixtures. Five to ten signatures your app depends on:
slotcheck fixture add tx <signature>. Each is captured once, hashed and sent for review - Plan, then probe.
slotcheck planprints the network, methods and request estimate and locks a plan hash.slotcheck probe --plan <hash>runs it - Open the report.
runs/<run>/report.html— or start with the sample report
Profile
# slotcheck.yml
network: mainnet-beta
genesis: 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d
endpoints:
target: { alias: prod-primary, url_env: SLOTCHECK_PRIMARY_URL, auth_env: SLOTCHECK_PRIMARY_KEY }
reference: { alias: public-ref, url: https://api.mainnet-beta.solana.com }
adapter: app-decoder@2.4.0
pack: packs/app-mainnet-core@3.json
commitment: finalized
freshness: { tolerance_slots: 8, bracket_max: 2s, repeats: 3 }
limits: { requests: 300, concurrency: 2, timeout: 10s, history_pages: 5, response: 10MiB, wall: 15m }
allow_localhost: falseDevnet and localnet are separate profiles with their own genesis hash. Localhost targets need allow_localhost: true
CLI reference
slotcheck validateSchema, size and allowlist checks for a profile or pack. Rejects write methods and executable fields before any network callslotcheck planResolves endpoints and fixtures into a locked plan: hash, methods, caps and a request estimateslotcheck probeRuns a locked plan live. Raw artifacts are written before the adapter sees themslotcheck decodeRuns saved raw artifacts through the trusted adapter onlyslotcheck recheckOffline: replays a whole run from its artifacts. Zero network requests, new attempt IDs, original times keptslotcheck compareDiffs two runs and prints a comparability matrix first. Different packs or configs are marked incomparableslotcheck reportWrites report.html and report.json. Redacted excerpts by default; --include-raw for full artifactsVerdicts
Each check gets five independent results — Transport, RPC capability, Data coverage, Consistency, App decode — and each result is one of six values. The summary counts them; it never folds them into one score
Reason codes
APP_ERR_INDEX_MISMAPApp: error index mapped to the wrong instruction. InstructionError[i] indexes top-level instructions. Check the adapter change between 2.3.1 and 2.4.0 that flattened inner instructions before resolving errorsRPC_NULL_HISTORYHistory absent at observation. Confirm the provider's archival tier for your plan, or run the fixture against a second archival endpoint. Don't treat null as an empty transactionCAP_PARAM_REJECTEDParameter not supported by this endpoint. Keep v1 out of production paths for this endpoint until a golden v1 fixture passes. The rejection is recorded verbatimINFO_VERSION_CHANGEDProvider version changed. Informational. A version change alone never explains a regression — read the raw and app stagesPAGE_BOUNDARY_DEDUPBoundary signature repeated across pages. Handled. Make sure your own pager deduplicates by signature when it walks `before`.NETWORK_MISMATCHGenesis differs from the profile. Every dependent probe stops at zero requestsRPC_ERROR_ON_200JSON-RPC error inside HTTP 200. Transport passes; the capability or data stage does notBUDGET_EXHAUSTEDRequest cap reached. Remaining checks are not run — never passFRESHNESS_INCOMPARABLEReference down, on another network, or bracket over 2 s. No lag number is printedSafety limits
- Methods: getGenesisHash, getVersion, getSlot, getTransaction, getAccountInfo, getSignaturesForAddress. Everything else is refused
- Secrets: stay in env or the keychain. Exports keep the alias and a redacted origin; query, path and header values are masked, and no digest of the full URL is published
- Redirects: denied by default so Authorization is never forwarded to another host. RPC responses can't change endpoints, headers or the allowlist
- Reports: escaped HTML; scripts and remote images from responses never run
- Retention: 30 days locally; deletion is confirmed by the owner. Nothing is sent to third parties
CI gate Team
# .github/workflows/slotcheck.yml - run: slotcheck probe --plan $SLOTCHECK_PLAN --ci - run: slotcheck compare --base last-green --fail-on app_decode:fail,data_consistency:fail
Uploading run history is opt-in per repository. Plans are billed monthly in card or $SLOTCHECK
Contact
Infra plans, custom adapters and pack requests: message us on X. Include your SDK and decoder versions — never an endpoint URL or key