{"version":3,"file":"util.cjs","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { fromWei, toWei } from '@metamask/ethjs-unit';\nimport type { Hex, Json } from '@metamask/utils';\nimport {\n  isStrictHexString,\n  add0x,\n  isHexString,\n  remove0x,\n  getChecksumAddress,\n  isHexChecksumAddress,\n} from '@metamask/utils';\nimport type { BigNumber } from 'bignumber.js';\nimport BN from 'bn.js';\nimport ensNamehash from 'eth-ens-namehash';\nimport deepEqual from 'fast-deep-equal';\nimport { memoize } from 'lodash';\n\nimport { MAX_SAFE_CHAIN_ID } from './constants';\n\nexport type { BigNumber };\n\nconst TIMEOUT_ERROR = new Error('timeout');\n\nexport const PROTOTYPE_POLLUTION_BLOCKLIST = [\n  '__proto__',\n  'constructor',\n  'prototype',\n] as const;\n\n/**\n * Checks whether a dynamic property key could be used in\n * a [prototype pollution attack](https://portswigger.net/web-security/prototype-pollution).\n *\n * @param key - The dynamic key to validate.\n * @returns Whether the given dynamic key is safe to use.\n */\nexport function isSafeDynamicKey(key: string): boolean {\n  return (\n    typeof key === 'string' &&\n    !PROTOTYPE_POLLUTION_BLOCKLIST.some((blockedKey) => key === blockedKey)\n  );\n}\n\n/**\n * Checks whether the given number primitive chain ID is safe.\n * Because some cryptographic libraries we use expect the chain ID to be a\n * number primitive, it must not exceed a certain size.\n *\n * @param chainId - The chain ID to check for safety.\n * @returns Whether the given chain ID is safe.\n */\nexport function isSafeChainId(chainId: Hex): boolean {\n  if (!isHexString(chainId)) {\n    return false;\n  }\n  const decimalChainId = Number.parseInt(\n    chainId,\n    isStrictHexString(chainId) ? 16 : 10,\n  );\n  return (\n    Number.isSafeInteger(decimalChainId) &&\n    decimalChainId > 0 &&\n    decimalChainId <= MAX_SAFE_CHAIN_ID\n  );\n}\n/**\n * Converts a BN or BigNumber object to a hex string with a '0x' prefix.\n *\n * @param inputBn - BN|BigNumber instance to convert to a hex string.\n * @returns A '0x'-prefixed hex string.\n */\n// TODO: Fix naming convention.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function BNToHex(inputBn: BN | BigNumber): Hex {\n  return add0x(inputBn.toString(16));\n}\n\n/**\n * Used to multiply a BN by a fraction.\n *\n * @param targetBN - Number to multiply by a fraction.\n * @param numerator - Numerator of the fraction multiplier.\n * @param denominator - Denominator of the fraction multiplier.\n * @returns Product of the multiplication.\n */\nexport function fractionBN(\n  targetBN: BN,\n  numerator: number | string,\n  denominator: number | string,\n): BN {\n  const numBN = new BN(numerator);\n  const denomBN = new BN(denominator);\n  return targetBN.mul(numBN).div(denomBN);\n}\n\n/**\n * Used to convert a base-10 number from GWEI to WEI. Can handle numbers with decimal parts.\n *\n * @param value - The base 10 number to convert to WEI.\n * @returns The number in WEI, as a BN.\n */\nexport function gweiDecToWEIBN(value: number | string): BN {\n  if (Number.isNaN(value)) {\n    return new BN(0);\n  }\n\n  const parts = value.toString().split('.');\n  const wholePart = parts[0] || '0';\n  let decimalPart = parts[1] || '';\n\n  if (!decimalPart) {\n    return toWei(wholePart, 'gwei');\n  }\n\n  if (decimalPart.length <= 9) {\n    return toWei(`${wholePart}.${decimalPart}`, 'gwei');\n  }\n\n  const decimalPartToRemove = decimalPart.slice(9);\n  const decimalRoundingDigit = decimalPartToRemove[0];\n\n  decimalPart = decimalPart.slice(0, 9);\n  let wei = toWei(`${wholePart}.${decimalPart}`, 'gwei');\n\n  if (Number(decimalRoundingDigit) >= 5) {\n    wei = wei.add(new BN(1));\n  }\n\n  return wei;\n}\n\n/**\n * Used to convert values from wei hex format to dec gwei format.\n *\n * @param hexValue - The value in hex wei.\n * @returns The value in dec gwei as string.\n */\nexport function weiHexToGweiDec(hexValue: string): string {\n  const hexWei = new BN(remove0x(hexValue), 16);\n  return fromWei(hexWei, 'gwei');\n}\n\n/**\n * Return a URL that can be used to obtain ETH for a given network.\n *\n * @param networkCode - Network code of desired network.\n * @param address - Address to deposit obtained ETH.\n * @param amount - How much ETH is desired.\n * @returns URL to buy ETH based on network.\n */\nexport function getBuyURL(\n  networkCode = '1',\n  address?: string,\n  amount = 5,\n): string | undefined {\n  switch (networkCode) {\n    case '1':\n      return `https://buy.coinbase.com/?code=9ec56d01-7e81-5017-930c-513daa27bb6a&amount=${amount}&address=${address}&crypto_currency=ETH`;\n    case '5':\n      return 'https://goerli-faucet.slock.it/';\n    case '11155111':\n      return 'https://sepoliafaucet.net/';\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Converts a hex string to a BN object.\n *\n * @param inputHex - Number represented as a hex string.\n * @returns A BN instance.\n */\nexport function hexToBN(inputHex: string): BN {\n  return inputHex ? new BN(remove0x(inputHex), 16) : new BN(0);\n}\n\n/**\n * A helper function that converts hex data to human readable string.\n *\n * @param hexValue - The hex string to convert to string.\n * @returns A human readable string conversion.\n */\nexport function hexToText(hexValue: string): string {\n  try {\n    const stripped = remove0x(hexValue);\n    // TODO: Use `@metamask/utils` version of this function to avoid use of\n    // Buffer.\n    // eslint-disable-next-line no-restricted-globals\n    const buff = Buffer.from(stripped, 'hex');\n    return buff.toString('utf8');\n  } catch {\n    /* istanbul ignore next */\n    return hexValue;\n  }\n}\n\n/**\n * Parses a hex string and converts it into a number that can be operated on in a bignum-safe,\n * base-10 way.\n *\n * @param value - A base-16 number encoded as a string.\n * @returns The number as a BN object in base-16 mode.\n */\nexport function fromHex(value: string | BN): BN {\n  if (BN.isBN(value)) {\n    return value;\n  }\n  return new BN(hexToBN(value).toString(10));\n}\n\n/**\n * Converts an integer to a hexadecimal representation.\n *\n * @param value - An integer, an integer encoded as a base-10 string, or a BN.\n * @returns The integer encoded as a hex string.\n */\nexport function toHex(value: number | bigint | string | BN): Hex {\n  if (typeof value === 'string' && isStrictHexString(value)) {\n    return value;\n  }\n  const hexString =\n    BN.isBN(value) || typeof value === 'bigint'\n      ? value.toString(16)\n      : new BN(value.toString(), 10).toString(16);\n  return `0x${hexString}`;\n}\n\n/**\n * Execute and return an asynchronous operation without throwing errors.\n *\n * @param operation - Function returning a Promise.\n * @param logError - Determines if the error should be logged.\n * @template Result - Type of the result of the async operation\n * @returns Promise resolving to the result of the async operation.\n */\nexport async function safelyExecute<Result>(\n  operation: () => Promise<Result>,\n  logError = false,\n): Promise<Result | undefined> {\n  try {\n    return await operation();\n  } catch (error) {\n    /* istanbul ignore next */\n    if (logError) {\n      console.error(error);\n    }\n    return undefined;\n  }\n}\n\n/**\n * Execute and return an asynchronous operation with a timeout.\n *\n * @param operation - Function returning a Promise.\n * @param logError - Determines if the error should be logged.\n * @param timeout - Timeout to fail the operation.\n * @template Result - Type of the result of the async operation\n * @returns Promise resolving to the result of the async operation.\n */\nexport async function safelyExecuteWithTimeout<Result>(\n  operation: () => Promise<Result>,\n  logError = false,\n  timeout = 500,\n): Promise<Result | undefined> {\n  try {\n    return await Promise.race([\n      operation(),\n      new Promise<never>((_resolve, reject) =>\n        setTimeout(() => {\n          reject(TIMEOUT_ERROR);\n        }, timeout),\n      ),\n    ]);\n  } catch (error) {\n    /* istanbul ignore next */\n    if (logError) {\n      console.error(error);\n    }\n    return undefined;\n  }\n}\n\n/**\n * Convert an address to a checksummed hexadecimal address.\n *\n * @param address - The address to convert.\n * @returns The address in 0x-prefixed hexadecimal checksummed form if it is valid.\n */\nfunction toChecksumHexAddressUnmemoized(address: string): string;\n\n/**\n * Convert an address to a checksummed hexadecimal address.\n *\n * Note that this particular overload does nothing.\n *\n * @param address - A value that is not a string (e.g. `undefined` or `null`).\n * @returns The `address` untouched.\n * @deprecated This overload is designed to gracefully handle an invalid input\n * and is only present for backward compatibility. It may be removed in a future\n * major version. Please pass a string to `toChecksumHexAddress` instead.\n */\nfunction toChecksumHexAddressUnmemoized<Type>(address: Type): Type;\n\nfunction toChecksumHexAddressUnmemoized(address: unknown): unknown {\n  if (typeof address !== 'string') {\n    // Mimic behavior of `addHexPrefix` from `ethereumjs-util` (which this\n    // function was previously using) for backward compatibility.\n    return address;\n  }\n\n  const hexPrefixed = add0x(address);\n\n  if (!isHexString(hexPrefixed)) {\n    // Version 5.1 of ethereumjs-util would have returned '0xY' for input 'y'\n    // but we shouldn't waste effort trying to change case on a clearly invalid\n    // string. Instead just return the hex prefixed original string which most\n    // closely mimics the original behavior.\n    return hexPrefixed;\n  }\n\n  try {\n    return getChecksumAddress(hexPrefixed);\n  } catch (error) {\n    // This is necessary for backward compatibility with the old behavior of\n    // `ethereumjs-util` which would return the original string if the address\n    // was invalid.\n    if (error instanceof Error && error.message === 'Invalid hex address.') {\n      return hexPrefixed;\n    }\n    throw error;\n  }\n}\n\n/**\n * Convert an address to a checksummed hexadecimal address.\n *\n * @param address - The address to convert. For backward compatibility reasons,\n * this can be anything, even a non-hex string with an 0x prefix, but that usage\n * is deprecated. Please use a valid hex string (with or without the `0x`\n * prefix).\n * @returns A 0x-prefixed checksummed version of `address` if it is a valid hex\n * string, or the address as given otherwise.\n */\nexport const toChecksumHexAddress: {\n  (address: string): string;\n  <Type>(address: Type): Type;\n} = memoize(toChecksumHexAddressUnmemoized);\n\nfunction isValidHexAddressUnmemoized(\n  possibleAddress: string,\n  { allowNonPrefixed = true } = {},\n): boolean {\n  const addressToCheck = allowNonPrefixed\n    ? add0x(possibleAddress)\n    : possibleAddress;\n  if (!isStrictHexString(addressToCheck)) {\n    return false;\n  }\n\n  // We used to rely on `isValidAddress` from `@ethereumjs/util` which allows\n  // for upper-case characters too. So we preserve this behavior and use our\n  // faster and memoized validation function instead.\n  return isHexChecksumAddress(addressToCheck);\n}\n\n/**\n * Validates that the input is a hex address. This utility method is a thin\n * wrapper around `isValidHexAddress` from `@metamask/utils`, with the exception\n * that it may return true for non-0x-prefixed hex strings (depending on the\n * option below).\n *\n * @param possibleAddress - Input parameter to check against.\n * @param options - The validation options.\n * @param options.allowNonPrefixed - If true will regard addresses without a\n * `0x` prefix as valid.\n * @returns Whether or not the input is a valid hex address.\n */\nexport const isValidHexAddress: (\n  possibleAddress: string,\n  options?: { allowNonPrefixed?: boolean },\n) => boolean = memoize(\n  isValidHexAddressUnmemoized,\n  (possibleAddress, { allowNonPrefixed = true } = {}) =>\n    `${possibleAddress}-${allowNonPrefixed}`,\n);\n\n/**\n * Returns whether the given code corresponds to a smart contract.\n *\n * @param code - The potential smart contract code.\n * @returns Whether the code was smart contract code or not.\n */\nexport function isSmartContractCode(code: string): boolean {\n  /* istanbul ignore if */\n  if (!code) {\n    return false;\n  }\n  // Geth will return '0x', and ganache-core v2.2.1 will return '0x0'\n  const smartContractCode = code !== '0x' && code !== '0x0';\n  return smartContractCode;\n}\n\n/**\n * An error representing a non-200 HTTP response.\n */\nexport class HttpError extends Error {\n  public httpStatus: number;\n\n  /**\n   * Construct an HTTP error.\n   *\n   * @param status - The HTTP response status.\n   * @param message - The error message.\n   */\n  constructor(status: number, message?: string) {\n    super(message ?? `Fetch failed with status '${status}'`);\n    this.httpStatus = status;\n  }\n}\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(\n  request: URL | RequestInfo,\n  options?: RequestInit,\n): Promise<Response> {\n  const response = await fetch(request, options);\n  if (!response.ok) {\n    throw new HttpError(\n      response.status,\n      // TODO: Replace `String` with more specific conversion.\n      // eslint-disable-next-line @typescript-eslint/no-base-to-string\n      `Fetch failed with status '${response.status}' for request '${String(request)}'`,\n    );\n  }\n  return response;\n}\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(\n  request: URL | RequestInfo,\n  options?: RequestInit,\n  // TODO: Replace `any` with more specific type.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> {\n  const response = await successfulFetch(request, options);\n  const object = await response.json();\n  return object;\n}\n\n/**\n * Execute fetch and return object response, log if known error thrown, otherwise rethrow error.\n *\n * @param request - the request options object\n * @param request.url - The request url to query.\n * @param request.options - The fetch options.\n * @param request.timeout - Timeout to fail request\n * @param request.errorCodesToCatch - array of error codes for errors we want to catch in a particular context\n * @returns The fetch response JSON data or undefined (if error occurs).\n */\nexport async function fetchWithErrorHandling({\n  url,\n  options,\n  timeout,\n  errorCodesToCatch,\n}: {\n  url: string;\n  options?: RequestInit;\n  timeout?: number;\n  errorCodesToCatch?: number[];\n  // TODO: Replace `any` with more specific type.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n}): Promise<any> {\n  let result;\n  try {\n    if (timeout) {\n      result = Promise.race([\n        await handleFetch(url, options),\n        new Promise<Response>((_resolve, reject) =>\n          setTimeout(() => {\n            reject(TIMEOUT_ERROR);\n          }, timeout),\n        ),\n      ]);\n    } else {\n      result = await handleFetch(url, options);\n    }\n  } catch (error) {\n    logOrRethrowError(error, errorCodesToCatch);\n  }\n  return result;\n}\n\n/**\n * Fetch that fails after timeout.\n *\n * @param url - Url to fetch.\n * @param options - Options to send with the request.\n * @param timeout - Timeout to fail request.\n * @returns Promise resolving the request.\n */\nexport async function timeoutFetch(\n  url: string,\n  options?: RequestInit,\n  timeout = 500,\n): Promise<Response> {\n  return Promise.race([\n    successfulFetch(url, options),\n    new Promise<Response>((_resolve, reject) =>\n      setTimeout(() => {\n        reject(TIMEOUT_ERROR);\n      }, timeout),\n    ),\n  ]);\n}\n\n/**\n * Normalizes the given ENS name.\n *\n * @param ensName - The ENS name.\n * @returns The normalized ENS name string.\n */\nexport function normalizeEnsName(ensName: string): string | null {\n  // `.` refers to the registry root contract\n  if (ensName === '.') {\n    return ensName;\n  }\n  if (ensName && typeof ensName === 'string') {\n    try {\n      const normalized = ensNamehash.normalize(ensName.trim());\n      // this regex is only sufficient with the above call to ensNamehash.normalize\n      // TODO: change 7 in regex to 3 when shorter ENS domains are live\n      if (normalized.match(/^(([\\w\\d-]+)\\.)*[\\w\\d-]{7,}\\.(eth|test)$/u)) {\n        return normalized;\n      }\n    } catch {\n      // do nothing\n    }\n  }\n  return null;\n}\n\n/**\n * Wrapper method to handle EthQuery requests.\n *\n * @param ethQuery - EthQuery object initialized with a provider.\n * @param method - Method to request.\n * @param args - Arguments to send.\n * @returns Promise resolving the request.\n */\nexport function query(\n  ethQuery: EthQuery,\n  method: string,\n  // TODO: Replace `any` with type\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  args: any[] = [],\n  // TODO: Replace `any` with type\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> {\n  return new Promise((resolve, reject) => {\n    const callback = (error: unknown, result: unknown): void => {\n      if (error) {\n        // We don't control the error object returned by eth-query, so\n        // we can't guarantee it's an instance of Error.\n        // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n        reject(error);\n        return;\n      }\n      resolve(result);\n    };\n\n    // Using `in` rather than `hasProperty` so that we look up the prototype\n    // chain for the method.\n    if (method in ethQuery && typeof ethQuery[method] === 'function') {\n      ethQuery[method](...args, callback);\n    } else {\n      ethQuery.sendAsync({ method, params: args }, callback);\n    }\n  });\n}\n\n/**\n * Converts valid hex strings to decimal numbers, and handles unexpected arg types.\n *\n * @param value - a string that is either a hexadecimal with `0x` prefix or a decimal string.\n * @returns a decimal number.\n */\nexport const convertHexToDecimal = (\n  value: string | undefined = '0x0',\n): number => {\n  if (isStrictHexString(value)) {\n    return parseInt(value, 16);\n  }\n\n  return Number(value) ? Number(value) : 0;\n};\n\ntype PlainObject = Record<number | string | symbol, unknown>;\n\n/**\n * Determines whether a value is a \"plain\" object.\n *\n * @param value - A value to check\n * @returns True if the passed value is a plain object\n */\nexport function isPlainObject(value: unknown): value is PlainObject {\n  return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Like {@link Array}, but always non-empty.\n *\n * @template T - The non-empty array member type.\n */\nexport type NonEmptyArray<Type> = [Type, ...Type[]];\n\n/**\n * Type guard for {@link NonEmptyArray}.\n *\n * @template T - The non-empty array member type.\n * @param value - The value to check.\n * @returns Whether the value is a non-empty array.\n */\nexport function isNonEmptyArray<Type>(\n  value: Type[],\n): value is NonEmptyArray<Type> {\n  return Array.isArray(value) && value.length > 0;\n}\n\n/**\n * Type guard for {@link Json}.\n *\n * @param value - The value to check.\n * @returns Whether the value is valid JSON.\n */\nexport function isValidJson(value: unknown): value is Json {\n  try {\n    return deepEqual(value, JSON.parse(JSON.stringify(value)));\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Utility method to log if error is a common fetch error and otherwise rethrow it.\n *\n * @param error - Caught error that we should either rethrow or log to console\n * @param codesToCatch - array of error codes for errors we want to catch and log in a particular context\n */\nfunction logOrRethrowError(error: unknown, codesToCatch: number[] = []): void {\n  if (!error) {\n    return;\n  }\n\n  if (error instanceof Error) {\n    const includesErrorCodeToCatch = codesToCatch.some((code) =>\n      error.message.includes(`Fetch failed with status '${code}'`),\n    );\n\n    if (\n      includesErrorCodeToCatch ||\n      error.message.includes('Failed to fetch') ||\n      error === TIMEOUT_ERROR\n    ) {\n      console.error(error);\n    } else {\n      throw error;\n    }\n  } else {\n    // eslint-disable-next-line @typescript-eslint/only-throw-error\n    throw error;\n  }\n}\n\n/**\n * Checks if two strings are equal, ignoring case.\n *\n * @param value1 - The first string to compare.\n * @param value2 - The second string to compare.\n * @returns `true` if the strings are equal, ignoring case; otherwise, `false`.\n */\nexport function isEqualCaseInsensitive(\n  value1: string,\n  value2: string,\n): boolean {\n  if (typeof value1 !== 'string' || typeof value2 !== 'string') {\n    return false;\n  }\n  return value1.toLowerCase() === value2.toLowerCase();\n}\n"]}