# Smart Contract Upgrade Explorer > Is this smart contract upgradeable, who controls upgrades, and what changed? Reads a contract straight from the chain and identifies its proxy pattern (EIP-1967 transparent, UUPS, beacon, EIP-1167 clone, Safe proxy, legacy ZeppelinOS, EIP-7702 delegated account), the current implementation, who controls upgrades (single key, Safe multisig with threshold, timelock with delay, ProxyAdmin and its owner), the Upgraded/AdminChanged event history, and whether the code is verified on Sourcify. Paste raw bytecode for an offline scan. Part of usefulweb.site (https://usefulweb.site/). Results are deterministic calculations from the inputs and the listed assumptions; the API returns exactly what the web page shows. ## Use it - Human interface: https://contractupgradeexplorer.usefulweb.site/ (interactive tool at https://contractupgradeexplorer.usefulweb.site/tool) - JSON API: POST https://contractupgradeexplorer.usefulweb.site/api/v1/calculate with a JSON object of inputs (schema: https://contractupgradeexplorer.usefulweb.site/api/v1/tool) - OpenAPI: https://contractupgradeexplorer.usefulweb.site/openapi.json - MCP (Streamable HTTP): https://contractupgradeexplorer.usefulweb.site/mcp - tool `contract_upgrade_explorer` ## Inputs - mode (select): What do you have? - chain (select): Chain - address (text): Contract address - bytecode (textarea): Runtime bytecode ## Method - Storage slots read with eth_getStorageAt: EIP-1967 implementation/admin/beacon (keccak256("eip1967.proxy.*") − 1), EIP-1822 PROXIABLE, the legacy ZeppelinOS implementation/admin slots (keccak256("org.zeppelinos.proxy.*")), and slot 0 for Safe proxies. - Bytecode scan (PUSH data skipped): EIP-1167 clone pattern, EIP-7702 delegation designator (0xef0100…), DELEGATECALL/SELFDESTRUCT opcodes, dispatcher selectors (PUSH4 followed by EQ) and EIP-1967 slot constants. - Classification: beacon slot set → beacon proxy; admin slot set → transparent; implementation slot set and implementation exposes proxiableUUID() → UUPS; Safe proxy if slot 0 holds a contract and masterCopy() is dispatched. - Controller: EOA (single key), Safe (getThreshold/getOwners), TimelockController (getMinDelay), or ProxyAdmin (owner() is analysed one level deep). - History: Upgraded / AdminChanged / BeaconUpgraded logs of the proxy via eth_getLogs; public nodes may limit the range, which is reported.