UNPKG

@mozaic-fi/intent-swapper-sdk-common

Version:
283 lines 9.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TokenAmounts = exports.TokenAmount = void 0; exports.isTokenAmountObject = isTokenAmountObject; exports.isTokenAmountPair = isTokenAmountPair; exports.isTokenAmount = isTokenAmount; exports.isTokenAmountTypes = isTokenAmountTypes; exports.isTokenAmounts = isTokenAmounts; exports.isTokenAmountsTypes = isTokenAmountsTypes; 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"); class TokenAmount { constructor(arg0, arg1) { var _a, _b; if ((0, token_1.isTokenTypes)(arg0)) { this.token = token_1.Token.from(arg0); this.amount = TokenAmount.precise(arg1 !== null && arg1 !== void 0 ? arg1 : '0', this.token.decimals); } else if (isTokenAmount(arg0)) { this.token = arg0.token; this.amount = arg0.amount; } else if (isTokenAmountObject(arg0)) { this.token = token_1.Token.from(arg0.token); this.amount = TokenAmount.precise((_a = arg0.amount) !== null && _a !== void 0 ? _a : '0', this.token.decimals); } else { this.token = (0, token_1.isToken)(arg0[0]) ? arg0[0] : token_1.Token.from(arg0[0]); this.amount = TokenAmount.precise((_b = arg0[1]) !== null && _b !== void 0 ? _b : '0', this.token.decimals); } } static from(tokenAmount) { return isTokenAmount(tokenAmount) ? tokenAmount : new TokenAmount(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); } precise(arg0) { let amount; if (isTokenAmount(arg0)) { (0, tiny_invariant_1.default)(arg0.token.is(this.token), "different tokens can't be clone"); amount = arg0.amount; } else { amount = TokenAmount.precise(arg0, this.token.decimals); } return amount; } set(arg0) { this.amount = this.precise(arg0); return this; } setWei(amountWei) { this.amount = (0, utils_1.toBigUnit)(amountWei, this.token.decimals); return this; } add(arg0) { this.amount = (0, bignumber_js_1.default)(this.amount).plus(this.precise(arg0)).toFixed(); return this; } addWei(amountWei) { this.amount = (0, bignumber_js_1.default)(this.amount).plus((0, utils_1.toBigUnit)(amountWei, this.token.decimals)).toFixed(); return this; } sub(arg0) { this.amount = (0, bignumber_js_1.default)(this.amount).minus(this.precise(arg0)).toFixed(); return this; } subWei(amountWei) { this.amount = (0, bignumber_js_1.default)(this.amount).minus((0, utils_1.toBigUnit)(amountWei, this.token.decimals)).toFixed(); return this; } get isZero() { return (0, bignumber_js_1.default)(this.amount).isZero(); } eq(arg0) { if (isTokenAmount(arg0)) { return this.amountWei.eq(arg0.amountWei); } else { return (0, bignumber_js_1.default)(this.amount).eq(arg0); } } gt(arg0) { if (isTokenAmount(arg0)) { return this.amountWei.gt(arg0.amountWei); } else { return (0, bignumber_js_1.default)(this.amount).gt(arg0); } } gte(arg0) { if (isTokenAmount(arg0)) { return this.amountWei.gte(arg0.amountWei); } else { return (0, bignumber_js_1.default)(this.amount).gte(arg0); } } lt(arg0) { if (isTokenAmount(arg0)) { return this.amountWei.lt(arg0.amountWei); } else { return (0, bignumber_js_1.default)(this.amount).lt(arg0); } } lte(arg0) { if (isTokenAmount(arg0)) { return this.amountWei.lte(arg0.amountWei); } else { return (0, bignumber_js_1.default)(this.amount).lte(arg0); } } toObject() { return { token: this.token.toObject(), amount: this.amount }; } toValues() { return [this.token.address, this.amountWei]; } clone() { return new TokenAmount(this.token, this.amount); } } exports.TokenAmount = TokenAmount; function isTokenAmountObject(v) { return typeof v === 'object' && (0, token_1.isTokenTypes)(v.token) && typeof v.amount === 'string' && !isTokenAmount(v); } function isTokenAmountPair(v) { return Array.isArray(v) && (0, token_1.isTokenTypes)(v[0]) && typeof v[1] === 'string'; } function isTokenAmount(v) { return v instanceof TokenAmount; } function isTokenAmountTypes(v) { return isTokenAmountObject(v) || isTokenAmountPair(v) || isTokenAmount(v); } class TokenAmounts { constructor(arg0, ...otherArgs) { this.tokenAmountMap = {}; if (arg0) { if (isTokenAmountTypes(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 isTokenAmounts(tokenAmounts) ? tokenAmounts : new TokenAmounts(tokenAmounts); } get length() { return Object.keys(this.tokenAmountMap).length; } at(index) { return this.toArray()[index]; } get(tokenOrAddress) { return this.tokenAmountMap[token_1.Token.getAddress(tokenOrAddress)]; } set(arg0, arg1) { const tokenAmount = new TokenAmount(arg0, arg1); this.tokenAmountMap[tokenAmount.token.address] = tokenAmount; return this; } has(tokenOrAddress) { return !!this.get(tokenOrAddress); } add(arg0, arg1) { const tokenAmount = new TokenAmount(arg0, arg1); if (this.has(tokenAmount.token)) { this.tokenAmountMap[tokenAmount.token.address].add(tokenAmount); } else { this.set(tokenAmount); } return this; } sub(arg0, arg1) { const tokenAmount = new TokenAmount(arg0, arg1); if (this.has(tokenAmount.token)) { this.tokenAmountMap[tokenAmount.token.address].sub(tokenAmount); } return this; } toArray() { return Object.keys(this.tokenAmountMap).map((tokenAddress) => this.tokenAmountMap[tokenAddress]); } toObject() { return (0, orderBy_1.default)(Object.keys(this.tokenAmountMap).map((tokenAddress) => this.tokenAmountMap[tokenAddress].toObject()), 'token.symbol'); } toJSON() { return this.toObject(); } toValues() { return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenAddress) => { accumulator[0].push(tokenAddress); accumulator[1].push(this.tokenAmountMap[tokenAddress].amountWei); return accumulator; }, [[], []]); } compact() { const tokenAmounts = new TokenAmounts(); Object.keys(this.tokenAmountMap).forEach((tokenAddress) => { if (!this.tokenAmountMap[tokenAddress].isZero) { tokenAmounts.add(this.tokenAmountMap[tokenAddress]); } }); return tokenAmounts; } get isEmpty() { return this.length === 0; } get native() { let nativeTokenAmount; for (const tokenAddress of Object.keys(this.tokenAmountMap)) { const tokenAmount = this.tokenAmountMap[tokenAddress]; if (tokenAmount.token.isNative) { nativeTokenAmount = tokenAmount; break; } } return nativeTokenAmount; } get erc20() { return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenAddress) => { const tokenAmount = this.tokenAmountMap[tokenAddress]; if (!tokenAmount.token.isNative) accumulator.set(tokenAmount); return accumulator; }, new TokenAmounts()); } get tokens() { return Object.keys(this.tokenAmountMap).reduce((accumulator, tokenAddress) => { accumulator.push(this.tokenAmountMap[tokenAddress].token); return accumulator; }, []); } forEach(callbackfn) { Object.keys(this.tokenAmountMap).map((tokenAddress, index) => callbackfn(this.tokenAmountMap[tokenAddress], index, this)); } map(callbackfn) { return Object.keys(this.tokenAmountMap).map((tokenAddress, index) => callbackfn(this.tokenAmountMap[tokenAddress], index, this)); } merge(sources) { let tokenAmountsArray = [this]; if (Array.isArray(sources)) { tokenAmountsArray = tokenAmountsArray.concat(sources); } else { tokenAmountsArray.push(sources); } const newTokenAmounts = new TokenAmounts(); for (const tokenAmounts of tokenAmountsArray) { Object.keys(tokenAmounts.tokenAmountMap).forEach((tokenAddress) => { newTokenAmounts.add(tokenAmounts.tokenAmountMap[tokenAddress]); }); } return newTokenAmounts; } } exports.TokenAmounts = TokenAmounts; function isTokenAmounts(v) { return v instanceof TokenAmounts; } function isTokenAmountsTypes(v) { return (Array.isArray(v) && isTokenAmountTypes(v[0])) || isTokenAmounts(v); } //# sourceMappingURL=token-amount.js.map