{"id":"ERC-5528","name":"Refundable Fungible Token","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":"Token sales use escrow with built-in refund mechanism — funds locked until conditions met, buyers protected from rugpulls. Design implications: show escrow status (Funded/Running/Success/Failed), display refund eligibility, visualize lock period timeline. Design decisions: how much escrow complexity to expose — show full state machine or simplified status, balance transparency with cognitive load.","hasDetailedContent":true,"content":{"id":"ERC-5528","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5528","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Token sales use escrow with built-in refund mechanism — funds locked until conditions met, buyers protected from rugpulls.","designerTakeaways":["You can show escrow status as a simple progress bar: Funded → Running → Success or Refund.","Your contributor view can display locked amount with expected release or refund date.","You can explain failed sales with a clear Your refund is available CTA instead of raw revert text."],"applicability":{"whenToUse":["Token launches use on-chain escrow with conditional release.","Buyers need protection when sale outcome is uncertain.","Your UI surfaces crowd-sale or IDO participation."],"whenToAvoid":["Direct swap or AMM purchases with no escrow phase.","Sale contracts do not implement ERC-5528.","Users only hold tokens post-settlement with no escrow period."]},"prototypeFirst":[{"screen":"Sale escrow dashboard","why":"Contributors check status repeatedly during a live sale.","covers":["Funded","Running","Cap reached"],"include":["Status pill","Locked amount","Timeline","Your contribution row"]},{"screen":"Failed sale refund","why":"The refund moment is when trust is won or lost.","covers":["Failed state","Refund available","Refund claimed"],"include":["Plain-language failure reason","Claim refund CTA","Amount returned"]},{"screen":"Successful settlement","why":"Users must see tokens received and escrow released.","covers":["Success","Token delivery","Escrow closed"],"include":["Tokens received summary","Escrow released badge","Explorer link"]},{"screen":"Contribution during lock","why":"New buyers need to understand funds are not immediately spendable.","covers":["Active lock","Cannot withdraw early"],"include":["Funds held securely copy","Release conditions","No panic empty-wallet state"]}],"mentalModel":[{"label":"Contribution","description":"User sends funds into escrow — they do not own tokens yet, they own a claim."},{"label":"Escrow lock","description":"Funds stay in the contract until success conditions or failure triggers refund."},{"label":"Success path","description":"Sale completes → tokens mint or transfer → escrow releases to project."},{"label":"Failure path","description":"Conditions unmet → contributors reclaim full contribution from escrow."},{"label":"State machine","description":"Funded, Running, Success, Failed are user-visible milestones, not internal enum names."}],"statesToDesign":[{"state":"Escrow funded — sale open","trigger":"User contributed; sale still accepting.","userNeed":"Know funds are locked but safe.","designResponse":"Show locked amount with Running status and sale end time."},{"state":"Awaiting outcome","trigger":"Sale closed; settlement pending.","userNeed":"Understand nothing is lost during processing.","designResponse":"Processing status with expected resolution window."},{"state":"Success — tokens received","trigger":"Sale succeeded.","userNeed":"See tokens and closed escrow.","designResponse":"Success card with token balance and escrow released note."},{"state":"Failed — refund available","trigger":"Sale failed conditions.","userNeed":"Get money back quickly and clearly.","designResponse":"Failed badge with Claim refund CTA and full amount."},{"state":"Refund claimed","trigger":"User reclaimed escrow.","userNeed":"Confirm funds returned.","designResponse":"Completed refund receipt with amount and timestamp."}],"designDecisions":[{"question":"How much escrow complexity to expose?","recommendation":"Show simplified four-state timeline; tuck contract addresses behind advanced.","rationale":"Contributors need confidence, not Solidity architecture."},{"question":"Should locked funds appear in wallet balance?","recommendation":"Show separate Escrowed line item, not merged with spendable balance.","rationale":"Merged balances cause panic sends and support tickets."},{"question":"How to communicate failed sales?","recommendation":"Lead with You get a full refund, then explain why the sale failed.","rationale":"Money-back clarity reduces FUD faster than technical reasons."}],"problemsSolved":[{"problem":"Token sale rug pulls","oldWay":"Funds sent directly to team wallet with no recourse","newWay":"Escrow holds funds until verifiable success conditions","impact":"critical"},{"problem":"Users think contributed ETH disappeared","oldWay":"Wallet shows lower balance with no explanation","newWay":"Escrowed amount labeled with status and release path","impact":"high"},{"problem":"Failed launches leave contributors stranded","oldWay":"Manual refunds or social pressure on team","newWay":"Automatic on-chain refund path when sale fails","impact":"high"}],"uxPatterns":[{"name":"Escrow Status Timeline","description":"Visual Funded → Running → Success/Failed progression.","mockup":"concept/verify-safety","components":["StatusTimeline","ContributionCard","LockAmount"],"userFlow":["User contributes","Timeline updates","Outcome resolves","Tokens or refund shown"]},{"name":"Claim Refund Flow","description":"One-tap refund when sale fails.","mockup":"concept/nft-gallery","components":["FailedBanner","RefundCTA","ReceiptModal"],"userFlow":["Sale fails","User sees refund available","Claims","Balance restored"]}],"seenInTheWild":[{"app":"CoinList","url":"https://coinlist.co/","note":"Token sale escrow patterns set user expectations for locked contributions."},{"app":"Fjord Foundry","url":"https://fjordfoundry.com/","note":"Fair launch interfaces show contribution and settlement states."},{"app":"ENS App","url":"https://app.ens.domains/","note":"Commit-reveal and escrow-adjacent deposit patterns inform timeline UX."},{"app":"Gitcoin","url":"https://gitcoin.co/","note":"Quadratic funding rounds use similar held-funds mental models."}],"antiPatterns":[{"pattern":"Showing zero balance with no escrow explanation","why":"Users assume funds were stolen","instead":"Separate Escrowed row with status and amount","severity":"critical"},{"pattern":"Hiding failed state behind generic transaction error","why":"Contributors cannot find refund path","instead":"Dedicated Failed sale screen with Claim refund","severity":"critical"},{"pattern":"Exposing raw state enum names (FUNDED, RUNNING)","why":"Protocol jargon erodes trust","instead":"Human labels: Sale open, Processing, Complete, Refunded","severity":"high"}],"vocabulary":[{"use":"Funds held safely","avoid":"Locked in escrow contract","why":"Reassurance over smart-contract vocabulary."},{"use":"Claim your refund","avoid":"Trigger refund()","why":"Action-oriented commerce language."},{"use":"Sale succeeded","avoid":"State SUCCESS","why":"Outcome language, not enum values."}],"onMonad":[{"aspect":"Settlement speed","ethereum":"Escrow resolution may take multiple blocks","monad":"Fast finality tightens feedback after sale closes","designImplication":"Prefer inline status updates over long polling modals."},{"aspect":"Contribution cost","ethereum":"Gas may deter small contributions","monad":"Lower fees enable broader participation tiers","designImplication":"Show micro-contribution options without gas warnings."}],"technicalNotes":"ERC-5528 escrow sales use explicit state machine; never merge escrowed funds with wallet spendable balance.","relatedStandards":[{"id":"ERC-5507","relationship":"NFT refund windows complement fungible escrow"},{"id":"ERC-20","relationship":"Fungible tokens sold through escrow mechanism"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5528","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-5528","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-5528","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5528","markdown":"https://www.eipsfordesigners.com/standards/ERC-5528/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5528/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5528","official":"https://eips.ethereum.org/EIPS/erc-5528","discussion":"https://ethereum-magicians.org/search?q=ERC-5528"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}