diff options
| author | Adam Soltys <[email protected]> | 2026-07-10 21:46:40 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-07-10 21:46:40 -0700 |
| commit | d466aab4451a89b2d69a2618f0a739b2e89903c5 (patch) | |
| tree | 083502eec7f32d3b142f92ee40d94528a0edaf55 /index.ts | |
| parent | c5bcf51d6adb1c7718f08ff11a9652762c51669d (diff) | |
| download | coinos-server-d466aab4451a89b2d69a2618f0a739b2e89903c5.tar.gz coinos-server-d466aab4451a89b2d69a2618f0a739b2e89903c5.zip | |
invoices: sell merchant-supplied preimages via a usePreimage queue
Merchants POST /preimages (auth) to pre-load 32-byte hex preimages into a
FIFO queue; creating an invoice with usePreimage: true consumes the next
one so the invoice's payment hash is sha256(preimage). Paying the invoice
reveals the merchant-chosen secret to the buyer — via their own wallet on
external settlements, and via GET /invoice/:id once settled — enabling
backend-less digital download stores (encrypted files on static hosting,
preimage + public string = decryption key).
- GET /preimages lists the queue with payment hashes so the merchant can
map files to future invoices; POST /preimages/delete clears it
- empty queue fails invoice creation rather than issuing a random
preimage the buyer would pay for but couldn't decrypt with
- preimages cln rejects as already used are discarded and the next tried
- consumed preimages persist at preimage:${payment_hash} (TTL = invoice
expiry) and credit() prefers them as the settlement ref, so internal
coinos-to-coinos payments reveal the real preimage instead of the
sender's uid
Co-Authored-By: Claude Fable 5 <[email protected]>
Diffstat (limited to 'index.ts')
| -rw-r--r-- | index.ts | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -18,6 +18,7 @@ import lnurl from "$routes/lnurl"; import locations from "$routes/locations"; import nostr from "$routes/nostr"; import payments from "$routes/payments"; +import preimages from "$routes/preimages"; import rates from "$routes/rates"; import shopify from "$routes/shopify"; import square from "$routes/square"; @@ -52,6 +53,10 @@ app.post("/invoice", optional, invoices.create); app.post("/invoice/:id", optional, invoices.update); app.post("/sign", auth, invoices.sign); +app.get("/preimages", auth, preimages.list); +app.post("/preimages", auth, preimages.add); +app.post("/preimages/delete", auth, preimages.clear); + app.get("/assetlinks.json", (_, res) => res.sendFile("assetlinks.json")); app.get("/nostr.json", nostr.identities); app.get("/profile/:profile", nostr.profile); |
