@cetusprotocol/aggregator-sdk 1.6.1 → 1.6.3

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/README.md CHANGED
@@ -196,18 +196,18 @@ if (routerRes != null) {
196
196
 
197
197
  | Contract | Tag of Repo | Latest published at address |
198
198
  | ------------------------- | ----------- | ------------------------------------------------------------------ |
199
- | CetusAggregatorV2 | mainnet | 0x40e457bc65a398d2db7026881358fcb7cfa2f1bb052bca41f46c55a1103f2d6f |
199
+ | CetusAggregatorV2 | mainnet | 0x3a7fa58adcd7ff474ca0330c93068b139f5263c0cf9c64e702f5c4b17996ff10 |
200
200
  | CetusAggregatorV2ExtendV1 | mainnet | 0x2edc22bf96c85482b2208624fa9339255d5055113c92fd6c33add48ce971b774 |
201
201
  | CetusAggregatorV2ExtendV2 | mainnet | 0x2e227a3cbc6715518b18ed339d2f967153674b7b257da114ca62c72b2011258a |
202
202
 
203
203
  ## Example
204
204
 
205
205
  ```
206
- CetusAggregatorV2 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2/mainnet", rev = "mainnet-v1.56.0", override = true }
206
+ CetusAggregatorV2 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2/mainnet", rev = "mainnet-v1.63.0", override = true }
207
207
 
208
- CetusAggregatorV2ExtendV1 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2-extend-v1", rev = "mainnet-v1.56.0", override = true }
208
+ CetusAggregatorV2ExtendV1 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2-extend-v1", rev = "mainnet-v1.63.0", override = true }
209
209
 
210
- CetusAggregatorV2ExtendV2 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2-extend-v2", rev = "mainnet-v1.56.0", override = true }
210
+ CetusAggregatorV2ExtendV2 = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2-extend-v2", rev = "mainnet-v1.63.0", override = true }
211
211
  ```
212
212
 
213
213
  # Simple Aggregator Contract Interface
@@ -218,12 +218,12 @@ CetusAggregatorV2ExtendV2 = { git = "https://github.com/CetusProtocol/aggregator
218
218
 
219
219
  | Contract | Tag of Repo | Latest published at address |
220
220
  | --------------------- | ----------- | ------------------------------------------------------------------ |
221
- | CetusAggregatorSimple | mainnet | 0x54394cb5bceb8073c60df0964b904a607c9974ef771d9e8b3f9c45b8ce075499 |
221
+ | CetusAggregatorSimple | mainnet | 0xf44ab76524a6b22a175968ae193a13f4905aea9b805afb6db51655b6b59db69e |
222
222
 
223
223
  ## Example
224
224
 
225
225
  ```
226
- CetusAggregatorSimple = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2/simple-mainnet", rev = "mainnet-v1.58.0", override = true }
226
+ CetusAggregatorSimple = { git = "https://github.com/CetusProtocol/aggregator.git", subdir = "packages/cetus-aggregator-v2/simple-mainnet", rev = "mainnet-v1.63.0", override = true }
227
227
  ```
228
228
 
229
229
  ## Usage
package/dist/index.cjs CHANGED
@@ -3416,7 +3416,7 @@ var AGGREGATOR_V3_CONFIG = {
3416
3416
  };
3417
3417
 
3418
3418
  // src/api.ts
3419
- var SDK_VERSION = 1010601;
3419
+ var SDK_VERSION = 1010603;
3420
3420
  function parseRouterResponse(data, byAmountIn) {
3421
3421
  let packages = /* @__PURE__ */ new Map();
3422
3422
  if (data.packages) {
@@ -7822,20 +7822,56 @@ function transferOrDestroyCoin(params, txb) {
7822
7822
  });
7823
7823
  }
7824
7824
  var MAX_ARGUMENT_SIZE = 16 * 1024;
7825
+ var DEFAULT_HERMES_URL = "https://hermes.pyth.network";
7826
+ var DEFAULT_AVAILABILITY_TIMEOUT = 3e3;
7827
+ var DEFAULT_IS_AVAILABLE_STATUS = (status) => status >= 200 && status < 400;
7825
7828
  var PythAdapter = class {
7826
7829
  constructor(client, pythStateId, wormholeStateId, hermesUrls) {
7827
7830
  this.priceFeedObjectIdCache = /* @__PURE__ */ new Map();
7828
7831
  this.client = client;
7829
7832
  this.pythStateId = pythStateId;
7830
7833
  this.wormholeStateId = wormholeStateId;
7831
- const urls = [...hermesUrls];
7832
- if (!urls.includes("https://hermes.pyth.network")) {
7833
- urls.push("https://hermes.pyth.network");
7834
+ const urls = Array.from(
7835
+ new Set(hermesUrls.filter(Boolean).map(normalizeServiceUrl))
7836
+ );
7837
+ if (!urls.includes(DEFAULT_HERMES_URL)) {
7838
+ urls.push(DEFAULT_HERMES_URL);
7834
7839
  }
7840
+ this.hermesUrls = urls;
7835
7841
  this.hermesClients = urls.map(
7836
7842
  (url) => new hermesClient.HermesClient(url, { timeout: 3e3 })
7837
7843
  );
7838
7844
  }
7845
+ getHermesUrls() {
7846
+ return [...this.hermesUrls];
7847
+ }
7848
+ async checkHermesAvailability({
7849
+ timeout = DEFAULT_AVAILABILITY_TIMEOUT,
7850
+ isAvailableStatus = DEFAULT_IS_AVAILABLE_STATUS
7851
+ } = {}) {
7852
+ if (this.hermesUrls.length === 0) {
7853
+ return {
7854
+ checked: false,
7855
+ availableUrls: [],
7856
+ unavailableUrls: []
7857
+ };
7858
+ }
7859
+ const results = await Promise.all(
7860
+ this.hermesUrls.map(async (url) => ({
7861
+ url,
7862
+ available: await checkServiceUrl(url, timeout, isAvailableStatus)
7863
+ }))
7864
+ );
7865
+ return {
7866
+ checked: true,
7867
+ availableUrls: results.filter((result) => result.available).map((result) => result.url),
7868
+ unavailableUrls: results.filter((result) => !result.available).map((result) => result.url)
7869
+ };
7870
+ }
7871
+ async isHermesAvailable(options) {
7872
+ const snapshot = await this.checkHermesAvailability(options);
7873
+ return snapshot.availableUrls.length > 0;
7874
+ }
7839
7875
  async getPriceFeedsUpdateData(priceIDs) {
7840
7876
  let lastError = null;
7841
7877
  for (const hermes of this.hermesClients) {
@@ -8044,6 +8080,25 @@ var PythAdapter = class {
8044
8080
  return priceInfoObjects;
8045
8081
  }
8046
8082
  };
8083
+ async function checkServiceUrl(url, timeout, isAvailableStatus) {
8084
+ const controller = new AbortController();
8085
+ const timer = setTimeout(() => controller.abort(), timeout);
8086
+ try {
8087
+ const response = await fetch(url, {
8088
+ method: "GET",
8089
+ cache: "no-store",
8090
+ signal: controller.signal
8091
+ });
8092
+ return isAvailableStatus(response.status);
8093
+ } catch {
8094
+ return false;
8095
+ } finally {
8096
+ clearTimeout(timer);
8097
+ }
8098
+ }
8099
+ function normalizeServiceUrl(url) {
8100
+ return url.replace(/\/+$/, "");
8101
+ }
8047
8102
 
8048
8103
  // src/utils/uuid.ts
8049
8104
  function generateDowngradeUuid6() {
@@ -8872,6 +8927,61 @@ var HaedalPropAmmRouter = class {
8872
8927
  });
8873
8928
  }
8874
8929
  };
8930
+ var CetusTideRouter = class {
8931
+ swap(txb, flattenedPath, swapContext, _extends) {
8932
+ const path = flattenedPath.path;
8933
+ if (!path.extendedDetails) {
8934
+ throw new Error("Cetus Tide: extended_details missing on path");
8935
+ }
8936
+ if (path.publishedAt == null) {
8937
+ throw new Error("Cetus Tide: path.publishedAt missing");
8938
+ }
8939
+ const ed = path.extendedDetails;
8940
+ const fill = this.validateFill(ed);
8941
+ const mmObjectId = ed.cetus_tide_mm_object_id;
8942
+ const versioned = ed.cetus_tide_versioned;
8943
+ const globalConfig = ed.cetus_tide_global_config;
8944
+ const [baseCoinType, quoteCoinType] = path.direction ? [path.from, path.target] : [path.target, path.from];
8945
+ const amountIn = flattenedPath.isLastUseOfIntermediateToken ? AGGREGATOR_V3_CONFIG.MAX_AMOUNT_IN : path.amountIn;
8946
+ const envelopeBytes = Array.from(utils.fromHex(fill.envelope));
8947
+ const signatureBytes = Array.from(utils.fromHex(fill.signature));
8948
+ const quoteHashBytes = Array.from(utils.fromHex(fill.quote_hash));
8949
+ const args = [
8950
+ swapContext,
8951
+ txb.object(versioned),
8952
+ txb.object(globalConfig),
8953
+ txb.object(mmObjectId),
8954
+ txb.object(path.id),
8955
+ txb.pure.vector("u8", envelopeBytes),
8956
+ txb.pure.vector("u8", signatureBytes),
8957
+ txb.pure.vector("u8", quoteHashBytes),
8958
+ txb.pure.u64(amountIn.toString()),
8959
+ txb.pure.bool(path.direction),
8960
+ txb.pure.vector("u8", quoteHashBytes),
8961
+ txb.object(utils.SUI_CLOCK_OBJECT_ID)
8962
+ ];
8963
+ txb.moveCall({
8964
+ target: `${path.publishedAt}::orderbook::swap`,
8965
+ typeArguments: [baseCoinType, quoteCoinType],
8966
+ arguments: args
8967
+ });
8968
+ }
8969
+ validateFill(ed) {
8970
+ if (!ed.cetus_tide_fill) {
8971
+ throw new Error("Cetus Tide: cetus_tide_fill missing");
8972
+ }
8973
+ if (!ed.cetus_tide_mm_object_id) {
8974
+ throw new Error("Cetus Tide: cetus_tide_mm_object_id missing");
8975
+ }
8976
+ if (!ed.cetus_tide_versioned) {
8977
+ throw new Error("Cetus Tide: cetus_tide_versioned missing");
8978
+ }
8979
+ if (!ed.cetus_tide_global_config) {
8980
+ throw new Error("Cetus Tide: cetus_tide_global_config missing");
8981
+ }
8982
+ return ed.cetus_tide_fill;
8983
+ }
8984
+ };
8875
8985
 
8876
8986
  // src/client.ts
8877
8987
  var CETUS = "CETUS";
@@ -8910,6 +9020,7 @@ var FERRACLMM = "FERRACLMM";
8910
9020
  var BOLT = "BOLT";
8911
9021
  var MAGMAPROPAMM = "MAGMAPROPAMM";
8912
9022
  var HAEDALPROPAMM = "HAEDALPROPAMM";
9023
+ var CETUS_TIDE = "CETUS_TIDE";
8913
9024
  var DEFAULT_ENDPOINT = "https://api-sui.cetus.zone/router_v3";
8914
9025
  var ALL_DEXES = [
8915
9026
  CETUS,
@@ -8946,7 +9057,14 @@ var ALL_DEXES = [
8946
9057
  FERRACLMM,
8947
9058
  BOLT,
8948
9059
  MAGMAPROPAMM,
8949
- HAEDALPROPAMM
9060
+ HAEDALPROPAMM,
9061
+ CETUS_TIDE
9062
+ ];
9063
+ var PYTH_ORACLE_BASED_DEXES = [
9064
+ HAEDALPMM,
9065
+ METASTABLE,
9066
+ STEAMM_OMM_V2,
9067
+ HAEDALHMMV2
8950
9068
  ];
8951
9069
  function getAllProviders() {
8952
9070
  return ALL_DEXES;
@@ -9027,6 +9145,9 @@ var _AggregatorClient = class _AggregatorClient {
9027
9145
  this.apiKey = params.apiKey || "";
9028
9146
  this.partner = params.partner;
9029
9147
  this.cetusDlmmPartner = params.cetusDlmmPartner;
9148
+ this.pythAvailabilityCheckInterval = validatePythAvailabilityCheckInterval(
9149
+ params.pythAvailabilityCheckInterval
9150
+ );
9030
9151
  if (params.overlayFeeRate) {
9031
9152
  if (params.overlayFeeRate > 0 && params.overlayFeeRate <= CLIENT_CONFIG.MAX_OVERLAY_FEE_RATE) {
9032
9153
  this.overlayFeeRate = params.overlayFeeRate * AGGREGATOR_V3_CONFIG.FEE_DENOMINATOR;
@@ -9069,23 +9190,74 @@ var _AggregatorClient = class _AggregatorClient {
9069
9190
  }
9070
9191
  }
9071
9192
  async findRouters(params) {
9193
+ const {
9194
+ params: routerParams,
9195
+ providersExhausted
9196
+ } = await this.filterProvidersByPythAvailability(params);
9197
+ if (providersExhausted) {
9198
+ return emptyRouterResult(routerParams.byAmountIn);
9199
+ }
9072
9200
  return getRouterResult(
9073
9201
  this.endpoint,
9074
9202
  this.apiKey,
9075
- params,
9203
+ routerParams,
9076
9204
  this.overlayFeeRate,
9077
9205
  this.overlayFeeReceiver
9078
9206
  );
9079
9207
  }
9080
9208
  async findMergeSwapRouters(params) {
9209
+ const {
9210
+ params: routerParams,
9211
+ providersExhausted
9212
+ } = await this.filterProvidersByPythAvailability(params);
9213
+ if (providersExhausted) {
9214
+ return emptyMergeSwapResult();
9215
+ }
9081
9216
  return getMergeSwapResult(
9082
9217
  this.endpoint,
9083
9218
  this.apiKey,
9084
- params,
9219
+ routerParams,
9085
9220
  this.overlayFeeRate,
9086
9221
  this.overlayFeeReceiver
9087
9222
  );
9088
9223
  }
9224
+ async filterProvidersByPythAvailability(params) {
9225
+ const interval = validatePythAvailabilityCheckInterval(
9226
+ params.pythAvailabilityCheckInterval ?? this.pythAvailabilityCheckInterval
9227
+ );
9228
+ if (interval === void 0) {
9229
+ return { params, providersExhausted: false };
9230
+ }
9231
+ const pythAvailable = await this.getPythAvailability(interval);
9232
+ if (pythAvailable) {
9233
+ return { params, providersExhausted: false };
9234
+ }
9235
+ const sourceProviders = params.providers && params.providers.length > 0 ? params.providers : ALL_DEXES;
9236
+ const providers = sourceProviders.filter(
9237
+ (provider) => !PYTH_ORACLE_BASED_DEXES.includes(provider)
9238
+ );
9239
+ return {
9240
+ params: { ...params, providers },
9241
+ providersExhausted: providers.length === 0
9242
+ };
9243
+ }
9244
+ async getPythAvailability(interval) {
9245
+ const now = Date.now();
9246
+ if (this.pythAvailable !== void 0 && this.pythAvailabilityCheckedAt !== void 0 && now - this.pythAvailabilityCheckedAt < interval) {
9247
+ return this.pythAvailable;
9248
+ }
9249
+ if (this.pythAvailabilityPromise) {
9250
+ return this.pythAvailabilityPromise;
9251
+ }
9252
+ this.pythAvailabilityPromise = this.pythAdapter.isHermesAvailable().catch(() => false).then((available) => {
9253
+ this.pythAvailable = available;
9254
+ this.pythAvailabilityCheckedAt = Date.now();
9255
+ return available;
9256
+ }).finally(() => {
9257
+ this.pythAvailabilityPromise = void 0;
9258
+ });
9259
+ return this.pythAvailabilityPromise;
9260
+ }
9089
9261
  async executeFlexibleInputSwap(txb, inputCoin, routerData, expectedAmountOut, amountLimit, pythPriceIDs, partner, deepbookv3DeepFee, packages) {
9090
9262
  }
9091
9263
  newDexRouterV3(provider, pythPriceIDs, partner, cetusDlmmPartner) {
@@ -9160,6 +9332,8 @@ var _AggregatorClient = class _AggregatorClient {
9160
9332
  return new MagmaPropAmmRouter(this.env);
9161
9333
  case HAEDALPROPAMM:
9162
9334
  return new HaedalPropAmmRouter(this.env);
9335
+ case CETUS_TIDE:
9336
+ return new CetusTideRouter();
9163
9337
  default:
9164
9338
  throw new Error(
9165
9339
  `${CLIENT_CONFIG.ERRORS.UNSUPPORTED_DEX} ${provider}`
@@ -10047,6 +10221,35 @@ function generateUUID() {
10047
10221
  return v.toString(16);
10048
10222
  });
10049
10223
  }
10224
+ function validatePythAvailabilityCheckInterval(interval) {
10225
+ if (interval === void 0) {
10226
+ return void 0;
10227
+ }
10228
+ if (!Number.isFinite(interval) || interval < 0) {
10229
+ throw new Error(
10230
+ "pythAvailabilityCheckInterval must be a non-negative number"
10231
+ );
10232
+ }
10233
+ return interval;
10234
+ }
10235
+ function emptyRouterResult(byAmountIn) {
10236
+ return {
10237
+ quoteID: "",
10238
+ amountIn: ZERO,
10239
+ amountOut: ZERO,
10240
+ paths: [],
10241
+ byAmountIn,
10242
+ insufficientLiquidity: true,
10243
+ deviationRatio: 0
10244
+ };
10245
+ }
10246
+ function emptyMergeSwapResult() {
10247
+ return {
10248
+ quoteID: "",
10249
+ totalAmountOut: ZERO,
10250
+ allRoutes: []
10251
+ };
10252
+ }
10050
10253
  function recordFirstCoinIndex(paths) {
10051
10254
  let newCoinRecord = /* @__PURE__ */ new Map();
10052
10255
  for (let i = 0; i < paths.length; i++) {
@@ -10115,6 +10318,7 @@ exports.CETUSDLMM = CETUSDLMM;
10115
10318
  exports.CETUS_DEX = CETUS_DEX;
10116
10319
  exports.CETUS_MODULE = CETUS_MODULE;
10117
10320
  exports.CETUS_PUBLISHED_AT = CETUS_PUBLISHED_AT;
10321
+ exports.CETUS_TIDE = CETUS_TIDE;
10118
10322
  exports.CHECK_COINS_THRESHOLD_FUNC = CHECK_COINS_THRESHOLD_FUNC;
10119
10323
  exports.CLIENT_CONFIG = CLIENT_CONFIG;
10120
10324
  exports.CLOCK_ADDRESS = CLOCK_ADDRESS;
@@ -10186,6 +10390,7 @@ exports.PAY_MODULE = PAY_MODULE;
10186
10390
  exports.POOL_MODULT = POOL_MODULT;
10187
10391
  exports.PUBLISHED_ADDRESSES = PUBLISHED_ADDRESSES;
10188
10392
  exports.PYTH_CONFIG = PYTH_CONFIG;
10393
+ exports.PYTH_ORACLE_BASED_DEXES = PYTH_ORACLE_BASED_DEXES;
10189
10394
  exports.PYTH_PRELUDE_CALLS = PYTH_PRELUDE_CALLS;
10190
10395
  exports.REPAY_FLASH_SWAP_A2B_FUNC = REPAY_FLASH_SWAP_A2B_FUNC;
10191
10396
  exports.REPAY_FLASH_SWAP_B2A_FUNC = REPAY_FLASH_SWAP_B2A_FUNC;
package/dist/index.d.cts CHANGED
@@ -15,6 +15,7 @@ interface FindRouterParams {
15
15
  splitFactor?: number;
16
16
  splitCount?: number;
17
17
  providers?: string[];
18
+ pythAvailabilityCheckInterval?: number;
18
19
  liquidityChanges?: PreSwapLpChangeParams[];
19
20
  }
20
21
  interface MergeSwapFromCoin {
@@ -26,6 +27,7 @@ interface MergeSwapParams {
26
27
  byAmountIn: boolean;
27
28
  depth?: number;
28
29
  providers?: string[];
30
+ pythAvailabilityCheckInterval?: number;
29
31
  froms: MergeSwapFromCoin[];
30
32
  }
31
33
  interface MergeSwapInputCoin {
@@ -109,8 +111,18 @@ type ExtendedDetails = {
109
111
  haedalpropamm_oracle_mode?: string;
110
112
  haedalpropamm_base_price_info_object?: string;
111
113
  haedalpropamm_quote_price_info_object?: string;
114
+ cetus_tide_fill?: CetusTideFill;
115
+ cetus_tide_mm_object_id?: string;
116
+ cetus_tide_versioned?: string;
117
+ cetus_tide_global_config?: string;
112
118
  aux_shared_versions?: Record<string, number>;
113
119
  };
120
+ type CetusTideFill = {
121
+ envelope: string;
122
+ signature: string;
123
+ quote_hash: string;
124
+ sig_expiry_ms: string | number;
125
+ };
114
126
  type Path = {
115
127
  id: string;
116
128
  direction: boolean;
@@ -277,9 +289,19 @@ interface PriceTableInfo {
277
289
  id: ObjectId;
278
290
  fieldType: string;
279
291
  }
292
+ interface PythAvailabilitySnapshot {
293
+ checked: boolean;
294
+ availableUrls: string[];
295
+ unavailableUrls: string[];
296
+ }
297
+ interface PythAvailabilityOptions {
298
+ timeout?: number;
299
+ isAvailableStatus?: (status: number) => boolean;
300
+ }
280
301
  declare class PythAdapter {
281
302
  private client;
282
303
  private hermesClients;
304
+ private hermesUrls;
283
305
  private pythStateId;
284
306
  private wormholeStateId;
285
307
  private pythPackageId;
@@ -288,6 +310,9 @@ declare class PythAdapter {
288
310
  private priceFeedObjectIdCache;
289
311
  private baseUpdateFee;
290
312
  constructor(client: SuiGrpcClient, pythStateId: ObjectId, wormholeStateId: ObjectId, hermesUrls: string[]);
313
+ getHermesUrls(): string[];
314
+ checkHermesAvailability({ timeout, isAvailableStatus, }?: PythAvailabilityOptions): Promise<PythAvailabilitySnapshot>;
315
+ isHermesAvailable(options?: PythAvailabilityOptions): Promise<boolean>;
291
316
  getPriceFeedsUpdateData(priceIDs: string[]): Promise<Buffer[]>;
292
317
  getBaseUpdateFee(): Promise<number>;
293
318
  getPackageId(objectId: ObjectId): Promise<string>;
@@ -338,8 +363,10 @@ declare const FERRACLMM = "FERRACLMM";
338
363
  declare const BOLT = "BOLT";
339
364
  declare const MAGMAPROPAMM = "MAGMAPROPAMM";
340
365
  declare const HAEDALPROPAMM = "HAEDALPROPAMM";
366
+ declare const CETUS_TIDE = "CETUS_TIDE";
341
367
  declare const DEFAULT_ENDPOINT = "https://api-sui.cetus.zone/router_v3";
342
368
  declare const ALL_DEXES: string[];
369
+ declare const PYTH_ORACLE_BASED_DEXES: string[];
343
370
  type BuildRouterSwapParamsV3 = {
344
371
  router: RouterDataV3;
345
372
  inputCoin: TransactionObjectArgument;
@@ -407,6 +434,7 @@ type AggregatorClientParams = {
407
434
  overlayFeeRate?: number;
408
435
  overlayFeeReceiver?: string;
409
436
  cetusDlmmPartner?: string;
437
+ pythAvailabilityCheckInterval?: number;
410
438
  };
411
439
  declare class AggregatorClient {
412
440
  endpoint: string;
@@ -419,6 +447,10 @@ declare class AggregatorClient {
419
447
  protected overlayFeeReceiver: string;
420
448
  protected partner?: string;
421
449
  protected cetusDlmmPartner?: string;
450
+ private pythAvailabilityCheckInterval?;
451
+ private pythAvailabilityCheckedAt?;
452
+ private pythAvailable?;
453
+ private pythAvailabilityPromise?;
422
454
  private static readonly CONFIG;
423
455
  constructor(params: AggregatorClientParams);
424
456
  deepbookv3DeepFeeType(): string;
@@ -426,6 +458,8 @@ declare class AggregatorClient {
426
458
  getOneCoinUsedToMerge(coinType: string): Promise<string | null>;
427
459
  findRouters(params: FindRouterParams): Promise<RouterDataV3 | null>;
428
460
  findMergeSwapRouters(params: MergeSwapParams): Promise<MergeSwapRouterData | null>;
461
+ private filterProvidersByPythAvailability;
462
+ private getPythAvailability;
429
463
  executeFlexibleInputSwap(txb: Transaction, inputCoin: TransactionObjectArgument, routerData: RouterDataV3, expectedAmountOut: string, amountLimit: string, pythPriceIDs: Map<string, string>, partner?: string, deepbookv3DeepFee?: TransactionObjectArgument, packages?: Map<string, string>): Promise<void>;
430
464
  newDexRouterV3(provider: string, pythPriceIDs: Map<string, string>, partner?: string, cetusDlmmPartner?: string): DexRouter;
431
465
  expectInputSwapV3(txb: Transaction, inputCoin: TransactionObjectArgument, routerData: RouterDataV3, expectAmountOut: string, amountOutLimit: string, pythPriceIDs: Map<string, string>, partner?: string, cetusDlmmPartner?: string): TransactionObjectArgument;
@@ -1176,4 +1210,4 @@ declare class CoinUtils {
1176
1210
  static calculateTotalBalance(coins: CoinAsset[]): bigint;
1177
1211
  }
1178
1212
 
1179
- export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, type AggregatorClientParams, AggregatorConfig, AggregatorError, type AggregatorErrorCode, type AggregatorResponse, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, type BigNumber, type BuildCoinResult, type BuildFastMergeSwapParams, type BuildFastRouterSwapParams, type BuildFastRouterSwapParamsV2, type BuildFastRouterSwapParamsV3, type BuildMergeSwapParams, type BuildRouterSwapParams, type BuildRouterSwapParamsV2, type BuildRouterSwapParamsV3, type BuildSponsoredTransactionParams, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, type CoinAsset, CoinInfoAddress, CoinStoreAddress, CoinUtils, type ComparisonResult, 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, type DeepbookV3Config, type DeepbookV3ConfigResponse, type Dex, Env, type ExtendedDetails, FERRACLMM, FERRADLMM, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, type FindRouterParams, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, type FlattenedPath, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, type GasMetrics, type GetOrCreateAccountCapResult, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, type MergeRoute, type MergeSwapFromCoin, type MergeSwapInputCoin, type MergeSwapParams, type MergeSwapRouterData, type NFT, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_PRELUDE_CALLS, type Package, type Path, type PathV2, type PreSwapLpChangeParams, type ProcessedRouterData, type PythConfig, 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, type Router, type RouterData, type RouterDataV2, type RouterDataV3, type RouterError, type RouterV2, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SWAP_GAS_BUDGET_TABLE, type SimulateTransactionResult, type SuiAddress, type SuiBasicTypes, type SuiInputTypes, type SuiMoveObject, type SuiObjectIdType, type SuiResource, type SuiStructTag, type SuiTxArg, SuiZeroCoinFn, type SwapGasAnalysis, type SwapInPoolsParams, type SwapInPoolsResultV3, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
1213
+ export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, type AggregatorClientParams, AggregatorConfig, AggregatorError, type AggregatorErrorCode, type AggregatorResponse, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, type BigNumber, type BuildCoinResult, type BuildFastMergeSwapParams, type BuildFastRouterSwapParams, type BuildFastRouterSwapParamsV2, type BuildFastRouterSwapParamsV3, type BuildMergeSwapParams, type BuildRouterSwapParams, type BuildRouterSwapParamsV2, type BuildRouterSwapParamsV3, type BuildSponsoredTransactionParams, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CETUS_TIDE, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, type CetusTideFill, type CoinAsset, CoinInfoAddress, CoinStoreAddress, CoinUtils, type ComparisonResult, 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, type DeepbookV3Config, type DeepbookV3ConfigResponse, type Dex, Env, type ExtendedDetails, FERRACLMM, FERRADLMM, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, type FindRouterParams, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, type FlattenedPath, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, type GasMetrics, type GetOrCreateAccountCapResult, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, type MergeRoute, type MergeSwapFromCoin, type MergeSwapInputCoin, type MergeSwapParams, type MergeSwapRouterData, type NFT, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_ORACLE_BASED_DEXES, PYTH_PRELUDE_CALLS, type Package, type Path, type PathV2, type PreSwapLpChangeParams, type ProcessedRouterData, type PythConfig, 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, type Router, type RouterData, type RouterDataV2, type RouterDataV3, type RouterError, type RouterV2, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SWAP_GAS_BUDGET_TABLE, type SimulateTransactionResult, type SuiAddress, type SuiBasicTypes, type SuiInputTypes, type SuiMoveObject, type SuiObjectIdType, type SuiResource, type SuiStructTag, type SuiTxArg, SuiZeroCoinFn, type SwapGasAnalysis, type SwapInPoolsParams, type SwapInPoolsResultV3, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ interface FindRouterParams {
15
15
  splitFactor?: number;
16
16
  splitCount?: number;
17
17
  providers?: string[];
18
+ pythAvailabilityCheckInterval?: number;
18
19
  liquidityChanges?: PreSwapLpChangeParams[];
19
20
  }
20
21
  interface MergeSwapFromCoin {
@@ -26,6 +27,7 @@ interface MergeSwapParams {
26
27
  byAmountIn: boolean;
27
28
  depth?: number;
28
29
  providers?: string[];
30
+ pythAvailabilityCheckInterval?: number;
29
31
  froms: MergeSwapFromCoin[];
30
32
  }
31
33
  interface MergeSwapInputCoin {
@@ -109,8 +111,18 @@ type ExtendedDetails = {
109
111
  haedalpropamm_oracle_mode?: string;
110
112
  haedalpropamm_base_price_info_object?: string;
111
113
  haedalpropamm_quote_price_info_object?: string;
114
+ cetus_tide_fill?: CetusTideFill;
115
+ cetus_tide_mm_object_id?: string;
116
+ cetus_tide_versioned?: string;
117
+ cetus_tide_global_config?: string;
112
118
  aux_shared_versions?: Record<string, number>;
113
119
  };
120
+ type CetusTideFill = {
121
+ envelope: string;
122
+ signature: string;
123
+ quote_hash: string;
124
+ sig_expiry_ms: string | number;
125
+ };
114
126
  type Path = {
115
127
  id: string;
116
128
  direction: boolean;
@@ -277,9 +289,19 @@ interface PriceTableInfo {
277
289
  id: ObjectId;
278
290
  fieldType: string;
279
291
  }
292
+ interface PythAvailabilitySnapshot {
293
+ checked: boolean;
294
+ availableUrls: string[];
295
+ unavailableUrls: string[];
296
+ }
297
+ interface PythAvailabilityOptions {
298
+ timeout?: number;
299
+ isAvailableStatus?: (status: number) => boolean;
300
+ }
280
301
  declare class PythAdapter {
281
302
  private client;
282
303
  private hermesClients;
304
+ private hermesUrls;
283
305
  private pythStateId;
284
306
  private wormholeStateId;
285
307
  private pythPackageId;
@@ -288,6 +310,9 @@ declare class PythAdapter {
288
310
  private priceFeedObjectIdCache;
289
311
  private baseUpdateFee;
290
312
  constructor(client: SuiGrpcClient, pythStateId: ObjectId, wormholeStateId: ObjectId, hermesUrls: string[]);
313
+ getHermesUrls(): string[];
314
+ checkHermesAvailability({ timeout, isAvailableStatus, }?: PythAvailabilityOptions): Promise<PythAvailabilitySnapshot>;
315
+ isHermesAvailable(options?: PythAvailabilityOptions): Promise<boolean>;
291
316
  getPriceFeedsUpdateData(priceIDs: string[]): Promise<Buffer[]>;
292
317
  getBaseUpdateFee(): Promise<number>;
293
318
  getPackageId(objectId: ObjectId): Promise<string>;
@@ -338,8 +363,10 @@ declare const FERRACLMM = "FERRACLMM";
338
363
  declare const BOLT = "BOLT";
339
364
  declare const MAGMAPROPAMM = "MAGMAPROPAMM";
340
365
  declare const HAEDALPROPAMM = "HAEDALPROPAMM";
366
+ declare const CETUS_TIDE = "CETUS_TIDE";
341
367
  declare const DEFAULT_ENDPOINT = "https://api-sui.cetus.zone/router_v3";
342
368
  declare const ALL_DEXES: string[];
369
+ declare const PYTH_ORACLE_BASED_DEXES: string[];
343
370
  type BuildRouterSwapParamsV3 = {
344
371
  router: RouterDataV3;
345
372
  inputCoin: TransactionObjectArgument;
@@ -407,6 +434,7 @@ type AggregatorClientParams = {
407
434
  overlayFeeRate?: number;
408
435
  overlayFeeReceiver?: string;
409
436
  cetusDlmmPartner?: string;
437
+ pythAvailabilityCheckInterval?: number;
410
438
  };
411
439
  declare class AggregatorClient {
412
440
  endpoint: string;
@@ -419,6 +447,10 @@ declare class AggregatorClient {
419
447
  protected overlayFeeReceiver: string;
420
448
  protected partner?: string;
421
449
  protected cetusDlmmPartner?: string;
450
+ private pythAvailabilityCheckInterval?;
451
+ private pythAvailabilityCheckedAt?;
452
+ private pythAvailable?;
453
+ private pythAvailabilityPromise?;
422
454
  private static readonly CONFIG;
423
455
  constructor(params: AggregatorClientParams);
424
456
  deepbookv3DeepFeeType(): string;
@@ -426,6 +458,8 @@ declare class AggregatorClient {
426
458
  getOneCoinUsedToMerge(coinType: string): Promise<string | null>;
427
459
  findRouters(params: FindRouterParams): Promise<RouterDataV3 | null>;
428
460
  findMergeSwapRouters(params: MergeSwapParams): Promise<MergeSwapRouterData | null>;
461
+ private filterProvidersByPythAvailability;
462
+ private getPythAvailability;
429
463
  executeFlexibleInputSwap(txb: Transaction, inputCoin: TransactionObjectArgument, routerData: RouterDataV3, expectedAmountOut: string, amountLimit: string, pythPriceIDs: Map<string, string>, partner?: string, deepbookv3DeepFee?: TransactionObjectArgument, packages?: Map<string, string>): Promise<void>;
430
464
  newDexRouterV3(provider: string, pythPriceIDs: Map<string, string>, partner?: string, cetusDlmmPartner?: string): DexRouter;
431
465
  expectInputSwapV3(txb: Transaction, inputCoin: TransactionObjectArgument, routerData: RouterDataV3, expectAmountOut: string, amountOutLimit: string, pythPriceIDs: Map<string, string>, partner?: string, cetusDlmmPartner?: string): TransactionObjectArgument;
@@ -1176,4 +1210,4 @@ declare class CoinUtils {
1176
1210
  static calculateTotalBalance(coins: CoinAsset[]): bigint;
1177
1211
  }
1178
1212
 
1179
- export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, type AggregatorClientParams, AggregatorConfig, AggregatorError, type AggregatorErrorCode, type AggregatorResponse, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, type BigNumber, type BuildCoinResult, type BuildFastMergeSwapParams, type BuildFastRouterSwapParams, type BuildFastRouterSwapParamsV2, type BuildFastRouterSwapParamsV3, type BuildMergeSwapParams, type BuildRouterSwapParams, type BuildRouterSwapParamsV2, type BuildRouterSwapParamsV3, type BuildSponsoredTransactionParams, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, type CoinAsset, CoinInfoAddress, CoinStoreAddress, CoinUtils, type ComparisonResult, 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, type DeepbookV3Config, type DeepbookV3ConfigResponse, type Dex, Env, type ExtendedDetails, FERRACLMM, FERRADLMM, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, type FindRouterParams, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, type FlattenedPath, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, type GasMetrics, type GetOrCreateAccountCapResult, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, type MergeRoute, type MergeSwapFromCoin, type MergeSwapInputCoin, type MergeSwapParams, type MergeSwapRouterData, type NFT, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_PRELUDE_CALLS, type Package, type Path, type PathV2, type PreSwapLpChangeParams, type ProcessedRouterData, type PythConfig, 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, type Router, type RouterData, type RouterDataV2, type RouterDataV3, type RouterError, type RouterV2, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SWAP_GAS_BUDGET_TABLE, type SimulateTransactionResult, type SuiAddress, type SuiBasicTypes, type SuiInputTypes, type SuiMoveObject, type SuiObjectIdType, type SuiResource, type SuiStructTag, type SuiTxArg, SuiZeroCoinFn, type SwapGasAnalysis, type SwapInPoolsParams, type SwapInPoolsResultV3, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
1213
+ export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, type AggregatorClientParams, AggregatorConfig, AggregatorError, type AggregatorErrorCode, type AggregatorResponse, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, type BigNumber, type BuildCoinResult, type BuildFastMergeSwapParams, type BuildFastRouterSwapParams, type BuildFastRouterSwapParamsV2, type BuildFastRouterSwapParamsV3, type BuildMergeSwapParams, type BuildRouterSwapParams, type BuildRouterSwapParamsV2, type BuildRouterSwapParamsV3, type BuildSponsoredTransactionParams, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CETUS_TIDE, CHECK_COINS_THRESHOLD_FUNC, CLIENT_CONFIG, CLOCK_ADDRESS, type CetusTideFill, type CoinAsset, CoinInfoAddress, CoinStoreAddress, CoinUtils, type ComparisonResult, 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, type DeepbookV3Config, type DeepbookV3ConfigResponse, type Dex, Env, type ExtendedDetails, FERRACLMM, FERRADLMM, FLOWXV2, FLOWXV3, FLOWX_AMM, FLOWX_AMM_MODULE, FULLSAIL, type FindRouterParams, FlashSwapA2BFunc, FlashSwapB2AFunc, FlashSwapFunc, FlashSwapWithPartnerA2BFunc, FlashSwapWithPartnerB2AFunc, FlashSwapWithPartnerFunc, type FlattenedPath, GAS_SYMBOL, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG, type GasMetrics, type GetOrCreateAccountCapResult, HAEDAL, HAEDALHMMV2, HAEDALPMM, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, type MergeRoute, type MergeSwapFromCoin, type MergeSwapInputCoin, type MergeSwapParams, type MergeSwapRouterData, type NFT, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_ORACLE_BASED_DEXES, PYTH_PRELUDE_CALLS, type Package, type Path, type PathV2, type PreSwapLpChangeParams, type ProcessedRouterData, type PythConfig, 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, type Router, type RouterData, type RouterDataV2, type RouterDataV3, type RouterError, type RouterV2, SCALLOP, SEVENK, SPRINGSUI, STEAMM, STEAMM_OMM, STEAMM_OMM_V2, SUILEND, SUI_SYSTEM_STATE_OBJECT_ID, SWAP_A2B_FUNC, SWAP_B2A_FUNC, SWAP_GAS_BUDGET_TABLE, type SimulateTransactionResult, type SuiAddress, type SuiBasicTypes, type SuiInputTypes, type SuiMoveObject, type SuiObjectIdType, type SuiResource, type SuiStructTag, type SuiTxArg, SuiZeroCoinFn, type SwapGasAnalysis, type SwapInPoolsParams, type SwapInPoolsResultV3, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { coinWithBalance, Transaction } from '@mysten/sui/transactions';
2
2
  import JSONbig from 'json-bigint';
3
- import { normalizeSuiObjectId, SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';
3
+ import { normalizeSuiObjectId, SUI_CLOCK_OBJECT_ID, fromHex } from '@mysten/sui/utils';
4
4
  import { SuiGrpcClient } from '@mysten/sui/grpc';
5
5
  import { HermesClient } from '@pythnetwork/hermes-client';
6
6
  import { bcs } from '@mysten/sui/bcs';
@@ -3410,7 +3410,7 @@ var AGGREGATOR_V3_CONFIG = {
3410
3410
  };
3411
3411
 
3412
3412
  // src/api.ts
3413
- var SDK_VERSION = 1010601;
3413
+ var SDK_VERSION = 1010603;
3414
3414
  function parseRouterResponse(data, byAmountIn) {
3415
3415
  let packages = /* @__PURE__ */ new Map();
3416
3416
  if (data.packages) {
@@ -7816,20 +7816,56 @@ function transferOrDestroyCoin(params, txb) {
7816
7816
  });
7817
7817
  }
7818
7818
  var MAX_ARGUMENT_SIZE = 16 * 1024;
7819
+ var DEFAULT_HERMES_URL = "https://hermes.pyth.network";
7820
+ var DEFAULT_AVAILABILITY_TIMEOUT = 3e3;
7821
+ var DEFAULT_IS_AVAILABLE_STATUS = (status) => status >= 200 && status < 400;
7819
7822
  var PythAdapter = class {
7820
7823
  constructor(client, pythStateId, wormholeStateId, hermesUrls) {
7821
7824
  this.priceFeedObjectIdCache = /* @__PURE__ */ new Map();
7822
7825
  this.client = client;
7823
7826
  this.pythStateId = pythStateId;
7824
7827
  this.wormholeStateId = wormholeStateId;
7825
- const urls = [...hermesUrls];
7826
- if (!urls.includes("https://hermes.pyth.network")) {
7827
- urls.push("https://hermes.pyth.network");
7828
+ const urls = Array.from(
7829
+ new Set(hermesUrls.filter(Boolean).map(normalizeServiceUrl))
7830
+ );
7831
+ if (!urls.includes(DEFAULT_HERMES_URL)) {
7832
+ urls.push(DEFAULT_HERMES_URL);
7828
7833
  }
7834
+ this.hermesUrls = urls;
7829
7835
  this.hermesClients = urls.map(
7830
7836
  (url) => new HermesClient(url, { timeout: 3e3 })
7831
7837
  );
7832
7838
  }
7839
+ getHermesUrls() {
7840
+ return [...this.hermesUrls];
7841
+ }
7842
+ async checkHermesAvailability({
7843
+ timeout = DEFAULT_AVAILABILITY_TIMEOUT,
7844
+ isAvailableStatus = DEFAULT_IS_AVAILABLE_STATUS
7845
+ } = {}) {
7846
+ if (this.hermesUrls.length === 0) {
7847
+ return {
7848
+ checked: false,
7849
+ availableUrls: [],
7850
+ unavailableUrls: []
7851
+ };
7852
+ }
7853
+ const results = await Promise.all(
7854
+ this.hermesUrls.map(async (url) => ({
7855
+ url,
7856
+ available: await checkServiceUrl(url, timeout, isAvailableStatus)
7857
+ }))
7858
+ );
7859
+ return {
7860
+ checked: true,
7861
+ availableUrls: results.filter((result) => result.available).map((result) => result.url),
7862
+ unavailableUrls: results.filter((result) => !result.available).map((result) => result.url)
7863
+ };
7864
+ }
7865
+ async isHermesAvailable(options) {
7866
+ const snapshot = await this.checkHermesAvailability(options);
7867
+ return snapshot.availableUrls.length > 0;
7868
+ }
7833
7869
  async getPriceFeedsUpdateData(priceIDs) {
7834
7870
  let lastError = null;
7835
7871
  for (const hermes of this.hermesClients) {
@@ -8038,6 +8074,25 @@ var PythAdapter = class {
8038
8074
  return priceInfoObjects;
8039
8075
  }
8040
8076
  };
8077
+ async function checkServiceUrl(url, timeout, isAvailableStatus) {
8078
+ const controller = new AbortController();
8079
+ const timer = setTimeout(() => controller.abort(), timeout);
8080
+ try {
8081
+ const response = await fetch(url, {
8082
+ method: "GET",
8083
+ cache: "no-store",
8084
+ signal: controller.signal
8085
+ });
8086
+ return isAvailableStatus(response.status);
8087
+ } catch {
8088
+ return false;
8089
+ } finally {
8090
+ clearTimeout(timer);
8091
+ }
8092
+ }
8093
+ function normalizeServiceUrl(url) {
8094
+ return url.replace(/\/+$/, "");
8095
+ }
8041
8096
 
8042
8097
  // src/utils/uuid.ts
8043
8098
  function generateDowngradeUuid6() {
@@ -8866,6 +8921,61 @@ var HaedalPropAmmRouter = class {
8866
8921
  });
8867
8922
  }
8868
8923
  };
8924
+ var CetusTideRouter = class {
8925
+ swap(txb, flattenedPath, swapContext, _extends) {
8926
+ const path = flattenedPath.path;
8927
+ if (!path.extendedDetails) {
8928
+ throw new Error("Cetus Tide: extended_details missing on path");
8929
+ }
8930
+ if (path.publishedAt == null) {
8931
+ throw new Error("Cetus Tide: path.publishedAt missing");
8932
+ }
8933
+ const ed = path.extendedDetails;
8934
+ const fill = this.validateFill(ed);
8935
+ const mmObjectId = ed.cetus_tide_mm_object_id;
8936
+ const versioned = ed.cetus_tide_versioned;
8937
+ const globalConfig = ed.cetus_tide_global_config;
8938
+ const [baseCoinType, quoteCoinType] = path.direction ? [path.from, path.target] : [path.target, path.from];
8939
+ const amountIn = flattenedPath.isLastUseOfIntermediateToken ? AGGREGATOR_V3_CONFIG.MAX_AMOUNT_IN : path.amountIn;
8940
+ const envelopeBytes = Array.from(fromHex(fill.envelope));
8941
+ const signatureBytes = Array.from(fromHex(fill.signature));
8942
+ const quoteHashBytes = Array.from(fromHex(fill.quote_hash));
8943
+ const args = [
8944
+ swapContext,
8945
+ txb.object(versioned),
8946
+ txb.object(globalConfig),
8947
+ txb.object(mmObjectId),
8948
+ txb.object(path.id),
8949
+ txb.pure.vector("u8", envelopeBytes),
8950
+ txb.pure.vector("u8", signatureBytes),
8951
+ txb.pure.vector("u8", quoteHashBytes),
8952
+ txb.pure.u64(amountIn.toString()),
8953
+ txb.pure.bool(path.direction),
8954
+ txb.pure.vector("u8", quoteHashBytes),
8955
+ txb.object(SUI_CLOCK_OBJECT_ID)
8956
+ ];
8957
+ txb.moveCall({
8958
+ target: `${path.publishedAt}::orderbook::swap`,
8959
+ typeArguments: [baseCoinType, quoteCoinType],
8960
+ arguments: args
8961
+ });
8962
+ }
8963
+ validateFill(ed) {
8964
+ if (!ed.cetus_tide_fill) {
8965
+ throw new Error("Cetus Tide: cetus_tide_fill missing");
8966
+ }
8967
+ if (!ed.cetus_tide_mm_object_id) {
8968
+ throw new Error("Cetus Tide: cetus_tide_mm_object_id missing");
8969
+ }
8970
+ if (!ed.cetus_tide_versioned) {
8971
+ throw new Error("Cetus Tide: cetus_tide_versioned missing");
8972
+ }
8973
+ if (!ed.cetus_tide_global_config) {
8974
+ throw new Error("Cetus Tide: cetus_tide_global_config missing");
8975
+ }
8976
+ return ed.cetus_tide_fill;
8977
+ }
8978
+ };
8869
8979
 
8870
8980
  // src/client.ts
8871
8981
  var CETUS = "CETUS";
@@ -8904,6 +9014,7 @@ var FERRACLMM = "FERRACLMM";
8904
9014
  var BOLT = "BOLT";
8905
9015
  var MAGMAPROPAMM = "MAGMAPROPAMM";
8906
9016
  var HAEDALPROPAMM = "HAEDALPROPAMM";
9017
+ var CETUS_TIDE = "CETUS_TIDE";
8907
9018
  var DEFAULT_ENDPOINT = "https://api-sui.cetus.zone/router_v3";
8908
9019
  var ALL_DEXES = [
8909
9020
  CETUS,
@@ -8940,7 +9051,14 @@ var ALL_DEXES = [
8940
9051
  FERRACLMM,
8941
9052
  BOLT,
8942
9053
  MAGMAPROPAMM,
8943
- HAEDALPROPAMM
9054
+ HAEDALPROPAMM,
9055
+ CETUS_TIDE
9056
+ ];
9057
+ var PYTH_ORACLE_BASED_DEXES = [
9058
+ HAEDALPMM,
9059
+ METASTABLE,
9060
+ STEAMM_OMM_V2,
9061
+ HAEDALHMMV2
8944
9062
  ];
8945
9063
  function getAllProviders() {
8946
9064
  return ALL_DEXES;
@@ -9021,6 +9139,9 @@ var _AggregatorClient = class _AggregatorClient {
9021
9139
  this.apiKey = params.apiKey || "";
9022
9140
  this.partner = params.partner;
9023
9141
  this.cetusDlmmPartner = params.cetusDlmmPartner;
9142
+ this.pythAvailabilityCheckInterval = validatePythAvailabilityCheckInterval(
9143
+ params.pythAvailabilityCheckInterval
9144
+ );
9024
9145
  if (params.overlayFeeRate) {
9025
9146
  if (params.overlayFeeRate > 0 && params.overlayFeeRate <= CLIENT_CONFIG.MAX_OVERLAY_FEE_RATE) {
9026
9147
  this.overlayFeeRate = params.overlayFeeRate * AGGREGATOR_V3_CONFIG.FEE_DENOMINATOR;
@@ -9063,23 +9184,74 @@ var _AggregatorClient = class _AggregatorClient {
9063
9184
  }
9064
9185
  }
9065
9186
  async findRouters(params) {
9187
+ const {
9188
+ params: routerParams,
9189
+ providersExhausted
9190
+ } = await this.filterProvidersByPythAvailability(params);
9191
+ if (providersExhausted) {
9192
+ return emptyRouterResult(routerParams.byAmountIn);
9193
+ }
9066
9194
  return getRouterResult(
9067
9195
  this.endpoint,
9068
9196
  this.apiKey,
9069
- params,
9197
+ routerParams,
9070
9198
  this.overlayFeeRate,
9071
9199
  this.overlayFeeReceiver
9072
9200
  );
9073
9201
  }
9074
9202
  async findMergeSwapRouters(params) {
9203
+ const {
9204
+ params: routerParams,
9205
+ providersExhausted
9206
+ } = await this.filterProvidersByPythAvailability(params);
9207
+ if (providersExhausted) {
9208
+ return emptyMergeSwapResult();
9209
+ }
9075
9210
  return getMergeSwapResult(
9076
9211
  this.endpoint,
9077
9212
  this.apiKey,
9078
- params,
9213
+ routerParams,
9079
9214
  this.overlayFeeRate,
9080
9215
  this.overlayFeeReceiver
9081
9216
  );
9082
9217
  }
9218
+ async filterProvidersByPythAvailability(params) {
9219
+ const interval = validatePythAvailabilityCheckInterval(
9220
+ params.pythAvailabilityCheckInterval ?? this.pythAvailabilityCheckInterval
9221
+ );
9222
+ if (interval === void 0) {
9223
+ return { params, providersExhausted: false };
9224
+ }
9225
+ const pythAvailable = await this.getPythAvailability(interval);
9226
+ if (pythAvailable) {
9227
+ return { params, providersExhausted: false };
9228
+ }
9229
+ const sourceProviders = params.providers && params.providers.length > 0 ? params.providers : ALL_DEXES;
9230
+ const providers = sourceProviders.filter(
9231
+ (provider) => !PYTH_ORACLE_BASED_DEXES.includes(provider)
9232
+ );
9233
+ return {
9234
+ params: { ...params, providers },
9235
+ providersExhausted: providers.length === 0
9236
+ };
9237
+ }
9238
+ async getPythAvailability(interval) {
9239
+ const now = Date.now();
9240
+ if (this.pythAvailable !== void 0 && this.pythAvailabilityCheckedAt !== void 0 && now - this.pythAvailabilityCheckedAt < interval) {
9241
+ return this.pythAvailable;
9242
+ }
9243
+ if (this.pythAvailabilityPromise) {
9244
+ return this.pythAvailabilityPromise;
9245
+ }
9246
+ this.pythAvailabilityPromise = this.pythAdapter.isHermesAvailable().catch(() => false).then((available) => {
9247
+ this.pythAvailable = available;
9248
+ this.pythAvailabilityCheckedAt = Date.now();
9249
+ return available;
9250
+ }).finally(() => {
9251
+ this.pythAvailabilityPromise = void 0;
9252
+ });
9253
+ return this.pythAvailabilityPromise;
9254
+ }
9083
9255
  async executeFlexibleInputSwap(txb, inputCoin, routerData, expectedAmountOut, amountLimit, pythPriceIDs, partner, deepbookv3DeepFee, packages) {
9084
9256
  }
9085
9257
  newDexRouterV3(provider, pythPriceIDs, partner, cetusDlmmPartner) {
@@ -9154,6 +9326,8 @@ var _AggregatorClient = class _AggregatorClient {
9154
9326
  return new MagmaPropAmmRouter(this.env);
9155
9327
  case HAEDALPROPAMM:
9156
9328
  return new HaedalPropAmmRouter(this.env);
9329
+ case CETUS_TIDE:
9330
+ return new CetusTideRouter();
9157
9331
  default:
9158
9332
  throw new Error(
9159
9333
  `${CLIENT_CONFIG.ERRORS.UNSUPPORTED_DEX} ${provider}`
@@ -10041,6 +10215,35 @@ function generateUUID() {
10041
10215
  return v.toString(16);
10042
10216
  });
10043
10217
  }
10218
+ function validatePythAvailabilityCheckInterval(interval) {
10219
+ if (interval === void 0) {
10220
+ return void 0;
10221
+ }
10222
+ if (!Number.isFinite(interval) || interval < 0) {
10223
+ throw new Error(
10224
+ "pythAvailabilityCheckInterval must be a non-negative number"
10225
+ );
10226
+ }
10227
+ return interval;
10228
+ }
10229
+ function emptyRouterResult(byAmountIn) {
10230
+ return {
10231
+ quoteID: "",
10232
+ amountIn: ZERO,
10233
+ amountOut: ZERO,
10234
+ paths: [],
10235
+ byAmountIn,
10236
+ insufficientLiquidity: true,
10237
+ deviationRatio: 0
10238
+ };
10239
+ }
10240
+ function emptyMergeSwapResult() {
10241
+ return {
10242
+ quoteID: "",
10243
+ totalAmountOut: ZERO,
10244
+ allRoutes: []
10245
+ };
10246
+ }
10044
10247
  function recordFirstCoinIndex(paths) {
10045
10248
  let newCoinRecord = /* @__PURE__ */ new Map();
10046
10249
  for (let i = 0; i < paths.length; i++) {
@@ -10089,4 +10292,4 @@ decimal.js/decimal.mjs:
10089
10292
  *)
10090
10293
  */
10091
10294
 
10092
- export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, AggregatorConfig, AggregatorError, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_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, FERRACLMM, FERRADLMM, 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, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_PRELUDE_CALLS, 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, SWAP_GAS_BUDGET_TABLE, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
10295
+ export { AFSUI, AFTERMATH, AFTERMATH_AMM, AFTERMATH_MODULE, AGGREGATOR, AGGREGATOR_V3_CONFIG, ALL_DEXES, ALPHAFI, AggregatorClient, AggregatorConfig, AggregatorError, AggregatorServerErrorCode, BLUEFIN, BLUEMOVE, BOLT, CETUS, CETUSDLMM, CETUS_DEX, CETUS_MODULE, CETUS_PUBLISHED_AT, CETUS_TIDE, 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, FERRACLMM, FERRADLMM, 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, HAEDALPROPAMM, HAWAL, INTEGRATE, JOIN_FUNC, KRIYA, KRIYAV3, KRIYA_DEX, KRIYA_MODULE, MAGMA, MAGMAPROPAMM, 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_V3_PUBLISHED_AT, MAINNET_FLOWX_AMM_CONTAINER_ID, METASTABLE, MOMENTUM, OBRIC, ONE, PACKAGE_NAMES, PAY_MODULE, POOL_MODULT, PUBLISHED_ADDRESSES, PYTH_CONFIG, PYTH_ORACLE_BASED_DEXES, PYTH_PRELUDE_CALLS, 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, SWAP_GAS_BUDGET_TABLE, 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_V3_PUBLISHED_AT, 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, estimateSwapGasBudget, exportToCSV, exportToJSON, extractAddressFromType, extractGasMetrics, extractStructTagFromType, extractTimestampFromDowngradeUuid6, fixSuiObjectId, formatGasMetrics, generateDowngradeUuid6, generateSimpleDowngradeUuid6, getAggregatorServerErrorMessage, getAggregatorV2Extend2PublishedAt, getAggregatorV2ExtendPublishedAt, getAggregatorV2PublishedAt, getAllProviders, getDeepbookV3Config, getDefaultSuiInputType, getMergeSwapResult, getOrCreateAccountCap, getProvidersExcluding, getProvidersIncluding, getRouterResult, hasPythPrelude, isSortedSymbols, isValidDowngradeUuid6, lookupGasBudget, mintZeroCoin, normalizeCoinType, parseAftermathFeeType, parseTurbosPoolFeeType, patchFixSuiObjectId, printTransaction, processEndpoint, processFlattenRoutes, restituteMsafeFastRouterSwapParams };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cetusprotocol/aggregator-sdk",
3
- "version": "1.6.1",
3
+ "version": "1.6.3",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",