diff --git a/CIP-0013/CIP-0013.md b/CIP-0013/CIP-0013.md index a3ea112d7..dfb4b035d 100644 --- a/CIP-0013/CIP-0013.md +++ b/CIP-0013/CIP-0013.md @@ -1,27 +1,43 @@ --- CIP: 13 Title: Cardano URI Scheme -Authors: Sebastien Guillemot , Vicente Almonacid +Authors: Sebastien Guillemot , Vicente Almonacid , Robert Phair Comments-URI: - https://github.com/Emurgo/EmIPs/pull/2 - https://forum.cardano.org/t/cip-cardano-payment-uri-scheme/41457 +- https://github.com/cardano-foundation/CIPs/pull/25 +- https://github.com/cardano-foundation/CIPs/pull/61 +- https://forum.cardano.org/t/cip-stake-uri-scheme-for-pools-delegation-portfolios/40594 Status: Draft Type: Informational -Created: 2020-10-20 +Created: 2020-09-22 License: CC-BY-4.0 --- # Abstract -This proposal describes a basic URI scheme to handle ADA transfers, as well -as possible approaches for a multiplatform implementation. +This proposal describes a basic URI scheme to handle Ada transfers and links to stake pools. # Motivation +#### For payment URIs: + Users who create community content often want donations as a financial incentive. However, forcing users to open their wallet and copy-paste an address lowers the amount of people likely to send tokens (especially if they have to sync their wallet first). If donating was as simple as clicking a link that opens a light wallet with pre-populated fields, users may be more willing to send tokens. URI schemes would enable users to easily make payments by simply clicking links on webpages or scanning QR Codes. +#### For stake pool URIs: + +Centralised sources of information have led a growing amount of stake to be disproportionately assigned to pools pushed near & beyond the saturation point. + +Stake pool URIs will provide an additional means for small pools to acquire delegation and maintain stability, supporting diversity and possibly fault-tolerance in the Cardano network through a more even distribution of stake. + +Interfaces that connect delegators with pools beyond the highly contested top choices of the in-wallet ranking algorithms are important to avoid saturation and maintain decentralization. + +Larger pools and collectives can also use these URIs to link to a family of pools they own to avoid any one of their pools becoming saturated. + +Pool links allow for interfaces to initiate delegation transactions without requiring any code modifications to the wallets themselves. + # Specification The core implementation should follow the [BIP-21](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki) standard (with `bitcoin:` replaced with `web+cardano:`) @@ -30,9 +46,11 @@ Rationale: - Use `cardano:` over `ada:` as other projects that implement this standard tend to take the project name over the currency name (this makes sense if we consider this protocol as a generic way for interacting with the blockchain through wallets - as opposed to a simple payment system) - Many wallets support multiple currencies. Following the same standard will ensure higher adoption of our protocol. -Example: +Examples: ``` Donate +Stake with us +Choose our least saturated pool ``` ## Considerations @@ -43,20 +61,49 @@ Example: ## ABNF Grammar (Proposal) -This is an initial, simplified protocol definition for fast implementation; it only requires an address and an optional amount parameter. As discussed above, these rules are likely to evolve in time in order to support additional features, including unique capabilities of the Cardano blockchain. +This is an initial, simplified protocol definition for fast implementation; it only requires: + +* for a payment URI (authority unspecified), an address and an optional amount parameter; +* for a stake pool URI (authority = `stake`), a single stake pool reference. + +As discussed above, these rules are likely to evolve in time in order to support additional features, including multiple stake pool references (in proportions defining a "portfolio") and other unique capabilities of the Cardano blockchain. ``` -cardanourn = "web+cardano:" cardanoaddress [ "?" amountparam ] +cardanourn = "web+cardano:" (paymentref | stakepoolref) + +paymentref = cardanoaddress [ "?" amountparam ] cardanoaddress = *(base58 | bech32) -amountparam = "amount=" *digit [ "." *digit ] +amountparam = "amount=" *digit [ "." *digit ] + +stakepoolref = "//stake?" stakepool +stakepool = poolhexid | poolticker +poolhexid = 56HEXDIG +poolticker = 3*5UNICODE ``` +### Payment URI queries + The amount parameter must follow the [same rules](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki#transfer-amountsize) described in BIP-21, namely, it must be specified in decimal ADA, without commas and using the period (.) decimal separator. +### Stake pool URI queries + +For brevity, essential in many Internet contexts, `poolticker` must be supported here in addition to the unambiguous `poolhexid`. + +When there is more than one pool registered with the specified `poolTicker` (whether for pool groups which have the same ticker for all pools, or for separate pools using the same ticker), the choice to which pool to finally delegate is left to the user through the wallet UI. + +### Handling stake pool links + +The wallet UI should always confirm the exact delegation choice even when it is unambiguous from the URI. When the user has multiple wallets, the wallet UI must select which wallet(s) the user will be delegating from. + +These yet unsupported parameters in the URI query string should (by preference of the wallet UI designers) *either* be ignored *or* generate a warning message, to avoid leading the user to believe they are implementing a currently unsupported but perhaps popularly referenced multi-pool delegation list: + +* any value for the first URI query argument; +* any URI query argument beyond the first. + ## Security Considerations -1. We cannot prompt the user to send the funds right away as they may not be fully aware of the URI they clicked or were redirected to. Instead, it may be better to simply pre-populate fields in a transaction. -2. We should be wary of people who disguise “donate” links as actually opening up a phishing website that LOOKS like a wallet. +1. For payment links, we cannot prompt the user to send the funds right away as they may not be fully aware of the URI they clicked or were redirected to. Instead, it may be better to simply pre-populate fields in a transaction. +2. For either payment or staking links, we should be wary of people who disguise links as actually opening up a phishing website that LOOKS like that corresponding part of the wallet UI. # Rationale @@ -75,3 +122,7 @@ https://developer.android.com/training/app-links/deep-linking#adding-filters https://facebook.github.io/react-native/docs/linking.html https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app + +https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form + +https://tools.ietf.org/html/draft-seantek-unicode-in-abnf-00