1 line
13 KiB
Plaintext
1 line
13 KiB
Plaintext
{"version":3,"sources":["../../src/utils/number.util.ts"],"sourcesContent":["import Web3 from 'web3'\nimport { BN } from 'ethereumjs-util'\n\n/**\n * Converts some token minimal unit to render format string, showing 5 decimals\n *\n * @param {Number|String|BN} tokenValue - Token value to convert\n * @param {Number} decimals - Token decimals to convert\n * @param {Number} decimalsToShow - Decimals to 5\n * @returns {String} - Number of token minimal unit, in render format\n * If value is less than 5 precision decimals will show '< 0.00001'\n */\nexport function renderFromTokenMinimalUnit(tokenValue, decimals, decimalsToShow = 5) {\n const minimalUnit = fromTokenMinimalUnit(tokenValue || 0, decimals)\n const minimalUnitNumber = parseFloat(minimalUnit)\n let renderMinimalUnit\n if (minimalUnitNumber < 0.00001 && minimalUnitNumber > 0) {\n renderMinimalUnit = '< 0.00001'\n } else {\n const base = Math.pow(10, decimalsToShow)\n renderMinimalUnit = (Math.round(minimalUnitNumber * base) / base).toString()\n }\n return renderMinimalUnit\n}\n/**\n * Converts token minimal unit to readable string value\n *\n * @param {number|string|Object} minimalInput - Token minimal unit to convert\n * @param {string} decimals - Token decimals to convert\n * @returns {string} - String containing the new number\n */\nexport function fromTokenMinimalUnit(minimalInput, decimals) {\n minimalInput = addHexPrefix(Number(minimalInput).toString(16))\n let minimal = safeNumberToBN(minimalInput)\n const negative = minimal.lt(new BN(0))\n const base = Web3.utils.toBN(Math.pow(10, decimals).toString())\n\n if (negative) {\n minimal = minimal.mul(new BN(-1))\n }\n let fraction = minimal.mod(base).toString(10)\n while (fraction.length < decimals) {\n fraction = '0' + fraction\n }\n fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1]\n const whole = minimal.div(base).toString(10)\n let value = '' + whole + (fraction === '0' ? '' : '.' + fraction)\n if (negative) {\n value = '-' + value\n }\n return value\n}\n\n/**\n * Converts wei to render format string, showing 5 decimals\n *\n * @param {Number|String|BN} value - Wei to convert\n * @param {Number} decimalsToShow - Decimals to 5\n * @returns {String} - Number of token minimal unit, in render format\n * If value is less than 5 precision decimals will show '< 0.00001'\n */\nexport function renderFromWei(value, decimalsToShow = 5) {\n let renderWei = '0'\n // avoid undefined\n if (value) {\n const wei = Web3.utils.fromWei(value)\n const weiNumber = parseFloat(wei)\n if (weiNumber < 0.00001 && weiNumber > 0) {\n renderWei = '< 0.00001'\n } else {\n const base = Math.pow(10, decimalsToShow)\n renderWei = (Math.round(weiNumber * base) / base).toString()\n }\n }\n return renderWei\n}\n\n/**\n * Converts token BN value to hex string number to be sent\n *\n * @param {Object} value - BN instance to convert\n * @param {number} decimals - Decimals to be considered on the conversion\n * @returns {string} - String of the hex token value\n */\nexport function calcTokenValueToSend(value, decimals) {\n return value ? (value * Math.pow(10, decimals)).toString(16) : 0\n}\n\n/**\n * Determines if a string is a valid decimal\n *\n * @param {string} value - String to check\n * @returns {boolean} - True if the string is a valid decimal\n */\nexport function isDecimal(value) {\n return Number.isFinite(parseFloat(value)) && !Number.isNaN(parseFloat(value)) && !isNaN(+value)\n}\n\n/**\n * Creates a BN object from a string\n *\n * @param {string} value - Some numeric value represented as a string\n * @returns {Object} - BN instance\n */\nexport function toBN(value) {\n return Web3.utils.toBN(value)\n}\n\n/**\n * Prefixes a hex string with '0x' or '-0x' and returns it. Idempotent.\n *\n * @param {string} str - The string to prefix.\n * @returns {string} The prefixed string.\n */\nexport const addHexPrefix = (str: string) => {\n if (typeof str !== 'string' || str.match(/^-?0x/u)) {\n return str\n }\n\n if (str.match(/^-?0X/u)) {\n return str.replace('0X', '0x')\n }\n\n if (str.startsWith('-')) {\n return str.replace('-', '-0x')\n }\n\n return `0x${str}`\n}\n\n/**\n * Wraps 'numberToBN' method to avoid potential undefined and decimal values\n *\n * @param {number|string} value - number\n * @returns {Object} - The converted value as BN instance\n */\nexport function safeNumberToBN(value: number | string) {\n const safeValue = fastSplit(value.toString()) || '0'\n return numberToBN(safeValue)\n}\n\n/**\n * Performs a fast string split and returns the first item of the string based on the divider provided\n *\n * @param {number|string} value - number/string to be splitted\n * @param {string} divider - string value to use to split the string (default '.')\n * @returns {string} - the selected splitted element\n */\n\nexport function fastSplit(value, divider = '.') {\n value += ''\n const [from, to] = [value.indexOf(divider), 0]\n return value.substring(from, to) || value\n}\n\nexport function stripHexPrefix(str: string) {\n if (typeof str !== 'string') {\n return str\n }\n\n return str.slice(0, 2) === '0x' ? str.slice(2) : str\n}\n\nexport function numberToBN(arg) {\n if (typeof arg === 'string' || typeof arg === 'number') {\n var multiplier = Web3.utils.toBN(1); // eslint-disable-line\n var formattedString = String(arg).toLowerCase().trim()\n var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x'\n var stringArg = stripHexPrefix(formattedString); // eslint-disable-line\n if (stringArg.substr(0, 1) === '-') {\n stringArg = stripHexPrefix(stringArg.slice(1))\n multiplier = Web3.utils.toBN(-1)\n }\n stringArg = stringArg === '' ? '0' : stringArg\n\n if (\n (!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/)) ||\n stringArg.match(/^[a-fA-F]+$/) ||\n (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/))\n ) {\n return Web3.utils.toBN(stringArg).mul(multiplier)\n }\n\n if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) {\n return Web3.utils.toBN(stringArg).mul(multiplier)\n }\n } else if (typeof arg === 'object' && arg.toString && !arg.pop && !arg.push) {\n if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) {\n return Web3.utils.toBN(arg.toString(10))\n }\n }\n\n throw new Error(\n '[number-to-bn] while converting number ' +\n JSON.stringify(arg) +\n ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.',\n )\n}\n\nfunction checkRadixLegal(radix) {\n return radix >= 2 && radix <= 62\n}\n\n/**\n * 将letter转为纯数字\n * @param {string} letter\n * @returns {number}\n */\nfunction transformCharToNum(letter, base) {\n if (base <= 36) {\n letter = letter.toLowerCase()\n }\n if (letter >= '0' && letter <= '9') {\n return parseInt(letter)\n }\n if (letter >= 'a' && letter <= 'z') {\n return letter.charCodeAt(0) - 'a'.charCodeAt(0) + 10\n }\n if (letter >= 'A' && letter <= 'Z') {\n return letter.charCodeAt(0) - 'A'.charCodeAt(0) + 36\n }\n return 0\n}\n\n/**\n * 将数字转为进制里的字母\n * @param {number} num\n * @return {string}\n */\nfunction transformNumToChar(num, alphabet) {\n alphabet = alphabet || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n return alphabet.charAt(num)\n}\n\n/**\n * Converts a number from the base specified by `base` to the base specified by `to`.\n * @param {string} numStr - The number string to be converted.\n * @param {number} base - The base of the number.\n * @param {number} to - The target base for the conversion.\n * @return {string} - The converted number string.\n */\nexport function convert({\n numStr,\n base,\n to,\n alphabet,\n}: {\n numStr: string\n base: number\n to: number\n alphabet?: string\n}): string {\n // 当base和to相等 或 base和to超出转换范围,则原样返回\n if (base === to || !checkRadixLegal(base) || !checkRadixLegal(to)) {\n return numStr\n }\n\n // 先转成10进制\n let p = 0\n let number10 = 0\n while (p < numStr.length) {\n number10 *= base\n number10 += transformCharToNum(numStr.charAt(p), base)\n p++\n }\n // 若要转换的正好是进制,则直接返回\n if (to === 10) {\n return number10.toString()\n }\n let result = ''\n let cur\n while (number10) {\n cur = number10 % to\n result = transformNumToChar(cur, alphabet) + result\n number10 = Math.floor(number10 / to)\n }\n return result\n}\n"],"mappings":"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","names":["Web3"]} |