Notes / Audits and snapshots

Ethereum L1 -- deploy_testnet fork rehearsal (2026-09-17)

Audits and snapshots2026-09-17Chain: EthereumLinked: Uniswap V3 Factory (Arbitrum One), Uniswap V3 Factory, Aave V3 Ethereum Pool, MakerDAO / Sky governance (MCD_PAUSE), Ethena EthenaMinting (retired minter)

Source: chains/ethereum-l1/data/deploy_rehearsal_2026-09-17.md in the repository, rendered here without changes. Source file

Why a rehearsal instead of a real Sepolia deploy#

The shared throwaway deployer 0xA08a76457b758aFF9702dBf5b870679E1232B715 (a throwaway testnet key kept outside the repository) still has 0 ETH on real Sepolia, confirmed live on 2 independent RPCs at the start of this run:

RPCResult
https://ethereum-sepolia-rpc.publicnode.comcast balance -> 0 wei
https://sepolia.gateway.tenderly.cocast balance -> 0 wei

(A third RPC, https://sepolia.drpc.org, was tried per the run brief and returned an unrelated error -- "chain is not available on free plan" -- not a balance reading, so it was not counted as a confirmation either way.)

This matches the run's known starting fact: the address is still to be funded via a faucet by the maintainer, so no transaction was attempted on real Sepolia this run. Per the phase brief, the alternative is a full, reproducible dress rehearsal against a local anvil fork of Sepolia -- proving the entire pipeline works end to end so the real deploy is a known-good, mechanical step once the address is funded.

What the rehearsal proves#

Script: rehearsal_fork.sh (re-runnable, bash chains/ethereum-l1/deploy/rehearsal_fork.sh). One run, 2026-09-17:

StepResult
Fork source chain id (cast chain-id against ethereum-sepolia-rpc.publicnode.com)11155111
Local anvil fork chain id (port 8546)11155111
forge script script/Deploy.s.sol --broadcast against the forkONCHAIN EXECUTION COMPLETE & SUCCESSFUL
Deployed AuthorityRiskOracle address (fork only, ephemeral)0x60B97BB35c2bFB8D3A3c509EcC2352ca72421a1a
Deployed ExampleConsumer address (fork only, ephemeral)0x29809c3e19d45DBEACFe670a1524DD95240FDC31
Deployer / admin / updater (anvil's well-known default dev account #0, NOT the real throwaway key)0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
hasRole(UPDATER_ROLE, deployer) on the fresh oracletrue
update_scores_ethereum_l1.py --oracle-address <fork oracle> --oracle-rpc-url http://127.0.0.1:8546 (READ_RPC_URL = https://ethereum-rpc.publicnode.com, real mainnet)Confirmed in block 11722919: success (exact fork block number varies slightly run to run; every run of rehearsal_fork.sh has confirmed success, see claims_attempt1.txt)
Read RPC chain id check inside the script1 (Ethereum L1 mainnet, as required)
Oracle RPC chain id check inside the script11155111 (Sepolia, as required)

getScore() read back vs. the calculated scores#

Read live from the fork oracle after the push, compared to data/scored_targets_2026-09-16-ethereum-l1.md (the committed source of truth for these 4 targets):

TargetCommitted compositeOn-chain composite (getScore after push)Match
Uniswap V3 Factory 0x1F98431c8aD98523631AE4a59f267346ea31F9848585yes
Aave V3 Ethereum Pool 0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e7878yes
MakerDAO / Sky (MCD_PAUSE) 0xbE286431454714F511008713973d3B053A2d38f38181yes
Ethena EthenaMinting 0x2CC440b721d2CaFd6D64908D6d8C4aCC57F8Afc35252yes

The sub-scores (adminKey/multisig/timelock) read back from getScore() also match the per-target breakdown in data/scored_targets_2026-09-16-ethereum-l1.md exactly (e.g. Uniswap 80/100/75, Aave 78/100/55, Maker 75/100/70, Ethena 55/100/0) -- the scores were re-derived live from real Ethereum L1 mainnet during this run (not replayed from a file), and matched the committed values because mainnet authority state for these 4 targets has not changed since 2026-09-16.

crossExposureScore reads back as 100 (the placeholder default) for all 4 targets, consistent with the known open thread documented in chains/ethereum-l1/deploy/README.md and update_scores_ethereum_l1.py -- the cross-ecosystem signer-overlap pass has not been built yet, so this is not a new finding.

What this does and does not close#

deploy_testnet -> deploy_testnet (maintained, not advanced), justified by the deployer balance still being 0 ETH on real Sepolia. The pipeline itself is rehearsed and ready; only funding is blocking the real push.

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