Notes / Audits and snapshots

Ethereum L1 -- maintenance run, 2026-09-19

Audits and snapshots2026-09-19Chain: EthereumLinked: Uniswap V3 Factory (Arbitrum One), Uniswap V3 Factory, Compound V3 cUSDCv3 (Comet USDC), SparkLend PoolAddressesProvider, Uniswap V4 PoolManager, Morpho Blue (singleton), Morpho Blue (singleton, Ethereum L1), WBTC (Wrapped BTC)

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

First run of the maintenance phase for this ecosystem (pipeline authority-risk-oracle-multichain-pipeline, scheduled worker). Three parts: (a) audit rotation, (b) new targets, (c) README figures check.

(a) Audit rotation -- index 0: Uniswap V3 Factory#

trackedTargets(0) on the Sepolia oracle 0xB6F8474ccC71AF477c31c2DF663B3942ddfbf906 = 0x1F98431c8aD98523631AE4a59f267346ea31F984, published score before this run (read on publicnode + Tenderly Sepolia, identical): admin 80 / multisig 100 / timelock 75 / oracle 100 / crossExposure 100 / composite 85.

Re-derived from scratch on Ethereum mainnet (raw eth_call, not through scorers.py), block 26012723, on 2 independent RPCs (ethereum-rpc.publicnode.com and eth.drpc.org), identical results:

ReadValue
Factory.owner()0xf2371551Fe3937Db7c750f4DfABe5c2fFFdcBf5A (V3OpenFeeAdapter, Sourcify exact match, 7266 bytes of code)
adapter.owner() / adapter.feeSetter()0x1a9C…35BC (Uniswap Timelock), both
Timelock.delay() / MINIMUM_DELAY() / GRACE_PERIOD()172800 / 172800 / 1209600
Timelock.admin() / pendingAdmin()GovernorBravo 0x408ED635...24C3 / 0x0
GovernorBravo.quorumVotes() / proposalThreshold() / proposalCount()40M UNI / 1M UNI / 100
GovernorBravo.admin() / pendingAdmin()the Timelock / 0x0

Scoring those reads with the published rubric gives 80 / 100 / 75 -> composite 85 -- no divergence, no correction needed.

Partly closes the open thread in score_uniswap_v3_factory()'s docstring ("no check yet for an emergency-bypass mechanism"): no pending admin on either the Timelock or the Governor, the delay already sits at its hard-coded 2-day floor, the Governor has no whitelistGuardian, and every privileged function on the fee adapter (setFactoryOwner, setFeeSetter, fee setters, transferOwnership) is gated by the Timelock. The score was not raised because of this: the timelock cap stays at 75 until the rubric itself is reviewed (listed as an open lead, not changed by an audit pass).

Knock-on change (not a correction of an error): after this run the on-chain crossExposureScore of Uniswap V3 goes 100 -> 80, because Uniswap V4 PoolManager (added below) is owned directly by the same Timelock. Same for MakerDAO/Sky MCD_PAUSE (100 -> 80), which now shares its root with SparkLend. Composites do not change (crossExposure is not part of the composite formula).

(b) New targets (5)#

Each address has a primary source; each authority hop was read live on 2 RPCs (publicnode + gateway.tenderly.co/public/mainnet), and score_all() returned identical sub-scores on both.

TargetAddressSource of the addressTVL (DefiLlama, 2026-09-19)Authority root (live)admin/msig/tl/cross -> composite
Compound V3 cUSDCv30xc3d688B66703497DAA19211EEdff47f25384cdc3compound-finance/comet deployments/mainnet/usdc/roots.json$1.36B (Compound V3, Ethereum)Compound Timelock (2d, 2d floor) <- CompoundGovernor (608 proposals); ProxyAdmin + Configurator on the same Timelock; pauseGuardian = Safe 5-of-9 (instant pause incl. withdraw)78/100/60/100 -> 79
SparkLend PoolAddressesProvider0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eEsparkdotfi/spark-address-registry src/SparkLend.sol$5.61BSparkProxy; wards = MCD_PAUSE_PROXY (owner MCD_PAUSE, 2d), ESM (min = 2^256-1, cannot fire), StarGuard (ward = MCD_PAUSE_PROXY only); FreezerMom instant freeze via Chief hat + Safe 3-of-575/100/60/80 -> 78
Uniswap V4 PoolManager0x000000000004444c5dc75cB358380D2e3dE08A90DefiLlama-Adapters projects/uniswap-v4/index.js$743Mowner = Uniswap Timelock directly; V4FeeAdapter and V4FeePolicy owner + feeSetter = same Timelock80/100/75/80 -> 85
Morpho Blue (Ethereum)0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCbDefiLlama-Adapters projects/morpho-blue/config.js$5.03Bowner = Safe 5-of-9 (v1.3.0, no module, no guard), no delay; same 9 signers as the Base and Robinhood Morpho Safes65/95/0/100 -> 55
WBTC0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599DefiLlama-Adapters projects/helper/coreAssets.json$9.50B (= 116,132 WBTC live supply x $81,764)owner = Controller 0xCA06411b... (token() points back); Controller.owner = legacy Gnosis MultiSigWallet 6-of-10 0x972Eed35... (not a Safe), no delay, 4 txs ever55/100/0/100 -> 52

UPDATED 2026-09-20: the Morpho Blue row's cross exposure of 100 (the last value of its 65/95/0/100 tuple) is the value pushed on 2026-09-19. The row says the owner Safe has the same 9 signers as the Base and Robinhood Morpho Safes, and under the project convention decided 2026-09-20 (root METHODOLOGY.md, paragraph "Convention (decided 2026-09-20)") that cross-ecosystem overlap is folded into the score: chains/ethereum-l1/scorers.py now returns 65/95/0/100/80 for it (composite 55 unchanged), and the same 9 signers also own Tempo's Morpho Blue core. Superseded by the 2026-09-20 re-push (tx 0x14b0466ab52a7bf6cab54253cda92c73d52ca1b88957632911d79136b99b7a98, Sepolia block 11740952): the oracle now holds 65/95/0/100/80/55 for this target, read back equal to the scorer output. The 100 in the row above stays as the record of the 2026-09-19 push. See "Current on-chain scores (re-push, 2026-09-20)" and the "2026-09-20 update" in deploy/README.md.

How each role/ward set was replayed (not just a single getter): Spark ACLManager RoleGranted/RoleRevoked from block 16.7M, and SparkProxy / FreezerMom / StarGuard Rely/Deny, all via the Tenderly public gateway (publicnode returns 403 on eth_getLogs, drpc returns 400 on wide ranges). Current holders on the Spark ACLManager: DEFAULT_ADMIN, POOL_ADMIN and EMERGENCY_ADMIN = SparkProxy; EMERGENCY_ADMIN + RISK_ADMIN = FreezerMom; RISK_ADMIN = KillSwitchOracle and CapAutomator (both Sourcify exact match, owner = SparkProxy).

Rubric choices made this run (stated so they can be challenged):

On-chain push (Sepolia)#

Open leads (not resolved this run)#

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