@cetusprotocol/aggregator-sdk 1.2.0 → 1.2.1
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/dist/index.d.mts +98 -11
- package/dist/index.d.ts +98 -11
- package/dist/index.js +384 -43
- package/dist/index.mjs +383 -44
- package/examples/mergeSwapExample.ts +142 -0
- package/package.json +1 -1
- package/.github/workflows/test.yml +0 -152
- package/.vscode/settings.json +0 -8
- package/CLAUDE.md +0 -101
- package/docs/Cetus_Aggregator_V3_/346/216/245/345/217/243/346/226/207/346/241/243.md +0 -706
- package/docs/REFACTOR.md +0 -24
- package/docs//350/267/257/345/276/204/346/213/223/346/211/221/346/216/222/345/272/217.md +0 -208
- package/script/copy-to-sui-aggregator.sh +0 -85
- package/test.json +0 -267
package/dist/index.mjs
CHANGED
|
@@ -2845,37 +2845,61 @@ var TransactionErrorCode = /* @__PURE__ */ ((TransactionErrorCode2) => {
|
|
|
2845
2845
|
TransactionErrorCode2["MissAftermathLpSupplyType"] = `MissAftermathLpSupplyType`;
|
|
2846
2846
|
return TransactionErrorCode2;
|
|
2847
2847
|
})(TransactionErrorCode || {});
|
|
2848
|
+
var AggregatorError = class _AggregatorError extends Error {
|
|
2849
|
+
constructor(message, errorCode) {
|
|
2850
|
+
super(message);
|
|
2851
|
+
this.message = message;
|
|
2852
|
+
this.errorCode = errorCode;
|
|
2853
|
+
}
|
|
2854
|
+
static isAggregatorErrorCode(e, code) {
|
|
2855
|
+
return e instanceof _AggregatorError && e.errorCode === code;
|
|
2856
|
+
}
|
|
2857
|
+
};
|
|
2848
2858
|
var AggregatorServerErrorCode = /* @__PURE__ */ ((AggregatorServerErrorCode2) => {
|
|
2849
2859
|
AggregatorServerErrorCode2[AggregatorServerErrorCode2["NumberTooLarge"] = 1e3] = "NumberTooLarge";
|
|
2850
2860
|
AggregatorServerErrorCode2[AggregatorServerErrorCode2["RateLimitExceeded"] = 1001] = "RateLimitExceeded";
|
|
2851
2861
|
AggregatorServerErrorCode2[AggregatorServerErrorCode2["InsufficientLiquidity"] = 1002] = "InsufficientLiquidity";
|
|
2852
2862
|
AggregatorServerErrorCode2[AggregatorServerErrorCode2["HoneyPot"] = 1003] = "HoneyPot";
|
|
2863
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["BadRequest"] = 1004] = "BadRequest";
|
|
2864
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["Forbidden"] = 1005] = "Forbidden";
|
|
2865
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["InternalServerError"] = 1006] = "InternalServerError";
|
|
2866
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["NotFoundRoute"] = 1007] = "NotFoundRoute";
|
|
2867
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["ServiceUnavailable"] = 1008] = "ServiceUnavailable";
|
|
2868
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["UnsupportedApiVersion"] = 1009] = "UnsupportedApiVersion";
|
|
2869
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["HoneyPotScam"] = 1010] = "HoneyPotScam";
|
|
2870
|
+
AggregatorServerErrorCode2[AggregatorServerErrorCode2["UnknownError"] = 400] = "UnknownError";
|
|
2853
2871
|
return AggregatorServerErrorCode2;
|
|
2854
2872
|
})(AggregatorServerErrorCode || {});
|
|
2855
|
-
function getAggregatorServerErrorMessage(code) {
|
|
2873
|
+
function getAggregatorServerErrorMessage(code, msg) {
|
|
2856
2874
|
switch (code) {
|
|
2857
2875
|
case 1e3 /* NumberTooLarge */:
|
|
2858
|
-
return "Number too large";
|
|
2876
|
+
return "Number too large" + (msg ? `: ${msg}` : "");
|
|
2859
2877
|
case 1001 /* RateLimitExceeded */:
|
|
2860
|
-
return "Rate limit exceeded";
|
|
2878
|
+
return "Rate limit exceeded" + (msg ? `: ${msg}` : "");
|
|
2861
2879
|
case 1002 /* InsufficientLiquidity */:
|
|
2862
|
-
return "Insufficient liquidity";
|
|
2880
|
+
return "Insufficient liquidity" + (msg ? `: ${msg}` : "");
|
|
2863
2881
|
case 1003 /* HoneyPot */:
|
|
2864
|
-
return "HoneyPot scam detected";
|
|
2882
|
+
return "HoneyPot scam detected" + (msg ? `: ${msg}` : "");
|
|
2883
|
+
case 1005 /* Forbidden */:
|
|
2884
|
+
return "Forbidden" + (msg ? `: ${msg}` : "");
|
|
2885
|
+
case 1004 /* BadRequest */:
|
|
2886
|
+
return "Bad request" + (msg ? `: ${msg}` : "");
|
|
2887
|
+
case 1006 /* InternalServerError */:
|
|
2888
|
+
return "Internal server error" + (msg ? `: ${msg}` : "");
|
|
2889
|
+
case 1007 /* NotFoundRoute */:
|
|
2890
|
+
return "Not found route" + (msg ? `: ${msg}` : "");
|
|
2891
|
+
case 1008 /* ServiceUnavailable */:
|
|
2892
|
+
return "Service unavailable" + (msg ? `: ${msg}` : "");
|
|
2893
|
+
case 1009 /* UnsupportedApiVersion */:
|
|
2894
|
+
return "Unsupported API version" + (msg ? `: ${msg}` : "");
|
|
2895
|
+
case 1010 /* HoneyPotScam */:
|
|
2896
|
+
return "Detected HoneyPot Scam" + (msg ? `: ${msg}` : "");
|
|
2897
|
+
case 400 /* UnknownError */:
|
|
2898
|
+
return "Unknown error" + (msg ? `: ${msg}` : "");
|
|
2865
2899
|
default:
|
|
2866
2900
|
return "Unknown error";
|
|
2867
2901
|
}
|
|
2868
2902
|
}
|
|
2869
|
-
var AggregatorError = class _AggregatorError extends Error {
|
|
2870
|
-
constructor(message, errorCode) {
|
|
2871
|
-
super(message);
|
|
2872
|
-
this.message = message;
|
|
2873
|
-
this.errorCode = errorCode;
|
|
2874
|
-
}
|
|
2875
|
-
static isAggregatorErrorCode(e, code) {
|
|
2876
|
-
return e instanceof _AggregatorError && e.errorCode === code;
|
|
2877
|
-
}
|
|
2878
|
-
};
|
|
2879
2903
|
var EQUAL = 0;
|
|
2880
2904
|
var LESS_THAN = 1;
|
|
2881
2905
|
var GREATER_THAN = 2;
|
|
@@ -3423,7 +3447,7 @@ var AGGREGATOR_V3_CONFIG = {
|
|
|
3423
3447
|
};
|
|
3424
3448
|
|
|
3425
3449
|
// src/api.ts
|
|
3426
|
-
var SDK_VERSION =
|
|
3450
|
+
var SDK_VERSION = 1010201;
|
|
3427
3451
|
function parseRouterResponse(data, byAmountIn) {
|
|
3428
3452
|
let packages = /* @__PURE__ */ new Map();
|
|
3429
3453
|
if (data.packages) {
|
|
@@ -3458,6 +3482,50 @@ function parseRouterResponse(data, byAmountIn) {
|
|
|
3458
3482
|
}))
|
|
3459
3483
|
};
|
|
3460
3484
|
}
|
|
3485
|
+
function parseMergeSwapResponse(data) {
|
|
3486
|
+
var _a;
|
|
3487
|
+
let packages = /* @__PURE__ */ new Map();
|
|
3488
|
+
if (data.packages) {
|
|
3489
|
+
if (data.packages instanceof Map) {
|
|
3490
|
+
packages = data.packages;
|
|
3491
|
+
} else if (typeof data.packages === "object") {
|
|
3492
|
+
Object.entries(data.packages).forEach(([key, value]) => {
|
|
3493
|
+
packages.set(key, value);
|
|
3494
|
+
});
|
|
3495
|
+
}
|
|
3496
|
+
}
|
|
3497
|
+
const allRoutes = [];
|
|
3498
|
+
if (data.all_routes) {
|
|
3499
|
+
for (const route of data.all_routes) {
|
|
3500
|
+
const mergeRoute = {
|
|
3501
|
+
amountIn: new import_bn2.default(route.amount_in.toString()),
|
|
3502
|
+
amountOut: new import_bn2.default(route.amount_out.toString()),
|
|
3503
|
+
deviationRatio: route.deviation_ratio,
|
|
3504
|
+
paths: route.paths.map((path) => ({
|
|
3505
|
+
id: path.id,
|
|
3506
|
+
direction: path.direction,
|
|
3507
|
+
provider: path.provider,
|
|
3508
|
+
from: path.from,
|
|
3509
|
+
target: path.target,
|
|
3510
|
+
feeRate: path.fee_rate,
|
|
3511
|
+
amountIn: path.amount_in.toString(),
|
|
3512
|
+
amountOut: path.amount_out.toString(),
|
|
3513
|
+
version: path.version,
|
|
3514
|
+
publishedAt: path.published_at,
|
|
3515
|
+
extendedDetails: path.extended_details
|
|
3516
|
+
}))
|
|
3517
|
+
};
|
|
3518
|
+
allRoutes.push(mergeRoute);
|
|
3519
|
+
}
|
|
3520
|
+
}
|
|
3521
|
+
return {
|
|
3522
|
+
quoteID: data.request_id || "",
|
|
3523
|
+
totalAmountOut: new import_bn2.default(((_a = data.total_amount_out) == null ? void 0 : _a.toString()) || "0"),
|
|
3524
|
+
allRoutes,
|
|
3525
|
+
packages,
|
|
3526
|
+
gas: data.gas
|
|
3527
|
+
};
|
|
3528
|
+
}
|
|
3461
3529
|
function getRouterResult(endpoint, apiKey, params, overlayFee, overlayFeeReceiver) {
|
|
3462
3530
|
return __async(this, null, function* () {
|
|
3463
3531
|
let response;
|
|
@@ -3470,7 +3538,7 @@ function getRouterResult(endpoint, apiKey, params, overlayFee, overlayFeeReceive
|
|
|
3470
3538
|
return null;
|
|
3471
3539
|
}
|
|
3472
3540
|
if (!response.ok) {
|
|
3473
|
-
let errorCode =
|
|
3541
|
+
let errorCode = 1004 /* BadRequest */;
|
|
3474
3542
|
if (response.status === 429) {
|
|
3475
3543
|
errorCode = 1001 /* RateLimitExceeded */;
|
|
3476
3544
|
}
|
|
@@ -3489,24 +3557,6 @@ function getRouterResult(endpoint, apiKey, params, overlayFee, overlayFeeReceive
|
|
|
3489
3557
|
};
|
|
3490
3558
|
}
|
|
3491
3559
|
const data = JSONbig.parse(yield response.text());
|
|
3492
|
-
const insufficientLiquidity = data.msg === "liquidity is not enough";
|
|
3493
|
-
if (data.msg && data.msg.indexOf("HoneyPot scam") > -1) {
|
|
3494
|
-
return {
|
|
3495
|
-
quoteID: "",
|
|
3496
|
-
amountIn: ZERO,
|
|
3497
|
-
amountOut: ZERO,
|
|
3498
|
-
paths: [],
|
|
3499
|
-
byAmountIn: params.byAmountIn,
|
|
3500
|
-
insufficientLiquidity,
|
|
3501
|
-
deviationRatio: 0,
|
|
3502
|
-
error: {
|
|
3503
|
-
code: 1003 /* HoneyPot */,
|
|
3504
|
-
msg: getAggregatorServerErrorMessage(
|
|
3505
|
-
1003 /* HoneyPot */
|
|
3506
|
-
)
|
|
3507
|
-
}
|
|
3508
|
-
};
|
|
3509
|
-
}
|
|
3510
3560
|
if (data.data != null) {
|
|
3511
3561
|
const res = parseRouterResponse(data.data, params.byAmountIn);
|
|
3512
3562
|
if (overlayFee > 0 && overlayFeeReceiver !== "0x0") {
|
|
@@ -3531,6 +3581,9 @@ function getRouterResult(endpoint, apiKey, params, overlayFee, overlayFeeReceive
|
|
|
3531
3581
|
}
|
|
3532
3582
|
return res;
|
|
3533
3583
|
}
|
|
3584
|
+
const code = processErrorStatusCode(data.code);
|
|
3585
|
+
const msg = getAggregatorServerErrorMessage(code, data.msg);
|
|
3586
|
+
const insufficientLiquidity = msg.includes("Insufficient liquidity");
|
|
3534
3587
|
return {
|
|
3535
3588
|
quoteID: "",
|
|
3536
3589
|
amountIn: ZERO,
|
|
@@ -3540,10 +3593,8 @@ function getRouterResult(endpoint, apiKey, params, overlayFee, overlayFeeReceive
|
|
|
3540
3593
|
byAmountIn: params.byAmountIn,
|
|
3541
3594
|
deviationRatio: 0,
|
|
3542
3595
|
error: {
|
|
3543
|
-
code
|
|
3544
|
-
msg
|
|
3545
|
-
1002 /* InsufficientLiquidity */
|
|
3546
|
-
)
|
|
3596
|
+
code,
|
|
3597
|
+
msg
|
|
3547
3598
|
}
|
|
3548
3599
|
};
|
|
3549
3600
|
});
|
|
@@ -3645,6 +3696,103 @@ function postRouterWithLiquidityChanges(endpoint, params) {
|
|
|
3645
3696
|
}
|
|
3646
3697
|
});
|
|
3647
3698
|
}
|
|
3699
|
+
function getMergeSwapRouter(endpoint, apiKey, params) {
|
|
3700
|
+
return __async(this, null, function* () {
|
|
3701
|
+
try {
|
|
3702
|
+
const { target, byAmountIn, depth, providers, froms } = params;
|
|
3703
|
+
const targetCoin = completionCoin(target);
|
|
3704
|
+
let url = `${endpoint}/multi_find_routes?target=${targetCoin}&by_amount_in=${byAmountIn}`;
|
|
3705
|
+
if (depth) {
|
|
3706
|
+
url += `&depth=${depth}`;
|
|
3707
|
+
}
|
|
3708
|
+
if (providers && providers.length > 0) {
|
|
3709
|
+
url += `&providers=${providers.join(",")}`;
|
|
3710
|
+
}
|
|
3711
|
+
if (apiKey.length > 0) {
|
|
3712
|
+
url += `&apiKey=${apiKey}`;
|
|
3713
|
+
}
|
|
3714
|
+
url += `&v=${SDK_VERSION}`;
|
|
3715
|
+
const fromsData = froms.map((from) => ({
|
|
3716
|
+
coin_type: completionCoin(from.coinType),
|
|
3717
|
+
amount: Number(from.amount.toString())
|
|
3718
|
+
}));
|
|
3719
|
+
url += `&froms=${encodeURIComponent(JSON.stringify(fromsData))}`;
|
|
3720
|
+
const response = yield fetch(url);
|
|
3721
|
+
console.log("response", response);
|
|
3722
|
+
return response;
|
|
3723
|
+
} catch (error) {
|
|
3724
|
+
console.error(error);
|
|
3725
|
+
return null;
|
|
3726
|
+
}
|
|
3727
|
+
});
|
|
3728
|
+
}
|
|
3729
|
+
function getMergeSwapResult(endpoint, apiKey, params, overlayFee, overlayFeeReceiver) {
|
|
3730
|
+
return __async(this, null, function* () {
|
|
3731
|
+
const response = yield getMergeSwapRouter(endpoint, apiKey, params);
|
|
3732
|
+
if (!response) {
|
|
3733
|
+
return null;
|
|
3734
|
+
}
|
|
3735
|
+
if (!response.ok) {
|
|
3736
|
+
let errorCode = 1004 /* BadRequest */;
|
|
3737
|
+
if (response.status === 429) {
|
|
3738
|
+
errorCode = 1001 /* RateLimitExceeded */;
|
|
3739
|
+
}
|
|
3740
|
+
return {
|
|
3741
|
+
quoteID: "",
|
|
3742
|
+
totalAmountOut: ZERO,
|
|
3743
|
+
allRoutes: [],
|
|
3744
|
+
error: {
|
|
3745
|
+
code: errorCode,
|
|
3746
|
+
msg: getAggregatorServerErrorMessage(errorCode)
|
|
3747
|
+
}
|
|
3748
|
+
};
|
|
3749
|
+
}
|
|
3750
|
+
if (!response.ok) {
|
|
3751
|
+
const code2 = processErrorStatusCode(response.status);
|
|
3752
|
+
const responseText2 = yield response.text();
|
|
3753
|
+
const data2 = JSONbig.parse(responseText2);
|
|
3754
|
+
const msg2 = getAggregatorServerErrorMessage(code2, data2.msg);
|
|
3755
|
+
return {
|
|
3756
|
+
quoteID: "",
|
|
3757
|
+
totalAmountOut: ZERO,
|
|
3758
|
+
allRoutes: [],
|
|
3759
|
+
error: {
|
|
3760
|
+
code: code2,
|
|
3761
|
+
msg: msg2
|
|
3762
|
+
}
|
|
3763
|
+
};
|
|
3764
|
+
}
|
|
3765
|
+
const responseText = yield response.text();
|
|
3766
|
+
const data = JSONbig.parse(responseText);
|
|
3767
|
+
if (data.data != null) {
|
|
3768
|
+
console.log("data.data not null", data.data);
|
|
3769
|
+
const res = parseMergeSwapResponse(data.data);
|
|
3770
|
+
if (overlayFee > 0 && overlayFeeReceiver !== "0x0" && params.byAmountIn) {
|
|
3771
|
+
const overlayFeeAmount = res.totalAmountOut.mul(new import_bn2.default(overlayFee)).div(new import_bn2.default(1e6));
|
|
3772
|
+
res.totalAmountOut = res.totalAmountOut.sub(overlayFeeAmount);
|
|
3773
|
+
for (const route of res.allRoutes) {
|
|
3774
|
+
const routeFee = route.amountOut.mul(new import_bn2.default(overlayFee)).div(new import_bn2.default(1e6));
|
|
3775
|
+
route.amountOut = route.amountOut.sub(routeFee);
|
|
3776
|
+
}
|
|
3777
|
+
}
|
|
3778
|
+
if (!res.packages) {
|
|
3779
|
+
res.packages = /* @__PURE__ */ new Map();
|
|
3780
|
+
}
|
|
3781
|
+
return res;
|
|
3782
|
+
}
|
|
3783
|
+
const code = processErrorStatusCode(data.code);
|
|
3784
|
+
const msg = getAggregatorServerErrorMessage(code, data.msg);
|
|
3785
|
+
return {
|
|
3786
|
+
quoteID: "",
|
|
3787
|
+
totalAmountOut: ZERO,
|
|
3788
|
+
allRoutes: [],
|
|
3789
|
+
error: {
|
|
3790
|
+
code,
|
|
3791
|
+
msg
|
|
3792
|
+
}
|
|
3793
|
+
};
|
|
3794
|
+
});
|
|
3795
|
+
}
|
|
3648
3796
|
function getDeepbookV3Config(endpoint) {
|
|
3649
3797
|
return __async(this, null, function* () {
|
|
3650
3798
|
const url = `${endpoint}/deepbookv3_config`;
|
|
@@ -3690,6 +3838,32 @@ function processFlattenRoutes(routerData) {
|
|
|
3690
3838
|
overlayFee: routerData.overlayFee
|
|
3691
3839
|
};
|
|
3692
3840
|
}
|
|
3841
|
+
function processErrorStatusCode(status) {
|
|
3842
|
+
switch (status) {
|
|
3843
|
+
case 400:
|
|
3844
|
+
return 1004 /* BadRequest */;
|
|
3845
|
+
case 403:
|
|
3846
|
+
return 1005 /* Forbidden */;
|
|
3847
|
+
case 429:
|
|
3848
|
+
return 1001 /* RateLimitExceeded */;
|
|
3849
|
+
case 4e3:
|
|
3850
|
+
return 1004 /* BadRequest */;
|
|
3851
|
+
case 4030:
|
|
3852
|
+
return 1005 /* Forbidden */;
|
|
3853
|
+
case 4040:
|
|
3854
|
+
return 1010 /* HoneyPotScam */;
|
|
3855
|
+
case 5e3:
|
|
3856
|
+
return 1002 /* InsufficientLiquidity */;
|
|
3857
|
+
case 5001:
|
|
3858
|
+
return 1007 /* NotFoundRoute */;
|
|
3859
|
+
case 5030:
|
|
3860
|
+
return 1008 /* ServiceUnavailable */;
|
|
3861
|
+
case 5040:
|
|
3862
|
+
return 1009 /* UnsupportedApiVersion */;
|
|
3863
|
+
default:
|
|
3864
|
+
return 400 /* UnknownError */;
|
|
3865
|
+
}
|
|
3866
|
+
}
|
|
3693
3867
|
|
|
3694
3868
|
// src/config.ts
|
|
3695
3869
|
var Env = /* @__PURE__ */ ((Env2) => {
|
|
@@ -8101,6 +8275,53 @@ var FullsailRouter = class {
|
|
|
8101
8275
|
});
|
|
8102
8276
|
}
|
|
8103
8277
|
};
|
|
8278
|
+
var CetusDlmmRouter = class {
|
|
8279
|
+
constructor(env, partner) {
|
|
8280
|
+
if (env !== 0 /* Mainnet */) {
|
|
8281
|
+
throw new Error("CetusRouter only supported on mainnet");
|
|
8282
|
+
}
|
|
8283
|
+
this.globalConfig = "0xf31b605d117f959b9730e8c07b08b856cb05143c5e81d5751c90d2979e82f599";
|
|
8284
|
+
this.partner = partner != null ? partner : "0x59ae16f6c42f578063c2da9b9c0173fe58120ceae08e40fd8212c8eceb80bb86";
|
|
8285
|
+
this.versioned = "0x05370b2d656612dd5759cbe80463de301e3b94a921dfc72dd9daa2ecdeb2d0a8";
|
|
8286
|
+
}
|
|
8287
|
+
swap(txb, flattenedPath, swapContext, _extends) {
|
|
8288
|
+
const swapData = this.prepareSwapData(flattenedPath);
|
|
8289
|
+
this.executeSwapContract(txb, swapData, swapContext);
|
|
8290
|
+
}
|
|
8291
|
+
prepareSwapData(flattenedPath) {
|
|
8292
|
+
if (flattenedPath.path.publishedAt == null) {
|
|
8293
|
+
throw new Error("Cetus not set publishedAt");
|
|
8294
|
+
}
|
|
8295
|
+
const path = flattenedPath.path;
|
|
8296
|
+
const [coinAType, coinBType] = path.direction ? [path.from, path.target] : [path.target, path.from];
|
|
8297
|
+
const amountIn = flattenedPath.isLastUseOfIntermediateToken ? AGGREGATOR_V3_CONFIG.MAX_AMOUNT_IN : path.amountIn;
|
|
8298
|
+
return {
|
|
8299
|
+
coinAType,
|
|
8300
|
+
coinBType,
|
|
8301
|
+
direction: path.direction,
|
|
8302
|
+
amountIn,
|
|
8303
|
+
publishedAt: path.publishedAt,
|
|
8304
|
+
poolId: path.id
|
|
8305
|
+
};
|
|
8306
|
+
}
|
|
8307
|
+
executeSwapContract(txb, swapData, swapContext) {
|
|
8308
|
+
const args = [
|
|
8309
|
+
swapContext,
|
|
8310
|
+
txb.object(this.globalConfig),
|
|
8311
|
+
txb.object(swapData.poolId),
|
|
8312
|
+
txb.object(this.partner),
|
|
8313
|
+
txb.pure.bool(swapData.direction),
|
|
8314
|
+
txb.pure.u64(swapData.amountIn),
|
|
8315
|
+
txb.object(this.versioned),
|
|
8316
|
+
txb.object(SUI_CLOCK_OBJECT_ID)
|
|
8317
|
+
];
|
|
8318
|
+
txb.moveCall({
|
|
8319
|
+
target: `${swapData.publishedAt}::cetus_dlmm::swap`,
|
|
8320
|
+
typeArguments: [swapData.coinAType, swapData.coinBType],
|
|
8321
|
+
arguments: args
|
|
8322
|
+
});
|
|
8323
|
+
}
|
|
8324
|
+
};
|
|
8104
8325
|
|
|
8105
8326
|
// src/client.ts
|
|
8106
8327
|
var CETUS = "CETUS";
|
|
@@ -8133,6 +8354,7 @@ var MAGMA = "MAGMA";
|
|
|
8133
8354
|
var SEVENK = "SEVENK";
|
|
8134
8355
|
var HAEDALHMMV2 = "HAEDALHMMV2";
|
|
8135
8356
|
var FULLSAIL = "FULLSAIL";
|
|
8357
|
+
var CETUSDLMM = "CETUSDLMM";
|
|
8136
8358
|
var DEFAULT_ENDPOINT = "https://api-sui.cetus.zone/router_v3";
|
|
8137
8359
|
var ALL_DEXES = [
|
|
8138
8360
|
CETUS,
|
|
@@ -8163,7 +8385,8 @@ var ALL_DEXES = [
|
|
|
8163
8385
|
MAGMA,
|
|
8164
8386
|
SEVENK,
|
|
8165
8387
|
HAEDALHMMV2,
|
|
8166
|
-
FULLSAIL
|
|
8388
|
+
FULLSAIL,
|
|
8389
|
+
CETUSDLMM
|
|
8167
8390
|
];
|
|
8168
8391
|
function getAllProviders() {
|
|
8169
8392
|
return ALL_DEXES;
|
|
@@ -8242,6 +8465,7 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8242
8465
|
);
|
|
8243
8466
|
this.apiKey = params.apiKey || "";
|
|
8244
8467
|
this.partner = params.partner;
|
|
8468
|
+
this.cetusDlmmPartner = params.cetusDlmmPartner;
|
|
8245
8469
|
if (params.overlayFeeRate) {
|
|
8246
8470
|
if (params.overlayFeeRate > 0 && params.overlayFeeRate <= CLIENT_CONFIG.MAX_OVERLAY_FEE_RATE) {
|
|
8247
8471
|
this.overlayFeeRate = params.overlayFeeRate * AGGREGATOR_V3_CONFIG.FEE_DENOMINATOR;
|
|
@@ -8307,11 +8531,22 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8307
8531
|
);
|
|
8308
8532
|
});
|
|
8309
8533
|
}
|
|
8534
|
+
findMergeSwapRouters(params) {
|
|
8535
|
+
return __async(this, null, function* () {
|
|
8536
|
+
return getMergeSwapResult(
|
|
8537
|
+
this.endpoint,
|
|
8538
|
+
this.apiKey,
|
|
8539
|
+
params,
|
|
8540
|
+
this.overlayFeeRate,
|
|
8541
|
+
this.overlayFeeReceiver
|
|
8542
|
+
);
|
|
8543
|
+
});
|
|
8544
|
+
}
|
|
8310
8545
|
executeFlexibleInputSwap(txb, inputCoin, routerData, expectedAmountOut, amountLimit, pythPriceIDs, partner, deepbookv3DeepFee, packages) {
|
|
8311
8546
|
return __async(this, null, function* () {
|
|
8312
8547
|
});
|
|
8313
8548
|
}
|
|
8314
|
-
newDexRouterV3(provider, pythPriceIDs, partner) {
|
|
8549
|
+
newDexRouterV3(provider, pythPriceIDs, partner, cetusDlmmPartner) {
|
|
8315
8550
|
switch (provider) {
|
|
8316
8551
|
case CETUS:
|
|
8317
8552
|
return new CetusRouter(this.env, partner);
|
|
@@ -8371,13 +8606,15 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8371
8606
|
return new HaedalHMMV2Router(this.env, pythPriceIDs);
|
|
8372
8607
|
case FULLSAIL:
|
|
8373
8608
|
return new FullsailRouter(this.env);
|
|
8609
|
+
case CETUSDLMM:
|
|
8610
|
+
return new CetusDlmmRouter(this.env, cetusDlmmPartner);
|
|
8374
8611
|
default:
|
|
8375
8612
|
throw new Error(
|
|
8376
8613
|
`${CLIENT_CONFIG.ERRORS.UNSUPPORTED_DEX} ${provider}`
|
|
8377
8614
|
);
|
|
8378
8615
|
}
|
|
8379
8616
|
}
|
|
8380
|
-
expectInputSwapV3(txb, inputCoin, routerData, expectAmountOut, amountOutLimit, pythPriceIDs, partner) {
|
|
8617
|
+
expectInputSwapV3(txb, inputCoin, routerData, expectAmountOut, amountOutLimit, pythPriceIDs, partner, cetusDlmmPartner) {
|
|
8381
8618
|
if (routerData.quoteID == null) {
|
|
8382
8619
|
throw new Error(CLIENT_CONFIG.ERRORS.QUOTE_ID_REQUIRED);
|
|
8383
8620
|
}
|
|
@@ -8402,7 +8639,12 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8402
8639
|
if (!dexRouters.has(path.provider)) {
|
|
8403
8640
|
dexRouters.set(
|
|
8404
8641
|
path.provider,
|
|
8405
|
-
this.newDexRouterV3(
|
|
8642
|
+
this.newDexRouterV3(
|
|
8643
|
+
path.provider,
|
|
8644
|
+
pythPriceIDs,
|
|
8645
|
+
partner,
|
|
8646
|
+
cetusDlmmPartner
|
|
8647
|
+
)
|
|
8406
8648
|
);
|
|
8407
8649
|
}
|
|
8408
8650
|
const dex = dexRouters.get(path.provider);
|
|
@@ -8644,6 +8886,103 @@ var _AggregatorClient = class _AggregatorClient {
|
|
|
8644
8886
|
}
|
|
8645
8887
|
});
|
|
8646
8888
|
}
|
|
8889
|
+
mergeSwap(params) {
|
|
8890
|
+
return __async(this, null, function* () {
|
|
8891
|
+
const { router, inputCoins, slippage, txb, partner } = params;
|
|
8892
|
+
if (slippage > 1 || slippage < 0) {
|
|
8893
|
+
throw new Error(CLIENT_CONFIG.ERRORS.INVALID_SLIPPAGE);
|
|
8894
|
+
}
|
|
8895
|
+
if (!router.packages || !router.packages.get(PACKAGE_NAMES.AGGREGATOR_V3)) {
|
|
8896
|
+
throw new Error(CLIENT_CONFIG.ERRORS.PACKAGES_REQUIRED);
|
|
8897
|
+
}
|
|
8898
|
+
if (!router.allRoutes || router.allRoutes.length === 0) {
|
|
8899
|
+
throw new Error("No routes found in merge swap response");
|
|
8900
|
+
}
|
|
8901
|
+
const outputCoins = [];
|
|
8902
|
+
for (let i = 0; i < router.allRoutes.length && i < inputCoins.length; i++) {
|
|
8903
|
+
const route = router.allRoutes[i];
|
|
8904
|
+
const inputCoin = inputCoins[i];
|
|
8905
|
+
const routeRouter = {
|
|
8906
|
+
quoteID: router.quoteID,
|
|
8907
|
+
amountIn: route.amountIn,
|
|
8908
|
+
amountOut: route.amountOut,
|
|
8909
|
+
deviationRatio: Number(route.deviationRatio),
|
|
8910
|
+
byAmountIn: true,
|
|
8911
|
+
// Merge swap is always by amount in
|
|
8912
|
+
paths: route.paths,
|
|
8913
|
+
insufficientLiquidity: false,
|
|
8914
|
+
packages: router.packages
|
|
8915
|
+
};
|
|
8916
|
+
const routerParams = {
|
|
8917
|
+
router: routeRouter,
|
|
8918
|
+
inputCoin: inputCoin.coin,
|
|
8919
|
+
slippage,
|
|
8920
|
+
txb,
|
|
8921
|
+
partner: partner != null ? partner : this.partner
|
|
8922
|
+
};
|
|
8923
|
+
const outputCoin = yield this.routerSwap(routerParams);
|
|
8924
|
+
outputCoins.push(outputCoin);
|
|
8925
|
+
}
|
|
8926
|
+
if (outputCoins.length === 0) {
|
|
8927
|
+
throw new Error("No output coins generated from merge swap");
|
|
8928
|
+
}
|
|
8929
|
+
let finalOutputCoin = outputCoins[0];
|
|
8930
|
+
if (outputCoins.length > 1) {
|
|
8931
|
+
txb.mergeCoins(finalOutputCoin, outputCoins.slice(1));
|
|
8932
|
+
}
|
|
8933
|
+
return finalOutputCoin;
|
|
8934
|
+
});
|
|
8935
|
+
}
|
|
8936
|
+
fastMergeSwap(params) {
|
|
8937
|
+
return __async(this, null, function* () {
|
|
8938
|
+
const { router, slippage, txb, partner } = params;
|
|
8939
|
+
if (!router || !router.allRoutes || router.allRoutes.length === 0) {
|
|
8940
|
+
throw new Error("Invalid router: no routes found");
|
|
8941
|
+
}
|
|
8942
|
+
const firstRoute = router.allRoutes[0];
|
|
8943
|
+
const targetCoinType = firstRoute.paths[firstRoute.paths.length - 1].target;
|
|
8944
|
+
const inputCoins = [];
|
|
8945
|
+
const coinTypeSet = /* @__PURE__ */ new Set();
|
|
8946
|
+
for (const route of router.allRoutes) {
|
|
8947
|
+
const firstCoinType = route.paths[0].from;
|
|
8948
|
+
if (coinTypeSet.has(firstCoinType)) {
|
|
8949
|
+
continue;
|
|
8950
|
+
}
|
|
8951
|
+
coinTypeSet.add(firstCoinType);
|
|
8952
|
+
const coin = coinWithBalance({
|
|
8953
|
+
balance: BigInt(route.amountIn.toString()),
|
|
8954
|
+
useGasCoin: CoinUtils.isSuiCoin(firstCoinType),
|
|
8955
|
+
type: firstCoinType
|
|
8956
|
+
});
|
|
8957
|
+
inputCoins.push({ coinType: firstCoinType, coin });
|
|
8958
|
+
}
|
|
8959
|
+
const mergeSwapParams = {
|
|
8960
|
+
router,
|
|
8961
|
+
inputCoins,
|
|
8962
|
+
slippage,
|
|
8963
|
+
txb,
|
|
8964
|
+
partner: partner != null ? partner : this.partner
|
|
8965
|
+
};
|
|
8966
|
+
const targetCoin = yield this.mergeSwap(mergeSwapParams);
|
|
8967
|
+
if (CoinUtils.isSuiCoin(targetCoinType)) {
|
|
8968
|
+
txb.mergeCoins(txb.gas, [targetCoin]);
|
|
8969
|
+
} else {
|
|
8970
|
+
const targetCoinObjID = yield this.getOneCoinUsedToMerge(targetCoinType);
|
|
8971
|
+
if (targetCoinObjID != null) {
|
|
8972
|
+
txb.mergeCoins(txb.object(targetCoinObjID), [targetCoin]);
|
|
8973
|
+
} else {
|
|
8974
|
+
transferOrDestroyCoin(
|
|
8975
|
+
{
|
|
8976
|
+
coin: targetCoin,
|
|
8977
|
+
coinType: targetCoinType,
|
|
8978
|
+
packages: router.packages
|
|
8979
|
+
},
|
|
8980
|
+
txb
|
|
8981
|
+
);
|
|
8982
|
+
}
|
|
8983
|
+
}
|
|
8984
|
+
});
|
|
8985
|
+
}
|
|
8647
8986
|
fixableRouterSwapV3(params) {
|
|
8648
8987
|
return __async(this, null, function* () {
|
|
8649
8988
|
const { router, inputCoin, slippage, txb, partner } = params;
|
|
@@ -8922,4 +9261,4 @@ decimal.js/decimal.mjs:
|
|
|
8922
9261
|
*)
|
|
8923
9262
|
*/
|
|
8924
9263
|
|
|
8925
|
-
export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, AggregatorConfig, AggregatorError, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, CETUS, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CETUS_V3_PUBLISHED_AT, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, CoinInfoAddress, CoinStoreAddress, CoinUtils, ConfigErrorCode, DEEPBOOKV2, DEEPBOOKV3, DEEPBOOK_CLOB_V2_MODULE, DEEPBOOK_CUSTODIAN_V2_MODULE, DEEPBOOK_DEX, DEEPBOOK_MODULE, DEEPBOOK_PACKAGE_ID, DEEPBOOK_PUBLISHED_AT, DEEPBOOK_V3_DEEP_FEE_TYPES, DEFAULT_AGG_V2_ENDPOINT, DEFAULT_AGG_V3_ENDPOINT, DEFAULT_ENDPOINT, DEFAULT_GAS_BUDGET_FOR_MERGE, DEFAULT_GAS_BUDGET_FOR_SPLIT, DEFAULT_GAS_BUDGET_FOR_STAKE, DEFAULT_GAS_BUDGET_FOR_TRANSFER, DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI, DEFAULT_NFT_TRANSFER_GAS_FEE, Env, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAINNET_AFTERMATH_INSURANCE_FUND_ID, MAINNET_AFTERMATH_PROTOCOL_FEE_VAULT_ID, MAINNET_AFTERMATH_REFERRAL_VAULT_ID, MAINNET_AFTERMATH_REGISTRY_ID, MAINNET_AFTERMATH_TREASURY_ID, MAINNET_CETUS_GLOBAL_CONFIG_ID, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, REPAY_FLASH_SWAP_A2B_FUNC, REPAY_FLASH_SWAP_B2A_FUNC, REPAY_FLASH_SWAP_WITH_PARTNER_A2B_FUNC, REPAY_FLASH_SWAP_WITH_PARTNER_B2A_FUNC, RepayFalshSwapFunc, RepayFlashSwapWithPartnerFunc, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SuiZeroCoinFn, TEN_POW_NINE, TESTNET_AFTERMATH_INSURANCE_FUND_ID, TESTNET_AFTERMATH_PROTOCOL_FEE_VAULT_ID, TESTNET_AFTERMATH_REFERRAL_VAULT_ID, TESTNET_AFTERMATH_REGISTRY_ID, TESTNET_AFTERMATH_TREASURY_ID, TESTNET_CETUS_GLOBAL_CONFIG_ID, TESTNET_FLOWX_AMM_CONTAINER_ID, TRANSFER_ACCOUNT_CAP, TRANSFER_OR_DESTORY_COIN_FUNC, TURBOS, TURBOS_DEX, TURBOS_MODULE, TURBOS_VERSIONED, TWO, TransactionErrorCode, TypesErrorCode, U128, U64_MAX, U64_MAX_BN, UTILS_MODULE, VOLO, ZERO, buildInputCoin, calculateGasEfficiency, calculatePriceImpact, checkInvalidSuiAddress, compareCoins, compareGasMetrics, completionCoin, composeType, createTarget, dealWithFastRouterSwapParamsForMsafe, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, isSortedSymbols, isValidDowngradeUuid6, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
|
|
9264
|
+
export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, AggregatorConfig, AggregatorError, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CETUS_V3_PUBLISHED_AT, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, CoinInfoAddress, CoinStoreAddress, CoinUtils, ConfigErrorCode, DEEPBOOKV2, DEEPBOOKV3, DEEPBOOK_CLOB_V2_MODULE, DEEPBOOK_CUSTODIAN_V2_MODULE, DEEPBOOK_DEX, DEEPBOOK_MODULE, DEEPBOOK_PACKAGE_ID, DEEPBOOK_PUBLISHED_AT, DEEPBOOK_V3_DEEP_FEE_TYPES, DEFAULT_AGG_V2_ENDPOINT, DEFAULT_AGG_V3_ENDPOINT, DEFAULT_ENDPOINT, DEFAULT_GAS_BUDGET_FOR_MERGE, DEFAULT_GAS_BUDGET_FOR_SPLIT, DEFAULT_GAS_BUDGET_FOR_STAKE, DEFAULT_GAS_BUDGET_FOR_TRANSFER, DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI, DEFAULT_NFT_TRANSFER_GAS_FEE, Env, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAINNET_AFTERMATH_INSURANCE_FUND_ID, MAINNET_AFTERMATH_PROTOCOL_FEE_VAULT_ID, MAINNET_AFTERMATH_REFERRAL_VAULT_ID, MAINNET_AFTERMATH_REGISTRY_ID, MAINNET_AFTERMATH_TREASURY_ID, MAINNET_CETUS_GLOBAL_CONFIG_ID, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, REPAY_FLASH_SWAP_A2B_FUNC, REPAY_FLASH_SWAP_B2A_FUNC, REPAY_FLASH_SWAP_WITH_PARTNER_A2B_FUNC, REPAY_FLASH_SWAP_WITH_PARTNER_B2A_FUNC, RepayFalshSwapFunc, RepayFlashSwapWithPartnerFunc, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SuiZeroCoinFn, TEN_POW_NINE, TESTNET_AFTERMATH_INSURANCE_FUND_ID, TESTNET_AFTERMATH_PROTOCOL_FEE_VAULT_ID, TESTNET_AFTERMATH_REFERRAL_VAULT_ID, TESTNET_AFTERMATH_REGISTRY_ID, TESTNET_AFTERMATH_TREASURY_ID, TESTNET_CETUS_GLOBAL_CONFIG_ID, TESTNET_FLOWX_AMM_CONTAINER_ID, TRANSFER_ACCOUNT_CAP, TRANSFER_OR_DESTORY_COIN_FUNC, TURBOS, TURBOS_DEX, TURBOS_MODULE, TURBOS_VERSIONED, TWO, TransactionErrorCode, TypesErrorCode, U128, U64_MAX, U64_MAX_BN, UTILS_MODULE, VOLO, ZERO, buildInputCoin, calculateGasEfficiency, calculatePriceImpact, checkInvalidSuiAddress, compareCoins, compareGasMetrics, completionCoin, composeType, createTarget, dealWithFastRouterSwapParamsForMsafe, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, isSortedSymbols, isValidDowngradeUuid6, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
|