@mozaic-fi/intent-swapper-sdk-common
Version:
Intent Swapper Common SDK
283 lines • 9.94 kB
JavaScript
"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