Half of Base traffic goes to a contract that can be changed after you approve it

Agents sign transactions against contracts whose powers are not visible in an ABI. That premise gets asserted constantly and measured almost never. This is a measurement.

Head block 50,489,206 Window 60 blocks Transactions 10,948 Contracts analysed 292 Coverage 94% Measured 2026-08-26
45.5%

of the most-transacted contracts on Base are upgradeable proxies. They carry 49.9% of transaction volume.

54.5%

hold at least one of: upgradeability, DELEGATECALL, pause, mint, or SELFDESTRUCT.

14.7%

have a proxy chain that cannot be fully resolved — the result we did not expect, and the one that misleads automated callers.

Method

A 60-block window of Base mainnet was read from the head — 10,948 transactions. Every transaction's recipient was counted, and the 300 most-transacted recipients were analysed with the same engine that serves the production endpoint.

Those 300 recipients account for 94% of all transactions in the window. That is what separates this from an anecdote: it is not a curated list of interesting contracts, it is what the chain was actually doing. 292 were contracts; 8 were plain accounts. Analysis is static, over deployed bytecode, with proxies and EIP-7702 delegated accounts resolved to the code that actually executes.

Findings

Base mainnet · 292 contracts
Capability present in deployed bytecode Contracts Of contracts Of transactions
Upgradeable proxy13345.5%49.9%
Contains DELEGATECALL10134.6%31.0%
Exposes a pause selector3411.6%10.4%
Exposes a mint selector144.8%8.6%
Contains SELFDESTRUCT124.1%3.1%
Any of the above15954.5%54.1%
Proxy chain not fully resolvable4314.7%16.5%

Read the last column as the operational one: it is the probability that the next transaction an agent signs touches such a contract.

The last row is the result we did not expect. For 14.7% of these contracts the proxy chain could not be fully resolved — an implementation slot that is empty, a beacon that does not answer, a hop that terminates without code. An automated caller that reads no capabilities found as clean will score these as safe, when the correct reading is that nothing was established at all.

What this API returns for those cases

The 14.7% only matters if the answer distinguishes them, so this was checked against a live contract from the sample rather than assumed. For an address whose proxy chain terminates without resolving, /v1/audit/{address} returns:

Live response · address withheld, as none are published here
FieldValue
capabilityRatingUNVERIFIED
reasonPROXY_RESOLUTION_INCOMPLETE
reachabilityNOT_ESTABLISHED
executableCapabilities["DELEGATECALL", "SELFDESTRUCT"]

Not an empty capability list, and not a passing grade. A caller reading capabilityRating cannot mistake this for a clean result — which is the whole point, because the failure mode being guarded against is an integration that treats nothing found as nothing there.

Reproducibility

Two independent 60-block samples, minutes apart
FindingWindow A Window BDifference
Upgradeable proxy43.3%45.5%2.2
Contains DELEGATECALL33.3%34.6%1.3
Exposes a pause selector10.7%11.6%0.9
Proxy chain not fully resolvable13.7%14.7%1.0

Every figure agrees within 2.2 points, so these are properties of Base traffic rather than of one lucky window. The measurement script is public:

node scripts/research/measure_agent_exposure.js --blocks=60 --max=300

The sample is published as machine-readable JSON: base-agent-exposure-sample.json.

What this is not

A human reviewing a transaction sees a name and an amount. The 45.5% is invisible to them, and to the agent signing on their behalf, unless something reads the bytecode first. The honest version of this is not we will tell you what is safe — we will not. It is: we will tell you what the contract can do, and we will tell you when we could not find out.

Check an address yourself

The same engine that produced this table, on any Base address.

Open the Inspector API Docs Pricing