Skip to content

Conversation

@ccharly
Copy link
Contributor

@ccharly ccharly commented Sep 17, 2025

Explanation

The multichain-account-service is responsible of holding/grouping all BIP-44 accounts together (in wallets and groups).

The account-tree-controller was re-using a similar matching logic to build it's tree and match those wallets and groups. But... In reality, this is the responsibility of the service and thus, the controller should "consume" the wallets/groups from the service directly.

Architecture wise, this is more correct, and other kind of wallets could follow the same pattern (having 1 wallet for each keyring types and 1 wallet for each other kind of account management Snaps).

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

Note

Switches multichain (BIP-44) wallet/group construction to MultichainAccountService, listening to its events and skipping BIP-44 in AccountsController event handling.

  • Controller (core):
    • Use MultichainAccountService:getMultichainAccountWallets to build AccountWalletType.Entropy wallets and MultichainAccount groups; remove entropy matching from controller.
    • Listen to MultichainAccountService:{multichainAccountGroupCreated,multichainAccountGroupUpdated,walletStatusChange} to insert/update groups and wallet status post-init.
    • Skip BIP-44 accounts on AccountsController:account{Added,Removed}; only process non-BIP-44 (Snap/Keyring) accounts.
    • Refactor naming: introduce getEntropyDefaultAccountWalletName and getEntropyDefaultAccountGroupPrefix; keep computed group names with EVM priority and conflict resolution.
    • Maintain reverse mappings, pruning, ordering, and selected-group sync; add sorting helper for group accounts.
  • Rules (entropy):
    • Replace EntropyRule class with pure helpers: getEntropyDefaultAccountWalletName, getEntropyComputedAccountGroupName, getEntropyDefaultAccountGroupPrefix.
  • Types/Messaging:
    • Extend messenger actions/events to include MultichainAccountService wallets and group events.
  • Tests:
    • Update/expand tests to validate service-driven wallet/group creation, event handling, ordering, selection sync, and non-BIP-44 add/remove paths.
  • Changelog:
    • Mark BREAKING: multichain (BIP-44) nodes now sourced from MultichainAccountService.

Written by Cursor Bugbot for commit 88cb1ba. This will update automatically on new commits. Configure here.

@ccharly
Copy link
Contributor Author

ccharly commented Sep 17, 2025

@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.15.1-preview-4390b9dd",
  "@metamask-previews/accounts-controller": "33.1.0-preview-4390b9dd",
  "@metamask-previews/address-book-controller": "6.1.1-preview-4390b9dd",
  "@metamask-previews/announcement-controller": "7.0.3-preview-4390b9dd",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-4390b9dd",
  "@metamask-previews/approval-controller": "7.1.3-preview-4390b9dd",
  "@metamask-previews/assets-controllers": "75.2.0-preview-4390b9dd",
  "@metamask-previews/base-controller": "8.4.0-preview-4390b9dd",
  "@metamask-previews/bridge-controller": "43.0.0-preview-4390b9dd",
  "@metamask-previews/bridge-status-controller": "43.0.0-preview-4390b9dd",
  "@metamask-previews/build-utils": "3.0.3-preview-4390b9dd",
  "@metamask-previews/chain-agnostic-permission": "1.1.1-preview-4390b9dd",
  "@metamask-previews/composable-controller": "11.0.0-preview-4390b9dd",
  "@metamask-previews/controller-utils": "11.14.0-preview-4390b9dd",
  "@metamask-previews/delegation-controller": "0.7.0-preview-4390b9dd",
  "@metamask-previews/earn-controller": "7.0.0-preview-4390b9dd",
  "@metamask-previews/eip-5792-middleware": "1.1.0-preview-4390b9dd",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-4390b9dd",
  "@metamask-previews/ens-controller": "17.0.1-preview-4390b9dd",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-4390b9dd",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-4390b9dd",
  "@metamask-previews/foundryup": "1.0.1-preview-4390b9dd",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-4390b9dd",
  "@metamask-previews/gator-permissions-controller": "0.1.0-preview-4390b9dd",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-4390b9dd",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-4390b9dd",
  "@metamask-previews/keyring-controller": "23.1.0-preview-4390b9dd",
  "@metamask-previews/logging-controller": "6.0.4-preview-4390b9dd",
  "@metamask-previews/message-manager": "12.0.2-preview-4390b9dd",
  "@metamask-previews/messenger": "0.3.0-preview-4390b9dd",
  "@metamask-previews/multichain-account-service": "0.8.0-preview-4390b9dd",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-4390b9dd",
  "@metamask-previews/multichain-network-controller": "0.12.0-preview-4390b9dd",
  "@metamask-previews/multichain-transactions-controller": "5.0.0-preview-4390b9dd",
  "@metamask-previews/name-controller": "8.0.3-preview-4390b9dd",
  "@metamask-previews/network-controller": "24.1.0-preview-4390b9dd",
  "@metamask-previews/network-enablement-controller": "1.1.0-preview-4390b9dd",
  "@metamask-previews/notification-services-controller": "18.1.0-preview-4390b9dd",
  "@metamask-previews/permission-controller": "11.0.6-preview-4390b9dd",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-4390b9dd",
  "@metamask-previews/phishing-controller": "13.1.0-preview-4390b9dd",
  "@metamask-previews/polling-controller": "14.0.0-preview-4390b9dd",
  "@metamask-previews/preferences-controller": "19.0.0-preview-4390b9dd",
  "@metamask-previews/profile-sync-controller": "25.0.0-preview-4390b9dd",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-4390b9dd",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-4390b9dd",
  "@metamask-previews/sample-controllers": "1.0.0-preview-4390b9dd",
  "@metamask-previews/seedless-onboarding-controller": "4.0.0-preview-4390b9dd",
  "@metamask-previews/selected-network-controller": "24.0.0-preview-4390b9dd",
  "@metamask-previews/shield-controller": "0.1.2-preview-4390b9dd",
  "@metamask-previews/signature-controller": "33.0.0-preview-4390b9dd",
  "@metamask-previews/subscription-controller": "0.1.0-preview-4390b9dd",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-4390b9dd",
  "@metamask-previews/transaction-controller": "60.3.0-preview-4390b9dd",
  "@metamask-previews/user-operation-controller": "39.0.0-preview-4390b9dd"
}

@ccharly ccharly force-pushed the feat/account-tree-controller-use-service branch from 4390b9d to c5de1f5 Compare September 17, 2025 21:40
@ccharly
Copy link
Contributor Author

ccharly commented Sep 17, 2025

@metamaskbot publish-preview

@ccharly
Copy link
Contributor Author

ccharly commented Sep 18, 2025

@metamaskbot publish-preview

@ccharly
Copy link
Contributor Author

ccharly commented Sep 18, 2025

@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.16.1-preview-591781b",
  "@metamask-previews/accounts-controller": "33.1.0-preview-591781b",
  "@metamask-previews/address-book-controller": "6.1.1-preview-591781b",
  "@metamask-previews/announcement-controller": "7.0.3-preview-591781b",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-591781b",
  "@metamask-previews/approval-controller": "7.1.3-preview-591781b",
  "@metamask-previews/assets-controllers": "75.2.0-preview-591781b",
  "@metamask-previews/base-controller": "8.4.0-preview-591781b",
  "@metamask-previews/bridge-controller": "43.1.0-preview-591781b",
  "@metamask-previews/bridge-status-controller": "43.1.0-preview-591781b",
  "@metamask-previews/build-utils": "3.0.3-preview-591781b",
  "@metamask-previews/chain-agnostic-permission": "1.1.1-preview-591781b",
  "@metamask-previews/composable-controller": "11.0.0-preview-591781b",
  "@metamask-previews/controller-utils": "11.14.0-preview-591781b",
  "@metamask-previews/delegation-controller": "0.7.0-preview-591781b",
  "@metamask-previews/earn-controller": "7.0.0-preview-591781b",
  "@metamask-previews/eip-5792-middleware": "1.1.0-preview-591781b",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-591781b",
  "@metamask-previews/ens-controller": "17.0.1-preview-591781b",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-591781b",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-591781b",
  "@metamask-previews/foundryup": "1.0.1-preview-591781b",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-591781b",
  "@metamask-previews/gator-permissions-controller": "0.1.0-preview-591781b",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-591781b",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-591781b",
  "@metamask-previews/keyring-controller": "23.1.0-preview-591781b",
  "@metamask-previews/logging-controller": "6.0.4-preview-591781b",
  "@metamask-previews/message-manager": "12.0.2-preview-591781b",
  "@metamask-previews/messenger": "0.3.0-preview-591781b",
  "@metamask-previews/multichain-account-service": "0.9.0-preview-591781b",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-591781b",
  "@metamask-previews/multichain-network-controller": "0.12.0-preview-591781b",
  "@metamask-previews/multichain-transactions-controller": "5.0.0-preview-591781b",
  "@metamask-previews/name-controller": "8.0.3-preview-591781b",
  "@metamask-previews/network-controller": "24.1.0-preview-591781b",
  "@metamask-previews/network-enablement-controller": "1.1.0-preview-591781b",
  "@metamask-previews/notification-services-controller": "18.1.0-preview-591781b",
  "@metamask-previews/permission-controller": "11.0.6-preview-591781b",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-591781b",
  "@metamask-previews/phishing-controller": "13.1.0-preview-591781b",
  "@metamask-previews/polling-controller": "14.0.0-preview-591781b",
  "@metamask-previews/preferences-controller": "19.0.0-preview-591781b",
  "@metamask-previews/profile-sync-controller": "25.0.0-preview-591781b",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-591781b",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-591781b",
  "@metamask-previews/sample-controllers": "1.0.0-preview-591781b",
  "@metamask-previews/seedless-onboarding-controller": "4.0.0-preview-591781b",
  "@metamask-previews/selected-network-controller": "24.0.0-preview-591781b",
  "@metamask-previews/shield-controller": "0.1.2-preview-591781b",
  "@metamask-previews/signature-controller": "33.0.0-preview-591781b",
  "@metamask-previews/subscription-controller": "0.1.0-preview-591781b",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-591781b",
  "@metamask-previews/transaction-controller": "60.4.0-preview-591781b",
  "@metamask-previews/user-operation-controller": "39.0.0-preview-591781b"
}

@ccharly
Copy link
Contributor Author

ccharly commented Oct 22, 2025

@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": "1.5.0-preview-53e28985",
  "@metamask-previews/accounts-controller": "33.1.1-preview-53e28985",
  "@metamask-previews/address-book-controller": "6.2.0-preview-53e28985",
  "@metamask-previews/announcement-controller": "7.1.0-preview-53e28985",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-53e28985",
  "@metamask-previews/approval-controller": "7.2.0-preview-53e28985",
  "@metamask-previews/assets-controllers": "82.0.0-preview-53e28985",
  "@metamask-previews/base-controller": "8.4.2-preview-53e28985",
  "@metamask-previews/bridge-controller": "54.0.0-preview-53e28985",
  "@metamask-previews/bridge-status-controller": "54.0.0-preview-53e28985",
  "@metamask-previews/build-utils": "3.0.4-preview-53e28985",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-53e28985",
  "@metamask-previews/composable-controller": "11.1.0-preview-53e28985",
  "@metamask-previews/controller-utils": "11.14.1-preview-53e28985",
  "@metamask-previews/core-backend": "2.1.0-preview-53e28985",
  "@metamask-previews/delegation-controller": "0.8.0-preview-53e28985",
  "@metamask-previews/earn-controller": "8.0.1-preview-53e28985",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-53e28985",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-53e28985",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-53e28985",
  "@metamask-previews/ens-controller": "17.1.0-preview-53e28985",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-53e28985",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-53e28985",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-53e28985",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-53e28985",
  "@metamask-previews/foundryup": "1.0.1-preview-53e28985",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-53e28985",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-53e28985",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-53e28985",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-53e28985",
  "@metamask-previews/keyring-controller": "23.1.1-preview-53e28985",
  "@metamask-previews/logging-controller": "6.1.0-preview-53e28985",
  "@metamask-previews/message-manager": "13.0.1-preview-53e28985",
  "@metamask-previews/messenger": "0.3.0-preview-53e28985",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-53e28985",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-53e28985",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-53e28985",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-53e28985",
  "@metamask-previews/name-controller": "8.1.0-preview-53e28985",
  "@metamask-previews/network-controller": "24.3.0-preview-53e28985",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-53e28985",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-53e28985",
  "@metamask-previews/permission-controller": "11.1.0-preview-53e28985",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-53e28985",
  "@metamask-previews/phishing-controller": "14.1.2-preview-53e28985",
  "@metamask-previews/polling-controller": "14.0.1-preview-53e28985",
  "@metamask-previews/preferences-controller": "20.1.0-preview-53e28985",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-53e28985",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-53e28985",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-53e28985",
  "@metamask-previews/sample-controllers": "2.0.1-preview-53e28985",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-53e28985",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-53e28985",
  "@metamask-previews/shield-controller": "0.3.2-preview-53e28985",
  "@metamask-previews/signature-controller": "34.0.1-preview-53e28985",
  "@metamask-previews/subscription-controller": "2.0.0-preview-53e28985",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-53e28985",
  "@metamask-previews/transaction-controller": "60.9.0-preview-53e28985",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-53e28985"
}

},
);

this.messenger.subscribe(
Copy link
Contributor

@fabiobozzo fabiobozzo Oct 28, 2025

Choose a reason for hiding this comment

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

What if these 2 new handlers fire before the initialization completes?

Should we add a guard before each like if (!this.#initialized) return; ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's a very good point, and IMO that make sense to add this !this.initialized check! I'll do this, thanks

'UserStorageController:performBatchSetStorage',
'AuthenticationController:getSessionProfile',
'MultichainAccountService:createMultichainAccountGroup',
'MultichainAccountService:getMultichainAccountWallets',
Copy link
Contributor

Choose a reason for hiding this comment

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

Don't we need to mock that action handler too in the test setup?

messenger.registerActionHandler(
  'MultichainAccountService:getMultichainAccountWallets',
  jest.fn().mockReturnValue([]), 
);

Copy link
Contributor

@fabiobozzo fabiobozzo left a comment

Choose a reason for hiding this comment

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

LGTM ✨

Finally, great separation of concerns, as you anticipated me long ago! Much cleaner than it was

fabiobozzo
fabiobozzo previously approved these changes Oct 29, 2025
@ccharly
Copy link
Contributor Author

ccharly commented Oct 29, 2025

@metamaskbot publish-previews

fabiobozzo
fabiobozzo previously approved these changes Oct 29, 2025
@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": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/accounts-controller": "34.0.0-preview-3d9bbf60",
  "@metamask-previews/address-book-controller": "7.0.0-preview-3d9bbf60",
  "@metamask-previews/announcement-controller": "8.0.0-preview-3d9bbf60",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/approval-controller": "8.0.0-preview-3d9bbf60",
  "@metamask-previews/assets-controllers": "84.0.0-preview-3d9bbf60",
  "@metamask-previews/base-controller": "9.0.0-preview-3d9bbf60",
  "@metamask-previews/bridge-controller": "56.0.0-preview-3d9bbf60",
  "@metamask-previews/bridge-status-controller": "56.0.0-preview-3d9bbf60",
  "@metamask-previews/build-utils": "3.0.4-preview-3d9bbf60",
  "@metamask-previews/chain-agnostic-permission": "1.2.1-preview-3d9bbf60",
  "@metamask-previews/composable-controller": "12.0.0-preview-3d9bbf60",
  "@metamask-previews/controller-utils": "11.14.1-preview-3d9bbf60",
  "@metamask-previews/core-backend": "4.0.0-preview-3d9bbf60",
  "@metamask-previews/delegation-controller": "1.0.0-preview-3d9bbf60",
  "@metamask-previews/earn-controller": "9.0.0-preview-3d9bbf60",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-3d9bbf60",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-3d9bbf60",
  "@metamask-previews/ens-controller": "18.0.0-preview-3d9bbf60",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-3d9bbf60",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-3d9bbf60",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-3d9bbf60",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-3d9bbf60",
  "@metamask-previews/foundryup": "1.0.1-preview-3d9bbf60",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-3d9bbf60",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-3d9bbf60",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-3d9bbf60",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-3d9bbf60",
  "@metamask-previews/keyring-controller": "24.0.0-preview-3d9bbf60",
  "@metamask-previews/logging-controller": "7.0.0-preview-3d9bbf60",
  "@metamask-previews/message-manager": "14.0.0-preview-3d9bbf60",
  "@metamask-previews/messenger": "0.3.0-preview-3d9bbf60",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/multichain-api-middleware": "1.2.2-preview-3d9bbf60",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-3d9bbf60",
  "@metamask-previews/name-controller": "9.0.0-preview-3d9bbf60",
  "@metamask-previews/network-controller": "25.0.0-preview-3d9bbf60",
  "@metamask-previews/network-enablement-controller": "3.0.0-preview-3d9bbf60",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-3d9bbf60",
  "@metamask-previews/permission-controller": "12.0.0-preview-3d9bbf60",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-3d9bbf60",
  "@metamask-previews/phishing-controller": "15.0.0-preview-3d9bbf60",
  "@metamask-previews/polling-controller": "15.0.0-preview-3d9bbf60",
  "@metamask-previews/preferences-controller": "21.0.0-preview-3d9bbf60",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-3d9bbf60",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-3d9bbf60",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-3d9bbf60",
  "@metamask-previews/sample-controllers": "3.0.0-preview-3d9bbf60",
  "@metamask-previews/seedless-onboarding-controller": "5.0.0-preview-3d9bbf60",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-3d9bbf60",
  "@metamask-previews/shield-controller": "1.0.0-preview-3d9bbf60",
  "@metamask-previews/signature-controller": "35.0.0-preview-3d9bbf60",
  "@metamask-previews/subscription-controller": "3.0.0-preview-3d9bbf60",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-3d9bbf60",
  "@metamask-previews/transaction-controller": "61.0.0-preview-3d9bbf60",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-3d9bbf60"
}

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.

3 participants