70% of upgradeable Ethereum contracts are one key away from total takeover

A read-only measurement of 1,916 EIP-1967 proxies across seven chains. Method, numbers and limits below. Every figure is reproducible from public RPC.

An upgradeable contract has a single power that matters more than any other: whoever controls the upgrade can replace the code. Not pause it. Not drain it. Replace the logic entirely, and inherit every user's approval with it.

So the interesting question is not "is this contract audited". It is: how many independent signatures stand between an attacker and that upgrade?

I measured it. Here is what the data says.

The headline

Across 1,916 upgradeable proxies on Ethereum, Optimism, Gnosis, Scroll, Celo, Mode and Arbitrum:

"Single key" here means effective control, resolved up to three levels down:

proxy → implementation slot → admin → admin's owner → that owner's admin

Most naive counts stop at "the admin is a contract", which is true and useless. A contract admin whose owner() is one EOA is single-key in practice, and that is the case that matters.

Per chain

ChainSingle-key share
Gnosis91.2%
Scroll79.6%
Mode67.4%
Optimism67.0%
Ethereum64.2%
Celo54.0%
Arbitrum40.0% (n=2)

The spread is the interesting part. It is not a property of "Ethereum" — it is a property of which deployment tooling and which teams a chain attracted.

How it was measured

Read-only, no accounts, no keys, public JSON-RPC only:

  1. Enumerate contracts by exact name match against a fixed list.
  2. Read the EIP-1967 admin slot (0xb53127684…) and implementation slot (0x360894…) via eth_getStorageAt.
  3. Resolve the admin chain up to three levels: owner(), getOwners()/getThreshold() for Safes, proxy-admin detection for the rest.
  4. Classify each cell: single EOA · 1-of-1 Safe · multisig · timelock · contract · renounced · unreadable.
  5. Read at two independent block heights. A cell whose two readings disagree contributes no verdict — it is not labelled and counted.
  6. Failover across RPC endpoints, because a public endpoint erroring is not evidence that a contract reverts.

Limits — read these before quoting the number

Why it matters practically

If you run an upgradeable contract, the number that describes your real risk is not your audit count. It is: how many people must be compromised before my code is replaced?

If that answer is "one", then your security posture is a single laptop, a single browser extension, or a single seed phrase — regardless of how many audits you paid for.

The check takes an afternoon

You can run it against your own deployment without trusting me or anyone else: read the admin slot, resolve the owner chain, count the signatures. If it terminates at one EOA, you now know something your audit report does not tell you.

I do this measurement, and I write the documentation that makes it usable. The full census — per-contract rows, per-chain breakdowns, and the method as a runnable script — is free: see the census or get in touch.

If you want a targeted report for your own protocol — every upgradeable contract you control, its resolved authority chain, and the specific contracts where one key stands between an attacker and your code — that is a fixed-scope piece of work, and I will quote it before starting. Pricing.


Method note: figures generated 2026-10-24 from a snapshot first observed 2026-10-13. Read-only throughout; no wallet, no signature, no transaction was ever required.