{"id":"ERC-7631","name":"Dual Nature Token Pair","status":"Draft","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":"Paired ERC-20 and ERC-721 tokens that sync — buying fungible tokens auto-mints NFTs proportionally. Design implications: show linked token pairs together, indicate NFT skip status, display 'X tokens = Y NFTs' conversion ratio, toggle for skip-NFT preference. Design decisions: whether to surface the dual nature prominently or abstract it, explaining skip-NFT for gas savings vs collectibility, handling marketplace display of both representations.","hasDetailedContent":true,"content":{"id":"ERC-7631","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7631","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Paired ERC-20 and ERC-721 tokens that sync — buying fungible tokens auto-mints NFTs proportionally.","designerTakeaways":["You can show X tokens = Y NFTs ratio on every purchase screen.","Your settings can offer Skip NFT mint for gas savings with collectibility tradeoff explained.","You can display linked NFT and token together in one portfolio row."],"applicability":{"whenToUse":["Project issues both fungible and NFT representation.","Auto-mint NFT on token purchase is on-chain rule.","Skip-NFT option exists for gas-conscious users."],"whenToAvoid":["Separate unrelated ERC-20 and ERC-721.","Pair sync not implemented.","Users only ever interact with one side."]},"prototypeFirst":[{"screen":"Dual asset portfolio row","why":"Users must see both legs of pair.","covers":["Both held","Token only skipped NFT","NFT only"],"include":["Linked icon","Token balance","NFT thumbnail","Ratio label"]},{"screen":"Purchase with skip-NFT toggle","why":"Gas vs collectibility decision at checkout.","covers":["Skip on","Skip off"],"include":["Toggle with cost estimate","What you miss copy","Confirm purchase"]},{"screen":"Marketplace dual listing","why":"Buyers see both representations.","covers":["Listed as pair","Partial listing"],"include":["Pair badge","Conversion ratio","Linked item links"]},{"screen":"Sync status indicator","why":"When pair desyncs users panic.","covers":["Synced","NFT skipped","Pending mint"],"include":["Sync chip","Mint pending state","Link to mint NFT"]}],"mentalModel":[{"label":"Dual nature","description":"One economic position, two on-chain representations."},{"label":"Conversion ratio","description":"Fixed formula maps token amount to NFT count."},{"label":"Skip NFT","description":"User opts out of collectible mint — holds tokens only."},{"label":"Auto-mint","description":"Buying tokens triggers NFT mint when skip off."},{"label":"Pair sync","description":"Burning or transferring may affect both sides — read rules."}],"statesToDesign":[{"state":"Fully synced pair","trigger":"User holds matching token and NFT amounts.","userNeed":"See unified position.","designResponse":"Single row with both previews."},{"state":"Skipped NFT","trigger":"User bought with skip on.","userNeed":"Know can mint later or not.","designResponse":"Tokens only with Mint collectible CTA if allowed."},{"state":"Pending NFT mint","trigger":"Purchase confirmed, NFT minting.","userNeed":"Track mint progress.","designResponse":"Minting collectible status strip."},{"state":"Ratio display at purchase","trigger":"Checkout.","userNeed":"Predict what they receive.","designResponse":"You get 100 TOKEN + 1 NFT preview."},{"state":"Partial side only in wallet","trigger":"Indexer missed one leg.","userNeed":"Not think asset lost.","designResponse":"Loading linked asset or manual refresh."}],"designDecisions":[{"question":"Prominent dual nature or abstract?","recommendation":"Show pair on detail; simplify to primary asset in grid.","rationale":"Grid clutter if always dual."},{"question":"Default skip-NFT on or off?","recommendation":"Off for collectors; remember user preference.","rationale":"Gas savings vs collectibility is personal."},{"question":"Marketplace show one or two listings?","recommendation":"Single listing with pair badge linking both.","rationale":"Split listings confuse price discovery."}],"problemsSolved":[{"problem":"Users unaware of linked NFT","oldWay":"Only token shows in wallet","newWay":"Dual row shows both representations","impact":"high"},{"problem":"Unexpected NFT mint gas","oldWay":"Surprise second transaction","newWay":"Skip-NFT toggle at purchase with estimate","impact":"high"},{"problem":"Marketplace lists only one side","oldWay":"Buyer misses collectible component","newWay":"Pair badge with ratio on listing","impact":"medium"}],"uxPatterns":[{"name":"Dual Asset Row","description":"Portfolio entry showing linked token and NFT.","mockup":"concept/nft-gallery","components":["PairLink","TokenBalance","NFTThumb","RatioLabel"],"userFlow":["Load portfolio","Pair detected","Show unified row","Expand for both"]},{"name":"Skip NFT Toggle","description":"Checkout option to skip collectible mint.","mockup":"concept/permit-approval","components":["SkipToggle","GasEstimate","TradeoffCopy"],"userFlow":["User buys","Toggles skip","Sees savings","Confirms","Receives tokens only"]}],"seenInTheWild":[{"app":"Uniswap","url":"https://app.uniswap.org/","note":"LP position NFT pairs inform dual-asset display."},{"app":"OpenSea","url":"https://opensea.io/","note":"Bundled item display for related assets."},{"app":"Zora","url":"https://zora.co/","note":"Creator coin + NFT experiments."}],"antiPatterns":[{"pattern":"Showing only ERC-20 after paired purchase","why":"Users think NFT failed to mint","instead":"Dual row or mint pending status","severity":"high"},{"pattern":"Skip-NFT hidden in advanced","why":"Surprise gas for unwanted mint","instead":"Checkout toggle with clear default","severity":"high"},{"pattern":"Separate listings without link","why":"Price arbitrage confusion","instead":"Single pair listing with ratio","severity":"medium"}],"vocabulary":[{"use":"Linked collectible","avoid":"ERC-721 side of pair","why":"Collectible language."},{"use":"100 tokens = 1 NFT","avoid":"Sync ratio constant","why":"Conversion plain math."},{"use":"Skip collectible mint","avoid":"Set skipNFT flag","why":"Checkout option language."}],"onMonad":[{"aspect":"Dual mint cost","ethereum":"Token + NFT mint gas stacks","monad":"Lower fees make skip less critical but toggle still valuable","designImplication":"Show combined mint estimate on Monad checkout."},{"aspect":"Sync refresh","ethereum":"Pair index lag","monad":"Fast mint confirmation updates dual row quickly","designImplication":"Inline minting status without long poll."}],"technicalNotes":"ERC-7631 is draft; always show conversion ratio at purchase and linked asset in portfolio.","relatedStandards":[{"id":"ERC-20","relationship":"Fungible leg of pair"},{"id":"ERC-721","relationship":"NFT leg of pair"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7631","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-7631","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7631","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7631","markdown":"https://www.eipsfordesigners.com/standards/ERC-7631/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7631/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7631","official":"https://eips.ethereum.org/EIPS/erc-7631","discussion":"https://ethereum-magicians.org/search?q=ERC-7631"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}