{"id":"ERC-1167","name":"Minimal Proxy Contract","status":"Final","chain":"both","category":{"id":"infrastructure","name":"Infrastructure","description":"Foundational patterns enabling other standards"},"journeyStages":[{"id":"infra","name":"Infrastructure","description":"Foundational patterns"}],"uxImpact":"ERC-1167 defines minimal clones that delegate calls to a fixed implementation address. Many instances can share code while keeping separate storage. The small runtime can reduce deployment gas, but the actual fee and confirmation time depend on the factory, initialization and network.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-1167","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-1167","summary":"ERC-1167 defines minimal clones that delegate calls to a fixed implementation address. Many instances can share code while keeping separate storage. The small runtime can reduce deployment gas, but the actual fee and confirmation time depend on the factory, initialization and network.","applicability":{"whenToUse":["A product uses minimal clones with a fixed implementation target.","Users or operators need to inspect the clone address and its shared implementation."],"whenToAvoid":["The product requires changing the clone’s embedded delegation target.","You are presenting an upgradeable-proxy lifecycle as a property of a minimal clone."]},"designerTakeaways":["Estimate deployment and initialization costs for the actual factory and network.","Distinguish each clone address and storage from the shared implementation.","Show source verification and any audit as separate, scoped evidence; a clone does not establish safety."],"problemsSolved":[{"problem":"Deploying contracts is expensive","oldWay":"Deploy the full implementation bytecode for each instance","newWay":"Deploy a small clone runtime plus the required initialization","impact":"critical"},{"problem":"Factory patterns cost too much","oldWay":"Each user's vault/collection is full deployment","newWay":"Clone factory creates instances cheaply","impact":"critical"},{"problem":"Can't afford per-user contracts","oldWay":"Share one contract, complex accounting","newWay":"Each user gets their own contract cheaply","impact":"high"},{"problem":"Code duplication on chain","oldWay":"Same bytecode stored thousands of times","newWay":"One implementation, many proxies","impact":"medium"}],"uxPatterns":[{"name":"One-Click Contract Creation","description":"User creates an instance through a supported factory","userFlow":["User fills in contract parameters","Sees cost comparison (clone vs full)","Clicks create","Track submission and inclusion before showing the deployed address","Gets their own contract address"]},{"name":"Factory Dashboard","description":"View all clones created from a factory","userFlow":["Admin views factory dashboard","Sees all clones created","Monitors adoption and gas savings","Links to implementation for verification"]},{"name":"Clone Verification","description":"Inspect the fixed delegation target, initialization, and control policy.","userFlow":["Open the clone address","Resolve the implementation embedded in its runtime","Check source verification and initialization state separately","Link any actual audit with its version and scope","Explain remaining implementation and authority risks without a Safe badge"]},{"name":"Personal Vault Creation","description":"User gets their own vault contract","userFlow":["Select a supported vault implementation","Inspect initialization parameters, owner, and current deployment estimate","Submit through the verified factory","Confirm deployment and initialized control before receiving assets"]}],"uiComponents":[{"name":"CloneDeployer","description":"Form for creating new clone instance","states":["configuring","deploying","deployed","error"],"props":["factoryAddress","initParams","onDeploy"]},{"name":"GasSavingsIndicator","description":"Shows savings from using clone vs full deploy","states":["calculating","ready"],"props":["fullDeployCost","cloneCost","savings"]},{"name":"ProxyVerificationBadge","description":"Badge showing proxy points to verified impl","states":["verified","unverified","loading"],"props":["proxyAddress","implementationAddress","isVerified"]},{"name":"FactoryCloneList","description":"List of all clones from a factory","states":["loading","loaded","empty"],"props":["clones[]","onCloneClick"]},{"name":"CloneExplainerTooltip","description":"Explains how minimal proxy works","states":["collapsed","expanded"],"props":["showDiagram"]}],"antiPatterns":[{"pattern":"Hiding that contract is a proxy","why":"Users deserve to know how their contract works","instead":"Show \"Powered by [Implementation]\" with link","severity":"high"},{"pattern":"Not linking to verified implementation","why":"User can't verify the code their proxy uses","instead":"Always link to implementation on block explorer","severity":"high"},{"pattern":"Confusing proxy address with implementation","why":"User looks up wrong address, sees weird bytecode","instead":"Clearly label \"Your contract\" vs \"Implementation\"","severity":"medium"},{"pattern":"Not explaining gas savings","why":"User doesn't understand the value they're getting","instead":"Show estimated savings only from a current like-for-like gas comparison","severity":"medium"},{"pattern":"Describing fixed delegation as an immutable or safe application","why":"The embedded target is fixed, but delegated code can depend on mutable state, permissions, or other contracts.","instead":"Explain the fixed target and separately inspect application behavior, dependencies, and upgrade authority.","severity":"high"}],"keyTakeaways":["A minimal clone delegates to a fixed implementation address.","Each instance has separate storage; initialization and permissions still matter.","Quote current deployment and initialization fees.","Link the implementation, verification result, and any actual version-specific audit.","A fixed target does not prove that the implementation's dependencies, permissions, or effective behavior cannot change."],"technicalNotes":"The standard minimal proxy runtime delegates calls to a fixed implementation address while using the clone's storage. That embedded target cannot be replaced through an ERC-1967 implementation slot. Fixed delegation does not certify initialization, permissions, code safety, or immutable behavior of dependencies. Cost comparisons must include initialization and current network fees.","lastUpdated":"2026-09-18","lastReviewed":"2026-09-18","sources":[{"label":"ERC-1167 official specification","url":"https://ercs.ethereum.org/ERCS/erc-1167","type":"official-spec"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-1167","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-1167","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-1167","markdown":"https://www.eipsfordesigners.com/standards/ERC-1167/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-1167/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-1167","official":"https://ercs.ethereum.org/ERCS/erc-1167","discussion":"https://ethereum-magicians.org/search?q=ERC-1167"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}