ton3-core
Version:
TON low-level API tools
149 lines • 4.74 kB
JavaScript
;
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