@metamask/assets-controllers 83.0.0 → 84.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 (142) hide show
  1. package/CHANGELOG.md +37 -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 -11
  11. package/dist/AssetsContractController.cjs.map +1 -1
  12. package/dist/AssetsContractController.d.cts +3 -4
  13. package/dist/AssetsContractController.d.cts.map +1 -1
  14. package/dist/AssetsContractController.d.mts +3 -4
  15. package/dist/AssetsContractController.d.mts.map +1 -1
  16. package/dist/AssetsContractController.mjs +10 -11
  17. package/dist/AssetsContractController.mjs.map +1 -1
  18. package/dist/CurrencyRateController.cjs +3 -3
  19. package/dist/CurrencyRateController.cjs.map +1 -1
  20. package/dist/CurrencyRateController.d.cts +4 -3
  21. package/dist/CurrencyRateController.d.cts.map +1 -1
  22. package/dist/CurrencyRateController.d.mts +4 -3
  23. package/dist/CurrencyRateController.d.mts.map +1 -1
  24. package/dist/CurrencyRateController.mjs +3 -3
  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 +12 -12
  35. package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
  36. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts +3 -2
  37. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
  38. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts +3 -2
  39. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
  40. package/dist/MultichainAssetsController/MultichainAssetsController.mjs +12 -12
  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/constants.cjs +2 -1
  135. package/dist/constants.cjs.map +1 -1
  136. package/dist/constants.d.cts.map +1 -1
  137. package/dist/constants.d.mts.map +1 -1
  138. package/dist/constants.mjs +2 -1
  139. package/dist/constants.mjs.map +1 -1
  140. package/dist/selectors/token-selectors.d.cts +8 -8
  141. package/dist/selectors/token-selectors.d.mts +8 -8
  142. package/package.json +25 -24
@@ -1 +1 @@
1
- {"version":3,"file":"TokenSearchDiscoveryDataController.cjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n} from '@metamask/base-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport type { TokenPrice } from '../token-prices-service/abstract-token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata = {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n anonymous: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n anonymous: false,\n usedInUi: true,\n },\n} as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(\n chainId: Hex,\n address: string,\n ): Promise<TokenPrice<Hex, string> | null> {\n const { currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n chainId,\n tokenAddresses: [address as Hex],\n currency: currentCurrency,\n });\n\n return pricesData[address as Hex] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
1
+ {"version":3,"file":"TokenSearchDiscoveryDataController.cjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n type StateMetadata,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport type { TokenPrice } from '../token-prices-service/abstract-token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(\n chainId: Hex,\n address: string,\n ): Promise<TokenPrice<Hex, string> | null> {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n chainId,\n tokenAddresses: [address as Hex],\n currency: currentCurrency,\n });\n\n return pricesData[address as Hex] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedMessenger } from "@metamask/base-controller";
1
+ import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent } from "@metamask/base-controller";
2
+ import type { Messenger } from "@metamask/messenger";
2
3
  import type { Hex } from "@metamask/utils";
3
4
  import type { TokenDisplayData } from "./types.cjs";
4
5
  import type { GetCurrencyRateState } from "../CurrencyRateController.cjs";
@@ -45,7 +46,7 @@ export type AllowedEvents = never;
45
46
  * The messenger which is restricted to actions and events accessed by
46
47
  * {@link TokenSearchDiscoveryDataController}.
47
48
  */
48
- export type TokenSearchDiscoveryDataControllerMessenger = RestrictedMessenger<typeof controllerName, TokenSearchDiscoveryDataControllerActions | AllowedActions, TokenSearchDiscoveryDataControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
49
+ export type TokenSearchDiscoveryDataControllerMessenger = Messenger<typeof controllerName, TokenSearchDiscoveryDataControllerActions | AllowedActions, TokenSearchDiscoveryDataControllerEvents | AllowedEvents>;
49
50
  /**
50
51
  * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows
51
52
  * consumers to provide a partial state object when initializing the controller
@@ -1 +1 @@
1
- {"version":3,"file":"TokenSearchDiscoveryDataController.d.cts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAU1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAmBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,mBAAmB,CAC3E,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,EACxD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAwCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
1
+ {"version":3,"file":"TokenSearchDiscoveryDataController.d.cts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAU1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAoBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,SAAS,CACjE,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,CACzD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAwCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
@@ -1,4 +1,5 @@
1
- import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedMessenger } from "@metamask/base-controller";
1
+ import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent } from "@metamask/base-controller";
2
+ import type { Messenger } from "@metamask/messenger";
2
3
  import type { Hex } from "@metamask/utils";
3
4
  import type { TokenDisplayData } from "./types.mjs";
4
5
  import type { GetCurrencyRateState } from "../CurrencyRateController.mjs";
@@ -45,7 +46,7 @@ export type AllowedEvents = never;
45
46
  * The messenger which is restricted to actions and events accessed by
46
47
  * {@link TokenSearchDiscoveryDataController}.
47
48
  */
48
- export type TokenSearchDiscoveryDataControllerMessenger = RestrictedMessenger<typeof controllerName, TokenSearchDiscoveryDataControllerActions | AllowedActions, TokenSearchDiscoveryDataControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
49
+ export type TokenSearchDiscoveryDataControllerMessenger = Messenger<typeof controllerName, TokenSearchDiscoveryDataControllerActions | AllowedActions, TokenSearchDiscoveryDataControllerEvents | AllowedEvents>;
49
50
  /**
50
51
  * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows
51
52
  * consumers to provide a partial state object when initializing the controller
@@ -1 +1 @@
1
- {"version":3,"file":"TokenSearchDiscoveryDataController.d.mts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAU1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAmBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,mBAAmB,CAC3E,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,EACxD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAwCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
1
+ {"version":3,"file":"TokenSearchDiscoveryDataController.d.mts","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAgB;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,sCAAkC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,0CAAgC;AAU1E,eAAO,MAAM,cAAc,uCAAuC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAIhD,MAAM,MAAM,uCAAuC,GAAG;IACpD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAClC,GAAG,EACH;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAClE,CAAC;CACH,CAAC;AAoBF;;;GAGG;AACH,MAAM,MAAM,gDAAgD,GAC1D,wBAAwB,CACtB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,yCAAyC,GACnD,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kDAAkD,GAC5D,0BAA0B,CACxB,OAAO,cAAc,EACrB,uCAAuC,CACxC,CAAC;AAEJ;;;GAGG;AACH,MAAM,MAAM,wCAAwC,GAClD,kDAAkD,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,2CAA2C,GAAG,SAAS,CACjE,OAAO,cAAc,EACrB,yCAAyC,GAAG,cAAc,EAC1D,wCAAwC,GAAG,aAAa,CACzD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iDAAiD,IAAI,uCAAuC,CAK3G;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,cAAc,CACpE,OAAO,cAAc,EACrB,uCAAuC,EACvC,2CAA2C,CAC5C;;gBAWa,EACV,KAAU,EACV,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,2BAA2B,GAC5B,EAAE;QACD,KAAK,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACzD,SAAS,EAAE,2CAA2C,CAAC;QACvD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,sBAAsB,EAAE,GAAG,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC,CAAC;QAC9D,2BAA2B,EAAE,MAAM,CAAC;KACrC;IAwCK,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7C,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D1E"}
@@ -20,13 +20,13 @@ const tokenSearchDiscoveryDataControllerMetadata = {
20
20
  tokenDisplayData: {
21
21
  includeInStateLogs: false,
22
22
  persist: true,
23
- anonymous: false,
23
+ includeInDebugSnapshot: false,
24
24
  usedInUi: true,
25
25
  },
26
26
  swapsTokenAddressesByChainId: {
27
27
  includeInStateLogs: false,
28
28
  persist: true,
29
- anonymous: false,
29
+ includeInDebugSnapshot: false,
30
30
  usedInUi: true,
31
31
  },
32
32
  };
@@ -119,7 +119,7 @@ export class TokenSearchDiscoveryDataController extends BaseController {
119
119
  throw error;
120
120
  }
121
121
  }
122
- const { currentCurrency } = this.messagingSystem.call('CurrencyRateController:getState');
122
+ const { currentCurrency } = this.messenger.call('CurrencyRateController:getState');
123
123
  let tokenDisplayData;
124
124
  if (!tokenMetadata) {
125
125
  tokenDisplayData = {
@@ -158,7 +158,7 @@ export class TokenSearchDiscoveryDataController extends BaseController {
158
158
  }
159
159
  }
160
160
  _TokenSearchDiscoveryDataController_abortController = new WeakMap(), _TokenSearchDiscoveryDataController_tokenPricesService = new WeakMap(), _TokenSearchDiscoveryDataController_swapsSupportedChainIds = new WeakMap(), _TokenSearchDiscoveryDataController_fetchTokens = new WeakMap(), _TokenSearchDiscoveryDataController_fetchSwapsTokensThresholdMs = new WeakMap(), _TokenSearchDiscoveryDataController_instances = new WeakSet(), _TokenSearchDiscoveryDataController_fetchPriceData = async function _TokenSearchDiscoveryDataController_fetchPriceData(chainId, address) {
161
- const { currentCurrency } = this.messagingSystem.call('CurrencyRateController:getState');
161
+ const { currentCurrency } = this.messenger.call('CurrencyRateController:getState');
162
162
  try {
163
163
  const pricesData = await __classPrivateFieldGet(this, _TokenSearchDiscoveryDataController_tokenPricesService, "f").fetchTokenPrices({
164
164
  chainId,
@@ -1 +1 @@
1
- {"version":3,"file":"TokenSearchDiscoveryDataController.mjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n} from '@metamask/base-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport type { TokenPrice } from '../token-prices-service/abstract-token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata = {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n anonymous: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n anonymous: false,\n usedInUi: true,\n },\n} as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(\n chainId: Hex,\n address: string,\n ): Promise<TokenPrice<Hex, string> | null> {\n const { currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n chainId,\n tokenAddresses: [address as Hex],\n currency: currentCurrency,\n });\n\n return pricesData[address as Hex] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
1
+ {"version":3,"file":"TokenSearchDiscoveryDataController.mjs","sourceRoot":"","sources":["../../src/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n type StateMetadata,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TokenDisplayData } from './types';\nimport { formatIconUrlWithProxy } from '../assetsUtil';\nimport type { GetCurrencyRateState } from '../CurrencyRateController';\nimport type { AbstractTokenPricesService } from '../token-prices-service';\nimport type { TokenPrice } from '../token-prices-service/abstract-token-prices-service';\nimport {\n fetchTokenMetadata,\n TOKEN_METADATA_NO_SUPPORT_ERROR,\n} from '../token-service';\nimport type { TokenListToken } from '../TokenListController';\n\n// === GENERAL ===\n\nexport const controllerName = 'TokenSearchDiscoveryDataController';\n\nexport const MAX_TOKEN_DISPLAY_DATA_LENGTH = 10;\n\n// === STATE ===\n\nexport type TokenSearchDiscoveryDataControllerState = {\n tokenDisplayData: TokenDisplayData[];\n swapsTokenAddressesByChainId: Record<\n Hex,\n { lastFetched: number; addresses: string[]; isFetching: boolean }\n >;\n};\n\nconst tokenSearchDiscoveryDataControllerMetadata: StateMetadata<TokenSearchDiscoveryDataControllerState> =\n {\n tokenDisplayData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n swapsTokenAddressesByChainId: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n } as const;\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} registers, to be\n * called externally.\n */\nexport type TokenSearchDiscoveryDataControllerActions =\n TokenSearchDiscoveryDataControllerGetStateAction;\n\n/**\n * All actions that {@link TokenSearchDiscoveryDataController} calls internally.\n */\nexport type AllowedActions = GetCurrencyRateState;\n\n/**\n * The event that {@link TokenSearchDiscoveryDataController} publishes when updating\n * state.\n */\nexport type TokenSearchDiscoveryDataControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState\n >;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} publishes, to be\n * subscribed to externally.\n */\nexport type TokenSearchDiscoveryDataControllerEvents =\n TokenSearchDiscoveryDataControllerStateChangeEvent;\n\n/**\n * All events that {@link TokenSearchDiscoveryDataController} subscribes to internally.\n */\nexport type AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link TokenSearchDiscoveryDataController}.\n */\nexport type TokenSearchDiscoveryDataControllerMessenger = Messenger<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerActions | AllowedActions,\n TokenSearchDiscoveryDataControllerEvents | AllowedEvents\n>;\n\n/**\n * Constructs the default {@link TokenSearchDiscoveryDataController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link TokenSearchDiscoveryDataController} state.\n */\nexport function getDefaultTokenSearchDiscoveryDataControllerState(): TokenSearchDiscoveryDataControllerState {\n return {\n tokenDisplayData: [],\n swapsTokenAddressesByChainId: {},\n };\n}\n\n/**\n * The TokenSearchDiscoveryDataController manages the retrieval of token search results and token discovery.\n * It fetches token search results and discovery data from the Portfolio API.\n */\nexport class TokenSearchDiscoveryDataController extends BaseController<\n typeof controllerName,\n TokenSearchDiscoveryDataControllerState,\n TokenSearchDiscoveryDataControllerMessenger\n> {\n readonly #abortController: AbortController;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n readonly #swapsSupportedChainIds: Hex[];\n\n readonly #fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n\n readonly #fetchSwapsTokensThresholdMs: number;\n\n constructor({\n state = {},\n messenger,\n tokenPricesService,\n swapsSupportedChainIds,\n fetchTokens,\n fetchSwapsTokensThresholdMs,\n }: {\n state?: Partial<TokenSearchDiscoveryDataControllerState>;\n messenger: TokenSearchDiscoveryDataControllerMessenger;\n tokenPricesService: AbstractTokenPricesService;\n swapsSupportedChainIds: Hex[];\n fetchTokens: (chainId: Hex) => Promise<{ address: string }[]>;\n fetchSwapsTokensThresholdMs: number;\n }) {\n super({\n name: controllerName,\n metadata: tokenSearchDiscoveryDataControllerMetadata,\n messenger,\n state: {\n ...getDefaultTokenSearchDiscoveryDataControllerState(),\n ...state,\n },\n });\n\n this.#abortController = new AbortController();\n this.#tokenPricesService = tokenPricesService;\n this.#swapsSupportedChainIds = swapsSupportedChainIds;\n this.#fetchTokens = fetchTokens;\n this.#fetchSwapsTokensThresholdMs = fetchSwapsTokensThresholdMs;\n }\n\n async #fetchPriceData(\n chainId: Hex,\n address: string,\n ): Promise<TokenPrice<Hex, string> | null> {\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n try {\n const pricesData = await this.#tokenPricesService.fetchTokenPrices({\n chainId,\n tokenAddresses: [address as Hex],\n currency: currentCurrency,\n });\n\n return pricesData[address as Hex] ?? null;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n async fetchSwapsTokens(chainId: Hex): Promise<void> {\n if (!this.#swapsSupportedChainIds.includes(chainId)) {\n return;\n }\n\n const swapsTokens = this.state.swapsTokenAddressesByChainId[chainId];\n if (\n (!swapsTokens ||\n swapsTokens.lastFetched <\n Date.now() - this.#fetchSwapsTokensThresholdMs) &&\n !swapsTokens?.isFetching\n ) {\n try {\n this.update((state) => {\n if (!state.swapsTokenAddressesByChainId[chainId]) {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: [],\n isFetching: true,\n };\n } else {\n state.swapsTokenAddressesByChainId[chainId].isFetching = true;\n }\n });\n const tokens = await this.#fetchTokens(chainId);\n this.update((state) => {\n state.swapsTokenAddressesByChainId[chainId] = {\n lastFetched: Date.now(),\n addresses: tokens.map((token) => token.address),\n isFetching: false,\n };\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n async fetchTokenDisplayData(chainId: Hex, address: string): Promise<void> {\n await this.fetchSwapsTokens(chainId);\n\n let tokenMetadata: TokenListToken | undefined;\n try {\n tokenMetadata = await fetchTokenMetadata<TokenListToken>(\n chainId,\n address,\n this.#abortController.signal,\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !error.message.includes(TOKEN_METADATA_NO_SUPPORT_ERROR)\n ) {\n throw error;\n }\n }\n\n const { currentCurrency } = this.messenger.call(\n 'CurrencyRateController:getState',\n );\n\n let tokenDisplayData: TokenDisplayData;\n if (!tokenMetadata) {\n tokenDisplayData = {\n found: false,\n address,\n chainId,\n currency: currentCurrency,\n };\n } else {\n const priceData = await this.#fetchPriceData(chainId, address);\n tokenDisplayData = {\n found: true,\n address,\n chainId,\n currency: currentCurrency,\n token: {\n ...tokenMetadata,\n isERC721: false,\n image: formatIconUrlWithProxy({\n chainId,\n tokenAddress: address,\n }),\n },\n price: priceData,\n };\n }\n\n this.update((state) => {\n state.tokenDisplayData = [\n tokenDisplayData,\n ...state.tokenDisplayData.filter(\n (token) =>\n token.address !== address ||\n token.chainId !== chainId ||\n token.currency !== currentCurrency,\n ),\n ].slice(0, MAX_TOKEN_DISPLAY_DATA_LENGTH);\n });\n }\n}\n"]}
@@ -35,19 +35,19 @@ const metadata = {
35
35
  allTokens: {
36
36
  includeInStateLogs: false,
37
37
  persist: true,
38
- anonymous: false,
38
+ includeInDebugSnapshot: false,
39
39
  usedInUi: true,
40
40
  },
41
41
  allIgnoredTokens: {
42
42
  includeInStateLogs: false,
43
43
  persist: true,
44
- anonymous: false,
44
+ includeInDebugSnapshot: false,
45
45
  usedInUi: true,
46
46
  },
47
47
  allDetectedTokens: {
48
48
  includeInStateLogs: false,
49
49
  persist: true,
50
- anonymous: false,
50
+ includeInDebugSnapshot: false,
51
51
  usedInUi: true,
52
52
  },
53
53
  };
@@ -90,12 +90,12 @@ class TokensController extends base_controller_1.BaseController {
90
90
  __classPrivateFieldSet(this, _TokensController_provider, provider, "f");
91
91
  __classPrivateFieldSet(this, _TokensController_selectedAccountId, __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAccount).call(this).id, "f");
92
92
  __classPrivateFieldSet(this, _TokensController_abortController, new AbortController(), "f");
93
- this.messagingSystem.registerActionHandler(`${controllerName}:addDetectedTokens`, this.addDetectedTokens.bind(this));
94
- this.messagingSystem.registerActionHandler(`${controllerName}:addTokens`, this.addTokens.bind(this));
95
- this.messagingSystem.subscribe('AccountsController:selectedEvmAccountChange', __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_onSelectedAccountChange).bind(this));
96
- this.messagingSystem.subscribe('NetworkController:stateChange', __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_onNetworkStateChange).bind(this));
97
- this.messagingSystem.subscribe('KeyringController:accountRemoved', (accountAddress) => __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_handleOnAccountRemoved).call(this, accountAddress));
98
- this.messagingSystem.subscribe('TokenListController:stateChange', ({ tokensChainsCache }) => {
93
+ this.messenger.registerActionHandler(`${controllerName}:addDetectedTokens`, this.addDetectedTokens.bind(this));
94
+ this.messenger.registerActionHandler(`${controllerName}:addTokens`, this.addTokens.bind(this));
95
+ this.messenger.subscribe('AccountsController:selectedEvmAccountChange', __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_onSelectedAccountChange).bind(this));
96
+ this.messenger.subscribe('NetworkController:stateChange', __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_onNetworkStateChange).bind(this));
97
+ this.messenger.subscribe('KeyringController:accountRemoved', (accountAddress) => __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_handleOnAccountRemoved).call(this, accountAddress));
98
+ this.messenger.subscribe('TokenListController:stateChange', ({ tokensChainsCache }) => {
99
99
  const { allTokens } = this.state;
100
100
  const selectedAddress = __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAddress).call(this);
101
101
  // Deep clone the `allTokens` object to ensure mutability
@@ -139,7 +139,7 @@ class TokensController extends base_controller_1.BaseController {
139
139
  async addToken({ address, symbol, decimals, name, image, interactingAddress, networkClientId, }) {
140
140
  const releaseLock = await __classPrivateFieldGet(this, _TokensController_mutex, "f").acquire();
141
141
  const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
142
- const chainIdToUse = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
142
+ const chainIdToUse = this.messenger.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
143
143
  const accountAddress = __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getAddressOrSelectedAddress).call(this, interactingAddress);
144
144
  try {
145
145
  address = (0, controller_utils_1.toChecksumHexAddress)(address);
@@ -205,7 +205,7 @@ class TokensController extends base_controller_1.BaseController {
205
205
  const releaseLock = await __classPrivateFieldGet(this, _TokensController_mutex, "f").acquire();
206
206
  const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
207
207
  const importedTokensMap = {};
208
- const interactingChainId = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
208
+ const interactingChainId = this.messenger.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
209
209
  // Used later to dedupe imported tokens
210
210
  const newTokensMap = [
211
211
  ...(allTokens[interactingChainId]?.[__classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAccount).call(this).address] ||
@@ -260,7 +260,7 @@ class TokensController extends base_controller_1.BaseController {
260
260
  * @param networkClientId - Optional network client ID used to determine interacting chain ID.
261
261
  */
262
262
  ignoreTokens(tokenAddressesToIgnore, networkClientId) {
263
- const interactingChainId = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
263
+ const interactingChainId = this.messenger.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
264
264
  const { allTokens, allDetectedTokens, allIgnoredTokens } = this.state;
265
265
  const ignoredTokensMap = {};
266
266
  const ignoredTokens = allIgnoredTokens[interactingChainId]?.[__classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAddress).call(this)] || [];
@@ -368,7 +368,7 @@ class TokensController extends base_controller_1.BaseController {
368
368
  * @returns The new token object with the added isERC721 field.
369
369
  */
370
370
  async updateTokenType(tokenAddress, networkClientId) {
371
- const chainIdToUse = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
371
+ const chainIdToUse = this.messenger.call('NetworkController:getNetworkClientById', networkClientId).configuration.chainId;
372
372
  const isERC721 = await __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_detectIsERC721).call(this, tokenAddress, networkClientId);
373
373
  const accountAddress = __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAddress).call(this);
374
374
  const tokens = [...this.state.allTokens[chainIdToUse][accountAddress]];
@@ -600,7 +600,7 @@ async function _TokensController_detectIsERC721(tokenAddress, networkClientId) {
600
600
  }
601
601
  }, _TokensController_getProvider = function _TokensController_getProvider(networkClientId) {
602
602
  return new providers_1.Web3Provider(networkClientId
603
- ? this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId).provider
603
+ ? this.messenger.call('NetworkController:getNetworkClientById', networkClientId).provider
604
604
  : __classPrivateFieldGet(this, _TokensController_provider, "f"));
605
605
  }, _TokensController_createEthersContract = function _TokensController_createEthersContract(tokenAddress, abi, networkClientId) {
606
606
  const web3provider = __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getProvider).call(this, networkClientId);
@@ -667,7 +667,7 @@ async function _TokensController_detectIsERC721(tokenAddress, networkClientId) {
667
667
  }
668
668
  return __classPrivateFieldGet(this, _TokensController_instances, "m", _TokensController_getSelectedAddress).call(this);
669
669
  }, _TokensController_requestApproval = async function _TokensController_requestApproval(suggestedAssetMeta) {
670
- return this.messagingSystem.call('ApprovalController:addRequest', {
670
+ return this.messenger.call('ApprovalController:addRequest', {
671
671
  id: suggestedAssetMeta.id,
672
672
  origin: controller_utils_1.ORIGIN_METAMASK,
673
673
  type: controller_utils_1.ApprovalType.WatchAsset,
@@ -683,10 +683,10 @@ async function _TokensController_detectIsERC721(tokenAddress, networkClientId) {
683
683
  },
684
684
  }, true);
685
685
  }, _TokensController_getSelectedAccount = function _TokensController_getSelectedAccount() {
686
- return this.messagingSystem.call('AccountsController:getSelectedAccount');
686
+ return this.messenger.call('AccountsController:getSelectedAccount');
687
687
  }, _TokensController_getSelectedAddress = function _TokensController_getSelectedAddress() {
688
688
  // If the address is not defined (or empty), we fallback to the currently selected account's address
689
- const account = this.messagingSystem.call('AccountsController:getAccount', __classPrivateFieldGet(this, _TokensController_selectedAccountId, "f"));
689
+ const account = this.messenger.call('AccountsController:getAccount', __classPrivateFieldGet(this, _TokensController_selectedAccountId, "f"));
690
690
  return account?.address || '';
691
691
  };
692
692
  exports.default = TokensController;