@ar.io/sdk
Version:
[](https://codecov.io/gh/ar-io/ar-io-sdk)
112 lines (111 loc) • 3.91 kB
JavaScript
/**
* Copyright (C) 2022-2024 Permanent Data Solutions, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { MARIO_PER_ARIO } from '../constants.js';
class PositiveFiniteInteger {
positiveFiniteInteger;
constructor(positiveFiniteInteger) {
this.positiveFiniteInteger = positiveFiniteInteger;
if (!Number.isFinite(this.positiveFiniteInteger) ||
!Number.isInteger(this.positiveFiniteInteger) ||
this.positiveFiniteInteger < 0) {
throw new Error(`Number must be a non-negative integer value! ${positiveFiniteInteger}`);
}
}
[Symbol.toPrimitive](hint) {
if (hint === 'string') {
this.toString();
}
return this.positiveFiniteInteger;
}
plus(positiveFiniteInteger) {
return new PositiveFiniteInteger(this.positiveFiniteInteger + positiveFiniteInteger.positiveFiniteInteger);
}
minus(positiveFiniteInteger) {
return new PositiveFiniteInteger(this.positiveFiniteInteger - positiveFiniteInteger.positiveFiniteInteger);
}
isGreaterThan(positiveFiniteInteger) {
return (this.positiveFiniteInteger > positiveFiniteInteger.positiveFiniteInteger);
}
isGreaterThanOrEqualTo(positiveFiniteInteger) {
return (this.positiveFiniteInteger >= positiveFiniteInteger.positiveFiniteInteger);
}
isLessThan(positiveFiniteInteger) {
return (this.positiveFiniteInteger < positiveFiniteInteger.positiveFiniteInteger);
}
isLessThanOrEqualTo(positiveFiniteInteger) {
return (this.positiveFiniteInteger <= positiveFiniteInteger.positiveFiniteInteger);
}
toString() {
return `${this.positiveFiniteInteger}`;
}
valueOf() {
return this.positiveFiniteInteger;
}
toJSON() {
return this.positiveFiniteInteger;
}
equals(other) {
return this.positiveFiniteInteger === other.positiveFiniteInteger;
}
}
export class ARIOToken {
value;
constructor(value) {
if (!Number.isFinite(value) || value < 0) {
throw new Error('ARIOToken must be a non-negative finite number');
}
this.value = +value.toFixed(6);
}
valueOf() {
return this.value;
}
toMARIO() {
return new mARIOToken(Math.floor(this.value * MARIO_PER_ARIO));
}
toString() {
return `${this.value}`;
}
}
export class mARIOToken extends PositiveFiniteInteger {
constructor(value) {
super(value);
}
multiply(multiplier) {
// always round down on multiplication and division
const result = Math.floor(this.valueOf() * multiplier.valueOf());
return new mARIOToken(result);
}
divide(divisor) {
if (divisor.valueOf() === 0) {
// TODO: how should we handle this
throw new Error('Cannot divide by zero');
}
// always round down on multiplication and division
const result = Math.floor(this.valueOf() / divisor.valueOf());
return new mARIOToken(result);
}
plus(addend) {
const result = super.plus(addend);
return new mARIOToken(result.valueOf());
}
minus(subtractHend) {
const result = super.minus(subtractHend);
return new mARIOToken(result.valueOf());
}
toARIO() {
return new ARIOToken(this.valueOf() / MARIO_PER_ARIO);
}
}