diff --git a/packages/assets-controllers/CHANGELOG.md b/packages/assets-controllers/CHANGELOG.md index ccb00b0d13b..d48dd98eb5e 100644 --- a/packages/assets-controllers/CHANGELOG.md +++ b/packages/assets-controllers/CHANGELOG.md @@ -27,6 +27,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Malicious tokens that slip through are caught by the periodic rescan (runs daily by default) - Bump `@metamask/transaction-controller` from `^64.3.0` to `^64.4.0` ([#8585](https://github.com/MetaMask/core/pull/8585)) +### Fixed + +- Fix `selectAssetsBySelectedAccountGroup` crashing when an account referenced in the account tree is missing from internal accounts ([#8604](https://github.com/MetaMask/core/pull/8604)) + ## [104.3.0] ### Added diff --git a/packages/assets-controllers/src/selectors/token-selectors.test.ts b/packages/assets-controllers/src/selectors/token-selectors.test.ts index 76c79fc55a6..ccbac2f2d21 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.test.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.test.ts @@ -877,6 +877,18 @@ describe('token-selectors', () => { expect(result).toStrictEqual(expectedMockResult); }); + it('skips accounts referenced in accountTree but missing from internalAccounts', () => { + const state = cloneDeep(mockedMergedState); + + state.accountTree.wallets['entropy:01K1TJY9QPSCKNBSVGZNG510GJ'].groups[ + 'entropy:01K1TJY9QPSCKNBSVGZNG510GJ/0' + ].accounts.push('non-existent-account-id'); + + const result = selectAssetsBySelectedAccountGroup(state); + + expect(result).toStrictEqual(expectedMockResult); + }); + it('returns no tokens if there is no selected account group', () => { const result = selectAssetsBySelectedAccountGroup({ ...mockedMergedState, diff --git a/packages/assets-controllers/src/selectors/token-selectors.ts b/packages/assets-controllers/src/selectors/token-selectors.ts index af409382d40..4b6e7dc2b7d 100644 --- a/packages/assets-controllers/src/selectors/token-selectors.ts +++ b/packages/assets-controllers/src/selectors/token-selectors.ts @@ -140,6 +140,10 @@ const selectAccountsToGroupIdMap = createAssetListSelector( for (const accountId of accounts) { const internalAccount = internalAccounts.accounts[accountId]; + if (!internalAccount) { + continue; + } + accountsMap[ // TODO: We would not need internalAccounts if evmTokens state had the accountId internalAccount.type.startsWith('eip155')