upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/57.md
diff options
context:
space:
mode:
authorSemisol <45574030+Semisol@users.noreply.github.com>2023-11-19 01:45:41 +0100
committerGitHub <noreply@github.com>2023-11-19 01:45:41 +0100
commitda19c078ab892b578a5c35968443205c9e8ac27f (patch)
tree17a9f4f3105acdae234d3bc67e42571aed261fa2 /57.md
parent4d709d1804de45bab3739ce814d4b0c0b211c273 (diff)
parent5dcfe85306434f21ecb1e7a47edd92b2e3e64f9a (diff)
Merge branch 'master' into clarify-json-serialization
Diffstat (limited to '57.md')
-rw-r--r--57.md24
1 files changed, 14 insertions, 10 deletions
diff --git a/57.md b/57.md
index 438a0f8..2b2c97b 100644
--- a/57.md
+++ b/57.md
@@ -4,7 +4,7 @@ NIP-57
4Lightning Zaps 4Lightning Zaps
5-------------- 5--------------
6 6
7`draft` `optional` `author:jb55` `author:kieran` 7`draft` `optional`
8 8
9This 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. 9This 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
69This 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: 69This 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
72const senderPubkey // The sender's pubkey 72const senderPubkey // The sender's pubkey
@@ -78,7 +78,7 @@ const sats = 21
78const amount = sats * 1000 78const amount = sats * 1000
79const relays = ['wss://nostr-pub.wellorder.net'] 79const relays = ['wss://nostr-pub.wellorder.net']
80const event = encodeURI(JSON.stringify(await signEvent({ 80const 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
127The following should be true of the `zap receipt` event: 127The 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
171When 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`. 171When 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
183Clients MAY display the zap split configuration in the note.
184
181## Future Work 185## Future Work
182 186
183Zaps 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. 187Zaps 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.