From b73bb9ee51b9be33bc1859fd56d3e11905c3d456 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 1 Aug 2026 19:02:25 -0700 Subject: Background NWC: the worker now answers — and pays — from the pouch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The no-tap half of background wallet-connect. The push payload carries the (encrypted, client-signed) request event; a bundled service-worker responder (src/sw-nwc.js -> nwc-respond.js) finds the matching pouch in IndexedDB, decrypts with the connection's service key, and answers get_info/get_balance/list_transactions from pouch state. pay_invoice pays through the swap bridge with an ArkManager running over the pouch's chain-6 key window (one HTLC lock, one HTTP swap), enforcing per-payment and daily budgets from the pouch's own spend log, checking the notifier's /answered endpoint so it never double-pays or shouts over an open device, and persisting the swap before handing it off so the app can refund a crashed flight. Anything it can't handle falls back to the wake-the-user notification. The notifier grows /publish (verified 23195s only, rate-limited) as the worker's reply pipe and /answered for race avoidance. The app gains pouch funding (mailbox-less arkoor self-send whose recipient bytes we keep), emptying, spend/budget reconciliation on open, and refund recovery with the pouch's own keys. Co-Authored-By: Claude Fable 5 --- tools/nwc-pouch-test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'tools/nwc-pouch-test.js') diff --git a/tools/nwc-pouch-test.js b/tools/nwc-pouch-test.js index 090f9b1..7846585 100644 --- a/tools/nwc-pouch-test.js +++ b/tools/nwc-pouch-test.js @@ -33,7 +33,10 @@ const pouch = buildPouch({ }); check('pouch carries both vtxos', pouch.vtxos.length === 2); check('pouch balance sums', pouchBalance(pouch) === 7000, String(pouchBalance(pouch))); -check('one key per vtxo index', Object.keys(pouch.keys).sort().join() === '0,1'); +// the worker can't derive, so the pouch ships a fixed key window covering +// funding indices and the worker's change/refund allocations +check('full key window shipped', Object.keys(pouch.keys).length === 50 && pouch.keys['0'] && pouch.keys['49']); +check('change base inside the window', pouch.nextKeyIndex === 20); const blob = JSON.stringify(pouch); check('NO seed/mnemonic in the pouch', !/mnemonic|seed|xprv/i.test(blob)); // the exported keys must actually correspond to the pouch pubkeys -- cgit v1.2.3