Skip to content

Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080

Open
j0ntz wants to merge 1 commit into
developfrom
jon/wallet-cache-v2
Open

Gate balance effects and FIO refresh on engine readiness (wallet cache v2)#6080
j0ntz wants to merge 1 commit into
developfrom
jon/wallet-cache-v2

Conversation

@j0ntz

@j0ntz j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

EdgeApp/edge-core-js#733

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Description

GUI-side patches for wallet cache v2 phase 1 (TDD section 7: immutable snapshot). With EdgeApp/edge-core-js#733, wallet objects exist before their engines load and waitForAllWallets resolves 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 against balanceMap immediately 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's waitForLoanAccountSync and the existing < 1 treatment in spend paths, TDD 7.4), letting the action queue's normal 15s poll re-check.
  • Services.tsx: the post-waitForAllWallets FIO refreshes (refreshConnectedWallets, refreshAllFioAddresses) call wallet.otherMethods.*, which the core guarantees is {} pre-engine. A new waitForWalletOtherMethods util watches otherMethods until the engine's methods land (10-minute safety-valve timeout, roughly matching how long waitForAllWallets could already take on large accounts before the cache existed).
  • FioService.ts: the periodic expired-domain check calls otherMethods.getFioAddresses the same way. This one was NOT in the TDD's section-7 audit; it was caught live on the simulator (red dev alert wallet.otherMethods.getFioAddresses is not a function seconds 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-shot expiredChecking latch when no wallet is ready yet.

Remaining otherMethods call 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.json files; 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.

Asana: https://app.asana.com/1/9976422036640/project/1213843652804305/task/1216673467164267


Note

Medium Risk
Touches login-time FIO refresh and action-queue balance gating on engine/sync state; mistakes could delay automations or skip FIO updates, but changes are conservative (wait/retry, no user-auth changes).

Overview
Adapts the GUI for wallet cache v2, where wallet objects appear before their engines finish loading and waitForAllWallets can resolve in that window.

Action queue: address-balance effects no longer compare balances immediately after waitForCurrencyWallet. They stay not effective until syncStatus.totalRatio reaches DONE_THRESHOLD, so cached balances are not used; the existing 15s poll retries.

Login FIO path: After waitForAllWallets, Services waits per FIO wallet via new waitForWalletOtherMethods (watches otherMethods, 10‑minute timeout, per-wallet errors logged) and bails if the account logged out before running refreshConnectedWallets / refreshAllFioAddresses.

FioService: The periodic expired-domain check only runs against wallets where getFioAddresses exists, uses try/finally so expiredChecking cannot stick, and retries on later cycles. ESLint no longer exempts FioService.ts from the services lint list.

Reviewed by Cursor Bugbot for commit 0a089ca. Bugbot is set up for automated code reviews on this repo. Configure here.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@j0ntz

j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (iOS sim, edge-funds)

agent proof 1216673467164267 01 cold login wallet list

agent proof 1216673467164267 01 cold login wallet list

agent proof 1216673467164267 02 warm login cached wallet list

agent proof 1216673467164267 02 warm login cached wallet list

agent proof 1216673467164267 03 wallet detail engine loaded

agent proof 1216673467164267 03 wallet detail engine loaded

Captured by the agent's in-app test run (build-and-test).

Comment thread src/components/services/Services.tsx
Comment thread src/components/services/FioService.ts Outdated
Comment thread src/util/waitForWalletOtherMethods.ts
@j0ntz
j0ntz force-pushed the jon/wallet-cache-v2 branch from 00faa89 to 7f1149f Compare July 18, 2026 01:10
Comment thread src/components/services/Services.tsx
@j0ntz

j0ntz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence (after review fixes)

agent proof 1216673467164267 04 warm login after review fixes

agent proof 1216673467164267 04 warm login after review fixes

Captured by the agent's in-app test run (build-and-test).

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.
@j0ntz
j0ntz force-pushed the jon/wallet-cache-v2 branch from 7f1149f to 0a089ca Compare July 18, 2026 01:31

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0a089ca. Configure here.

Comment thread src/controllers/action-queue/runtime/checkActionEffect.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant