@sushiswap/math
Version:
288 lines (274 loc) • 8.79 kB
JavaScript
// src/Big.ts
import Big from "big.js";
import toFormat from "toformat";
Big.strict = true;
var Big_default = toFormat(Big);
// src/constants/numbers.ts
import JSBI3 from "jsbi";
// src/Percent.ts
import JSBI2 from "jsbi";
// src/Fraction.ts
import JSBI from "jsbi";
import invariant from "tiny-invariant";
// src/Decimal.ts
import Decimal from "decimal.js-light";
import toFormat2 from "toformat";
var Decimal_default = toFormat2(Decimal);
// src/Rounding.ts
var Rounding = /* @__PURE__ */ ((Rounding2) => {
Rounding2[Rounding2["ROUND_DOWN"] = 0] = "ROUND_DOWN";
Rounding2[Rounding2["ROUND_HALF_UP"] = 1] = "ROUND_HALF_UP";
Rounding2[Rounding2["ROUND_UP"] = 3] = "ROUND_UP";
return Rounding2;
})(Rounding || {});
var Rounding_default = Rounding;
// src/Fraction.ts
var toSignificantRounding = {
[Rounding_default.ROUND_DOWN]: Decimal_default.ROUND_DOWN,
[Rounding_default.ROUND_HALF_UP]: Decimal_default.ROUND_HALF_UP,
[Rounding_default.ROUND_UP]: Decimal_default.ROUND_UP
};
var toFixedRounding = {
[Rounding_default.ROUND_DOWN]: Big_default.roundDown,
[Rounding_default.ROUND_HALF_UP]: Big_default.roundHalfUp,
[Rounding_default.ROUND_UP]: Big_default.roundUp
};
var Fraction = class {
constructor(numerator, denominator = JSBI.BigInt(1)) {
this.numerator = JSBI.BigInt(numerator);
this.denominator = JSBI.BigInt(denominator);
}
static tryParseFraction(fractionish) {
if (fractionish instanceof JSBI || typeof fractionish === "number" || typeof fractionish === "string")
return new Fraction(fractionish);
if ("numerator" in fractionish && "denominator" in fractionish)
return fractionish;
throw new Error("Could not parse fraction");
}
get quotient() {
return JSBI.divide(this.numerator, this.denominator);
}
get remainder() {
return new Fraction(JSBI.remainder(this.numerator, this.denominator), this.denominator);
}
invert() {
return new Fraction(this.denominator, this.numerator);
}
add(other) {
const otherParsed = Fraction.tryParseFraction(other);
if (JSBI.equal(this.denominator, otherParsed.denominator)) {
return new Fraction(JSBI.add(this.numerator, otherParsed.numerator), this.denominator);
}
return new Fraction(
JSBI.add(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
),
JSBI.multiply(this.denominator, otherParsed.denominator)
);
}
subtract(other) {
const otherParsed = Fraction.tryParseFraction(other);
if (JSBI.equal(this.denominator, otherParsed.denominator)) {
return new Fraction(JSBI.subtract(this.numerator, otherParsed.numerator), this.denominator);
}
return new Fraction(
JSBI.subtract(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
),
JSBI.multiply(this.denominator, otherParsed.denominator)
);
}
lessThan(other) {
const otherParsed = Fraction.tryParseFraction(other);
return JSBI.lessThan(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
);
}
equalTo(other) {
const otherParsed = Fraction.tryParseFraction(other);
return JSBI.equal(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
);
}
greaterThan(other) {
const otherParsed = Fraction.tryParseFraction(other);
return JSBI.greaterThan(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
);
}
multiply(other) {
const otherParsed = Fraction.tryParseFraction(other);
return new Fraction(
JSBI.multiply(this.numerator, otherParsed.numerator),
JSBI.multiply(this.denominator, otherParsed.denominator)
);
}
divide(other) {
const otherParsed = Fraction.tryParseFraction(other);
return new Fraction(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(this.denominator, otherParsed.numerator)
);
}
toSignificant(significantDigits, format = { groupSeparator: "" }, rounding = Rounding_default.ROUND_HALF_UP) {
invariant(Number.isInteger(significantDigits), `${significantDigits} is not an integer.`);
invariant(significantDigits > 0, `${significantDigits} is not positive.`);
Decimal_default.set({
precision: significantDigits + 1,
rounding: toSignificantRounding[rounding]
});
const quotient = new Decimal_default(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(significantDigits);
return quotient.toFormat(quotient.decimalPlaces(), format);
}
toFixed(decimalPlaces, format = { groupSeparator: "" }, rounding = Rounding_default.ROUND_HALF_UP) {
invariant(Number.isInteger(decimalPlaces), `${decimalPlaces} is not an integer.`);
invariant(decimalPlaces >= 0, `${decimalPlaces} is negative.`);
Big_default.DP = decimalPlaces;
Big_default.RM = toFixedRounding[rounding];
return new Big_default(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);
}
get asFraction() {
return new Fraction(this.numerator, this.denominator);
}
};
var Fraction_default = Fraction;
// src/Percent.ts
var ONE_HUNDRED = new Fraction_default(JSBI2.BigInt(100));
function toPercent(fraction) {
return new Percent(fraction.numerator, fraction.denominator);
}
var Percent = class extends Fraction_default {
constructor() {
super(...arguments);
this.isPercent = true;
}
add(other) {
return toPercent(super.add(other));
}
subtract(other) {
return toPercent(super.subtract(other));
}
multiply(other) {
return toPercent(super.multiply(other));
}
divide(other) {
return toPercent(super.divide(other));
}
toSignificant(significantDigits = 5, format, rounding) {
return super.multiply(ONE_HUNDRED).toSignificant(significantDigits, format, rounding);
}
toFixed(decimalPlaces = 2, format, rounding) {
return super.multiply(ONE_HUNDRED).toFixed(decimalPlaces, format, rounding);
}
};
var Percent_default = Percent;
// src/constants/numbers.ts
var ZERO = JSBI3.BigInt(0);
var ONE = JSBI3.BigInt(1);
var TWO = JSBI3.BigInt(2);
var THREE = JSBI3.BigInt(3);
var FIVE = JSBI3.BigInt(5);
var TEN = JSBI3.BigInt(10);
var _100 = JSBI3.BigInt(100);
var _997 = JSBI3.BigInt(997);
var _1000 = JSBI3.BigInt(1e3);
var _9994 = JSBI3.BigInt(9994);
var _9995 = JSBI3.BigInt(9995);
var _10000 = JSBI3.BigInt(1e4);
var _1e18 = JSBI3.BigInt(1e18);
var _1e12 = JSBI3.BigInt(1e12);
var _1e9 = JSBI3.BigInt(1e9);
var _1e6 = JSBI3.BigInt(1e6);
var MAX_SAFE_INTEGER = JSBI3.BigInt(Number.MAX_SAFE_INTEGER);
var MAX_UINT256 = JSBI3.BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
var MAX_UINT128 = JSBI3.subtract(JSBI3.exponentiate(JSBI3.BigInt("2"), JSBI3.BigInt(128)), JSBI3.BigInt(1));
var ZERO_PERCENT = new Percent_default(0);
// src/functions/difference.ts
import JSBI4 from "jsbi";
function difference(a, b) {
if (JSBI4.greaterThan(a, b)) {
return JSBI4.subtract(a, b);
}
return JSBI4.subtract(b, a);
}
// src/functions/maximum.ts
import JSBI5 from "jsbi";
function maximum(...values) {
let highest = values[0];
for (let i = 1; i < values.length; i++) {
const value = values[i];
if (JSBI5.GT(value, highest)) {
highest = value;
}
}
return highest;
}
// src/functions/minimum.ts
import JSBI6 from "jsbi";
function minimum(...values) {
let lowest = values[0];
for (let i = 1; i < values.length; i++) {
const value = values[i];
if (JSBI6.LT(value, lowest)) {
lowest = value;
}
}
return lowest;
}
// src/functions/sqrt.ts
import JSBI7 from "jsbi";
import invariant2 from "tiny-invariant";
function sqrt(value) {
invariant2(JSBI7.greaterThanOrEqual(value, ZERO), "NEGATIVE");
if (JSBI7.lessThan(value, MAX_SAFE_INTEGER)) {
return JSBI7.BigInt(Math.floor(Math.sqrt(JSBI7.toNumber(value))));
}
let z;
let x;
z = value;
x = JSBI7.add(JSBI7.divide(value, TWO), ONE);
while (JSBI7.lessThan(x, z)) {
z = x;
x = JSBI7.divide(JSBI7.add(JSBI7.divide(value, x), x), TWO);
}
return z;
}
// src/index.ts
import { default as default2 } from "jsbi";
export {
Big_default as Big,
Decimal_default as Decimal,
FIVE,
Fraction_default as Fraction,
default2 as JSBI,
MAX_SAFE_INTEGER,
MAX_UINT128,
MAX_UINT256,
ONE,
Percent_default as Percent,
Rounding_default as Rounding,
TEN,
THREE,
TWO,
ZERO,
ZERO_PERCENT,
_100,
_1000,
_10000,
_1e12,
_1e18,
_1e6,
_1e9,
_997,
_9994,
_9995,
difference,
maximum,
minimum,
sqrt
};