@metamask/assets-controllers 39.0.0 → 41.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -1
- package/dist/AccountTrackerController.d.cts +4 -4
- package/dist/AccountTrackerController.d.mts +4 -4
- package/dist/CurrencyRateController.cjs +40 -59
- package/dist/CurrencyRateController.cjs.map +1 -1
- package/dist/CurrencyRateController.d.cts +16 -16
- package/dist/CurrencyRateController.d.cts.map +1 -1
- package/dist/CurrencyRateController.d.mts +16 -16
- package/dist/CurrencyRateController.d.mts.map +1 -1
- package/dist/CurrencyRateController.mjs +41 -60
- package/dist/CurrencyRateController.mjs.map +1 -1
- package/dist/RatesController/RatesController.cjs +1 -1
- package/dist/RatesController/RatesController.cjs.map +1 -1
- package/dist/RatesController/RatesController.mjs +1 -1
- package/dist/RatesController/RatesController.mjs.map +1 -1
- package/dist/RatesController/types.cjs.map +1 -1
- package/dist/RatesController/types.d.cts +6 -7
- package/dist/RatesController/types.d.cts.map +1 -1
- package/dist/RatesController/types.d.mts +6 -7
- package/dist/RatesController/types.d.mts.map +1 -1
- package/dist/RatesController/types.mjs.map +1 -1
- package/dist/TokenDetectionController.cjs +53 -14
- package/dist/TokenDetectionController.cjs.map +1 -1
- package/dist/TokenDetectionController.d.cts +4 -4
- package/dist/TokenDetectionController.d.cts.map +1 -1
- package/dist/TokenDetectionController.d.mts +4 -4
- package/dist/TokenDetectionController.d.mts.map +1 -1
- package/dist/TokenDetectionController.mjs +54 -14
- package/dist/TokenDetectionController.mjs.map +1 -1
- package/dist/TokenListController.cjs.map +1 -1
- package/dist/TokenListController.d.cts +5 -5
- package/dist/TokenListController.d.cts.map +1 -1
- package/dist/TokenListController.d.mts +5 -5
- package/dist/TokenListController.d.mts.map +1 -1
- package/dist/TokenListController.mjs.map +1 -1
- package/dist/TokenRatesController.cjs +4 -4
- package/dist/TokenRatesController.cjs.map +1 -1
- package/dist/TokenRatesController.d.cts +4 -4
- package/dist/TokenRatesController.d.cts.map +1 -1
- package/dist/TokenRatesController.d.mts +4 -4
- package/dist/TokenRatesController.d.mts.map +1 -1
- package/dist/TokenRatesController.mjs +4 -4
- package/dist/TokenRatesController.mjs.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.cjs +8 -6
- package/dist/crypto-compare-service/crypto-compare.cjs.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.cts +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.cts.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.mts +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.mts.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.mjs +8 -6
- package/dist/crypto-compare-service/crypto-compare.mjs.map +1 -1
- package/package.json +12 -12
|
@@ -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 RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n toHex,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport type {\n NetworkClientId,\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 { ZERO_ADDRESS } 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 = RestrictedControllerMessenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\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 = {\n marketData: { persist: true, anonymous: false },\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 networkClientId: NetworkClientId;\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 #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #selectedAccountId: string;\n\n #disabled: boolean;\n\n #chainId: Hex;\n\n #ticker: string;\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 controller 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 { chainId: currentChainId, ticker: currentTicker } =\n this.#getChainIdAndTicker();\n this.#chainId = currentChainId;\n this.#ticker = currentTicker;\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\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.messagingSystem.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 const previousTokenAddresses = this.#getTokenAddresses(this.#chainId);\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const newTokenAddresses = this.#getTokenAddresses(this.#chainId);\n if (\n !isEqual(previousTokenAddresses, newTokenAddresses) &&\n this.#pollState === PollState.Active\n ) {\n await this.updateExchangeRates();\n }\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messagingSystem.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 ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId, ticker },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (this.#chainId !== chainId || this.#ticker !== ticker) {\n this.update((state) => {\n state.marketData = {};\n });\n this.#chainId = chainId;\n this.#ticker = ticker;\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates();\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 }) => toHex(toChecksumHexAddress(address))),\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 async start() {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll();\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getSelectedAccount(): InternalAccount {\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getSelectedAccount',\n );\n\n return selectedAccount;\n }\n\n #getChainIdAndTicker(): {\n chainId: Hex;\n ticker: string;\n } {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return {\n chainId: networkClient.configuration.chainId,\n ticker: networkClient.configuration.ticker,\n };\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messagingSystem.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 async #poll() {\n await safelyExecute(() => this.updateExchangeRates());\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();\n }, this.#interval);\n }\n\n /**\n * Updates exchange rates for all tokens.\n */\n async updateExchangeRates() {\n await this.updateExchangeRatesByChainId({\n chainId: this.#chainId,\n nativeCurrency: this.#ticker,\n });\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param options - The options to fetch exchange rates.\n * @param options.chainId - The chain ID.\n * @param options.nativeCurrency - The ticker for the chain.\n */\n async updateExchangeRatesByChainId({\n chainId,\n nativeCurrency,\n }: {\n chainId: Hex;\n nativeCurrency: string;\n }) {\n if (this.#disabled) {\n return;\n }\n\n const tokenAddresses = this.#getTokenAddresses(chainId);\n\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}`;\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // This prevents redundant updates\n // This promise is resolved after the in-progress update has finished,\n // and state has been updated.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return;\n }\n\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 const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n this.update((state) => {\n state.marketData = marketData;\n });\n updateSucceeded();\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n delete this.#inProcessExchangeRateUpdates[updateKey];\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 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.networkClientId - The network client ID used to get a ticker value.\n */\n async _executePoll({\n networkClientId,\n }: TokenRatesPollingInput): Promise<void> {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n await this.updateExchangeRatesByChainId({\n chainId: networkClient.configuration.chainId,\n nativeCurrency: networkClient.configuration.ticker,\n });\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 [ZERO_ADDRESS]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[ZERO_ADDRESS],\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.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 tokenAddresses,\n nativeCurrency,\n }: {\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: this.#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\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 RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n toHex,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport type {\n NetworkClientId,\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 { ZERO_ADDRESS } 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 = RestrictedControllerMessenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\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 = {\n marketData: { persist: true, anonymous: false },\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 networkClientId: NetworkClientId;\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 #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #selectedAccountId: string;\n\n #disabled: boolean;\n\n #chainId: Hex;\n\n #ticker: string;\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 controller 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 { chainId: currentChainId, ticker: currentTicker } =\n this.#getChainIdAndTicker();\n this.#chainId = currentChainId;\n this.#ticker = currentTicker;\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\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.messagingSystem.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 const previousTokenAddresses = this.#getTokenAddresses(this.#chainId);\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const newTokenAddresses = this.#getTokenAddresses(this.#chainId);\n if (\n !isEqual(previousTokenAddresses, newTokenAddresses) &&\n this.#pollState === PollState.Active\n ) {\n await this.updateExchangeRates();\n }\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messagingSystem.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 ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId, ticker },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (this.#chainId !== chainId || this.#ticker !== ticker) {\n this.#chainId = chainId;\n this.#ticker = ticker;\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates();\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 }) => toHex(toChecksumHexAddress(address))),\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 async start() {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll();\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getSelectedAccount(): InternalAccount {\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getSelectedAccount',\n );\n\n return selectedAccount;\n }\n\n #getChainIdAndTicker(): {\n chainId: Hex;\n ticker: string;\n } {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return {\n chainId: networkClient.configuration.chainId,\n ticker: networkClient.configuration.ticker,\n };\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messagingSystem.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 async #poll() {\n await safelyExecute(() => this.updateExchangeRates());\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();\n }, this.#interval);\n }\n\n /**\n * Updates exchange rates for all tokens.\n */\n async updateExchangeRates() {\n await this.updateExchangeRatesByChainId({\n chainId: this.#chainId,\n nativeCurrency: this.#ticker,\n });\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param options - The options to fetch exchange rates.\n * @param options.chainId - The chain ID.\n * @param options.nativeCurrency - The ticker for the chain.\n */\n async updateExchangeRatesByChainId({\n chainId,\n nativeCurrency,\n }: {\n chainId: Hex;\n nativeCurrency: string;\n }) {\n if (this.#disabled) {\n return;\n }\n\n const tokenAddresses = this.#getTokenAddresses(chainId);\n\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}`;\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // This prevents redundant updates\n // This promise is resolved after the in-progress update has finished,\n // and state has been updated.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return;\n }\n\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 const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n updateSucceeded();\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n delete this.#inProcessExchangeRateUpdates[updateKey];\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 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.networkClientId - The network client ID used to get a ticker value.\n */\n async _executePoll({\n networkClientId,\n }: TokenRatesPollingInput): Promise<void> {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n await this.updateExchangeRatesByChainId({\n chainId: networkClient.configuration.chainId,\n nativeCurrency: networkClient.configuration.ticker,\n });\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 [ZERO_ADDRESS]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[ZERO_ADDRESS],\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.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 tokenAddresses,\n nativeCurrency,\n }: {\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: this.#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\nexport default TokenRatesController;\n"]}
|
|
@@ -108,14 +108,14 @@ export type TokenRatesPollingInput = {
|
|
|
108
108
|
networkClientId: NetworkClientId;
|
|
109
109
|
};
|
|
110
110
|
declare const TokenRatesController_base: (abstract new (...args: any[]) => {
|
|
111
|
-
readonly "__#
|
|
112
|
-
"__#
|
|
111
|
+
readonly "__#787890@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
112
|
+
"__#787890@#intervalLength": number | undefined;
|
|
113
113
|
setIntervalLength(intervalLength: number): void;
|
|
114
114
|
getIntervalLength(): number | undefined;
|
|
115
115
|
_startPolling(input: TokenRatesPollingInput): void;
|
|
116
116
|
_stopPollingByPollingTokenSetId(key: string): void;
|
|
117
|
-
readonly "__#
|
|
118
|
-
"__#
|
|
117
|
+
readonly "__#787882@#pollingTokenSets": Map<string, Set<string>>;
|
|
118
|
+
"__#787882@#callbacks": Map<string, Set<(input: TokenRatesPollingInput) => void>>;
|
|
119
119
|
_executePoll(input: TokenRatesPollingInput): Promise<void>;
|
|
120
120
|
startPolling(input: TokenRatesPollingInput): string;
|
|
121
121
|
stopAllPolling(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -108,14 +108,14 @@ export type TokenRatesPollingInput = {
|
|
|
108
108
|
networkClientId: NetworkClientId;
|
|
109
109
|
};
|
|
110
110
|
declare const TokenRatesController_base: (abstract new (...args: any[]) => {
|
|
111
|
-
readonly "__#
|
|
112
|
-
"__#
|
|
111
|
+
readonly "__#787890@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
112
|
+
"__#787890@#intervalLength": number | undefined;
|
|
113
113
|
setIntervalLength(intervalLength: number): void;
|
|
114
114
|
getIntervalLength(): number | undefined;
|
|
115
115
|
_startPolling(input: TokenRatesPollingInput): void;
|
|
116
116
|
_stopPollingByPollingTokenSetId(key: string): void;
|
|
117
|
-
readonly "__#
|
|
118
|
-
"__#
|
|
117
|
+
readonly "__#787882@#pollingTokenSets": Map<string, Set<string>>;
|
|
118
|
+
"__#787882@#callbacks": Map<string, Set<(input: TokenRatesPollingInput) => void>>;
|
|
119
119
|
_executePoll(input: TokenRatesPollingInput): Promise<void>;
|
|
120
120
|
startPolling(input: TokenRatesPollingInput): string;
|
|
121
121
|
stopAllPolling(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -184,7 +184,10 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
184
184
|
},
|
|
185
185
|
};
|
|
186
186
|
this.update((state) => {
|
|
187
|
-
state.marketData =
|
|
187
|
+
state.marketData = {
|
|
188
|
+
...state.marketData,
|
|
189
|
+
...marketData,
|
|
190
|
+
};
|
|
188
191
|
});
|
|
189
192
|
updateSucceeded();
|
|
190
193
|
}
|
|
@@ -233,9 +236,6 @@ _TokenRatesController_handle = new WeakMap(), _TokenRatesController_pollState =
|
|
|
233
236
|
async ({ selectedNetworkClientId }) => {
|
|
234
237
|
const { configuration: { chainId, ticker }, } = this.messagingSystem.call('NetworkController:getNetworkClientById', selectedNetworkClientId);
|
|
235
238
|
if (__classPrivateFieldGet(this, _TokenRatesController_chainId, "f") !== chainId || __classPrivateFieldGet(this, _TokenRatesController_ticker, "f") !== ticker) {
|
|
236
|
-
this.update((state) => {
|
|
237
|
-
state.marketData = {};
|
|
238
|
-
});
|
|
239
239
|
__classPrivateFieldSet(this, _TokenRatesController_chainId, chainId, "f");
|
|
240
240
|
__classPrivateFieldSet(this, _TokenRatesController_ticker, ticker, "f");
|
|
241
241
|
if (__classPrivateFieldGet(this, _TokenRatesController_pollState, "f") === PollState.Active) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.mjs","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 RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n toHex,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport type {\n NetworkClientId,\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 { ZERO_ADDRESS } 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 = RestrictedControllerMessenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\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 = {\n marketData: { persist: true, anonymous: false },\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 networkClientId: NetworkClientId;\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 #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #selectedAccountId: string;\n\n #disabled: boolean;\n\n #chainId: Hex;\n\n #ticker: string;\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 controller 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 { chainId: currentChainId, ticker: currentTicker } =\n this.#getChainIdAndTicker();\n this.#chainId = currentChainId;\n this.#ticker = currentTicker;\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\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.messagingSystem.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 const previousTokenAddresses = this.#getTokenAddresses(this.#chainId);\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const newTokenAddresses = this.#getTokenAddresses(this.#chainId);\n if (\n !isEqual(previousTokenAddresses, newTokenAddresses) &&\n this.#pollState === PollState.Active\n ) {\n await this.updateExchangeRates();\n }\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messagingSystem.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 ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId, ticker },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (this.#chainId !== chainId || this.#ticker !== ticker) {\n this.update((state) => {\n state.marketData = {};\n });\n this.#chainId = chainId;\n this.#ticker = ticker;\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates();\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 }) => toHex(toChecksumHexAddress(address))),\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 async start() {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll();\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getSelectedAccount(): InternalAccount {\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getSelectedAccount',\n );\n\n return selectedAccount;\n }\n\n #getChainIdAndTicker(): {\n chainId: Hex;\n ticker: string;\n } {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return {\n chainId: networkClient.configuration.chainId,\n ticker: networkClient.configuration.ticker,\n };\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messagingSystem.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 async #poll() {\n await safelyExecute(() => this.updateExchangeRates());\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();\n }, this.#interval);\n }\n\n /**\n * Updates exchange rates for all tokens.\n */\n async updateExchangeRates() {\n await this.updateExchangeRatesByChainId({\n chainId: this.#chainId,\n nativeCurrency: this.#ticker,\n });\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param options - The options to fetch exchange rates.\n * @param options.chainId - The chain ID.\n * @param options.nativeCurrency - The ticker for the chain.\n */\n async updateExchangeRatesByChainId({\n chainId,\n nativeCurrency,\n }: {\n chainId: Hex;\n nativeCurrency: string;\n }) {\n if (this.#disabled) {\n return;\n }\n\n const tokenAddresses = this.#getTokenAddresses(chainId);\n\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}`;\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // This prevents redundant updates\n // This promise is resolved after the in-progress update has finished,\n // and state has been updated.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return;\n }\n\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 const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n this.update((state) => {\n state.marketData = marketData;\n });\n updateSucceeded();\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n delete this.#inProcessExchangeRateUpdates[updateKey];\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 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.networkClientId - The network client ID used to get a ticker value.\n */\n async _executePoll({\n networkClientId,\n }: TokenRatesPollingInput): Promise<void> {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n await this.updateExchangeRatesByChainId({\n chainId: networkClient.configuration.chainId,\n nativeCurrency: networkClient.configuration.ticker,\n });\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 [ZERO_ADDRESS]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[ZERO_ADDRESS],\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.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 tokenAddresses,\n nativeCurrency,\n }: {\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: this.#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\nexport default TokenRatesController;\n"]}
|
|
1
|
+
{"version":3,"file":"TokenRatesController.mjs","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 RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n safelyExecute,\n toChecksumHexAddress,\n FALL_BACK_VS_CURRENCY,\n toHex,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport type {\n NetworkClientId,\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 { ZERO_ADDRESS } 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 = RestrictedControllerMessenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\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 = {\n marketData: { persist: true, anonymous: false },\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 networkClientId: NetworkClientId;\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 #tokenPricesService: AbstractTokenPricesService;\n\n #inProcessExchangeRateUpdates: Record<`${Hex}:${string}`, Promise<void>> = {};\n\n #selectedAccountId: string;\n\n #disabled: boolean;\n\n #chainId: Hex;\n\n #ticker: string;\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 controller 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 { chainId: currentChainId, ticker: currentTicker } =\n this.#getChainIdAndTicker();\n this.#chainId = currentChainId;\n this.#ticker = currentTicker;\n\n this.#selectedAccountId = this.#getSelectedAccount().id;\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.messagingSystem.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 const previousTokenAddresses = this.#getTokenAddresses(this.#chainId);\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const newTokenAddresses = this.#getTokenAddresses(this.#chainId);\n if (\n !isEqual(previousTokenAddresses, newTokenAddresses) &&\n this.#pollState === PollState.Active\n ) {\n await this.updateExchangeRates();\n }\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messagingSystem.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 ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId, ticker },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (this.#chainId !== chainId || this.#ticker !== ticker) {\n this.#chainId = chainId;\n this.#ticker = ticker;\n if (this.#pollState === PollState.Active) {\n await this.updateExchangeRates();\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 }) => toHex(toChecksumHexAddress(address))),\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 async start() {\n this.#stopPoll();\n this.#pollState = PollState.Active;\n await this.#poll();\n }\n\n /**\n * Stop polling.\n */\n stop() {\n this.#stopPoll();\n this.#pollState = PollState.Inactive;\n }\n\n #getSelectedAccount(): InternalAccount {\n const selectedAccount = this.messagingSystem.call(\n 'AccountsController:getSelectedAccount',\n );\n\n return selectedAccount;\n }\n\n #getChainIdAndTicker(): {\n chainId: Hex;\n ticker: string;\n } {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return {\n chainId: networkClient.configuration.chainId,\n ticker: networkClient.configuration.ticker,\n };\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messagingSystem.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 async #poll() {\n await safelyExecute(() => this.updateExchangeRates());\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();\n }, this.#interval);\n }\n\n /**\n * Updates exchange rates for all tokens.\n */\n async updateExchangeRates() {\n await this.updateExchangeRatesByChainId({\n chainId: this.#chainId,\n nativeCurrency: this.#ticker,\n });\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param options - The options to fetch exchange rates.\n * @param options.chainId - The chain ID.\n * @param options.nativeCurrency - The ticker for the chain.\n */\n async updateExchangeRatesByChainId({\n chainId,\n nativeCurrency,\n }: {\n chainId: Hex;\n nativeCurrency: string;\n }) {\n if (this.#disabled) {\n return;\n }\n\n const tokenAddresses = this.#getTokenAddresses(chainId);\n\n const updateKey: `${Hex}:${string}` = `${chainId}:${nativeCurrency}`;\n if (updateKey in this.#inProcessExchangeRateUpdates) {\n // This prevents redundant updates\n // This promise is resolved after the in-progress update has finished,\n // and state has been updated.\n await this.#inProcessExchangeRateUpdates[updateKey];\n return;\n }\n\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 const marketData = {\n [chainId]: {\n ...(contractInformations ?? {}),\n },\n };\n\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n updateSucceeded();\n } catch (error: unknown) {\n updateFailed(error);\n throw error;\n } finally {\n delete this.#inProcessExchangeRateUpdates[updateKey];\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 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.networkClientId - The network client ID used to get a ticker value.\n */\n async _executePoll({\n networkClientId,\n }: TokenRatesPollingInput): Promise<void> {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n await this.updateExchangeRatesByChainId({\n chainId: networkClient.configuration.chainId,\n nativeCurrency: networkClient.configuration.ticker,\n });\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 [ZERO_ADDRESS]: {\n currency: nativeCurrency,\n ...contractNativeInformationsNative[ZERO_ADDRESS],\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.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 tokenAddresses,\n nativeCurrency,\n }: {\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: this.#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\nexport default TokenRatesController;\n"]}
|
|
@@ -31,19 +31,21 @@ function getPricingURL(currentCurrency, nativeCurrency, includeUSDRate) {
|
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Get the CryptoCompare API URL for getting the conversion rate from a given array of native currencies
|
|
34
|
-
* to the given
|
|
34
|
+
* to the given currencies. Optionally, the conversion rate from the native currency to USD can also be
|
|
35
35
|
* included in the response.
|
|
36
36
|
*
|
|
37
37
|
* @param fsyms - The native currencies to get conversion rates for.
|
|
38
|
-
* @param tsyms - The
|
|
38
|
+
* @param tsyms - The currencies to convert to.
|
|
39
39
|
* @param includeUSDRate - Whether or not the native currency to USD conversion rate should be included.
|
|
40
40
|
* @returns The API URL for getting the conversion rates.
|
|
41
41
|
*/
|
|
42
42
|
function getMultiPricingURL(fsyms, tsyms, includeUSDRate = false) {
|
|
43
|
-
const updatedTsyms = includeUSDRate && !tsyms.
|
|
43
|
+
const updatedTsyms = includeUSDRate && !tsyms.some((t) => t.toUpperCase() === 'USD')
|
|
44
|
+
? [...tsyms, 'USD']
|
|
45
|
+
: tsyms;
|
|
44
46
|
const params = new URLSearchParams();
|
|
45
|
-
params.append('fsyms', fsyms);
|
|
46
|
-
params.append('tsyms', updatedTsyms);
|
|
47
|
+
params.append('fsyms', fsyms.join(','));
|
|
48
|
+
params.append('tsyms', updatedTsyms.join(','));
|
|
47
49
|
const url = new URL(`${CRYPTO_COMPARE_DOMAIN}/data/pricemulti`);
|
|
48
50
|
url.search = params.toString();
|
|
49
51
|
return url.toString();
|
|
@@ -103,7 +105,7 @@ exports.fetchExchangeRate = fetchExchangeRate;
|
|
|
103
105
|
* @returns Promise resolving to exchange rates for given currencies.
|
|
104
106
|
*/
|
|
105
107
|
async function fetchMultiExchangeRate(fiatCurrency, cryptocurrencies, includeUSDRate) {
|
|
106
|
-
const url = getMultiPricingURL(
|
|
108
|
+
const url = getMultiPricingURL(cryptocurrencies, [fiatCurrency], includeUSDRate);
|
|
107
109
|
const response = await (0, controller_utils_1.handleFetch)(url);
|
|
108
110
|
handleErrorResponse(response);
|
|
109
111
|
const rates = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-compare.cjs","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":";;;AAAA,iEAAyD;AAEzD;;;GAGG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjB,CAAC,MAAM,EAAE,SAAS,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CACpB,eAAuB,EACvB,cAAsB,EACtB,cAAwB;IAExB,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC;IACzE,OAAO,CACL,GAAG,qBAAqB,mBAAmB;QAC3C,GAAG,IAAI,UAAU,eAAe,CAAC,WAAW,EAAE,EAAE;QAChD,GAAG,cAAc,IAAI,eAAe,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,kBAAkB,CACzB,
|
|
1
|
+
{"version":3,"file":"crypto-compare.cjs","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":";;;AAAA,iEAAyD;AAEzD;;;GAGG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjB,CAAC,MAAM,EAAE,SAAS,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CACpB,eAAuB,EACvB,cAAsB,EACtB,cAAwB;IAExB,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC;IACzE,OAAO,CACL,GAAG,qBAAqB,mBAAmB;QAC3C,GAAG,IAAI,UAAU,eAAe,CAAC,WAAW,EAAE,EAAE;QAChD,GAAG,cAAc,IAAI,eAAe,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,kBAAkB,CACzB,KAAe,EACf,KAAe,EACf,cAAc,GAAG,KAAK;IAEtB,MAAM,YAAY,GAChB,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QAC7D,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC;QACnB,CAAC,CAAC,KAAK,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,qBAAqB,kBAAkB,CAAC,CAAC;IAChE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,gFAAgF;AAChF,gEAAgE;AAChE,SAAS,mBAAmB,CAAC,IAA6C;IACxE,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC/B;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,cAAsB,EACtB,cAAwB;IAKxB,MAAM,IAAI,GAAG,MAAM,IAAA,8BAAW,EAC5B,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CACxD,CAAC;IAEF,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE5D,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;QACpC,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,CAAC,WAAW,EAAE,KAAK;QACjD,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAC7B,EAAE,CACH,CAAC;KACH;IAED,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QACzD,gFAAgF;QAChF,4EAA4E;QAC5E,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;KACxE;IAED,OAAO;QACL,cAAc;QACd,iBAAiB;KAClB,CAAC;AACJ,CAAC;AApCD,8CAoCC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,sBAAsB,CAC1C,YAAoB,EACpB,gBAA0B,EAC1B,cAAuB;IAEvB,MAAM,GAAG,GAAG,kBAAkB,CAC5B,gBAAgB,EAChB,CAAC,YAAY,CAAC,EACd,cAAc,CACf,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAW,EAAC,GAAG,CAAC,CAAC;IACxC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAE9B,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAG3D,EAAE;QACH,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,GAAG;YACpC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAChE,GAAG,CAAC,cAAc,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;SAC3C,CAAC;KACH;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAzBD,wDAyBC","sourcesContent":["import { handleFetch } from '@metamask/controller-utils';\n\n/**\n * A map from native currency symbol to CryptoCompare identifier.\n * This is only needed when the values don't match.\n */\nconst nativeSymbolOverrides = new Map([\n ['MNT', 'MANTLE'],\n ['OMNI', 'OMNINET'],\n]);\n\nconst CRYPTO_COMPARE_DOMAIN = 'https://min-api.cryptocompare.com';\n\n/**\n * Get the CryptoCompare API URL for getting the conversion rate from the given native currency to\n * the given currency. Optionally, the conversion rate from the native currency to USD can also be\n * included in the response.\n *\n * @param currentCurrency - The currency to get a conversion rate for.\n * @param nativeCurrency - The native currency to convert from.\n * @param includeUSDRate - Whether or not the native currency to USD conversion rate should be\n * included in the response as well.\n * @returns The API URL for getting the conversion rate.\n */\nfunction getPricingURL(\n currentCurrency: string,\n nativeCurrency: string,\n includeUSDRate?: boolean,\n) {\n nativeCurrency = nativeCurrency.toUpperCase();\n const fsym = nativeSymbolOverrides.get(nativeCurrency) ?? nativeCurrency;\n return (\n `${CRYPTO_COMPARE_DOMAIN}/data/price?fsym=` +\n `${fsym}&tsyms=${currentCurrency.toUpperCase()}` +\n `${includeUSDRate && currentCurrency.toUpperCase() !== 'USD' ? ',USD' : ''}`\n );\n}\n\n/**\n * Get the CryptoCompare API URL for getting the conversion rate from a given array of native currencies\n * to the given currencies. Optionally, the conversion rate from the native currency to USD can also be\n * included in the response.\n *\n * @param fsyms - The native currencies to get conversion rates for.\n * @param tsyms - The currencies to convert to.\n * @param includeUSDRate - Whether or not the native currency to USD conversion rate should be included.\n * @returns The API URL for getting the conversion rates.\n */\nfunction getMultiPricingURL(\n fsyms: string[],\n tsyms: string[],\n includeUSDRate = false,\n) {\n const updatedTsyms =\n includeUSDRate && !tsyms.some((t) => t.toUpperCase() === 'USD')\n ? [...tsyms, 'USD']\n : tsyms;\n\n const params = new URLSearchParams();\n params.append('fsyms', fsyms.join(','));\n params.append('tsyms', updatedTsyms.join(','));\n\n const url = new URL(`${CRYPTO_COMPARE_DOMAIN}/data/pricemulti`);\n url.search = params.toString();\n return url.toString();\n}\n\n/**\n * Handles an error response from the CryptoCompare API.\n * Expected error response format\n * { Response: \"Error\", Message: \"...\", HasWarning: false }\n *\n * @param json - The JSON response from the CryptoCompare API.\n * @param json.Response - The response status.\n * @param json.Message - The error message.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction handleErrorResponse(json: { Response?: string; Message?: string }) {\n if (json.Response === 'Error') {\n throw new Error(json.Message);\n }\n}\n\n/**\n * Fetches the exchange rate for a given currency.\n *\n * @param currency - ISO 4217 currency code.\n * @param nativeCurrency - Symbol for base asset.\n * @param includeUSDRate - Whether to add the USD rate to the fetch.\n * @returns Promise resolving to exchange rate for given currency.\n */\nexport async function fetchExchangeRate(\n currency: string,\n nativeCurrency: string,\n includeUSDRate?: boolean,\n): Promise<{\n conversionRate: number;\n usdConversionRate: number;\n}> {\n const json = await handleFetch(\n getPricingURL(currency, nativeCurrency, includeUSDRate),\n );\n\n handleErrorResponse(json);\n const conversionRate = Number(json[currency.toUpperCase()]);\n\n const usdConversionRate = Number(json.USD);\n if (!Number.isFinite(conversionRate)) {\n throw new Error(\n `Invalid response for ${currency.toUpperCase()}: ${\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n json[currency.toUpperCase()]\n }`,\n );\n }\n\n if (includeUSDRate && !Number.isFinite(usdConversionRate)) {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Invalid response for usdConversionRate: ${json.USD}`);\n }\n\n return {\n conversionRate,\n usdConversionRate,\n };\n}\n\n/**\n * Fetches the exchange rates for multiple currencies.\n *\n * @param fiatCurrency - The currency of the rates (ISO 4217).\n * @param cryptocurrencies - The cryptocurrencies to get conversion rates for. Min length: 1. Max length: 300.\n * @param includeUSDRate - Whether to add the USD rate to the fetch.\n * @returns Promise resolving to exchange rates for given currencies.\n */\nexport async function fetchMultiExchangeRate(\n fiatCurrency: string,\n cryptocurrencies: string[],\n includeUSDRate: boolean,\n): Promise<Record<string, Record<string, number>>> {\n const url = getMultiPricingURL(\n cryptocurrencies,\n [fiatCurrency],\n includeUSDRate,\n );\n const response = await handleFetch(url);\n handleErrorResponse(response);\n\n const rates: Record<string, Record<string, number>> = {};\n for (const [cryptocurrency, values] of Object.entries(response) as [\n string,\n Record<string, number>,\n ][]) {\n rates[cryptocurrency.toLowerCase()] = {\n [fiatCurrency.toLowerCase()]: values[fiatCurrency.toUpperCase()],\n ...(includeUSDRate && { usd: values.USD }),\n };\n }\n\n return rates;\n}\n"]}
|
|
@@ -18,5 +18,5 @@ export declare function fetchExchangeRate(currency: string, nativeCurrency: stri
|
|
|
18
18
|
* @param includeUSDRate - Whether to add the USD rate to the fetch.
|
|
19
19
|
* @returns Promise resolving to exchange rates for given currencies.
|
|
20
20
|
*/
|
|
21
|
-
export declare function fetchMultiExchangeRate(fiatCurrency: string, cryptocurrencies: string[], includeUSDRate: boolean): Promise<Record<string, Record<string,
|
|
21
|
+
export declare function fetchMultiExchangeRate(fiatCurrency: string, cryptocurrencies: string[], includeUSDRate: boolean): Promise<Record<string, Record<string, number>>>;
|
|
22
22
|
//# sourceMappingURL=crypto-compare.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-compare.d.cts","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto-compare.d.cts","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":"AAoFA;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CA6BD;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAqBjD"}
|
|
@@ -18,5 +18,5 @@ export declare function fetchExchangeRate(currency: string, nativeCurrency: stri
|
|
|
18
18
|
* @param includeUSDRate - Whether to add the USD rate to the fetch.
|
|
19
19
|
* @returns Promise resolving to exchange rates for given currencies.
|
|
20
20
|
*/
|
|
21
|
-
export declare function fetchMultiExchangeRate(fiatCurrency: string, cryptocurrencies: string[], includeUSDRate: boolean): Promise<Record<string, Record<string,
|
|
21
|
+
export declare function fetchMultiExchangeRate(fiatCurrency: string, cryptocurrencies: string[], includeUSDRate: boolean): Promise<Record<string, Record<string, number>>>;
|
|
22
22
|
//# sourceMappingURL=crypto-compare.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-compare.d.mts","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto-compare.d.mts","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":"AAoFA;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CA6BD;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAqBjD"}
|
|
@@ -28,19 +28,21 @@ function getPricingURL(currentCurrency, nativeCurrency, includeUSDRate) {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Get the CryptoCompare API URL for getting the conversion rate from a given array of native currencies
|
|
31
|
-
* to the given
|
|
31
|
+
* to the given currencies. Optionally, the conversion rate from the native currency to USD can also be
|
|
32
32
|
* included in the response.
|
|
33
33
|
*
|
|
34
34
|
* @param fsyms - The native currencies to get conversion rates for.
|
|
35
|
-
* @param tsyms - The
|
|
35
|
+
* @param tsyms - The currencies to convert to.
|
|
36
36
|
* @param includeUSDRate - Whether or not the native currency to USD conversion rate should be included.
|
|
37
37
|
* @returns The API URL for getting the conversion rates.
|
|
38
38
|
*/
|
|
39
39
|
function getMultiPricingURL(fsyms, tsyms, includeUSDRate = false) {
|
|
40
|
-
const updatedTsyms = includeUSDRate && !tsyms.
|
|
40
|
+
const updatedTsyms = includeUSDRate && !tsyms.some((t) => t.toUpperCase() === 'USD')
|
|
41
|
+
? [...tsyms, 'USD']
|
|
42
|
+
: tsyms;
|
|
41
43
|
const params = new URLSearchParams();
|
|
42
|
-
params.append('fsyms', fsyms);
|
|
43
|
-
params.append('tsyms', updatedTsyms);
|
|
44
|
+
params.append('fsyms', fsyms.join(','));
|
|
45
|
+
params.append('tsyms', updatedTsyms.join(','));
|
|
44
46
|
const url = new URL(`${CRYPTO_COMPARE_DOMAIN}/data/pricemulti`);
|
|
45
47
|
url.search = params.toString();
|
|
46
48
|
return url.toString();
|
|
@@ -99,7 +101,7 @@ export async function fetchExchangeRate(currency, nativeCurrency, includeUSDRate
|
|
|
99
101
|
* @returns Promise resolving to exchange rates for given currencies.
|
|
100
102
|
*/
|
|
101
103
|
export async function fetchMultiExchangeRate(fiatCurrency, cryptocurrencies, includeUSDRate) {
|
|
102
|
-
const url = getMultiPricingURL(
|
|
104
|
+
const url = getMultiPricingURL(cryptocurrencies, [fiatCurrency], includeUSDRate);
|
|
103
105
|
const response = await handleFetch(url);
|
|
104
106
|
handleErrorResponse(response);
|
|
105
107
|
const rates = {};
|