From 0154bb060fad7650cd8b825a30a5d88e7018bf8d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 4 Jun 2026 18:19:25 -0700 Subject: nwc: fix make_invoice timestamps (ms -> seconds) breaking NWC clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generate() stores `created` in milliseconds (Date.now()), but the NWC make_invoice response returned it directly as created_at and computed expires_at = created_at + expiry. NWC timestamps are Unix SECONDS (NIP-47), so clients parsed a ~1.78e12 expires_at that overflowed their date types — e.g. ptcpay's .NET DateTimeOffset, whose max is 253402300799 (issue #84: "creating lightning invoices via NWC fails ... Valid values are between -62135596800 and 253402300799"). Convert created to seconds before use. The other NWC handlers were already correct (lookup_invoice reads seconds straight from cln; list_transactions divides p.created by 1000). Only make_invoice leaked milliseconds. Fixes #84 Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/nwc.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/nwc.ts b/lib/nwc.ts index 5677fea3..2213d68a 100644 --- a/lib/nwc.ts +++ b/lib/nwc.ts @@ -403,11 +403,14 @@ const handle = (method, params, ev, app, user) => expiry, }; - const { - hash, - created: created_at, - paymentHash, - } = await generate({ invoice, user }); + const { hash, created, paymentHash } = await generate({ invoice, user }); + + // generate() stores `created` in milliseconds (Date.now()), but NWC + // timestamps are Unix SECONDS (NIP-47). Returning ms here produced an + // expires_at ~1.78e12 that overflowed clients' date parsers — e.g. + // ptcpay's .NET DateTimeOffset (issue #84: "Valid values are between + // -62135596800 and 253402300799"). Convert to seconds. + const created_at = Math.floor(created / 1000); return result({ type: "incoming", -- cgit v1.2.3