UNPKG

ton3-core

Version:
149 lines 4.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Coins = void 0; const decimal_js_1 = __importDefault(require("decimal.js")); class Coins { constructor(value, options) { const { isNano = false, decimals = 9 } = options || {}; Coins.checkCoinsType(value); Coins.checkCoinsDecimals(decimals); const decimal = new decimal_js_1.default(value.toString()); if (decimal.dp() > decimals) { throw new Error(`Invalid Coins value, decimals places "${decimal.dp()}" can't be greater than selected "${decimals}"`); } this.decimals = decimals; this.multiplier = (1 * 10) ** this.decimals; this.value = !isNano ? decimal.mul(this.multiplier) : decimal; } add(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); this.value = this.value.add(coins.value); return this; } sub(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); this.value = this.value.sub(coins.value); return this; } mul(value) { Coins.checkValue(value); Coins.checkConvertability(value); const multiplier = value.toString(); this.value = this.value.mul(multiplier); return this; } div(value) { Coins.checkValue(value); Coins.checkConvertability(value); const divider = value.toString(); this.value = this.value.div(divider); return this; } eq(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); return this.value.eq(coins.value); } gt(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); return this.value.gt(coins.value); } gte(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); return this.value.gte(coins.value); } lt(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); return this.value.lt(coins.value); } lte(coins) { Coins.checkCoins(coins); Coins.compareCoinsDecimals(this, coins); return this.value.lte(coins.value); } isNegative() { return this.value.isNegative(); } isPositive() { return this.value.isPositive(); } isZero() { return this.value.isZero(); } toString() { const value = this.value.div(this.multiplier).toFixed(this.decimals); const re1 = new RegExp(`\\.0{${this.decimals}}$`); const re2 = new RegExp('(\\.[0-9]*?[0-9])0+$'); const coins = value.replace(re1, '').replace(re2, '$1'); return coins; } toNano() { return this.value.toFixed(0); } static checkCoinsType(value) { if (Coins.isValid(value) && Coins.isConvertable(value)) return undefined; if (Coins.isCoins(value)) return undefined; throw new Error('Invalid Coins value'); } static checkCoinsDecimals(decimals) { if (decimals < 0 || decimals > 18) { throw new Error('Invalid decimals value, must be 0-18'); } } static compareCoinsDecimals(a, b) { if (a.decimals !== b.decimals) { throw new Error("Can't perform mathematical operation of Coins with different decimals"); } } static checkValue(value) { if (Coins.isValid(value)) return undefined; throw new Error('Invalid value'); } static checkCoins(value) { if (Coins.isCoins(value)) return undefined; throw new Error('Invalid value'); } static checkConvertability(value) { if (Coins.isConvertable(value)) return undefined; throw new Error('Invalid value'); } static isValid(value) { return typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint'; } static isCoins(value) { return value instanceof Coins; } static isConvertable(value) { try { new decimal_js_1.default(value.toString()); return true; } catch (_err) { return false; } } static fromNano(value, decimals = 9) { Coins.checkCoinsType(value); Coins.checkCoinsDecimals(decimals); return new Coins(value, { isNano: true, decimals }); } } exports.Coins = Coins; //# sourceMappingURL=coins.js.map