@xlink-network/xlink-sdk
Version:
1 lines • 15.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils/BigNumber.ts"],"sourcesContent":["import { Big, BigSource } from \"big.js\"\nimport { OneOrMore } from \"./typeHelpers\"\nimport { last } from \"./arrayHelpers\"\nimport { reduce } from \"./arrayHelpers\"\n\nBig.PE = 21\nBig.NE = -21\n\nexport type BigNumberSource = number | bigint | string | Big | BigNumber\n\nconst toBig = (num: BigNumberSource): Big => {\n if (num instanceof Big) {\n return num\n }\n\n return new Big(num as BigSource)\n}\n\nconst fromBig = (num: Big): BigNumber => {\n return num as unknown as BigNumber\n}\n\nexport type BigNumber = Omit<Big, keyof Big> & {\n ___B: \"BigNumber\"\n}\nexport namespace BigNumber {\n export const { roundUp, roundDown, roundHalfUp, roundHalfEven } = Big\n export type RoundingMode =\n | typeof roundUp\n | typeof roundDown\n | typeof roundHalfUp\n | typeof roundHalfEven\n\n let defaultRoundingMode: RoundingMode = roundHalfUp\n export const setDefaultRoundingMode = (roundingMode: RoundingMode): void => {\n defaultRoundingMode = roundingMode\n }\n\n export const isBigNumber = (num: any): num is BigNumber => {\n return num instanceof Big\n }\n\n export const safeFrom = (value: BigNumberSource): undefined | BigNumber => {\n try {\n return from(value)\n } catch (e) {\n return undefined\n }\n }\n\n export const from = (value: BigNumberSource): BigNumber => {\n return fromBig(toBig(value as any))\n }\n\n export const toString = (value: BigNumberSource): string => {\n return toBig(value).toString()\n }\n\n export const toNumber = (value: BigNumberSource): number => {\n return toBig(value).toNumber()\n }\n\n export const toBigInt = curry2(\n (\n options: {\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): bigint => {\n return BigInt(\n toFixed(\n {\n precision: 0,\n roundingMode: options.roundingMode ?? defaultRoundingMode,\n },\n toBig(value),\n ),\n )\n },\n )\n\n export const toFixed = curry2(\n (\n options: {\n precision?: number\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): string => {\n return toBig(value).toFixed(\n options.precision,\n options.roundingMode ?? defaultRoundingMode,\n )\n },\n )\n\n export const toExponential = curry2(\n (\n options: {\n precision?: number\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): string => {\n return toBig(value).toExponential(\n options.precision,\n options.roundingMode ?? defaultRoundingMode,\n )\n },\n )\n\n export const isNegative = (value: BigNumberSource): boolean => {\n return toBig(value).lt(0)\n }\n\n export const isGtZero = (value: BigNumberSource): boolean => {\n return toBig(value).gt(0)\n }\n\n export const isZero = (value: BigNumberSource): boolean => {\n return toBig(value).eq(0)\n }\n\n export const isEq = curry2(\n (value: BigNumberSource, a: BigNumberSource): boolean => {\n return toBig(value).eq(toBig(a))\n },\n )\n\n export const isGt = curry2(\n (value: BigNumberSource, a: BigNumberSource): boolean => {\n return toBig(value).gt(toBig(a))\n },\n )\n\n export const isGte = curry2(\n (value: BigNumberSource, a: BigNumberSource): boolean => {\n return toBig(value).gte(toBig(a))\n },\n )\n\n export const isLt = curry2(\n (value: BigNumberSource, a: BigNumberSource): boolean => {\n return toBig(value).lt(toBig(a))\n },\n )\n\n export const isLte = curry2(\n (value: BigNumberSource, a: BigNumberSource): boolean => {\n return toBig(value).lte(toBig(a))\n },\n )\n\n export const setPrecision = curry2(\n (\n options: {\n precision?: number\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): BigNumber => {\n return fromBig(\n toBig(\n toBig(value).toPrecision(\n options.precision,\n options.roundingMode ?? defaultRoundingMode,\n ),\n ),\n )\n },\n )\n\n export const getPrecision = (value: BigNumberSource): number => {\n return toBig(value).c.length - (toBig(value).e + 1)\n }\n\n export const getIntegerLength = (value: BigNumberSource): number => {\n return toBig(value).e + 1\n }\n\n export const leftMoveDecimals = curry2(\n (distance: number, value: BigNumberSource): BigNumber =>\n moveDecimals({ distance }, value),\n )\n\n export const rightMoveDecimals = curry2(\n (distance: number, value: BigNumberSource): BigNumber =>\n moveDecimals({ distance: -distance }, value),\n )\n\n export const moveDecimals = curry2(\n (options: { distance: number }, value: BigNumberSource): BigNumber => {\n if (options.distance > 0) {\n return fromBig(toBig(value).div(10 ** options.distance))\n }\n\n if (options.distance < 0) {\n return fromBig(toBig(value).mul(10 ** -options.distance))\n }\n\n // distance === 0\n return from(value)\n },\n )\n\n export const getDecimalPart = curry2(\n (\n options: { precision: number },\n value: BigNumberSource,\n ): undefined | string => {\n /**\n * `toString` will return `\"1e-8\"` in some case, so we choose `toFixed` here\n */\n const formatted = toFixed(\n {\n precision: Math.min(getPrecision(value), options.precision),\n roundingMode: roundDown,\n },\n value,\n )\n\n const [, decimals] = formatted.split(\".\")\n if (decimals == null) return undefined\n return decimals\n },\n )\n\n export const abs = (value: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).abs())\n }\n\n export const neg = (value: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).neg())\n }\n\n export const sqrt = (value: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).sqrt())\n }\n\n export const add = curry2(\n (value: BigNumberSource, a: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).add(toBig(a)))\n },\n )\n\n export const minus = curry2(\n (value: BigNumberSource, a: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).minus(toBig(a)))\n },\n )\n\n export const mul = curry2(\n (value: BigNumberSource, a: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).mul(toBig(a)))\n },\n )\n /**\n * @example\n * cumulativeMul(v, [a, b, c]) // =>\n * [\n * v,\n * v * a,\n * v * a * b,\n * v * a * b * c\n * ]\n */\n export const cumulativeMul = curry2(\n (\n value: BigNumberSource,\n as: readonly BigNumberSource[],\n ): OneOrMore<BigNumber> => {\n return reduce(\n (acc: OneOrMore<BigNumber>, currentRate: BigNumberSource) => [\n ...acc,\n BigNumber.mul(last(acc)!, currentRate),\n ],\n [from(value)],\n as,\n )\n },\n )\n\n export const div = curry2(\n (value: BigNumberSource, a: BigNumberSource): BigNumber => {\n return fromBig(toBig(value).div(toBig(a)))\n },\n )\n\n export const pow = curry2((value: BigNumberSource, a: number): BigNumber => {\n return fromBig(toBig(value).pow(a))\n })\n\n export const round = curry2(\n (\n options: {\n precision?: number\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): BigNumber => {\n return fromBig(\n toBig(value).round(\n options.precision,\n options.roundingMode ?? defaultRoundingMode,\n ),\n )\n },\n )\n\n export const toPrecision = curry2(\n (\n options: {\n precision?: number\n roundingMode?: RoundingMode\n },\n value: BigNumberSource,\n ): string => {\n return toBig(value).toPrecision(\n options.precision,\n options.roundingMode ?? defaultRoundingMode,\n )\n },\n )\n\n export const ascend = curry2(\n (a: BigNumberSource, b: BigNumberSource): -1 | 0 | 1 =>\n isLt(a, b) ? -1 : isGt(a, b) ? 1 : 0,\n )\n\n export const descend = curry2(\n (a: BigNumberSource, b: BigNumberSource): -1 | 0 | 1 =>\n isLt(a, b) ? 1 : isGt(a, b) ? -1 : 0,\n )\n\n export const sort = (\n comparator: (a: BigNumber, b: BigNumber) => -1 | 0 | 1,\n numbers: readonly BigNumberSource[],\n ): BigNumber[] => {\n const _numbers = numbers.map(a => fromBig(toBig(a)))\n _numbers.sort(comparator)\n return _numbers\n }\n\n export const max = (numbers: OneOrMore<BigNumberSource>): BigNumber => {\n return from(sort(descend, numbers)[0]!)\n }\n\n export const min = (numbers: OneOrMore<BigNumberSource>): BigNumber => {\n return from(sort(ascend, numbers)[0]!)\n }\n\n export const clamp = (\n range: [min: BigNumber, max: BigNumber],\n n: BigNumber,\n ): BigNumber => {\n const [min, max] = range\n if (isGte(n, max)) return max\n if (isLte(n, min)) return min\n return n\n }\n\n export const sum = (numbers: BigNumberSource[]): BigNumber => {\n return numbers\n .map(n => fromBig(toBig(n)))\n .reduce((acc, n) => add(acc, n), ZERO)\n }\n\n export const ZERO = BigNumber.from(0)\n export const ONE = BigNumber.from(1)\n}\n\ninterface Curry2<Args extends [any, any], Ret> {\n (a: Args[0]): (b: Args[1]) => Ret\n (a: Args[0], b: Args[1]): Ret\n}\nfunction curry2<Args extends [any, any], Ret>(\n fn: (...args: Args) => Ret,\n): Curry2<Args, Ret> {\n return function (a: Args[0], b?: Args[1]): Ret {\n if (arguments.length > 1) {\n return (fn as any)(a, b)\n }\n return ((b: Args[1]): Ret => (fn as any)(a, b)) as any\n } as any\n}\n"],"mappings":"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","names":["BigNumber","min","max","b"]}