{"id":"ERC-1967","name":"Proxy Storage Slots","status":"Final","chain":"both","category":{"id":"infrastructure","name":"Infrastructure","description":"Foundational patterns enabling other standards"},"journeyStages":[{"id":"infra","name":"Infrastructure","description":"Foundational patterns"}],"uxImpact":"Proxy metadata can help explorers resolve the implementation and expose upgrade risk. The admin slot is optional: Transparent, UUPS and beacon proxies have different authorization paths. Show the verified controlling roles or an unknown state, and never infer renounced upgrade rights from an empty admin slot.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-1967","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","hasDetailedContent":true,"content":{"id":"ERC-1967","summary":"ERC-1967 standardizes where proxy contracts store their implementation address. This lets block explorers like Etherscan show \"Read as Proxy\" so users see actual functions instead of confusing wrapper code. Essential for making upgradeable contracts usable.","applicability":{"whenToUse":["Your product explains proxy implementations or upgrade authority.","An explorer needs to resolve a supported proxy pattern."],"whenToAvoid":["You cannot identify the proxy pattern or authorization path; show unknown instead of a safety claim.","You need ERC-1967 alone to prove an upgrade is safe or irrevocably disabled."]},"designerTakeaways":["You can design UI that delivers explorer detects proxy, shows implementation interface.","You can standard slot, anyone can verify implementation address.","You can standard slots: all tools work universally."],"problemsSolved":[{"problem":"Block explorers show proxy bytecode, not real functions","oldWay":"User sees confusing proxy code, can't interact","newWay":"Explorer detects proxy, shows implementation interface","impact":"critical"},{"problem":"Can't verify what code proxy is running","oldWay":"Trust that proxy points to claimed implementation","newWay":"Standard slot, anyone can verify implementation address","impact":"critical"},{"problem":"Different proxies store implementation differently","oldWay":"Each proxy pattern needs custom detection","newWay":"Standard slots: all tools work universally","impact":"high"},{"problem":"Admin address hidden or unpredictable","oldWay":"Who can upgrade this? Check code manually","newWay":"The optional admin slot is one clue; determine the actual authorization path for this proxy pattern","impact":"high"}],"uxPatterns":[{"name":"Block Explorer Proxy View","description":"Etherscan \"Read as Proxy\" interface","mockup":"generic/token-approval","userFlow":["User visits proxy contract on explorer","Sees \"This is a Proxy Contract\" banner","Views implementation address","Sees the verified upgrade authority for this proxy pattern, or an unknown state","Clicks \"Read as Proxy\" for real functions","Interacts with actual interface"]},{"name":"Contract Upgrade Notice","description":"Inform users about proxy upgrade","mockup":"concept/permit-approval","userFlow":["Protocol upgrades implementation","Users notified of change","See what changed (new features/fixes)","Review the new implementation, authority and potential effect on assets","Can verify upgrade transaction"]},{"name":"Proxy Trust Verification","description":"Help users verify proxy safety","mockup":"concept/verify-safety","userFlow":["User pastes contract address","System detects ERC-1967 proxy","Fetches implementation from standard slot","Checks verification and audit status","Identifies Transparent, UUPS or beacon authorization and verifies the controlling roles","Shows overall risk assessment"]},{"name":"Upgrade Governance","description":"Admin interface for proposing upgrades","mockup":"concept/proxy-pattern","userFlow":["Admin enters new implementation address","System runs verification checks","Warns about missing requirements","Admin proposes upgrade","Other signers approve","Timelock countdown begins","Upgrade executes after delay"]}],"uiComponents":[{"name":"ProxyBanner","description":"Banner indicating contract is a proxy","states":["proxy-detected","not-proxy","unknown"],"props":["implementationAddress","adminAddress","proxyType"]},{"name":"ImplementationViewer","description":"Shows what implementation proxy points to","states":["loading","verified","unverified","error"],"props":["proxyAddress","implementationAddress","isVerified"]},{"name":"AdminAnalyzer","description":"Analyzes who controls proxy upgrades","states":["eoa","multisig","timelock","verified-no-upgrade-path","unknown"],"props":["adminAddress","adminType","signers[]","timelockDuration"]},{"name":"UpgradeNotification","description":"Alert showing contract was upgraded","states":["pending","executed","cancelled"],"props":["oldImplementation","newImplementation","changelog"]},{"name":"ProxyReadWrite","description":"Interface for interacting via proxy","states":["loading","ready","submitting"],"props":["proxyAddress","abiFromImplementation","onCall"]}],"antiPatterns":[{"pattern":"Showing proxy bytecode as \"contract source\"","why":"Users can't understand or verify what code runs","instead":"Detect proxy, show implementation source","severity":"critical"},{"pattern":"Hiding admin address","why":"Users don't know who can change the contract","instead":"Show the actual upgrade authority and permissions, including implementation or beacon roles","severity":"critical"},{"pattern":"No upgrade notifications","why":"Users surprised by changed behavior","instead":"Notify users when implementation changes","severity":"high"},{"pattern":"Single EOA as admin","why":"One compromised key = protocol compromised","instead":"Show warning when admin is single address","severity":"high"},{"pattern":"Not linking to implementation on explorer","why":"User can't verify the actual code","instead":"Always provide clickable link to implementation","severity":"medium"}],"keyTakeaways":["ERC-1967 = standardized storage for proxy info","Enables \"Read as Proxy\" on block explorers","Show the resolved implementation and actual upgrade authority; disclose unknowns","Warn users about admin trust assumptions","Notify on upgrades so users aren't surprised"],"technicalNotes":"ERC-1967 defines implementation, beacon and optional admin storage slots. Resolve a beacon proxy through its beacon to find the implementation. An admin slot can describe Transparent proxy administration, but UUPS upgrade authorization is implemented in the implementation contract, and beacon authority is separate. An empty admin slot does not prove that upgrades are disabled or ownership is renounced. Inspect the actual proxy pattern and authorization code before displaying control or safety claims.","lastUpdated":"2026-09-18","lastReviewed":"2026-09-18","sources":[{"label":"ERC-1967 official specification","url":"https://ercs.ethereum.org/ERCS/erc-1967","type":"official-spec"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-1967","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-1967","type":"discussion"},{"label":"ERC-1967 official specification","url":"https://ercs.ethereum.org/ERCS/erc-1967","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-1967","markdown":"https://www.eipsfordesigners.com/standards/ERC-1967/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-1967/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-1967","official":"https://ercs.ethereum.org/ERCS/erc-1967","discussion":"https://ethereum-magicians.org/search?q=ERC-1967"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}