clone

every nostr nip as a chapter of an illustrated, early-2000s printed game manual

main
nip.guide / site / nips / 61.html
61.html 26.7K
1<!DOCTYPE html>2<html lang="en">3<head>4<meta charset="utf-8">5<meta name="viewport" content="width=device-width, initial-scale=1">6<title>NIP-61 - Nutzaps — Nostr Instruction Manual</title>7<meta name="description" content="NIP-61: Nutzaps. P2PK-locked Cashu tokens sent as Nostr events. The kind 10019 info event, kind 9321 nutzap event, lock rules, and redemption flow.">8<link rel="preload" href="../assets/fonts/michroma-400-latin.woff2" as="font" type="font/woff2" crossorigin>9<link rel="preload" href="../assets/fonts/exo2-var-latin.woff2" as="font" type="font/woff2" crossorigin>10<link rel="preload" href="../assets/fonts/sairacondensed-600-latin.woff2" as="font" type="font/woff2" crossorigin>11<link rel="preload" href="../assets/fonts/sairacondensed-700-latin.woff2" as="font" type="font/woff2" crossorigin>12<link rel="preload" href="../assets/fonts/sairacondensed-500-latin.woff2" as="font" type="font/woff2" crossorigin>13<link rel="preload" href="../assets/fonts/sharetechmono-400-latin.woff2" as="font" type="font/woff2" crossorigin>14<link rel="preload" href="../assets/fonts/exo2-400i-latin.woff2" as="font" type="font/woff2" crossorigin>15<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">16<link rel="stylesheet" href="../assets/manual.css">17</head>18<body>1920<svg width="0" height="0" style="position:absolute">21 <defs>22 <marker id="arr" markerWidth="9" markerHeight="9" refX="7" refY="4.5" orient="auto">23 <path d="M1,1 L8,4.5 L1,8 Z" fill="#f26a00"/>24 </marker>25 <marker id="arrb" markerWidth="9" markerHeight="9" refX="7" refY="4.5" orient="auto">26 <path d="M1,1 L8,4.5 L1,8 Z" fill="#2e5f9e"/>27 </marker>28 </defs>29</svg>3031<div class="page">32 <span class="staple s1"></span><span class="staple s2"></span>3334 <header class="band">35 <a class="logo" href="../index.html">NOSTR<b>▸</b>PROTOCOL MANUAL</a>36 <span class="booklet-note">Chapter 61 - Payments</span>37 </header>38 <nav class="tabs">39 <a href="../index.html">Contents</a>40 <a href="#overview" class="on">Overview</a>41 <a href="#spec">Spec</a>42 <a href="#examples">Examples</a>43 <a href="#history">History</a>44 </nav>4546 <div class="chapter">47 <div class="nipno" data-n="61">61</div>48 <div class="titles">49 <div class="kicker">Nostr Implementation Possibility - Hex № 61</div>50 <h1>Nutzaps</h1>51 <p class="sub">A nutzap is a P2PK-locked Cashu token published as a Nostr event. The payment itself is the receipt.</p>52 </div>53 </div>5455 <main class="spread">56 <div class="main">5758 <h2 class="bar" id="overview"><span class="num">1</span> Overview</h2>59 <p>A <strong>nutzap</strong> sends ecash to another user over Nostr. The sender mints a <strong>Cashu</strong> token at a mint the recipient trusts. The sender locks the token to a public key the recipient controls. The sender then publishes the token inside a Nostr event.</p>60 <p>The lock uses <strong>P2PK</strong> (pay-to-public-key, Cashu NUT-11). A P2PK-locked token can be spent only by the holder of the matching private key. So the published event is safe to show in public. It is money and proof of payment at the same time. No invoice, no callback server, and no receipt event from a third party are needed. Compare this with Lightning zaps in <a href="57.html">NIP-57</a>, which need a server to issue receipts.</p>61 <p>This NIP defines two events. <code>kind:10019</code> tells the world how to send money to a user. <code>kind:9321</code> carries the locked tokens to the recipient. Redemption reuses the <code>kind:7376</code> spending-history event from <a href="60.html">NIP-60</a>.</p>6263 <div class="box hint">64 <span class="tag">Hint!</span>65 <p>Read <a href="60.html">NIP-60</a> first. It defines the wallet event that stores the private key nutzaps are locked to, and the token and history events a wallet uses. NIP-61 is the "receive money" side of that wallet.</p>66 </div>6768 <figure class="diagram">69 <div class="frame">70 <svg viewBox="0 0 560 200" role="img" aria-label="Alice mints a locked token at Bob's trusted mint, publishes a nutzap event to Bob's relay, and Bob later swaps the token into his wallet">71 <rect class="d-actor" x="10" y="75" width="100" height="50" rx="8"/>72 <text class="d-actor-label" x="60" y="104" text-anchor="middle">Alice</text>73 <rect class="d-actor" x="230" y="15" width="100" height="44" rx="8"/>74 <text class="d-actor-label" x="280" y="42" text-anchor="middle">Mint</text>75 <rect class="d-actor" x="230" y="135" width="100" height="44" rx="8"/>76 <text class="d-actor-label" x="280" y="162" text-anchor="middle">Relay</text>77 <rect class="d-actor" x="450" y="75" width="100" height="50" rx="8"/>78 <text class="d-actor-label" x="500" y="104" text-anchor="middle">Bob</text>79 <path class="d-msg d-flow" d="M112,88 C160,72 175,50 228,40"/>80 <path class="d-msg d-flow" d="M112,112 C160,128 175,148 228,158"/>81 <path class="d-msg blue d-flow" d="M332,158 C385,148 400,128 448,112"/>82 <path class="d-msg blue d-flow" d="M448,88 C400,66 385,48 332,38"/>83 <text class="d-label" x="155" y="52" text-anchor="middle">mint P2PK token</text>84 <text class="d-label" x="150" y="150" text-anchor="middle">kind:9321</text>85 <text class="d-label" x="410" y="150" text-anchor="middle">REQ</text>86 <text class="d-label" x="410" y="52" text-anchor="middle">swap</text>87 <circle r="4" fill="#f26a00">88 <animateMotion dur="2.6s" repeatCount="indefinite" path="M112,112 C160,128 175,148 228,158"/>89 </circle>90 <circle r="4" fill="#2e5f9e">91 <animateMotion dur="2.6s" begin="1.3s" repeatCount="indefinite" path="M332,158 C385,148 400,128 448,112"/>92 </circle>93 </svg>94 </div>95 <figcaption>Fig. 61-1 — <b>The nutzap loop.</b> Alice mints a locked token, publishes it as an event, and Bob swaps it into his own wallet.</figcaption>96 </figure>9798 <h2 class="bar" id="spec"><span class="num">2</span> The Nutzap Info Event — Kind 10019</h2>99 <p><code>kind:10019</code> is a replaceable event. It tells other users how to send money to its author. A sender MUST read this event before sending a nutzap.</p>100101 <div class="crt">102 <div class="titlebar">Wire format - kind 10019 (nutzap info)</div>103<pre>{104 <span class="k">"kind"</span>: 10019,105 <span class="k">"tags"</span>: [106 [<span class="s">"relay"</span>, <span class="s">"wss://relay1"</span>],107 [<span class="s">"relay"</span>, <span class="s">"wss://relay2"</span>],108 [<span class="s">"mint"</span>, <span class="s">"https://mint1"</span>, <span class="s">"usd"</span>, <span class="s">"sat"</span>],109 [<span class="s">"mint"</span>, <span class="s">"https://mint2"</span>, <span class="s">"sat"</span>],110 [<span class="s">"pubkey"</span>, <span class="c">&lt;p2pk-pubkey&gt;</span>]111 ]112}</pre>113 </div>114115 <div class="tscroll"><table class="ref">116 <caption>Kind 10019 tags</caption>117 <tr><th>Tag</th><th>Value</th><th>Rule</th></tr>118 <tr><td class="btn">relay</td><td>relay URL</td><td>A relay the user reads token events from. Senders should write nutzap events to these relays. Repeat the tag for each relay.</td></tr>119 <tr><td class="btn">mint</td><td>mint URL, then base units</td><td>A mint the user explicitly agrees to receive funds on. Extra values list the base units the mint supports, such as <code>usd</code> or <code>sat</code>. Clients SHOULD NOT send money on a mint that is not listed here. Doing so risks burning the money.</td></tr>120 <tr><td class="btn">pubkey</td><td>public key, hex</td><td>The key that MUST be used to P2PK-lock incoming nutzaps. See the lock rules below.</td></tr>121 </table></div>122123 <h3>P2PK lock rules</h3>124 <p>The lock target is strict. Follow these rules exactly:</p>125 <ul>126 <li>Lock to the key in the <code>pubkey</code> tag of the recipient's <code>kind:10019</code>. This key corresponds to the <code>privkey</code> field encrypted inside the recipient's <a href="60.html">NIP-60</a> wallet event (<code>kind:17375</code>).</li>127 <li>Implementations MUST NOT lock to the recipient's main Nostr public key.</li>128 <li>When building the P2PK lock, clients MUST prefix the public key with <code>"02"</code>. Cashu uses 33-byte compressed keys; Nostr keys are 32 bytes. The prefix keeps nostr and cashu compatible.</li>129 </ul>130 <div class="box warn">131 <span class="tag">Warning!</span>132 <p>Never lock a token to the recipient's Nostr identity key. The wallet's separate P2PK key exists so the user can spend ecash without exposing the identity key to wallet code, and can rotate it independently.</p>133 </div>134135 <h2 class="bar"><span class="num">3</span> The Nutzap Event — Kind 9321</h2>136 <p><code>kind:9321</code> is the nutzap itself. The sender publishes it and p-tags the recipient. Its proofs are P2PK-locked to the key the recipient listed in <code>kind:10019</code>.</p>137138 <div class="crt">139 <div class="titlebar">Wire format - kind 9321 (nutzap)</div>140<pre>{141 <span class="k">"kind"</span>: 9321,142 <span class="k">"content"</span>: <span class="s">"Thanks for this great idea."</span>,143 <span class="k">"pubkey"</span>: <span class="c">&lt;sender-pubkey&gt;</span>,144 <span class="k">"tags"</span>: [145 [<span class="s">"proof"</span>, <span class="s">"{\"amount\":1,\"C\":\"02277c…6d3f\",\"id\":\"000a93d6f8a1d2c4\",146 \"secret\":\"[\\\"P2PK\\\",{\\\"nonce\\\":\\\"b00b…ee83\\\",147 \\\"data\\\":\\\"02eaee…c1ed\\\"}]\"}"</span>],148 [<span class="s">"unit"</span>, <span class="s">"sat"</span>],149 [<span class="s">"u"</span>, <span class="s">"https://stablenut.umint.cash"</span>],150 [<span class="s">"e"</span>, <span class="c">&lt;nutzapped-event-id&gt;</span>, <span class="c">&lt;relay-hint&gt;</span>],151 [<span class="s">"k"</span>, <span class="c">&lt;nutzapped-kind&gt;</span>],152 [<span class="s">"p"</span>, <span class="c">&lt;recipient-pubkey&gt;</span>]153 ]154}</pre>155 </div>156157 <div class="tscroll"><table class="ref">158 <caption>Kind 9321 fields and tags</caption>159 <tr><th>Field / Tag</th><th>Required</th><th>Rule</th></tr>160 <tr><td class="btn">content</td><td>optional</td><td>A comment for the nutzap. May be empty.</td></tr>161 <tr><td class="btn">proof</td><td>one or more</td><td>A Cashu proof, JSON-stringified. It MUST be P2PK-locked to the recipient's <code>kind:10019</code> pubkey and MUST include a DLEQ proof (Cashu NUT-12).</td></tr>162 <tr><td class="btn">unit</td><td>optional</td><td>The base unit of the proofs, such as <code>sat</code>, <code>usd</code>, or <code>eur</code>. Defaults to <code>sat</code> when omitted.</td></tr>163 <tr><td class="btn">u</td><td>required</td><td>The URL of the mint, written EXACTLY as it appears in the recipient's <code>kind:10019</code>.</td></tr>164 <tr><td class="btn">e</td><td>optional</td><td>The event that is nutzapped, if any, with an optional relay hint.</td></tr>165 <tr><td class="btn">k</td><td>optional</td><td>The kind of the nutzapped event.</td></tr>166 <tr><td class="btn">p</td><td>required</td><td>The Nostr identity public key of the nutzap recipient.</td></tr>167 </table></div>168169 <div class="box tech">170 <span class="tag">Tech Note</span>171 <p>The source spec shows the <code>k</code> tag in its <code>kind:9321</code> example but never defines it in the tag list. It was added in 2025 to match other reaction-style events; the meaning here is inferred. The prose for the <code>u</code> tag is also garbled in the source ("is the mint the URL of the mint").</p>172 </div>173174 <h2 class="bar"><span class="num">4</span> Sending a Nutzap</h2>175 <p>Follow this procedure to send a nutzap:</p>176 <ol>177 <li>Fetch the recipient's <code>kind:10019</code> event.</li>178 <li>Mint new ecash, or swap ecash you already hold, on one of the mints the recipient lists. P2PK-lock the outputs to the recipient's listed <code>pubkey</code>, with the <code>"02"</code> prefix.</li>179 <li>Build a <code>kind:9321</code> event with the proofs, the <code>u</code> mint tag, and the <code>p</code> tag. Add <code>e</code> and <code>k</code> tags when you zap a specific event.</li>180 <li>Publish the event to the relays the recipient listed in <code>kind:10019</code>.</li>181 </ol>182 <div class="box danger">183 <span class="tag">Warning!</span>184 <p>A nutzap MUST use a mint from the recipient's <code>kind:10019</code> and MUST reach the recipient's relays. Break either rule and the recipient may never see the event. The tokens are then donated to the mint forever.</p>185 </div>186187 <h2 class="bar"><span class="num">5</span> Receiving and Redeeming</h2>188 <p>The recipient's client polls its relays for nutzaps. Clients should send a <code>REQ</code> that filters:</p>189 <ul>190 <li>with <code>#p</code> for the user's own pubkey;</li>191 <li>with <code>#u</code> for the mints the user expects ecash from. This stops the client from interacting with mints the user never signaled;</li>192 <li>with <code>since</code> set to the <code>created_at</code> of the user's most recent <code>kind:7376</code> event. That event marks the last redeemed nutzap. Clients may use other markers, including internal state; this is one possible approach.</li>193 </ul>194 <div class="crt">195 <div class="titlebar">Subscription filter - fetch pending nutzaps</div>196<pre>{ <span class="k">"kinds"</span>: [9321], <span class="k">"#p"</span>: [<span class="s">"my-pubkey"</span>], <span class="k">"#u"</span>: [<span class="c">&lt;mint-1&gt;</span>, <span class="c">&lt;mint-2&gt;</span>],197 <span class="k">"since"</span>: <span class="c">&lt;latest-created_at-of-kind-7376&gt;</span> }</pre>198 </div>199 <p>On each new nutzap, the client swaps the locked proofs into a wallet the user controls. That wallet can be a <a href="60.html">NIP-60</a> wallet, the user's own Lightning wallet, or anything else.</p>200201 <h3>Recording the redemption — kind 7376</h3>202 <p>When it claims a token, the client SHOULD create a <code>kind:7376</code> spending-history event (defined in <a href="60.html">NIP-60</a>) and <code>e</code>-tag the original nutzap. This records that the token is already claimed, so no client tries again. It also signals to the sender that the ecash was redeemed. One <code>kind:7376</code> event may tag multiple <code>kind:9321</code> events.</p>203204 <div class="crt">205 <div class="titlebar">Wire format - kind 7376 (redemption record)</div>206<pre>{207 <span class="k">"kind"</span>: 7376,208 <span class="k">"content"</span>: nip44_encrypt([209 [<span class="s">"direction"</span>, <span class="s">"in"</span>], <span class="c">// in = received, out = sent</span>210 [<span class="s">"amount"</span>, <span class="s">"1"</span>],211 [<span class="s">"unit"</span>, <span class="s">"sat"</span>],212 [<span class="s">"e"</span>, <span class="c">&lt;7375-event-id&gt;</span>, <span class="c">&lt;relay-hint&gt;</span>, <span class="s">"created"</span>] <span class="c">// new token event</span>213 ]),214 <span class="k">"tags"</span>: [215 [<span class="s">"e"</span>, <span class="c">&lt;9321-event-id&gt;</span>, <span class="c">&lt;relay-hint&gt;</span>, <span class="s">"redeemed"</span>], <span class="c">// nutzap redeemed</span>216 [<span class="s">"p"</span>, <span class="c">&lt;sender-pubkey&gt;</span>] <span class="c">// author of the 9321 event</span>217 ]218}</pre>219 </div>220 <p>The encrypted content lists the direction (<code>in</code> for received), the amount, the unit, and an <code>e</code> tag with marker <code>created</code> pointing to the new <code>kind:7375</code> token event. The unencrypted tags carry the redeemed nutzap with marker <code>redeemed</code> and the sender's pubkey. Publish redemption events to the sender's <a href="65.html">NIP-65</a> "read" relays, so the sender learns the money arrived.</p>221222 <figure class="diagram">223 <div class="frame">224 <svg viewBox="0 0 560 320" role="img" aria-label="Sequence diagram: sender fetches kind 10019, mints a locked token, publishes kind 9321; recipient requests nutzaps, swaps the token, and publishes kind 7376">225 <line class="d-wire" x1="90" y1="40" x2="90" y2="305" stroke-dasharray="3 4"/>226 <line class="d-wire" x1="280" y1="40" x2="280" y2="305" stroke-dasharray="3 4"/>227 <line class="d-wire" x1="470" y1="40" x2="470" y2="305" stroke-dasharray="3 4"/>228 <rect class="d-actor" x="40" y="8" width="100" height="30" rx="6"/>229 <text class="d-actor-label" x="90" y="28" text-anchor="middle">Sender</text>230 <rect class="d-actor" x="230" y="8" width="100" height="30" rx="6"/>231 <text class="d-actor-label" x="280" y="28" text-anchor="middle">Relays</text>232 <rect class="d-actor" x="420" y="8" width="100" height="30" rx="6"/>233 <text class="d-actor-label" x="470" y="28" text-anchor="middle">Recipient</text>234 <path class="d-msg blue" d="M280,62 L95,62"/>235 <text class="d-label" x="185" y="55" text-anchor="middle">kind:10019 (mints, relays, pubkey)</text>236 <text class="d-note" x="90" y="92" text-anchor="middle">mint P2PK token</text>237 <text class="d-note" x="90" y="106" text-anchor="middle">at listed mint</text>238 <path class="d-msg" d="M90,130 L275,130"/>239 <text class="d-label" x="185" y="123" text-anchor="middle">["EVENT", kind:9321]</text>240 <path class="d-msg" d="M470,168 L285,168"/>241 <text class="d-label" x="378" y="161" text-anchor="middle">["REQ", {"#p","#u","since"}]</text>242 <path class="d-msg blue d-flow" d="M280,200 L465,200"/>243 <text class="d-label" x="378" y="193" text-anchor="middle">["EVENT", kind:9321]</text>244 <text class="d-note" x="470" y="230" text-anchor="middle">verify lock + DLEQ,</text>245 <text class="d-note" x="470" y="244" text-anchor="middle">swap into wallet</text>246 <path class="d-msg" d="M470,270 L285,270"/>247 <text class="d-label" x="378" y="263" text-anchor="middle">["EVENT", kind:7376 "redeemed"]</text>248 <text class="d-note" x="185" y="296" text-anchor="middle">7376 goes to the sender's NIP-65 read relays</text>249 </svg>250 </div>251 <figcaption>Fig. 61-2 — <b>Full lifecycle.</b> Info event, locked token, nutzap event, swap, and the redemption record.</figcaption>252 </figure>253254 <h2 class="bar"><span class="num">6</span> Verifying a Nutzap</h2>255 <p>Any observer client can count the nutzaps an event received. Before it lists or counts a nutzap, the observer SHOULD run four checks:</p>256 <ol>257 <li>Check that the receiving user issued a <code>kind:10019</code> that tags the mint where the ecash was minted.</li>258 <li>Check that the token is locked to the pubkey the user listed in that <code>kind:10019</code>.</li>259 <li>Check the <code>u</code> tag: the token must be issued by one of the mints listed in the <code>kind:10019</code>.</li>260 <li>Verify the DLEQ proof of the tokens locally.</li>261 </ol>262 <p>All four checks work offline. The observer only needs the receiver's <code>kind:10019</code> event and the mint's keyset. So verification is reasonably fast.</p>263264 <h2 class="bar"><span class="num">7</span> Final Considerations</h2>265 <ul>266 <li>Clients SHOULD guide users to list only mints compatible with NUT-11 (P2PK) and NUT-12 (DLEQ proofs) in their <code>kind:10019</code>. Otherwise anyone can spend the "locked" nutzaps.</li>267 <li>Clients SHOULD normalize and deduplicate mint URLs, as described in <a href="65.html">NIP-65</a>.</li>268 <li>A nutzap event MUST include proofs from one of the mints the recipient listed in their <code>kind:10019</code>, and it MUST be published to the recipient's <a href="65.html">NIP-65</a> relays. Failure to do so may donate the tokens to the mint, because the recipient might never see the event.</li>269 </ul>270 <div class="box tech">271 <span class="tag">Tech Note</span>272 <p>The source spec names two different publish targets. The flow and the <code>relay</code> tag say: publish nutzaps to the relays in the recipient's <code>kind:10019</code>. The final considerations say: publish to the recipient's <a href="65.html">NIP-65</a> relays. Safe clients publish to both sets. Also, <a href="65.html">NIP-65</a> describes relay URL handling, not mint URL normalization; the reference is loose.</p>273 </div>274275 <h2 class="bar" id="examples"><span class="num">8</span> Worked Example</h2>276 <p>Alice liked Bob's note <code>event-id-1</code>. She nutzaps him 1 sat. The transcript below shows both sides. Orange lines go to a relay. Blue lines come from a relay.</p>277 <div class="crt">278 <div class="titlebar">Session transcript - Alice zaps, Bob redeems</div>279<pre><span class="c">-- Alice fetches Bob's nutzap info --</span>280<span class="send">→ ["REQ", "info", {"kinds":[10019], "authors":["&lt;bob&gt;"]}]</span>281<span class="recv">← ["EVENT", "info", {"kind":10019, "tags":[["relay","wss://relay1"],282 ["mint","https://stablenut.umint.cash","sat"], ["pubkey","eaee89…ac1ed"]], …}]</span>283<span class="c">-- Alice swaps 1 sat at that mint, locked to "02" + eaee89…ac1ed --</span>284285<span class="c">-- Alice publishes the nutzap to wss://relay1 --</span>286<span class="send">→ ["EVENT", {"kind":9321, "content":"Thanks for this great idea.",287 "tags":[["proof","{\"amount\":1,\"C\":\"02277c…6d3f\",\"id\":\"000a93d6f8a1d2c4\",288 \"secret\":\"[\\\"P2PK\\\",{\\\"nonce\\\":\\\"b00b…ee83\\\",\\\"data\\\":\\\"02eaee…c1ed\\\"}]\"}"],289 ["unit","sat"], ["u","https://stablenut.umint.cash"],290 ["e","event-id-1","wss://relay1"], ["k","1"], ["p","&lt;bob&gt;"]], …}]</span>291<span class="recv">← ["OK", "&lt;nutzap-id&gt;", true, ""]</span>292293<span class="c">-- Bob's client polls for unredeemed nutzaps --</span>294<span class="send">→ ["REQ", "nz", {"kinds":[9321], "#p":["&lt;bob&gt;"],295 "#u":["https://stablenut.umint.cash"], "since":1749762600}]</span>296<span class="recv">← ["EVENT", "nz", {"kind":9321, …}]</span>297<span class="recv">← ["EOSE", "nz"]</span>298<span class="c">-- Bob swaps the proof into his NIP-60 wallet (new kind:7375),299 then records the redemption --</span>300<span class="send">→ ["EVENT", {"kind":7376, "content":"&lt;nip44: direction=in, amount=1,301 unit=sat, e=&lt;7375-id&gt;/created&gt;",302 "tags":[["e","&lt;nutzap-id&gt;","wss://relay1","redeemed"], ["p","&lt;alice&gt;"]], …}]</span></pre>303 </div>304305 <h2 class="bar" id="history"><span class="num">9</span> Version History</h2>306 <p>NIP-61 landed together with the <a href="60.html">NIP-60</a> Cashu wallet in late 2024 and was simplified heavily in early 2025. Notable changes, newest first:</p>307 <ul class="patchnotes">308 <li><span class="ver">2025</span><span class="when">2025-10</span>Added the <code>unit</code> tag to the <code>kind:9321</code> event, with <code>sat</code> as the default.</li>309 <li><span class="ver">2025</span><span class="when">2025-08</span>Added the missing <code>k</code> tag to the nutzap example, matching other reaction-style events.</li>310 <li><span class="ver">2025</span><span class="when">2025-02</span>Removed the <code>a</code> tag from nutzap events; a series of wording nitpicks tightened the lock and verification rules.</li>311 <li><span class="ver">2025</span><span class="when">2025-02</span>Major simplification pass shared with <a href="60.html">NIP-60</a>: the redemption flow settled on the <code>kind:7376</code> history event.</li>312 <li class="minor"><span class="ver">2025</span><span class="when">2025</span>Typo, JSON-format, and heading-level fixes; an unfinished sentence completed.</li>313 <li><span class="ver">Origin</span><span class="when">2024-10-25</span>Pablo Fernandez proposed Cashu wallets and Nutzaps in one PR (<code>#1369</code>).</li>314 </ul>315316 <div class="credits">317 <h3 class="cardhead">Original Proposal - Credits</h3>318 <table>319 <tr><td>Author</td><td>Pablo Fernandez</td></tr>320 <tr><td>First commit</td><td>2024-10-25 — “Cashu wallet + Nutzaps” (<a href="https://github.com/nostr-protocol/nips/pull/1369">PR #1369</a>)</td></tr>321 <tr><td>Status</td><td>draft - optional — a P2PK-Cashu payment layer on top of <a href="60.html">NIP-60</a></td></tr>322 <tr><td>Source</td><td><a href="https://github.com/nostr-protocol/nips/blob/master/61.md">61.md on GitHub</a> - <a href="https://github.com/nostr-protocol/nips/commits/master/61.md">full change history</a></td></tr>323 </table>324 </div>325326 <h2 class="bar"><span class="num">10</span> See Also</h2>327 <ul>328 <li><a href="60.html">NIP-60</a> — the Cashu wallet: the encrypted <code>privkey</code>, token events (<code>kind:7375</code>), and history events (<code>kind:7376</code>).</li>329 <li><a href="65.html">NIP-65</a> — relay list metadata; redemption events go to the sender's read relays.</li>330 <li><a href="57.html">NIP-57</a> — Lightning zaps; the server-based receipt flow nutzaps replace.</li>331 <li><a href="44.html">NIP-44</a> — the encryption used for the <code>kind:7376</code> content.</li>332 <li><a href="01.html">NIP-01</a> — events, tags, filters, and the replaceable storage class of <code>kind:10019</code>.</li>333 </ul>334 </div>335336 <aside>337 <div class="cartridge">338 <div class="inner">339 <h3 class="cardhead">Spec Card</h3>340 <div class="lights"><span class="led on"></span><span class="led on"></span><span class="led on"></span></div>341 <dl>342 <dt>Status</dt><dd><span class="chip draft">draft</span><span class="chip">optional</span></dd>343 <dt>Defines</dt><dd>kind 10019 info - kind 9321 nutzap - proof/unit/u tags</dd>344 <dt>Kinds</dt><dd>10019, 9321 (uses 7375/7376)</dd>345 <dt>Requires</dt><dd><a href="01.html">NIP-01</a> - <a href="60.html">NIP-60</a> - <a href="65.html">NIP-65</a></dd>346 <dt>Crypto</dt><dd>Cashu NUT-11 P2PK - NUT-12 DLEQ - <a href="44.html">NIP-44</a></dd>347 <dt>First commit</dt><dd>2024-10-25</dd>348 <dt>Last updated</dt><dd>2026-06-13</dd>349 </dl>350 </div>351 </div>352 </aside>353 </main>354355 <nav class="navbtns">356 <a href="60.html">◀ NIP-60: Cashu Wallets</a>357 <a href="62.html">NIP-62: Request to Vanish ▶</a>358 </nav>359360 <footer class="pagefoot">361 <a href="../index.html">Nostr Protocol Manual</a>362 <span class="pageno">NIP 61 / F4</span>363 </footer>364</div>365366<script src="../assets/webmcp.js" defer></script>367</body>368</html>