Deterministic by construction
The runner uses a seeded generator and a virtual clock, so the same scenario and seed always produce the same transcript. A SHA-256 digest of the transcript is shown; share the scenario JSON and anyone gets the same digest.
Retries that respect method semantics
Read methods are retried with exponential backoff and optional seeded jitter, honouring Retry-After on simulated 429s. Stateful methods like eth_newFilter and eth_getFilterChanges are never blindly retried, and the transcript says why.
Fixture coverage
- Success results, null results and a fixture named "latest balance" that stays labelled as a snapshot.
- Reverts with Error(string) and Panic, method-not-found and invalid-params errors.
- HTTP 429 with Retry-After, a 502 HTML body and a truncated JSON body.
- A reorg pair (same height, different hash) and two providers at different heights.
- A reordered batch with a missing reply, a duplicate id and an unexpected id.
Questions
Can my backend call this mock?
No. It runs inside this browser tab only. To test a backend, export the fixtures or transcript and load them into your own test harness.
Are the fixture addresses real?
No. They use repeated-digit patterns like 0x1111… and invented hashes. Every fixture carries a synthetic label.
What does the seed change?
Which attempts fail, jitter amounts and synthetic values. The scenario structure stays the same.