12<html lang="en">3<head>4<meta charset="utf-8">5<meta name="viewport" content="width=device-width, initial-scale=1">6<title>NIP-60 - Cashu Wallets — Nostr Instruction Manual</title>7<meta name="description" content="NIP-60: Cashu wallets stored on relays. Wallet, token, spending-history, and quote events, NIP-44 encryption, and proof state transitions. Complete manual page.">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 60 - 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="60">60</div>48 <div class="titles">49 <div class="kicker">Nostr Implementation Possibility - Hex № 60</div>50 <h1>Cashu Wallets</h1>51 <p class="sub">Store a Cashu ecash wallet on relays as encrypted events, so the same wallet follows the user across every application.</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>Cashu wallet</strong> holds ecash <strong>proofs</strong> issued by a <strong>mint</strong>. This NIP stores the state of such a wallet on relays. Every event is encrypted with <a href="44.html">NIP-44</a> to the user's own key. Only the owner can read the wallet.</p>60 <p>The goal is twofold. <strong>Ease of use:</strong> a new user can receive funds at once, with no account at any service. <strong>Interoperability:</strong> the wallet follows the user across applications, because every client reads the same relay state.</p>61 <p>This NIP does not define how a user <em>receives</em> money from someone else. It only keeps the state of the user's own wallet. Payments to the user are defined in <a href="61.html">NIP-61</a>.</p>62 <p>The wallet uses four event kinds. A <code>kind:17375</code> event describes the wallet. <code>kind:7375</code> events hold the unspent proofs. <code>kind:7376</code> events record spending history; they are informational and fully optional. <code>kind:7374</code> events keep the state of a mint quote; they are optional as well.</p>6364 <div class="box hint">65 <span class="tag">Hint!</span>66 <p>Read <a href="44.html">NIP-44</a> before this chapter. Every content payload here travels through <code>nip44_encrypt</code>, keyed to the user's own Nostr key. Relays only ever see ciphertext.</p>67 </div>6869 <figure class="diagram">70 <div class="frame">71 <svg viewBox="0 0 560 200" role="img" aria-label="One wallet event, several token events, and optional history and quote events, all encrypted, stored on the user's relays">72 <rect class="d-actor" x="10" y="70" width="110" height="50" rx="8"/>73 <text class="d-actor-label" x="65" y="93" text-anchor="middle">Client</text>74 <text class="d-note" x="65" y="110" text-anchor="middle">user's key</text>75 <rect x="220" y="10" width="330" height="180" rx="10" fill="none" stroke="#7d8794" stroke-dasharray="4 4"/>76 <text class="d-note" x="385" y="28" text-anchor="middle">user's relays (ciphertext only)</text>77 <rect class="d-actor" x="240" y="40" width="140" height="34" rx="6"/>78 <text class="d-actor-label" x="310" y="61" text-anchor="middle">17375 wallet</text>79 <rect class="d-actor" x="240" y="84" width="140" height="34" rx="6"/>80 <text class="d-actor-label" x="310" y="105" text-anchor="middle">7375 tokens</text>81 <rect class="d-actor" x="240" y="128" width="140" height="34" rx="6"/>82 <text class="d-actor-label" x="310" y="149" text-anchor="middle">7376 history</text>83 <rect class="d-actor" x="400" y="84" width="140" height="34" rx="6"/>84 <text class="d-actor-label" x="470" y="105" text-anchor="middle">7374 quotes</text>85 <text class="d-note" x="400" y="66">×1 (replaceable)</text>86 <text class="d-note" x="400" y="154" >optional</text>87 <text class="d-note" x="470" y="132" text-anchor="middle">optional</text>88 <path class="d-msg d-flow" d="M122,95 L237,95"/>89 <text class="d-label" x="180" y="88" text-anchor="middle">nip44</text>90 <circle r="4" fill="#f26a00">91 <animateMotion dur="2.6s" repeatCount="indefinite" path="M122,95 L237,95"/>92 </circle>93 </svg>94 </div>95 <figcaption>Fig. 60-1 — <b>Wallet on relays.</b> One wallet event, many token events, optional history and quote events. All content is NIP-44 encrypted.</figcaption>96 </figure>9798 <h2 class="bar" id="spec"><span class="num">2</span> Wallet Event — Kind 17375</h2>99 <p>The wallet event is a replaceable event of <code>kind:17375</code>. It describes the wallet itself. Its <code>content</code> is a NIP-44 encrypted array of tag-like pairs. The outer <code>tags</code> array stays empty.</p>100101 <div class="crt">102 <div class="titlebar">Wallet event - kind 17375</div>103<pre>{104 <span class="k">"kind"</span>: 17375,105 <span class="k">"content"</span>: nip44_encrypt([106 [ <span class="s">"privkey"</span>, <span class="s">"hexkey"</span> ],107 [ <span class="s">"mint"</span>, <span class="s">"https://mint1"</span> ],108 [ <span class="s">"mint"</span>, <span class="s">"https://mint2"</span> ]109 ]),110 <span class="k">"tags"</span>: []111}</pre>112 </div>113114 <div class="tscroll"><table class="ref">115 <caption>Wallet content entries</caption>116 <tr><th>Entry</th><th>Rule</th></tr>117 <tr><td class="btn">mint</td><td>A mint this wallet uses. There MUST be one or more <code>mint</code> entries.</td></tr>118 <tr><td class="btn">privkey</td><td>Private key that unlocks P2PK-locked ecash. It MUST be stored encrypted in <code>content</code>. It is used only to receive <a href="61.html">NIP-61</a> nutzaps.</td></tr>119 </table></div>120121 <div class="box warn">122 <span class="tag">Warning!</span>123 <p>The <code>privkey</code> entry is a separate key made only for the wallet. It is not the user's Nostr private key, and it has no association with it. Never reuse the Nostr key here.</p>124 </div>125126 <h2 class="bar"><span class="num">3</span> Token Events — Kind 7375</h2>127 <p>Token events record the unspent proofs of the wallet. A wallet can have many <code>kind:7375</code> events for the same mint. Each event can hold many proofs. The <code>content</code> is a NIP-44 encrypted JSON object. The outer <code>tags</code> array stays empty.</p>128129 <div class="crt">130 <div class="titlebar">Token event - kind 7375</div>131<pre>{132 <span class="k">"kind"</span>: 7375,133 <span class="k">"content"</span>: nip44_encrypt({134 <span class="k">"mint"</span>: <span class="s">"https://stablenut.umint.cash"</span>,135 <span class="k">"unit"</span>: <span class="s">"sat"</span>,136 <span class="k">"proofs"</span>: [137 <span class="c">// one or more proofs in the default cashu format</span>138 {139 <span class="k">"id"</span>: <span class="s">"005c2502034d4f12"</span>,140 <span class="k">"amount"</span>: 1,141 <span class="k">"secret"</span>: <span class="s">"z+zyxAVLRqN9lEjxuNPSyRJzEstbl69Jc1vtimvtkPg="</span>,142 <span class="k">"C"</span>: <span class="s">"0241d98a8197ef238a192d47edf191a9de78b657308937b4f7dd0aa53beae72c46"</span>143 }144 ],145 <span class="c">// token events destroyed while creating this one</span>146 <span class="k">"del"</span>: [ <span class="s">"token-event-id-1"</span>, <span class="s">"token-event-id-2"</span> ]147 }),148 <span class="k">"tags"</span>: []149}</pre>150 </div>151152 <div class="tscroll"><table class="ref">153 <caption>Token content fields (inside the NIP-44 payload)</caption>154 <tr><th>Field</th><th>Rule</th></tr>155 <tr><td class="btn">mint</td><td>The mint the proofs belong to.</td></tr>156 <tr><td class="btn">proofs</td><td>Unencoded Cashu proofs. Each proof has <code>id</code>, <code>amount</code>, <code>secret</code>, and <code>C</code>.</td></tr>157 <tr><td class="btn">unit</td><td>The base unit of the proofs, for example <code>sat</code>, <code>usd</code>, or <code>eur</code>. Default is <code>sat</code> when omitted.</td></tr>158 <tr><td class="btn">del</td><td>IDs of token events destroyed by the creation of this token. This assists with state transitions.</td></tr>159 </table></div>160161 <h3>State transition on spend</h3>162 <p>When the wallet spends one or more proofs of a token event, the client must move the state forward:</p>163 <ol>164 <li>Delete the old token event with a <a href="09.html">NIP-09</a> deletion request.</li>165 <li>If some proofs of that event are still unspent, create a new token event. Roll the unspent proofs into it. Add any change outputs to it. The change output should include a <code>del</code> field.</li>166 <li>The <code>kind:5</code> delete event from the <a href="09.html">NIP-09</a> process MUST carry the tag <code>["k", "7375"]</code>. This lets clients that watch state transitions filter for it.</li>167 </ol>168169 <figure class="diagram">170 <div class="frame">171 <svg viewBox="0 0 560 190" role="img" aria-label="Spending proofs replaces an old token event with a new one, plus a kind 5 delete and an optional kind 7376 history event">172 <rect class="d-actor" x="10" y="60" width="130" height="60" rx="8"/>173 <text class="d-actor-label" x="75" y="85" text-anchor="middle">7375 (old)</text>174 <text class="d-note" x="75" y="103" text-anchor="middle">proofs: 1+2+4+8</text>175 <rect class="d-actor" x="290" y="14" width="130" height="52" rx="8"/>176 <text class="d-actor-label" x="355" y="36" text-anchor="middle">7375 (new)</text>177 <text class="d-note" x="355" y="52" text-anchor="middle">rollover + del</text>178 <rect class="d-actor" x="290" y="80" width="130" height="44" rx="8"/>179 <text class="d-actor-label" x="355" y="107" text-anchor="middle">5 delete</text>180 <rect class="d-actor" x="290" y="136" width="130" height="44" rx="8"/>181 <text class="d-actor-label" x="355" y="163" text-anchor="middle">7376 history</text>182 <path class="d-msg d-flow" d="M142,74 C210,60 220,48 287,40"/>183 <path class="d-msg" d="M142,94 L287,100"/>184 <path class="d-msg blue" d="M142,110 C210,128 220,146 287,156"/>185 <text class="d-label" x="212" y="34" text-anchor="middle">MUST roll over</text>186 <text class="d-label" x="215" y="90" text-anchor="middle">MUST ["k","7375"]</text>187 <text class="d-label" x="212" y="152" text-anchor="middle">SHOULD record</text>188 <text class="d-note" x="440" y="42">unspent proofs</text>189 <text class="d-note" x="440" y="106">NIP-09</text>190 <text class="d-note" x="440" y="162">optional</text>191 <circle r="4" fill="#f26a00">192 <animateMotion dur="2.6s" repeatCount="indefinite" path="M142,74 C210,60 220,48 287,40"/>193 </circle>194 </svg>195 </div>196 <figcaption>Fig. 60-2 — <b>Token state transition.</b> A spend destroys the old token event and creates a rollover, a delete, and an optional history entry.</figcaption>197 </figure>198199 <h2 class="bar"><span class="num">4</span> Spending History — Kind 7376</h2>200 <p>Clients SHOULD publish a <code>kind:7376</code> event whenever the wallet balance changes. Together these events form a transaction history. The history is for informational purposes only, and it is completely optional.</p>201202 <div class="crt">203 <div class="titlebar">Spending history event - kind 7376</div>204<pre>{205 <span class="k">"kind"</span>: 7376,206 <span class="k">"content"</span>: nip44_encrypt([207 [ <span class="s">"direction"</span>, <span class="s">"in"</span> ], <span class="c">// in = received, out = sent</span>208 [ <span class="s">"amount"</span>, <span class="s">"1"</span> ],209 [ <span class="s">"unit"</span>, <span class="s">"sat"</span> ],210 [ <span class="s">"e"</span>, <span class="s">"<event-id-of-created-token>"</span>, <span class="s">""</span>, <span class="s">"created"</span> ]211 ]),212 <span class="k">"tags"</span>: [213 [ <span class="s">"e"</span>, <span class="s">"<event-id-of-created-token>"</span>, <span class="s">""</span>, <span class="s">"redeemed"</span> ]214 ]215}</pre>216 </div>217218 <div class="tscroll"><table class="ref">219 <caption>History content entries</caption>220 <tr><th>Entry</th><th>Rule</th></tr>221 <tr><td class="btn">direction</td><td>The direction of the transaction. <code>in</code> means received funds. <code>out</code> means sent funds.</td></tr>222 <tr><td class="btn">amount</td><td>The amount of the transaction, as a string.</td></tr>223 <tr><td class="btn">unit</td><td>The base unit of the amount, for example <code>sat</code>, <code>usd</code>, or <code>eur</code>. Default is <code>sat</code> when omitted.</td></tr>224 <tr><td class="btn">e</td><td>Reference to a token event, with a marker that states its role. See below.</td></tr>225 </table></div>226227 <p>Clients MUST add <code>e</code> tags that reference the destroyed and created token events. Each <code>e</code> tag carries a marker as its fourth element:</p>228 <div class="tscroll"><table class="ref">229 <caption>e-tag markers</caption>230 <tr><th>Marker</th><th>Meaning</th></tr>231 <tr><td class="btn">created</td><td>A new token event was created.</td></tr>232 <tr><td class="btn">destroyed</td><td>A token event was destroyed.</td></tr>233 <tr><td class="btn">redeemed</td><td>A <a href="61.html">NIP-61</a> nutzap was redeemed.</td></tr>234 </table></div>235236 <p>Encryption rules for the history event: all tags can be <a href="44.html">NIP-44</a> encrypted, that is, moved into the encrypted <code>content</code> array. Multiple <code>e</code> tags can be added, and they should be encrypted. The exception is the <code>redeemed</code> marker. Clients SHOULD leave <code>e</code> tags with a <code>redeemed</code> marker unencrypted, in the plain <code>tags</code> array.</p>237238 <div class="box hint">239 <span class="tag">Hint!</span>240 <p>Why keep <code>redeemed</code> tags public? They point at <a href="61.html">NIP-61</a> nutzap events. A public link proves the nutzap was claimed, without exposing the rest of the wallet history.</p>241 </div>242243 <h2 class="bar"><span class="num">5</span> Quote Events — Kind 7374 (Optional)</h2>244 <p>When the wallet creates a quote at a mint, the client can store the quote ID in a <code>kind:7374</code> event. The client later uses the quote ID to check when the quote has been paid. The <code>content</code> is the NIP-44 encrypted quote ID.</p>245 <p>Create these events with a <a href="40.html">NIP-40</a> <code>expiration</code> tag of 2 weeks. That is around the maximum time a Lightning payment can stay in flight. Application developers SHOULD use local state when possible. Publish this event only when it makes sense in the context of the application.</p>246247 <div class="crt">248 <div class="titlebar">Quote event - kind 7374</div>249<pre>{250 <span class="k">"kind"</span>: 7374,251 <span class="k">"content"</span>: nip44_encrypt(<span class="s">"quote-id"</span>),252 <span class="k">"tags"</span>: [253 [ <span class="s">"expiration"</span>, <span class="s">"<expiration-timestamp>"</span> ],254 [ <span class="s">"mint"</span>, <span class="s">"<mint-url>"</span> ]255 ]256}</pre>257 </div>258259 <div class="tscroll"><table class="ref">260 <caption>Quote event tags</caption>261 <tr><th>Tag</th><th>Rule</th></tr>262 <tr><td class="btn">expiration</td><td><a href="40.html">NIP-40</a> expiration timestamp. Set it about 2 weeks ahead.</td></tr>263 <tr><td class="btn">mint</td><td>The URL of the mint that issued the quote.</td></tr>264 </table></div>265266 <h2 class="bar"><span class="num">6</span> Client Flow</h2>267 <p>A client that wants to load a user's wallet starts with relay discovery. Fetch the user's <code>kind:10019</code> events from the user's relays. Kind 10019 is the nutzap relay list from <a href="61.html">NIP-61</a>. If no event is found, fall back to the user's <a href="65.html">NIP-65</a> relays.</p>268 <p>From those relays, fetch the wallet and token events with one filter:</p>269 <div class="crt">270 <div class="titlebar">Fetch wallet and token list</div>271<pre><span class="k">"kinds"</span>: [17375, 7375], <span class="k">"authors"</span>: [<span class="s">"<my-pubkey>"</span>]</pre>272 </div>273 <p>Decrypt each event with the user's key. The wallet event yields the mint list and the P2PK private key. The token events yield the unspent proofs. Their sum is the wallet balance.</p>274275 <div class="box tech">276 <span class="tag">Tech Note</span>277 <p>The source document has an empty section named "Fetch proofs" inside the Flow chapter. It defines no rules. The filter above already returns the token events that carry the proofs. Also note: kind <code>10019</code> is defined in <a href="61.html">NIP-61</a>, so wallet discovery depends on that NIP even for wallets that never receive nutzaps.</p>278 </div>279280 <h3>Validating proofs (Appendix 1)</h3>281 <p>Clients can optionally validate proofs against the mint. This guards against working from an old state. The spec leaves the timing and the reason to each implementation. If checked proofs turn out to be spent, the client should delete the token event and roll over any unspent proof, as in §3.</p>282283 <h2 class="bar" id="examples"><span class="num">7</span> Worked Example</h2>284 <p>Alice holds one token event with proofs of 1, 2, 4, and 8 sats. She spends 4 sats. Her client performs the full state transition.</p>285286 <div class="crt">287 <div class="titlebar">Before - token event "event-id-1"</div>288<pre>{289 <span class="k">"kind"</span>: 7375,290 <span class="k">"id"</span>: <span class="s">"event-id-1"</span>,291 <span class="k">"content"</span>: nip44_encrypt({292 <span class="k">"mint"</span>: <span class="s">"https://stablenut.umint.cash"</span>,293 <span class="k">"unit"</span>: <span class="s">"sat"</span>,294 <span class="k">"proofs"</span>: [295 { <span class="k">"id"</span>: <span class="s">"1"</span>, <span class="k">"amount"</span>: 1 },296 { <span class="k">"id"</span>: <span class="s">"2"</span>, <span class="k">"amount"</span>: 2 },297 { <span class="k">"id"</span>: <span class="s">"3"</span>, <span class="k">"amount"</span>: 4 },298 { <span class="k">"id"</span>: <span class="s">"4"</span>, <span class="k">"amount"</span>: 8 }299 ]300 }),301 <span class="k">"tags"</span>: []302}</pre>303 </div>304305 <p>Her client MUST roll over the unspent proofs into a new token event. The <code>del</code> array names the destroyed event:</p>306307 <div class="crt">308 <div class="titlebar">After - rollover token event "event-id-2"</div>309<pre>{310 <span class="k">"kind"</span>: 7375,311 <span class="k">"id"</span>: <span class="s">"event-id-2"</span>,312 <span class="k">"content"</span>: nip44_encrypt({313 <span class="k">"mint"</span>: <span class="s">"https://stablenut.umint.cash"</span>,314 <span class="k">"unit"</span>: <span class="s">"sat"</span>,315 <span class="k">"proofs"</span>: [316 { <span class="k">"id"</span>: <span class="s">"1"</span>, <span class="k">"amount"</span>: 1 },317 { <span class="k">"id"</span>: <span class="s">"2"</span>, <span class="k">"amount"</span>: 2 },318 { <span class="k">"id"</span>: <span class="s">"4"</span>, <span class="k">"amount"</span>: 8 }319 ],320 <span class="k">"del"</span>: [ <span class="s">"event-id-1"</span> ]321 }),322 <span class="k">"tags"</span>: []323}</pre>324 </div>325326 <p>Then the client MUST delete <code>event-id-1</code> with a <a href="09.html">NIP-09</a> request that carries <code>["k", "7375"]</code>. It SHOULD add <code>event-id-1</code> to the <code>del</code> array, as shown above. It SHOULD also record the spend:</p>327328 <div class="crt">329 <div class="titlebar">History entry - kind 7376</div>330<pre>{331 <span class="k">"kind"</span>: 7376,332 <span class="k">"content"</span>: nip44_encrypt([333 [ <span class="s">"direction"</span>, <span class="s">"out"</span> ],334 [ <span class="s">"amount"</span>, <span class="s">"4"</span> ],335 [ <span class="s">"unit"</span>, <span class="s">"sat"</span> ],336 [ <span class="s">"e"</span>, <span class="s">"<event-id-1>"</span>, <span class="s">""</span>, <span class="s">"destroyed"</span> ],337 [ <span class="s">"e"</span>, <span class="s">"<event-id-2>"</span>, <span class="s">""</span>, <span class="s">"created"</span> ]338 ]),339 <span class="k">"tags"</span>: []340}</pre>341 </div>342343 <div class="box warn">344 <span class="tag">Warning!</span>345 <p>Never publish a proof twice. If two token events carry the same proof, a stale client can try a double-spend and fail at the mint. Always pair the new event with the delete and the <code>del</code> field.</p>346 </div>347348 <h2 class="bar" id="history"><span class="num">8</span> Version History</h2>349 <p>NIP-60 arrived in one commit together with <a href="61.html">NIP-61</a>. Notable changes, newest first:</p>350 <ul class="patchnotes">351 <li><span class="ver">2025</span><span class="when">2025-10</span>Companion update with <a href="61.html">NIP-61</a>: a base <code>unit</code> tag was added on the nutzap side.</li>352 <li><span class="ver">2025</span><span class="when">2025-02</span>fiatjaf simplified NIP-60/61: the wallet became a single replaceable <code>kind:17375</code> event with encrypted <code>mint</code> and <code>privkey</code> entries.</li>353 <li><span class="ver">2025</span><span class="when">2025-01</span>State transitions became consistent: the <code>del</code> field and the mandatory <code>["k", "7375"]</code> tag on delete events.</li>354 <li><span class="ver">2025</span><span class="when">2025-01</span>Terminology updated: "parameterized replaceable" became "addressable" across the spec.</li>355 <li class="minor"><span class="ver">2025</span><span class="when">2025</span>Typo, link, heading-level, and syntax-highlighting fixes.</li>356 <li><span class="ver">Origin</span><span class="when">2024-10-25</span>Pablo Fernandez proposed Cashu wallets and nutzaps in one PR (#1369).</li>357 </ul>358359 <div class="credits">360 <h3 class="cardhead">Original Proposal - Credits</h3>361 <table>362 <tr><td>Author</td><td>Pablo Fernandez</td></tr>363 <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>364 <tr><td>Status</td><td>draft - optional</td></tr>365 <tr><td>Source</td><td><a href="https://github.com/nostr-protocol/nips/blob/master/60.md">60.md on GitHub</a> - <a href="https://github.com/nostr-protocol/nips/commits/master/60.md">full change history</a></td></tr>366 </table>367 </div>368369 <h2 class="bar"><span class="num">9</span> See Also</h2>370 <ul>371 <li><a href="01.html">NIP-01</a> — the event object, replaceable kinds, and filters used throughout this chapter.</li>372 <li><a href="61.html">NIP-61</a> — nutzaps: how other users pay P2PK-locked ecash into this wallet; defines <code>kind:10019</code>.</li>373 <li><a href="44.html">NIP-44</a> — the encryption scheme for every <code>content</code> payload here.</li>374 <li><a href="09.html">NIP-09</a> — deletion requests, required for token state transitions.</li>375 <li><a href="40.html">NIP-40</a> — the <code>expiration</code> tag used by quote events.</li>376 <li><a href="65.html">NIP-65</a> — the relay list used as a discovery fallback.</li>377 </ul>378 </div>379380 <aside>381 <div class="cartridge">382 <div class="inner">383 <h3 class="cardhead">Spec Card</h3>384 <div class="lights"><span class="led on"></span><span class="led on"></span><span class="led on"></span></div>385 <dl>386 <dt>Status</dt><dd><span class="chip draft">draft</span></dd>387 <dt>Defines</dt><dd>wallet - tokens - spending history - quotes - del rollover</dd>388 <dt>Kinds</dt><dd>17375 - 7375 - 7376 - 7374</dd>389 <dt>Requires</dt><dd><a href="01.html">NIP-01</a> - <a href="44.html">NIP-44</a> - <a href="09.html">NIP-09</a> - <a href="40.html">NIP-40</a> - <a href="65.html">NIP-65</a></dd>390 <dt>Pairs with</dt><dd><a href="61.html">NIP-61</a> nutzaps</dd>391 <dt>Crypto</dt><dd>NIP-44 encryption - Cashu ecash - P2PK</dd>392 <dt>First commit</dt><dd>2024-10-25</dd>393 <dt>Last updated</dt><dd>2025-10-31</dd>394 </dl>395 </div>396 </div>397 </aside>398 </main>399400 <nav class="navbtns">401 <a href="5a.html">◀ NIP-5A: Static Websites (nsites)</a>402 <a href="61.html">NIP-61: Nutzaps ▶</a>403 </nav>404405 <footer class="pagefoot">406 <a href="../index.html">Nostr Protocol Manual</a>407 <span class="pageno">NIP 60 / F4</span>408 </footer>409</div>410411<script src="../assets/webmcp.js" defer></script>412</body>413</html>