Skip to content

fix(assets-controller): seed native balances after account refresh#9388

Open
salimtb wants to merge 3 commits into
mainfrom
fix/seed-native-metadata-new-account
Open

fix(assets-controller): seed native balances after account refresh#9388
salimtb wants to merge 3 commits into
mainfrom
fix/seed-native-metadata-new-account

Conversation

@salimtb

@salimtb salimtb commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Zero-balancing for new accounts ran before getAssets on account-tree changes, so assetsBalance was often never populated for the new account. Seed native zero balances using the refreshed account list after the fetch.

  • Fetch balances via RpcDataSource when a user switches EVM accounts, enables RPC-only networks, switches account groups, or adds a new account to the account tree
  • Fixes missing assetsBalance for newly added accounts on custom/RPC networks (e.g. DXC / eip155:50) where assetsInfo was present but balances were not fetched

Explanation

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Changes several hot paths for balance refresh and adds a new messenger subscription that requires host wiring; impact is localized to assets state merging but affects RPC-only and custom networks where API paths may not populate balances.

Overview
Adds a dedicated #fetchAccountBalancesViaRpc path that runs RpcDataSource balance middleware after the normal getAssets refresh and merges results into state, limited to chains RPC currently owns. This is wired into account group changes, new accounts on the account tree, newly enabled networks, EVM network picker switches, and a new AccountsController:selectedEvmAccountChange handler for switching EVM addresses within the same group.

The changelog notes that integrators must delegate AccountsController:selectedEvmAccountChange to the AssetsController messenger so in-group EVM switches refresh balances. Messenger allowed event types are aligned with *StateChangeEvent naming from related controllers.

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

salimtb added 2 commits July 4, 2026 12:57
Zero-balancing for new accounts ran before getAssets on account-tree
changes, so assetsBalance was often never populated for the new account.
Seed native zero balances using the refreshed account list after the fetch.
@salimtb salimtb marked this pull request as ready for review July 4, 2026 11:10
@salimtb salimtb requested review from a team as code owners July 4, 2026 11:10
@salimtb salimtb temporarily deployed to default-branch July 4, 2026 11:10 — with GitHub Actions Inactive
| AccountTreeControllerStateChangedEvent
| ClientControllerStateChangedEvent
| AccountTreeControllerStateChangeEvent
| ControllerStateChangedEvent<

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Can we use the imported version?
Less type issues then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same for the other state change events


// Switching EVM address within the same account group (e.g. Account 1 → Account 2).
this.messenger.subscribe(
'AccountsController:selectedEvmAccountChange',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

How come this and not the account tree change?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

accountTree change is not fired , that was the issue , now i need to relay on this event

});
this.#subscribeAssets();
if (newAccounts.length > 0) {
await this.#fetchAccountBalancesViaRpc(newAccounts, [

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thoughts on calling the above getAssets with newAccounts?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

hmmmm because getAssets will fetch also quick pipeline and restart all subscription , here i wanted to scope it only on rpc scope to make it better for perf

* @param chainIds - Chains to fetch on.
*/
async #fetchAccountBalancesViaRpc(
accounts: InternalAccount[],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

See prev comment, then we can potentially remove this?

// Subscribe after fetch so WS notifications can recover state
this.#subscribeAssets();

await this.#fetchAccountBalancesViaRpc(accounts, [

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Need to call around this. I'm not a fan of even more complexity


this.#subscribeAssets();

await this.#fetchAccountBalancesViaRpc(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Not sure I understand why this is needee

updateMode: 'merge',
});

await this.#fetchAccountBalancesViaRpc(accounts, addedChains);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

See prev comment

dataTypes: ['balance', 'metadata', 'price'],
});

await this.#fetchAccountBalancesViaRpc(accounts, [selectedChainId]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

See prev comment

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.

2 participants