{"version":3,"file":"index.cjs","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["/**\n * Determines if all the passed args are strings\n * @param args The arguments to check\n */\nexport function isString(...args: unknown[]) {\n  return args.every(arg => typeof arg === 'string');\n}\n\n/**\n * Determines if all the passed args are numbers\n * @param args The arguments to check\n */\nexport function isNumber(...args: unknown[]) {\n  return args.every(arg => typeof arg === 'number');\n}\n\n/**\n * Determines if all the passed args are bigints\n * @param args The arguments to check\n */\nexport function isBigInt(...args: unknown[]) {\n  return args.every(arg => typeof arg === 'bigint');\n}\n","import { isBigInt, isNumber, isString } from \"./utils.js\";\n\n// Conditional return type\ntype ReturnType = \"string\" | \"bigint\" | \"number\";\ntype RT<T extends ReturnType> = T extends \"string\"\n\t? string\n\t: T extends \"bigint\"\n\t\t? bigint\n\t\t: number;\n\nexport const ReturnTypes = {\n\tString: \"string\" as const,\n\tBigInt: \"bigint\" as const,\n\tNumber: \"number\" as const,\n};\n\n/**\n * Convert token-sat to token\n * @param tokenSat Amount of token-sat to convert. Must be a whole number\n * @param decimals Number of decimal places for the token\n * @param returnString Optionally return the value as a string\n */\nexport function toToken<T extends ReturnType = \"number\">(\n\ttokenSat: number | string | bigint,\n\tdecimals: number,\n\treturnType?: T,\n): RT<T> {\n\tif (!isString(tokenSat) && !isNumber(tokenSat)) {\n\t\tthrow new TypeError(\n\t\t\t`toToken must be called on a number or string, got ${typeof tokenSat}`,\n\t\t);\n\t}\n\tif (!Number.isInteger(Number(tokenSat))) {\n\t\tthrow new TypeError(\n\t\t\t\"toToken must be called on a whole number or string format whole number\",\n\t\t);\n\t}\n\tif (!Number.isInteger(decimals) || decimals < 0) {\n\t\tthrow new TypeError(\"decimals must be a non-negative integer\");\n\t}\n\n\tlet tokenSatBig = 0n;\n\tconst isNegative =\n\t\ttypeof tokenSat === \"string\" ? tokenSat.startsWith(\"-\") : tokenSat < 0;\n\n\tswitch (typeof tokenSat) {\n\t\tcase \"bigint\":\n\t\t\ttokenSatBig = tokenSat;\n\t\t\tbreak;\n\t\tcase \"string\":\n\t\t\ttokenSatBig = BigInt(tokenSat.replace(\"-\", \"\").split(\".\")[0]);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ttokenSatBig = BigInt(Math.abs(Math.round(tokenSat)));\n\t}\n\n\tconst sign = isNegative ? -1n : 1n;\n\tconst intPart = tokenSatBig / 10n ** BigInt(decimals);\n\tconst decPart = tokenSatBig % 10n ** BigInt(decimals);\n\n\tswitch (returnType) {\n\t\tcase \"bigint\":\n      if (decPart > 0) {\n        throw new Error(\"toToken: Cannot return a bigint with decimal part\");\n      }\n\t\t\treturn (intPart * sign) as RT<T>;\n\t\tcase \"string\":\n\t\t\treturn `${isNegative && (intPart > 0 || decPart > 0) ? \"-\" : \"\"}${intPart}.${decPart.toString().padStart(decimals, \"0\")}` as RT<T>;\n\t\tdefault:\n\t\t\treturn Number(\n\t\t\t\t`${isNegative && (intPart > 0 || decPart > 0) ? \"-\" : \"\"}${intPart}.${decPart.toString().padStart(decimals, \"0\")}`,\n\t\t\t) as RT<T>;\n\t}\n}\n\n/**\n * Convert token to token-sat\n * @param token Amount of token to convert\n * @param decimals Number of decimal places for the token\n * @param returnString Optionally return the value as a string\n */\nexport function toTokenSat<T extends ReturnType = \"number\">(\n\ttoken: number | string | bigint,\n\tdecimals: number,\n\treturnType?: T,\n): RT<T> {\n\tif (!isString(token) && !isNumber(token) && !isBigInt(token)) {\n\t\tthrow new TypeError(\n\t\t\t`toTokenSat must be called on a number, string or bigint, got ${typeof token}`,\n\t\t);\n\t}\n\n\tif (!Number.isInteger(decimals) || decimals < 0) {\n\t\tthrow new TypeError(\"decimals must be a non-negative integer\");\n\t}\n\n\tlet result = \"\";\n\tconst isNegative =\n\t\ttypeof token === \"string\" ? token.startsWith(\"-\") && token !== \"-0\": token < 0;\n\n\tswitch (typeof token) {\n\t\tcase \"bigint\":\n\t\t\tresult = (token * 10n ** BigInt(decimals)).toString();\n\t\t\tbreak;\n\t\tcase \"string\": {\n\t\t\tconst absToken = token.replace(\"-\", \"\");\n\t\t\tconst [intStr, decStr] = absToken.split(\".\");\n\t\t\tresult = intStr + (decStr || \"\").padEnd(decimals, \"0\");\n\t\t\tif (isNegative && (intStr !== \"0\" || decStr !== \"0\")) result = `-${result}`;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\t// result = Math.round(token * (10 ** decimals)).toString();\n\t\t\tresult = (\n\t\t\t\tMath.round(Math.abs(token) * 10 ** decimals) * (isNegative ? -1 : 1)\n\t\t\t).toString();\n\t}\n\n\tswitch (returnType) {\n\t\tcase \"bigint\":\n\t\t\treturn BigInt(result) as RT<T>;\n\t\tcase \"string\":\n\t\t\treturn result as RT<T>;\n\t\tdefault: {\n\t\t\tlet resultNum: number;\n\t\t\ttry {\n\t\t\t\tresultNum = Number(result);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new Error(`Invalid number: ${result}`);\n\t\t\t}\n\n\t\t\tif (!Number.isSafeInteger(Math.round(resultNum))) {\n\t\t\t\tthrow new Error(\"Integer overflow. Try returning a string instead.\");\n\t\t\t}\n\t\t\treturn resultNum as RT<T>;\n\t\t}\n\t}\n}\n\n/**\n * Convert Bitcoin to Satoshis\n * @param token Amount of token to convert\n * @param returnString Optionally return the value as a string\n */\nexport function toSatoshi<T extends ReturnType = \"number\">(\n\ttoken: number | string | bigint,\n\treturnType?: T,\n): RT<T> {\n\treturn toTokenSat(token, 8, returnType);\n}\n\n/**\n * Convert Satoshis to Bitcoin\n * @param tokenSat Amount of token-sat to convert\n * @param returnString Optionally return the value as a string\n */\nexport function toBitcoin<T extends ReturnType = \"number\">(\n\ttokenSat: number | string | bigint,\n\treturnType?: T,\n): RT<T> {\n\treturn toToken(tokenSat, 8, returnType);\n}\n"],"names":["isString","slice","call","arguments","every","arg","isNumber","toToken","tokenSat","decimals","returnType","TypeError","Number","isInteger","tokenSatBig","isNegative","startsWith","BigInt","replace","split","Math","abs","round","sign","intPart","pow","decPart","Error","toString","padStart","toTokenSat","token","isBigInt","result","_absToken$split","intStr","decStr","padEnd","resultNum","e","isSafeInteger","String"],"mappings":"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"}