{"id":"ERC-5773","name":"Context-Dependent Multi-Asset Tokens","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"}],"uxImpact":"NFTs have multiple assets (files) — different outputs based on context (PDF for readers, 3D for games, image for marketplaces).","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5773","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5773","sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5773","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"NFTs have multiple assets (files) — different outputs based on context (PDF for readers, 3D for games, image for marketplaces).","designerTakeaways":["You can auto-select marketplace image vs game 3D model based on app context.","Your detail page can show asset format tabs with preview for each accepted asset.","You can surface pending asset proposals with Accept for owners before they display publicly."],"applicability":{"whenToUse":["NFTs ship multiple file types for different platforms.","Games need 3D while marketplaces need PNG.","Owner curates asset priority order."],"whenToAvoid":["Single static image metadata only.","No multi-asset indexer support.","One format suffices everywhere."]},"prototypeFirst":[{"screen":"Context-aware display","why":"Same NFT must look right in marketplace vs game.","covers":["Marketplace context","Game context","Reader PDF"],"include":["Auto format pick","Context label in advanced","Fallback image"]},{"screen":"Asset tabs on detail","why":"Collectors browse all formats intentionally.","covers":["Image tab","3D tab","PDF tab"],"include":["Tab bar","Preview pane","Format badge"]},{"screen":"Owner asset priority editor","why":"Owners decide which asset shows first where.","covers":["Reorder list","Save priority"],"include":["Drag reorder","Context mapping","Save confirmation"]},{"screen":"Pending asset proposal","why":"New assets need acceptance before public display.","covers":["Proposed","Accepted","Rejected"],"include":["Proposal inbox","Preview","Accept/Decline"]}],"mentalModel":[{"label":"Multi-asset token","description":"One NFT id, many files attached with metadata."},{"label":"Context","description":"Marketplace, game, or reader — each picks appropriate asset."},{"label":"Priority order","description":"Owner-ranked fallback when context ambiguous."},{"label":"Propose-commit","description":"New assets proposed then accepted like nested NFT flow."},{"label":"Accepted vs pending","description":"Only accepted assets show in public views."}],"statesToDesign":[{"state":"Single context render","trigger":"App knows context.","userNeed":"See right format automatically.","designResponse":"Render best asset silently."},{"state":"Multi-tab browse","trigger":"User on detail page.","userNeed":"Compare formats.","designResponse":"Tabs with previews per format."},{"state":"Pending asset proposal","trigger":"Creator proposed new file.","userNeed":"Review before public.","designResponse":"Owner inbox with Accept/Decline."},{"state":"Missing format for context","trigger":"Game wants 3D but none accepted.","userNeed":"Graceful fallback.","designResponse":"Fallback image plus 3D not available note."},{"state":"Priority reorder saved","trigger":"Owner changed order.","userNeed":"Confirm public display updated.","designResponse":"Saved toast; refresh previews."}],"designDecisions":[{"question":"Auto context vs manual tabs?","recommendation":"Auto in embedded contexts; tabs on detail page.","rationale":"Games should not force users to pick PNG vs GLB."},{"question":"How many tabs visible?","recommendation":"Max 4 visible plus More menu.","rationale":"Format sprawl overwhelms collectors."},{"question":"Preview 3D in marketplace?","recommendation":"Static poster with Open 3D viewer optional.","rationale":"Auto-spin 3D hurts grid performance."}],"problemsSolved":[{"problem":"Wrong file in wrong app","oldWay":"Marketplace shows GLB broken","newWay":"Context selects PNG for marketplace, GLB for game","impact":"high"},{"problem":"One metadata URL limitation","oldWay":"Single JSON cannot serve all platforms","newWay":"Multiple assets per token with priority","impact":"high"},{"problem":"Unauthorized asset swaps","oldWay":"Metadata hijack fears","newWay":"Propose-commit acceptance for new assets","impact":"medium"}],"uxPatterns":[{"name":"Context Asset Picker","description":"Auto-render format by app context.","components":["ContextResolver","AssetRenderer","FallbackImage"],"userFlow":["App loads NFT","Context detected","Best asset renders","Fallback if missing"]},{"name":"Multi-Asset Tabs","description":"Browse all accepted formats on detail.","components":["AssetTabs","PreviewPane","FormatBadge"],"userFlow":["Open detail","Switch tabs","Preview each format","Optional download"]}],"antiPatterns":[{"pattern":"Showing GLB spin in grid thumbnails","why":"Performance collapse","instead":"Poster image in grid; 3D in viewer only","severity":"high"},{"pattern":"Displaying unaccepted proposed assets publicly","why":"Spam or malicious files shown","instead":"Owner accept gate before public","severity":"critical"},{"pattern":"Eight equal tabs with no default","why":"Decision paralysis","instead":"Context auto-pick plus optional tabs","severity":"medium"}],"vocabulary":[{"use":"3D model","avoid":"GLB asset entry","why":"Format name users know."},{"use":"Display version","avoid":"Context priority index","why":"Curatorial language."},{"use":"Accept new file","avoid":"Commit asset proposal","why":"Inbox action language."}],"specConstraints":[{"id":"erc-5773-approval-cleared-transfer","constraint":"Asset-management approvals are cleared on token transfer.","appliesTo":"wallet","normativity":"normative","specQuote":"* @dev Approvals must be cleared on transfer","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Refresh delegated asset-management permissions after a transfer and do not show a prior approved operator as still authorized without a fresh chain read."},{"id":"erc-5773-asset-operation-authorization","constraint":"Asset-management operations require the token owner or an approved asset manager.","appliesTo":"wallet","normativity":"normative","specQuote":"*  - The caller must own the token or be approved to manage the token's assets","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Show the authority used for accept, reject, clear, and priority actions, and gate controls when the connected account is not the owner or approved manager."},{"id":"erc-5773-token-existence","constraint":"Asset-management operations require an existing tokenId.","appliesTo":"application","normativity":"normative","specQuote":"*  - `tokenId` must exist.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Validate the token before presenting an asset-management action and show a missing-token state rather than a generic transaction failure."},{"id":"erc-5773-pending-index-validity","constraint":"Pending-asset operations require an index within the pending asset array.","appliesTo":"application","normativity":"normative","specQuote":"*  - `index` must be in range of the length of the pending asset array.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Bind accept/reject controls to the current pending-array index and expected asset ID; refresh after another operation changes the list."},{"id":"erc-5773-active-asset-id","constraint":"Metadata lookup requires the requested assetId to be in the token's active assets array.","appliesTo":"application","normativity":"normative","specQuote":"* @param assetId Asset Id, must be in the active assets array","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Render metadata only for an active asset ID and distinguish pending proposals from assets currently selected for display."},{"id":"erc-5773-priority-array-shape","constraint":"The priority array length must equal the active assets array length.","appliesTo":"application","normativity":"normative","specQuote":"*  - The length of `priorities` must be equal the length of the active assets array.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Keep priority editing aligned to the current active-asset list and block partial or stale reorder submissions."},{"id":"erc-5773-index-expected-id","constraint":"Index-based asset operations should include the expected asset ID so a changed index cannot silently target a different asset.","appliesTo":"application","normativity":"rationale","specQuote":"To avoid race conditions in which the index of an asset changes, the expected asset ID is included in operations requiring asset index, to verify that the asset being accessed using the index is the expected asset.","specSection":"Rationale","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#rationale","designImplication":"Keep the expected asset ID bound to an accept or reject confirmation and refresh when a pending list changes, so a stale index cannot become a different user action."},{"id":"erc-5773-propose-commit-assets","constraint":"New assets use a propose-commit flow: pending assets are migrated to active only by the token owner, with a recommended 128-slot pending limit to reduce spam and griefing.","appliesTo":"application","normativity":"rationale","specQuote":"Adding assets to an existing token MUST be done in the form of a propose-commit pattern to allow for limited mutability by a 3rd party. When adding an asset to a token, it is first placed in the *\"Pending\"* array, and MUST be migrated to the *\"Active\"* array by the token's owner. The *\"Pending\"* assets array SHOULD be limited to 128 slots to prevent spam and griefing.","specSection":"Rationale — Propose-Commit pattern for asset addition","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#propose-commit-pattern-for-asset-addition","designImplication":"Keep proposed files out of the public active-asset view until owner acceptance, show pending capacity or rejection states where supported, and preserve the source's SHOULD strength for the 128-slot limit."},{"id":"erc-5773-emergency-clear","constraint":"An implementation must include an emergency function to clear all pending assets, while the owner may drop active or pending assets.","appliesTo":"application","normativity":"rationale","specQuote":"Several functions for asset management are included. In addition to permissioned migration from \"Pending\" to \"Active\", the owner of a token MAY also drop assets from both the active and the pending array -- an emergency function to clear all entries from the pending array MUST also be included.","specSection":"Rationale — Asset management","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#asset-management","designImplication":"Provide a clearly labeled pending-asset cleanup or recovery state when the implementation exposes it, without implying that active assets can be removed by the same action."},{"id":"erc-5773-erc721-compatibility","constraint":"The multi-asset token standard is designed to remain compatible with ERC-721 tooling and infrastructure.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"The MultiAsset 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-5773#backwards-compatibility","designImplication":"Keep ERC-721 ownership and transfer surfaces recognizable, then layer pending/active asset states without implying that legacy NFT tooling exposes the full multi-asset model."},{"id":"erc-5773-hidden-logic-risk","constraint":"Non-audited multi-asset contracts may contain hidden logic in asset-management functions, including burn, add, accept, and related operations.","appliesTo":"wallet","normativity":"security-considerations","specQuote":"The same security considerations as with [ERC-721](./eip-721.md) apply: hidden logic may be present in any of the functions, including burn, add asset, accept asset, and more.\n\nCaution is advised when dealing with non-audited contracts.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#security-considerations","designImplication":"Keep contract-audit and implementation provenance visible before asset mutations; do not make the proposed standard look like a safety guarantee for arbitrary token code."},{"id":"metadata-response-shape","constraint":"Asset metadata MAY contain a JSON response with the suggested fields.","appliesTo":"application","normativity":"normative","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Use the suggested fields when present for asset cards and detail views, while providing unknown or missing-field states because the response shape is optional.","specQuote":"The `getAssetMetadata` function returns the asset's metadata URI. The metadata, to which the metadata URI of the asset points, MAY contain a JSON response with the following fields:"},{"id":"metadata-flexibility","constraint":"The suggested asset-metadata JSON schema is not enforced and MAY be structured differently.","appliesTo":"application","normativity":"normative","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5773#specification","designImplication":"Treat metadata rendering as schema-tolerant: preserve useful unknown fields and provide fallbacks rather than assuming the example schema is complete.","specQuote":"While this is the suggested JSON schema for the asset metadata, it is not enforced and MAY be structured completely differently based on implementer's preference."}],"technicalNotes":"ERC-5773 exposes active and pending asset IDs, priorities, replacements, and getAssetMetadata(tokenId, assetId). It does not define a context parameter or render function; selecting an asset for a marketplace, game, or reader is client/application policy. Gate proposed assets behind the implementation's acceptance rules.","relatedStandards":[{"id":"ERC-4906","relationship":"Metadata updates when assets change"},{"id":"ERC-721","relationship":"Multi-asset extension to NFT"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5773","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5773","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5773","markdown":"https://www.eipsfordesigners.com/standards/ERC-5773/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5773/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5773","official":"https://ercs.ethereum.org/ERCS/erc-5773","discussion":"https://ethereum-magicians.org/search?q=ERC-5773"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}