{"id":"ERC-6147","name":"Guard of NFT/SBT","status":"Final","chain":"both","category":{"id":"security","name":"Security & Trust","description":"Helping users verify, control, and protect their assets"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"NFT owners can set a 'guard' address that controls transfers — enables anti-theft (cold wallet guard), lending collateral, SBT recovery. Design implications: show 'Protected by Guard' indicator, display guard expiry, add guard management UI for setting/removing. Design decisions: how to communicate transfer restrictions — warning when guard active, explain why transfer button disabled, guard vs owner permission clarity.","hasDetailedContent":true,"content":{"id":"ERC-6147","summary":"ERC-6147 adds a \"guard\" role to NFTs that can prevent transfers even by the owner. Think of it as a freeze switch that protects against theft, enables recovery mechanisms, and supports safe lending. The guard can allow or block transfers without taking ownership, perfect for custodians, security services, or recovery systems.","applicability":{"whenToUse":["Your product addresses: stolen NFT can be transferred before owner reacts.","Your product addresses: no way to freeze NFT without giving up ownership.","The flow should deliver: guard blocks transfers, gives owner time to recover.","You are designing a guard status display experience with visible states and recovery paths."],"whenToAvoid":["Explain: \"Guard can block ALL transfers but cannot take ownership\".","Require expiration or backup recovery mechanism.","Prominent warning: \"This NFT has transfer restrictions\".","Wrong-address or approval mistakes are not recoverable in your product context."]},"designerTakeaways":["You can design UI that delivers guard blocks transfers, gives owner time to recover.","You can design UI that delivers guard can freeze while owner retains full ownership.","You can design UI that delivers set yourself as guard."],"problemsSolved":[{"problem":"Stolen NFT can be transferred before owner reacts","oldWay":"Thief immediately sells or transfers stolen NFT, owner loses it","newWay":"Guard blocks transfers, gives owner time to recover","impact":"critical"},{"problem":"No way to freeze NFT without giving up ownership","oldWay":"To prevent transfers, must transfer to custodian (lose ownership)","newWay":"Guard can freeze while owner retains full ownership","impact":"high"},{"problem":"Lending NFT risks losing it to bad actor","oldWay":"Lend to friend, they refuse to return it","newWay":"Set yourself as guard, can always recover even if \"owner\" changes","impact":"high"},{"problem":"No recovery mechanism for lost access","oldWay":"Lost wallet key = lost NFTs forever","newWay":"Trusted guard can facilitate recovery to new wallet","impact":"medium"}],"uxPatterns":[{"name":"Guard Status Display","description":"Show protection status on NFT","mockup":"concept/nft-gallery","userFlow":["User views guarded NFT","See protection status prominently","View who the guard is","Understand transfer restrictions","Can request transfer (guard must approve)","Feel secure against theft"]},{"name":"Set Guard Interface","description":"Enable protection by assigning guard","mockup":"concept/wallet","userFlow":["User wants to protect valuable NFT","Choose guard type","Select protection service or enter address","Review service details","Enable protection on-chain","NFT now requires guard approval for transfers"]},{"name":"Transfer Request Flow","description":"Request guard approval for transfer","mockup":"concept/nft-gallery","userFlow":["Owner initiates transfer of guarded NFT","System submits request to guard","Guard verifies ownership","Optional cooldown period","Guard approves or denies","Transfer completes if approved"]},{"name":"Guard Dashboard","description":"Guard manages protected NFTs","mockup":"concept/nft-gallery","userFlow":["Guard opens dashboard","See all protected NFTs","Review pending transfer requests","Approve legitimate transfers","Emergency lock if theft reported","Manage protection settings"]}],"uiComponents":[{"name":"GuardStatusIndicator","description":"Shows protection status on NFT","states":["unguarded","guarded","locked","pending-transfer"],"props":["guard","expiration","status"]},{"name":"SetGuardForm","description":"UI for assigning guard to NFT","states":["selecting","confirming","setting","active"],"props":["nft","guardOptions","onSetGuard"]},{"name":"TransferRequestFlow","description":"Request and track transfer approval","states":["requesting","pending","approved","denied"],"props":["nft","recipient","guard","status"]},{"name":"GuardControlPanel","description":"Guard manages protected assets","states":["idle","reviewing","locking","unlocking"],"props":["guardedNFTs","pendingRequests","onAction"]}],"antiPatterns":[{"pattern":"Not explaining what guard role means","why":"Users don't understand the power they're granting","instead":"Explain: \"Guard can block ALL transfers but cannot take ownership\"","severity":"critical"},{"pattern":"Setting guard without recovery option","why":"If guard address is lost, NFT stuck forever","instead":"Require expiration or backup recovery mechanism","severity":"critical"},{"pattern":"Hiding guard status on marketplaces","why":"Buyer doesn't know they can't transfer after purchase","instead":"Prominent warning: \"This NFT has transfer restrictions\"","severity":"critical"},{"pattern":"Making transfer requests confusing","why":"Users don't understand the approval process","instead":"Clear step-by-step: request → verification → approval → transfer","severity":"high"},{"pattern":"No emergency lock for theft situations","why":"Guard can't react fast enough to theft","instead":"Instant lock capability for guards, unlock requires verification","severity":"high"}],"onMonad":[{"aspect":"Guard Actions","ethereum":"Lock/unlock takes 15+ seconds","monad":"Sub-second guard actions","designImplication":"Emergency locks can be truly instant"},{"aspect":"Transfer Approval","ethereum":"Approval + transfer = 2 slow transactions","monad":"Both actions feel instant","designImplication":"Smoother transfer request flow"},{"aspect":"Status Queries","ethereum":"Checking guard status can be slow","monad":"Instant guard status checks","designImplication":"Real-time protection status in all views"},{"aspect":"Batch Protection","ethereum":"Guarding multiple NFTs is expensive/slow","monad":"Batch guard assignment practical","designImplication":"Protect entire collection with one action"}],"keyTakeaways":["ERC-6147 = guard role can block transfers without ownership","Perfect for theft protection and recovery","Always explain guard powers clearly to users","Show guard status prominently on marketplaces","On Monad: instant emergency locks for theft response"],"technicalNotes":"ERC-6147 extends ERC-721 with setGuard(tokenId, guard) and getGuard(tokenId). When a guard is set, transferFrom checks guard approval before executing. Guard can call approve transfers or remove themselves. The standard includes an optional expires field for time-limited guard assignments. Works with soulbound tokens for permanent non-transferability."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-6147","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-6147","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-6147","markdown":"https://www.eipsfordesigners.com/standards/ERC-6147/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-6147/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-6147","official":"https://eips.ethereum.org/EIPS/eip-6147","discussion":"https://ethereum-magicians.org/search?q=ERC-6147"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}