Skip to content

Conversation

amitabh94
Copy link
Contributor

@amitabh94 amitabh94 commented Aug 4, 2025

Explanation

This PR implements the selectBalancesByAccountGroup selector and related balance selectors for the assets-controllers package. The selectors provide functionality to calculate total balances for account groups, wallets, and all wallets in the user's selected currency.

The selectors are written in way such they support both mobile and extension states so that it is fairly simple to just import the selectors from the controller and directly use them without creating any additional adapter selectors.

You can use the seelctor in mobile or extension as follows:
useSelector(selectBalanceForAllWallets())

Mobile PR (Implementation) : MetaMask/metamask-mobile#18063

Current State and Need for Change

Currently, there's no centralized way to calculate total balances for account groups or wallets across multiple chains and account types. This makes it difficult for consumers to display aggregated balance information.

Solution

The new selectors provide:

  • selectBalanceByAccountGroup - Calculate total balance for a specific account group
  • selectBalanceByWallet - Calculate total balance for all groups in a wallet
  • selectBalanceForAllWallets - Calculate total balance across all wallets
  • selectBalanceForSelectedAccountGroup - Calculate balance for the currently selected account group

Technical Implementation

  • Uses reselect for memoization and performance optimization
  • Handles mixed account types (EVM + non-EVM) in the same group
  • Supports multichain balance aggregation with currency conversion
  • Includes fallback handling for missing conversion rates
  • Proper TypeScript typing throughout

References

  • Implements functionality for ASSETS-1077
  • Builds on the account-tree-controller integration
  • Supports multichain assets functionality

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

Copy link

socket-security bot commented Aug 4, 2025

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​metamask/​multichain-account-service@​0.3.0741007394100
Added@​metamask/​account-tree-controller@​0.7.0971007496100

View full report

@amitabh94 amitabh94 changed the title feat(assets): implement comprehensive balance selectors for multichain account groups feat(assets): implement comprehensive balance selectors for multichain account groups and wallets Aug 5, 2025
@amitabh94
Copy link
Contributor Author

@metamaskbot publish-preview

@amitabh94 amitabh94 marked this pull request as ready for review August 5, 2025 20:21
@amitabh94 amitabh94 requested review from a team as code owners August 5, 2025 20:21
@amitabh94 amitabh94 marked this pull request as draft August 5, 2025 20:21
cursor[bot]

This comment was marked as outdated.

Copy link
Contributor

github-actions bot commented Aug 5, 2025

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.7.0-preview-2e90d98e",
  "@metamask-previews/accounts-controller": "32.0.1-preview-2e90d98e",
  "@metamask-previews/address-book-controller": "6.1.1-preview-2e90d98e",
  "@metamask-previews/announcement-controller": "7.0.3-preview-2e90d98e",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-2e90d98e",
  "@metamask-previews/approval-controller": "7.1.3-preview-2e90d98e",
  "@metamask-previews/assets-controllers": "73.0.1-preview-2e90d98e",
  "@metamask-previews/base-controller": "8.0.1-preview-2e90d98e",
  "@metamask-previews/bridge-controller": "37.1.0-preview-2e90d98e",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-2e90d98e",
  "@metamask-previews/build-utils": "3.0.3-preview-2e90d98e",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-2e90d98e",
  "@metamask-previews/composable-controller": "11.0.0-preview-2e90d98e",
  "@metamask-previews/controller-utils": "11.11.0-preview-2e90d98e",
  "@metamask-previews/delegation-controller": "0.6.0-preview-2e90d98e",
  "@metamask-previews/earn-controller": "4.0.0-preview-2e90d98e",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-2e90d98e",
  "@metamask-previews/ens-controller": "17.0.1-preview-2e90d98e",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-2e90d98e",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-2e90d98e",
  "@metamask-previews/foundryup": "1.0.1-preview-2e90d98e",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-2e90d98e",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-2e90d98e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-2e90d98e",
  "@metamask-previews/keyring-controller": "22.1.0-preview-2e90d98e",
  "@metamask-previews/logging-controller": "6.0.4-preview-2e90d98e",
  "@metamask-previews/message-manager": "12.0.2-preview-2e90d98e",
  "@metamask-previews/messenger": "0.0.0-preview-2e90d98e",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-2e90d98e",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-2e90d98e",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-2e90d98e",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-2e90d98e",
  "@metamask-previews/name-controller": "8.0.3-preview-2e90d98e",
  "@metamask-previews/network-controller": "24.0.1-preview-2e90d98e",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-2e90d98e",
  "@metamask-previews/permission-controller": "11.0.6-preview-2e90d98e",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-2e90d98e",
  "@metamask-previews/phishing-controller": "13.1.0-preview-2e90d98e",
  "@metamask-previews/polling-controller": "14.0.0-preview-2e90d98e",
  "@metamask-previews/preferences-controller": "18.4.1-preview-2e90d98e",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-2e90d98e",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-2e90d98e",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-2e90d98e",
  "@metamask-previews/sample-controllers": "1.0.0-preview-2e90d98e",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-2e90d98e",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-2e90d98e",
  "@metamask-previews/signature-controller": "32.0.0-preview-2e90d98e",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-2e90d98e",
  "@metamask-previews/transaction-controller": "59.1.0-preview-2e90d98e",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-2e90d98e"
}

@amitabh94
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

github-actions bot commented Aug 5, 2025

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.7.0-preview-e4e5ca5c",
  "@metamask-previews/accounts-controller": "32.0.1-preview-e4e5ca5c",
  "@metamask-previews/address-book-controller": "6.1.1-preview-e4e5ca5c",
  "@metamask-previews/announcement-controller": "7.0.3-preview-e4e5ca5c",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-e4e5ca5c",
  "@metamask-previews/approval-controller": "7.1.3-preview-e4e5ca5c",
  "@metamask-previews/assets-controllers": "73.0.1-preview-e4e5ca5c",
  "@metamask-previews/base-controller": "8.0.1-preview-e4e5ca5c",
  "@metamask-previews/bridge-controller": "37.1.0-preview-e4e5ca5c",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-e4e5ca5c",
  "@metamask-previews/build-utils": "3.0.3-preview-e4e5ca5c",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-e4e5ca5c",
  "@metamask-previews/composable-controller": "11.0.0-preview-e4e5ca5c",
  "@metamask-previews/controller-utils": "11.11.0-preview-e4e5ca5c",
  "@metamask-previews/delegation-controller": "0.6.0-preview-e4e5ca5c",
  "@metamask-previews/earn-controller": "4.0.0-preview-e4e5ca5c",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-e4e5ca5c",
  "@metamask-previews/ens-controller": "17.0.1-preview-e4e5ca5c",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-e4e5ca5c",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-e4e5ca5c",
  "@metamask-previews/foundryup": "1.0.1-preview-e4e5ca5c",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-e4e5ca5c",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-e4e5ca5c",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-e4e5ca5c",
  "@metamask-previews/keyring-controller": "22.1.0-preview-e4e5ca5c",
  "@metamask-previews/logging-controller": "6.0.4-preview-e4e5ca5c",
  "@metamask-previews/message-manager": "12.0.2-preview-e4e5ca5c",
  "@metamask-previews/messenger": "0.0.0-preview-e4e5ca5c",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-e4e5ca5c",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-e4e5ca5c",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-e4e5ca5c",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-e4e5ca5c",
  "@metamask-previews/name-controller": "8.0.3-preview-e4e5ca5c",
  "@metamask-previews/network-controller": "24.0.1-preview-e4e5ca5c",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-e4e5ca5c",
  "@metamask-previews/permission-controller": "11.0.6-preview-e4e5ca5c",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-e4e5ca5c",
  "@metamask-previews/phishing-controller": "13.1.0-preview-e4e5ca5c",
  "@metamask-previews/polling-controller": "14.0.0-preview-e4e5ca5c",
  "@metamask-previews/preferences-controller": "18.4.1-preview-e4e5ca5c",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-e4e5ca5c",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-e4e5ca5c",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-e4e5ca5c",
  "@metamask-previews/sample-controllers": "1.0.0-preview-e4e5ca5c",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-e4e5ca5c",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-e4e5ca5c",
  "@metamask-previews/signature-controller": "32.0.0-preview-e4e5ca5c",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-e4e5ca5c",
  "@metamask-previews/transaction-controller": "59.1.0-preview-e4e5ca5c",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-e4e5ca5c"
}

…es and integrate reselect

- Introduced new selectors to aggregate balances for account groups and wallets, supporting both EVM and Solana accounts.
- Implemented memoization using `reselect` to optimize performance and reduce unnecessary re-renders.
- Updated `package.json` and `yarn.lock` to include `reselect` as a dependency.
- Added comprehensive tests for the new selectors to ensure accuracy and reliability.

This enhancement improves the efficiency of balance calculations across multiple account types, facilitating better user experience in managing multichain assets.
- Updated `yarn.lock` to reflect the new version of `@metamask/account-tree-controller` and removed `@metamask/multichain-account-service` from dependencies.
- Enhanced `package.json` to include `@metamask/account-api` and `@metamask/base-controller` as devDependencies.
- Refactored selectors to utilize the `AccountTreeController` for improved account group handling and balance aggregation.
- Added tests to ensure the accuracy of the new selector implementations and edge case handling.

These changes optimize the performance of balance calculations and ensure better integration with the updated account management structure.
…ce test coverage

- Renamed selectors for clarity, changing `selectBalancesByAccountGroup` to `selectBalanceByAccountGroup` and similar for wallet and all wallets selectors.
- Improved the structure of mock state in tests to better reflect the current account and wallet hierarchy.
- Added comprehensive tests for the new selector implementations, ensuring accurate balance calculations and edge case handling.
- Optimized selector logic to enhance performance and maintainability, leveraging memoization where applicable.

These changes improve the readability and efficiency of the selector functions, ensuring better integration with the updated account management structure.
- Updated the `@metamask/account-api` dependency in `package.json` to version 0.7.0 for improved functionality.
- Added `@metamask/account-api` to `yarn.lock` to ensure consistent dependency resolution.

These changes enhance the assets controller's capabilities by leveraging the latest features and fixes from the updated account API.
…urrency support

- Updated `createMockState` to accept user currency, allowing for more flexible test scenarios.
- Added tests to verify balance calculations for specific account groups in multiple currencies (EUR, GBP).
- Implemented a new helper function `convertUsdToUserCurrency` to handle currency conversion logic.
- Ensured that selectors correctly fall back to USD when no conversion rate is available.

These changes improve test coverage and ensure accurate balance calculations across different currencies, enhancing the robustness of the balance selectors.
…n tsconfig.build.json

- Included a reference to the `account-tree-controller` in the `tsconfig.build.json` file to improve project structure and facilitate better integration between controllers.

This change enhances the modularity of the assets controller by establishing a clear dependency on the account tree controller.
… package.json and yarn.lock

- Removed the direct dependency on `@metamask/account-api` from `package.json` and added it to `peerDependencies` to better reflect its usage.
- Updated `yarn.lock` to ensure consistent resolution of the `@metamask/account-api` version.

These changes streamline the dependency management for the assets controller, ensuring clarity in the project's structure and dependencies.
…ect dependency

- Added `@metamask/account-api` back to `package.json` as a direct dependency to ensure its availability for the assets controller.
- Updated `yarn.lock` to reflect this change and maintain consistent dependency resolution.

This adjustment clarifies the assets controller's reliance on the account API, enhancing the project's dependency management.
…onal metadata

- Updated `createMockState` to include `pinned` and `hidden` properties in account group metadata for improved test scenarios.
- Added `accountGroupsMetadata` and `accountWalletsMetadata` to the mock state to better reflect the structure of account data.

These changes enhance the test coverage for balance selectors by ensuring that the metadata is accurately represented, leading to more robust and reliable tests.
- Removed try-catch block and streamlined the logic for extracting wallet and group information from the account tree state.
- Enhanced readability by directly returning early when wallet or group is not found, improving maintainability of the selector.

These changes improve the clarity and efficiency of the `getInternalAccountsForGroup` selector, ensuring it adheres to best practices for functional programming.
- Updated the coverage thresholds for branches, lines, and statements in `jest.config.js` to 91, 98, and 98 respectively.
- This change ensures that the coverage requirements are aligned with current project standards while maintaining a focus on code quality.

These adjustments help streamline the testing process and clarify the expectations for code coverage in the assets controllers.
…n selectors

- Enhanced the `selectBalanceByAccountGroup` selector to gracefully skip malformed balance values, preventing NaN propagation in calculations.
- Added a new test case to verify that the selector correctly handles invalid balance data while returning valid results.

These changes improve the robustness of the balance selectors by ensuring they can handle unexpected input without breaking functionality.
…urrency conversion

- Refactored balance selectors tests to utilize direct conversion rates instead of relying on USD conversion.
- Enhanced test cases to reflect accurate calculations for EUR and GBP, ensuring consistency with the new conversion logic.
- Updated assertions to use `toBeCloseTo` for floating-point precision in balance comparisons.
- Removed the `convertUsdToUserCurrency` helper function as it is no longer needed.

These changes improve the accuracy and reliability of balance calculations in the selectors, aligning with the recent refactor of the conversion logic.
…rmalization

- Introduced a new `AssetsSelectorState` type to standardize the state structure for assets controllers.
- Created `extractControllerStates` function to normalize state extraction from various structures (mobile, extension, flat).
- Updated balance selectors to utilize the new state adapter, improving maintainability and consistency across selectors.
- Added comprehensive tests for the `extractControllerStates` function to ensure correct behavior across different state formats.

These changes enhance the robustness and clarity of the state management in the assets controllers, aligning with best practices for functional programming.
…ng-api versions in yarn.lock

- Added new version entries for `@metamask/account-api@npm:^0.7.0` and `@metamask/keyring-api@npm:^19.1.0` with their respective dependencies and checksums.
- Updated the `@metamask/multichain-account-service` entry to specify the npm version.
- These changes ensure that the project uses the latest compatible versions of the dependencies, improving stability and functionality.
….json and yarn.lock

- Updated the version of `@metamask/account-api` from `^0.7.0` to `^0.9.0` in both `package.json` and `yarn.lock`.
- This change ensures compatibility with the latest features and improvements in the account API, enhancing the overall functionality of the assets controllers.
@amitabh94 amitabh94 force-pushed the ASSETS-1077-implement-selectbalancesbyaccountgroup-selector branch from 6ed1531 to 037d305 Compare August 6, 2025 20:53
@amitabh94
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

github-actions bot commented Aug 6, 2025

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.7.0-preview-037d305",
  "@metamask-previews/accounts-controller": "32.0.1-preview-037d305",
  "@metamask-previews/address-book-controller": "6.1.1-preview-037d305",
  "@metamask-previews/announcement-controller": "7.0.3-preview-037d305",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-037d305",
  "@metamask-previews/approval-controller": "7.1.3-preview-037d305",
  "@metamask-previews/assets-controllers": "73.0.2-preview-037d305",
  "@metamask-previews/base-controller": "8.0.1-preview-037d305",
  "@metamask-previews/bridge-controller": "37.1.0-preview-037d305",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-037d305",
  "@metamask-previews/build-utils": "3.0.3-preview-037d305",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-037d305",
  "@metamask-previews/composable-controller": "11.0.0-preview-037d305",
  "@metamask-previews/controller-utils": "11.11.0-preview-037d305",
  "@metamask-previews/delegation-controller": "0.6.0-preview-037d305",
  "@metamask-previews/earn-controller": "4.0.0-preview-037d305",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-037d305",
  "@metamask-previews/ens-controller": "17.0.1-preview-037d305",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-037d305",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-037d305",
  "@metamask-previews/foundryup": "1.0.1-preview-037d305",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-037d305",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-037d305",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-037d305",
  "@metamask-previews/keyring-controller": "22.1.0-preview-037d305",
  "@metamask-previews/logging-controller": "6.0.4-preview-037d305",
  "@metamask-previews/message-manager": "12.0.2-preview-037d305",
  "@metamask-previews/messenger": "0.0.0-preview-037d305",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-037d305",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-037d305",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-037d305",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-037d305",
  "@metamask-previews/name-controller": "8.0.3-preview-037d305",
  "@metamask-previews/network-controller": "24.0.1-preview-037d305",
  "@metamask-previews/network-enablement-controller": "0.1.0-preview-037d305",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-037d305",
  "@metamask-previews/permission-controller": "11.0.6-preview-037d305",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-037d305",
  "@metamask-previews/phishing-controller": "13.1.0-preview-037d305",
  "@metamask-previews/polling-controller": "14.0.0-preview-037d305",
  "@metamask-previews/preferences-controller": "18.4.1-preview-037d305",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-037d305",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-037d305",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-037d305",
  "@metamask-previews/sample-controllers": "1.0.0-preview-037d305",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-037d305",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-037d305",
  "@metamask-previews/signature-controller": "32.0.0-preview-037d305",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-037d305",
  "@metamask-previews/transaction-controller": "59.1.0-preview-037d305",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-037d305"
}

…tate access and remove state adapter

- Refactored balance selectors to utilize direct state access for improved performance and stability, supporting both mobile and extension state structures.
- Removed the `extractControllerStates` function and `AssetsSelectorState` type, simplifying the state management approach.
- Updated tests to reflect changes in state structure and ensure compatibility across different formats.
- Enhanced mock state creation functions for better clarity and maintainability.

These changes streamline the balance selectors, aligning with best practices for functional programming and improving overall code quality.
… state structure

- Modified balance selectors to access token balances using the updated structure: `tokenBalances[accountAddress][chainId][tokenAddress]`.
- Adjusted mock state creation to align with the new structure, enhancing clarity and maintainability.
- Updated tests to ensure compatibility with the revised state access patterns and to handle malformed balance values appropriately.

These changes improve the performance and robustness of the balance selectors, adhering to best practices for functional programming.
@amitabh94
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

github-actions bot commented Aug 7, 2025

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.7.0-preview-115d10e",
  "@metamask-previews/accounts-controller": "32.0.1-preview-115d10e",
  "@metamask-previews/address-book-controller": "6.1.1-preview-115d10e",
  "@metamask-previews/announcement-controller": "7.0.3-preview-115d10e",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-115d10e",
  "@metamask-previews/approval-controller": "7.1.3-preview-115d10e",
  "@metamask-previews/assets-controllers": "73.0.2-preview-115d10e",
  "@metamask-previews/base-controller": "8.0.1-preview-115d10e",
  "@metamask-previews/bridge-controller": "37.1.0-preview-115d10e",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-115d10e",
  "@metamask-previews/build-utils": "3.0.3-preview-115d10e",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-115d10e",
  "@metamask-previews/composable-controller": "11.0.0-preview-115d10e",
  "@metamask-previews/controller-utils": "11.11.0-preview-115d10e",
  "@metamask-previews/delegation-controller": "0.6.0-preview-115d10e",
  "@metamask-previews/earn-controller": "4.0.0-preview-115d10e",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-115d10e",
  "@metamask-previews/ens-controller": "17.0.1-preview-115d10e",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-115d10e",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-115d10e",
  "@metamask-previews/foundryup": "1.0.1-preview-115d10e",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-115d10e",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-115d10e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-115d10e",
  "@metamask-previews/keyring-controller": "22.1.0-preview-115d10e",
  "@metamask-previews/logging-controller": "6.0.4-preview-115d10e",
  "@metamask-previews/message-manager": "12.0.2-preview-115d10e",
  "@metamask-previews/messenger": "0.0.0-preview-115d10e",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-115d10e",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-115d10e",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-115d10e",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-115d10e",
  "@metamask-previews/name-controller": "8.0.3-preview-115d10e",
  "@metamask-previews/network-controller": "24.0.1-preview-115d10e",
  "@metamask-previews/network-enablement-controller": "0.1.0-preview-115d10e",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-115d10e",
  "@metamask-previews/permission-controller": "11.0.6-preview-115d10e",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-115d10e",
  "@metamask-previews/phishing-controller": "13.1.0-preview-115d10e",
  "@metamask-previews/polling-controller": "14.0.0-preview-115d10e",
  "@metamask-previews/preferences-controller": "18.4.1-preview-115d10e",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-115d10e",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-115d10e",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-115d10e",
  "@metamask-previews/sample-controllers": "1.0.0-preview-115d10e",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-115d10e",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-115d10e",
  "@metamask-previews/signature-controller": "32.0.0-preview-115d10e",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-115d10e",
  "@metamask-previews/transaction-controller": "59.1.0-preview-115d10e",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-115d10e"
}

Copy link
Contributor

github-actions bot commented Aug 7, 2025

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.7.0-preview-d8fe3a3",
  "@metamask-previews/accounts-controller": "32.0.1-preview-d8fe3a3",
  "@metamask-previews/address-book-controller": "6.1.1-preview-d8fe3a3",
  "@metamask-previews/announcement-controller": "7.0.3-preview-d8fe3a3",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-d8fe3a3",
  "@metamask-previews/approval-controller": "7.1.3-preview-d8fe3a3",
  "@metamask-previews/assets-controllers": "73.0.2-preview-d8fe3a3",
  "@metamask-previews/base-controller": "8.0.1-preview-d8fe3a3",
  "@metamask-previews/bridge-controller": "37.1.0-preview-d8fe3a3",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-d8fe3a3",
  "@metamask-previews/build-utils": "3.0.3-preview-d8fe3a3",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-d8fe3a3",
  "@metamask-previews/composable-controller": "11.0.0-preview-d8fe3a3",
  "@metamask-previews/controller-utils": "11.11.0-preview-d8fe3a3",
  "@metamask-previews/delegation-controller": "0.6.0-preview-d8fe3a3",
  "@metamask-previews/earn-controller": "4.0.0-preview-d8fe3a3",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-d8fe3a3",
  "@metamask-previews/ens-controller": "17.0.1-preview-d8fe3a3",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-d8fe3a3",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-d8fe3a3",
  "@metamask-previews/foundryup": "1.0.1-preview-d8fe3a3",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-d8fe3a3",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-d8fe3a3",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-d8fe3a3",
  "@metamask-previews/keyring-controller": "22.1.0-preview-d8fe3a3",
  "@metamask-previews/logging-controller": "6.0.4-preview-d8fe3a3",
  "@metamask-previews/message-manager": "12.0.2-preview-d8fe3a3",
  "@metamask-previews/messenger": "0.0.0-preview-d8fe3a3",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-d8fe3a3",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-d8fe3a3",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-d8fe3a3",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-d8fe3a3",
  "@metamask-previews/name-controller": "8.0.3-preview-d8fe3a3",
  "@metamask-previews/network-controller": "24.0.1-preview-d8fe3a3",
  "@metamask-previews/network-enablement-controller": "0.1.0-preview-d8fe3a3",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-d8fe3a3",
  "@metamask-previews/permission-controller": "11.0.6-preview-d8fe3a3",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-d8fe3a3",
  "@metamask-previews/phishing-controller": "13.1.0-preview-d8fe3a3",
  "@metamask-previews/polling-controller": "14.0.0-preview-d8fe3a3",
  "@metamask-previews/preferences-controller": "18.4.1-preview-d8fe3a3",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-d8fe3a3",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-d8fe3a3",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-d8fe3a3",
  "@metamask-previews/sample-controllers": "1.0.0-preview-d8fe3a3",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-d8fe3a3",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-d8fe3a3",
  "@metamask-previews/signature-controller": "32.0.0-preview-d8fe3a3",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-d8fe3a3",
  "@metamask-previews/transaction-controller": "59.1.0-preview-d8fe3a3",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-d8fe3a3"
}

@amitabh94 amitabh94 marked this pull request as ready for review August 7, 2025 03:44
cursor[bot]

This comment was marked as outdated.

…ve wallet balance calculations

- Refactored balance selectors to create a comprehensive selector that aggregates balances for all wallets and groups, serving as the single source of truth for balance calculations.
- Updated the `selectBalanceByAccountGroup` and `selectBalanceForAllWallets` functions to derive from the new comprehensive selector, ensuring proper memoization and improved performance.
- Enhanced handling of wallet and group balances, including robust checks for malformed balance values to prevent NaN propagation.
- These changes streamline balance calculations and improve the maintainability of the assets controllers, adhering to best practices for functional programming.
- Introduced a new test suite to verify the memoization behavior of balance selectors, ensuring that results are cached correctly for identical state inputs.
- Added tests for `selectBalanceByAccountGroup`, `selectBalanceByWallet`, `selectBalanceForAllWallets`, and `selectBalanceForSelectedAccountGroup` to confirm that they return the same reference for the same state and different references when state values change.
- These enhancements improve the reliability of the balance selectors by validating their performance optimizations and adherence to memoization best practices.
cursor[bot]

This comment was marked as outdated.

…lectors

- Introduced a new test suite to cover various edge cases and error handling scenarios in balance selectors.
- Added tests to ensure that selectors gracefully handle missing controller state, NaN balance values, and missing wallets or groups.
- Enhanced the robustness of balance calculations by verifying that valid results are returned even when encountering malformed data or unexpected states.
- These improvements ensure that the balance selectors maintain functionality and reliability under diverse conditions, adhering to best practices for error handling.
cursor[bot]

This comment was marked as outdated.

…alance selectors

- Introduced new test cases to verify the handling of tokens with various decimal scenarios, including 0, undefined, null, and NaN decimals.
- Ensured that balance calculations remain accurate and robust when encountering these edge cases, maintaining functionality under diverse conditions.
- Updated the balance selector logic to utilize nullish coalescing for decimal handling, preventing NaN propagation and improving overall reliability.
- These enhancements strengthen the error handling capabilities of the balance selectors, adhering to best practices for robust state management.
cursor[bot]

This comment was marked as outdated.

@amitabh94
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

github-actions bot commented Aug 7, 2025

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.7.0-preview-b31794c",
  "@metamask-previews/accounts-controller": "32.0.1-preview-b31794c",
  "@metamask-previews/address-book-controller": "6.1.1-preview-b31794c",
  "@metamask-previews/announcement-controller": "7.0.3-preview-b31794c",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-b31794c",
  "@metamask-previews/approval-controller": "7.1.3-preview-b31794c",
  "@metamask-previews/assets-controllers": "73.0.2-preview-b31794c",
  "@metamask-previews/base-controller": "8.0.1-preview-b31794c",
  "@metamask-previews/bridge-controller": "37.1.0-preview-b31794c",
  "@metamask-previews/bridge-status-controller": "37.0.0-preview-b31794c",
  "@metamask-previews/build-utils": "3.0.3-preview-b31794c",
  "@metamask-previews/chain-agnostic-permission": "1.1.0-preview-b31794c",
  "@metamask-previews/composable-controller": "11.0.0-preview-b31794c",
  "@metamask-previews/controller-utils": "11.11.0-preview-b31794c",
  "@metamask-previews/delegation-controller": "0.6.0-preview-b31794c",
  "@metamask-previews/earn-controller": "4.0.0-preview-b31794c",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-b31794c",
  "@metamask-previews/ens-controller": "17.0.1-preview-b31794c",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-b31794c",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-b31794c",
  "@metamask-previews/foundryup": "1.0.1-preview-b31794c",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-b31794c",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-b31794c",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-b31794c",
  "@metamask-previews/keyring-controller": "22.1.0-preview-b31794c",
  "@metamask-previews/logging-controller": "6.0.4-preview-b31794c",
  "@metamask-previews/message-manager": "12.0.2-preview-b31794c",
  "@metamask-previews/messenger": "0.0.0-preview-b31794c",
  "@metamask-previews/multichain-account-service": "0.3.0-preview-b31794c",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-b31794c",
  "@metamask-previews/multichain-network-controller": "0.11.0-preview-b31794c",
  "@metamask-previews/multichain-transactions-controller": "4.0.0-preview-b31794c",
  "@metamask-previews/name-controller": "8.0.3-preview-b31794c",
  "@metamask-previews/network-controller": "24.0.1-preview-b31794c",
  "@metamask-previews/network-enablement-controller": "0.1.0-preview-b31794c",
  "@metamask-previews/notification-services-controller": "16.0.0-preview-b31794c",
  "@metamask-previews/permission-controller": "11.0.6-preview-b31794c",
  "@metamask-previews/permission-log-controller": "4.0.0-preview-b31794c",
  "@metamask-previews/phishing-controller": "13.1.0-preview-b31794c",
  "@metamask-previews/polling-controller": "14.0.0-preview-b31794c",
  "@metamask-previews/preferences-controller": "18.4.1-preview-b31794c",
  "@metamask-previews/profile-sync-controller": "23.0.0-preview-b31794c",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-b31794c",
  "@metamask-previews/remote-feature-flag-controller": "1.7.0-preview-b31794c",
  "@metamask-previews/sample-controllers": "1.0.0-preview-b31794c",
  "@metamask-previews/seedless-onboarding-controller": "2.5.0-preview-b31794c",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-b31794c",
  "@metamask-previews/signature-controller": "32.0.0-preview-b31794c",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-b31794c",
  "@metamask-previews/transaction-controller": "59.1.0-preview-b31794c",
  "@metamask-previews/user-operation-controller": "38.0.0-preview-b31794c"
}

@amitabh94 amitabh94 enabled auto-merge (squash) August 7, 2025 17:37
@amitabh94 amitabh94 merged commit e810704 into main Aug 7, 2025
223 checks passed
@amitabh94 amitabh94 deleted the ASSETS-1077-implement-selectbalancesbyaccountgroup-selector branch August 7, 2025 17:45
amitabh94 added a commit that referenced this pull request Aug 7, 2025
…and dependency bump

### Added
- Comprehensive balance selectors for multichain account groups and wallets ([#6235](#6235))

### Changed
- Bump `@metamask/keyring-api` from `^19.0.0` to `^20.0.0` ([#6248](#6248))
@amitabh94 amitabh94 mentioned this pull request Aug 7, 2025
4 tasks
amitabh94 added a commit that referenced this pull request Aug 8, 2025
## Explanation

Bumps @metamask/assets-controllers to 73.1.0 to add comprehensive
balance selectors for multichain account groups and wallets, along with
dependency updates and bug fixes.

## References

- [#6235](#6235) - Comprehensive
balance selectors for multichain account groups and wallets
- [#6248](#6248) - Bump keyring-api
dependency
- [#6242](#6242) - Fix
DeFiPositionsController polling rate
- [#6250](#6250) - Fix
AccountTrackerController cache invalidation

## Checklist

- [x] I've updated the test suite for new or updated code as appropriate
- [x] I've updated documentation (JSDoc, Markdown, etc.) for new or
updated code as appropriate
- [x] I've communicated my changes to consumers by updating changelogs
for packages I've changed, highlighting breaking changes as necessary
- [x] I've prepared draft pull requests for clients and consumer
packages to resolve any breaking changes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants