{"id":"ERC-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":"ERC-681 defines an ethereum: transaction-request URI grammar. Compatible wallets may parse and prefill editable fields, but scanning, deep links, chain_id, and parameter support are implementation-specific; show parsed values and network confirmation.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-681","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","hasDetailedContent":true,"content":{"id":"ERC-681","summary":"ERC-681 defines a URI grammar for transaction requests that a compatible wallet may parse into editable payment or contract-call fields. It can carry a recipient, optional chain_id, amount, and function parameters, but the format does not require wallets to scan, deep-link, or support every parameter.","applicability":{"whenToUse":["Payment or contract-call links can reduce manual entry when the selected wallet supports the URI fields.","The UI can show and let users review the parsed recipient, amount, token, and chain.","The flow has an explicit fallback for wallets that do not scan, deep-link, or parse every field."],"whenToAvoid":["The wallet cannot parse ERC-681 or the required deep-link transport.","The recipient, amount, or target chain requires a server-authorized request instead of editable URI parameters.","The app cannot provide an explicit review and fallback when a URI is only partially parsed."]},"designerTakeaways":["Show the URI's recipient, amount, token, and target chain beside the QR or link.","Let users review and edit parsed values before signing.","Detect partial parsing and provide an explicit network or wallet fallback."],"problemsSolved":[{"problem":"Manual entry of payment details is error-prone","oldWay":"Copy address, type amount, hope you got it right","newWay":"A compatible wallet may parse and prefill the payment request for user review","impact":"critical"},{"problem":"No standard for payment links","oldWay":"Every platform different payment format","newWay":"A shared ethereum: grammar can be supported by wallets that implement the relevant URI fields","impact":"high"},{"problem":"Can't share complex payment requests","oldWay":"Explain: \"send 100 USDC to this address on Polygon...\"","newWay":"One URI can carry request details, while the wallet still validates and lets the user edit them","impact":"high"}],"uxPatterns":[{"name":"Payment QR Code","description":"Scannable payment request","mockup":"concept/physical-link","userFlow":["Merchant creates payment request","System generates ERC-681 URI","Displays as QR code","Customer scans with wallet","Compatible wallet parses and may prefill 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","Compatible wallet opens with parsed values when supported","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"}],"keyTakeaways":["ERC-681 defines a transaction-request URI grammar, not a guaranteed wallet handoff.","Show and let users review the recipient, amount, token, and target network.","Treat chain_id and function parameters as optional, editable request data.","Feature-detect scanning, deep links, and supported fields.","Provide a manual or direct-wallet fallback when parsing is incomplete."],"technicalNotes":"ERC-681 defines ethereum:address[@chain_id][/function]?[parameters]. value, gas, gasPrice, and function arguments are URI parameters that a compatible wallet may parse; chain_id is optional. The URI does not mandate scanning, deep links, field support, or immutable values. Show the parsed request and let the wallet/user review the final transaction.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-681 official specification","url":"https://ercs.ethereum.org/ERCS/erc-681","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-681","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-681","type":"discussion"},{"label":"ERC-681 official specification","url":"https://ercs.ethereum.org/ERCS/erc-681","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-681","markdown":"https://www.eipsfordesigners.com/standards/ERC-681/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-681/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-681","official":"https://ercs.ethereum.org/ERCS/erc-681","discussion":"https://ethereum-magicians.org/search?q=ERC-681"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}