aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-06-28 03:15:00 -0700
committerAdam Soltys <[email protected]>2026-06-28 03:15:00 -0700
commite8edfd88b14ad07f5f97f5cb1d5d603d825a413d (patch)
treec98c7fb8dced7442637b9c0c442bbf3a68edcced /src/app.js
parentdf58295848c7675e6501148da2a988b918811a2c (diff)
downloadcoinosv3-e8edfd88b14ad07f5f97f5cb1d5d603d825a413d.tar.gz
coinosv3-e8edfd88b14ad07f5f97f5cb1d5d603d825a413d.zip
Scan silent payments from each wallet's birth, not the indexer's start
A freshly-generated wallet can't have received SP before it existed, so set its scan watermark to the current tip on first connect (skipping the whole historical catch-up) instead of scanning from 0. Threaded a 'generated' flag through the create flow (openWallet → enterWallet → activateAccount → load spFresh); imported wallets still scan from the indexer start since they may have prior receipts. Verified on regtest: a fresh wallet skips the block-5780 receipt (watermark=tip, balance 0); the same seed imported finds it. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Diffstat (limited to 'src/app.js')
-rw-r--r--src/app.js12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/app.js b/src/app.js
index ce8ee13..9c79ac4 100644
--- a/src/app.js
+++ b/src/app.js
@@ -542,7 +542,7 @@ function createPane() {
),
h(
'button',
- { class: 'btn-block', onClick: () => openWallet(ui.draftMnemonic) },
+ { class: 'btn-block', onClick: () => openWallet(ui.draftMnemonic, { generated: true }) },
t('skipVerification')
)
);
@@ -595,11 +595,11 @@ function createPane() {
if (hasPass && ui.confirmPass !== ui.passphrase) {
ui.unlockError = t('passphraseMismatch'); render(); return;
}
- openWallet(ui.draftMnemonic);
+ openWallet(ui.draftMnemonic, { generated: true });
},
}, t('openWallet'))
),
- h('button', { class: 'btn-block', onClick: () => openWallet(ui.draftMnemonic) }, t('skipVerification'))
+ h('button', { class: 'btn-block', onClick: () => openWallet(ui.draftMnemonic, { generated: true }) }, t('skipVerification'))
);
}
@@ -657,11 +657,11 @@ function optionsPanel() {
// Import accepts a recovery phrase, an xpub/zpub (watch-only), or an xprv/zprv
// (full spending). Classify the pasted text and open the right kind of wallet.
-async function openWallet(input) {
+async function openWallet(input, opts = {}) {
ui.unlockError = '';
const raw = (input || '').trim();
const m = raw.replace(/\s+/g, ' ');
- if (isValidMnemonic(m)) { await enterWallet(m, ui.passphrase); return; }
+ if (isValidMnemonic(m)) { await enterWallet(m, ui.passphrase, { generated: opts.generated }); return; }
let pk;
try { pk = parseExtendedKey(raw); } catch { ui.unlockError = t('invalidImport'); render(); return; }
const acc = pk.kind === 'xpub'
@@ -693,7 +693,7 @@ async function activateAccount(acc, opts = {}) {
const netName = getNetwork();
if (acc.type === 'watch') wallet.load({ xpub: acc.xpub, netName, offline: false });
else if (acc.xprv) wallet.load({ xprv: acc.xprv, netName, offline: false });
- else wallet.load({ mnemonic: acc.mnemonic, passphrase: acc.passphrase || '', netName, offline: false });
+ else wallet.load({ mnemonic: acc.mnemonic, passphrase: acc.passphrase || '', netName, offline: false, spFresh: !!opts.generated });
// Record the account-level xpub so this wallet survives a session wipe as a
// watch-only entry (see the durable account directory) — you keep seeing your
// balance/history and re-enter the seed to spend again.