diff options
| author | Semisol <45574030+Semisol@users.noreply.github.com> | 2023-11-19 01:45:41 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-19 01:45:41 +0100 |
| commit | da19c078ab892b578a5c35968443205c9e8ac27f (patch) | |
| tree | 17a9f4f3105acdae234d3bc67e42571aed261fa2 /57.md | |
| parent | 4d709d1804de45bab3739ce814d4b0c0b211c273 (diff) | |
| parent | 5dcfe85306434f21ecb1e7a47edd92b2e3e64f9a (diff) | |
Merge branch 'master' into clarify-json-serialization
Diffstat (limited to '57.md')
| -rw-r--r-- | 57.md | 24 |
1 files changed, 14 insertions, 10 deletions
| @@ -4,7 +4,7 @@ NIP-57 | |||
| 4 | Lightning Zaps | 4 | Lightning Zaps |
| 5 | -------------- | 5 | -------------- |
| 6 | 6 | ||
| 7 | `draft` `optional` `author:jb55` `author:kieran` | 7 | `draft` `optional` |
| 8 | 8 | ||
| 9 | This NIP defines two new event types for recording lightning payments between users. `9734` is a `zap request`, representing a payer's request to a recipient's lightning wallet for an invoice. `9735` is a `zap receipt`, representing the confirmation by the recipient's lightning wallet that the invoice issued in response to a `zap request` has been paid. | 9 | This NIP defines two new event types for recording lightning payments between users. `9734` is a `zap request`, representing a payer's request to a recipient's lightning wallet for an invoice. `9735` is a `zap receipt`, representing the confirmation by the recipient's lightning wallet that the invoice issued in response to a `zap request` has been paid. |
| 10 | 10 | ||
| @@ -45,7 +45,7 @@ Example: | |||
| 45 | "kind": 9734, | 45 | "kind": 9734, |
| 46 | "content": "Zap!", | 46 | "content": "Zap!", |
| 47 | "tags": [ | 47 | "tags": [ |
| 48 | ["relays", "wss://nostr-pub.wellorder.com"], | 48 | ["relays", "wss://nostr-pub.wellorder.com", "wss://anotherrelay.example.com"], |
| 49 | ["amount", "21000"], | 49 | ["amount", "21000"], |
| 50 | ["lnurl", "lnurl1dp68gurn8ghj7um5v93kketj9ehx2amn9uh8wetvdskkkmn0wahz7mrww4excup0dajx2mrv92x9xp"], | 50 | ["lnurl", "lnurl1dp68gurn8ghj7um5v93kketj9ehx2amn9uh8wetvdskkkmn0wahz7mrww4excup0dajx2mrv92x9xp"], |
| 51 | ["p", "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9"], | 51 | ["p", "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9"], |
| @@ -66,7 +66,7 @@ A signed `zap request` event is not published, but is instead sent using a HTTP | |||
| 66 | - `nostr` is the `9734` `zap request` event, JSON encoded then URI encoded | 66 | - `nostr` is the `9734` `zap request` event, JSON encoded then URI encoded |
| 67 | - `lnurl` is the lnurl pay url of the recipient, encoded using bech32 with the prefix `lnurl` | 67 | - `lnurl` is the lnurl pay url of the recipient, encoded using bech32 with the prefix `lnurl` |
| 68 | 68 | ||
| 69 | This request should return a JSON response with a `pr` key, which is the invoice the sender must pay to finalize his zap. Here is an example flow: | 69 | This request should return a JSON response with a `pr` key, which is the invoice the sender must pay to finalize his zap. Here is an example flow in javascript: |
| 70 | 70 | ||
| 71 | ```javascript | 71 | ```javascript |
| 72 | const senderPubkey // The sender's pubkey | 72 | const senderPubkey // The sender's pubkey |
| @@ -78,7 +78,7 @@ const sats = 21 | |||
| 78 | const amount = sats * 1000 | 78 | const amount = sats * 1000 |
| 79 | const relays = ['wss://nostr-pub.wellorder.net'] | 79 | const relays = ['wss://nostr-pub.wellorder.net'] |
| 80 | const event = encodeURI(JSON.stringify(await signEvent({ | 80 | const event = encodeURI(JSON.stringify(await signEvent({ |
| 81 | kind: [9734], | 81 | kind: 9734, |
| 82 | content: "", | 82 | content: "", |
| 83 | pubkey: senderPubkey, | 83 | pubkey: senderPubkey, |
| 84 | created_at: Math.round(Date.now() / 1000), | 84 | created_at: Math.round(Date.now() / 1000), |
| @@ -126,9 +126,9 @@ When receiving a payment, the following steps are executed: | |||
| 126 | 126 | ||
| 127 | The following should be true of the `zap receipt` event: | 127 | The following should be true of the `zap receipt` event: |
| 128 | 128 | ||
| 129 | - The content SHOULD be empty. | 129 | - The `content` SHOULD be empty. |
| 130 | - The `created_at` date SHOULD be set to the invoice `paid_at` date for idempotency. | 130 | - The `created_at` date SHOULD be set to the invoice `paid_at` date for idempotency. |
| 131 | - `tags` MUST include the `p` tag AND optional `e` tag from the `zap request`. | 131 | - `tags` MUST include the `p` tag AND optional `e` tag from the `zap request` AND optional `a` tag from the `zap request`. |
| 132 | - The `zap receipt` MUST have a `bolt11` tag containing the description hash bolt11 invoice. | 132 | - The `zap receipt` MUST have a `bolt11` tag containing the description hash bolt11 invoice. |
| 133 | - The `zap receipt` MUST contain a `description` tag which is the JSON-encoded invoice description. | 133 | - The `zap receipt` MUST contain a `description` tag which is the JSON-encoded invoice description. |
| 134 | - `SHA256(description)` MUST match the description hash in the bolt11 invoice. | 134 | - `SHA256(description)` MUST match the description hash in the bolt11 invoice. |
| @@ -166,18 +166,22 @@ A client can retrieve `zap receipt`s on events and pubkeys using a NIP-01 filter | |||
| 166 | - The `invoiceAmount` contained in the `bolt11` tag of the `zap receipt` MUST equal the `amount` tag of the `zap request` (if present). | 166 | - The `invoiceAmount` contained in the `bolt11` tag of the `zap receipt` MUST equal the `amount` tag of the `zap request` (if present). |
| 167 | - The `lnurl` tag of the `zap request` (if present) SHOULD equal the recipient's `lnurl`. | 167 | - The `lnurl` tag of the `zap request` (if present) SHOULD equal the recipient's `lnurl`. |
| 168 | 168 | ||
| 169 | ### Appendix G: `zap` tag on zapped event | 169 | ### Appendix G: `zap` tag on other events |
| 170 | 170 | ||
| 171 | When an event includes a `zap` tag, clients SHOULD calculate the lnurl pay request based on its value instead of the profile's field. An optional third argument on the tag specifies the type of value, either `lud06` or `lud16`. | 171 | When an event includes one or more `zap` tags, clients wishing to zap it SHOULD calculate the lnurl pay request based on the tags value instead of the event author's profile field. The tag's second argument is the `hex` string of the receiver's pub key and the third argument is the relay to download the receiver's metadata (Kind-0). An optional fourth parameter specifies the weight (a generalization of a percentage) assigned to the respective receiver. Clients should parse all weights, calculate a sum, and then a percentage to each receiver. If weights are not present, CLIENTS should equally divide the zap amount to all receivers. If weights are only partially present, receivers without a weight should not be zapped (`weight = 0`). |
| 172 | 172 | ||
| 173 | ```json | 173 | ```js |
| 174 | { | 174 | { |
| 175 | "tags": [ | 175 | "tags": [ |
| 176 | [ "zap", "pablo@f7z.io", "lud16" ] | 176 | [ "zap", "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", "wss://nostr.oxtr.dev", "1" ], // 25% |
| 177 | [ "zap", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", "wss://nostr.wine/", "1" ], // 25% | ||
| 178 | [ "zap", "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", "wss://nos.lol/", "2" ] // 50% | ||
| 177 | ] | 179 | ] |
| 178 | } | 180 | } |
| 179 | ``` | 181 | ``` |
| 180 | 182 | ||
| 183 | Clients MAY display the zap split configuration in the note. | ||
| 184 | |||
| 181 | ## Future Work | 185 | ## Future Work |
| 182 | 186 | ||
| 183 | Zaps can be extended to be more private by encrypting `zap request` notes to the target user, but for simplicity it has been left out of this initial draft. | 187 | Zaps can be extended to be more private by encrypting `zap request` notes to the target user, but for simplicity it has been left out of this initial draft. |