From cc2c05d2a1b7a9601eb3cb0df998483099e590cc Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 4 Jul 2026 12:35:15 -0700 Subject: Features phase 2b: silent payments + nostr sync leave the core wallet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit wallet.js drops from 2,374 to ~1,970 lines, holding only BIP84 on-chain logic plus generic feature seams. New seams added this pass: registerBalanceExtra extra confirmed/pending buckets registerInputProvider extra spendable inputs for buildTx registerSendPreparer destinations needing post-selection derivation registerInputSigner non-BIP84 input signing registerHistoryProvider / registerScanHook / registerRealtimeHook / registerLoadHook / registerCacheExtension / registerCacheSavedHook src/features/sp-wallet.js: the whole BIP-352 engine — key derivation, worker-accelerated indexer scanning, the live indexer WebSocket, SP outputs as spendable inputs, sp1 send preparation, and per-output-key signing — installs via those seams (installSpWallet). src/features/sync.js: nostr identity + encrypted cross-device state sync plus its Settings card, installed via load/cache-saved/realtime hooks. profileChip/nostrProfile move here-adjacent (into gifts, the only other nostr consumer), so core app.js no longer imports nostr at all. buildTx/sign are now feature-agnostic (input providers + preparers + signers); _recomputeBalance* use the balance-extra registry, so a core build with no SP no longer calls a missing spBalance() (that regression dropped the minimal build into offline mode — caught by the smoke test). New coverage: tools/sp-test.js drives two browser "devices" through an SP send, indexer discovery, and an SP-input spend on the ark regtest chain (needs tools/sp-indexer.js pointed at bitcoind:18543). Minimal smoke now also asserts no SP/nostr code ships. Minimal profile: 314KB, down from 412KB (full: 580KB). All suites green: minimal smoke, sp-test, ark UI, gift lifecycle. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy --- tools/minimal-smoke.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'tools/minimal-smoke.js') diff --git a/tools/minimal-smoke.js b/tools/minimal-smoke.js index ab31619..1e80d67 100644 --- a/tools/minimal-smoke.js +++ b/tools/minimal-smoke.js @@ -28,6 +28,8 @@ check('meaningfully smaller than full', html.length < full.length * 0.9); check('no ark protocol code', !html.includes('Ark VTXO mailbox authorization')); check('no swap protocol code', !html.includes('swap/reverse')); check('no musig code', !html.includes('MuSig/noncecoef')); +check('no silent-payment engine', !html.includes('BIP0352') && !html.includes('__SP_WORKER__')); +check('no nostr sync code', !html.includes('30078') && !html.includes('relay.coinos.io')); const server = Bun.serve({ port: 5198, fetch: () => new Response(html, { headers: { 'content-type': 'text/html' } }) }); @@ -79,6 +81,7 @@ try { check('no swap provider card', !settings.includes('Swap provider')); check('no ark card', !/⚔ Ark/.test(settings)); check('no sp indexer card', !settings.includes('Silent payment indexer')); + check('no sync card', !settings.toLowerCase().includes('sync')); console.log('\n[3] core receive still works'); await clickText('.tabs button', 'Receive'); @@ -87,7 +90,9 @@ try { check('onchain address shown', /^bcrt1/.test(addr || ''), (addr || '').slice(0, 16) + '…'); sh(`${BCLI} sendtoaddress ${addr} 0.0004`); sh(`${BCLI} generatetoaddress 1 $(${BCLI} getnewaddress) >/dev/null`); - check('payment lands', await waitText('40,000', 30000)); + const landed = await waitText('40,000', 30000); + if (!landed) console.log(' [balance area]', (await bodyText()).slice(0, 200).replace(/\n+/g, ' | ')); + check('payment lands', landed); check('no page errors', errs.length === 0, errs.join(' | ')); console.log(ok ? '\n✅ SUCCESS: minimal profile is a working on-chain-only wallet' -- cgit v1.2.3