{"id":"EIP-681","name":"URL Format for Transaction Requests","status":"Final","chain":"both","category":{"id":"onboarding","name":"Onboarding & Access","description":"Getting users into web3 without friction"},"journeyStages":[{"id":"discovery","name":"Discovery & Connection","description":"Finding and connecting wallet to dApp"}],"uxImpact":"Payment requests encoded as ethereum: URLs work like bitcoin: links — scannable QR codes or clickable links trigger wallet payment flows. Design implications: generate QR codes for payment requests with pre-filled recipient, amount, and token type; support ENS names alongside hex addresses; use scientific notation (2.014e18) for human-readable amounts; design chain_id switching prompts when payment targets different network. Design decisions: decide whether to make gas parameters user-editable or hidden, handle token transfers (ERC-20 function calls) vs native ETH differently in UI, design validation for malformed URLs, consider showing fiat equivalents alongside crypto amounts.","hasDetailedContent":true,"content":{"id":"EIP-681","summary":"EIP-681 defines payment URLs and QR codes. Turn \"Send 0.1 ETH to 0x7a3...\" into a scannable QR code or clickable link. When scanned, the wallet auto-fills recipient, amount, and even contract calls. Perfect for point-of-sale payments, invoices, and donation buttons.","applicability":{"whenToUse":["Your product addresses: manual entry of payment details is error-prone.","Your product addresses: no standard for payment links.","The flow should deliver: scan QR, everything pre-filled.","You are designing a payment qr code experience with visible states and recovery paths."],"whenToAvoid":["Include chain_id parameter.","Show amount, recipient alongside QR.","Use stablecoin or calculate at scan time.","Wallet or chain support is fixed and users cannot choose providers."]},"designerTakeaways":["You can design UI that delivers scan QR, everything pre-filled.","You can design UI that delivers ethereum: URI format works everywhere.","You can design UI that delivers one QR code contains all details."],"problemsSolved":[{"problem":"Manual entry of payment details is error-prone","oldWay":"Copy address, type amount, hope you got it right","newWay":"Scan QR, everything pre-filled","impact":"critical"},{"problem":"No standard for payment links","oldWay":"Every platform different payment format","newWay":"ethereum: URI format works everywhere","impact":"high"},{"problem":"Can't share complex payment requests","oldWay":"Explain: \"send 100 USDC to this address on Polygon...\"","newWay":"One QR code contains all details","impact":"high"}],"uxPatterns":[{"name":"Payment QR Code","description":"Scannable payment request","mockup":"concept/physical-link","userFlow":["Merchant creates payment request","System generates EIP-681 URI","Displays as QR code","Customer scans with wallet","Wallet auto-fills payment"]},{"name":"Donate Button","description":"One-click donation with pre-filled amount","mockup":"concept/one-click-swap","userFlow":["User clicks donation amount","Link contains ethereum: URI","Wallet opens with amount filled","User confirms payment","Donation complete"]}],"uiComponents":[{"name":"PaymentQRGenerator","description":"Creates QR code from payment details","states":["generating","ready","error"],"props":["recipient","amount","token","chainId","memo"]},{"name":"PaymentLinkButton","description":"Button that opens wallet with payment","states":["idle","clicked","no-wallet"],"props":["uri","label","amount"]},{"name":"URIDisplay","description":"Shows raw ethereum: URI with copy","states":["visible","copied"],"props":["uri","onCopy"]}],"antiPatterns":[{"pattern":"QR codes without human-readable details","why":"User can't verify before scanning","instead":"Show amount, recipient alongside QR","severity":"high"},{"pattern":"Not specifying chain in multi-chain apps","why":"Payment goes to wrong network","instead":"Include chain_id parameter","severity":"critical"},{"pattern":"Hardcoded USD values in ETH","why":"ETH price changes, $10 becomes $8","instead":"Use stablecoin or calculate at scan time","severity":"medium"}],"onMonad":[{"aspect":"Payment Confirmation","ethereum":"Scan → pay → wait 12+ seconds","monad":"Instant confirmation after payment","designImplication":"Can show \"Paid ✓\" immediately"}],"keyTakeaways":["EIP-681 = payment QR codes and links","Always show payment details alongside QR","Include chain_id for multi-chain support","Works with any EIP-681 compatible wallet","Great for point-of-sale and donations"],"technicalNotes":"EIP-681 format: ethereum:address[@chain_id][/function]?[parameters]. Parameters: value (in wei), gas, gasPrice, and arbitrary function params. Examples: ethereum:0x7a3...?value=1e17 for 0.1 ETH, ethereum:0x7a3.../transfer?address=0x&uint256=1e18 for ERC-20 transfer. Most wallets support scanning or deep linking."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-681","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-681","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-681","markdown":"https://www.eipsfordesigners.com/standards/EIP-681/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-681/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-681","official":"https://eips.ethereum.org/EIPS/eip-681","discussion":"https://ethereum-magicians.org/search?q=EIP-681"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}