Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080
Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080j0ntz wants to merge 3 commits into
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
00faa89 to
7f1149f
Compare
With the core's wallet cache (wallet cache v2 phase 1), wallet objects
exist before their engines load, and waitForAllWallets resolves in that
window. Three login-path surfaces consumed engine state immediately:
- The action queue's address-balance effect read balanceMap right after
awaiting the wallet, which could evaluate a balance effect against
cached, possibly stale balances. It now reports not-yet-effective
until the engine has fully synced, matching the conservatism the loan
flow already applies.
- The FIO address refresh called otherMethods on pre-engine wallets,
which is {} in that window. Services now waits for each FIO wallet's
engine-backed otherMethods (bounded by a generous safety-valve
timeout) before refreshing.
- FioService's periodic expired-domain check called
otherMethods.getFioAddresses the same way (caught live on the sim).
It now skips pre-engine wallets and lets the next 30s cycle retry,
which also avoids wedging its one-shot expiredChecking latch.
7f1149f to
0a089ca
Compare
The core's new post-login queue staggers cached wallets' engine startup. withWallet covers every wallet-scoped scene, so opening one calls waitForCurrencyWallet, which moves that wallet's engine to the front of the queue.
There was a problem hiding this comment.
Claude Code Review
Claude Code Review is paused for this repository. To reconnect it, an admin of this repository's GitHub organization (or the account owner, for personal repositories) who can also manage your Claude organization's Code Review settings needs to re-link GitHub in Code Review settings. This is a one-time step.
Tip: disable this comment in your organization's Code Review settings.
There was a problem hiding this comment.
Claude Code Review
Claude Code Review is paused for this repository. To reconnect it, an admin of this repository's GitHub organization (or the account owner, for personal repositories) who can also manage your Claude organization's Code Review settings needs to re-link GitHub in Code Review settings. This is a one-time step.
Tip: disable this comment in your organization's Code Review settings.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 8f2ef2f. Configure here.
8f2ef2f to
0de615b
Compare
The receive scene waited on the wallet engine for every address, so a warm login showed a spinner until the engine loaded. It now opts into the core's cached address (getAddresses allowCached) and renders it at once. On a rotating-address chain the cached answer is provisional: a muted inline row with an info glyph, 'Checking for your latest address', and a spinner sits below the address, the QR is capped to reserve that row's height so it never reflows, and the confirmed address swaps in only if it differs once the engine loads. Stable chains show the cached address full-size with no row.
0de615b to
5d1a879
Compare
📸🩹 Test evidence: provisional receive affordance
🩹 HACK-FORCED: provisional affordance Captured by the agent's in-app test run (build-and-test). |










CHANGELOG
Does this branch warrant an entry to the CHANGELOG?
Dependencies
EdgeApp/edge-core-js#733
Requirements
If you have made any visual changes to the GUI. Make sure you have:
Description
GUI-side patches for wallet cache v2 phase 1 (TDD section 7: pinned, live). With EdgeApp/edge-core-js#733, wallet objects exist before their engines load and
waitForAllWalletsresolves in that window, so the login-path surfaces that consumed engine state at resolve-time are gated on engine readiness:checkActionEffect.ts(address-balance): reported the effect againstbalanceMapimmediately after awaiting the wallet, which could now evaluate cached, possibly stale balances. It reports not-yet-effective until the engine has fully synced (same conservatism as the loan flow'swaitForLoanAccountSyncand the existing< 1treatment in spend paths, TDD 7.4), letting the action queue's normal 15s poll re-check.Services.tsx: the post-waitForAllWalletsFIO refreshes (refreshConnectedWallets,refreshAllFioAddresses) callwallet.otherMethods.*, which the core guarantees is{}pre-engine. A newwaitForWalletOtherMethodsutil watchesotherMethodsuntil the engine's methods land (10-minute safety-valve timeout, roughly matching how longwaitForAllWalletscould already take on large accounts before the cache existed).FioService.ts: the periodic expired-domain check callsotherMethods.getFioAddressesthe same way. This one was NOT in the TDD's section-7 audit; it was caught live on the simulator (red dev alertwallet.otherMethods.getFioAddresses is not a functionseconds after a warm cached login). Being a 30s periodic task, it skips pre-engine wallets and lets the next cycle retry, which also avoids wedging its one-shotexpiredCheckinglatch when no wallet is ready yet.Remaining
otherMethodscall sites (FIO scenes, staking, WalletConnect) are user-navigation surfaces audited in the TDD as safe (null-probes, or flows that imply an engine exists) and are unchanged.Tested on the iOS simulator against the linked core build (edge-funds, 194 wallets): cold login wrote all 194
walletCache.jsonfiles; warm relaunch rendered the full wallet list with names and balances from the cache while engines were still loading; no FIO alert through 140s of runtime; drilling into a wallet shows live engine-backed data on the same wallet object. Screenshots attached below.Phase 2: tap-prioritization
The core now staggers cached wallets' engine startup through a limited-concurrency queue (EdgeApp/edge-core-js#733 phase 2).
withWalletwraps every wallet-scoped scene, so opening one callsaccount.waitForCurrencyWallet(walletId), which moves that wallet's engine startup to the front of the queue. The call is a fire-and-forget hint; a deleted or broken wallet is already handled by the existing goBack effect.Phase 6: provisional receive address (TDD section 7.5, decision 9.9)
The receive scene (
RequestScene.tsx) waited on the engine for every address, so a rotating-address chain showed a loading state until the engine started. It now opts into the core's cached address (getAddresses({ allowCached: true }), EdgeApp/edge-core-js#733 phase 6) and renders it immediately.!hasStableAddresses), the cached address is provisional: a static inline affordance sits under the address (a muted circled-i glyph, "Checking for your latest address", and a spinner; informational, not tappable, not a warning color). A 350ms grace timer gates it on, so a warm engine that confirms first never flashes it; the QR is capped to reserve the row's height so toggling never reflows it.withWalletinstance is reused across wallet switches) or after unmount is ignored rather than overwriting the current address. A later refresh /addressChangedrotation takes the plain engine-gated path, so it never shows a stale address.Rotating-chain behavior is provable in-app on a UTXO chain (BTC/LTC) with no plugin change; the stable-chain skip and the core gating are covered by unit tests. Depends on the core
allowCachedoption (EdgeApp/edge-core-js#733) and, for stable chains, the plugin flags (draft EdgeApp/edge-currency-accountbased#1076).TDD (pinned, live): implementation divergences and the decisions are documented inline in the affected sections.
Asana: https://app.asana.com/1/9976422036640/project/1213843652804305/task/1216673467164267
Note
Medium Risk
Touches login-time FIO refresh, action-queue balance gating, and receive-address display on rotating chains; wrong timing could show stale addresses or delay automation, but guards and conservative "not effective" behavior limit exposure.
Overview
Adapts the GUI for wallet cache v2, where wallet objects appear before their engines load.
Receive (
RequestScene) shows a cached address immediately on warm login for rotating chains (!hasStableAddresses), usinggetAddresses({ allowCached: true })and reconciling against the engine-confirmed address. A fixed-height "Checking for your latest address" row (with spinner) appears only after a 350ms grace period if the engine has not confirmed; staleness tokens prevent races across wallet switches and unmount.Engine readiness gates: action-queue
address-balanceeffects defer untilsyncStatusreaches the done threshold so cached balances are not evaluated early. Post-login FIO work inServices.tsxwaits on a newwaitForWalletOtherMethodshelper beforerefreshConnectedWallets/refreshAllFioAddresses; FioService skips FIO wallets whoseotherMethodsare not ready and fixes the expired-check latch in afinallyblock.Tap prioritization:
withWalletcallsaccount.waitForCurrencyWallet(walletId)when opening wallet-scoped scenes so that wallet’s engine is bumped to the front of the post-login queue.Adds locale string
request_provisional_address, a RequestScene unit test for the provisional affordance, and CHANGELOG entries.Reviewed by Cursor Bugbot for commit 5d1a879. Bugbot is set up for automated code reviews on this repo. Configure here.