~ DC Posch and Nalin, thanks to Austin Griffith for working with us on the initial idea.
This is currently a working draft, we would appreciate comments and feedback.
Our goal is to create a shared standard for payment requests on Ethereum. This supports a range of related use cases including online checkout, point-of-sale, and P2P payment requests.
Desired attributes:
We use a single domain that is community owned and managed for mobile deeplinks.
💡 We bought
eth.pro
for this purpose and could buyethpay.org
. Open to other ideas.
To support EthPay, a wallet app will add this domain as a valid deeplink domain and make a PR to a shared open source repository be added as a valid deeplink destination. Web wallets are also supported.
When a user taps an EthPay link anywhere, there are three possibilities:
Specify Rainbow as the recommended wallet. If the user has no wallet installed, the fallback webpage shows Rainbow first. (EthPay links are neutral, so by default no wallet is prioritized.)
Specify a callback. Once payment is sent, the wallet links back to myapp://payment-done?txhash=...
or myapp://payment-done?ophash=...
Simple URL standard using similar building blocks as EIP-681.
https://<domain>/<intent>/<recipient>/<chain>?token=<...>&amount=<...>
…with additional, optional query parameters.
Wallet MUST prefill recipient, chain, token, and amount. The user should be able to complete payment immediately without re-entering information.
Wallet MUST parse amount as exact decimals. Also, wallet MUST show an error if the amount specifies more decimal digits than the token decimals()
.
Wallet SHOULD redirect back immediately on transaction or userop success, without waiting for the transaction or userop to be confirmed in a block. This minimizes user-felt latency.
When resolving ENS, wallet MUST respect per-chain addresses, if present. For example, usdc.tkn.eth points to separate token addresses on each chain.