EVM-1 · storage & bytecode probe
A precision instrument for Solidity: compile, deploy, and step through a
contract entirely in your browser, and see the exact truth of it — source
related to bytecode in both directions, every storage slot byte-accurate,
and every runtime access named honestly or not named at all.
The full measure loop — compile, deploy, call, step the trace, read every named storage access — works on one screen: source, assembly, and the storage probe stay visible while the cockpit bar and execute strip drive execution beneath them.
- Compile locally, exactly. One bundled solc
(
0.8.36+commit.8a079791.Emscripten.clang, cancun) runs in a web worker. Optimizer (with runs) and via-IR are live toggles; the header echoes the environment the latched result actually compiled with, never the request. No backend, no network requests, works offline after load. A version mismatch is a fatal error, never a fallback. - Source ↔ assembly, honestly. Hover, keyboard-focus, or pin either side to see the exact compiler source range on the other — the complete set of instructions sharing a range, never a fake one-to-one mapping. Rows without a user source range say so.
- Storage as a memory map. One row per slot, 32 byte cells under a 31 → 0 ruler (byte 0 is the LSB, rightmost), a per-slot record listing every field's name, byte range, and type, cross-inheritance packing with declaring-contract attribution from AST ids, packed structs, static arrays, hatched padding, and an honest explanation for anything the compiler output can't confidently expand (a mapping's entries live at keccak-derived runtime slots — deploy and call to see them named).
- Initialized values, visible on deploy. The constructor is an execution like any other: deploying captures its trace exactly like a call, so every initializer's actual byte value shows up in Runtime storage the moment "Deploy locally" succeeds — labeled from the constructor, never parsed from source.
- Run it locally, one screen. Deploy into an in-browser EVM (EthereumJS, Cancun) and call it through ABI forms. The live storage strip stays pinned above the trace detail tabs at every cursor position — one band per touched slot, bytes written up to the cursor filled amber and byte-diffed to the proven changed range. A full-width cockpit bar (steppers, scrubber, cursor facts, outcome) keeps stepping in view without losing the source or storage picture.
- Storage accesses get honest names.
allowance[0xaa…][0xbb…],mp[9].b,arr[2]— resolved only when every hop is grounded in recorded keccak bytes and layout facts, with an auditable derivation chain (KeccakFlow), byte-level write diffs, string-form migration badges, and cold/warm Cancun cost facts. Resolution status is a border treatment and a mark (=/≈/?), never a color alone. Anything ungrounded saysunresolved, never a guess. - Revert forensics and events. A failed call decodes
Error(string),Panic(code)with its meaning, or a declared custom error by name — never a guess for an unknown selector — with the reverting step and a jump-to-it. Emitted logs decode against the ABI when the shape matches exactly, honest raw topics/data otherwise. - A curriculum, not just an inspector. Six Layout/Derivation challenges
whose expected answers are derived at runtime from the same compiler and
executor output the panes show — never an authored constant that could
drift — including one deliberately
Unresolvedcase to resolve by hand. - Share as a URL or a file. The whole state — source, compiler settings,
the deterministic call sequence, trace cursor, one pin — travels in the
#s=fragment (schema v2, bounded and tamper-rejecting) with live size feedback against the 2,000-character budget; larger sessions round-trip through.slotscope.json. The recipient's link recompiles, redeploys, and replays the recorded calls locally; nothing is hosted. - Keyboard-first, motion-optional. Every interaction works without a mouse (a Ctrl/⌘K command palette reaches the rest); every animation collapses to 0 ms under reduced motion with identical final state; axe-clean in both modes.
corepack prepare pnpm@11.17.0 --activate # Node 24.18.0 (engine-strict)
pnpm install --frozen-lockfile
pnpm --filter @slotscope/web dev # http://localhost:5173Full command reference and the rules that block merges: CONTRIBUTING.md.
Compiler output is the only truth: no Solidity reparsing for facts, no
heuristics, no inference. Ground truth for the public fixture is reviewed
byte-by-byte and independently cross-checked with Foundry's forge inspect;
goldens change only through an explicit, diff-printing command. Every release
gate — correctness fixtures, worker lifecycle, keyboard/reduced-motion/axe,
zero-network, and a hard 2,000 ms p95 compile budget — runs blocking in CI
with zero retries. Evidence lives in docs/releases.
Static React/Vite workspace, ten exact-pinned packages:
| Package | Role |
|---|---|
packages/domain |
Locked environment, immutable models, UTF-8↔UTF-16 index, hex primitives |
packages/compiler |
Worker (exact solc), settings-aware Standard JSON, instruction/source-map decoding, normalize() |
packages/layout |
solc storageLayout → exact bigint slot/cell model |
packages/executor |
In-browser EVM worker (EthereumJS), keyframe/delta trace, revert/event decode |
packages/semantics |
Layer-3 resolver: keccak-chain grounding, exact/inferred/unresolved |
packages/session |
Share-URL schema v2 + bounded codec, .slotscope.json |
packages/challenges |
Challenge schema + runtime-derived answer validator, progress store |
packages/lifecycle |
Generic worker-lifecycle client shared by the compiler and executor |
packages/ui |
Instrument design tokens, focus + motion contract |
packages/fixtures |
Public fixture corpus, goldens, Forge cross-check |
apps/web |
Composition: editor, assembly, probe pane, cockpit bar, execute strip, sharing |
Details: docs/architecture.md · ADRs: docs/adr · honest cut-line: docs/limitations-v1.0.md · design system: docs/design/instrument-identity-v0.15.md
v0.1 Compile Spine ✔ → v0.15 Instrument Identity ✔ → v0.2 Stepper ✔ → v0.5 Semantics ✔ → v1.0 Launch ✔ → v1.1 Cockpit workbench ✔ (v1.0 KPI test pending — see docs/releases/v1.0.md). History: CHANGELOG.md.
