@metamask-previews/assets-controllers 87.0.0-preview-8315c2ec → 87.0.0-preview-c2c8112b
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.
- package/CHANGELOG.md +0 -8
- package/dist/TokenRatesController.cjs +3 -32
- package/dist/TokenRatesController.cjs.map +1 -1
- package/dist/TokenRatesController.d.cts +2 -8
- package/dist/TokenRatesController.d.cts.map +1 -1
- package/dist/TokenRatesController.d.mts +2 -8
- package/dist/TokenRatesController.d.mts.map +1 -1
- package/dist/TokenRatesController.mjs +2 -31
- package/dist/TokenRatesController.mjs.map +1 -1
- package/dist/assetsUtil.cjs +2 -3
- package/dist/assetsUtil.cjs.map +1 -1
- package/dist/assetsUtil.d.cts +1 -3
- package/dist/assetsUtil.d.cts.map +1 -1
- package/dist/assetsUtil.d.mts +1 -3
- package/dist/assetsUtil.d.mts.map +1 -1
- package/dist/assetsUtil.mjs +2 -3
- package/dist/assetsUtil.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.cjs.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.d.cts +8 -6
- package/dist/token-prices-service/abstract-token-prices-service.d.cts.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.d.mts +8 -6
- package/dist/token-prices-service/abstract-token-prices-service.d.mts.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.mjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.cjs +88 -10
- package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.cts +18 -4
- package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.mts +18 -4
- package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
- package/dist/token-prices-service/codefi-v2.mjs +88 -10
- package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
- package/dist/token-prices-service/index.cjs +2 -1
- package/dist/token-prices-service/index.cjs.map +1 -1
- package/dist/token-prices-service/index.d.cts +1 -1
- package/dist/token-prices-service/index.d.cts.map +1 -1
- package/dist/token-prices-service/index.d.mts +1 -1
- package/dist/token-prices-service/index.d.mts.map +1 -1
- package/dist/token-prices-service/index.mjs +1 -1
- package/dist/token-prices-service/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,13 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
### Changed
|
|
11
|
-
|
|
12
|
-
- **BREAKING:** Removed exported `SUPPORTED_CHAIN_IDS` from `codefi-v2.ts` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
13
|
-
- **BREAKING:** Added `supportedChainIds` argument in `fetchTokenContractExchangeRates` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
14
|
-
- Removed `validateChainIdSupported` from `codefi-v2.ts` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
15
|
-
- Added `fetchSupportedChainIds` in `codefi-v2.ts` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
16
|
-
|
|
17
10
|
## [87.0.0]
|
|
18
11
|
|
|
19
12
|
### Added
|
|
@@ -53,7 +46,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
53
46
|
### Added
|
|
54
47
|
|
|
55
48
|
- **BREAKING:** Added constructor argument `tokenPricesService` in `currencyRateController` ([#6863](https://github.com/MetaMask/core/pull/6863))
|
|
56
|
-
- **BREAKING:** Added supportedChainIds argument in `fetchTokenContractExchangeRates` util function ([#6863](https://github.com/MetaMask/core/pull/6863))
|
|
57
49
|
- Added `fetchExchangeRates` function to fetch exchange rates from price-api ([#6863](https://github.com/MetaMask/core/pull/6863))
|
|
58
50
|
- Added `ignoreAssets` to allow ignoring assets for non-EVM chains ([#6981](https://github.com/MetaMask/core/pull/6981))
|
|
59
51
|
|
|
@@ -10,9 +10,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _TokenRatesController_instances, _TokenRatesController_handle, _TokenRatesController_pollState, _TokenRatesController_tokenPricesService, _TokenRatesController_inProcessExchangeRateUpdates, _TokenRatesController_disabled, _TokenRatesController_interval, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_stopPoll, _TokenRatesController_poll,
|
|
13
|
+
var _TokenRatesController_instances, _TokenRatesController_handle, _TokenRatesController_pollState, _TokenRatesController_tokenPricesService, _TokenRatesController_inProcessExchangeRateUpdates, _TokenRatesController_disabled, _TokenRatesController_interval, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_stopPoll, _TokenRatesController_poll, _TokenRatesController_fetchAndMapExchangeRates, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.controllerName =
|
|
15
|
+
exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.controllerName = void 0;
|
|
16
16
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
17
17
|
const polling_controller_1 = require("@metamask/polling-controller");
|
|
18
18
|
const utils_1 = require("@metamask/utils");
|
|
@@ -21,7 +21,6 @@ const assetsUtil_1 = require("./assetsUtil.cjs");
|
|
|
21
21
|
const crypto_compare_service_1 = require("./crypto-compare-service/index.cjs");
|
|
22
22
|
const codefi_v2_1 = require("./token-prices-service/codefi-v2.cjs");
|
|
23
23
|
const DEFAULT_INTERVAL = 180000;
|
|
24
|
-
exports.DEFAULT_CACHE_REFRESH_THRESHOLD = 1000 * 60 * 60 * 24; // 24 hours
|
|
25
24
|
var PollState;
|
|
26
25
|
(function (PollState) {
|
|
27
26
|
PollState["Active"] = "Active";
|
|
@@ -63,12 +62,6 @@ const tokenRatesControllerMetadata = {
|
|
|
63
62
|
includeInDebugSnapshot: false,
|
|
64
63
|
usedInUi: true,
|
|
65
64
|
},
|
|
66
|
-
supportedChainIds: {
|
|
67
|
-
includeInStateLogs: false,
|
|
68
|
-
persist: true,
|
|
69
|
-
includeInDebugSnapshot: false,
|
|
70
|
-
usedInUi: true,
|
|
71
|
-
},
|
|
72
65
|
};
|
|
73
66
|
/**
|
|
74
67
|
* Get the default {@link TokenRatesController} state.
|
|
@@ -78,10 +71,6 @@ const tokenRatesControllerMetadata = {
|
|
|
78
71
|
const getDefaultTokenRatesControllerState = () => {
|
|
79
72
|
return {
|
|
80
73
|
marketData: {},
|
|
81
|
-
supportedChainIds: {
|
|
82
|
-
timestamp: 0,
|
|
83
|
-
data: [],
|
|
84
|
-
},
|
|
85
74
|
};
|
|
86
75
|
};
|
|
87
76
|
exports.getDefaultTokenRatesControllerState = getDefaultTokenRatesControllerState;
|
|
@@ -358,20 +347,6 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
358
347
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
359
348
|
__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_poll).call(this, chainId, nativeCurrency);
|
|
360
349
|
}, __classPrivateFieldGet(this, _TokenRatesController_interval, "f")), "f");
|
|
361
|
-
}, _TokenRatesController_isPriceApiSupportedChainIdsCacheValid = function _TokenRatesController_isPriceApiSupportedChainIdsCacheValid() {
|
|
362
|
-
const { supportedChainIds } = this.state;
|
|
363
|
-
const { timestamp } = supportedChainIds;
|
|
364
|
-
const now = Date.now();
|
|
365
|
-
return (timestamp !== undefined &&
|
|
366
|
-
now - timestamp < exports.DEFAULT_CACHE_REFRESH_THRESHOLD);
|
|
367
|
-
}, _TokenRatesController_updateSupportedChainIdsCache = async function _TokenRatesController_updateSupportedChainIdsCache() {
|
|
368
|
-
const supportedChainIds = await __classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").fetchSupportedChainIds();
|
|
369
|
-
this.update((state) => {
|
|
370
|
-
state.supportedChainIds = {
|
|
371
|
-
timestamp: Date.now(),
|
|
372
|
-
data: supportedChainIds,
|
|
373
|
-
};
|
|
374
|
-
});
|
|
375
350
|
}, _TokenRatesController_fetchAndMapExchangeRates =
|
|
376
351
|
/**
|
|
377
352
|
* Uses the token prices service to retrieve exchange rates for tokens in a
|
|
@@ -394,11 +369,7 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
394
369
|
* chain ID.
|
|
395
370
|
*/
|
|
396
371
|
async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
397
|
-
if (!__classPrivateFieldGet(this,
|
|
398
|
-
await __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_updateSupportedChainIdsCache).call(this);
|
|
399
|
-
}
|
|
400
|
-
const supportedChainIds = this.state.supportedChainIds.data;
|
|
401
|
-
if (!supportedChainIds.includes(chainId)) {
|
|
372
|
+
if (!__classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").validateChainIdSupported(chainId)) {
|
|
402
373
|
return tokenAddresses.reduce((obj, tokenAddress) => {
|
|
403
374
|
obj = {
|
|
404
375
|
...obj,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.cjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerGetAccountAction,\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerSelectedEvmAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport { createDeferredPromise, type Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport { fetchExchangeRate as fetchNativeCurrencyExchangeRate } from './crypto-compare-service';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport const DEFAULT_CACHE_REFRESH_THRESHOLD = 1000 * 60 * 60 * 24; // 24 hours\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\nenum PollState {\n Active = 'Active',\n Inactive = 'Inactive',\n}\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedAccountAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * TokenRatesState\n *\n * Token rates controller state\n * marketData - Market data for tokens, keyed by chain ID and then token contract address.\n * supportedChainIds - Supported chain ids.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n supportedChainIds: {\n timestamp: number;\n data: Hex[];\n };\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\n/**\n * Uses the CryptoCompare API to fetch the exchange rate between one currency\n * and another, i.e., the multiplier to apply the amount of one currency in\n * order to convert it to another.\n *\n * @param args - The arguments to this function.\n * @param args.from - The currency to convert from.\n * @param args.to - The currency to convert to.\n * @returns The exchange rate between `fromCurrency` to `toCurrency` if one\n * exists, or null if one does not.\n */\nasync function getCurrencyConversionRate({\n from,\n to,\n}: {\n from: string;\n to: string;\n}) {\n const includeUSDRate = false;\n try {\n const result = await fetchNativeCurrencyExchangeRate(\n to,\n from,\n includeUSDRate,\n );\n return result.conversionRate;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('market does not exist for this coin pair')\n ) {\n return null;\n }\n throw error;\n }\n}\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n supportedChainIds: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n supportedChainIds: {\n timestamp: 0,\n data: [],\n },\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n #handle?: ReturnType<typeof setTimeout>;\n\n #pollState = PollState.Inactive;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #disabled: boolean;\n\n #interval: number;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n this.#interval = interval;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\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 async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\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 async ({ networkConfigurationsByChainId }, patches) => {\n const chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[] = Object.values(networkConfigurationsByChainId).map(\n ({ chainId, nativeCurrency }) => {\n return {\n chainId: chainId as Hex,\n nativeCurrency,\n };\n },\n );\n\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [...new Set([...tokenAddresses, ...detectedTokenAddresses])].sort();\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 * Start (or restart) polling.\n *\n * @param chainId - The chain ID.\n * @param nativeCurrency - The native currency.\n */\n async start(chainId: Hex, nativeCurrency: string) {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll(chainId, nativeCurrency);\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Clear the active polling timer, if present.\n */\n #stopPoll() {\n if (this.#handle) {\n clearTimeout(this.#handle);\n }\n }\n\n /**\n * Poll for exchange rate updates.\n *\n * @param chainId - The chain ID.\n * @param nativeCurrency - The native currency.\n */\n async #poll(chainId: Hex, nativeCurrency: string) {\n await safelyExecute(() =>\n this.updateExchangeRates([{ chainId, nativeCurrency }]),\n );\n\n // Poll using recursive `setTimeout` instead of `setInterval` so that\n // requests don't stack if they take longer than the polling interval\n this.#handle = setTimeout(() => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#poll(chainId, nativeCurrency);\n }, this.#interval);\n }\n\n /**\n * Checks if the price api supported chain ids cache is valid.\n *\n * @returns True if the cache is valid, false otherwise.\n */\n #isPriceApiSupportedChainIdsCacheValid(): boolean {\n const { supportedChainIds }: TokenRatesControllerState = this.state;\n const { timestamp } = supportedChainIds;\n const now = Date.now();\n return (\n timestamp !== undefined &&\n now - timestamp < DEFAULT_CACHE_REFRESH_THRESHOLD\n );\n }\n\n async #updateSupportedChainIdsCache(): Promise<void> {\n const supportedChainIds =\n await this.#tokenPricesService.fetchSupportedChainIds();\n\n this.update((state) => {\n state.supportedChainIds = {\n timestamp: Date.now(),\n data: supportedChainIds,\n };\n });\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[],\n ) {\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIds - The chain IDs.\n * @returns A promise that resolves when all chain updates complete.\n */\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRatesByChainId(\n chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[],\n ): Promise<void> {\n if (this.#disabled) {\n return;\n }\n // Create a promise for each chainId to fetch exchange rates.\n const updatePromises = chainIdAndNativeCurrency.map(\n async ({ chainId, nativeCurrency }) => {\n const tokenAddresses = this.#getTokenAddresses(chainId);\n\n // Build a unique key based on chainId, nativeCurrency, and the number of token addresses.\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}:${tokenAddresses.length}`;\n\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // Await any ongoing update to avoid redundant work.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return null;\n }\n\n // Create a deferred promise to track this update.\n const {\n promise: inProgressUpdate,\n resolve: updateSucceeded,\n reject: updateFailed,\n } = createDeferredPromise({ suppressUnhandledRejection: true });\n this.#inProcessExchangeRateUpdates[updateKey] = inProgressUpdate;\n\n try {\n const contractInformations = await this.#fetchAndMapExchangeRates({\n tokenAddresses,\n chainId,\n nativeCurrency,\n });\n\n // Each promise returns an object with the market data for the chain.\n const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n updateSucceeded();\n return marketData;\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n // Cleanup the tracking for this update.\n delete this.#inProcessExchangeRateUpdates[updateKey];\n }\n },\n );\n\n // Wait for all update promises to settle.\n const results = await Promise.allSettled(updatePromises);\n\n // Merge all successful market data updates into one object.\n const combinedMarketData = results.reduce((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc = { ...acc, ...result.value };\n }\n return acc;\n }, {});\n\n // Call this.update only once with the combined market data to reduce the number of state changes and re-renders\n if (Object.keys(combinedMarketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...combinedMarketData,\n };\n });\n }\n }\n\n /**\n * Uses the token prices service to retrieve exchange rates for tokens in a\n * particular currency.\n *\n * If the price API does not support the given chain ID, returns an empty\n * object.\n *\n * If the price API does not support the given currency, retrieves exchange\n * rates in a known currency instead, then converts those rates using the\n * exchange rate between the known currency and desired currency.\n *\n * @param args - The arguments to this function.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.chainId - The EIP-155 ID of the chain where the tokens live.\n * @param args.nativeCurrency - The native currency in which to request\n * exchange rates.\n * @returns A map from token address to its exchange rate in the native\n * currency, or an empty map if no exchange rates can be obtained for the\n * chain ID.\n */\n async #fetchAndMapExchangeRates({\n tokenAddresses,\n chainId,\n nativeCurrency,\n }: {\n tokenAddresses: Hex[];\n chainId: Hex;\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n if (!this.#isPriceApiSupportedChainIdsCacheValid()) {\n await this.#updateSupportedChainIdsCache();\n }\n const supportedChainIds = this.state.supportedChainIds.data;\n\n if (!supportedChainIds.includes(chainId)) {\n return tokenAddresses.reduce((obj, tokenAddress) => {\n obj = {\n ...obj,\n [tokenAddress]: undefined,\n };\n\n return obj;\n }, {});\n }\n\n if (this.#tokenPricesService.validateCurrencySupported(nativeCurrency)) {\n return await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency,\n });\n }\n\n return await this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency({\n chainId,\n tokenAddresses,\n nativeCurrency,\n });\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n }\n\n /**\n * Retrieves prices in the given currency for the given tokens on the given\n * chain. Ensures that token addresses are checksum addresses.\n *\n * @param args - The arguments to this function.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.chainId - The EIP-155 ID of the chain where the tokens live.\n * @param args.nativeCurrency - The native currency in which to request\n * prices.\n * @returns A map of the token addresses (as checksums) to their prices in the\n * native currency.\n */\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency,\n }: {\n tokenAddresses: Hex[];\n chainId: Hex;\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n let contractNativeInformations;\n const tokenPricesByTokenAddress = await reduceInBatchesSerially<\n Hex,\n Awaited<ReturnType<AbstractTokenPricesService['fetchTokenPrices']>>\n >({\n values: [...tokenAddresses].sort(),\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (allTokenPricesByTokenAddress, batch) => {\n const tokenPricesByTokenAddressForBatch =\n await this.#tokenPricesService.fetchTokenPrices({\n tokenAddresses: batch,\n chainId,\n currency: nativeCurrency,\n });\n\n return {\n ...allTokenPricesByTokenAddress,\n ...tokenPricesByTokenAddressForBatch,\n };\n },\n initialResult: {},\n });\n contractNativeInformations = tokenPricesByTokenAddress;\n\n // fetch for native token\n if (tokenAddresses.length === 0) {\n const contractNativeInformationsNative =\n await this.#tokenPricesService.fetchTokenPrices({\n tokenAddresses: [],\n chainId,\n currency: nativeCurrency,\n });\n\n contractNativeInformations = {\n [getNativeTokenAddress(chainId)]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[getNativeTokenAddress(chainId)],\n },\n };\n }\n return Object.entries(contractNativeInformations).reduce(\n (obj, [tokenAddress, token]) => {\n obj = {\n ...obj,\n [tokenAddress]: { ...token },\n };\n\n return obj;\n },\n {},\n );\n }\n\n /**\n * If the price API does not support a given native currency, then we need to\n * convert it to a fallback currency and feed that currency into the price\n * API, then convert the prices to our desired native currency.\n *\n * @param args - The arguments to this function.\n * @param args.chainId - The chain id to fetch prices for.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.nativeCurrency - The native currency in which to request\n * prices.\n * @returns A map of the token addresses (as checksums) to their prices in the\n * native currency.\n */\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency({\n chainId,\n tokenAddresses,\n nativeCurrency,\n }: {\n chainId: Hex;\n tokenAddresses: Hex[];\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n const [\n contractExchangeInformations,\n fallbackCurrencyToNativeCurrencyConversionRate,\n ] = await Promise.all([\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency: FALL_BACK_VS_CURRENCY,\n }),\n getCurrencyConversionRate({\n from: FALL_BACK_VS_CURRENCY,\n to: nativeCurrency,\n }),\n ]);\n\n if (fallbackCurrencyToNativeCurrencyConversionRate === null) {\n return {};\n }\n\n // Converts the price in the fallback currency to the native currency\n const convertFallbackToNative = (value: number | undefined) =>\n value !== undefined && value !== null\n ? value * fallbackCurrencyToNativeCurrencyConversionRate\n : undefined;\n\n const updatedContractExchangeRates = Object.entries(\n contractExchangeInformations,\n ).reduce((acc, [tokenAddress, token]) => {\n acc = {\n ...acc,\n [tokenAddress]: {\n ...token,\n currency: nativeCurrency,\n price: convertFallbackToNative(token.price),\n marketCap: convertFallbackToNative(token.marketCap),\n allTimeHigh: convertFallbackToNative(token.allTimeHigh),\n allTimeLow: convertFallbackToNative(token.allTimeLow),\n totalVolume: convertFallbackToNative(token.totalVolume),\n high1d: convertFallbackToNative(token.high1d),\n low1d: convertFallbackToNative(token.low1d),\n dilutedMarketCap: convertFallbackToNative(token.dilutedMarketCap),\n },\n };\n return acc;\n }, {});\n\n return updatedContractExchangeRates;\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
|
1
|
+
{"version":3,"file":"TokenRatesController.cjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerGetAccountAction,\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerSelectedEvmAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport { createDeferredPromise, type Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport { fetchExchangeRate as fetchNativeCurrencyExchangeRate } from './crypto-compare-service';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\nenum PollState {\n Active = 'Active',\n Inactive = 'Inactive',\n}\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedAccountAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * @type TokenRatesState\n *\n * Token rates controller state\n * @property marketData - Market data for tokens, keyed by chain ID and then token contract address.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\n/**\n * Uses the CryptoCompare API to fetch the exchange rate between one currency\n * and another, i.e., the multiplier to apply the amount of one currency in\n * order to convert it to another.\n *\n * @param args - The arguments to this function.\n * @param args.from - The currency to convert from.\n * @param args.to - The currency to convert to.\n * @returns The exchange rate between `fromCurrency` to `toCurrency` if one\n * exists, or null if one does not.\n */\nasync function getCurrencyConversionRate({\n from,\n to,\n}: {\n from: string;\n to: string;\n}) {\n const includeUSDRate = false;\n try {\n const result = await fetchNativeCurrencyExchangeRate(\n to,\n from,\n includeUSDRate,\n );\n return result.conversionRate;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('market does not exist for this coin pair')\n ) {\n return null;\n }\n throw error;\n }\n}\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n #handle?: ReturnType<typeof setTimeout>;\n\n #pollState = PollState.Inactive;\n\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #disabled: boolean;\n\n #interval: number;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n this.#interval = interval;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\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 async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\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 async ({ networkConfigurationsByChainId }, patches) => {\n const chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[] = Object.values(networkConfigurationsByChainId).map(\n ({ chainId, nativeCurrency }) => {\n return {\n chainId: chainId as Hex,\n nativeCurrency,\n };\n },\n );\n\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [...new Set([...tokenAddresses, ...detectedTokenAddresses])].sort();\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 * Start (or restart) polling.\n *\n * @param chainId - The chain ID.\n * @param nativeCurrency - The native currency.\n */\n async start(chainId: Hex, nativeCurrency: string) {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll(chainId, nativeCurrency);\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Clear the active polling timer, if present.\n */\n #stopPoll() {\n if (this.#handle) {\n clearTimeout(this.#handle);\n }\n }\n\n /**\n * Poll for exchange rate updates.\n *\n * @param chainId - The chain ID.\n * @param nativeCurrency - The native currency.\n */\n async #poll(chainId: Hex, nativeCurrency: string) {\n await safelyExecute(() =>\n this.updateExchangeRates([{ chainId, nativeCurrency }]),\n );\n\n // Poll using recursive `setTimeout` instead of `setInterval` so that\n // requests don't stack if they take longer than the polling interval\n this.#handle = setTimeout(() => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#poll(chainId, nativeCurrency);\n }, this.#interval);\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[],\n ) {\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIds - The chain IDs.\n * @returns A promise that resolves when all chain updates complete.\n */\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRatesByChainId(\n chainIdAndNativeCurrency: {\n chainId: Hex;\n nativeCurrency: string;\n }[],\n ): Promise<void> {\n if (this.#disabled) {\n return;\n }\n\n // Create a promise for each chainId to fetch exchange rates.\n const updatePromises = chainIdAndNativeCurrency.map(\n async ({ chainId, nativeCurrency }) => {\n const tokenAddresses = this.#getTokenAddresses(chainId);\n // Build a unique key based on chainId, nativeCurrency, and the number of token addresses.\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}:${tokenAddresses.length}`;\n\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // Await any ongoing update to avoid redundant work.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return null;\n }\n\n // Create a deferred promise to track this update.\n const {\n promise: inProgressUpdate,\n resolve: updateSucceeded,\n reject: updateFailed,\n } = createDeferredPromise({ suppressUnhandledRejection: true });\n this.#inProcessExchangeRateUpdates[updateKey] = inProgressUpdate;\n\n try {\n const contractInformations = await this.#fetchAndMapExchangeRates({\n tokenAddresses,\n chainId,\n nativeCurrency,\n });\n\n // Each promise returns an object with the market data for the chain.\n const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n updateSucceeded();\n return marketData;\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n // Cleanup the tracking for this update.\n delete this.#inProcessExchangeRateUpdates[updateKey];\n }\n },\n );\n\n // Wait for all update promises to settle.\n const results = await Promise.allSettled(updatePromises);\n\n // Merge all successful market data updates into one object.\n const combinedMarketData = results.reduce((acc, result) => {\n if (result.status === 'fulfilled' && result.value) {\n acc = { ...acc, ...result.value };\n }\n return acc;\n }, {});\n\n // Call this.update only once with the combined market data to reduce the number of state changes and re-renders\n if (Object.keys(combinedMarketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...combinedMarketData,\n };\n });\n }\n }\n\n /**\n * Uses the token prices service to retrieve exchange rates for tokens in a\n * particular currency.\n *\n * If the price API does not support the given chain ID, returns an empty\n * object.\n *\n * If the price API does not support the given currency, retrieves exchange\n * rates in a known currency instead, then converts those rates using the\n * exchange rate between the known currency and desired currency.\n *\n * @param args - The arguments to this function.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.chainId - The EIP-155 ID of the chain where the tokens live.\n * @param args.nativeCurrency - The native currency in which to request\n * exchange rates.\n * @returns A map from token address to its exchange rate in the native\n * currency, or an empty map if no exchange rates can be obtained for the\n * chain ID.\n */\n async #fetchAndMapExchangeRates({\n tokenAddresses,\n chainId,\n nativeCurrency,\n }: {\n tokenAddresses: Hex[];\n chainId: Hex;\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n if (!this.#tokenPricesService.validateChainIdSupported(chainId)) {\n return tokenAddresses.reduce((obj, tokenAddress) => {\n obj = {\n ...obj,\n [tokenAddress]: undefined,\n };\n\n return obj;\n }, {});\n }\n\n if (this.#tokenPricesService.validateCurrencySupported(nativeCurrency)) {\n return await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency,\n });\n }\n\n return await this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency({\n chainId,\n tokenAddresses,\n nativeCurrency,\n });\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);\n }\n\n /**\n * Retrieves prices in the given currency for the given tokens on the given\n * chain. Ensures that token addresses are checksum addresses.\n *\n * @param args - The arguments to this function.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.chainId - The EIP-155 ID of the chain where the tokens live.\n * @param args.nativeCurrency - The native currency in which to request\n * prices.\n * @returns A map of the token addresses (as checksums) to their prices in the\n * native currency.\n */\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency,\n }: {\n tokenAddresses: Hex[];\n chainId: Hex;\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n let contractNativeInformations;\n const tokenPricesByTokenAddress = await reduceInBatchesSerially<\n Hex,\n Awaited<ReturnType<AbstractTokenPricesService['fetchTokenPrices']>>\n >({\n values: [...tokenAddresses].sort(),\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (allTokenPricesByTokenAddress, batch) => {\n const tokenPricesByTokenAddressForBatch =\n await this.#tokenPricesService.fetchTokenPrices({\n tokenAddresses: batch,\n chainId,\n currency: nativeCurrency,\n });\n\n return {\n ...allTokenPricesByTokenAddress,\n ...tokenPricesByTokenAddressForBatch,\n };\n },\n initialResult: {},\n });\n contractNativeInformations = tokenPricesByTokenAddress;\n\n // fetch for native token\n if (tokenAddresses.length === 0) {\n const contractNativeInformationsNative =\n await this.#tokenPricesService.fetchTokenPrices({\n tokenAddresses: [],\n chainId,\n currency: nativeCurrency,\n });\n\n contractNativeInformations = {\n [getNativeTokenAddress(chainId)]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[getNativeTokenAddress(chainId)],\n },\n };\n }\n return Object.entries(contractNativeInformations).reduce(\n (obj, [tokenAddress, token]) => {\n obj = {\n ...obj,\n [tokenAddress]: { ...token },\n };\n\n return obj;\n },\n {},\n );\n }\n\n /**\n * If the price API does not support a given native currency, then we need to\n * convert it to a fallback currency and feed that currency into the price\n * API, then convert the prices to our desired native currency.\n *\n * @param args - The arguments to this function.\n * @param args.chainId - The chain id to fetch prices for.\n * @param args.tokenAddresses - Addresses for tokens.\n * @param args.nativeCurrency - The native currency in which to request\n * prices.\n * @returns A map of the token addresses (as checksums) to their prices in the\n * native currency.\n */\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency({\n chainId,\n tokenAddresses,\n nativeCurrency,\n }: {\n chainId: Hex;\n tokenAddresses: Hex[];\n nativeCurrency: string;\n }): Promise<ContractMarketData> {\n const [\n contractExchangeInformations,\n fallbackCurrencyToNativeCurrencyConversionRate,\n ] = await Promise.all([\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency({\n tokenAddresses,\n chainId,\n nativeCurrency: FALL_BACK_VS_CURRENCY,\n }),\n getCurrencyConversionRate({\n from: FALL_BACK_VS_CURRENCY,\n to: nativeCurrency,\n }),\n ]);\n\n if (fallbackCurrencyToNativeCurrencyConversionRate === null) {\n return {};\n }\n\n // Converts the price in the fallback currency to the native currency\n const convertFallbackToNative = (value: number | undefined) =>\n value !== undefined && value !== null\n ? value * fallbackCurrencyToNativeCurrencyConversionRate\n : undefined;\n\n const updatedContractExchangeRates = Object.entries(\n contractExchangeInformations,\n ).reduce((acc, [tokenAddress, token]) => {\n acc = {\n ...acc,\n [tokenAddress]: {\n ...token,\n currency: nativeCurrency,\n price: convertFallbackToNative(token.price),\n marketCap: convertFallbackToNative(token.marketCap),\n allTimeHigh: convertFallbackToNative(token.allTimeHigh),\n allTimeLow: convertFallbackToNative(token.allTimeLow),\n totalVolume: convertFallbackToNative(token.totalVolume),\n high1d: convertFallbackToNative(token.high1d),\n low1d: convertFallbackToNative(token.low1d),\n dilutedMarketCap: convertFallbackToNative(token.dilutedMarketCap),\n },\n };\n return acc;\n }, {});\n\n return updatedContractExchangeRates;\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
|
@@ -28,7 +28,6 @@ export type Token = {
|
|
|
28
28
|
isERC721?: boolean;
|
|
29
29
|
name?: string;
|
|
30
30
|
};
|
|
31
|
-
export declare const DEFAULT_CACHE_REFRESH_THRESHOLD: number;
|
|
32
31
|
export type ContractExchangeRates = {
|
|
33
32
|
[address: string]: number | undefined;
|
|
34
33
|
};
|
|
@@ -71,18 +70,13 @@ export type AllowedEvents = TokensControllerStateChangeEvent | NetworkController
|
|
|
71
70
|
*/
|
|
72
71
|
export declare const controllerName = "TokenRatesController";
|
|
73
72
|
/**
|
|
74
|
-
* TokenRatesState
|
|
73
|
+
* @type TokenRatesState
|
|
75
74
|
*
|
|
76
75
|
* Token rates controller state
|
|
77
|
-
* marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
78
|
-
* supportedChainIds - Supported chain ids.
|
|
76
|
+
* @property marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
79
77
|
*/
|
|
80
78
|
export type TokenRatesControllerState = {
|
|
81
79
|
marketData: Record<Hex, Record<Hex, MarketDataDetails>>;
|
|
82
|
-
supportedChainIds: {
|
|
83
|
-
timestamp: number;
|
|
84
|
-
data: Hex[];
|
|
85
|
-
};
|
|
86
80
|
};
|
|
87
81
|
/**
|
|
88
82
|
* The action that can be performed to get the state of the {@link TokenRatesController}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kCAAkC,EAClC,0CAA0C,EAC1C,+CAA+C,EAChD,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AAMnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,2CAA2C,EAC3C,+BAA+B,EAC/B,iCAAiC,EAClC,qCAAqC;AAEtC,OAAO,EAAyB,KAAK,GAAG,EAAE,wBAAwB;AAKlE,OAAO,KAAK,EAAE,0BAA0B,EAAE,iEAA6D;AAEvG,OAAO,KAAK,EACV,8BAA8B,EAC9B,gCAAgC,EAEjC,+BAA2B;AAE5B;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAIF,
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,6 @@ export type Token = {
|
|
|
28
28
|
isERC721?: boolean;
|
|
29
29
|
name?: string;
|
|
30
30
|
};
|
|
31
|
-
export declare const DEFAULT_CACHE_REFRESH_THRESHOLD: number;
|
|
32
31
|
export type ContractExchangeRates = {
|
|
33
32
|
[address: string]: number | undefined;
|
|
34
33
|
};
|
|
@@ -71,18 +70,13 @@ export type AllowedEvents = TokensControllerStateChangeEvent | NetworkController
|
|
|
71
70
|
*/
|
|
72
71
|
export declare const controllerName = "TokenRatesController";
|
|
73
72
|
/**
|
|
74
|
-
* TokenRatesState
|
|
73
|
+
* @type TokenRatesState
|
|
75
74
|
*
|
|
76
75
|
* Token rates controller state
|
|
77
|
-
* marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
78
|
-
* supportedChainIds - Supported chain ids.
|
|
76
|
+
* @property marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
79
77
|
*/
|
|
80
78
|
export type TokenRatesControllerState = {
|
|
81
79
|
marketData: Record<Hex, Record<Hex, MarketDataDetails>>;
|
|
82
|
-
supportedChainIds: {
|
|
83
|
-
timestamp: number;
|
|
84
|
-
data: Hex[];
|
|
85
|
-
};
|
|
86
80
|
};
|
|
87
81
|
/**
|
|
88
82
|
* The action that can be performed to get the state of the {@link TokenRatesController}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kCAAkC,EAClC,0CAA0C,EAC1C,+CAA+C,EAChD,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AAMnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,2CAA2C,EAC3C,+BAA+B,EAC/B,iCAAiC,EAClC,qCAAqC;AAEtC,OAAO,EAAyB,KAAK,GAAG,EAAE,wBAAwB;AAKlE,OAAO,KAAK,EAAE,0BAA0B,EAAE,iEAA6D;AAEvG,OAAO,KAAK,EACV,8BAA8B,EAC9B,gCAAgC,EAEjC,+BAA2B;AAE5B;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAIF,
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TokenRatesController_instances, _TokenRatesController_handle, _TokenRatesController_pollState, _TokenRatesController_tokenPricesService, _TokenRatesController_inProcessExchangeRateUpdates, _TokenRatesController_disabled, _TokenRatesController_interval, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_stopPoll, _TokenRatesController_poll,
|
|
12
|
+
var _TokenRatesController_instances, _TokenRatesController_handle, _TokenRatesController_pollState, _TokenRatesController_tokenPricesService, _TokenRatesController_inProcessExchangeRateUpdates, _TokenRatesController_disabled, _TokenRatesController_interval, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_stopPoll, _TokenRatesController_poll, _TokenRatesController_fetchAndMapExchangeRates, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
13
13
|
import { safelyExecute, toChecksumHexAddress, FALL_BACK_VS_CURRENCY } from "@metamask/controller-utils";
|
|
14
14
|
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
15
15
|
import { createDeferredPromise } from "@metamask/utils";
|
|
@@ -19,7 +19,6 @@ import { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from "./assetsUtil.m
|
|
|
19
19
|
import { fetchExchangeRate as fetchNativeCurrencyExchangeRate } from "./crypto-compare-service/index.mjs";
|
|
20
20
|
import { getNativeTokenAddress } from "./token-prices-service/codefi-v2.mjs";
|
|
21
21
|
const DEFAULT_INTERVAL = 180000;
|
|
22
|
-
export const DEFAULT_CACHE_REFRESH_THRESHOLD = 1000 * 60 * 60 * 24; // 24 hours
|
|
23
22
|
var PollState;
|
|
24
23
|
(function (PollState) {
|
|
25
24
|
PollState["Active"] = "Active";
|
|
@@ -61,12 +60,6 @@ const tokenRatesControllerMetadata = {
|
|
|
61
60
|
includeInDebugSnapshot: false,
|
|
62
61
|
usedInUi: true,
|
|
63
62
|
},
|
|
64
|
-
supportedChainIds: {
|
|
65
|
-
includeInStateLogs: false,
|
|
66
|
-
persist: true,
|
|
67
|
-
includeInDebugSnapshot: false,
|
|
68
|
-
usedInUi: true,
|
|
69
|
-
},
|
|
70
63
|
};
|
|
71
64
|
/**
|
|
72
65
|
* Get the default {@link TokenRatesController} state.
|
|
@@ -76,10 +69,6 @@ const tokenRatesControllerMetadata = {
|
|
|
76
69
|
export const getDefaultTokenRatesControllerState = () => {
|
|
77
70
|
return {
|
|
78
71
|
marketData: {},
|
|
79
|
-
supportedChainIds: {
|
|
80
|
-
timestamp: 0,
|
|
81
|
-
data: [],
|
|
82
|
-
},
|
|
83
72
|
};
|
|
84
73
|
};
|
|
85
74
|
/**
|
|
@@ -354,20 +343,6 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
354
343
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
355
344
|
__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_poll).call(this, chainId, nativeCurrency);
|
|
356
345
|
}, __classPrivateFieldGet(this, _TokenRatesController_interval, "f")), "f");
|
|
357
|
-
}, _TokenRatesController_isPriceApiSupportedChainIdsCacheValid = function _TokenRatesController_isPriceApiSupportedChainIdsCacheValid() {
|
|
358
|
-
const { supportedChainIds } = this.state;
|
|
359
|
-
const { timestamp } = supportedChainIds;
|
|
360
|
-
const now = Date.now();
|
|
361
|
-
return (timestamp !== undefined &&
|
|
362
|
-
now - timestamp < DEFAULT_CACHE_REFRESH_THRESHOLD);
|
|
363
|
-
}, _TokenRatesController_updateSupportedChainIdsCache = async function _TokenRatesController_updateSupportedChainIdsCache() {
|
|
364
|
-
const supportedChainIds = await __classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").fetchSupportedChainIds();
|
|
365
|
-
this.update((state) => {
|
|
366
|
-
state.supportedChainIds = {
|
|
367
|
-
timestamp: Date.now(),
|
|
368
|
-
data: supportedChainIds,
|
|
369
|
-
};
|
|
370
|
-
});
|
|
371
346
|
}, _TokenRatesController_fetchAndMapExchangeRates =
|
|
372
347
|
/**
|
|
373
348
|
* Uses the token prices service to retrieve exchange rates for tokens in a
|
|
@@ -390,11 +365,7 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
390
365
|
* chain ID.
|
|
391
366
|
*/
|
|
392
367
|
async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
393
|
-
if (!__classPrivateFieldGet(this,
|
|
394
|
-
await __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_updateSupportedChainIdsCache).call(this);
|
|
395
|
-
}
|
|
396
|
-
const supportedChainIds = this.state.supportedChainIds.data;
|
|
397
|
-
if (!supportedChainIds.includes(chainId)) {
|
|
368
|
+
if (!__classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").validateChainIdSupported(chainId)) {
|
|
398
369
|
return tokenAddresses.reduce((obj, tokenAddress) => {
|
|
399
370
|
obj = {
|
|
400
371
|
...obj,
|