Skip to content

Conversation

@ccharly
Copy link
Contributor

@ccharly ccharly commented Sep 11, 2025

Explanation

We were firing :selectedAccountChange before firing :accountAdded which does have undesired side-effect in the AccountTreeController.

Mainly because the tree will try to get the associated selected account group, but this account group does not exist yet (since it's using :accountAdded to create the account groups).

This is more like a temporary solution, and #update could be slightly refactored to a more robust solution later on.

References

N/A

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, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

@ccharly ccharly marked this pull request as ready for review September 11, 2025 13:50
@ccharly ccharly requested review from a team as code owners September 11, 2025 13:50
@ccharly ccharly force-pushed the fix/accounts-controller-selected-account-change branch from 9b3135c to 1f2cfed Compare September 11, 2025 13:50
@mathieuartu
Copy link
Contributor

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "0.14.0-preview-1f2cfed",
  "@metamask-previews/accounts-controller": "33.0.0-preview-1f2cfed",
  "@metamask-previews/address-book-controller": "6.1.1-preview-1f2cfed",
  "@metamask-previews/announcement-controller": "7.0.3-preview-1f2cfed",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-1f2cfed",
  "@metamask-previews/approval-controller": "7.1.3-preview-1f2cfed",
  "@metamask-previews/assets-controllers": "74.3.3-preview-1f2cfed",
  "@metamask-previews/base-controller": "8.3.0-preview-1f2cfed",
  "@metamask-previews/bridge-controller": "42.0.0-preview-1f2cfed",
  "@metamask-previews/bridge-status-controller": "42.0.0-preview-1f2cfed",
  "@metamask-previews/build-utils": "3.0.3-preview-1f2cfed",
  "@metamask-previews/chain-agnostic-permission": "1.1.1-preview-1f2cfed",
  "@metamask-previews/composable-controller": "11.0.0-preview-1f2cfed",
  "@metamask-previews/controller-utils": "11.12.0-preview-1f2cfed",
  "@metamask-previews/delegation-controller": "0.7.0-preview-1f2cfed",
  "@metamask-previews/earn-controller": "7.0.0-preview-1f2cfed",
  "@metamask-previews/eip-5792-middleware": "1.1.0-preview-1f2cfed",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-1f2cfed",
  "@metamask-previews/ens-controller": "17.0.1-preview-1f2cfed",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-1f2cfed",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-1f2cfed",
  "@metamask-previews/foundryup": "1.0.1-preview-1f2cfed",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-1f2cfed",
  "@metamask-previews/gator-permissions-controller": "0.1.0-preview-1f2cfed",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-1f2cfed",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-1f2cfed",
  "@metamask-previews/keyring-controller": "23.0.0-preview-1f2cfed",
  "@metamask-previews/logging-controller": "6.0.4-preview-1f2cfed",
  "@metamask-previews/message-manager": "12.0.2-preview-1f2cfed",
  "@metamask-previews/messenger": "0.2.0-preview-1f2cfed",
  "@metamask-previews/multichain-account-service": "0.7.0-preview-1f2cfed",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-1f2cfed",
  "@metamask-previews/multichain-network-controller": "0.12.0-preview-1f2cfed",
  "@metamask-previews/multichain-transactions-controller": "5.0.0-preview-1f2cfed",
  "@metamask-previews/name-controller": "8.0.3-preview-1f2cfed",
  "@metamask-previews/network-controller": "24.1.0-preview-1f2cfed",
  "@metamask-previews/network-enablement-controller": "0.5.0-preview-1f2cfed",
  "@metamask-previews/notification-services-controller": "18.1.0-preview-1f2cfed",
  "@metamask-previews/permission-controller": "11.0.6-preview-1f2cfed",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-1f2cfed",
  "@metamask-previews/phishing-controller": "13.1.0-preview-1f2cfed",
  "@metamask-previews/polling-controller": "14.0.0-preview-1f2cfed",
  "@metamask-previews/preferences-controller": "19.0.0-preview-1f2cfed",
  "@metamask-previews/profile-sync-controller": "25.0.0-preview-1f2cfed",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-1f2cfed",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-1f2cfed",
  "@metamask-previews/sample-controllers": "1.0.0-preview-1f2cfed",
  "@metamask-previews/seedless-onboarding-controller": "4.0.0-preview-1f2cfed",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-1f2cfed",
  "@metamask-previews/shield-controller": "0.1.2-preview-1f2cfed",
  "@metamask-previews/signature-controller": "33.0.0-preview-1f2cfed",
  "@metamask-previews/subscription-controller": "0.0.0-preview-1f2cfed",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-1f2cfed",
  "@metamask-previews/transaction-controller": "60.3.0-preview-1f2cfed",
  "@metamask-previews/user-operation-controller": "39.0.0-preview-1f2cfed"
}

Comment on lines +885 to +899
// Will get executed after the update, but before re-selecting an account in case
// the current one is not valid anymore.
() => {
// Now publish events
for (const id of diff.removed) {
this.messagingSystem.publish('AccountsController:accountRemoved', id);
}

for (const account of diff.added) {
this.messagingSystem.publish('AccountsController:accountAdded', account);
}
for (const account of diff.added) {
this.messagingSystem.publish(
'AccountsController:accountAdded',
account,
);
}
},
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This new callback will get executed prior to the account selection. This solves the issue during onboarding when the keyring creates its initial account (which triggers a :stateChange).

With this change, we will be firing :accountAdded before :selectedAccount, thus allowing the account-tree-controller to first create its group before trying to mirror the selected account group.


this.#update((state) => {
const { internalAccounts } = state;
this.#update(
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Watchout, this call now takes 2 callbacks:

  1. The actual update to run
  2. The pre-step before selecting the new account that can result from the state update

Copy link
Contributor

@mathieuartu mathieuartu left a comment

Choose a reason for hiding this comment

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

LGTM, have manually tested in extension and works as intended

@ccharly ccharly merged commit 0a6e91c into main Sep 11, 2025
239 checks passed
@ccharly ccharly deleted the fix/accounts-controller-selected-account-change branch September 11, 2025 15:10
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.

4 participants