@metamask-previews/assets-controllers 85.0.0-preview-bd9da90 → 85.0.0-preview-1ae9d4fd
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 +6 -0
- package/dist/TokenRatesController.cjs +36 -3
- package/dist/TokenRatesController.cjs.map +1 -1
- package/dist/TokenRatesController.d.cts +8 -2
- package/dist/TokenRatesController.d.cts.map +1 -1
- package/dist/TokenRatesController.d.mts +8 -2
- package/dist/TokenRatesController.d.mts.map +1 -1
- package/dist/TokenRatesController.mjs +35 -2
- package/dist/TokenRatesController.mjs.map +1 -1
- package/dist/assetsUtil.cjs +3 -2
- package/dist/assetsUtil.cjs.map +1 -1
- package/dist/assetsUtil.d.cts +4 -1
- package/dist/assetsUtil.d.cts.map +1 -1
- package/dist/assetsUtil.d.mts +4 -1
- package/dist/assetsUtil.d.mts.map +1 -1
- package/dist/assetsUtil.mjs +3 -2
- package/dist/assetsUtil.mjs.map +1 -1
- package/dist/index.cjs +1 -2
- 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 +6 -8
- 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 +6 -8
- 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 +10 -88
- package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.cts +4 -18
- package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.mts +4 -18
- package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
- package/dist/token-prices-service/codefi-v2.mjs +10 -88
- package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
- package/dist/token-prices-service/index.cjs +1 -2
- 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 +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ 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
|
+
- Removed `validateChainIdSupported` from `codefi-v2.ts` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
14
|
+
- Added `fetchSupportedChainIds` in `codefi-v2.ts` ([#7005](https://github.com/MetaMask/core/pull/7005))
|
|
15
|
+
|
|
10
16
|
## [85.0.0]
|
|
11
17
|
|
|
12
18
|
### Added
|
|
@@ -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, _TokenRatesController_fetchAndMapExchangeRates, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
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_isPriceApiSupportedChainIdsCacheValid, _TokenRatesController_updateSupportedChainIdsCache, _TokenRatesController_fetchAndMapExchangeRates, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.controllerName = void 0;
|
|
15
|
+
exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.controllerName = exports.DEFAULT_CACHE_REFRESH_THRESHOLD = 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,6 +21,7 @@ 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
|
|
24
25
|
var PollState;
|
|
25
26
|
(function (PollState) {
|
|
26
27
|
PollState["Active"] = "Active";
|
|
@@ -62,6 +63,12 @@ const tokenRatesControllerMetadata = {
|
|
|
62
63
|
includeInDebugSnapshot: false,
|
|
63
64
|
usedInUi: true,
|
|
64
65
|
},
|
|
66
|
+
supportedChainIds: {
|
|
67
|
+
includeInStateLogs: false,
|
|
68
|
+
persist: true,
|
|
69
|
+
includeInDebugSnapshot: false,
|
|
70
|
+
usedInUi: true,
|
|
71
|
+
},
|
|
65
72
|
};
|
|
66
73
|
/**
|
|
67
74
|
* Get the default {@link TokenRatesController} state.
|
|
@@ -71,6 +78,10 @@ const tokenRatesControllerMetadata = {
|
|
|
71
78
|
const getDefaultTokenRatesControllerState = () => {
|
|
72
79
|
return {
|
|
73
80
|
marketData: {},
|
|
81
|
+
supportedChainIds: {
|
|
82
|
+
timestamp: 0,
|
|
83
|
+
data: [],
|
|
84
|
+
},
|
|
74
85
|
};
|
|
75
86
|
};
|
|
76
87
|
exports.getDefaultTokenRatesControllerState = getDefaultTokenRatesControllerState;
|
|
@@ -168,6 +179,10 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
168
179
|
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
169
180
|
return;
|
|
170
181
|
}
|
|
182
|
+
console.log('isCache valid', __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_isPriceApiSupportedChainIdsCacheValid).call(this));
|
|
183
|
+
if (!__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_isPriceApiSupportedChainIdsCacheValid).call(this)) {
|
|
184
|
+
await __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_updateSupportedChainIdsCache).call(this);
|
|
185
|
+
}
|
|
171
186
|
// Create a promise for each chainId to fetch exchange rates.
|
|
172
187
|
const updatePromises = chainIdAndNativeCurrency.map(async ({ chainId, nativeCurrency }) => {
|
|
173
188
|
const tokenAddresses = __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_getTokenAddresses).call(this, chainId);
|
|
@@ -244,6 +259,7 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
244
259
|
});
|
|
245
260
|
return acc;
|
|
246
261
|
}, []);
|
|
262
|
+
console.log('call from _executePoll');
|
|
247
263
|
await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);
|
|
248
264
|
}
|
|
249
265
|
/**
|
|
@@ -287,6 +303,7 @@ _TokenRatesController_handle = new WeakMap(), _TokenRatesController_pollState =
|
|
|
287
303
|
});
|
|
288
304
|
return acc;
|
|
289
305
|
}, []);
|
|
306
|
+
console.log('call from subscribeToTokensStateChange');
|
|
290
307
|
await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);
|
|
291
308
|
}, ({ allTokens, allDetectedTokens }) => {
|
|
292
309
|
return { allTokens, allDetectedTokens };
|
|
@@ -347,6 +364,20 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
347
364
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
348
365
|
__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_poll).call(this, chainId, nativeCurrency);
|
|
349
366
|
}, __classPrivateFieldGet(this, _TokenRatesController_interval, "f")), "f");
|
|
367
|
+
}, _TokenRatesController_isPriceApiSupportedChainIdsCacheValid = function _TokenRatesController_isPriceApiSupportedChainIdsCacheValid() {
|
|
368
|
+
const { supportedChainIds } = this.state;
|
|
369
|
+
const { timestamp } = supportedChainIds;
|
|
370
|
+
const now = Date.now();
|
|
371
|
+
return (timestamp !== undefined &&
|
|
372
|
+
now - timestamp < exports.DEFAULT_CACHE_REFRESH_THRESHOLD);
|
|
373
|
+
}, _TokenRatesController_updateSupportedChainIdsCache = async function _TokenRatesController_updateSupportedChainIdsCache() {
|
|
374
|
+
const supportedChainIds = await __classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").fetchSupportedChainIds();
|
|
375
|
+
this.update((state) => {
|
|
376
|
+
state.supportedChainIds = {
|
|
377
|
+
timestamp: Date.now(),
|
|
378
|
+
data: supportedChainIds,
|
|
379
|
+
};
|
|
380
|
+
});
|
|
350
381
|
}, _TokenRatesController_fetchAndMapExchangeRates =
|
|
351
382
|
/**
|
|
352
383
|
* Uses the token prices service to retrieve exchange rates for tokens in a
|
|
@@ -369,7 +400,8 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
369
400
|
* chain ID.
|
|
370
401
|
*/
|
|
371
402
|
async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
372
|
-
|
|
403
|
+
const supportedChainIds = this.state.supportedChainIds.data;
|
|
404
|
+
if (!supportedChainIds.includes(chainId)) {
|
|
373
405
|
return tokenAddresses.reduce((obj, tokenAddress) => {
|
|
374
406
|
obj = {
|
|
375
407
|
...obj,
|
|
@@ -405,6 +437,7 @@ async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses,
|
|
|
405
437
|
*/
|
|
406
438
|
async function _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
407
439
|
let contractNativeInformations;
|
|
440
|
+
console.log('fetchAndMapExchangeRatesForSupportedNativeCurrency: starting');
|
|
408
441
|
const tokenPricesByTokenAddress = await (0, assetsUtil_1.reduceInBatchesSerially)({
|
|
409
442
|
values: [...tokenAddresses].sort(),
|
|
410
443
|
batchSize: assetsUtil_1.TOKEN_PRICES_BATCH_SIZE,
|
|
@@ -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 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"]}
|
|
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 console.log('call from subscribeToTokensStateChange');\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 console.log('isCache valid', this.#isPriceApiSupportedChainIdsCacheValid());\n\n if (!this.#isPriceApiSupportedChainIdsCacheValid()) {\n await this.#updateSupportedChainIdsCache();\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\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 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 console.log('call from _executePoll');\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 console.log('fetchAndMapExchangeRatesForSupportedNativeCurrency: starting');\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,6 +28,7 @@ export type Token = {
|
|
|
28
28
|
isERC721?: boolean;
|
|
29
29
|
name?: string;
|
|
30
30
|
};
|
|
31
|
+
export declare const DEFAULT_CACHE_REFRESH_THRESHOLD: number;
|
|
31
32
|
export type ContractExchangeRates = {
|
|
32
33
|
[address: string]: number | undefined;
|
|
33
34
|
};
|
|
@@ -70,13 +71,18 @@ export type AllowedEvents = TokensControllerStateChangeEvent | NetworkController
|
|
|
70
71
|
*/
|
|
71
72
|
export declare const controllerName = "TokenRatesController";
|
|
72
73
|
/**
|
|
73
|
-
*
|
|
74
|
+
* TokenRatesState
|
|
74
75
|
*
|
|
75
76
|
* Token rates controller state
|
|
76
|
-
*
|
|
77
|
+
* marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
78
|
+
* supportedChainIds - Supported chain ids.
|
|
77
79
|
*/
|
|
78
80
|
export type TokenRatesControllerState = {
|
|
79
81
|
marketData: Record<Hex, Record<Hex, MarketDataDetails>>;
|
|
82
|
+
supportedChainIds: {
|
|
83
|
+
timestamp: number;
|
|
84
|
+
data: Hex[];
|
|
85
|
+
};
|
|
80
86
|
};
|
|
81
87
|
/**
|
|
82
88
|
* 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,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AAOhE;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,8BAA8B,GAC9B,2CAA2C,GAC3C,+BAA+B,GAC/B,kCAAkC,GAClC,0CAA0C,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,gCAAgC,GAChC,iCAAiC,GACjC,+CAA+C,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD
|
|
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,eAAO,MAAM,+BAA+B,QAAsB,CAAC;AAEnE,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AAOhE;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,8BAA8B,GAC9B,2CAA2C,GAC3C,+BAA+B,GAC/B,kCAAkC,GAClC,0CAA0C,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,gCAAgC,GAChC,iCAAiC,GACjC,+CAA+C,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxD,iBAAiB,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,GAAG,EAAE,CAAC;KACb,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kCAAkC,GAAG,wBAAwB,CACvE,OAAO,cAAc,EACrB,yBAAyB,CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,kCAAkC,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG,0BAA0B,CAC3E,OAAO,cAAc,EACrB,yBAAyB,CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,oCAAoC,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,SAAS,CACnD,OAAO,cAAc,EACrB,2BAA2B,GAAG,cAAc,EAC5C,0BAA0B,GAAG,aAAa,CAC3C,CAAC;AAsDF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,QAC1C,yBAQH,CAAC;AAEJ,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,CAAC;;;;;;;;;;;;;;;;AAEF;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,0BACxC,OAAO,cAAc,EACrB,yBAAyB,EACzB,6BAA6B,CAC9B;;IAiBC;;;;;;;;;OASG;gBACS,EACV,QAA2B,EAC3B,QAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,KAAK,GACN,EAAE;QACD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,SAAS,EAAE,6BAA6B,CAAC;QACzC,KAAK,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IAyID;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM;IAMhD;;OAEG;IACH,IAAI;IA2EJ;;;;OAIG;IACG,mBAAmB,CACvB,wBAAwB,EAAE;QACxB,OAAO,EAAE,GAAG,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,EAAE;IAKL;;;;;OAKG;IACH;;;;OAIG;IACG,4BAA4B,CAChC,wBAAwB,EAAE;QACxB,OAAO,EAAE,GAAG,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,EAAE,GACF,OAAO,CAAC,IAAI,CAAC;IAyIhB;;;;;OAKG;IACG,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2KvE;;OAEG;IACH,UAAU;CAKX;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -28,6 +28,7 @@ export type Token = {
|
|
|
28
28
|
isERC721?: boolean;
|
|
29
29
|
name?: string;
|
|
30
30
|
};
|
|
31
|
+
export declare const DEFAULT_CACHE_REFRESH_THRESHOLD: number;
|
|
31
32
|
export type ContractExchangeRates = {
|
|
32
33
|
[address: string]: number | undefined;
|
|
33
34
|
};
|
|
@@ -70,13 +71,18 @@ export type AllowedEvents = TokensControllerStateChangeEvent | NetworkController
|
|
|
70
71
|
*/
|
|
71
72
|
export declare const controllerName = "TokenRatesController";
|
|
72
73
|
/**
|
|
73
|
-
*
|
|
74
|
+
* TokenRatesState
|
|
74
75
|
*
|
|
75
76
|
* Token rates controller state
|
|
76
|
-
*
|
|
77
|
+
* marketData - Market data for tokens, keyed by chain ID and then token contract address.
|
|
78
|
+
* supportedChainIds - Supported chain ids.
|
|
77
79
|
*/
|
|
78
80
|
export type TokenRatesControllerState = {
|
|
79
81
|
marketData: Record<Hex, Record<Hex, MarketDataDetails>>;
|
|
82
|
+
supportedChainIds: {
|
|
83
|
+
timestamp: number;
|
|
84
|
+
data: Hex[];
|
|
85
|
+
};
|
|
80
86
|
};
|
|
81
87
|
/**
|
|
82
88
|
* 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,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AAOhE;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,8BAA8B,GAC9B,2CAA2C,GAC3C,+BAA+B,GAC/B,kCAAkC,GAClC,0CAA0C,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,gCAAgC,GAChC,iCAAiC,GACjC,+CAA+C,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD
|
|
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, _TokenRatesController_fetchAndMapExchangeRates, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
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_isPriceApiSupportedChainIdsCacheValid, _TokenRatesController_updateSupportedChainIdsCache, _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,6 +19,7 @@ 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
|
|
22
23
|
var PollState;
|
|
23
24
|
(function (PollState) {
|
|
24
25
|
PollState["Active"] = "Active";
|
|
@@ -60,6 +61,12 @@ const tokenRatesControllerMetadata = {
|
|
|
60
61
|
includeInDebugSnapshot: false,
|
|
61
62
|
usedInUi: true,
|
|
62
63
|
},
|
|
64
|
+
supportedChainIds: {
|
|
65
|
+
includeInStateLogs: false,
|
|
66
|
+
persist: true,
|
|
67
|
+
includeInDebugSnapshot: false,
|
|
68
|
+
usedInUi: true,
|
|
69
|
+
},
|
|
63
70
|
};
|
|
64
71
|
/**
|
|
65
72
|
* Get the default {@link TokenRatesController} state.
|
|
@@ -69,6 +76,10 @@ const tokenRatesControllerMetadata = {
|
|
|
69
76
|
export const getDefaultTokenRatesControllerState = () => {
|
|
70
77
|
return {
|
|
71
78
|
marketData: {},
|
|
79
|
+
supportedChainIds: {
|
|
80
|
+
timestamp: 0,
|
|
81
|
+
data: [],
|
|
82
|
+
},
|
|
72
83
|
};
|
|
73
84
|
};
|
|
74
85
|
/**
|
|
@@ -165,6 +176,10 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
165
176
|
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
166
177
|
return;
|
|
167
178
|
}
|
|
179
|
+
console.log('isCache valid', __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_isPriceApiSupportedChainIdsCacheValid).call(this));
|
|
180
|
+
if (!__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_isPriceApiSupportedChainIdsCacheValid).call(this)) {
|
|
181
|
+
await __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_updateSupportedChainIdsCache).call(this);
|
|
182
|
+
}
|
|
168
183
|
// Create a promise for each chainId to fetch exchange rates.
|
|
169
184
|
const updatePromises = chainIdAndNativeCurrency.map(async ({ chainId, nativeCurrency }) => {
|
|
170
185
|
const tokenAddresses = __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_getTokenAddresses).call(this, chainId);
|
|
@@ -241,6 +256,7 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
241
256
|
});
|
|
242
257
|
return acc;
|
|
243
258
|
}, []);
|
|
259
|
+
console.log('call from _executePoll');
|
|
244
260
|
await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);
|
|
245
261
|
}
|
|
246
262
|
/**
|
|
@@ -283,6 +299,7 @@ _TokenRatesController_handle = new WeakMap(), _TokenRatesController_pollState =
|
|
|
283
299
|
});
|
|
284
300
|
return acc;
|
|
285
301
|
}, []);
|
|
302
|
+
console.log('call from subscribeToTokensStateChange');
|
|
286
303
|
await this.updateExchangeRatesByChainId(chainIdAndNativeCurrency);
|
|
287
304
|
}, ({ allTokens, allDetectedTokens }) => {
|
|
288
305
|
return { allTokens, allDetectedTokens };
|
|
@@ -343,6 +360,20 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
343
360
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
344
361
|
__classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_poll).call(this, chainId, nativeCurrency);
|
|
345
362
|
}, __classPrivateFieldGet(this, _TokenRatesController_interval, "f")), "f");
|
|
363
|
+
}, _TokenRatesController_isPriceApiSupportedChainIdsCacheValid = function _TokenRatesController_isPriceApiSupportedChainIdsCacheValid() {
|
|
364
|
+
const { supportedChainIds } = this.state;
|
|
365
|
+
const { timestamp } = supportedChainIds;
|
|
366
|
+
const now = Date.now();
|
|
367
|
+
return (timestamp !== undefined &&
|
|
368
|
+
now - timestamp < DEFAULT_CACHE_REFRESH_THRESHOLD);
|
|
369
|
+
}, _TokenRatesController_updateSupportedChainIdsCache = async function _TokenRatesController_updateSupportedChainIdsCache() {
|
|
370
|
+
const supportedChainIds = await __classPrivateFieldGet(this, _TokenRatesController_tokenPricesService, "f").fetchSupportedChainIds();
|
|
371
|
+
this.update((state) => {
|
|
372
|
+
state.supportedChainIds = {
|
|
373
|
+
timestamp: Date.now(),
|
|
374
|
+
data: supportedChainIds,
|
|
375
|
+
};
|
|
376
|
+
});
|
|
346
377
|
}, _TokenRatesController_fetchAndMapExchangeRates =
|
|
347
378
|
/**
|
|
348
379
|
* Uses the token prices service to retrieve exchange rates for tokens in a
|
|
@@ -365,7 +396,8 @@ async function _TokenRatesController_poll(chainId, nativeCurrency) {
|
|
|
365
396
|
* chain ID.
|
|
366
397
|
*/
|
|
367
398
|
async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
368
|
-
|
|
399
|
+
const supportedChainIds = this.state.supportedChainIds.data;
|
|
400
|
+
if (!supportedChainIds.includes(chainId)) {
|
|
369
401
|
return tokenAddresses.reduce((obj, tokenAddress) => {
|
|
370
402
|
obj = {
|
|
371
403
|
...obj,
|
|
@@ -401,6 +433,7 @@ async function _TokenRatesController_fetchAndMapExchangeRates({ tokenAddresses,
|
|
|
401
433
|
*/
|
|
402
434
|
async function _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency({ tokenAddresses, chainId, nativeCurrency, }) {
|
|
403
435
|
let contractNativeInformations;
|
|
436
|
+
console.log('fetchAndMapExchangeRatesForSupportedNativeCurrency: starting');
|
|
404
437
|
const tokenPricesByTokenAddress = await reduceInBatchesSerially({
|
|
405
438
|
values: [...tokenAddresses].sort(),
|
|
406
439
|
batchSize: TOKEN_PRICES_BATCH_SIZE,
|