Docs
Everything here is re-runnable
No API key, no proxy, and no build step. Clone it, serve it over HTTP, and every number on this site can be recomputed from the same modules the pages import.
The tools
| Command | What it establishes |
|---|---|
| node tools/palette.mjs | Solves every colour on the site and prints the contrast of every ink on every surface. Three preferences; the rest is derived. |
| node js/invar.js | The alloy model and its self-checks. One fitted parameter, set at room temperature; every other number is a prediction. |
| node js/sessions.js | The exchange calendar, checked against published holiday dates and both daylight-saving transitions. |
| node tools/scan-assets.mjs | Walks every pool creation from genesis and discovers the tokenised equities by their own on-chain name. |
| node tools/scan-clock.mjs | Measures the block time, the state-pruning horizon, and where the clock actually goes. |
| node tools/scan-tape.mjs | Samples transfers across the chain’s active range and classifies each against the calendar. |
| node tools/verify-contract.mjs | Compiles Bar.sol, executes twenty properties on a real EVM, then breaks it eight ways. |
| node tools/verify-app.mjs | Executes the front end’s own calldata against a real tokenised equity. |
| node tools/build.mjs | Writes every page. The shell exists once. |
| node tools/validate.mjs | Refuses to let any of the above disagree with what is shipped. |
No key and no proxy
The public Robinhood Chain node answers a browser preflight with
access-control-allow-origin: *. That single fact is why the Comparator
and the app are pages rather than serverless functions, and why there is no server-side
code in this repository at all. The Content-Security-Policy shipped with the site has its
connect-src built from js/chain.js at build time, so an endpoint added
there cannot be blocked in production by a header nobody remembered to update.
What is shared between the scanners and the pages
js/chain.js, js/sessions.js, js/bar.js,
js/abi.js and js/invar.js are imported by both. That is deliberate: a page that
re-checks a snapshot with different code than the snapshot was built with is not checking it.
Selectors and topics
None are remembered. Every one is derived from its signature text by js/keccak.js at load. A
wrong selector reverts against a contract with no fallback — which reads exactly like “this contract cannot
do that” — and silently returns garbage against one that has one.