@nextrope/xrpl
Version:
A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser
94 lines • 3.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.percentToQuality = exports.transferRateToDecimal = exports.qualityToDecimal = exports.decimalToQuality = exports.percentToTransferRate = exports.decimalToTransferRate = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const errors_1 = require("../errors");
const BASE_TEN = 10;
const ONE_BILLION = '1000000000';
const TWO_BILLION = '2000000000';
function percentToDecimal(percent) {
if (!percent.endsWith('%')) {
throw new errors_1.ValidationError(`Value ${percent} must end with %`);
}
const split = percent.split('%').filter((str) => str !== '');
if (split.length !== 1) {
throw new errors_1.ValidationError(`Value ${percent} contains too many % signs`);
}
return new bignumber_js_1.default(split[0]).dividedBy('100').toString(BASE_TEN);
}
function decimalToTransferRate(decimal) {
const rate = new bignumber_js_1.default(decimal).times(ONE_BILLION).plus(ONE_BILLION);
if (rate.isLessThan(ONE_BILLION) || rate.isGreaterThan(TWO_BILLION)) {
throw new errors_1.ValidationError(`Decimal value must be between 0 and 1.00.`);
}
const billionths = rate.toString(BASE_TEN);
if (billionths === ONE_BILLION) {
return 0;
}
if (billionths === 'NaN') {
throw new errors_1.ValidationError(`Value is not a number`);
}
if (billionths.includes('.')) {
throw new errors_1.ValidationError(`Decimal exceeds maximum precision.`);
}
return Number(billionths);
}
exports.decimalToTransferRate = decimalToTransferRate;
function percentToTransferRate(percent) {
return decimalToTransferRate(percentToDecimal(percent));
}
exports.percentToTransferRate = percentToTransferRate;
function decimalToQuality(decimal) {
const rate = new bignumber_js_1.default(decimal).times(ONE_BILLION);
const billionths = rate.toString(BASE_TEN);
if (billionths === 'NaN') {
throw new errors_1.ValidationError(`Value is not a number`);
}
if (billionths.includes('-')) {
throw new errors_1.ValidationError('Cannot have negative Quality');
}
if (billionths === ONE_BILLION) {
return 0;
}
if (billionths.includes('.')) {
throw new errors_1.ValidationError(`Decimal exceeds maximum precision.`);
}
return Number(billionths);
}
exports.decimalToQuality = decimalToQuality;
function qualityToDecimal(quality) {
if (!Number.isInteger(quality)) {
throw new errors_1.ValidationError('Quality must be an integer');
}
if (quality < 0) {
throw new errors_1.ValidationError('Negative quality not allowed');
}
if (quality === 0) {
return '1';
}
const decimal = new bignumber_js_1.default(quality).dividedBy(ONE_BILLION);
return decimal.toString(BASE_TEN);
}
exports.qualityToDecimal = qualityToDecimal;
function transferRateToDecimal(rate) {
if (!Number.isInteger(rate)) {
throw new errors_1.ValidationError('Error decoding, transfer Rate must be an integer');
}
if (rate === 0) {
return '0';
}
const decimal = new bignumber_js_1.default(rate).minus(ONE_BILLION).dividedBy(ONE_BILLION);
if (decimal.isLessThan(0)) {
throw new errors_1.ValidationError('Error decoding, negative transfer rate');
}
return decimal.toString(BASE_TEN);
}
exports.transferRateToDecimal = transferRateToDecimal;
function percentToQuality(percent) {
return decimalToQuality(percentToDecimal(percent));
}
exports.percentToQuality = percentToQuality;
//# sourceMappingURL=quality.js.map