{"id":"EIP-7994","name":"Purpose Bound Money","status":"Draft","chain":"both","category":{"id":"defi","name":"DeFi Patterns","description":"Vaults, bonds, and financial primitives"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"Users receive tokens locked until multiple conditions are met — time, KYC, whitelist, or custom requirements. Design implications: show all unlock conditions as a checklist, display which conditions are satisfied vs pending, show expiry date if set, indicate claim eligibility clearly, design condition-specific UI (KYC verification link, time countdown). Design decisions: how to handle partially-met conditions, whether to show locked funds in main balance or separate, progressive disclosure of complex condition requirements, notification when all conditions met.","hasDetailedContent":true,"content":{"id":"EIP-7994","summary":"EIP-7994 creates \"purpose-bound money\"—tokens that can only be spent at approved merchants or for specific purposes. Think corporate expense cards, food stamps, or student stipends as tokens. The issuer defines where and how tokens can be used, ensuring funds go exactly where intended. Perfect for grants, benefits programs, corporate expenses, and any scenario requiring spending restrictions.","applicability":{"whenToUse":["Your product addresses: no way to restrict how tokens are spent.","Your product addresses: corporate cards require centralized control.","The flow should deliver: tokens only work at approved merchants/purposes.","Connect flows must list wallets with names, icons, and explicit user choice."],"whenToAvoid":["Always show valid merchants/categories alongside balance.","Pre-check validity, disable payment button if invalid.","Highlight expiring tokens, send notifications.","No token balances, swaps, lending, or yield flows appear in the product."]},"designerTakeaways":["You can design UI that delivers tokens only work at approved merchants/purposes.","You can design UI that delivers on-chain rules enforce spending limits and categories.","You can design UI that delivers smart contract enforces valid merchant list."],"problemsSolved":[{"problem":"No way to restrict how tokens are spent","oldWay":"Send tokens, hope recipient uses them correctly","newWay":"Tokens only work at approved merchants/purposes","impact":"critical"},{"problem":"Corporate cards require centralized control","oldWay":"Visa/corporate card with bank managing restrictions","newWay":"On-chain rules enforce spending limits and categories","impact":"high"},{"problem":"Benefits programs can't ensure proper use","oldWay":"Issue vouchers, verify manually, prone to fraud","newWay":"Smart contract enforces valid merchant list","impact":"high"},{"problem":"Grants require trust or complex escrow","oldWay":"Send grant money, request receipts, manual auditing","newWay":"Tokens only spendable on approved categories","impact":"medium"},{"problem":"Can't combine spending restrictions with expiry","oldWay":"Separate systems for spend categories and time limits","newWay":"Token encodes both: \"Food only, expires Dec 31\"","impact":"medium"}],"uxPatterns":[{"name":"Purpose-Bound Wallet View","description":"Show tokens with their spending restrictions","mockup":"concept/tx-status","userFlow":["User opens wallet","UI separates regular vs purpose-bound tokens","Each restricted token shows its constraints","Expiry and limits displayed clearly","Tap to see valid merchants"]},{"name":"Merchant Payment Flow","description":"Pay with purpose-bound tokens at valid merchant","mockup":"generic/balance-display","userFlow":["User at checkout","UI checks which tokens valid at this merchant","Purpose-bound tokens shown with validity indicator","User selects appropriate token type","Payment succeeds if constraints satisfied"]},{"name":"Invalid Merchant Warning","description":"Clear feedback when tokens can't be used","mockup":"concept/verify-safety","userFlow":["User at non-eligible merchant","Purpose-bound token shown as invalid","Clear explanation of why","Link to find valid merchants","Alternative payment methods highlighted"]},{"name":"Expense Token with Receipt","description":"Corporate expense requiring documentation","mockup":"concept/tx-status","userFlow":["User initiates expense payment","UI shows all requirements","Upload receipt if needed","Verify category and limits","Payment processed with documentation"]}],"uiComponents":[{"name":"PurposeBoundBalance","description":"Token balance with restriction summary","states":["loading","loaded","restricted","expiring-soon"],"props":["amount","symbol","validMerchants","expiresAt","restrictions"]},{"name":"MerchantValidityChecker","description":"Real-time check if token valid at merchant","states":["checking","valid","invalid","unknown"],"props":["tokenId","merchantAddress","category"]},{"name":"SpendingLimitTracker","description":"Show used vs available within limits","states":["available","approaching-limit","at-limit"],"props":["used","limit","period","resetsAt"]},{"name":"MerchantDirectorySearch","description":"Find valid merchants for a token type","states":["searching","results","no-results","loading"],"props":["tokenType","location","categories"]}],"antiPatterns":[{"pattern":"Showing restricted tokens without explaining restrictions","why":"Users confused why payment fails","instead":"Always show valid merchants/categories alongside balance","severity":"critical"},{"pattern":"Letting users attempt invalid payments","why":"Wasted gas and frustrating experience","instead":"Pre-check validity, disable payment button if invalid","severity":"critical"},{"pattern":"Not showing expiry prominently","why":"Users lose tokens they forgot about","instead":"Highlight expiring tokens, send notifications","severity":"high"},{"pattern":"Hiding spending limits until exceeded","why":"Surprise rejections damage trust","instead":"Show limit progress: \"320/500 monthly remaining\"","severity":"high"},{"pattern":"No way to find valid merchants","why":"Users have tokens but don't know where to spend them","instead":"Merchant directory searchable by token type","severity":"medium"}],"onMonad":[{"aspect":"Validity Checking","ethereum":"On-chain validity checks may be slow/expensive","monad":"Fast, cheap checks enable real-time validation","designImplication":"Can check validity as user browses checkout"},{"aspect":"Payment Speed","ethereum":"Purpose-bound payment may take 15+ seconds","monad":"Sub-second finality for instant purchase confirmation","designImplication":"Receipt/confirmation appears immediately"},{"aspect":"Limit Updates","ethereum":"Checking remaining limits may lag","monad":"Real-time limit updates after each purchase","designImplication":"Dashboard shows live spending progress"},{"aspect":"Batch Payments","ethereum":"Multiple items might need separate constraint checks","monad":"Parallel verification for complex carts","designImplication":"Can validate entire cart at once"}],"keyTakeaways":["EIP-7994 = tokens with built-in spending rules","Always show restrictions, valid merchants, and expiry clearly","Pre-validate before attempting payment","Provide merchant discovery for restricted tokens","On Monad: leverage fast finality for instant validity checks"],"technicalNotes":"EIP-7994 defines purpose-bound tokens with isValidTransfer(from, to, amount, purpose) checks. The contract stores valid merchants/categories, spending limits, and expiry. Transfers only succeed if the recipient (merchant) is approved for the token's purpose. Additional metadata can require documentation (receipts) via off-chain attestation."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-7994","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-7994","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-7994","markdown":"https://www.eipsfordesigners.com/standards/EIP-7994/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-7994/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-7994","official":"https://eips.ethereum.org/EIPS/eip-7994","discussion":"https://ethereum-magicians.org/search?q=EIP-7994"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}