{"id":"ERC-1363","name":"Payable Token","status":"Final","chain":"both","category":{"id":"transaction-friction","name":"Transaction Friction","description":"Reducing clicks, signatures, and mental overhead"},"journeyStages":[{"id":"executing","name":"Executing Transactions","description":"Performing on-chain actions"},{"id":"gas","name":"Gas & Fees","description":"Paying for transactions"}],"uxImpact":"Tokens can trigger contract actions on receipt — transfer+action in one transaction instead of approve+transferFrom pattern. Design implications: show single-step payment flows ('Pay 100 USDC' vs 'Approve then Pay'), indicate when tokens support payable callbacks, simplify subscription/purchase UIs. Design decisions: less widely adopted than permit — decide whether to feature-detect and adapt UI, balance simplicity gains against explaining why some tokens have different flows. Directly addresses the Redundant Token Approvals pain point (High severity) — ERC-20's separate approve+call is where most first-time DeFi users abandon. ERC-1363 eliminates that two-step flow at the token standard level.","hasDetailedContent":true,"content":{"id":"ERC-1363","summary":"ERC-1363 creates \"payable tokens\" that trigger automatic callbacks when transferred. Send tokens and the receiving contract automatically executes code - enabling one-step payments where \"pay\" and \"deliver service\" happen atomically.","applicability":{"whenToUse":["Your product addresses: payment and service delivery require two steps.","Your product addresses: approve + transferFrom requires two transactions.","The flow should deliver: token transfer automatically triggers service callback.","You are designing a one-click purchase experience with visible states and recovery paths."],"whenToAvoid":["Use transferAndCall or approveAndCall for single-tx flow.","Ensure callbacks always succeed or revert entire transaction.","Check msg.sender is the token contract in onTransferReceived.","The flow is a single low-risk transfer where batching adds confusion."]},"designerTakeaways":["You can design UI that delivers token transfer automatically triggers service callback.","You can design UI that delivers transferAndCall sends tokens and triggers action in one transaction.","You can design UI that delivers receive callback with payment context."],"problemsSolved":[{"problem":"Payment and service delivery require two steps","oldWay":"User sends tokens, then separately triggers service (two transactions)","newWay":"Token transfer automatically triggers service callback","impact":"critical"},{"problem":"Approve + transferFrom requires two transactions","oldWay":"Approve contract to spend tokens, then call contract to pull tokens","newWay":"transferAndCall sends tokens and triggers action in one transaction","impact":"high"},{"problem":"Payment contracts need complex state tracking","oldWay":"Track who approved, pull payments on demand, handle edge cases","newWay":"Receive callback with payment context, process immediately","impact":"high"},{"problem":"Users can approve but never complete purchase","oldWay":"Approval sits unused, confusing for users and contracts","newWay":"Atomic transfer means payment = action, no orphaned approvals","impact":"medium"},{"problem":"Can't include payment context with transfer","oldWay":"Transfer tokens, then separately communicate what it's for","newWay":"Include data parameter with transfer for context","impact":"medium"}],"uxPatterns":[{"name":"One-Click Purchase","description":"Buy item with single token transfer","mockup":"concept/bundled-defi","userFlow":["User views item for sale","Clicks \"Buy Now\"","Wallet prompts to send 500 GAME","User confirms","Token transferred AND item received in one tx","Success: item appears in inventory"]},{"name":"Subscription Activation","description":"Pay subscription and activate in one step","mockup":"concept/tx-status","userFlow":["User selects subscription tier","Clicks \"Pay & Activate\"","Token transfer includes subscription data","Contract receives tokens + callback","Subscription activated immediately","User gains premium access instantly"]},{"name":"Crowdfund Contribution","description":"Contribute to crowdfund with automatic reward tracking","mockup":"concept/nft-gallery","userFlow":["User enters contribution amount","UI shows reward tier earned","User clicks Contribute","Tokens transferred with backer data","Contract mints backer NFT in callback","User receives NFT + contribution recorded"]},{"name":"Token-Gated Access","description":"Pay entry fee and gain access atomically","mockup":"concept/bundled-defi","userFlow":["User views community details","Clicks \"Pay & Get Access\"","Token transfer includes user address","Contract receives payment","Callback whitelists user address","User has immediate access"]}],"uiComponents":[{"name":"PayableTokenButton","description":"Single-click payment button using transferAndCall","states":["ready","confirming","processing","success","error"],"props":["amount","token","recipient","callData","onSuccess"]},{"name":"AtomicPurchaseCard","description":"Product card with one-click purchase","states":["available","purchasing","owned","sold-out"],"props":["item","price","tokenSymbol","onPurchase"]},{"name":"TransferWithDataForm","description":"Form for transfers with attached data","states":["editing","reviewing","sending","complete"],"props":["recipient","amount","dataFields[]","onSubmit"]},{"name":"CallbackStatusIndicator","description":"Shows if transfer callback succeeded","states":["pending","callback-executing","success","callback-failed"],"props":["transferHash","callbackResult","error"]},{"name":"InstantActivationBadge","description":"Indicates feature uses instant activation","states":["default","highlighted"],"props":["featureName","tooltip"]}],"antiPatterns":[{"pattern":"Still requiring approve + action for ERC-1363 tokens","why":"Defeats the purpose, users still need two transactions","instead":"Use transferAndCall or approveAndCall for single-tx flow","severity":"critical"},{"pattern":"Not handling callback failure gracefully","why":"Transfer succeeds but callback fails = confusing state","instead":"Ensure callbacks always succeed or revert entire transaction","severity":"critical"},{"pattern":"Not explaining the one-click benefit","why":"Users don't know they're getting better UX","instead":"Show \"✓ No approval needed\" or \"One transaction\"","severity":"medium"},{"pattern":"Using transferAndCall without validating caller","why":"Anyone can call your callback with arbitrary data","instead":"Check msg.sender is the token contract in onTransferReceived","severity":"critical"},{"pattern":"Complex callback logic that might fail","why":"Failed callback means lost funds or stuck state","instead":"Keep callbacks simple, validate inputs, handle edge cases","severity":"high"},{"pattern":"Not showing what callback will do","why":"Users don't understand what happens after transfer","instead":"Explain \"Pay and receive [item]\" or \"Pay and activate [service]\"","severity":"medium"}],"onMonad":[{"aspect":"Callback Execution","ethereum":"Callback in same tx means all-or-nothing, which can timeout","monad":"Fast execution means callbacks complete quickly","designImplication":"More complex callbacks are viable on Monad"},{"aspect":"Gas for Callbacks","ethereum":"Complex callbacks can hit gas limits","monad":"Higher throughput means less concern about callback gas","designImplication":"Can do more in onTransferReceived callback"},{"aspect":"Confirmation Speed","ethereum":"Pay-and-activate feels slow (12+ second blocks)","monad":"Sub-second finality makes instant activation feel truly instant","designImplication":"Emphasize \"instant\" activation in UI copy"},{"aspect":"Reserve Balance","ethereum":"Can spend entire balance on transfer","monad":"10 MON reserve for async execution safety; guaranteed balance floor for callbacks","designImplication":"Show \"spendable\" balance when using payable tokens"}],"keyTakeaways":["ERC-1363 = pay and execute in one transaction","Use for purchases, subscriptions, access control","Show users the one-click benefit (\"No approval needed\")","Validate token caller in callbacks for security","Keep callbacks simple to prevent failed transactions"],"technicalNotes":"ERC-1363 extends ERC-20 with transferAndCall, transferFromAndCall, approveAndCall. Receivers implement IERC1363Receiver with onTransferReceived(operator, from, value, data). Spenders implement IERC1363Spender with onApprovalReceived(owner, value, data). Must return magic bytes4 to confirm callback handled successfully."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-1363","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-1363","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-1363","markdown":"https://www.eipsfordesigners.com/standards/ERC-1363/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-1363/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-1363","official":"https://eips.ethereum.org/EIPS/eip-1363","discussion":"https://ethereum-magicians.org/search?q=ERC-1363"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}