diff options
Diffstat (limited to '87.md')
| -rw-r--r-- | 87.md | 142 |
1 files changed, 142 insertions, 0 deletions
| @@ -0,0 +1,142 @@ | |||
| 1 | NIP-87 | ||
| 2 | ====== | ||
| 3 | |||
| 4 | Ecash Mint Discoverability | ||
| 5 | -------------------------------- | ||
| 6 | |||
| 7 | `draft` `optional` | ||
| 8 | |||
| 9 | This NIP describes `kind:38173`, `kind:38172` and `kind:38000`: a way to discover ecash mints, their capabilities, and people who recommend them. | ||
| 10 | |||
| 11 | ## Rationale | ||
| 12 | |||
| 13 | Nostr's discoverability and transparent event interaction is one of its most interesting/novel mechanics. | ||
| 14 | This NIP provides a simple way for users to discover ecash mints recommended by other users and to interact with them. | ||
| 15 | |||
| 16 | ### Parties involved | ||
| 17 | |||
| 18 | There are three actors to this workflow: | ||
| 19 | |||
| 20 | * An ecash mint operator, announces their mint and its capabilities. | ||
| 21 | * Publishes `kind:38173` or `kind:38172`, detailing how to connect to it and its capabilities. | ||
| 22 | * user A, who recommends an ecash mint | ||
| 23 | * Publishes `kind:38000` | ||
| 24 | * user B, who seeks a recommendation for an ecash mint | ||
| 25 | * Queries for `kind:38000` and, based on results, queries for `kind:38173`/`kind:38172` | ||
| 26 | |||
| 27 | ## Events | ||
| 28 | |||
| 29 | ### Recommendation event | ||
| 30 | ```json | ||
| 31 | { | ||
| 32 | "kind": 38000, | ||
| 33 | "pubkey": <recommender-user-pubkey>, | ||
| 34 | "tags": [ | ||
| 35 | ["k", "38173"], | ||
| 36 | ["d", "<d-identifier>"], | ||
| 37 | ["u", <recommended-fedimint-invite-code>], | ||
| 38 | ["a", "38173:fedimint-pubkey:<d-identifier>", "wss://relay1"] | ||
| 39 | ], | ||
| 40 | "content": "I trust this mint with my life" | ||
| 41 | } | ||
| 42 | ``` | ||
| 43 | |||
| 44 | The recommendation event is a parameterized-replacable event so that a user can change edit their recommendation without creating a new event. | ||
| 45 | |||
| 46 | The `d` tag in `kind:38000` is the `kind:38173`/`kind:38172` event identifier this event is recommending, if no event exists, the `d` tag can still be calculated from the mint's pubkey/id. | ||
| 47 | The `k` tag is the kind number that corresponds to the event kind that the user is recommending, in this case `kind:38173` for fedimints and `kind:38172` for cashu mints. | ||
| 48 | |||
| 49 | Optional `u` tags can be added to give a recommend way to connect to the mint. | ||
| 50 | The value of the tag is the URL or invite code of the ecash mint. | ||
| 51 | Multiple `u` tags can appear on the same `kind:38000`. | ||
| 52 | |||
| 53 | `a` tags are used to point to the `kind:38173`/`kind:38172` event of the ecash mint. | ||
| 54 | The first value of the tag is the `kind:38173`/`kind:38172` event identifier, the second value of the tag is a relay hint. | ||
| 55 | This is used to correctly point to the mint's `kind:38173`/`kind:38172` event in case there are duplicates claiming to be the same mint. | ||
| 56 | |||
| 57 | The content can be used to give a review. | ||
| 58 | |||
| 59 | ## Ecash Mint Information | ||
| 60 | |||
| 61 | Cashu mints SHOULD publish `kind:38172` events to announce their capabilities and how to connect to them. | ||
| 62 | |||
| 63 | For cashu mints, the `u` tag SHOULD be the URL to the cashu mint and it should list the nuts that the cashu mint supports. | ||
| 64 | |||
| 65 | The `d` tag SHOULD be the mint's pubkey (found when querying `/v1/info`), this way users can query by pubkey and find the mint announcement. | ||
| 66 | |||
| 67 | An `n` tag SHOULD be added to signify the network the cashu mint is on (either `mainnet`, `testnet`, `signet`, or `regtest`) | ||
| 68 | |||
| 69 | ```json | ||
| 70 | { | ||
| 71 | "kind": 38172, | ||
| 72 | "pubkey": "<application-pubkey>", | ||
| 73 | "content": "<optional-kind:0-style-metadata>", | ||
| 74 | "tags": [ | ||
| 75 | ["d", <cashu mint pubkey>], | ||
| 76 | ["u", "https://cashu.example.com"], | ||
| 77 | ["nuts", "1,2,3,4,5,6,7"], | ||
| 78 | ["n", "mainnet"] | ||
| 79 | ] | ||
| 80 | } | ||
| 81 | ``` | ||
| 82 | |||
| 83 | Fedimints SHOULD publish `kind:38173` events to announce their capabilities and how to connect to them. | ||
| 84 | |||
| 85 | For fedimints, it should list all known fedimint invite codes in `u` tags and it should list the modules it supports. | ||
| 86 | |||
| 87 | The `d` tag SHOULD be the federation id, this way users can query by federation id and find the fedimint announcement. | ||
| 88 | |||
| 89 | An `n` tag SHOULD be added to signify the network the fedimint is on (either `mainnet`, `testnet`, `signet`, or `regtest`) | ||
| 90 | |||
| 91 | ```json | ||
| 92 | { | ||
| 93 | "kind": 38173, | ||
| 94 | "pubkey": "<application-pubkey>", | ||
| 95 | "content": "<optional-kind:0-style-metadata>", | ||
| 96 | "tags": [ | ||
| 97 | ["d", <federation-id>], | ||
| 98 | ["u", "fed11abc.."], | ||
| 99 | ["u", "fed11xyz.."], | ||
| 100 | ["modules", "lightning,wallet,mint"], | ||
| 101 | ["n", "signet"] | ||
| 102 | ] | ||
| 103 | } | ||
| 104 | ``` | ||
| 105 | |||
| 106 | * `content` is an optional `metadata`-like stringified JSON object, as described in NIP-01. This content is useful when the pubkey creating the `kind:38173` is not a normal user. If `content` is empty, the `kind:0` of the pubkey should be used to display mint information (e.g. name, picture, web, LUD16, etc.) | ||
| 107 | |||
| 108 | ## Example | ||
| 109 | |||
| 110 | ### User A recommends some mints | ||
| 111 | User A might be a user of a cashu mint. Using a client, user A publishes an event recommending the cashu mint they use. | ||
| 112 | |||
| 113 | ```json | ||
| 114 | { | ||
| 115 | "kind": 38000, | ||
| 116 | "tags": [ | ||
| 117 | ["u", "fed11abc..", "fedimint"], | ||
| 118 | ["u", "https://cashu.example.com", "cashu"], | ||
| 119 | ["a", "38173:fedimint-pubkey:<d-identifier>", "wss://relay1", "fedimint"], | ||
| 120 | ["a", "38172:cashu-mint-pubkey:<d-identifier>", "wss://relay2", "cashu"] | ||
| 121 | ], | ||
| 122 | ... | ||
| 123 | } | ||
| 124 | ``` | ||
| 125 | |||
| 126 | ### User B finds a mint | ||
| 127 | User B wants to use an ecash wallet, they need to find a mint. | ||
| 128 | |||
| 129 | User B's wallet client queries for `kind:38000` events, looking for recommendations for ecash mints. | ||
| 130 | |||
| 131 | ```json | ||
| 132 | ["REQ", <id>, [{ "kinds": [38000], "authors": [<user>, <users-contact-list>], "#k": ["38173"] }]] | ||
| 133 | ``` | ||
| 134 | |||
| 135 | User B, who follows User A, sees that `kind:38000` event and tries to connect to the corresponding mints. | ||
| 136 | |||
| 137 | ### Alternative query bypassing `kind:38000` | ||
| 138 | Alternatively, users might choose to query directly for `kind:38173` for an event kind. Clients SHOULD be careful doing this and use spam-prevention mechanisms or querying high-quality restricted relays to avoid directing users to malicious handlers. | ||
| 139 | |||
| 140 | ```json | ||
| 141 | ["REQ", <id>, [{ "kinds": [38173], "authors": [...] }]] | ||
| 142 | ``` | ||