diff options
| author | Adam Soltys <[email protected]> | 2026-09-10 10:40:16 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-09-10 10:40:16 -0700 |
| commit | dd3ca845bfaf901dfb0fe702a7e5cb1c32485d25 (patch) | |
| tree | c7915e5fbb97d2006f17054c508022fb971e1def /src | |
| parent | 197ab88cec2f05b7ad45323b396a6e34b8b5edca (diff) | |
| download | coinosv3-dd3ca845bfaf901dfb0fe702a7e5cb1c32485d25.tar.gz coinosv3-dd3ca845bfaf901dfb0fe702a7e5cb1c32485d25.zip | |
Onboarding: fix the crash after a name claim/migration; keep a login-owned name through signer resume.
"Something broke" right after a coinos.io migration completed: the spend
step advances past the avatar ask by calling nextAfterAvatar(), which was
a const declared further down the same function — a temporal-dead-zone
throw for any profile that already had a picture. Now a hoisted function.
Also, the claimed-name ownership check only counted the LIVE login signer.
A bunker/Google login resumes seconds after load, so for that window a
name owned by the login identity (every migrated coinos.io name) looked
foreign, was dropped, and the wallet key's npub-shaped default took its
place — the address visibly flipped from [email protected] to npub…@coinos.io.
The stored login pubkey now counts as ours too.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Nw1Dijik1tLVKRM1WkU7xE
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.js | 10 | ||||
| -rw-r--r-- | src/features/names.js | 9 |
2 files changed, 16 insertions, 3 deletions
@@ -2879,10 +2879,16 @@ function onboardScreen() { // After the identity niceties: offer a first top-up when Savings can fund // one and Spending is empty-handed — a spending account with nothing in it // is a demo, not a wallet. - const nextAfterAvatar = () => - (featureHook('arkReady') && wallet.spendable > 1000 + // A function declaration, not a const: the spend step above calls this + // while advancing past the avatar ask, i.e. BEFORE this line runs — a + // const there is in its temporal dead zone and threw "Cannot access + // before initialization", crashing onboarding right after a name claim or + // a coinos.io migration landed (a profile with a picture took this path). + function nextAfterAvatar() { + return (featureHook('arkReady') && wallet.spendable > 1000 && (featureHook('spendingSat') || 0) + (featureHook('spendingBoardingSat') || 0) < 1000) ? 'board' : 'success'; + } if (o.step === 'legacy') { // The migrate link carries this wallet's payment address, which the diff --git a/src/features/names.js b/src/features/names.js index cdcbfbf..7a0f0de 100644 --- a/src/features/names.js +++ b/src/features/names.js @@ -207,7 +207,14 @@ export function namesFeature(ctx) { const r = await withTimeout( fetch(`${REGISTRAR}/name/${encodeURIComponent(st.name)}?domain=${encodeURIComponent(st.domain || DOMAIN())}`).then((x) => x.json()), 8000, 'registrar'); - const mine = new Set([wallet.nostrPubkey && wallet.nostrPubkey(), (hook('nostrLoginIdentity') || {}).pubkey].filter(Boolean)); + // The linked login identity counts even while its signer hasn't + // resumed yet (a bunker/Google login comes back seconds after + // load): its pubkey is on record. Without this, a name owned by + // the login identity — every migrated coinos.io name — was judged + // "not ours" in that window, dropped, and replaced by the wallet + // key's npub-shaped default: the name visibly flipped to npub… + const stored = (() => { try { return (wallet.loadFeatureState('nostrlogin', {}) || {}).pubkey; } catch { return null; } })(); + const mine = new Set([wallet.nostrPubkey && wallet.nostrPubkey(), (hook('nostrLoginIdentity') || {}).pubkey, stored].filter(Boolean)); const ours = r && r.taken && (mine.has(r.pubkey) || mine.has(r.manager)); if (r && !ours) { save({}); st = load(); render(); } } catch {} |
