@cetusprotocol/aggregator-sdk 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/test.yml +152 -0
- package/.vscode/settings.json +8 -0
- package/CLAUDE.md +101 -0
- package/bun.lock +1151 -0
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +65 -69
- package/dist/index.mjs +65 -69
- package/docs/Cetus_Aggregator_V3_/346/216/245/345/217/243/346/226/207/346/241/243.md +706 -0
- package/docs/REFACTOR.md +24 -0
- package/docs//350/267/257/345/276/204/346/213/223/346/211/221/346/216/222/345/272/217.md +208 -0
- package/package.json +26 -17
- package/script/copy-to-sui-aggregator.sh +85 -0
- package/test.json +267 -0
- package/.claude/settings.local.json +0 -41
package/dist/index.mjs
CHANGED
|
@@ -1652,6 +1652,7 @@ var require_bn = __commonJS({
|
|
|
1652
1652
|
this.words[i] = carry;
|
|
1653
1653
|
this.length++;
|
|
1654
1654
|
}
|
|
1655
|
+
this.length = num === 0 ? 1 : this.length;
|
|
1655
1656
|
return isNegNum ? this.ineg() : this;
|
|
1656
1657
|
};
|
|
1657
1658
|
BN7.prototype.muln = function muln(num) {
|
|
@@ -2993,7 +2994,7 @@ var GAS_TYPE_ARG = "0x2::sui::SUI";
|
|
|
2993
2994
|
var GAS_TYPE_ARG_LONG = "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";
|
|
2994
2995
|
var GAS_SYMBOL = "SUI";
|
|
2995
2996
|
var DEFAULT_NFT_TRANSFER_GAS_FEE = 450;
|
|
2996
|
-
var SUI_SYSTEM_STATE_OBJECT_ID = "
|
|
2997
|
+
var SUI_SYSTEM_STATE_OBJECT_ID = "0x0000000000000000000000000000000000000005";
|
|
2997
2998
|
var CoinUtils = class _CoinUtils {
|
|
2998
2999
|
/**
|
|
2999
3000
|
* Get the coin type argument from a SuiMoveObject.
|
|
@@ -3101,18 +3102,10 @@ var CoinUtils = class _CoinUtils {
|
|
|
3101
3102
|
* @returns The CoinAsset objects that have a balance greater than or equal to the given amount.
|
|
3102
3103
|
*/
|
|
3103
3104
|
static selectCoinObjectIdGreaterThanOrEqual(coins, amount, exclude = []) {
|
|
3104
|
-
const selectedResult = _CoinUtils.selectCoinAssetGreaterThanOrEqual(
|
|
3105
|
-
|
|
3106
|
-
amount,
|
|
3107
|
-
exclude
|
|
3108
|
-
);
|
|
3109
|
-
const objectArray = selectedResult.selectedCoins.map(
|
|
3110
|
-
(item) => item.coinObjectId
|
|
3111
|
-
);
|
|
3105
|
+
const selectedResult = _CoinUtils.selectCoinAssetGreaterThanOrEqual(coins, amount, exclude);
|
|
3106
|
+
const objectArray = selectedResult.selectedCoins.map((item) => item.coinObjectId);
|
|
3112
3107
|
const remainCoins = selectedResult.remainingCoins;
|
|
3113
|
-
const amountArray = selectedResult.selectedCoins.map(
|
|
3114
|
-
(item) => item.balance.toString()
|
|
3115
|
-
);
|
|
3108
|
+
const amountArray = selectedResult.selectedCoins.map((item) => item.balance.toString());
|
|
3116
3109
|
return { objectArray, remainCoins, amountArray };
|
|
3117
3110
|
}
|
|
3118
3111
|
/**
|
|
@@ -3124,9 +3117,7 @@ var CoinUtils = class _CoinUtils {
|
|
|
3124
3117
|
* @returns The CoinAsset objects that have a balance greater than or equal to the given amount.
|
|
3125
3118
|
*/
|
|
3126
3119
|
static selectCoinAssetGreaterThanOrEqual(coins, amount, exclude = []) {
|
|
3127
|
-
const sortedCoins = _CoinUtils.sortByBalance(
|
|
3128
|
-
coins.filter((c) => !exclude.includes(c.coinObjectId))
|
|
3129
|
-
);
|
|
3120
|
+
const sortedCoins = _CoinUtils.sortByBalance(coins.filter((c) => !exclude.includes(c.coinObjectId)));
|
|
3130
3121
|
const total = _CoinUtils.calculateTotalBalance(sortedCoins);
|
|
3131
3122
|
if (total < amount) {
|
|
3132
3123
|
return { selectedCoins: [], remainingCoins: sortedCoins };
|
|
@@ -3139,13 +3130,9 @@ var CoinUtils = class _CoinUtils {
|
|
|
3139
3130
|
const remainingCoins = [...sortedCoins];
|
|
3140
3131
|
while (sum2 < total) {
|
|
3141
3132
|
const target = amount - sum2;
|
|
3142
|
-
const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex(
|
|
3143
|
-
(c) => c.balance >= target
|
|
3144
|
-
);
|
|
3133
|
+
const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex((c) => c.balance >= target);
|
|
3145
3134
|
if (coinWithSmallestSufficientBalanceIndex !== -1) {
|
|
3146
|
-
selectedCoins.push(
|
|
3147
|
-
remainingCoins[coinWithSmallestSufficientBalanceIndex]
|
|
3148
|
-
);
|
|
3135
|
+
selectedCoins.push(remainingCoins[coinWithSmallestSufficientBalanceIndex]);
|
|
3149
3136
|
remainingCoins.splice(coinWithSmallestSufficientBalanceIndex, 1);
|
|
3150
3137
|
break;
|
|
3151
3138
|
}
|
|
@@ -3155,10 +3142,7 @@ var CoinUtils = class _CoinUtils {
|
|
|
3155
3142
|
sum2 += coinWithLargestBalance.balance;
|
|
3156
3143
|
}
|
|
3157
3144
|
}
|
|
3158
|
-
return {
|
|
3159
|
-
selectedCoins: _CoinUtils.sortByBalance(selectedCoins),
|
|
3160
|
-
remainingCoins: _CoinUtils.sortByBalance(remainingCoins)
|
|
3161
|
-
};
|
|
3145
|
+
return { selectedCoins: _CoinUtils.sortByBalance(selectedCoins), remainingCoins: _CoinUtils.sortByBalance(remainingCoins) };
|
|
3162
3146
|
}
|
|
3163
3147
|
/**
|
|
3164
3148
|
* Sort the CoinAsset objects by their balance.
|
|
@@ -3167,14 +3151,10 @@ var CoinUtils = class _CoinUtils {
|
|
|
3167
3151
|
* @returns The sorted CoinAsset objects.
|
|
3168
3152
|
*/
|
|
3169
3153
|
static sortByBalance(coins) {
|
|
3170
|
-
return coins.sort(
|
|
3171
|
-
(a, b) => a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0
|
|
3172
|
-
);
|
|
3154
|
+
return coins.sort((a, b) => a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0);
|
|
3173
3155
|
}
|
|
3174
3156
|
static sortByBalanceDes(coins) {
|
|
3175
|
-
return coins.sort(
|
|
3176
|
-
(a, b) => a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1
|
|
3177
|
-
);
|
|
3157
|
+
return coins.sort((a, b) => a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1);
|
|
3178
3158
|
}
|
|
3179
3159
|
/**
|
|
3180
3160
|
* Calculate the total balance of a list of CoinAsset objects.
|
|
@@ -3261,7 +3241,7 @@ function buildInputCoin(txb, allCoins, amount, coinType) {
|
|
|
3261
3241
|
}
|
|
3262
3242
|
let totalCoinBalance = CoinUtils.calculateTotalBalance(usedCoinAsests);
|
|
3263
3243
|
if (totalCoinBalance < amount) {
|
|
3264
|
-
throw new
|
|
3244
|
+
throw new AggregatorError(
|
|
3265
3245
|
"Insufficient balance when build merge coin, coinType: " + coinType,
|
|
3266
3246
|
"InsufficientBalance" /* InsufficientBalance */ + coinType
|
|
3267
3247
|
);
|
|
@@ -3355,7 +3335,7 @@ var SuiZeroCoinFn = "0x2::coin::zero";
|
|
|
3355
3335
|
var DEEPBOOK_PACKAGE_ID = "0x000000000000000000000000000000000000000000000000000000000000dee9";
|
|
3356
3336
|
var DEEPBOOK_PUBLISHED_AT = "0x000000000000000000000000000000000000000000000000000000000000dee9";
|
|
3357
3337
|
var CETUS_PUBLISHED_AT = "0x70968826ad1b4ba895753f634b0aea68d0672908ca1075a2abdf0fc9e0b2fc6a";
|
|
3358
|
-
var CETUS_V3_PUBLISHED_AT = "
|
|
3338
|
+
var CETUS_V3_PUBLISHED_AT = "0xb1e11ceaf3e7cd3031ef5e24804478ec3441c5aecdace910bdaca317a0c1c535";
|
|
3359
3339
|
var MAINNET_CETUS_GLOBAL_CONFIG_ID = "0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f";
|
|
3360
3340
|
var TESTNET_CETUS_GLOBAL_CONFIG_ID = "0x6f4149091a5aea0e818e7243a13adcfb403842d670b9a2089de058512620687a";
|
|
3361
3341
|
var MAINNET_FLOWX_AMM_CONTAINER_ID = "0xb65dcbf63fd3ad5d0ebfbf334780dc9f785eff38a4459e37ab08fa79576ee511";
|
|
@@ -3412,9 +3392,9 @@ var DEEPBOOK_V3_DEEP_FEE_TYPES = {
|
|
|
3412
3392
|
var CLIENT_CONFIG = {
|
|
3413
3393
|
DEFAULT_PYTH_URL: "https://hermes.pyth.network",
|
|
3414
3394
|
PYTH_TIMEOUT: 3e3,
|
|
3415
|
-
|
|
3395
|
+
MAX_OVERLAY_FEE_RATE: 0.1,
|
|
3396
|
+
MAX_OVERLAY_FEE_RATE_NUMERATOR: 1e5,
|
|
3416
3397
|
FEE_RATE_MULTIPLIER: 1e6,
|
|
3417
|
-
MAX_FEE_RATE: 1e5,
|
|
3418
3398
|
DEFAULT_OVERLAY_FEE_RECEIVER: "0x0",
|
|
3419
3399
|
// Error Messages
|
|
3420
3400
|
ERRORS: {
|
|
@@ -3437,13 +3417,13 @@ var AGGREGATOR_V3_CONFIG = {
|
|
|
3437
3417
|
// 10%
|
|
3438
3418
|
MAX_AMOUNT_IN: U64_MAX,
|
|
3439
3419
|
DEFAULT_PUBLISHED_AT: {
|
|
3440
|
-
Mainnet: "
|
|
3420
|
+
Mainnet: "0x33ec64e9bb369bf045ddc198c81adbf2acab424da37465d95296ee02045d2b17",
|
|
3441
3421
|
Testnet: "0x0"
|
|
3442
3422
|
}
|
|
3443
3423
|
};
|
|
3444
3424
|
|
|
3445
3425
|
// src/api.ts
|
|
3446
|
-
var SDK_VERSION =
|
|
3426
|
+
var SDK_VERSION = 1010106;
|
|
3447
3427
|
function parseRouterResponse(data, byAmountIn) {
|
|
3448
3428
|
let packages = /* @__PURE__ */ new Map();
|
|
3449
3429
|
if (data.packages) {
|
|
@@ -3606,7 +3586,6 @@ function getRouter(endpoint, apiKey, params) {
|
|
|
3606
3586
|
url += `&apiKey=${apiKey}`;
|
|
3607
3587
|
}
|
|
3608
3588
|
url += `&v=${SDK_VERSION}`;
|
|
3609
|
-
console.log("url", url);
|
|
3610
3589
|
const response = yield fetch(url);
|
|
3611
3590
|
return response;
|
|
3612
3591
|
} catch (error) {
|
|
@@ -3697,7 +3676,6 @@ function processFlattenRoutes(routerData) {
|
|
|
3697
3676
|
flattenedPaths[i].isLastUseOfIntermediateToken = true;
|
|
3698
3677
|
}
|
|
3699
3678
|
}
|
|
3700
|
-
console.log("flattenedPaths", flattenedPaths);
|
|
3701
3679
|
return {
|
|
3702
3680
|
quoteID: routerData.quoteID || "",
|
|
3703
3681
|
amountIn: routerData.amountIn,
|
|
@@ -4016,18 +3994,17 @@ P.hyperbolicTangent = P.tanh = function() {
|
|
|
4016
3994
|
return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);
|
|
4017
3995
|
};
|
|
4018
3996
|
P.inverseCosine = P.acos = function() {
|
|
4019
|
-
var
|
|
3997
|
+
var x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;
|
|
4020
3998
|
if (k !== -1) {
|
|
4021
3999
|
return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN);
|
|
4022
4000
|
}
|
|
4023
4001
|
if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);
|
|
4024
4002
|
Ctor.precision = pr + 6;
|
|
4025
4003
|
Ctor.rounding = 1;
|
|
4026
|
-
x = x.
|
|
4027
|
-
halfPi = getPi(Ctor, pr + 4, rm).times(0.5);
|
|
4004
|
+
x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();
|
|
4028
4005
|
Ctor.precision = pr;
|
|
4029
4006
|
Ctor.rounding = rm;
|
|
4030
|
-
return
|
|
4007
|
+
return x.times(2);
|
|
4031
4008
|
};
|
|
4032
4009
|
P.inverseHyperbolicCosine = P.acosh = function() {
|
|
4033
4010
|
var pr, rm, x = this, Ctor = x.constructor;
|
|
@@ -4799,7 +4776,7 @@ function cosine(Ctor, x) {
|
|
|
4799
4776
|
Ctor.precision -= k;
|
|
4800
4777
|
return x;
|
|
4801
4778
|
}
|
|
4802
|
-
var divide = /* @__PURE__ */ function() {
|
|
4779
|
+
var divide = /* @__PURE__ */ (function() {
|
|
4803
4780
|
function multiplyInteger(x, k, base) {
|
|
4804
4781
|
var temp, carry = 0, i = x.length;
|
|
4805
4782
|
for (x = x.slice(); i--; ) {
|
|
@@ -4957,7 +4934,7 @@ var divide = /* @__PURE__ */ function() {
|
|
|
4957
4934
|
}
|
|
4958
4935
|
return q;
|
|
4959
4936
|
};
|
|
4960
|
-
}();
|
|
4937
|
+
})();
|
|
4961
4938
|
function finalise(x, sd, rm, isTruncated) {
|
|
4962
4939
|
var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor;
|
|
4963
4940
|
out: if (sd != null) {
|
|
@@ -5125,14 +5102,16 @@ function intPow(Ctor, x, n, pr) {
|
|
|
5125
5102
|
function isOdd(n) {
|
|
5126
5103
|
return n.d[n.d.length - 1] & 1;
|
|
5127
5104
|
}
|
|
5128
|
-
function maxOrMin(Ctor, args,
|
|
5129
|
-
var y, x = new Ctor(args[0]), i = 0;
|
|
5105
|
+
function maxOrMin(Ctor, args, n) {
|
|
5106
|
+
var k, y, x = new Ctor(args[0]), i = 0;
|
|
5130
5107
|
for (; ++i < args.length; ) {
|
|
5131
5108
|
y = new Ctor(args[i]);
|
|
5132
5109
|
if (!y.s) {
|
|
5133
5110
|
x = y;
|
|
5134
5111
|
break;
|
|
5135
|
-
}
|
|
5112
|
+
}
|
|
5113
|
+
k = x.cmp(y);
|
|
5114
|
+
if (k === n || k === 0 && x.s === n) {
|
|
5136
5115
|
x = y;
|
|
5137
5116
|
}
|
|
5138
5117
|
}
|
|
@@ -5675,24 +5654,35 @@ function clone(obj) {
|
|
|
5675
5654
|
x.d = [v];
|
|
5676
5655
|
}
|
|
5677
5656
|
return;
|
|
5678
|
-
}
|
|
5657
|
+
}
|
|
5658
|
+
if (v * 0 !== 0) {
|
|
5679
5659
|
if (!v) x.s = NaN;
|
|
5680
5660
|
x.e = NaN;
|
|
5681
5661
|
x.d = null;
|
|
5682
5662
|
return;
|
|
5683
5663
|
}
|
|
5684
5664
|
return parseDecimal(x, v.toString());
|
|
5685
|
-
} else if (t !== "string") {
|
|
5686
|
-
throw Error(invalidArgument + v);
|
|
5687
5665
|
}
|
|
5688
|
-
if (
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5666
|
+
if (t === "string") {
|
|
5667
|
+
if ((i2 = v.charCodeAt(0)) === 45) {
|
|
5668
|
+
v = v.slice(1);
|
|
5669
|
+
x.s = -1;
|
|
5670
|
+
} else {
|
|
5671
|
+
if (i2 === 43) v = v.slice(1);
|
|
5672
|
+
x.s = 1;
|
|
5673
|
+
}
|
|
5674
|
+
return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);
|
|
5675
|
+
}
|
|
5676
|
+
if (t === "bigint") {
|
|
5677
|
+
if (v < 0) {
|
|
5678
|
+
v = -v;
|
|
5679
|
+
x.s = -1;
|
|
5680
|
+
} else {
|
|
5681
|
+
x.s = 1;
|
|
5682
|
+
}
|
|
5683
|
+
return parseDecimal(x, v.toString());
|
|
5694
5684
|
}
|
|
5695
|
-
|
|
5685
|
+
throw Error(invalidArgument + v);
|
|
5696
5686
|
}
|
|
5697
5687
|
Decimal2.prototype = P;
|
|
5698
5688
|
Decimal2.ROUND_UP = 0;
|
|
@@ -5799,10 +5789,10 @@ function log10(x) {
|
|
|
5799
5789
|
return new this(x).log(10);
|
|
5800
5790
|
}
|
|
5801
5791
|
function max() {
|
|
5802
|
-
return maxOrMin(this, arguments,
|
|
5792
|
+
return maxOrMin(this, arguments, -1);
|
|
5803
5793
|
}
|
|
5804
5794
|
function min() {
|
|
5805
|
-
return maxOrMin(this, arguments,
|
|
5795
|
+
return maxOrMin(this, arguments, 1);
|
|
5806
5796
|
}
|
|
5807
5797
|
function mod(x, y) {
|
|
5808
5798
|
return new this(x).mod(y);
|
|
@@ -6713,7 +6703,7 @@ var SpringsuiRouter = class {
|
|
|
6713
6703
|
const args = [
|
|
6714
6704
|
swapContext,
|
|
6715
6705
|
txb.object(swapData.poolId),
|
|
6716
|
-
txb.object(
|
|
6706
|
+
txb.object("0x5"),
|
|
6717
6707
|
txb.pure.u64(swapData.amountIn),
|
|
6718
6708
|
txb.pure.bool(swapData.direction)
|
|
6719
6709
|
];
|
|
@@ -7395,7 +7385,8 @@ var VoloRouter = class {
|
|
|
7395
7385
|
swapContext,
|
|
7396
7386
|
txb.object(this.stakePool),
|
|
7397
7387
|
txb.object(this.metadata),
|
|
7398
|
-
txb.object(
|
|
7388
|
+
txb.object("0x5"),
|
|
7389
|
+
// SuiSystemState
|
|
7399
7390
|
txb.pure.bool(swapData.direction),
|
|
7400
7391
|
txb.pure.u64(swapData.amountIn)
|
|
7401
7392
|
];
|
|
@@ -7446,7 +7437,8 @@ var AfsuiRouter = class {
|
|
|
7446
7437
|
swapContext,
|
|
7447
7438
|
txb.object(this.stakedSuiVault),
|
|
7448
7439
|
txb.object(this.safe),
|
|
7449
|
-
txb.object(
|
|
7440
|
+
txb.object("0x5"),
|
|
7441
|
+
// SuiSystemState
|
|
7450
7442
|
txb.object(this.referVault),
|
|
7451
7443
|
txb.object(this.validator),
|
|
7452
7444
|
txb.pure.bool(swapData.direction),
|
|
@@ -7491,7 +7483,8 @@ var HaedalRouter = class {
|
|
|
7491
7483
|
const args = [
|
|
7492
7484
|
swapContext,
|
|
7493
7485
|
txb.object(swapData.poolId),
|
|
7494
|
-
txb.object(
|
|
7486
|
+
txb.object("0x5"),
|
|
7487
|
+
// SuiSystemState
|
|
7495
7488
|
txb.pure.bool(swapData.direction),
|
|
7496
7489
|
txb.pure.u64(swapData.amountIn)
|
|
7497
7490
|
];
|
|
@@ -8250,7 +8243,7 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8250
8243
|
this.apiKey = params.apiKey || "";
|
|
8251
8244
|
this.partner = params.partner;
|
|
8252
8245
|
if (params.overlayFeeRate) {
|
|
8253
|
-
if (params.overlayFeeRate > 0 && params.overlayFeeRate <= CLIENT_CONFIG.
|
|
8246
|
+
if (params.overlayFeeRate > 0 && params.overlayFeeRate <= CLIENT_CONFIG.MAX_OVERLAY_FEE_RATE) {
|
|
8254
8247
|
this.overlayFeeRate = params.overlayFeeRate * AGGREGATOR_V3_CONFIG.FEE_DENOMINATOR;
|
|
8255
8248
|
if (this.overlayFeeRate > AGGREGATOR_V3_CONFIG.MAX_FEE_RATE) {
|
|
8256
8249
|
throw new Error(
|
|
@@ -8891,7 +8884,7 @@ function recordFirstCoinIndex(paths) {
|
|
|
8891
8884
|
return newCoinRecord;
|
|
8892
8885
|
}
|
|
8893
8886
|
function checkOverlayFeeConfig(overlayFeeRate, overlayFeeReceiver) {
|
|
8894
|
-
if (overlayFeeRate > CLIENT_CONFIG.
|
|
8887
|
+
if (overlayFeeRate > CLIENT_CONFIG.MAX_OVERLAY_FEE_RATE_NUMERATOR) {
|
|
8895
8888
|
throw new Error(CLIENT_CONFIG.ERRORS.INVALID_OVERLAY_FEE_RATE);
|
|
8896
8889
|
}
|
|
8897
8890
|
if (overlayFeeReceiver === "0x0" && overlayFeeRate > 0) {
|
|
@@ -8912,16 +8905,19 @@ var getDefaultSuiInputType = (value) => {
|
|
|
8912
8905
|
if (typeof value === "boolean") {
|
|
8913
8906
|
return "bool";
|
|
8914
8907
|
}
|
|
8915
|
-
throw new
|
|
8908
|
+
throw new AggregatorError(
|
|
8909
|
+
`Unknown type for value: ${value}`,
|
|
8910
|
+
"InvalidType" /* InvalidType */
|
|
8911
|
+
);
|
|
8916
8912
|
};
|
|
8917
8913
|
/*! Bundled license information:
|
|
8918
8914
|
|
|
8919
8915
|
decimal.js/decimal.mjs:
|
|
8920
8916
|
(*!
|
|
8921
|
-
* decimal.js v10.
|
|
8917
|
+
* decimal.js v10.6.0
|
|
8922
8918
|
* An arbitrary-precision Decimal type for JavaScript.
|
|
8923
8919
|
* https://github.com/MikeMcl/decimal.js
|
|
8924
|
-
* Copyright (c)
|
|
8920
|
+
* Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>
|
|
8925
8921
|
* MIT Licence
|
|
8926
8922
|
*)
|
|
8927
8923
|
*/
|