For educational purposes only; not investment advice. Investing may result in loss.
Direct answer
Monitor an upgradeable system’s control path as well as its proxy address. An alert should identify who can authorize and execute an upgrade, any required delay, the old and new implementation, and initialization calldata. After execution, independently read the on-chain configuration and test critical behavior.
The proxy address and its balances can remain unchanged while delegated code changes permissions, fees, accounting, pause behavior, or withdrawal logic. A previous audit does not automatically cover a new implementation or its initialization.
How it works
First identify the proxy pattern. ERC-1967 defines separate storage slots for eip1967.proxy.implementation, eip1967.proxy.beacon, and an optional eip1967.proxy.admin. Direct implementation changes should emit Upgraded; beacon-address changes should emit BeaconUpgraded; admin-slot changes should emit AdminChanged. For a beacon proxy, also call the beacon’s implementation() because the beacon can change its implementation while the proxy’s beacon slot stays unchanged.
Do not infer the complete authority model from the admin slot. A Transparent proxy may be controlled through a ProxyAdmin, while UUPS upgrade authorization is implemented in the current logic contract through _authorizeUpgrade. Trace owners, roles, multisig thresholds, timelocks, governors, emergency paths, and the ability to change those controls.
Use both event subscriptions and periodic state reads. ERC-1967 recommends the events but does not make every implementation emit them. Record the chain, block, transaction, proxy, implementation or beacon, runtime code hash, executor, and relevant control state from independent RPC endpoints. Alert on scheduled, cancelled, and executed operations, and wait for the chain’s chosen confirmation or finality policy before treating state as settled.
Example
A lending proxy is controlled by a 3-of-5 multisig through a 24-hour timelock. When an upgrade is scheduled, the monitor records the proposal identifier, target, calldata, earliest execution time, current implementation, proposed implementation, and verified source-code status. Reviewers compare the code and storage layouts, inspect the initialization call, and check changes to roles, external calls, fees, pause rules, and withdrawal paths.
After execution, the monitor reads the relevant ERC-1967 slot again, verifies the deployed runtime code, and checks expected postconditions such as the implementation version, administrator or role holders, pause state, asset accounting, and a read-only withdrawal preview. A second alert fires if the observed address or code hash differs from the reviewed proposal, or if periodic polling finds a change that no event reported.
Risks
- Control risk: A nominal multisig may be bypassed by another owner, role, module, governor, emergency key, or mutable timelock. Follow every path to its ultimate signers and delay.
- Code and storage risk: Unverified code, incompatible storage layouts, unsafe initialization, or a changed dependency can corrupt state or grant unintended authority. Validate the exact deployed artifact, not only a repository branch or audit name.
- Monitoring risk: A single RPC, event-only indexer, front end, or block explorer can be delayed or wrong. Reconcile events with storage, bytecode, transaction receipts, and protocol state across independent data sources.
- Response risk: An alert without an owner and tested procedure may arrive too late. Define who reviews, pauses integrations, communicates, or exits during the delay, while recognizing that rushed approvals and unofficial recovery links create additional risk.
Minimum runbook:
- Inventory every proxy, beacon, implementation, administrator, role, and upgrade entry point on each chain.
- Save a known-good baseline of slots, code hashes, control state, and critical read-only results.
- Alert before execution when governance or timelock scheduling permits it, and alert again on execution or cancellation.
- Compare the executed target, calldata, implementation, bytecode, storage layout, and post-upgrade state with the reviewed proposal.
- Escalate unexpected changes, failed postconditions, missing source verification, or a shortened or bypassed delay; do not rely on the unchanged proxy address as proof of safety.
Common misconceptions
- Myth 1: “Watching
Upgradedis enough.” Beacon implementation changes and non-standard proxies may require monitoring another contract or polling state; events should be reconciled with direct reads. - Myth 2: “The admin slot reveals who controls every upgrade.” The slot is optional, and Transparent, UUPS, beacon, governance, and custom designs place authority in different contracts and functions.
- Myth 3: “Verified source or a past audit proves the upgrade is safe.” Verify the deployed bytecode, compiler and constructor assumptions, storage compatibility, initialization, configuration, and behavior for the exact release.
Related topics
- Multisig module risk
- Proxy contract
- Proxy storage collision
- Protocol emergency pause
- Upgradeable contract
Sources
- ERC-1967: Proxy Storage Slots - Ethereum Improvement Proposals (accessed: 2026-08-21)
- Proxy - OpenZeppelin (accessed: 2026-08-21)
- Writing Upgradeable Contracts - OpenZeppelin (accessed: 2026-08-21)
- Access Control - OpenZeppelin (accessed: 2026-08-21)