@metamask/assets-controllers 83.1.0 → 85.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/dist/AccountTrackerController.cjs +20 -21
  3. package/dist/AccountTrackerController.cjs.map +1 -1
  4. package/dist/AccountTrackerController.d.cts +4 -3
  5. package/dist/AccountTrackerController.d.cts.map +1 -1
  6. package/dist/AccountTrackerController.d.mts +4 -3
  7. package/dist/AccountTrackerController.d.mts.map +1 -1
  8. package/dist/AccountTrackerController.mjs +20 -21
  9. package/dist/AccountTrackerController.mjs.map +1 -1
  10. package/dist/AssetsContractController.cjs +10 -10
  11. package/dist/AssetsContractController.cjs.map +1 -1
  12. package/dist/AssetsContractController.d.cts +3 -3
  13. package/dist/AssetsContractController.d.cts.map +1 -1
  14. package/dist/AssetsContractController.d.mts +3 -3
  15. package/dist/AssetsContractController.d.mts.map +1 -1
  16. package/dist/AssetsContractController.mjs +10 -10
  17. package/dist/AssetsContractController.mjs.map +1 -1
  18. package/dist/CurrencyRateController.cjs +68 -15
  19. package/dist/CurrencyRateController.cjs.map +1 -1
  20. package/dist/CurrencyRateController.d.cts +18 -10
  21. package/dist/CurrencyRateController.d.cts.map +1 -1
  22. package/dist/CurrencyRateController.d.mts +18 -10
  23. package/dist/CurrencyRateController.d.mts.map +1 -1
  24. package/dist/CurrencyRateController.mjs +68 -15
  25. package/dist/CurrencyRateController.mjs.map +1 -1
  26. package/dist/DeFiPositionsController/DeFiPositionsController.cjs +7 -7
  27. package/dist/DeFiPositionsController/DeFiPositionsController.cjs.map +1 -1
  28. package/dist/DeFiPositionsController/DeFiPositionsController.d.cts +3 -2
  29. package/dist/DeFiPositionsController/DeFiPositionsController.d.cts.map +1 -1
  30. package/dist/DeFiPositionsController/DeFiPositionsController.d.mts +3 -2
  31. package/dist/DeFiPositionsController/DeFiPositionsController.d.mts.map +1 -1
  32. package/dist/DeFiPositionsController/DeFiPositionsController.mjs +7 -7
  33. package/dist/DeFiPositionsController/DeFiPositionsController.mjs.map +1 -1
  34. package/dist/MultichainAssetsController/MultichainAssetsController.cjs +54 -22
  35. package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
  36. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts +18 -3
  37. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
  38. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts +18 -3
  39. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
  40. package/dist/MultichainAssetsController/MultichainAssetsController.mjs +54 -22
  41. package/dist/MultichainAssetsController/MultichainAssetsController.mjs.map +1 -1
  42. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +13 -13
  43. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
  44. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts +4 -3
  45. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -1
  46. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts +4 -3
  47. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -1
  48. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +13 -13
  49. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
  50. package/dist/MultichainBalancesController/MultichainBalancesController.cjs +9 -9
  51. package/dist/MultichainBalancesController/MultichainBalancesController.cjs.map +1 -1
  52. package/dist/MultichainBalancesController/MultichainBalancesController.d.cts +3 -2
  53. package/dist/MultichainBalancesController/MultichainBalancesController.d.cts.map +1 -1
  54. package/dist/MultichainBalancesController/MultichainBalancesController.d.mts +3 -2
  55. package/dist/MultichainBalancesController/MultichainBalancesController.d.mts.map +1 -1
  56. package/dist/MultichainBalancesController/MultichainBalancesController.mjs +9 -9
  57. package/dist/MultichainBalancesController/MultichainBalancesController.mjs.map +1 -1
  58. package/dist/NftController.cjs +25 -25
  59. package/dist/NftController.cjs.map +1 -1
  60. package/dist/NftController.d.cts +3 -3
  61. package/dist/NftController.d.cts.map +1 -1
  62. package/dist/NftController.d.mts +3 -3
  63. package/dist/NftController.d.mts.map +1 -1
  64. package/dist/NftController.mjs +25 -25
  65. package/dist/NftController.mjs.map +1 -1
  66. package/dist/NftDetectionController.cjs +5 -6
  67. package/dist/NftDetectionController.cjs.map +1 -1
  68. package/dist/NftDetectionController.d.cts +5 -5
  69. package/dist/NftDetectionController.d.cts.map +1 -1
  70. package/dist/NftDetectionController.d.mts +5 -5
  71. package/dist/NftDetectionController.d.mts.map +1 -1
  72. package/dist/NftDetectionController.mjs +5 -6
  73. package/dist/NftDetectionController.mjs.map +1 -1
  74. package/dist/RatesController/RatesController.cjs +5 -5
  75. package/dist/RatesController/RatesController.cjs.map +1 -1
  76. package/dist/RatesController/RatesController.d.cts.map +1 -1
  77. package/dist/RatesController/RatesController.d.mts.map +1 -1
  78. package/dist/RatesController/RatesController.mjs +5 -5
  79. package/dist/RatesController/RatesController.mjs.map +1 -1
  80. package/dist/RatesController/types.cjs.map +1 -1
  81. package/dist/RatesController/types.d.cts +3 -2
  82. package/dist/RatesController/types.d.cts.map +1 -1
  83. package/dist/RatesController/types.d.mts +3 -2
  84. package/dist/RatesController/types.d.mts.map +1 -1
  85. package/dist/RatesController/types.mjs.map +1 -1
  86. package/dist/TokenBalancesController.cjs +22 -22
  87. package/dist/TokenBalancesController.cjs.map +1 -1
  88. package/dist/TokenBalancesController.d.cts +3 -2
  89. package/dist/TokenBalancesController.d.cts.map +1 -1
  90. package/dist/TokenBalancesController.d.mts +3 -2
  91. package/dist/TokenBalancesController.d.mts.map +1 -1
  92. package/dist/TokenBalancesController.mjs +22 -22
  93. package/dist/TokenBalancesController.mjs.map +1 -1
  94. package/dist/TokenDetectionController.cjs +24 -24
  95. package/dist/TokenDetectionController.cjs.map +1 -1
  96. package/dist/TokenDetectionController.d.cts +4 -3
  97. package/dist/TokenDetectionController.d.cts.map +1 -1
  98. package/dist/TokenDetectionController.d.mts +4 -3
  99. package/dist/TokenDetectionController.d.mts.map +1 -1
  100. package/dist/TokenDetectionController.mjs +24 -24
  101. package/dist/TokenDetectionController.mjs.map +1 -1
  102. package/dist/TokenListController.cjs +4 -4
  103. package/dist/TokenListController.cjs.map +1 -1
  104. package/dist/TokenListController.d.cts +3 -2
  105. package/dist/TokenListController.d.cts.map +1 -1
  106. package/dist/TokenListController.d.mts +3 -2
  107. package/dist/TokenListController.d.mts.map +1 -1
  108. package/dist/TokenListController.mjs +4 -4
  109. package/dist/TokenListController.mjs.map +1 -1
  110. package/dist/TokenRatesController.cjs +6 -6
  111. package/dist/TokenRatesController.cjs.map +1 -1
  112. package/dist/TokenRatesController.d.cts +3 -2
  113. package/dist/TokenRatesController.d.cts.map +1 -1
  114. package/dist/TokenRatesController.d.mts +3 -2
  115. package/dist/TokenRatesController.d.mts.map +1 -1
  116. package/dist/TokenRatesController.mjs +6 -6
  117. package/dist/TokenRatesController.mjs.map +1 -1
  118. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs +4 -4
  119. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs.map +1 -1
  120. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts +3 -2
  121. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map +1 -1
  122. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts +3 -2
  123. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map +1 -1
  124. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs +4 -4
  125. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs.map +1 -1
  126. package/dist/TokensController.cjs +17 -17
  127. package/dist/TokensController.cjs.map +1 -1
  128. package/dist/TokensController.d.cts +3 -2
  129. package/dist/TokensController.d.cts.map +1 -1
  130. package/dist/TokensController.d.mts +3 -2
  131. package/dist/TokensController.d.mts.map +1 -1
  132. package/dist/TokensController.mjs +17 -17
  133. package/dist/TokensController.mjs.map +1 -1
  134. package/dist/balances.cjs +20 -12
  135. package/dist/balances.cjs.map +1 -1
  136. package/dist/balances.d.cts +7 -3
  137. package/dist/balances.d.cts.map +1 -1
  138. package/dist/balances.d.mts +7 -3
  139. package/dist/balances.d.mts.map +1 -1
  140. package/dist/balances.mjs +20 -12
  141. package/dist/balances.mjs.map +1 -1
  142. package/dist/selectors/token-selectors.cjs +5 -1
  143. package/dist/selectors/token-selectors.cjs.map +1 -1
  144. package/dist/selectors/token-selectors.d.cts +21 -14
  145. package/dist/selectors/token-selectors.d.cts.map +1 -1
  146. package/dist/selectors/token-selectors.d.mts +21 -14
  147. package/dist/selectors/token-selectors.d.mts.map +1 -1
  148. package/dist/selectors/token-selectors.mjs +5 -1
  149. package/dist/selectors/token-selectors.mjs.map +1 -1
  150. package/dist/token-prices-service/abstract-token-prices-service.cjs.map +1 -1
  151. package/dist/token-prices-service/abstract-token-prices-service.d.cts +30 -0
  152. package/dist/token-prices-service/abstract-token-prices-service.d.cts.map +1 -1
  153. package/dist/token-prices-service/abstract-token-prices-service.d.mts +30 -0
  154. package/dist/token-prices-service/abstract-token-prices-service.d.mts.map +1 -1
  155. package/dist/token-prices-service/abstract-token-prices-service.mjs.map +1 -1
  156. package/dist/token-prices-service/codefi-v2.cjs +75 -0
  157. package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
  158. package/dist/token-prices-service/codefi-v2.d.cts +15 -1
  159. package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
  160. package/dist/token-prices-service/codefi-v2.d.mts +15 -1
  161. package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
  162. package/dist/token-prices-service/codefi-v2.mjs +75 -0
  163. package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
  164. package/package.json +26 -25
@@ -1 +1 @@
1
- {"version":3,"file":"TokenDetectionController.cjs","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerGetAccountAction,\n AccountsControllerSelectedEvmAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n RestrictedMessenger,\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport contractMap from '@metamask/contract-metadata';\nimport {\n ASSET_TYPES,\n ChainId,\n ERC20,\n safelyExecute,\n isEqualCaseInsensitive,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type {\n NetworkClientId,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerGetStateAction,\n NetworkControllerNetworkDidChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n PreferencesControllerGetStateAction,\n PreferencesControllerStateChangeEvent,\n} from '@metamask/preferences-controller';\nimport type { TransactionControllerTransactionConfirmedEvent } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { hexToNumber } from '@metamask/utils';\nimport { isEqual, mapValues, isObject, get } from 'lodash';\n\nimport type { AssetsContractController } from './AssetsContractController';\nimport { isTokenDetectionSupportedForNetwork } from './assetsUtil';\nimport {\n fetchMultiChainBalances,\n fetchSupportedNetworks,\n} from './multi-chain-accounts-service';\nimport type {\n GetTokenListState,\n TokenListMap,\n TokenListStateChange,\n TokensChainsCache,\n} from './TokenListController';\nimport type { Token } from './TokenRatesController';\nimport type {\n TokensControllerAddDetectedTokensAction,\n TokensControllerAddTokensAction,\n TokensControllerGetStateAction,\n} from './TokensController';\n\nconst DEFAULT_INTERVAL = 180000;\n\ntype LegacyToken = {\n name: string;\n logo: `${string}.svg`;\n symbol: string;\n decimals: number;\n erc20?: boolean;\n erc721?: boolean;\n};\n\ntype TokenDetectionMap = {\n [P in keyof TokenListMap]: Omit<TokenListMap[P], 'occurrences'>;\n};\n\ntype NetworkClient = {\n chainId: Hex;\n networkClientId: string;\n};\n\nexport const STATIC_MAINNET_TOKEN_LIST = Object.entries<LegacyToken>(\n contractMap,\n).reduce<TokenDetectionMap>((acc, [base, contract]) => {\n const { logo, erc20, erc721, ...tokenMetadata } = contract;\n return {\n ...acc,\n [base.toLowerCase()]: {\n ...tokenMetadata,\n address: base.toLowerCase(),\n iconUrl: `images/contract/${logo}`,\n aggregators: [],\n },\n };\n}, {});\n\n/**\n * Function that takes a TokensChainsCache object and maps chainId with TokenListMap.\n *\n * @param tokensChainsCache - TokensChainsCache input object\n * @returns returns the map of chainId with TokenListMap\n */\nexport function mapChainIdWithTokenListMap(\n tokensChainsCache: TokensChainsCache,\n) {\n return mapValues(tokensChainsCache, (value) => {\n if (isObject(value) && 'data' in value) {\n return get(value, ['data']);\n }\n return value;\n });\n}\n\nexport const controllerName = 'TokenDetectionController';\n\nexport type TokenDetectionState = Record<never, never>;\n\nexport type TokenDetectionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenDetectionState\n>;\n\nexport type TokenDetectionControllerAddDetectedTokensViaWsAction = {\n type: `TokenDetectionController:addDetectedTokensViaWs`;\n handler: TokenDetectionController['addDetectedTokensViaWs'];\n};\n\nexport type TokenDetectionControllerActions =\n | TokenDetectionControllerGetStateAction\n | TokenDetectionControllerAddDetectedTokensViaWsAction;\n\nexport type AllowedActions =\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetAccountAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetNetworkConfigurationByNetworkClientId\n | NetworkControllerGetStateAction\n | GetTokenListState\n | KeyringControllerGetStateAction\n | PreferencesControllerGetStateAction\n | TokensControllerGetStateAction\n | TokensControllerAddDetectedTokensAction\n | TokensControllerAddTokensAction\n | NetworkControllerFindNetworkClientIdByChainIdAction;\n\nexport type TokenDetectionControllerStateChangeEvent =\n ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;\n\nexport type TokenDetectionControllerEvents =\n TokenDetectionControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | AccountsControllerSelectedEvmAccountChangeEvent\n | NetworkControllerNetworkDidChangeEvent\n | TokenListStateChange\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | PreferencesControllerStateChangeEvent\n | TransactionControllerTransactionConfirmedEvent;\n\nexport type TokenDetectionControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n TokenDetectionControllerActions | AllowedActions,\n TokenDetectionControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/** The input to start polling for the {@link TokenDetectionController} */\ntype TokenDetectionPollingInput = {\n chainIds: Hex[];\n address: string;\n};\n\n/**\n * Controller that passively polls on a set interval for Tokens auto detection\n *\n * intervalId - Polling interval used to fetch new token rates\n *\n * selectedAddress - Vault selected address\n *\n * networkClientId - The network client ID of the current selected network\n *\n * disabled - Boolean to track if network requests are blocked\n *\n * isUnlocked - Boolean to track if the keyring state is unlocked\n *\n * isDetectionEnabledFromPreferences - Boolean to track if detection is enabled from PreferencesController\n *\n */\nexport class TokenDetectionController extends StaticIntervalPollingController<TokenDetectionPollingInput>()<\n typeof controllerName,\n TokenDetectionState,\n TokenDetectionControllerMessenger\n> {\n #intervalId?: ReturnType<typeof setTimeout>;\n\n #selectedAccountId: string;\n\n #tokensChainsCache: TokensChainsCache = {};\n\n #disabled: boolean;\n\n #isUnlocked: boolean;\n\n #isDetectionEnabledFromPreferences: boolean;\n\n readonly #useTokenDetection: () => boolean;\n\n readonly #useExternalServices: () => boolean;\n\n readonly #getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];\n\n readonly #trackMetaMetricsEvent: (options: {\n event: string;\n category: string;\n properties: {\n tokens: string[];\n token_standard: string;\n asset_type: string;\n };\n }) => void;\n\n readonly #accountsAPI = {\n isAccountsAPIEnabled: true,\n supportedNetworksCache: null as number[] | null,\n platform: '' as 'extension' | 'mobile',\n\n async getSupportedNetworks() {\n /* istanbul ignore next */\n if (!this.isAccountsAPIEnabled) {\n throw new Error('Accounts API Feature Switch is disabled');\n }\n\n /* istanbul ignore next */\n if (this.supportedNetworksCache) {\n return this.supportedNetworksCache;\n }\n\n const result = await fetchSupportedNetworks().catch(() => null);\n this.supportedNetworksCache = result;\n return result;\n },\n\n async getMultiNetworksBalances(\n address: string,\n chainIds: Hex[],\n supportedNetworks: number[] | null,\n ) {\n const chainIdNumbers = chainIds.map((chainId) => hexToNumber(chainId));\n\n if (\n !supportedNetworks ||\n !chainIdNumbers.every((id) => supportedNetworks.includes(id))\n ) {\n const supportedNetworksErrStr = (supportedNetworks ?? []).toString();\n throw new Error(\n `Unsupported Network: supported networks ${supportedNetworksErrStr}, requested networks: ${chainIdNumbers.toString()}`,\n );\n }\n\n const result = await fetchMultiChainBalances(\n address,\n {\n networks: chainIdNumbers,\n },\n this.platform,\n );\n\n return result.balances;\n },\n };\n\n /**\n * Creates a TokenDetectionController instance.\n *\n * @param options - The controller options.\n * @param options.messenger - The controller messaging system.\n * @param options.disabled - If set to true, all network requests are blocked.\n * @param options.interval - Polling interval used to fetch new token rates\n * @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.\n * @param options.trackMetaMetricsEvent - Sets options for MetaMetrics event tracking.\n * @param options.useAccountsAPI - Feature Switch for using the accounts API when detecting tokens (default: true)\n * @param options.useTokenDetection - Feature Switch for using token detection (default: true)\n * @param options.useExternalServices - Feature Switch for using external services (default: false)\n * @param options.platform - Indicates whether the platform is extension or mobile\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = true,\n getBalancesInSingleCall,\n trackMetaMetricsEvent,\n messenger,\n useAccountsAPI = true,\n useTokenDetection = () => true,\n useExternalServices = () => true,\n platform,\n }: {\n interval?: number;\n disabled?: boolean;\n getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];\n trackMetaMetricsEvent: (options: {\n event: string;\n category: string;\n properties: {\n tokens: string[];\n token_standard: string;\n asset_type: string;\n };\n }) => void;\n messenger: TokenDetectionControllerMessenger;\n useAccountsAPI?: boolean;\n useTokenDetection?: () => boolean;\n useExternalServices?: () => boolean;\n platform: 'extension' | 'mobile';\n }) {\n super({\n name: controllerName,\n messenger,\n state: {},\n metadata: {},\n });\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:addDetectedTokensViaWs` as const,\n this.addDetectedTokensViaWs.bind(this),\n );\n\n this.#disabled = disabled;\n this.setIntervalLength(interval);\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\n\n const { tokensChainsCache } = this.messagingSystem.call(\n 'TokenListController:getState',\n );\n\n this.#tokensChainsCache = tokensChainsCache;\n\n const { useTokenDetection: defaultUseTokenDetection } =\n this.messagingSystem.call('PreferencesController:getState');\n this.#isDetectionEnabledFromPreferences = defaultUseTokenDetection;\n\n this.#getBalancesInSingleCall = getBalancesInSingleCall;\n\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n\n const { isUnlocked } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n this.#isUnlocked = isUnlocked;\n\n this.#accountsAPI.isAccountsAPIEnabled = useAccountsAPI;\n this.#useTokenDetection = useTokenDetection;\n this.#useExternalServices = useExternalServices;\n this.#accountsAPI.platform = platform;\n\n this.#registerEventListeners();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system subscriptions to controller events.\n */\n #registerEventListeners() {\n this.messagingSystem.subscribe('KeyringController:unlock', async () => {\n this.#isUnlocked = true;\n await this.#restartTokenDetection();\n });\n\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n this.#stopPolling();\n });\n\n this.messagingSystem.subscribe(\n 'TokenListController:stateChange',\n async ({ tokensChainsCache }) => {\n const isEqualValues = this.#compareTokensChainsCache(\n tokensChainsCache,\n this.#tokensChainsCache,\n );\n if (!isEqualValues) {\n await this.#restartTokenDetection();\n }\n },\n );\n\n this.messagingSystem.subscribe(\n 'PreferencesController:stateChange',\n async ({ useTokenDetection }) => {\n const selectedAccount = this.#getSelectedAccount();\n const isDetectionChangedFromPreferences =\n this.#isDetectionEnabledFromPreferences !== useTokenDetection;\n\n this.#isDetectionEnabledFromPreferences = useTokenDetection;\n\n if (isDetectionChangedFromPreferences) {\n await this.#restartTokenDetection({\n selectedAddress: selectedAccount.address,\n });\n }\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:selectedEvmAccountChange',\n async (selectedAccount) => {\n const { networkConfigurationsByChainId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n\n const chainIds = Object.keys(networkConfigurationsByChainId) as Hex[];\n const isSelectedAccountIdChanged =\n this.#selectedAccountId !== selectedAccount.id;\n if (isSelectedAccountIdChanged) {\n this.#selectedAccountId = selectedAccount.id;\n await this.#restartTokenDetection({\n selectedAddress: selectedAccount.address,\n chainIds,\n });\n }\n },\n );\n\n this.messagingSystem.subscribe(\n 'TransactionController:transactionConfirmed',\n async (transactionMeta) => {\n await this.detectTokens({\n chainIds: [transactionMeta.chainId],\n });\n },\n );\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n /**\n * Internal isActive state\n *\n * @returns Whether the controller is active (not disabled and keyring is unlocked)\n */\n get isActive(): boolean {\n return !this.#disabled && this.#isUnlocked;\n }\n\n /**\n * Start polling for detected tokens.\n */\n async start(): Promise<void> {\n this.enable();\n await this.#startPolling();\n }\n\n /**\n * Stop polling for detected tokens.\n */\n stop(): void {\n this.disable();\n this.#stopPolling();\n }\n\n #stopPolling(): void {\n if (this.#intervalId) {\n clearInterval(this.#intervalId);\n }\n }\n\n /**\n * Starts a new polling interval.\n */\n async #startPolling(): Promise<void> {\n if (!this.isActive) {\n return;\n }\n this.#stopPolling();\n await this.detectTokens();\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#intervalId = setInterval(async () => {\n await this.detectTokens();\n }, this.getIntervalLength());\n }\n\n /**\n * Compares current and previous tokensChainsCache object focusing only on the data object.\n *\n * @param tokensChainsCache - current tokensChainsCache input object\n * @param previousTokensChainsCache - previous tokensChainsCache input object\n * @returns boolean indicating if the two objects are equal\n */\n\n #compareTokensChainsCache(\n tokensChainsCache: TokensChainsCache,\n previousTokensChainsCache: TokensChainsCache,\n ): boolean {\n const cleanPreviousTokensChainsCache = mapChainIdWithTokenListMap(\n previousTokensChainsCache,\n );\n const cleanTokensChainsCache =\n mapChainIdWithTokenListMap(tokensChainsCache);\n const isEqualValues = isEqual(\n cleanTokensChainsCache,\n cleanPreviousTokensChainsCache,\n );\n return isEqualValues;\n }\n\n #getCorrectNetworkClientIdByChainId(\n chainIds: Hex[] | undefined,\n ): { chainId: Hex; networkClientId: NetworkClientId }[] {\n const { networkConfigurationsByChainId, selectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n\n if (!chainIds) {\n const networkConfiguration = this.messagingSystem.call(\n 'NetworkController:getNetworkConfigurationByNetworkClientId',\n selectedNetworkClientId,\n );\n\n return [\n {\n chainId: networkConfiguration?.chainId ?? ChainId.mainnet,\n networkClientId: selectedNetworkClientId,\n },\n ];\n }\n\n return chainIds.map((chainId) => {\n const configuration = networkConfigurationsByChainId[chainId];\n return {\n chainId,\n networkClientId:\n configuration.rpcEndpoints[configuration.defaultRpcEndpointIndex]\n .networkClientId,\n };\n });\n }\n\n async _executePoll({\n chainIds,\n address,\n }: TokenDetectionPollingInput): Promise<void> {\n if (!this.isActive) {\n return;\n }\n await this.detectTokens({\n chainIds,\n selectedAddress: address,\n });\n }\n\n /**\n * Restart token detection polling period and call detectNewTokens\n * in case of address change or user session initialization.\n *\n * @param options - Options for restart token detection.\n * @param options.selectedAddress - the selectedAddress against which to detect for token balances\n * @param options.chainIds - The chain IDs of the network client to use.\n */\n async #restartTokenDetection({\n selectedAddress,\n chainIds,\n }: {\n selectedAddress?: string;\n chainIds?: Hex[];\n } = {}): Promise<void> {\n await this.detectTokens({\n chainIds,\n selectedAddress,\n });\n this.setIntervalLength(DEFAULT_INTERVAL);\n }\n\n #getChainsToDetect(\n clientNetworks: NetworkClient[],\n supportedNetworks: number[] | null | undefined,\n ) {\n const chainsToDetectUsingAccountAPI: Hex[] = [];\n const chainsToDetectUsingRpc: NetworkClient[] = [];\n\n clientNetworks.forEach(({ chainId, networkClientId }) => {\n if (supportedNetworks?.includes(hexToNumber(chainId))) {\n chainsToDetectUsingAccountAPI.push(chainId);\n } else {\n chainsToDetectUsingRpc.push({ chainId, networkClientId });\n }\n });\n\n return { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI };\n }\n\n async #attemptAccountAPIDetection(\n chainsToDetectUsingAccountAPI: Hex[],\n addressToDetect: string,\n supportedNetworks: number[] | null,\n ) {\n return await this.#addDetectedTokensViaAPI({\n chainIds: chainsToDetectUsingAccountAPI,\n selectedAddress: addressToDetect,\n supportedNetworks,\n });\n }\n\n #addChainsToRpcDetection(\n chainsToDetectUsingRpc: NetworkClient[],\n chainsToDetectUsingAccountAPI: Hex[],\n clientNetworks: NetworkClient[],\n ): void {\n chainsToDetectUsingAccountAPI.forEach((chainId) => {\n const networkEntry = clientNetworks.find(\n (network) => network.chainId === chainId,\n );\n if (networkEntry) {\n chainsToDetectUsingRpc.push({\n chainId: networkEntry.chainId,\n networkClientId: networkEntry.networkClientId,\n });\n }\n });\n }\n\n #shouldDetectTokens(chainId: Hex): boolean {\n if (!isTokenDetectionSupportedForNetwork(chainId)) {\n return false;\n }\n if (\n !this.#isDetectionEnabledFromPreferences &&\n chainId !== ChainId.mainnet\n ) {\n return false;\n }\n\n const isMainnetDetectionInactive =\n !this.#isDetectionEnabledFromPreferences && chainId === ChainId.mainnet;\n if (isMainnetDetectionInactive) {\n this.#tokensChainsCache = this.#getConvertedStaticMainnetTokenList();\n } else {\n const { tokensChainsCache } = this.messagingSystem.call(\n 'TokenListController:getState',\n );\n this.#tokensChainsCache = tokensChainsCache ?? {};\n }\n\n return true;\n }\n\n async #detectTokensUsingRpc(\n chainsToDetectUsingRpc: NetworkClient[],\n addressToDetect: string,\n ): Promise<void> {\n for (const { chainId, networkClientId } of chainsToDetectUsingRpc) {\n if (!this.#shouldDetectTokens(chainId)) {\n continue;\n }\n\n const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({\n chainId,\n selectedAddress: addressToDetect,\n });\n const tokenDetectionPromises = tokenCandidateSlices.map((tokensSlice) =>\n this.#addDetectedTokens({\n tokensSlice,\n selectedAddress: addressToDetect,\n networkClientId,\n chainId,\n }),\n );\n\n await Promise.all(tokenDetectionPromises);\n }\n }\n\n /**\n * For each token in the token list provided by the TokenListController, checks the token's balance for the selected account address on the active network.\n * On mainnet, if token detection is disabled in preferences, ERC20 token auto detection will be triggered for each contract address in the legacy token list from the @metamask/contract-metadata repo.\n *\n * @param options - Options for token detection.\n * @param options.chainIds - The chain IDs of the network client to use.\n * @param options.selectedAddress - the selectedAddress against which to detect for token balances.\n */\n async detectTokens({\n chainIds,\n selectedAddress,\n }: {\n chainIds?: Hex[];\n selectedAddress?: string;\n } = {}): Promise<void> {\n if (!this.isActive) {\n return;\n }\n\n if (!this.#useTokenDetection()) {\n return;\n }\n\n const addressToDetect = selectedAddress ?? this.#getSelectedAddress();\n const clientNetworks = this.#getCorrectNetworkClientIdByChainId(chainIds);\n\n let supportedNetworks;\n if (this.#accountsAPI.isAccountsAPIEnabled && this.#useExternalServices()) {\n supportedNetworks = await this.#accountsAPI.getSupportedNetworks();\n }\n const { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI } =\n this.#getChainsToDetect(clientNetworks, supportedNetworks);\n\n // Try detecting tokens via Account API first if conditions allow\n if (supportedNetworks && chainsToDetectUsingAccountAPI.length > 0) {\n const apiResult = await this.#attemptAccountAPIDetection(\n chainsToDetectUsingAccountAPI,\n addressToDetect,\n supportedNetworks,\n );\n\n // If the account API call failed, have those chains fall back to RPC detection\n if (apiResult?.result === 'failed') {\n this.#addChainsToRpcDetection(\n chainsToDetectUsingRpc,\n chainsToDetectUsingAccountAPI,\n clientNetworks,\n );\n }\n }\n\n // Proceed with RPC detection if there are chains remaining in chainsToDetectUsingRpc\n if (chainsToDetectUsingRpc.length > 0) {\n await this.#detectTokensUsingRpc(chainsToDetectUsingRpc, addressToDetect);\n }\n }\n\n #getSlicesOfTokensToDetect({\n chainId,\n selectedAddress,\n }: {\n chainId: Hex;\n selectedAddress: string;\n }): string[][] {\n const { allTokens, allDetectedTokens, allIgnoredTokens } =\n this.messagingSystem.call('TokensController:getState');\n const [tokensAddresses, detectedTokensAddresses, ignoredTokensAddresses] = [\n allTokens,\n allDetectedTokens,\n allIgnoredTokens,\n ].map((tokens) =>\n (tokens[chainId]?.[selectedAddress] ?? []).map((value) =>\n typeof value === 'string' ? value : value.address,\n ),\n );\n\n const tokensToDetect: string[] = [];\n for (const tokenAddress of Object.keys(\n this.#tokensChainsCache?.[chainId]?.data || {},\n )) {\n if (\n [\n tokensAddresses,\n detectedTokensAddresses,\n ignoredTokensAddresses,\n ].every(\n (addresses) =>\n !addresses.find((address) =>\n isEqualCaseInsensitive(address, tokenAddress),\n ),\n )\n ) {\n tokensToDetect.push(tokenAddress);\n }\n }\n\n const slicesOfTokensToDetect = [];\n for (let i = 0, size = 1000; i < tokensToDetect.length; i += size) {\n slicesOfTokensToDetect.push(tokensToDetect.slice(i, i + size));\n }\n\n return slicesOfTokensToDetect;\n }\n\n #getConvertedStaticMainnetTokenList(): TokensChainsCache {\n const data: TokenListMap = Object.entries(STATIC_MAINNET_TOKEN_LIST).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: {\n name: value.name,\n symbol: value.symbol,\n decimals: value.decimals,\n address: value.address,\n aggregators: [],\n iconUrl: value?.iconUrl,\n },\n }),\n {},\n );\n return {\n '0x1': {\n data,\n timestamp: 0,\n },\n };\n }\n\n /**\n * This adds detected tokens from the Accounts API, avoiding the multi-call RPC calls for balances\n *\n * @param options - method arguments\n * @param options.selectedAddress - address to check against\n * @param options.chainIds - array of chainIds to check tokens for\n * @param options.supportedNetworks - array of chainIds to check tokens for\n * @returns a success or failed object\n */\n async #addDetectedTokensViaAPI({\n selectedAddress,\n chainIds,\n supportedNetworks,\n }: {\n selectedAddress: string;\n chainIds: Hex[];\n supportedNetworks: number[] | null;\n }) {\n return await safelyExecute(async () => {\n // Fetch balances for multiple chain IDs at once\n const tokenBalancesByChain = await this.#accountsAPI\n .getMultiNetworksBalances(selectedAddress, chainIds, supportedNetworks)\n .catch(() => null);\n\n if (tokenBalancesByChain === null) {\n return { result: 'failed' } as const;\n }\n\n // Process each chain ID individually\n for (const chainId of chainIds) {\n const isTokenDetectionInactiveInMainnet =\n !this.#isDetectionEnabledFromPreferences &&\n chainId === ChainId.mainnet;\n const { tokensChainsCache } = this.messagingSystem.call(\n 'TokenListController:getState',\n );\n this.#tokensChainsCache = isTokenDetectionInactiveInMainnet\n ? this.#getConvertedStaticMainnetTokenList()\n : (tokensChainsCache ?? {});\n\n // Generate token candidates based on chainId and selectedAddress\n const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({\n chainId,\n selectedAddress,\n });\n\n // Filter balances for the current chainId\n const tokenBalances = tokenBalancesByChain.filter(\n (balance) => balance.chainId === hexToNumber(chainId),\n );\n\n if (!tokenBalances || tokenBalances.length === 0) {\n continue;\n }\n\n // Use helper function to filter tokens with balance for this chainId\n const { tokensWithBalance, eventTokensDetails } =\n this.#filterAndBuildTokensWithBalance(\n tokenCandidateSlices,\n tokenBalances,\n chainId,\n );\n\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n const networkClientId = this.messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n await this.messagingSystem.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n }\n\n return { result: 'success' } as const;\n });\n }\n\n /**\n * Helper function to filter and build token data for detected tokens\n *\n * @param options.tokenCandidateSlices - these are tokens we know a user does not have (by checking the tokens controller).\n * We will use these these token candidates to determine if a token found from the API is valid to be added on the users wallet.\n * It will also prevent us to adding tokens a user already has\n * @param tokenBalances - Tokens balances fetched from API\n * @param chainId - The chain ID being processed\n * @returns an object containing tokensWithBalance and eventTokensDetails arrays\n */\n\n #filterAndBuildTokensWithBalance(\n tokenCandidateSlices: string[][],\n tokenBalances:\n | {\n object: string;\n type?: string;\n timestamp?: string;\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n chainId: number;\n balance: string;\n }[]\n | null,\n chainId: Hex,\n ) {\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n\n const tokenCandidateSet = new Set<string>(tokenCandidateSlices.flat());\n\n tokenBalances?.forEach((token) => {\n const tokenAddress = token.address;\n\n // Make sure the token to add is in our candidate list\n if (!tokenCandidateSet.has(tokenAddress)) {\n return;\n }\n\n // Retrieve token data from cache to safely add it\n const tokenData = this.#tokensChainsCache[chainId]?.data[tokenAddress];\n\n // We need specific data from tokensChainsCache to correctly create a token\n // So even if we have a token that was detected correctly by the API, if its missing data we cannot safely add it.\n if (!tokenData) {\n return;\n }\n\n const { decimals, symbol, aggregators, iconUrl, name } = tokenData;\n eventTokensDetails.push(`${symbol} - ${tokenAddress}`);\n tokensWithBalance.push({\n address: tokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n });\n\n return { tokensWithBalance, eventTokensDetails };\n }\n\n async #addDetectedTokens({\n tokensSlice,\n selectedAddress,\n networkClientId,\n chainId,\n }: {\n tokensSlice: string[];\n selectedAddress: string;\n networkClientId: NetworkClientId;\n chainId: Hex;\n }): Promise<void> {\n await safelyExecute(async () => {\n const balances = await this.#getBalancesInSingleCall(\n selectedAddress,\n tokensSlice,\n networkClientId,\n );\n\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n for (const nonZeroTokenAddress of Object.keys(balances)) {\n const { decimals, symbol, aggregators, iconUrl, name } =\n this.#tokensChainsCache[chainId].data[nonZeroTokenAddress];\n eventTokensDetails.push(`${symbol} - ${nonZeroTokenAddress}`);\n tokensWithBalance.push({\n address: nonZeroTokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n }\n\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n await this.messagingSystem.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n });\n }\n\n /**\n * Add tokens detected from websocket balance updates\n * This method assumes:\n * - Tokens are already in the tokensChainsCache with full metadata\n * - Balance fetching is skipped since balances are provided by the websocket\n * - Ignored tokens have been filtered out by the caller\n *\n * @param options - The options object\n * @param options.tokensSlice - Array of token addresses detected from websocket (already filtered to exclude ignored tokens)\n * @param options.chainId - Hex chain ID\n * @returns Promise that resolves when tokens are added\n */\n async addDetectedTokensViaWs({\n tokensSlice,\n chainId,\n }: {\n tokensSlice: string[];\n chainId: Hex;\n }): Promise<void> {\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n\n for (const tokenAddress of tokensSlice) {\n // Normalize addresses explicitly (don't assume input format)\n const lowercaseTokenAddress = tokenAddress.toLowerCase();\n const checksummedTokenAddress = toChecksumHexAddress(tokenAddress);\n\n // Check map of validated tokens (cache keys are lowercase)\n const tokenData =\n this.#tokensChainsCache[chainId]?.data?.[lowercaseTokenAddress];\n\n if (!tokenData) {\n console.warn(\n `Token metadata not found in cache for ${tokenAddress} on chain ${chainId}`,\n );\n continue;\n }\n\n const { decimals, symbol, aggregators, iconUrl, name } = tokenData;\n\n // Push to lists with checksummed address (for allTokens storage)\n eventTokensDetails.push(`${symbol} - ${checksummedTokenAddress}`);\n tokensWithBalance.push({\n address: checksummedTokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n }\n\n // Perform addition\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n const networkClientId = this.messagingSystem.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n await this.messagingSystem.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n }\n\n #getSelectedAccount() {\n return this.messagingSystem.call('AccountsController:getSelectedAccount');\n }\n\n #getSelectedAddress() {\n // If the address is not defined (or empty), we fallback to the currently selected account's address\n const account = this.messagingSystem.call(\n 'AccountsController:getAccount',\n this.#selectedAccountId,\n );\n return account?.address || '';\n }\n}\n\nexport default TokenDetectionController;\n"]}
1
+ {"version":3,"file":"TokenDetectionController.cjs","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerGetAccountAction,\n AccountsControllerSelectedEvmAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport contractMap from '@metamask/contract-metadata';\nimport {\n ASSET_TYPES,\n ChainId,\n ERC20,\n safelyExecute,\n isEqualCaseInsensitive,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkClientId,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerGetStateAction,\n NetworkControllerNetworkDidChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n PreferencesControllerGetStateAction,\n PreferencesControllerStateChangeEvent,\n} from '@metamask/preferences-controller';\nimport type { TransactionControllerTransactionConfirmedEvent } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { hexToNumber } from '@metamask/utils';\nimport { isEqual, mapValues, isObject, get } from 'lodash';\n\nimport type { AssetsContractController } from './AssetsContractController';\nimport { isTokenDetectionSupportedForNetwork } from './assetsUtil';\nimport {\n fetchMultiChainBalances,\n fetchSupportedNetworks,\n} from './multi-chain-accounts-service';\nimport type {\n GetTokenListState,\n TokenListMap,\n TokenListStateChange,\n TokensChainsCache,\n} from './TokenListController';\nimport type { Token } from './TokenRatesController';\nimport type {\n TokensControllerAddDetectedTokensAction,\n TokensControllerAddTokensAction,\n TokensControllerGetStateAction,\n} from './TokensController';\n\nconst DEFAULT_INTERVAL = 180000;\n\ntype LegacyToken = {\n name: string;\n logo: `${string}.svg`;\n symbol: string;\n decimals: number;\n erc20?: boolean;\n erc721?: boolean;\n};\n\ntype TokenDetectionMap = {\n [P in keyof TokenListMap]: Omit<TokenListMap[P], 'occurrences'>;\n};\n\ntype NetworkClient = {\n chainId: Hex;\n networkClientId: string;\n};\n\nexport const STATIC_MAINNET_TOKEN_LIST = Object.entries<LegacyToken>(\n contractMap,\n).reduce<TokenDetectionMap>((acc, [base, contract]) => {\n const { logo, erc20, erc721, ...tokenMetadata } = contract;\n return {\n ...acc,\n [base.toLowerCase()]: {\n ...tokenMetadata,\n address: base.toLowerCase(),\n iconUrl: `images/contract/${logo}`,\n aggregators: [],\n },\n };\n}, {});\n\n/**\n * Function that takes a TokensChainsCache object and maps chainId with TokenListMap.\n *\n * @param tokensChainsCache - TokensChainsCache input object\n * @returns returns the map of chainId with TokenListMap\n */\nexport function mapChainIdWithTokenListMap(\n tokensChainsCache: TokensChainsCache,\n) {\n return mapValues(tokensChainsCache, (value) => {\n if (isObject(value) && 'data' in value) {\n return get(value, ['data']);\n }\n return value;\n });\n}\n\nexport const controllerName = 'TokenDetectionController';\n\nexport type TokenDetectionState = Record<never, never>;\n\nexport type TokenDetectionControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenDetectionState\n>;\n\nexport type TokenDetectionControllerAddDetectedTokensViaWsAction = {\n type: `TokenDetectionController:addDetectedTokensViaWs`;\n handler: TokenDetectionController['addDetectedTokensViaWs'];\n};\n\nexport type TokenDetectionControllerActions =\n | TokenDetectionControllerGetStateAction\n | TokenDetectionControllerAddDetectedTokensViaWsAction;\n\nexport type AllowedActions =\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetAccountAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetNetworkConfigurationByNetworkClientId\n | NetworkControllerGetStateAction\n | GetTokenListState\n | KeyringControllerGetStateAction\n | PreferencesControllerGetStateAction\n | TokensControllerGetStateAction\n | TokensControllerAddDetectedTokensAction\n | TokensControllerAddTokensAction\n | NetworkControllerFindNetworkClientIdByChainIdAction;\n\nexport type TokenDetectionControllerStateChangeEvent =\n ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;\n\nexport type TokenDetectionControllerEvents =\n TokenDetectionControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | AccountsControllerSelectedEvmAccountChangeEvent\n | NetworkControllerNetworkDidChangeEvent\n | TokenListStateChange\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | PreferencesControllerStateChangeEvent\n | TransactionControllerTransactionConfirmedEvent;\n\nexport type TokenDetectionControllerMessenger = Messenger<\n typeof controllerName,\n TokenDetectionControllerActions | AllowedActions,\n TokenDetectionControllerEvents | AllowedEvents\n>;\n\n/** The input to start polling for the {@link TokenDetectionController} */\ntype TokenDetectionPollingInput = {\n chainIds: Hex[];\n address: string;\n};\n\n/**\n * Controller that passively polls on a set interval for Tokens auto detection\n *\n * intervalId - Polling interval used to fetch new token rates\n *\n * selectedAddress - Vault selected address\n *\n * networkClientId - The network client ID of the current selected network\n *\n * disabled - Boolean to track if network requests are blocked\n *\n * isUnlocked - Boolean to track if the keyring state is unlocked\n *\n * isDetectionEnabledFromPreferences - Boolean to track if detection is enabled from PreferencesController\n *\n */\nexport class TokenDetectionController extends StaticIntervalPollingController<TokenDetectionPollingInput>()<\n typeof controllerName,\n TokenDetectionState,\n TokenDetectionControllerMessenger\n> {\n #intervalId?: ReturnType<typeof setTimeout>;\n\n #selectedAccountId: string;\n\n #tokensChainsCache: TokensChainsCache = {};\n\n #disabled: boolean;\n\n #isUnlocked: boolean;\n\n #isDetectionEnabledFromPreferences: boolean;\n\n readonly #useTokenDetection: () => boolean;\n\n readonly #useExternalServices: () => boolean;\n\n readonly #getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];\n\n readonly #trackMetaMetricsEvent: (options: {\n event: string;\n category: string;\n properties: {\n tokens: string[];\n token_standard: string;\n asset_type: string;\n };\n }) => void;\n\n readonly #accountsAPI = {\n isAccountsAPIEnabled: true,\n supportedNetworksCache: null as number[] | null,\n platform: '' as 'extension' | 'mobile',\n\n async getSupportedNetworks() {\n /* istanbul ignore next */\n if (!this.isAccountsAPIEnabled) {\n throw new Error('Accounts API Feature Switch is disabled');\n }\n\n /* istanbul ignore next */\n if (this.supportedNetworksCache) {\n return this.supportedNetworksCache;\n }\n\n const result = await fetchSupportedNetworks().catch(() => null);\n this.supportedNetworksCache = result;\n return result;\n },\n\n async getMultiNetworksBalances(\n address: string,\n chainIds: Hex[],\n supportedNetworks: number[] | null,\n ) {\n const chainIdNumbers = chainIds.map((chainId) => hexToNumber(chainId));\n\n if (\n !supportedNetworks ||\n !chainIdNumbers.every((id) => supportedNetworks.includes(id))\n ) {\n const supportedNetworksErrStr = (supportedNetworks ?? []).toString();\n throw new Error(\n `Unsupported Network: supported networks ${supportedNetworksErrStr}, requested networks: ${chainIdNumbers.toString()}`,\n );\n }\n\n const result = await fetchMultiChainBalances(\n address,\n {\n networks: chainIdNumbers,\n },\n this.platform,\n );\n\n return result.balances;\n },\n };\n\n /**\n * Creates a TokenDetectionController instance.\n *\n * @param options - The controller options.\n * @param options.messenger - The controller messenger.\n * @param options.disabled - If set to true, all network requests are blocked.\n * @param options.interval - Polling interval used to fetch new token rates\n * @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.\n * @param options.trackMetaMetricsEvent - Sets options for MetaMetrics event tracking.\n * @param options.useAccountsAPI - Feature Switch for using the accounts API when detecting tokens (default: true)\n * @param options.useTokenDetection - Feature Switch for using token detection (default: true)\n * @param options.useExternalServices - Feature Switch for using external services (default: false)\n * @param options.platform - Indicates whether the platform is extension or mobile\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = true,\n getBalancesInSingleCall,\n trackMetaMetricsEvent,\n messenger,\n useAccountsAPI = true,\n useTokenDetection = () => true,\n useExternalServices = () => true,\n platform,\n }: {\n interval?: number;\n disabled?: boolean;\n getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];\n trackMetaMetricsEvent: (options: {\n event: string;\n category: string;\n properties: {\n tokens: string[];\n token_standard: string;\n asset_type: string;\n };\n }) => void;\n messenger: TokenDetectionControllerMessenger;\n useAccountsAPI?: boolean;\n useTokenDetection?: () => boolean;\n useExternalServices?: () => boolean;\n platform: 'extension' | 'mobile';\n }) {\n super({\n name: controllerName,\n messenger,\n state: {},\n metadata: {},\n });\n\n this.messenger.registerActionHandler(\n `${controllerName}:addDetectedTokensViaWs` as const,\n this.addDetectedTokensViaWs.bind(this),\n );\n\n this.#disabled = disabled;\n this.setIntervalLength(interval);\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\n\n const { tokensChainsCache } = this.messenger.call(\n 'TokenListController:getState',\n );\n\n this.#tokensChainsCache = tokensChainsCache;\n\n const { useTokenDetection: defaultUseTokenDetection } = this.messenger.call(\n 'PreferencesController:getState',\n );\n this.#isDetectionEnabledFromPreferences = defaultUseTokenDetection;\n\n this.#getBalancesInSingleCall = getBalancesInSingleCall;\n\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n\n const { isUnlocked } = this.messenger.call('KeyringController:getState');\n this.#isUnlocked = isUnlocked;\n\n this.#accountsAPI.isAccountsAPIEnabled = useAccountsAPI;\n this.#useTokenDetection = useTokenDetection;\n this.#useExternalServices = useExternalServices;\n this.#accountsAPI.platform = platform;\n\n this.#registerEventListeners();\n }\n\n /**\n * Constructor helper for registering this controller's messenger subscriptions to controller events.\n */\n #registerEventListeners() {\n this.messenger.subscribe('KeyringController:unlock', async () => {\n this.#isUnlocked = true;\n await this.#restartTokenDetection();\n });\n\n this.messenger.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n this.#stopPolling();\n });\n\n this.messenger.subscribe(\n 'TokenListController:stateChange',\n async ({ tokensChainsCache }) => {\n const isEqualValues = this.#compareTokensChainsCache(\n tokensChainsCache,\n this.#tokensChainsCache,\n );\n if (!isEqualValues) {\n await this.#restartTokenDetection();\n }\n },\n );\n\n this.messenger.subscribe(\n 'PreferencesController:stateChange',\n async ({ useTokenDetection }) => {\n const selectedAccount = this.#getSelectedAccount();\n const isDetectionChangedFromPreferences =\n this.#isDetectionEnabledFromPreferences !== useTokenDetection;\n\n this.#isDetectionEnabledFromPreferences = useTokenDetection;\n\n if (isDetectionChangedFromPreferences) {\n await this.#restartTokenDetection({\n selectedAddress: selectedAccount.address,\n });\n }\n },\n );\n\n this.messenger.subscribe(\n 'AccountsController:selectedEvmAccountChange',\n async (selectedAccount) => {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = Object.keys(networkConfigurationsByChainId) as Hex[];\n const isSelectedAccountIdChanged =\n this.#selectedAccountId !== selectedAccount.id;\n if (isSelectedAccountIdChanged) {\n this.#selectedAccountId = selectedAccount.id;\n await this.#restartTokenDetection({\n selectedAddress: selectedAccount.address,\n chainIds,\n });\n }\n },\n );\n\n this.messenger.subscribe(\n 'TransactionController:transactionConfirmed',\n async (transactionMeta) => {\n await this.detectTokens({\n chainIds: [transactionMeta.chainId],\n });\n },\n );\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n /**\n * Internal isActive state\n *\n * @returns Whether the controller is active (not disabled and keyring is unlocked)\n */\n get isActive(): boolean {\n return !this.#disabled && this.#isUnlocked;\n }\n\n /**\n * Start polling for detected tokens.\n */\n async start(): Promise<void> {\n this.enable();\n await this.#startPolling();\n }\n\n /**\n * Stop polling for detected tokens.\n */\n stop(): void {\n this.disable();\n this.#stopPolling();\n }\n\n #stopPolling(): void {\n if (this.#intervalId) {\n clearInterval(this.#intervalId);\n }\n }\n\n /**\n * Starts a new polling interval.\n */\n async #startPolling(): Promise<void> {\n if (!this.isActive) {\n return;\n }\n this.#stopPolling();\n await this.detectTokens();\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#intervalId = setInterval(async () => {\n await this.detectTokens();\n }, this.getIntervalLength());\n }\n\n /**\n * Compares current and previous tokensChainsCache object focusing only on the data object.\n *\n * @param tokensChainsCache - current tokensChainsCache input object\n * @param previousTokensChainsCache - previous tokensChainsCache input object\n * @returns boolean indicating if the two objects are equal\n */\n\n #compareTokensChainsCache(\n tokensChainsCache: TokensChainsCache,\n previousTokensChainsCache: TokensChainsCache,\n ): boolean {\n const cleanPreviousTokensChainsCache = mapChainIdWithTokenListMap(\n previousTokensChainsCache,\n );\n const cleanTokensChainsCache =\n mapChainIdWithTokenListMap(tokensChainsCache);\n const isEqualValues = isEqual(\n cleanTokensChainsCache,\n cleanPreviousTokensChainsCache,\n );\n return isEqualValues;\n }\n\n #getCorrectNetworkClientIdByChainId(\n chainIds: Hex[] | undefined,\n ): { chainId: Hex; networkClientId: NetworkClientId }[] {\n const { networkConfigurationsByChainId, selectedNetworkClientId } =\n this.messenger.call('NetworkController:getState');\n\n if (!chainIds) {\n const networkConfiguration = this.messenger.call(\n 'NetworkController:getNetworkConfigurationByNetworkClientId',\n selectedNetworkClientId,\n );\n\n return [\n {\n chainId: networkConfiguration?.chainId ?? ChainId.mainnet,\n networkClientId: selectedNetworkClientId,\n },\n ];\n }\n\n return chainIds.map((chainId) => {\n const configuration = networkConfigurationsByChainId[chainId];\n return {\n chainId,\n networkClientId:\n configuration.rpcEndpoints[configuration.defaultRpcEndpointIndex]\n .networkClientId,\n };\n });\n }\n\n async _executePoll({\n chainIds,\n address,\n }: TokenDetectionPollingInput): Promise<void> {\n if (!this.isActive) {\n return;\n }\n await this.detectTokens({\n chainIds,\n selectedAddress: address,\n });\n }\n\n /**\n * Restart token detection polling period and call detectNewTokens\n * in case of address change or user session initialization.\n *\n * @param options - Options for restart token detection.\n * @param options.selectedAddress - the selectedAddress against which to detect for token balances\n * @param options.chainIds - The chain IDs of the network client to use.\n */\n async #restartTokenDetection({\n selectedAddress,\n chainIds,\n }: {\n selectedAddress?: string;\n chainIds?: Hex[];\n } = {}): Promise<void> {\n await this.detectTokens({\n chainIds,\n selectedAddress,\n });\n this.setIntervalLength(DEFAULT_INTERVAL);\n }\n\n #getChainsToDetect(\n clientNetworks: NetworkClient[],\n supportedNetworks: number[] | null | undefined,\n ) {\n const chainsToDetectUsingAccountAPI: Hex[] = [];\n const chainsToDetectUsingRpc: NetworkClient[] = [];\n\n clientNetworks.forEach(({ chainId, networkClientId }) => {\n if (supportedNetworks?.includes(hexToNumber(chainId))) {\n chainsToDetectUsingAccountAPI.push(chainId);\n } else {\n chainsToDetectUsingRpc.push({ chainId, networkClientId });\n }\n });\n\n return { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI };\n }\n\n async #attemptAccountAPIDetection(\n chainsToDetectUsingAccountAPI: Hex[],\n addressToDetect: string,\n supportedNetworks: number[] | null,\n ) {\n return await this.#addDetectedTokensViaAPI({\n chainIds: chainsToDetectUsingAccountAPI,\n selectedAddress: addressToDetect,\n supportedNetworks,\n });\n }\n\n #addChainsToRpcDetection(\n chainsToDetectUsingRpc: NetworkClient[],\n chainsToDetectUsingAccountAPI: Hex[],\n clientNetworks: NetworkClient[],\n ): void {\n chainsToDetectUsingAccountAPI.forEach((chainId) => {\n const networkEntry = clientNetworks.find(\n (network) => network.chainId === chainId,\n );\n if (networkEntry) {\n chainsToDetectUsingRpc.push({\n chainId: networkEntry.chainId,\n networkClientId: networkEntry.networkClientId,\n });\n }\n });\n }\n\n #shouldDetectTokens(chainId: Hex): boolean {\n if (!isTokenDetectionSupportedForNetwork(chainId)) {\n return false;\n }\n if (\n !this.#isDetectionEnabledFromPreferences &&\n chainId !== ChainId.mainnet\n ) {\n return false;\n }\n\n const isMainnetDetectionInactive =\n !this.#isDetectionEnabledFromPreferences && chainId === ChainId.mainnet;\n if (isMainnetDetectionInactive) {\n this.#tokensChainsCache = this.#getConvertedStaticMainnetTokenList();\n } else {\n const { tokensChainsCache } = this.messenger.call(\n 'TokenListController:getState',\n );\n this.#tokensChainsCache = tokensChainsCache ?? {};\n }\n\n return true;\n }\n\n async #detectTokensUsingRpc(\n chainsToDetectUsingRpc: NetworkClient[],\n addressToDetect: string,\n ): Promise<void> {\n for (const { chainId, networkClientId } of chainsToDetectUsingRpc) {\n if (!this.#shouldDetectTokens(chainId)) {\n continue;\n }\n\n const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({\n chainId,\n selectedAddress: addressToDetect,\n });\n const tokenDetectionPromises = tokenCandidateSlices.map((tokensSlice) =>\n this.#addDetectedTokens({\n tokensSlice,\n selectedAddress: addressToDetect,\n networkClientId,\n chainId,\n }),\n );\n\n await Promise.all(tokenDetectionPromises);\n }\n }\n\n /**\n * For each token in the token list provided by the TokenListController, checks the token's balance for the selected account address on the active network.\n * On mainnet, if token detection is disabled in preferences, ERC20 token auto detection will be triggered for each contract address in the legacy token list from the @metamask/contract-metadata repo.\n *\n * @param options - Options for token detection.\n * @param options.chainIds - The chain IDs of the network client to use.\n * @param options.selectedAddress - the selectedAddress against which to detect for token balances.\n */\n async detectTokens({\n chainIds,\n selectedAddress,\n }: {\n chainIds?: Hex[];\n selectedAddress?: string;\n } = {}): Promise<void> {\n if (!this.isActive) {\n return;\n }\n\n if (!this.#useTokenDetection()) {\n return;\n }\n\n const addressToDetect = selectedAddress ?? this.#getSelectedAddress();\n const clientNetworks = this.#getCorrectNetworkClientIdByChainId(chainIds);\n\n let supportedNetworks;\n if (this.#accountsAPI.isAccountsAPIEnabled && this.#useExternalServices()) {\n supportedNetworks = await this.#accountsAPI.getSupportedNetworks();\n }\n const { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI } =\n this.#getChainsToDetect(clientNetworks, supportedNetworks);\n\n // Try detecting tokens via Account API first if conditions allow\n if (supportedNetworks && chainsToDetectUsingAccountAPI.length > 0) {\n const apiResult = await this.#attemptAccountAPIDetection(\n chainsToDetectUsingAccountAPI,\n addressToDetect,\n supportedNetworks,\n );\n\n // If the account API call failed, have those chains fall back to RPC detection\n if (apiResult?.result === 'failed') {\n this.#addChainsToRpcDetection(\n chainsToDetectUsingRpc,\n chainsToDetectUsingAccountAPI,\n clientNetworks,\n );\n }\n }\n\n // Proceed with RPC detection if there are chains remaining in chainsToDetectUsingRpc\n if (chainsToDetectUsingRpc.length > 0) {\n await this.#detectTokensUsingRpc(chainsToDetectUsingRpc, addressToDetect);\n }\n }\n\n #getSlicesOfTokensToDetect({\n chainId,\n selectedAddress,\n }: {\n chainId: Hex;\n selectedAddress: string;\n }): string[][] {\n const { allTokens, allDetectedTokens, allIgnoredTokens } =\n this.messenger.call('TokensController:getState');\n const [tokensAddresses, detectedTokensAddresses, ignoredTokensAddresses] = [\n allTokens,\n allDetectedTokens,\n allIgnoredTokens,\n ].map((tokens) =>\n (tokens[chainId]?.[selectedAddress] ?? []).map((value) =>\n typeof value === 'string' ? value : value.address,\n ),\n );\n\n const tokensToDetect: string[] = [];\n for (const tokenAddress of Object.keys(\n this.#tokensChainsCache?.[chainId]?.data || {},\n )) {\n if (\n [\n tokensAddresses,\n detectedTokensAddresses,\n ignoredTokensAddresses,\n ].every(\n (addresses) =>\n !addresses.find((address) =>\n isEqualCaseInsensitive(address, tokenAddress),\n ),\n )\n ) {\n tokensToDetect.push(tokenAddress);\n }\n }\n\n const slicesOfTokensToDetect = [];\n for (let i = 0, size = 1000; i < tokensToDetect.length; i += size) {\n slicesOfTokensToDetect.push(tokensToDetect.slice(i, i + size));\n }\n\n return slicesOfTokensToDetect;\n }\n\n #getConvertedStaticMainnetTokenList(): TokensChainsCache {\n const data: TokenListMap = Object.entries(STATIC_MAINNET_TOKEN_LIST).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: {\n name: value.name,\n symbol: value.symbol,\n decimals: value.decimals,\n address: value.address,\n aggregators: [],\n iconUrl: value?.iconUrl,\n },\n }),\n {},\n );\n return {\n '0x1': {\n data,\n timestamp: 0,\n },\n };\n }\n\n /**\n * This adds detected tokens from the Accounts API, avoiding the multi-call RPC calls for balances\n *\n * @param options - method arguments\n * @param options.selectedAddress - address to check against\n * @param options.chainIds - array of chainIds to check tokens for\n * @param options.supportedNetworks - array of chainIds to check tokens for\n * @returns a success or failed object\n */\n async #addDetectedTokensViaAPI({\n selectedAddress,\n chainIds,\n supportedNetworks,\n }: {\n selectedAddress: string;\n chainIds: Hex[];\n supportedNetworks: number[] | null;\n }) {\n return await safelyExecute(async () => {\n // Fetch balances for multiple chain IDs at once\n const tokenBalancesByChain = await this.#accountsAPI\n .getMultiNetworksBalances(selectedAddress, chainIds, supportedNetworks)\n .catch(() => null);\n\n if (tokenBalancesByChain === null) {\n return { result: 'failed' } as const;\n }\n\n // Process each chain ID individually\n for (const chainId of chainIds) {\n const isTokenDetectionInactiveInMainnet =\n !this.#isDetectionEnabledFromPreferences &&\n chainId === ChainId.mainnet;\n const { tokensChainsCache } = this.messenger.call(\n 'TokenListController:getState',\n );\n this.#tokensChainsCache = isTokenDetectionInactiveInMainnet\n ? this.#getConvertedStaticMainnetTokenList()\n : (tokensChainsCache ?? {});\n\n // Generate token candidates based on chainId and selectedAddress\n const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({\n chainId,\n selectedAddress,\n });\n\n // Filter balances for the current chainId\n const tokenBalances = tokenBalancesByChain.filter(\n (balance) => balance.chainId === hexToNumber(chainId),\n );\n\n if (!tokenBalances || tokenBalances.length === 0) {\n continue;\n }\n\n // Use helper function to filter tokens with balance for this chainId\n const { tokensWithBalance, eventTokensDetails } =\n this.#filterAndBuildTokensWithBalance(\n tokenCandidateSlices,\n tokenBalances,\n chainId,\n );\n\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n await this.messenger.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n }\n\n return { result: 'success' } as const;\n });\n }\n\n /**\n * Helper function to filter and build token data for detected tokens\n *\n * @param options.tokenCandidateSlices - these are tokens we know a user does not have (by checking the tokens controller).\n * We will use these these token candidates to determine if a token found from the API is valid to be added on the users wallet.\n * It will also prevent us to adding tokens a user already has\n * @param tokenBalances - Tokens balances fetched from API\n * @param chainId - The chain ID being processed\n * @returns an object containing tokensWithBalance and eventTokensDetails arrays\n */\n\n #filterAndBuildTokensWithBalance(\n tokenCandidateSlices: string[][],\n tokenBalances:\n | {\n object: string;\n type?: string;\n timestamp?: string;\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n chainId: number;\n balance: string;\n }[]\n | null,\n chainId: Hex,\n ) {\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n\n const tokenCandidateSet = new Set<string>(tokenCandidateSlices.flat());\n\n tokenBalances?.forEach((token) => {\n const tokenAddress = token.address;\n\n // Make sure the token to add is in our candidate list\n if (!tokenCandidateSet.has(tokenAddress)) {\n return;\n }\n\n // Retrieve token data from cache to safely add it\n const tokenData = this.#tokensChainsCache[chainId]?.data[tokenAddress];\n\n // We need specific data from tokensChainsCache to correctly create a token\n // So even if we have a token that was detected correctly by the API, if its missing data we cannot safely add it.\n if (!tokenData) {\n return;\n }\n\n const { decimals, symbol, aggregators, iconUrl, name } = tokenData;\n eventTokensDetails.push(`${symbol} - ${tokenAddress}`);\n tokensWithBalance.push({\n address: tokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n });\n\n return { tokensWithBalance, eventTokensDetails };\n }\n\n async #addDetectedTokens({\n tokensSlice,\n selectedAddress,\n networkClientId,\n chainId,\n }: {\n tokensSlice: string[];\n selectedAddress: string;\n networkClientId: NetworkClientId;\n chainId: Hex;\n }): Promise<void> {\n await safelyExecute(async () => {\n const balances = await this.#getBalancesInSingleCall(\n selectedAddress,\n tokensSlice,\n networkClientId,\n );\n\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n for (const nonZeroTokenAddress of Object.keys(balances)) {\n const { decimals, symbol, aggregators, iconUrl, name } =\n this.#tokensChainsCache[chainId].data[nonZeroTokenAddress];\n eventTokensDetails.push(`${symbol} - ${nonZeroTokenAddress}`);\n tokensWithBalance.push({\n address: nonZeroTokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n }\n\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n await this.messenger.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n });\n }\n\n /**\n * Add tokens detected from websocket balance updates\n * This method assumes:\n * - Tokens are already in the tokensChainsCache with full metadata\n * - Balance fetching is skipped since balances are provided by the websocket\n * - Ignored tokens have been filtered out by the caller\n *\n * @param options - The options object\n * @param options.tokensSlice - Array of token addresses detected from websocket (already filtered to exclude ignored tokens)\n * @param options.chainId - Hex chain ID\n * @returns Promise that resolves when tokens are added\n */\n async addDetectedTokensViaWs({\n tokensSlice,\n chainId,\n }: {\n tokensSlice: string[];\n chainId: Hex;\n }): Promise<void> {\n const tokensWithBalance: Token[] = [];\n const eventTokensDetails: string[] = [];\n\n for (const tokenAddress of tokensSlice) {\n // Normalize addresses explicitly (don't assume input format)\n const lowercaseTokenAddress = tokenAddress.toLowerCase();\n const checksummedTokenAddress = toChecksumHexAddress(tokenAddress);\n\n // Check map of validated tokens (cache keys are lowercase)\n const tokenData =\n this.#tokensChainsCache[chainId]?.data?.[lowercaseTokenAddress];\n\n if (!tokenData) {\n console.warn(\n `Token metadata not found in cache for ${tokenAddress} on chain ${chainId}`,\n );\n continue;\n }\n\n const { decimals, symbol, aggregators, iconUrl, name } = tokenData;\n\n // Push to lists with checksummed address (for allTokens storage)\n eventTokensDetails.push(`${symbol} - ${checksummedTokenAddress}`);\n tokensWithBalance.push({\n address: checksummedTokenAddress,\n decimals,\n symbol,\n aggregators,\n image: iconUrl,\n isERC721: false,\n name,\n });\n }\n\n // Perform addition\n if (tokensWithBalance.length) {\n this.#trackMetaMetricsEvent({\n event: 'Token Detected',\n category: 'Wallet',\n properties: {\n tokens: eventTokensDetails,\n token_standard: ERC20,\n asset_type: ASSET_TYPES.TOKEN,\n },\n });\n\n const networkClientId = this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n await this.messenger.call(\n 'TokensController:addTokens',\n tokensWithBalance,\n networkClientId,\n );\n }\n }\n\n #getSelectedAccount() {\n return this.messenger.call('AccountsController:getSelectedAccount');\n }\n\n #getSelectedAddress() {\n // If the address is not defined (or empty), we fallback to the currently selected account's address\n const account = this.messenger.call(\n 'AccountsController:getAccount',\n this.#selectedAccountId,\n );\n return account?.address || '';\n }\n}\n\nexport default TokenDetectionController;\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { AccountsControllerGetSelectedAccountAction, AccountsControllerGetAccountAction, AccountsControllerSelectedEvmAccountChangeEvent } from "@metamask/accounts-controller";
2
- import type { RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
2
+ import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
3
3
  import type { KeyringControllerGetStateAction, KeyringControllerLockEvent, KeyringControllerUnlockEvent } from "@metamask/keyring-controller";
4
+ import type { Messenger } from "@metamask/messenger";
4
5
  import type { NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetNetworkConfigurationByNetworkClientId, NetworkControllerGetStateAction, NetworkControllerNetworkDidChangeEvent } from "@metamask/network-controller";
5
6
  import type { PreferencesControllerGetStateAction, PreferencesControllerStateChangeEvent } from "@metamask/preferences-controller";
6
7
  import type { TransactionControllerTransactionConfirmedEvent } from "@metamask/transaction-controller";
@@ -33,7 +34,7 @@ export type AllowedActions = AccountsControllerGetSelectedAccountAction | Accoun
33
34
  export type TokenDetectionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;
34
35
  export type TokenDetectionControllerEvents = TokenDetectionControllerStateChangeEvent;
35
36
  export type AllowedEvents = AccountsControllerSelectedEvmAccountChangeEvent | NetworkControllerNetworkDidChangeEvent | TokenListStateChange | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent;
36
- export type TokenDetectionControllerMessenger = RestrictedMessenger<typeof controllerName, TokenDetectionControllerActions | AllowedActions, TokenDetectionControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
37
+ export type TokenDetectionControllerMessenger = Messenger<typeof controllerName, TokenDetectionControllerActions | AllowedActions, TokenDetectionControllerEvents | AllowedEvents>;
37
38
  /** The input to start polling for the {@link TokenDetectionController} */
38
39
  type TokenDetectionPollingInput = {
39
40
  chainIds: Hex[];
@@ -76,7 +77,7 @@ export declare class TokenDetectionController extends TokenDetectionController_b
76
77
  * Creates a TokenDetectionController instance.
77
78
  *
78
79
  * @param options - The controller options.
79
- * @param options.messenger - The controller messaging system.
80
+ * @param options.messenger - The controller messenger.
80
81
  * @param options.disabled - If set to true, all network requests are blocked.
81
82
  * @param options.interval - Polling interval used to fetch new token rates
82
83
  * @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
@@ -1 +1 @@
1
- {"version":3,"file":"TokenDetectionController.d.cts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TokenDetectionController.d.cts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { AccountsControllerGetSelectedAccountAction, AccountsControllerGetAccountAction, AccountsControllerSelectedEvmAccountChangeEvent } from "@metamask/accounts-controller";
2
- import type { RestrictedMessenger, ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
2
+ import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
3
3
  import type { KeyringControllerGetStateAction, KeyringControllerLockEvent, KeyringControllerUnlockEvent } from "@metamask/keyring-controller";
4
+ import type { Messenger } from "@metamask/messenger";
4
5
  import type { NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetNetworkConfigurationByNetworkClientId, NetworkControllerGetStateAction, NetworkControllerNetworkDidChangeEvent } from "@metamask/network-controller";
5
6
  import type { PreferencesControllerGetStateAction, PreferencesControllerStateChangeEvent } from "@metamask/preferences-controller";
6
7
  import type { TransactionControllerTransactionConfirmedEvent } from "@metamask/transaction-controller";
@@ -33,7 +34,7 @@ export type AllowedActions = AccountsControllerGetSelectedAccountAction | Accoun
33
34
  export type TokenDetectionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;
34
35
  export type TokenDetectionControllerEvents = TokenDetectionControllerStateChangeEvent;
35
36
  export type AllowedEvents = AccountsControllerSelectedEvmAccountChangeEvent | NetworkControllerNetworkDidChangeEvent | TokenListStateChange | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent;
36
- export type TokenDetectionControllerMessenger = RestrictedMessenger<typeof controllerName, TokenDetectionControllerActions | AllowedActions, TokenDetectionControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
37
+ export type TokenDetectionControllerMessenger = Messenger<typeof controllerName, TokenDetectionControllerActions | AllowedActions, TokenDetectionControllerEvents | AllowedEvents>;
37
38
  /** The input to start polling for the {@link TokenDetectionController} */
38
39
  type TokenDetectionPollingInput = {
39
40
  chainIds: Hex[];
@@ -76,7 +77,7 @@ export declare class TokenDetectionController extends TokenDetectionController_b
76
77
  * Creates a TokenDetectionController instance.
77
78
  *
78
79
  * @param options - The controller options.
79
- * @param options.messenger - The controller messaging system.
80
+ * @param options.messenger - The controller messenger.
80
81
  * @param options.disabled - If set to true, all network requests are blocked.
81
82
  * @param options.interval - Polling interval used to fetch new token rates
82
83
  * @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
@@ -1 +1 @@
1
- {"version":3,"file":"TokenDetectionController.d.mts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TokenDetectionController.d.mts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
@@ -74,7 +74,7 @@ export class TokenDetectionController extends StaticIntervalPollingController()
74
74
  * Creates a TokenDetectionController instance.
75
75
  *
76
76
  * @param options - The controller options.
77
- * @param options.messenger - The controller messaging system.
77
+ * @param options.messenger - The controller messenger.
78
78
  * @param options.disabled - If set to true, all network requests are blocked.
79
79
  * @param options.interval - Polling interval used to fetch new token rates
80
80
  * @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
@@ -132,17 +132,17 @@ export class TokenDetectionController extends StaticIntervalPollingController()
132
132
  return result.balances;
133
133
  },
134
134
  });
135
- this.messagingSystem.registerActionHandler(`${controllerName}:addDetectedTokensViaWs`, this.addDetectedTokensViaWs.bind(this));
135
+ this.messenger.registerActionHandler(`${controllerName}:addDetectedTokensViaWs`, this.addDetectedTokensViaWs.bind(this));
136
136
  __classPrivateFieldSet(this, _TokenDetectionController_disabled, disabled, "f");
137
137
  this.setIntervalLength(interval);
138
138
  __classPrivateFieldSet(this, _TokenDetectionController_selectedAccountId, __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSelectedAccount).call(this).id, "f");
139
- const { tokensChainsCache } = this.messagingSystem.call('TokenListController:getState');
139
+ const { tokensChainsCache } = this.messenger.call('TokenListController:getState');
140
140
  __classPrivateFieldSet(this, _TokenDetectionController_tokensChainsCache, tokensChainsCache, "f");
141
- const { useTokenDetection: defaultUseTokenDetection } = this.messagingSystem.call('PreferencesController:getState');
141
+ const { useTokenDetection: defaultUseTokenDetection } = this.messenger.call('PreferencesController:getState');
142
142
  __classPrivateFieldSet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, defaultUseTokenDetection, "f");
143
143
  __classPrivateFieldSet(this, _TokenDetectionController_getBalancesInSingleCall, getBalancesInSingleCall, "f");
144
144
  __classPrivateFieldSet(this, _TokenDetectionController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
145
- const { isUnlocked } = this.messagingSystem.call('KeyringController:getState');
145
+ const { isUnlocked } = this.messenger.call('KeyringController:getState');
146
146
  __classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, isUnlocked, "f");
147
147
  __classPrivateFieldGet(this, _TokenDetectionController_accountsAPI, "f").isAccountsAPIEnabled = useAccountsAPI;
148
148
  __classPrivateFieldSet(this, _TokenDetectionController_useTokenDetection, useTokenDetection, "f");
@@ -277,27 +277,27 @@ export class TokenDetectionController extends StaticIntervalPollingController()
277
277
  asset_type: ASSET_TYPES.TOKEN,
278
278
  },
279
279
  });
280
- const networkClientId = this.messagingSystem.call('NetworkController:findNetworkClientIdByChainId', chainId);
281
- await this.messagingSystem.call('TokensController:addTokens', tokensWithBalance, networkClientId);
280
+ const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
281
+ await this.messenger.call('TokensController:addTokens', tokensWithBalance, networkClientId);
282
282
  }
283
283
  }
284
284
  }
285
285
  _TokenDetectionController_intervalId = new WeakMap(), _TokenDetectionController_selectedAccountId = new WeakMap(), _TokenDetectionController_tokensChainsCache = new WeakMap(), _TokenDetectionController_disabled = new WeakMap(), _TokenDetectionController_isUnlocked = new WeakMap(), _TokenDetectionController_isDetectionEnabledFromPreferences = new WeakMap(), _TokenDetectionController_useTokenDetection = new WeakMap(), _TokenDetectionController_useExternalServices = new WeakMap(), _TokenDetectionController_getBalancesInSingleCall = new WeakMap(), _TokenDetectionController_trackMetaMetricsEvent = new WeakMap(), _TokenDetectionController_accountsAPI = new WeakMap(), _TokenDetectionController_instances = new WeakSet(), _TokenDetectionController_registerEventListeners = function _TokenDetectionController_registerEventListeners() {
286
- this.messagingSystem.subscribe('KeyringController:unlock', async () => {
286
+ this.messenger.subscribe('KeyringController:unlock', async () => {
287
287
  __classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, true, "f");
288
288
  await __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this);
289
289
  });
290
- this.messagingSystem.subscribe('KeyringController:lock', () => {
290
+ this.messenger.subscribe('KeyringController:lock', () => {
291
291
  __classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, false, "f");
292
292
  __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_stopPolling).call(this);
293
293
  });
294
- this.messagingSystem.subscribe('TokenListController:stateChange', async ({ tokensChainsCache }) => {
294
+ this.messenger.subscribe('TokenListController:stateChange', async ({ tokensChainsCache }) => {
295
295
  const isEqualValues = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_compareTokensChainsCache).call(this, tokensChainsCache, __classPrivateFieldGet(this, _TokenDetectionController_tokensChainsCache, "f"));
296
296
  if (!isEqualValues) {
297
297
  await __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this);
298
298
  }
299
299
  });
300
- this.messagingSystem.subscribe('PreferencesController:stateChange', async ({ useTokenDetection }) => {
300
+ this.messenger.subscribe('PreferencesController:stateChange', async ({ useTokenDetection }) => {
301
301
  const selectedAccount = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSelectedAccount).call(this);
302
302
  const isDetectionChangedFromPreferences = __classPrivateFieldGet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, "f") !== useTokenDetection;
303
303
  __classPrivateFieldSet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, useTokenDetection, "f");
@@ -307,8 +307,8 @@ _TokenDetectionController_intervalId = new WeakMap(), _TokenDetectionController_
307
307
  });
308
308
  }
309
309
  });
310
- this.messagingSystem.subscribe('AccountsController:selectedEvmAccountChange', async (selectedAccount) => {
311
- const { networkConfigurationsByChainId } = this.messagingSystem.call('NetworkController:getState');
310
+ this.messenger.subscribe('AccountsController:selectedEvmAccountChange', async (selectedAccount) => {
311
+ const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
312
312
  const chainIds = Object.keys(networkConfigurationsByChainId);
313
313
  const isSelectedAccountIdChanged = __classPrivateFieldGet(this, _TokenDetectionController_selectedAccountId, "f") !== selectedAccount.id;
314
314
  if (isSelectedAccountIdChanged) {
@@ -319,7 +319,7 @@ _TokenDetectionController_intervalId = new WeakMap(), _TokenDetectionController_
319
319
  });
320
320
  }
321
321
  });
322
- this.messagingSystem.subscribe('TransactionController:transactionConfirmed', async (transactionMeta) => {
322
+ this.messenger.subscribe('TransactionController:transactionConfirmed', async (transactionMeta) => {
323
323
  await this.detectTokens({
324
324
  chainIds: [transactionMeta.chainId],
325
325
  });
@@ -349,9 +349,9 @@ async function _TokenDetectionController_startPolling() {
349
349
  const isEqualValues = isEqual(cleanTokensChainsCache, cleanPreviousTokensChainsCache);
350
350
  return isEqualValues;
351
351
  }, _TokenDetectionController_getCorrectNetworkClientIdByChainId = function _TokenDetectionController_getCorrectNetworkClientIdByChainId(chainIds) {
352
- const { networkConfigurationsByChainId, selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
352
+ const { networkConfigurationsByChainId, selectedNetworkClientId } = this.messenger.call('NetworkController:getState');
353
353
  if (!chainIds) {
354
- const networkConfiguration = this.messagingSystem.call('NetworkController:getNetworkConfigurationByNetworkClientId', selectedNetworkClientId);
354
+ const networkConfiguration = this.messenger.call('NetworkController:getNetworkConfigurationByNetworkClientId', selectedNetworkClientId);
355
355
  return [
356
356
  {
357
357
  chainId: networkConfiguration?.chainId ?? ChainId.mainnet,
@@ -423,7 +423,7 @@ async function _TokenDetectionController_restartTokenDetection({ selectedAddress
423
423
  __classPrivateFieldSet(this, _TokenDetectionController_tokensChainsCache, __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getConvertedStaticMainnetTokenList).call(this), "f");
424
424
  }
425
425
  else {
426
- const { tokensChainsCache } = this.messagingSystem.call('TokenListController:getState');
426
+ const { tokensChainsCache } = this.messenger.call('TokenListController:getState');
427
427
  __classPrivateFieldSet(this, _TokenDetectionController_tokensChainsCache, tokensChainsCache ?? {}, "f");
428
428
  }
429
429
  return true;
@@ -445,7 +445,7 @@ async function _TokenDetectionController_restartTokenDetection({ selectedAddress
445
445
  await Promise.all(tokenDetectionPromises);
446
446
  }
447
447
  }, _TokenDetectionController_getSlicesOfTokensToDetect = function _TokenDetectionController_getSlicesOfTokensToDetect({ chainId, selectedAddress, }) {
448
- const { allTokens, allDetectedTokens, allIgnoredTokens } = this.messagingSystem.call('TokensController:getState');
448
+ const { allTokens, allDetectedTokens, allIgnoredTokens } = this.messenger.call('TokensController:getState');
449
449
  const [tokensAddresses, detectedTokensAddresses, ignoredTokensAddresses] = [
450
450
  allTokens,
451
451
  allDetectedTokens,
@@ -507,7 +507,7 @@ async function _TokenDetectionController_addDetectedTokensViaAPI({ selectedAddre
507
507
  for (const chainId of chainIds) {
508
508
  const isTokenDetectionInactiveInMainnet = !__classPrivateFieldGet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, "f") &&
509
509
  chainId === ChainId.mainnet;
510
- const { tokensChainsCache } = this.messagingSystem.call('TokenListController:getState');
510
+ const { tokensChainsCache } = this.messenger.call('TokenListController:getState');
511
511
  __classPrivateFieldSet(this, _TokenDetectionController_tokensChainsCache, isTokenDetectionInactiveInMainnet
512
512
  ? __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getConvertedStaticMainnetTokenList).call(this)
513
513
  : (tokensChainsCache ?? {}), "f");
@@ -533,8 +533,8 @@ async function _TokenDetectionController_addDetectedTokensViaAPI({ selectedAddre
533
533
  asset_type: ASSET_TYPES.TOKEN,
534
534
  },
535
535
  });
536
- const networkClientId = this.messagingSystem.call('NetworkController:findNetworkClientIdByChainId', chainId);
537
- await this.messagingSystem.call('TokensController:addTokens', tokensWithBalance, networkClientId);
536
+ const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
537
+ await this.messenger.call('TokensController:addTokens', tokensWithBalance, networkClientId);
538
538
  }
539
539
  }
540
540
  return { result: 'success' };
@@ -597,14 +597,14 @@ async function _TokenDetectionController_addDetectedTokensViaAPI({ selectedAddre
597
597
  asset_type: ASSET_TYPES.TOKEN,
598
598
  },
599
599
  });
600
- await this.messagingSystem.call('TokensController:addTokens', tokensWithBalance, networkClientId);
600
+ await this.messenger.call('TokensController:addTokens', tokensWithBalance, networkClientId);
601
601
  }
602
602
  });
603
603
  }, _TokenDetectionController_getSelectedAccount = function _TokenDetectionController_getSelectedAccount() {
604
- return this.messagingSystem.call('AccountsController:getSelectedAccount');
604
+ return this.messenger.call('AccountsController:getSelectedAccount');
605
605
  }, _TokenDetectionController_getSelectedAddress = function _TokenDetectionController_getSelectedAddress() {
606
606
  // If the address is not defined (or empty), we fallback to the currently selected account's address
607
- const account = this.messagingSystem.call('AccountsController:getAccount', __classPrivateFieldGet(this, _TokenDetectionController_selectedAccountId, "f"));
607
+ const account = this.messenger.call('AccountsController:getAccount', __classPrivateFieldGet(this, _TokenDetectionController_selectedAccountId, "f"));
608
608
  return account?.address || '';
609
609
  };
610
610
  export default TokenDetectionController;