{"id":"ERC-6220","name":"Composable NFTs with Equippable Parts","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"ERC-6220 standardizes on-chain equipment for NFTs through slots, Catalog compatibility, and fixed or equippable part metadata. A compatible renderer may compose the parts, but visual changes, composed-image generation, marketplace support, and cross-platform display remain collection and client policy.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-6220","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-6220","summary":"ERC-6220 standardizes on-chain equipment for NFTs through slots, Catalog compatibility, and fixed or equippable part metadata. A compatible renderer may compose the parts, but visual changes, composed-image generation, marketplace support, and cross-platform display remain collection and client policy.","applicability":{"whenToUse":["A collection implements equippable assets, slot IDs, and compatible Catalog data.","The product can show equipment state and the target contract's permission and compatibility checks.","A compatible renderer is available when the experience promises composed output.","You are designing an equipment-slot interface with visible pending, success, and recovery states."],"whenToAvoid":["The collection does not implement equippable assets or compatible Catalog slots.","The child asset is not active or compatible with the selected parent slot.","The product promises visual composition or marketplace support without a compatible renderer.","The product only needs a flat collection without parent-child equipment."]},"designerTakeaways":["Design slot and compatibility views from the target collection's on-chain equipment state.","Preview a composed result only when a compatible renderer and collection metadata are available.","Describe marketplace and cross-platform display as client integrations, not guarantees of ERC-6220."],"problemsSolved":[{"problem":"Equipment state is difficult to inspect","oldWay":"A product relies on off-chain claims about attached parts.","newWay":"Slot, part, and Catalog data can be queried from a compatible implementation.","impact":"critical"},{"problem":"Users cannot tell which item fits a slot","oldWay":"Buy a wearable and discover incompatibility later.","newWay":"Show target slot, part type, and Catalog compatibility before the action.","impact":"critical"},{"problem":"Rendering policy differs by collection","oldWay":"Assume every client composes equipment the same way.","newWay":"Use a compatible renderer and label composed output as client/collection behavior.","impact":"high"},{"problem":"Users need to review equipment changes","oldWay":"Equipment appears changed without a clear on-chain pending state.","newWay":"Show the selected equipment, transaction state, and final contract read.","impact":"medium"}],"uxPatterns":[{"name":"Equipment Slot Interface","description":"Show slots and on-chain equipment state for a compatible collection.","userFlow":["User views a parent NFT","Reads available slots and attached parts","Checks Catalog compatibility","Previews output only if a renderer is available","Submits the supported equipment call"]},{"name":"Equip Item Flow","description":"Select a compatible part and disclose the target transaction.","mockup":"generic/list-selector","userFlow":["User opens an empty or filled slot","App filters by target collection and Catalog compatibility","User previews available rendering","Confirms the target contract call","UI updates after settlement"]},{"name":"Compatible Composed View","description":"Optional client rendering of base and equipment assets.","userFlow":["Client reads fixed/equippable parts","Renderer resolves metadata and z-index rules","UI labels any unavailable composition","User can inspect individual part records","Changes refresh after on-chain state settles"]},{"name":"Slot Compatibility Guide","description":"Explain what a target Catalog and slot accept; buying remains an app-layer flow.","userFlow":["User opens compatibility help","Sees slot and part type requirements","Filters known compatible collections","Reviews the target implementation","Only then proceeds to any optional purchase flow"]}],"uiComponents":[{"name":"EquipmentSlotGrid","description":"Visual grid of equipment slots","states":["viewing","editing","equipping"],"props":["slots","equipped","onSlotClick"]},{"name":"EquipModal","description":"Select and preview equipment","states":["browsing","previewing","confirming","equipping"],"props":["slot","compatibleItems","onEquip","onCancel"]},{"name":"ComposedNFTView","description":"Optional client renderer for base and equipment assets when collection metadata and render rules support it","states":["loading","rendered","error"],"props":["baseNFT","equipment","renderMode"]},{"name":"CompatibilityChecker","description":"Shows if item fits slot","states":["compatible","incompatible","checking"],"props":["item","slot","baseNFT"]}],"antiPatterns":[{"pattern":"Promising visual change for every equipped item","why":"ERC-6220 stores equipment state and metadata; rendering is client and collection policy.","instead":"Show a composed preview only when a compatible renderer can resolve the parts.","severity":"high"},{"pattern":"Unclear slot compatibility","why":"A part may not match the selected Catalog, slot, or parent implementation.","instead":"Show compatibility checks and source data before purchase or equip.","severity":"critical"},{"pattern":"No indication of equipped versus available items","why":"Users may sell or move a part without understanding its current parent state.","instead":"Show Equipped to [parent] and confirm the supported change.","severity":"high"},{"pattern":"Hiding that equipment changes require a transaction","why":"The user cannot distinguish local preview from settled on-chain state.","instead":"Show transaction, permission, and settlement states.","severity":"medium"},{"pattern":"Presenting composed images as cross-platform support","why":"Marketplace and renderer compatibility are outside the core interface.","instead":"Label client-specific composition and show the underlying part records.","severity":"medium"}],"keyTakeaways":["ERC-6220 standardizes on-chain equipment slots and Catalog compatibility.","A compatible renderer may compose fixed and equippable parts; visual output is not universal.","Show slot compatibility and settled equipment state before promising an equip result.","Label marketplace and cross-platform rendering as collection/client integrations."],"technicalNotes":"ERC-6220 defines slots as (slotId, partType, z-index, assetCatalog). Assets can be fixed (built-in) or equippable (swappable NFTs). equip() takes an IntakeEquip struct containing tokenId, childIndex, assetId, slotPartId, and childAssetId; query active assets and Catalog compatibility before enabling it. Rendering combines base and equipped parts according to the implementation's asset rules and z-index.","lastUpdated":"2026-09-18","specConstraints":[{"id":"erc721-equippable-compatibility","constraint":"The equippable token standard is compatible with ERC-721 infrastructure.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nThe Equippable token standard has been made compatible with [ERC-721](./eip-721.md) in order to take advantage of the robust tooling available for implementations of ERC-721 and to ensure compatibility with existing ERC-721 infrastructure.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-6220#backwards-compatibility","designImplication":"Retain ERC-721 ownership and marketplace views around equipped-resource actions."},{"id":"equippable-hidden-logic","constraint":"Hidden logic may exist in equippable token functions, so non-audited contracts require caution.","appliesTo":"application","normativity":"security-considerations","specQuote":"## Security Considerations\n\nThe same security considerations as with [ERC-721](./eip-721.md) apply: hidden logic may be present in any of the functions, including burn, add resource, accept resource, and more.\n\nCaution is advised when dealing with non-audited contracts.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-6220#security-considerations","designImplication":"Show the contract and audit status before users accept resource or equipment changes. Do not present an unevaluated contract as a harmless cosmetic update."},{"id":"catalog-multi-collection-reuse","constraint":"A Catalog SHOULD support multiple NFT collections when broad reuse fits the use case.","appliesTo":"account-implementation","normativity":"rationale","specQuote":"As the Catalog is designed in a way that is agnostic to the use case using it. It makes sense to support as wide reusability as possible. Having one Catalog supporting multiple collections allows for optimized operation and reduced gas prices when deploying it and setting fixed as well as slot parts.","specSection":"Rationale — Catalog scope","specUrl":"https://ercs.ethereum.org/ERCS/erc-6220#catalog","designImplication":"Show a Catalog's supported collection scope and compatibility rules; do not imply that a part is limited to one collection when the implementation supports broader reuse."}],"sources":[{"label":"ERC-6220 official specification","url":"https://ercs.ethereum.org/ERCS/erc-6220","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-6220","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-6220","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-6220","markdown":"https://www.eipsfordesigners.com/standards/ERC-6220/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-6220/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-6220","official":"https://ercs.ethereum.org/ERCS/erc-6220","discussion":"https://ethereum-magicians.org/search?q=ERC-6220"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}