{"version":3,"file":"crypto-compare.cjs","sourceRoot":"","sources":["../../src/crypto-compare-service/crypto-compare.ts"],"names":[],"mappings":"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","sourcesContent":["import { handleFetch } from '@metamask/controller-utils';\n\nimport { getKeyByValue } from '../assetsUtil';\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  return (\n    `${CRYPTO_COMPARE_DOMAIN}/data/price?fsym=` +\n    `${nativeCurrency}&tsyms=${currentCurrency}` +\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 */\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  currency = currency.toUpperCase();\n  nativeCurrency = nativeCurrency.toUpperCase();\n  currency = nativeSymbolOverrides.get(currency) ?? currency;\n  nativeCurrency = nativeSymbolOverrides.get(nativeCurrency) ?? nativeCurrency;\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        json[currency.toUpperCase()]\n      }`,\n    );\n  }\n\n  if (includeUSDRate && !Number.isFinite(usdConversionRate)) {\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 fsyms = cryptocurrencies.map(\n    (nativeCurrency) =>\n      nativeSymbolOverrides.get(nativeCurrency) ?? nativeCurrency,\n  );\n  const url = getMultiPricingURL(fsyms, [fiatCurrency], includeUSDRate);\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<Record<string, number>>(\n    response,\n  )) {\n    const key = getKeyByValue(nativeSymbolOverrides, cryptocurrency);\n    rates[key?.toLowerCase() ?? cryptocurrency.toLowerCase()] = {\n      [fiatCurrency.toLowerCase()]: values[fiatCurrency.toUpperCase()],\n      ...(includeUSDRate && { usd: values.USD }),\n    };\n  }\n\n  return rates;\n}\n"]}