@mozaic-fi/intent-swapper-sdk-common
Version:
Intent Swapper Common SDK
357 lines • 15.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenAmountsWithMin = exports.TokenAmountWithMin = void 0;
exports.isTokenAmountWithMinObject = isTokenAmountWithMinObject;
exports.isTokenAmountWithMinPair = isTokenAmountWithMinPair;
exports.isTokenAmountWithMin = isTokenAmountWithMin;
exports.isTokenAmountWithMinTypes = isTokenAmountWithMinTypes;
exports.isTokenAmountsWithMin = isTokenAmountsWithMin;
exports.isTokenAmountsWithMinTypes = isTokenAmountsWithMinTypes;
const tslib_1 = require("tslib");
const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
const token_1 = require("./token");
const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
const orderBy_1 = tslib_1.__importDefault(require("lodash/orderBy"));
const utils_1 = require("../utils");
const token_amount_1 = require("./token-amount");
class TokenAmountWithMin {
constructor(arg0, arg1, arg2) {
var _a, _b, _c, _d, _e, _f, _g;
if ((0, token_1.isTokenTypes)(arg0)) {
this.token = token_1.Token.from(arg0);
this.amount = TokenAmountWithMin.precise(arg1 !== null && arg1 !== void 0 ? arg1 : '0', this.token.decimals);
this.amountMin = TokenAmountWithMin.precise((_a = arg2 !== null && arg2 !== void 0 ? arg2 : arg1) !== null && _a !== void 0 ? _a : '0', this.token.decimals);
}
else if (isTokenAmountWithMin(arg0)) {
this.token = arg0.token;
this.amount = arg0.amount;
this.amountMin = arg0.amountMin;
}
else if (isTokenAmountWithMinObject(arg0)) {
this.token = token_1.Token.from(arg0.token);
this.amount = TokenAmountWithMin.precise((_b = arg0.amount) !== null && _b !== void 0 ? _b : '0', this.token.decimals);
this.amountMin = TokenAmountWithMin.precise((_d = (_c = arg0.amountMin) !== null && _c !== void 0 ? _c : arg0.amount) !== null && _d !== void 0 ? _d : '0', this.token.decimals);
}
else if ((0, token_amount_1.isTokenAmount)(arg0)) {
this.token = arg0.token;
this.amount = arg0.amount;
this.amountMin = arg0.amount;
}
else {
this.token = (0, token_1.isToken)(arg0[0]) ? arg0[0] : token_1.Token.from(arg0[0]);
this.amount = TokenAmountWithMin.precise((_e = arg0[1]) !== null && _e !== void 0 ? _e : '0', this.token.decimals);
this.amountMin = TokenAmountWithMin.precise((_g = (_f = arg0[2]) !== null && _f !== void 0 ? _f : arg0[1]) !== null && _g !== void 0 ? _g : '0', this.token.decimals);
}
}
static from(tokenAmount) {
return isTokenAmountWithMin(tokenAmount) ? tokenAmount : new TokenAmountWithMin(tokenAmount);
}
static precise(amount, decimals) {
return (0, bignumber_js_1.default)(amount).decimalPlaces(decimals, bignumber_js_1.default.ROUND_DOWN).toFixed();
}
get amountWei() {
return (0, utils_1.toSmallUnit)(this.amount, this.token.decimals);
}
get amountMinWei() {
return (0, utils_1.toSmallUnit)(this.amountMin, this.token.decimals);
}
precise(arg0) {
let amount;
if (isTokenAmountWithMin(arg0)) {
(0, tiny_invariant_1.default)(arg0.token.is(this.token), "different tokens can't be clone");
amount = arg0.amount;
}
else {
amount = TokenAmountWithMin.precise(arg0, this.token.decimals);
}
return amount;
}
set(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
this.amount = this.precise(arg0.amount);
this.amountMin = this.precise(arg0.amountMin);
}
else {
this.amount = this.precise(arg0);
this.amountMin = this.precise(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
return this;
}
setWei(amountWei, amountMinWei) {
this.amount = (0, utils_1.toBigUnit)(amountWei, this.token.decimals);
this.amountMin = (0, utils_1.toBigUnit)(amountMinWei !== null && amountMinWei !== void 0 ? amountMinWei : amountWei, this.token.decimals);
return this;
}
add(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
this.amount = (0, bignumber_js_1.default)(this.amount).plus(this.precise(arg0.amount)).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin).plus(this.precise(arg0.amountMin)).toFixed();
}
else if ((0, token_amount_1.isTokenAmount)(arg0)) {
this.amount = (0, bignumber_js_1.default)(this.amount).plus(arg0.amount).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin).plus(arg0.amount).toFixed();
}
else {
this.amount = (0, bignumber_js_1.default)(this.amount).plus(this.precise(arg0)).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin)
.plus(this.precise(arg1 !== null && arg1 !== void 0 ? arg1 : arg0))
.toFixed();
}
return this;
}
addWei(amountWei, amountMinWei) {
this.amount = (0, bignumber_js_1.default)(this.amount)
.plus((0, utils_1.toBigUnit)(amountWei, this.token.decimals))
.toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin)
.plus((0, utils_1.toBigUnit)(amountMinWei !== null && amountMinWei !== void 0 ? amountMinWei : amountWei, this.token.decimals))
.toFixed();
return this;
}
sub(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
this.amount = (0, bignumber_js_1.default)(this.amount).minus(this.precise(arg0.amount)).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin).minus(this.precise(arg0.amountMin)).toFixed();
}
else if ((0, token_amount_1.isTokenAmount)(arg0)) {
this.amount = (0, bignumber_js_1.default)(this.amount).minus(arg0.amount).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin).minus(arg0.amount).toFixed();
}
else {
this.amount = (0, bignumber_js_1.default)(this.amount).minus(this.precise(arg0)).toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin)
.minus(this.precise(arg1 !== null && arg1 !== void 0 ? arg1 : arg0))
.toFixed();
}
return this;
}
subWei(amountWei, amountMinWei) {
this.amount = (0, bignumber_js_1.default)(this.amount)
.minus((0, utils_1.toBigUnit)(amountWei, this.token.decimals))
.toFixed();
this.amountMin = (0, bignumber_js_1.default)(this.amountMin)
.minus((0, utils_1.toBigUnit)(amountMinWei !== null && amountMinWei !== void 0 ? amountMinWei : amountWei, this.token.decimals))
.toFixed();
return this;
}
get isZero() {
return (0, bignumber_js_1.default)(this.amount).isZero() && (0, bignumber_js_1.default)(this.amountMin).isZero();
}
eq(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
return this.amountWei.eq(arg0.amountWei) && this.amountMinWei.eq(arg0.amountMinWei);
}
else {
return (0, bignumber_js_1.default)(this.amount).eq(arg0) && (0, bignumber_js_1.default)(this.amountMin).eq(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
}
gt(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
return this.amountWei.gt(arg0.amountWei) && this.amountMinWei.gt(arg0.amountMinWei);
}
else {
return (0, bignumber_js_1.default)(this.amount).gt(arg0) && (0, bignumber_js_1.default)(this.amountMin).gt(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
}
gte(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
return this.amountWei.gte(arg0.amountWei) && this.amountMinWei.gte(arg0.amountMinWei);
}
else {
return (0, bignumber_js_1.default)(this.amount).gte(arg0) && (0, bignumber_js_1.default)(this.amountMin).gte(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
}
lt(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
return this.amountWei.lt(arg0.amountWei) && this.amountMinWei.lt(arg0.amountMinWei);
}
else {
return (0, bignumber_js_1.default)(this.amount).lt(arg0) && (0, bignumber_js_1.default)(this.amountMin).lt(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
}
lte(arg0, arg1) {
if (isTokenAmountWithMin(arg0)) {
return this.amountWei.lte(arg0.amountWei) && this.amountMinWei.lte(arg0.amountMinWei);
}
else {
return (0, bignumber_js_1.default)(this.amount).lte(arg0) && (0, bignumber_js_1.default)(this.amountMin).lte(arg1 !== null && arg1 !== void 0 ? arg1 : arg0);
}
}
toObject() {
return {
token: this.token.toObject(),
amount: this.amount,
amountMin: this.amountMin,
};
}
toValues() {
return [this.token.address, this.amountWei, this.amountMinWei];
}
clone() {
return new TokenAmountWithMin(this.token, this.amount, this.amountMin);
}
}
exports.TokenAmountWithMin = TokenAmountWithMin;
function isTokenAmountWithMinObject(v) {
return (typeof v === 'object' &&
(0, token_1.isTokenTypes)(v.token) &&
typeof v.amount === 'string' &&
typeof v.amountMin === 'string' &&
!isTokenAmountWithMin(v));
}
function isTokenAmountWithMinPair(v) {
return (Array.isArray(v) &&
(0, token_1.isTokenTypes)(v[0]) &&
typeof v[1] === 'string' &&
(typeof v[2] === 'string' || typeof v[2] === 'undefined'));
}
function isTokenAmountWithMin(v) {
return v instanceof TokenAmountWithMin;
}
function isTokenAmountWithMinTypes(v) {
return isTokenAmountWithMinObject(v) || isTokenAmountWithMinPair(v) || isTokenAmountWithMin(v);
}
class TokenAmountsWithMin {
constructor(arg0, ...otherArgs) {
this.tokenAmountMap = {};
if (arg0) {
if (isTokenAmountWithMinTypes(arg0)) {
this.add(arg0);
}
else {
for (const tokenAmount of arg0) {
this.add(tokenAmount);
}
}
}
for (const tokenAmount of otherArgs) {
this.add(tokenAmount);
}
}
static from(tokenAmounts) {
return isTokenAmountsWithMin(tokenAmounts)
? tokenAmounts
: new TokenAmountsWithMin(tokenAmounts);
}
static fromTokenAmounts(tokenAmounts) {
return new TokenAmountsWithMin(tokenAmounts.map((tokenAmount) => new TokenAmountWithMin(tokenAmount.token, tokenAmount.amount, tokenAmount.amount)));
}
get length() {
return Object.keys(this.tokenAmountMap).length;
}
at(index) {
return this.toArray()[index];
}
get(token) {
return this.tokenAmountMap[token_1.Token.getIid(token)];
}
set(arg0, arg1) {
const tokenAmount = new TokenAmountWithMin(arg0, arg1);
this.tokenAmountMap[token_1.Token.getIid(tokenAmount.token)] = tokenAmount;
return this;
}
has(token) {
return !!this.get(token);
}
add(arg0, arg1) {
const tokenAmount = new TokenAmountWithMin(arg0, arg1);
if (this.has(tokenAmount.token)) {
this.tokenAmountMap[token_1.Token.getIid(tokenAmount.token)].add(tokenAmount);
}
else {
this.set(tokenAmount);
}
return this;
}
sub(arg0, arg1) {
const tokenAmount = new TokenAmountWithMin(arg0, arg1);
if (this.has(tokenAmount.token)) {
this.tokenAmountMap[token_1.Token.getIid(tokenAmount.token)].sub(tokenAmount);
}
return this;
}
toArray() {
return Object.keys(this.tokenAmountMap).map((tokenIid) => this.tokenAmountMap[tokenIid]);
}
toObject() {
return (0, orderBy_1.default)(Object.keys(this.tokenAmountMap).map((tokenIid) => this.tokenAmountMap[tokenIid].toObject()), 'token.symbol');
}
toJSON() {
return this.toObject();
}
toValues() {
return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenIid) => {
accumulator[0].push(tokenIid);
accumulator[1].push(this.tokenAmountMap[tokenIid].amountWei);
accumulator[2].push(this.tokenAmountMap[tokenIid].amountMinWei);
return accumulator;
}, [[], [], []]);
}
compact() {
const tokenAmounts = new TokenAmountsWithMin();
Object.keys(this.tokenAmountMap).forEach((tokenIid) => {
if (!this.tokenAmountMap[tokenIid].isZero) {
tokenAmounts.add(this.tokenAmountMap[tokenIid]);
}
});
return tokenAmounts;
}
get isEmpty() {
return this.length === 0;
}
get native() {
let nativeTokenAmount;
for (const tokenIid of Object.keys(this.tokenAmountMap)) {
const tokenAmount = this.tokenAmountMap[tokenIid];
if (tokenAmount.token.isNative) {
nativeTokenAmount = tokenAmount;
break;
}
}
return nativeTokenAmount;
}
get erc20() {
return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenIid) => {
const tokenAmount = this.tokenAmountMap[tokenIid];
if (!tokenAmount.token.isNative)
accumulator.set(tokenAmount);
return accumulator;
}, new TokenAmountsWithMin());
}
get tokens() {
return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenIid) => {
accumulator.push(this.tokenAmountMap[tokenIid].token);
return accumulator;
}, []);
}
forEach(callbackfn) {
Object.keys(this.tokenAmountMap).map((tokenIid, index) => callbackfn(this.tokenAmountMap[tokenIid], index, this));
}
map(callbackfn) {
return Object.keys(this.tokenAmountMap).map((tokenIid, index) => callbackfn(this.tokenAmountMap[tokenIid], index, this));
}
merge(sources) {
let tokenAmountsArray = [this];
if (Array.isArray(sources)) {
tokenAmountsArray = tokenAmountsArray.concat(sources);
}
else {
tokenAmountsArray.push(sources);
}
const newTokenAmounts = new TokenAmountsWithMin();
for (const tokenAmounts of tokenAmountsArray) {
Object.keys(tokenAmounts.tokenAmountMap).forEach((tokenIid) => {
newTokenAmounts.add(tokenAmounts.tokenAmountMap[tokenIid]);
});
}
return newTokenAmounts;
}
}
exports.TokenAmountsWithMin = TokenAmountsWithMin;
function isTokenAmountsWithMin(v) {
return v instanceof TokenAmountsWithMin;
}
function isTokenAmountsWithMinTypes(v) {
return (Array.isArray(v) && isTokenAmountWithMinTypes(v[0])) || isTokenAmountsWithMin(v);
}
//# sourceMappingURL=token-amount-with-min.js.map