{"id":"ERC-2535","name":"Diamonds, Multi-Facet Proxy","status":"Final","chain":"both","category":{"id":"infrastructure","name":"Infrastructure","description":"Foundational patterns enabling other standards"},"journeyStages":[{"id":"infra","name":"Infrastructure","description":"Foundational patterns"}],"uxImpact":"Diamond contracts can have unlimited functionality via multiple facets, all at one address. Design implications: show facet breakdown in contract explorers (which functions come from which facet), display upgrade history per-facet, indicate 'Diamond Contract' with expandable facet list. Design decisions: how to present complex multi-facet contracts without overwhelming users; balance between showing full architecture (power users) and simplified 'single contract' view (regular users).","hasDetailedContent":true,"content":{"id":"ERC-2535","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2535","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Diamond contracts can have unlimited functionality via multiple facets, all at one address.","designerTakeaways":["You can badge Diamond contract on address pages with optional View facets expand.","Your default send flow treats diamond like any address — complexity only in advanced explorer.","You can show per-facet upgrade history for auditors without showing it on every confirm screen."],"applicability":{"whenToUse":["Contract explorer or developer tools display proxy diamonds.","Users interact with known diamond deployments.","Upgrade transparency is product value."],"whenToAvoid":["End-user retail flows with no inspect need.","Plain non-diamond contracts.","Cannot resolve facet selector mapping."]},"prototypeFirst":[{"screen":"Diamond address overview","why":"Default view for regular users stays simple.","covers":["Simple mode","Power expand"],"include":["Single address chip","Diamond badge","Expand facets link"]},{"screen":"Facet breakdown panel","why":"Power users audit which code runs.","covers":["Multiple facets","Single facet"],"include":["Facet name rows","Function count","Facet address copy"]},{"screen":"Upgrade history timeline","why":"Track facet adds and replacements.","covers":["Recent upgrade","Empty history"],"include":["Timeline","Facet affected","Tx link"]},{"screen":"Send to diamond confirm","why":"Confirm stays human — no facet dump.","covers":["Standard send"],"include":["Human action summary","Contract address","Facets in advanced only"]}],"mentalModel":[{"label":"Diamond address","description":"One URL users save — never changes across upgrades."},{"label":"Facet","description":"Module holding subset of functions."},{"label":"Selector routing","description":"Function call hits correct facet — invisible to user."},{"label":"Upgrade","description":"Facet swap changes behavior without new address."},{"label":"Simple vs power view","description":"Retail default simple; auditors expand facets."}],"statesToDesign":[{"state":"Simple contract view","trigger":"Default user path.","userNeed":"Send/interact normally.","designResponse":"No facet UI on confirm."},{"state":"Facets expanded","trigger":"User taps View facets.","userNeed":"Audit architecture.","designResponse":"Facet list with function groups."},{"state":"Recent upgrade","trigger":"Facet changed.","userNeed":"Know behavior may differ.","designResponse":"Recently upgraded banner on explorer."},{"state":"Unknown selector","trigger":"Function not in known facet map.","userNeed":"Not broken UI.","designResponse":"Unknown function — check latest facet map."},{"state":"Developer upgrade sim","trigger":"Simulating facet add.","userNeed":"Clear diff.","designResponse":"Before/after facet table."}],"designDecisions":[{"question":"Show facets on wallet confirm?","recommendation":"No — address and human summary only.","rationale":"Facets are auditor detail not consent detail."},{"question":"Diamond badge everywhere?","recommendation":"Explorer and contract pages only.","rationale":"Badge on send form adds noise."},{"question":"Facet naming?","recommendation":"Human labels from manifest; addresses in advanced.","rationale":"0x facet addresses meaningless."}],"problemsSolved":[{"problem":"Contract size limit blocks features","oldWay":"Deploy new address each upgrade","newWay":"Diamond adds facets same address","impact":"high"},{"problem":"Users confused by changing bytecode same address","oldWay":"Looks like same contract different behavior","newWay":"Upgrade history explains facet changes","impact":"medium"},{"problem":"Auditors cannot map functions to code","oldWay":"Opaque proxy","newWay":"Facet breakdown panel","impact":"medium"}],"uxPatterns":[{"name":"Diamond Facet Explorer","description":"Expandable facet list on contract page.","mockup":"concept/proxy-pattern","components":["DiamondBadge","FacetList","UpgradeTimeline"],"userFlow":["Open contract","See diamond badge","Expand facets","Inspect functions"]},{"name":"Simple Send to Diamond","description":"Standard confirm without facet noise.","mockup":"concept/verify-safety","components":["AddressChip","ActionSummary","AdvancedToggle"],"userFlow":["Send to diamond","Human summary","Confirm","Success"]}],"seenInTheWild":[{"app":"Etherscan","url":"https://etherscan.io/","note":"Proxy and implementation contract display patterns."},{"app":"OpenZeppelin","url":"https://www.openzeppelin.com/","note":"Diamond pattern documentation for developers."},{"app":"Louper","url":"https://louper.dev/","note":"Diamond facet explorer reference UI."}],"antiPatterns":[{"pattern":"Facet list on every wallet confirm","why":"Overwhelms non-technical users","instead":"Facets only in contract explorer advanced","severity":"high"},{"pattern":"No upgrade history on diamond","why":"Same address different behavior surprises","instead":"Upgrade timeline on contract page","severity":"medium"},{"pattern":"Raw selector hex in default view","why":"Meaningless to users","instead":"Function names grouped by facet","severity":"medium"}],"vocabulary":[{"use":"Multi-part contract","avoid":"Diamond proxy facets","why":"Simpler architecture hint."},{"use":"View components","avoid":"List facets","why":"Explorer action language."},{"use":"Recently updated","avoid":"Facet replaced via diamondCut","why":"Plain upgrade notice."}],"onMonad":[{"aspect":"Diamond deployments","ethereum":"Same UX patterns apply","monad":"Facet upgrades same address on Monad","designImplication":"Support diamond badge in Monad explorers."},{"aspect":"Upgrade tx cost","ethereum":"Facet cuts costly","monad":"Cheaper upgrades enable iterative facet releases","designImplication":"Show upgrade history more frequently on Monad."}],"technicalNotes":"ERC-2535 diamonds: simple default UX for send; facet breakdown for explorers only.","relatedStandards":[{"id":"EIP-1967","relationship":"Proxy storage slot standard"},{"id":"EIP-1167","relationship":"Minimal proxy alternative"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2535","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-2535","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-2535","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-2535","markdown":"https://www.eipsfordesigners.com/standards/ERC-2535/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-2535/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-2535","official":"https://eips.ethereum.org/EIPS/erc-2535","discussion":"https://ethereum-magicians.org/search?q=ERC-2535"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}