{"id":"EIP-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 contracts have standardized slots revealing implementation address and admin — enables reliable upgrade detection. Design implications: show 'Upgradeable' badges on proxy contracts, display both proxy and implementation addresses in contract details, alert users when implementation changes, show admin address for governance transparency. Design decisions: how prominently to warn about upgradeability risks vs. normalizing the pattern; whether to show upgrade history timeline.","hasDetailedContent":true,"content":{"id":"EIP-1967","summary":"EIP-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 addresses: block explorers show proxy bytecode, not real functions.","Your product must handle: can't verify what code proxy is running.","The flow should deliver: explorer detects proxy, shows implementation interface.","You are designing a block explorer proxy view experience with visible states and recovery paths."],"whenToAvoid":["Detect proxy, show implementation source.","Prominently show admin and their permissions.","Notify users when implementation changes.","Protocol plumbing is invisible and never surfaces in user-facing UI."]},"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":"Standard admin slot reveals upgrade authority","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 admin who can upgrade","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)","Understand their assets are safe","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 EIP-1967 proxy","Fetches implementation from standard slot","Checks verification and audit status","Analyzes admin permissions","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","renounced"],"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":"Prominently show admin and their permissions","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"}],"onMonad":[{"aspect":"Upgrade Speed","ethereum":"Upgrade tx takes a block","monad":"Sub-second upgrade finality","designImplication":"Emergency upgrades can be truly instant"},{"aspect":"Slot Reading","ethereum":"Reading storage slots is cheap but requires RPC","monad":"Fast parallel reads for proxy detection","designImplication":"Can check many contracts for proxy status quickly"},{"aspect":"Timelock Precision","ethereum":"Timelocks based on block numbers","monad":"Precise second-level timelocks possible","designImplication":"More accurate upgrade scheduling"},{"aspect":"Proxy Overhead","ethereum":"Delegatecall adds small gas overhead","monad":"Optimized execution reduces proxy cost","designImplication":"Proxy pattern even more efficient"}],"keyTakeaways":["EIP-1967 = standardized storage for proxy info","Enables \"Read as Proxy\" on block explorers","Always show implementation AND admin addresses","Warn users about admin trust assumptions","Notify on upgrades so users aren't surprised"],"technicalNotes":"EIP-1967 defines three storage slots: implementation (0x360894...), admin (0xb531...), and beacon (0xa3f0...). These specific slots are chosen to avoid collisions with normal storage. Block explorers read these slots to detect proxies and show the correct interface. UUPS and Transparent proxies both use these slots."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-1967","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-1967","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-1967","markdown":"https://www.eipsfordesigners.com/standards/EIP-1967/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-1967/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-1967","official":"https://eips.ethereum.org/EIPS/eip-1967","discussion":"https://ethereum-magicians.org/search?q=EIP-1967"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}