{"id":"ERC-6454","name":"Minimal Transferable Detection","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":"Tokens can be non-transferable (soulbound) or have transfer restrictions — verifiable on-chain. Design implications: show clear 'Non-Transferable' or 'Soulbound' badges, hide/disable transfer buttons for locked tokens, differentiate mintable vs burnable vs transferable states, display restriction reason if available. Design decisions: whether to show transfer button at all for soulbound tokens, how to explain why transfer fails, visual treatment of soulbound vs tradeable tokens in same wallet.","hasDetailedContent":true,"content":{"id":"ERC-6454","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-6454","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Tokens can be non-transferable (soulbound) or have transfer restrictions — verifiable on-chain.","designerTakeaways":["You can query transferability on load and badge Non-transferable on every restricted token.","Your marketplace can hide List button entirely for soulbound items instead of disabled gray buttons.","You can explain why transfer fails with credential, event ticket, or achievement copy."],"applicability":{"whenToUse":["Wallet displays mixed transferable and soulbound NFTs.","SBTs, credentials, or tickets block transfers.","You want one detection hook across collections."],"whenToAvoid":["All tokens in app are freely transferable.","Collection uses custom restriction without ERC-6454 interface.","Read-only display with no send UI."]},"prototypeFirst":[{"screen":"Wallet with mixed tokens","why":"Users compare tradeable vs locked items at a glance.","covers":["Soulbound badge","Transferable normal","Mixed grid"],"include":["Non-transferable chip","No send on soulbound","Filter by transferable"]},{"screen":"Blocked transfer attempt","why":"Edge cases still need education if user tries send.","covers":["Blocked with reason"],"include":["Cannot transfer modal","Reason: credential/event","No gas wasted"]},{"screen":"Marketplace listing gate","why":"List UI must not appear for soulbound.","covers":["List hidden","List blocked pre-check"],"include":["Pre-list transferability check","Explanation if user deep-links"]},{"screen":"Credential detail page","why":"Soulbound items emphasize achievement not resale.","covers":["SBT display"],"include":["Large Non-transferable badge","Issued by","Earned date"]}],"mentalModel":[{"label":"Transferable","description":"Normal NFT — can send and sell subject to other rules."},{"label":"Non-transferable","description":"Soulbound — ownership may change via mint/burn only, not user send."},{"label":"Detection hook","description":"Standard interface lets apps ask once instead of per-collection hacks."},{"label":"Restriction reason","description":"Optional metadata explains ticket, diploma, or achievement context."},{"label":"Burn path","description":"Some soulbound tokens can still be burned — separate from transfer."}],"statesToDesign":[{"state":"Transferable — normal","trigger":"isTransferable true.","userNeed":"Send and sell freely.","designResponse":"Standard transfer and list actions."},{"state":"Non-transferable — soulbound","trigger":"isTransferable false.","userNeed":"Understand cannot sell or send.","designResponse":"Persistent badge; hide transfer CTAs."},{"state":"Transfer attempted on soulbound","trigger":"User finds send via deep link.","userNeed":"Clear block before wallet.","designResponse":"Modal before wallet; no signature prompt."},{"state":"Burnable soulbound","trigger":"Burn allowed but not transfer.","userNeed":"Distinguish destroy from send.","designResponse":"Burn action separate with warning; no Send."},{"state":"Unknown restriction","trigger":"Check fails or unsupported.","userNeed":"Safe default.","designResponse":"Try transfer with warning or query fallback per collection."}],"designDecisions":[{"question":"Show Send button disabled or hidden?","recommendation":"Hidden for soulbound; disabled only if temporarily locked with unlock date.","rationale":"Disabled Send invites futile clicks."},{"question":"Visual treatment in grid?","recommendation":"Subtle lock icon plus Non-transferable chip, not grayed entire card.","rationale":"Soulbound credentials remain pride items."},{"question":"Filter soulbound in marketplace mode?","recommendation":"Default hide from sell flows; show in profile/credentials tab.","rationale":"Marketplace implies transferability."}],"problemsSolved":[{"problem":"Failed transfer txs on SBTs","oldWay":"User signs then reverts","newWay":"Pre-check hides or blocks send before wallet","impact":"high"},{"problem":"Inconsistent soulbound detection","oldWay":"Per-collection hacks break","newWay":"ERC-6454 standard query across tokens","impact":"medium"},{"problem":"Marketplace lists unsellable items","oldWay":"Listing fails at settlement","newWay":"Hide list UI when non-transferable","impact":"high"}],"uxPatterns":[{"name":"Soulbound Badge","description":"Non-transferable chip on token card and detail.","mockup":"concept/nft-gallery","components":["SoulboundChip","LockIcon","ReasonTooltip"],"userFlow":["Load token","Query 6454","Show badge if locked","Hide send"]},{"name":"Transfer Gate","description":"Block send flow before wallet for restricted tokens.","mockup":"concept/verify-safety","components":["TransferCheck","BlockModal","ReasonCopy"],"userFlow":["User taps Send","Check fails","Modal explains","No wallet prompt"]}],"seenInTheWild":[{"app":"POAP","url":"https://poap.xyz/","note":"Soulbound attendance badges — non-transferable by design."},{"app":"Gitcoin Passport","url":"https://passport.gitcoin.co/","note":"Credential stamps use soulbound patterns."},{"app":"OpenSea","url":"https://opensea.io/","note":"Transfer restrictions surfaced on collection pages."}],"antiPatterns":[{"pattern":"Enabled Send on soulbound token","why":"Wasted gas and rage","instead":"Pre-check ERC-6454 and hide Send","severity":"critical"},{"pattern":"Generic Transfer failed after sign","why":"User paid gas for predictable revert","instead":"Block in app with soulbound explanation","severity":"critical"},{"pattern":"Grayed-out credential cards","why":"Implies worthless or broken","instead":"Proud display with Non-transferable badge","severity":"medium"}],"vocabulary":[{"use":"Non-transferable","avoid":"Soulbound EIP-5192 6454","why":"Plain restriction language."},{"use":"Credential","avoid":"SBT","why":"User-facing term unless audience is web3-native."},{"use":"Cannot send this item","avoid":"isTransferable returned false","why":"Outcome not API response."}],"onMonad":[{"aspect":"Pre-check cost","ethereum":"Extra read call may feel heavy on slow networks","monad":"Fast reads make transferability check on every card cheap","designImplication":"Query 6454 on all NFT loads on Monad."},{"aspect":"Soulbound mint volume","ethereum":"Event drops congested","monad":"High throughput for mass credential mints","designImplication":"Design batch mint status for large SBT drops."}],"technicalNotes":"ERC-6454 minimal transfer detection; call before any Send or List UI renders.","relatedStandards":[{"id":"ERC-5192","relationship":"Minimal soulbound NFT standard"},{"id":"ERC-5484","relationship":"Consensual soulbound minting"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-6454","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-6454","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-6454","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-6454","markdown":"https://www.eipsfordesigners.com/standards/ERC-6454/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-6454/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-6454","official":"https://eips.ethereum.org/EIPS/erc-6454","discussion":"https://ethereum-magicians.org/search?q=ERC-6454"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}