Notes / Findings

The code behind a target changes; the oracle only scores who controls it (2026-09-21)

Findings2026-09-21Chain: Ethereum, Base, Arbitrum, Robinhood Chain

Source: data/finding_2026-09-21-implementation-changes.md in the repository, rendered here without changes. Source file

The oracle scores authority: who can change a target, how many keys, with what delay. It says nothing about the code they control having changed. A score can be right about the authority and stale about the code. This pass measured how often that happens and added a watch for it.

What was measured#

Of the tracked EVM targets on the six ecosystems with a mainnet RPC (119 addresses), 26 are EIP-1967 proxies, 7 beacon proxies, 1 an ERC-1167 clone, 79 plain contracts and 6 have no code. For the proxies:

So a recent upgrade is common, the scored target may not have been re-read since, and nothing in the oracle would show it.

What was added#

scripts/check_implementation_changes.py (library scripts/lib/implementation_watch.py) fingerprints every target the deployed oracles track: an EIP-1967 proxy by its implementation address and that implementation's code hash, a beacon proxy by the beacon's implementation, an ERC-1167 clone by its implementation, anything else by its own code hash. It diffs against data/implementation_snapshot.json (baseline taken 2026-09-21: 148 targets over the 8 oracles, including Tempo and HyperEVM). It needs no archive access, since it compares one run with the last reviewed one. repush_all_oracles.sh now runs it first, read-only and never blocking.

Workflow: python3 scripts/check_implementation_changes.py (exit 1 if a target changed or could not be read); read what the new implementation does; --update to accept it. A target that could not be read is never written over a good fingerprint.

What this does not say#

What a changed implementation is (2026-09-21, from bytecode and verified source)#

scripts/lib/code_review.py reads a contract without an explorer: the selectors its dispatcher compares (its API), the compiler version and metadata hash from the CBOR tail, and a diff between the old and the new implementation. Applied to the three changes:

What still cannot be answered#

Robinhood Chain's explorers are the sanctioned public route to verification data there and cannot be reached without getting past a bot check, which this project does not do; hoodscan.co advertises a keyless read-only MCP endpoint for programmatic access, whose indexer returned an error on 2026-09-21 (chain_status shows the indexer null). Retry it later. For Monad, an Etherscan V2 key from the operator answers the question (ETHERSCAN_API_KEY; this project never creates an account or enters a key). Until then those 13 stay "unknown".

Not an audit, not investment advice. All notes ยท Back to the dashboard.