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

  1. Init a profile. slotcheck init writes slotcheck.yml and asks for an alias — not a URL
  2. Point the alias at a secret. export SLOTCHECK_PRIMARY_URL=… or store it in the OS keychain
  3. Add fixtures. Five to ten signatures your app depends on: slotcheck fixture add tx <signature>. Each is captured once, hashed and sent for review
  4. Plan, then probe. slotcheck plan prints the network, methods and request estimate and locks a plan hash. slotcheck probe --plan <hash> runs it
  5. 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: false

Devnet 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 call
slotcheck planResolves endpoints and fixtures into a locked plan: hash, methods, caps and a request estimate
slotcheck probeRuns a locked plan live. Raw artifacts are written before the adapter sees them
slotcheck decodeRuns saved raw artifacts through the trusted adapter only
slotcheck recheckOffline: replays a whole run from its artifacts. Zero network requests, new attempt IDs, original times kept
slotcheck compareDiffs two runs and prints a comparability matrix first. Different packs or configs are marked incomparable
slotcheck reportWrites report.html and report.json. Redacted excerpts by default; --include-raw for full artifacts

Verdicts

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

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

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 errors
RPC_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 transaction
CAP_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 verbatim
INFO_VERSION_CHANGEDProvider version changed. Informational. A version change alone never explains a regression — read the raw and app stages
PAGE_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 requests
RPC_ERROR_ON_200JSON-RPC error inside HTTP 200. Transport passes; the capability or data stage does not
BUDGET_EXHAUSTEDRequest cap reached. Remaining checks are not run — never pass
FRESHNESS_INCOMPARABLEReference down, on another network, or bracket over 2 s. No lag number is printed

Safety 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