assembly/composables/useBigNumber.ts
Georges KABBOUCHI c00e17bd22 makerdao wip
2021-08-08 14:34:44 +03:00

232 lines
4.7 KiB
TypeScript

import BigNumber from "bignumber.js";
BigNumber.config({ POW_PRECISION: 200 })
export function useBigNumber() {
/**
* Returns value as BigNumber if it exists and can be parsed by BigNumber,
* otherwise returns BigNumber('0')
* @param {*} value
* @returns BigNumber
*/
function ensureValue(value: BigNumber.Value) {
if (!value) return new BigNumber("0");
if (new BigNumber(value).isNaN()) return new BigNumber("0");
return new BigNumber(value);
}
/**
* Ensures value before convert to BigNumber
* @param {*} value
* @returns BigNumber
*/
function toBN(value: BigNumber.Value) {
return ensureValue(value);
}
/**
* coerce value to boolean(uses same rules as js)
* @param {*} val
* @returns {boolean}
*/
function isZero(val: BigNumber.Value) {
return toBN(val).isZero();
}
/**
* Multiply value and multiplier
* @param {*} value
* @param {*} multiplier
* @returns BigNumber
*/
function times(value: BigNumber.Value, multiplier: BigNumber.Value) {
return toBN(value).times(toBN(multiplier));
}
/**
* Divides value and divisor. Protected from NaN if no divisor
* @param {*} value
* @param {*} divisor
* @returns BigNumber
*/
function div(value: BigNumber.Value, divisor: BigNumber.Value) {
if (isZero(divisor) || isZero(value)) return toBN("0");
return toBN(value).div(toBN(divisor));
}
/**
* subtraction values
* @param {*} value
* @param {*} subtractor
* @returns BigNumber
*/
function minus(value: BigNumber.Value, subtractor: BigNumber.Value) {
return toBN(value).minus(toBN(subtractor));
}
/**
* sum value
* @param {*} value
* @param {*} adder
* @returns BigNumber
*/
function plus(value: BigNumber.Value, adder: BigNumber.Value) {
return toBN(value).plus(toBN(adder));
}
/**
* Exponent value to power
* @param {*} value
* @param {*} exponent
* @returns BigNumber
*/
function pow(value: BigNumber.Value, exponent: BigNumber.Value) {
return toBN(value).pow(toBN(exponent));
}
/**
* Get Max from ...arguments
* @returns BigNumber
*/
function max(...args) {
return BigNumber.max(...args);
}
/**
* Get Min from ...arguments
* @returns BigNumber
*/
function min(...args: BigNumber.Value[]) {
return BigNumber.min(...args);
}
/**
* Greater then (>)
* @param {*} value
* @param {*} compareWith
* @returns {boolean}
*/
function gt(value: BigNumber.Value, compareWith: BigNumber.Value) {
return toBN(value).gt(toBN(compareWith));
}
/**
* Equal (===)
* @param {*} value
* @param {*} compareWith
* @returns {boolean}
*/
function eq(value: BigNumber.Value, compareWith: BigNumber.Value) {
return toBN(value).eq(toBN(compareWith));
}
/**
* Less then (<)
* @param {*} value
* @param {*} compareWith
* @returns {boolean}
*/
function lt(value: BigNumber.Value, compareWith: BigNumber.Value) {
return toBN(value).lt(toBN(compareWith));
}
/**
* Less then or equal (<=)
* @param {*} value
* @param {*} compareWith
* @returns {boolean}
*/
function lte(value: BigNumber.Value, compareWith: BigNumber.Value) {
return toBN(value).lte(toBN(compareWith));
}
/**
* Greater then or equal (>=)
* @param {*} value
* @param {*} compareWith
* @returns {boolean}
*/
function gte(value: BigNumber.Value, compareWith: BigNumber.Value) {
return toBN(value).gte(toBN(compareWith));
}
/**
* Checks if value is BigNumber instance
* @param {*} value
* @returns {boolean}
*/
function isBigNumber(value: BigNumber.Value) {
return BigNumber.isBigNumber(value);
}
/**
*
* @param {*} value
* @returns {boolean}
*/
function isNegative(value: BigNumber.Value) {
return toBN(value).isNegative();
}
/**
*
* @param {*} value
* @returns {boolean}
*/
function isPositive(value: BigNumber.Value) {
return toBN(value).isPositive();
}
/**
* Return absolute value
* @param {*} value
* @returns BigNumber
*/
function abs(value: BigNumber.Value) {
return toBN(value).abs();
}
/**
* Returns value multiplied by -1
* @param {*} value
* @returns BigNumber
*/
function negated(value: BigNumber.Value) {
return toBN(value).negated();
}
/**
* Rounds to INT like Math.floor
* @param {*} value
* @returns BigNumber
*/
function intRoundFloor(value: BigNumber.Value) {
return toBN(value).dp(0, 3);
}
return {
isZero,
toBN,
ensureValue,
times,
plus,
pow,
minus,
div,
max,
min,
eq,
gt,
lt,
lte,
gte,
isBigNumber,
isNegative,
isPositive,
abs,
negated,
intRoundFloor
};
}