@shogun-sdk/intents-sdk 1.2.6-test.14 → 1.2.6-test.16

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.cjs CHANGED
@@ -144,7 +144,10 @@ function isNativeEvmToken(tokenAddress) {
144
144
  const normalizedAddress = tokenAddress.toLowerCase();
145
145
  return NATIVE_EVM_ETH_ADDRESSES.some((addr) => addr.toLowerCase() === normalizedAddress);
146
146
  }
147
- var import_kit, useProdConfig, IntentsOrderType, PERMIT2_ADDRESS, PROD_CROSS_CHAIN_GUARD_ADDRESSES, TEST_CROSS_CHAIN_GUARD_ADDRESSES, PROD_SINGLE_CHAIN_GUARD_ADDRESSES, TEST_SINGLE_CHAIN_GUARD_ADDRESSES, PROD_DCA_SINGLE_CHAIN_GUARD_ADDRESSES, PROD_DCA_CROSS_CHAIN_GUARD_ADDRESSES, TEST_DCA_SINGLE_CHAIN_GUARD_ADDRESSES, CROSS_CHAIN_GUARD_ADDRESSES, SINGLE_CHAIN_GUARD_ADDRESSES, DCA_SINGLE_CHAIN_GUARD_ADDRESSES, NATIVE_SOLANA_TOKEN_ADDRESS, WRAPPED_SOL_MINT_ADDRESS, SOLANA_USDC_MINT, SOLANA_MINT_TOKEN, PROD_SUI_PACKAGE_ID, TEST_SUI_PACKAGE_ID, SUI_PACKAGE_ID, SUI_GUARD_COLLATERAL_TYPE, SUI_GUARD_STABLECOIN_TYPE, AUCTIONEER_URL, MAX_UINT_32, MAX_UINT_64, MAX_UINT_128, MAX_UINT_256, NATIVE_EVM_ETH_ADDRESSES, WRAPPED_ETH_ADDRESSES, NATIVE_SUI_TOKEN_ADDRESS, TOKEN_SEARCH_API_BASE_URL, DEV_ACCESS_KEY;
147
+ function normalizeNativeEvmTokenForSigning(tokenAddress) {
148
+ return isNativeEvmToken(tokenAddress) ? EVM_ZERO_ADDRESS : tokenAddress;
149
+ }
150
+ var import_kit, useProdConfig, IntentsOrderType, PERMIT2_ADDRESS, PROD_CROSS_CHAIN_GUARD_ADDRESSES, TEST_CROSS_CHAIN_GUARD_ADDRESSES, PROD_SINGLE_CHAIN_GUARD_ADDRESSES, TEST_SINGLE_CHAIN_GUARD_ADDRESSES, PROD_DCA_SINGLE_CHAIN_GUARD_ADDRESSES, PROD_DCA_CROSS_CHAIN_GUARD_ADDRESSES, TEST_DCA_SINGLE_CHAIN_GUARD_ADDRESSES, CROSS_CHAIN_GUARD_ADDRESSES, SINGLE_CHAIN_GUARD_ADDRESSES, DCA_SINGLE_CHAIN_GUARD_ADDRESSES, DCA_CROSS_CHAIN_GUARD_ADDRESSES, NATIVE_SOLANA_TOKEN_ADDRESS, WRAPPED_SOL_MINT_ADDRESS, SOLANA_USDC_MINT, SOLANA_MINT_TOKEN, PROD_SUI_PACKAGE_ID, TEST_SUI_PACKAGE_ID, SUI_PACKAGE_ID, SUI_GUARD_COLLATERAL_TYPE, SUI_GUARD_STABLECOIN_TYPE, auctioneerUrlOverride, AUCTIONEER_URL, MAX_UINT_32, MAX_UINT_64, MAX_UINT_128, MAX_UINT_256, NATIVE_EVM_ETH_ADDRESSES, WRAPPED_ETH_ADDRESSES, NATIVE_SUI_TOKEN_ADDRESS, EVM_ZERO_ADDRESS, EVM_ZERO_SIGNATURE, TOKEN_SEARCH_API_BASE_URL;
148
151
  var init_constants = __esm({
149
152
  "src/constants.ts"() {
150
153
  "use strict";
@@ -205,7 +208,9 @@ var init_constants = __esm({
205
208
  [42161 /* Arbitrum */]: "0x0000000000000000000000000000000000000000",
206
209
  [10 /* Optimism */]: "0x1b754840f058b78e412156d2674b5954728cb86e",
207
210
  [8453 /* Base */]: "0x2df3ab1bb8b9d48769718003de2d8ca8e9d3c465",
208
- [999 /* Hyperliquid */]: "0x618ee9b6829261108d811b91581e00da192b0b75",
211
+ // HyperEVM SingleChainGuardDca per the on-chain deployment + auctioneer config.
212
+ // (0x618ee9… is the SingleChainGuardLimit, which previously sat here by mistake.)
213
+ [999 /* Hyperliquid */]: "0xdcbb658910b5192a43b79fd8244bdf27940d3b6b",
209
214
  [56 /* BSC */]: "0x11ef880e2e8d17c114b9eb87369ce3d1311c62e1",
210
215
  [143 /* MONAD */]: "0x418302C3bef14D405A9B30381a9cb9d4d82EB2d4"
211
216
  };
@@ -228,6 +233,7 @@ var init_constants = __esm({
228
233
  CROSS_CHAIN_GUARD_ADDRESSES = useProdConfig ? PROD_CROSS_CHAIN_GUARD_ADDRESSES : TEST_CROSS_CHAIN_GUARD_ADDRESSES;
229
234
  SINGLE_CHAIN_GUARD_ADDRESSES = useProdConfig ? PROD_SINGLE_CHAIN_GUARD_ADDRESSES : TEST_SINGLE_CHAIN_GUARD_ADDRESSES;
230
235
  DCA_SINGLE_CHAIN_GUARD_ADDRESSES = useProdConfig ? PROD_DCA_SINGLE_CHAIN_GUARD_ADDRESSES : TEST_DCA_SINGLE_CHAIN_GUARD_ADDRESSES;
236
+ DCA_CROSS_CHAIN_GUARD_ADDRESSES = PROD_DCA_CROSS_CHAIN_GUARD_ADDRESSES;
231
237
  NATIVE_SOLANA_TOKEN_ADDRESS = "So11111111111111111111111111111111111111111";
232
238
  WRAPPED_SOL_MINT_ADDRESS = "So11111111111111111111111111111111111111112";
233
239
  SOLANA_USDC_MINT = {
@@ -241,7 +247,8 @@ var init_constants = __esm({
241
247
  SUI_PACKAGE_ID = useProdConfig ? PROD_SUI_PACKAGE_ID : TEST_SUI_PACKAGE_ID;
242
248
  SUI_GUARD_COLLATERAL_TYPE = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC";
243
249
  SUI_GUARD_STABLECOIN_TYPE = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC";
244
- AUCTIONEER_URL = useProdConfig ? "https://auctioneer-825534211396.us-central1.run.app" : "http://127.0.0.1:8080";
250
+ auctioneerUrlOverride = typeof process !== "undefined" ? process.env?.INTENTS_AUCTIONEER_URL : void 0;
251
+ AUCTIONEER_URL = auctioneerUrlOverride || (useProdConfig ? "https://auctioneer-825534211396.us-central1.run.app" : "http://127.0.0.1:8080");
245
252
  MAX_UINT_32 = 2n ** 32n - 1n;
246
253
  MAX_UINT_64 = 2n ** 64n - 1n;
247
254
  MAX_UINT_128 = 2n ** 128n - 1n;
@@ -259,8 +266,9 @@ var init_constants = __esm({
259
266
  [143 /* MONAD */]: "0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A"
260
267
  };
261
268
  NATIVE_SUI_TOKEN_ADDRESS = "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";
269
+ EVM_ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
270
+ EVM_ZERO_SIGNATURE = "0x0000000000000000000000000000000000000000000000000000000000000000";
262
271
  TOKEN_SEARCH_API_BASE_URL = "https://shogun-token-search-api-825534211396.europe-west4.run.app";
263
- DEV_ACCESS_KEY = typeof window !== "undefined" ? localStorage.getItem("x-dev-access") : null;
264
272
  }
265
273
  });
266
274
 
@@ -375,10 +383,12 @@ __export(index_exports, {
375
383
  ChainID: () => ChainID,
376
384
  ChainType: () => ChainType,
377
385
  CrossChainOrder: () => CrossChainOrder,
386
+ DCA_CROSS_CHAIN_GUARD_ADDRESSES: () => DCA_CROSS_CHAIN_GUARD_ADDRESSES,
378
387
  DCA_SINGLE_CHAIN_GUARD_ADDRESSES: () => DCA_SINGLE_CHAIN_GUARD_ADDRESSES,
379
- DEV_ACCESS_KEY: () => DEV_ACCESS_KEY,
380
388
  DcaSingleChainOrder: () => DcaSingleChainOrder,
381
389
  EVMSDK: () => EVMSDK,
390
+ EVM_ZERO_ADDRESS: () => EVM_ZERO_ADDRESS,
391
+ EVM_ZERO_SIGNATURE: () => EVM_ZERO_SIGNATURE,
382
392
  IntentsOrderType: () => IntentsOrderType,
383
393
  MAX_UINT_128: () => MAX_UINT_128,
384
394
  MAX_UINT_256: () => MAX_UINT_256,
@@ -417,6 +427,7 @@ __export(index_exports, {
417
427
  cancelDcaSingleChainOrderInstructions: () => cancelDcaSingleChainOrderInstructions,
418
428
  cancelSingleChainOrderInstructionsAsBytes: () => cancelSingleChainOrderInstructionsAsBytes,
419
429
  chainIdToChainTypeMap: () => chainIdToChainTypeMap,
430
+ createEvmCrossChainDcaOrderIntentRequest: () => createEvmCrossChainDcaOrderIntentRequest,
420
431
  createEvmCrossChainOrderIntentRequest: () => createEvmCrossChainOrderIntentRequest,
421
432
  createEvmSingleChainDcaOrderIntentRequest: () => createEvmSingleChainDcaOrderIntentRequest,
422
433
  createEvmSingleChainLimitOrderIntentRequest: () => createEvmSingleChainLimitOrderIntentRequest,
@@ -446,6 +457,7 @@ __export(index_exports, {
446
457
  getCancelSingleChainOrderRawData: () => getCancelSingleChainOrderRawData,
447
458
  getCoinFromResponse: () => getCoinFromResponse,
448
459
  getDcaSecretHash: () => getDcaSecretHash,
460
+ getEVMCrossChainDcaOrderTypedData: () => getEVMCrossChainDcaOrderTypedData,
449
461
  getEVMCrossChainOrderTypedData: () => getEVMCrossChainOrderTypedData,
450
462
  getEVMSingleChainOrderTypedData: () => getEVMSingleChainOrderTypedData,
451
463
  getInvalidateNoncesRawData: () => getInvalidateNoncesRawData,
@@ -466,6 +478,7 @@ __export(index_exports, {
466
478
  isNativeEvmToken: () => isNativeEvmToken,
467
479
  isSuccessApiResponse: () => isSuccessApiResponse,
468
480
  isSupportedChain: () => isSupportedChain,
481
+ normalizeNativeEvmTokenForSigning: () => normalizeNativeEvmTokenForSigning,
469
482
  prepareDcaSecretData: () => prepareDcaSecretData,
470
483
  prepareSecretData: () => prepareSecretData,
471
484
  signSingleChainDcaOrder: () => signSingleChainDcaOrder,
@@ -502,9 +515,6 @@ var BaseValidator = class {
502
515
  this.validateTokenAddress(order.tokenOut);
503
516
  this.validateAmount(order.amountIn);
504
517
  this.validateAmount(order.amountOutMin ?? 1n);
505
- if (order.stopLossMaxOut) {
506
- this.validateAmount(order.stopLossMaxOut);
507
- }
508
518
  if (order.takeProfitMinOut) {
509
519
  this.validateAmount(order.takeProfitMinOut);
510
520
  }
@@ -3674,6 +3684,29 @@ var DCA_SINGLE_CHAIN_PERMIT2_TYPES = {
3674
3684
  { name: "witness", type: "SingleChainDcaOrder" }
3675
3685
  ]
3676
3686
  };
3687
+ var CROSS_CHAIN_DCA_PERMIT2_TYPES = {
3688
+ TokenPermissions: TOKEN_PERMISSIONS_TYPE,
3689
+ DcaOrderInfo: [
3690
+ { name: "user", type: "address" },
3691
+ { name: "tokenIn", type: "address" },
3692
+ { name: "srcChainId", type: "uint32" },
3693
+ { name: "startTime", type: "uint32" },
3694
+ { name: "deadline", type: "uint32" },
3695
+ { name: "totalIntervals", type: "uint24" },
3696
+ { name: "intervalDuration", type: "uint32" },
3697
+ { name: "amountInPerInterval", type: "uint128" },
3698
+ { name: "minStablecoinsAmountPerInterval", type: "uint128" },
3699
+ { name: "executionDetailsHash", type: "bytes32" },
3700
+ { name: "nonce", type: "uint256" }
3701
+ ],
3702
+ PermitWitnessTransferFrom: [
3703
+ { name: "permitted", type: "TokenPermissions" },
3704
+ { name: "spender", type: "address" },
3705
+ { name: "nonce", type: "uint256" },
3706
+ { name: "deadline", type: "uint256" },
3707
+ { name: "witness", type: "DcaOrderInfo" }
3708
+ ]
3709
+ };
3677
3710
 
3678
3711
  // src/core/evm/intent-provider.ts
3679
3712
  var EVMIntentProvider = class {
@@ -3740,12 +3773,12 @@ var EVMIntentProvider = class {
3740
3773
  static getSingleChainLimitPermissionMessage(order, nonce) {
3741
3774
  const spender = SINGLE_CHAIN_GUARD_ADDRESSES[order.chainId];
3742
3775
  const requestedOutput = {
3743
- token: order.tokenOut,
3776
+ token: normalizeNativeEvmTokenForSigning(order.tokenOut),
3744
3777
  receiver: order.destinationAddress,
3745
3778
  amount: order.amountOutMin
3746
3779
  };
3747
3780
  const extraTransfers = order.extraTransfers?.map((transfer) => ({
3748
- token: transfer.token,
3781
+ token: normalizeNativeEvmTokenForSigning(transfer.token),
3749
3782
  receiver: transfer.receiver,
3750
3783
  amount: transfer.amount
3751
3784
  })) || [];
@@ -3793,12 +3826,12 @@ var EVMIntentProvider = class {
3793
3826
  static getDcaSingleChainPermissionMessage(order, nonce) {
3794
3827
  const spender = DCA_SINGLE_CHAIN_GUARD_ADDRESSES[order.chainId];
3795
3828
  const requestedOutput = {
3796
- token: order.tokenOut,
3829
+ token: normalizeNativeEvmTokenForSigning(order.tokenOut),
3797
3830
  receiver: order.destinationAddress,
3798
3831
  amount: BigInt(order.amountOutMin)
3799
3832
  };
3800
3833
  const extraTransfers = order.extraTransfers?.map((transfer) => ({
3801
- token: transfer.token,
3834
+ token: normalizeNativeEvmTokenForSigning(transfer.token),
3802
3835
  receiver: transfer.receiver,
3803
3836
  amount: transfer.amount
3804
3837
  })) || [];
@@ -5950,10 +5983,93 @@ var RelayQuoteProvider = class {
5950
5983
  }
5951
5984
  };
5952
5985
 
5953
- // src/utils/quote/aggregator.ts
5954
- var compareAddresses2 = (firstAddress, secondAddress) => {
5986
+ // src/utils/quote/pricing/decimals.ts
5987
+ function convertDecimals(amount, fromDecimals, toDecimals) {
5988
+ const diff = toDecimals - fromDecimals;
5989
+ if (diff >= 0) {
5990
+ return amount * 10n ** BigInt(diff);
5991
+ }
5992
+ return amount / 10n ** BigInt(-diff);
5993
+ }
5994
+
5995
+ // src/utils/quote/pricing/estimate-amount-out.ts
5996
+ var IntentNotViableError = class extends Error {
5997
+ constructor(message) {
5998
+ super(message);
5999
+ this.name = "IntentNotViableError";
6000
+ }
6001
+ };
6002
+ function estimateAmountOut(swapOutput, commissionBps, expenses, commissionDenominator = 10000n) {
6003
+ const commissionFee = swapOutput * commissionBps / commissionDenominator;
6004
+ const total = expenses.gasInTokenOut + expenses.protocolFeeInTokenOut + expenses.extraTransfersInTokenOut + commissionFee;
6005
+ if (total >= swapOutput) {
6006
+ throw new IntentNotViableError(`Total expenses (${total}) meet or exceed swap output (${swapOutput})`);
6007
+ }
6008
+ return swapOutput - total;
6009
+ }
6010
+
6011
+ // src/utils/quote/pricing/expenses.ts
6012
+ init_constants();
6013
+
6014
+ // src/utils/quote/address.ts
6015
+ function compareAddresses2(firstAddress, secondAddress) {
5955
6016
  return !!firstAddress && !!secondAddress && firstAddress.toLowerCase() === secondAddress.toLowerCase();
6017
+ }
6018
+
6019
+ // src/utils/quote/pricing/gas.ts
6020
+ var import_actions = require("viem/actions");
6021
+ init_chains();
6022
+
6023
+ // src/utils/quote/pricing/constants.ts
6024
+ var DEFAULT_COMMISSION_BPS = 50n;
6025
+ var SINGLE_CHAIN_COMMISSION_DENOMINATOR = 10000n;
6026
+ var CROSS_CHAIN_COMMISSION_DENOMINATOR = 100000n;
6027
+ var EVM_SINGLE_CHAIN_GAS_LIMIT = 3000000n;
6028
+ var EVM_CROSS_CHAIN_GAS_LIMIT = 2000000n;
6029
+ var NON_EVM_FIXED_NATIVE_GAS_COST = {
6030
+ [101 /* Sui */]: 20000000n,
6031
+ [7565164 /* Solana */]: 200000n
5956
6032
  };
6033
+
6034
+ // src/utils/quote/pricing/gas.ts
6035
+ async function getNativeGasCost(params) {
6036
+ const { chainId, gasLimit, rpcProviderUrl } = params;
6037
+ if (isEvmChain(chainId)) {
6038
+ const client = ChainProvider.getClient(chainId, rpcProviderUrl);
6039
+ const gasPrice = await (0, import_actions.getGasPrice)(client);
6040
+ return gasLimit * gasPrice;
6041
+ }
6042
+ const fixed = NON_EVM_FIXED_NATIVE_GAS_COST[chainId];
6043
+ if (fixed === void 0) {
6044
+ throw new Error(`No fixed native gas cost configured for chain ${chainId}`);
6045
+ }
6046
+ return fixed;
6047
+ }
6048
+
6049
+ // src/utils/quote/pricing/expenses.ts
6050
+ function nativeTokenAddressForChain(chainId) {
6051
+ if (chainId === 7565164 /* Solana */) return NATIVE_SOLANA_TOKEN_ADDRESS;
6052
+ if (chainId === 101 /* Sui */) return NATIVE_SUI_TOKEN_ADDRESS;
6053
+ return NATIVE_EVM_ETH_ADDRESSES[0];
6054
+ }
6055
+ function isNativeToken(chainId, address9) {
6056
+ if (chainId === 7565164 /* Solana */) return compareAddresses2(address9, NATIVE_SOLANA_TOKEN_ADDRESS);
6057
+ if (chainId === 101 /* Sui */) return compareAddresses2(address9, NATIVE_SUI_TOKEN_ADDRESS);
6058
+ return isNativeEvmToken(address9);
6059
+ }
6060
+ async function estimateExpensesInTokenOut(params) {
6061
+ const { chainId, tokenOut, gasLimit, getQuote, rpcProviderUrl } = params;
6062
+ const nativeGasCost = await getNativeGasCost({ chainId, gasLimit, rpcProviderUrl });
6063
+ const gasInTokenOut = isNativeToken(chainId, tokenOut) ? nativeGasCost : (await getQuote({
6064
+ chainId,
6065
+ amount: nativeGasCost,
6066
+ tokenIn: nativeTokenAddressForChain(chainId),
6067
+ tokenOut
6068
+ })).amountOut;
6069
+ return { gasInTokenOut, protocolFeeInTokenOut: 0n, extraTransfersInTokenOut: 0n };
6070
+ }
6071
+
6072
+ // src/utils/quote/aggregator.ts
5957
6073
  var QuoteProvider = class _QuoteProvider {
5958
6074
  static async getQuote(params) {
5959
6075
  try {
@@ -5970,6 +6086,7 @@ var QuoteProvider = class _QuoteProvider {
5970
6086
  }
5971
6087
  };
5972
6088
  } catch (e) {
6089
+ if (e instanceof IntentNotViableError) throw e;
5973
6090
  console.error("Error getting quote from routers:", e);
5974
6091
  throw new Error("Failed to get quote from routers");
5975
6092
  }
@@ -5999,9 +6116,19 @@ var QuoteProvider = class _QuoteProvider {
5999
6116
  tokenIn: params.tokenIn,
6000
6117
  tokenOut: sourceStable.address
6001
6118
  };
6002
- const sourceQuote = await this.getSingleChainQuote(sourceSingleChainQuoteParams);
6003
- const normalizedBridgeAmount = BigInt(
6004
- Math.floor(Number(sourceQuote.amountOut) / 10 ** sourceStable.decimals * 10 ** destStable.decimals)
6119
+ const [sourceQuote, expenses] = await Promise.all([
6120
+ this.getSingleChainQuote(sourceSingleChainQuoteParams),
6121
+ estimateExpensesInTokenOut({
6122
+ chainId: params.destChainId,
6123
+ tokenOut: params.tokenOut,
6124
+ gasLimit: EVM_CROSS_CHAIN_GAS_LIMIT,
6125
+ getQuote: (p) => this.getSingleChainQuote(p)
6126
+ })
6127
+ ]);
6128
+ const normalizedBridgeAmount = convertDecimals(
6129
+ sourceQuote.amountOut,
6130
+ sourceStable.decimals,
6131
+ destStable.decimals
6005
6132
  );
6006
6133
  const destSingleChainQuoteParams = {
6007
6134
  chainId: params.destChainId,
@@ -6013,12 +6140,19 @@ var QuoteProvider = class _QuoteProvider {
6013
6140
  const estimatedAmountInAsMinStablecoinAmount = BigInt(
6014
6141
  Math.floor(sourceQuote.amountInUsd * 10 ** sourceStable.decimals)
6015
6142
  );
6143
+ const swapOutput = destQuote.amountOutMin ?? destQuote.amountOut;
6144
+ const estimatedAmountOutReduced = estimateAmountOut(
6145
+ swapOutput,
6146
+ DEFAULT_COMMISSION_BPS,
6147
+ expenses,
6148
+ CROSS_CHAIN_COMMISSION_DENOMINATOR
6149
+ );
6016
6150
  return {
6017
6151
  estimatedAmountOut: destQuote.amountOut,
6018
6152
  estimatedAmountOutUsd: destQuote.amountOutUsd,
6019
6153
  amountInUsd: sourceQuote.amountInUsd,
6020
6154
  estimatedAmountInAsMinStablecoinAmount,
6021
- estimatedAmountOutReduced: destQuote.amountOutMin || destQuote.amountOut,
6155
+ estimatedAmountOutReduced,
6022
6156
  estimatedAmountOutUsdReduced: destQuote.amountOutUsd
6023
6157
  };
6024
6158
  }
@@ -6477,7 +6611,10 @@ var CrossChainOrder = class _CrossChainOrder {
6477
6611
  tokenOut: this.destinationTokenAddress,
6478
6612
  destinationAddress: this.destinationAddress,
6479
6613
  amountOutMin: this.destinationTokenMinAmount,
6480
- extraTransfers: this.extraTransfers
6614
+ extraTransfers: this.extraTransfers,
6615
+ stopLossType: this.stopLossType,
6616
+ stopLossTriggerPrice: this.stopLossTriggerPrice,
6617
+ takeProfitMinOut: this.takeProfitMinOut
6481
6618
  };
6482
6619
  }
6483
6620
  executionDetailsHashToBytes() {
@@ -6658,13 +6795,22 @@ var SingleChainOrder = class _SingleChainOrder {
6658
6795
  });
6659
6796
  switch (scenario) {
6660
6797
  case "QUOTE_REQUIRED": {
6661
- const quote = await QuoteProvider.getSingleChainQuote({
6662
- tokenIn: input.tokenIn,
6663
- amount: input.amountIn,
6664
- chainId: input.chainId,
6665
- tokenOut: input.tokenOut
6666
- });
6667
- return quote.amountOut * 93n / 100n;
6798
+ const [quote, expenses] = await Promise.all([
6799
+ QuoteProvider.getSingleChainQuote({
6800
+ tokenIn: input.tokenIn,
6801
+ amount: input.amountIn,
6802
+ chainId: input.chainId,
6803
+ tokenOut: input.tokenOut
6804
+ }),
6805
+ estimateExpensesInTokenOut({
6806
+ chainId: input.chainId,
6807
+ tokenOut: input.tokenOut,
6808
+ gasLimit: EVM_SINGLE_CHAIN_GAS_LIMIT,
6809
+ getQuote: (p) => QuoteProvider.getSingleChainQuote(p)
6810
+ })
6811
+ ]);
6812
+ const swapOutput = quote.amountOutMin ?? quote.amountOut;
6813
+ return estimateAmountOut(swapOutput, DEFAULT_COMMISSION_BPS, expenses, SINGLE_CHAIN_COMMISSION_DENOMINATOR);
6668
6814
  }
6669
6815
  case "USE_PROVIDED_AMOUNT":
6670
6816
  return amountOutMin;
@@ -6724,10 +6870,7 @@ var BaseSDK = class _BaseSDK {
6724
6870
  static async makeRequest(url, body) {
6725
6871
  const response = await fetch(url, {
6726
6872
  method: "POST",
6727
- headers: {
6728
- "Content-Type": "application/json",
6729
- ...DEV_ACCESS_KEY ? { "x-dev-access": DEV_ACCESS_KEY } : {}
6730
- },
6873
+ headers: { "Content-Type": "application/json" },
6731
6874
  body
6732
6875
  });
6733
6876
  console.debug(`url`, url, `body`, body);
@@ -6796,6 +6939,13 @@ var BaseSDK = class _BaseSDK {
6796
6939
  static async validateDcaSingleChainOrder(intentRequest) {
6797
6940
  return _BaseSDK.validateOrder(intentRequest, "/validate_intent/single_chain/dca_order");
6798
6941
  }
6942
+ static async validateDcaCrossChainOrder(intentRequest) {
6943
+ return _BaseSDK.validateOrder(intentRequest, "/validate_intent/cross_chain/dca_order");
6944
+ }
6945
+ static async sendDcaCrossChainOrder(intentRequest) {
6946
+ const body = JSON.stringify(intentRequest, Parsers.bigIntReplacer);
6947
+ return _BaseSDK.makeRequest(`${AUCTIONEER_URL}/user_intent/cross_chain/dca_order`, body);
6948
+ }
6799
6949
  };
6800
6950
 
6801
6951
  // src/core/solana/dca/create-order.ts
@@ -7001,11 +7151,7 @@ init_constants();
7001
7151
  init_constants();
7002
7152
  async function fetchSiweMessage(params) {
7003
7153
  const url = `${AUCTIONEER_URL}/siwe?wallet=${params.wallet}&chainId=${params.chainId}`;
7004
- const response = await fetch(url, {
7005
- headers: {
7006
- ...DEV_ACCESS_KEY ? { "x-dev-access": DEV_ACCESS_KEY } : {}
7007
- }
7008
- });
7154
+ const response = await fetch(url);
7009
7155
  if (!response.ok) {
7010
7156
  throw new Error(`Failed to fetch SIWE message: ${response.status} ${response.statusText}`);
7011
7157
  }
@@ -7014,12 +7160,14 @@ async function fetchSiweMessage(params) {
7014
7160
  }
7015
7161
  async function fetchJWTToken(params, token) {
7016
7162
  const url = `${AUCTIONEER_URL}/siwe`;
7163
+ const headers = { "Content-Type": "application/json" };
7164
+ if (token) {
7165
+ headers.Authorization = `Bearer ${token}`;
7166
+ }
7017
7167
  const response = await fetch(url, {
7018
7168
  method: "POST",
7019
7169
  body: JSON.stringify(params),
7020
- headers: {
7021
- Authorization: `Bearer ${token}`
7022
- }
7170
+ headers
7023
7171
  });
7024
7172
  if (!response.ok) {
7025
7173
  throw new Error(`Failed to fetch JWT token: ${response.status} ${response.statusText}`);
@@ -7772,34 +7920,6 @@ var SuiSDK = class extends BaseSDK {
7772
7920
  }
7773
7921
  };
7774
7922
 
7775
- // src/core/orders/api/fetch.ts
7776
- init_constants();
7777
- async function fetchUserOrders(evmAddress, solAddress, suiAddress) {
7778
- const params = new URLSearchParams();
7779
- if (evmAddress) params.append("evmWallets", evmAddress);
7780
- if (solAddress) params.append("solanaWallets", solAddress);
7781
- if (suiAddress) params.append("suiWallets", suiAddress);
7782
- if ([evmAddress, solAddress, suiAddress].every((a) => !a)) {
7783
- throw new Error("At least one wallet address is required");
7784
- }
7785
- const url = `${AUCTIONEER_URL}/user_intent?${params.toString()}`;
7786
- const response = await fetch(url, {
7787
- method: "GET",
7788
- headers: {
7789
- "Content-Type": "application/json",
7790
- ...DEV_ACCESS_KEY ? { "x-dev-access": DEV_ACCESS_KEY } : {}
7791
- }
7792
- });
7793
- if (!response.ok) {
7794
- throw new Error(`Failed to fetch user orders: ${response.status} ${response.statusText}`);
7795
- }
7796
- const data = await response.json();
7797
- if (!data.success) {
7798
- throw new Error(`Failed to fetch user orders: ${data.error}`);
7799
- }
7800
- return data.data;
7801
- }
7802
-
7803
7923
  // src/core/orders/api/index.ts
7804
7924
  init_constants();
7805
7925
  var AuctioneerAPI = class {
@@ -7827,6 +7947,14 @@ var AuctioneerAPI = class {
7827
7947
  }
7828
7948
  };
7829
7949
 
7950
+ // src/core/orders/api/fetch.ts
7951
+ async function fetchUserOrders(aggregatedToken) {
7952
+ if (!aggregatedToken) {
7953
+ throw new Error("A SIWE-issued JWT is required to fetch user orders");
7954
+ }
7955
+ return new AuctioneerAPI(aggregatedToken).getUserOrders();
7956
+ }
7957
+
7830
7958
  // src/index.ts
7831
7959
  init_errors();
7832
7960
 
@@ -8257,27 +8385,7 @@ init_single_chain_limit_order();
8257
8385
 
8258
8386
  // src/utils/generate-execution-details-hash.ts
8259
8387
  var import_crypto = require("crypto");
8260
- function generateExecutionDetailsHash({
8261
- destChainId,
8262
- destinationAddress,
8263
- tokenOut,
8264
- amountOutMin,
8265
- stopLossMaxOut,
8266
- takeProfitMinOut,
8267
- extraTransfers
8268
- }) {
8269
- const executionDetails = JSON.stringify(
8270
- {
8271
- destChainId,
8272
- destinationAddress,
8273
- tokenOut,
8274
- amountOutMin,
8275
- stopLossMaxOut,
8276
- takeProfitMinOut,
8277
- extraTransfers
8278
- },
8279
- Parsers.bigIntReplacer
8280
- );
8388
+ function generateExecutionDetailsHash(executionDetails) {
8281
8389
  return "0x" + (0, import_crypto.createHash)("sha256").update(executionDetails).digest("hex");
8282
8390
  }
8283
8391
 
@@ -8295,7 +8403,9 @@ function createSuiSingleChainLimitOrderIntentRequest(params) {
8295
8403
  destinationAddress: params.destinationAddress,
8296
8404
  extraTransfers: params.extraTransfers,
8297
8405
  deadline: params.deadline,
8298
- takeProfitMinOut: params.takeProfitMinOut
8406
+ takeProfitMinOut: params.takeProfitMinOut,
8407
+ stopLossType: params.stopLossType,
8408
+ stopLossTriggerPrice: params.stopLossTriggerPrice
8299
8409
  };
8300
8410
  return {
8301
8411
  genericData: order,
@@ -8345,7 +8455,7 @@ function createSuiCrossChainOrderIntentRequest(params) {
8345
8455
  extraTransfers: params.extraTransfers
8346
8456
  };
8347
8457
  const executionDetailsString = JSON.stringify(executionDetails, Parsers.bigIntReplacer);
8348
- const executionDetailsHash = generateExecutionDetailsHash(executionDetails);
8458
+ const executionDetailsHash = generateExecutionDetailsHash(executionDetailsString);
8349
8459
  const genericData = {
8350
8460
  user: params.user,
8351
8461
  srcChainId: params.srcChainId,
@@ -8574,6 +8684,7 @@ async function getTokenList(params) {
8574
8684
  }
8575
8685
 
8576
8686
  // src/core/evm/intent-helpers.ts
8687
+ init_constants();
8577
8688
  function createEvmSingleChainLimitOrderIntentRequest(params) {
8578
8689
  const order = {
8579
8690
  user: params.user,
@@ -8594,7 +8705,7 @@ function createEvmSingleChainLimitOrderIntentRequest(params) {
8594
8705
  chainSpecificData: {
8595
8706
  EVM: {
8596
8707
  nonce: params.nonce || String(Math.floor(Math.random() * 1e7)),
8597
- signature: params.signature || "0x0000000000000000000000000000000000000000000000000000000000000000"
8708
+ signature: params.signature || EVM_ZERO_SIGNATURE
8598
8709
  }
8599
8710
  }
8600
8711
  };
@@ -8619,7 +8730,7 @@ function createEvmSingleChainDcaOrderIntentRequest(params) {
8619
8730
  chainSpecificData: {
8620
8731
  EVM: {
8621
8732
  nonce: params.nonce || String(Math.floor(Math.random() * 1e7)),
8622
- signature: params.signature || "0x0000000000000000000000000000000000000000000000000000000000000000"
8733
+ signature: params.signature || EVM_ZERO_SIGNATURE
8623
8734
  }
8624
8735
  }
8625
8736
  };
@@ -8636,7 +8747,7 @@ function createEvmCrossChainOrderIntentRequest(params) {
8636
8747
  stopLossTriggerPrice: params.stopLossTriggerPrice
8637
8748
  };
8638
8749
  const executionDetailsString = JSON.stringify(executionDetails, Parsers.bigIntReplacer);
8639
- const executionDetailsHash = generateExecutionDetailsHash(executionDetails);
8750
+ const executionDetailsHash = generateExecutionDetailsHash(executionDetailsString);
8640
8751
  const genericData = {
8641
8752
  user: params.user,
8642
8753
  srcChainId: params.sourceChainId,
@@ -8645,10 +8756,7 @@ function createEvmCrossChainOrderIntentRequest(params) {
8645
8756
  minStablecoinsAmount: params.minStablecoinAmount || 1n,
8646
8757
  deadline: params.deadline,
8647
8758
  executionDetailsHash,
8648
- extraTransfers: params.extraTransfers,
8649
- takeProfitMinOut: params.takeProfitMinOut,
8650
- stopLossType: params.stopLossType,
8651
- stopLossTriggerPrice: params.stopLossTriggerPrice
8759
+ extraTransfers: params.extraTransfers
8652
8760
  };
8653
8761
  return {
8654
8762
  genericData,
@@ -8656,7 +8764,7 @@ function createEvmCrossChainOrderIntentRequest(params) {
8656
8764
  chainSpecificData: {
8657
8765
  EVM: {
8658
8766
  nonce: params.nonce || String(Math.floor(Math.random() * 1e7)),
8659
- signature: params.signature || "0x0000000000000000000000000000000000000000000000000000000000000000"
8767
+ signature: params.signature || EVM_ZERO_SIGNATURE
8660
8768
  }
8661
8769
  }
8662
8770
  };
@@ -8673,6 +8781,75 @@ async function generateEvmCrossChainOrderTypedData(order) {
8673
8781
  function generateEvmRandomNonce() {
8674
8782
  return String(Math.floor(Math.random() * 1e7));
8675
8783
  }
8784
+ function buildCrossChainDcaExecutionDetails(params) {
8785
+ const executionDetails = {
8786
+ destChainId: params.destinationChainId,
8787
+ tokenOut: params.destinationTokenAddress,
8788
+ amountOutMin: params.destinationTokenMinAmount?.toString() || "1",
8789
+ destinationAddress: params.destinationAddress,
8790
+ extraTransfers: params.extraTransfers
8791
+ };
8792
+ const executionDetailsString = JSON.stringify(executionDetails, Parsers.bigIntReplacer);
8793
+ return { executionDetailsString, executionDetailsHash: generateExecutionDetailsHash(executionDetailsString) };
8794
+ }
8795
+ function createEvmCrossChainDcaOrderIntentRequest(params) {
8796
+ const { executionDetailsString, executionDetailsHash } = buildCrossChainDcaExecutionDetails(params);
8797
+ return {
8798
+ genericData: {
8799
+ user: params.user,
8800
+ srcChainId: params.sourceChainId,
8801
+ tokenIn: params.sourceTokenAddress,
8802
+ minStablecoinsAmount: params.minStablecoinAmount || 1n,
8803
+ deadline: params.deadline,
8804
+ executionDetailsHash,
8805
+ startTime: params.startTime,
8806
+ amountInPerInterval: params.amountInPerInterval,
8807
+ totalIntervals: params.totalIntervals,
8808
+ intervalDuration: params.intervalDuration
8809
+ },
8810
+ executionDetails: executionDetailsString,
8811
+ chainSpecificData: {
8812
+ EVM: {
8813
+ nonce: params.nonce || generateEvmRandomNonce(),
8814
+ signature: params.signature || EVM_ZERO_SIGNATURE
8815
+ }
8816
+ }
8817
+ };
8818
+ }
8819
+ function getEVMCrossChainDcaOrderTypedData(params, providedNonce) {
8820
+ const { executionDetailsHash } = buildCrossChainDcaExecutionDetails(params);
8821
+ const nonce = providedNonce ?? EVMIntentProvider.getRandomNonce();
8822
+ const totalAmountIn = params.amountInPerInterval * BigInt(params.totalIntervals);
8823
+ const spender = DCA_CROSS_CHAIN_GUARD_ADDRESSES[params.sourceChainId];
8824
+ const message = {
8825
+ permitted: { token: params.sourceTokenAddress, amount: totalAmountIn },
8826
+ spender,
8827
+ nonce,
8828
+ deadline: BigInt(params.deadline),
8829
+ witness: {
8830
+ user: params.user,
8831
+ tokenIn: params.sourceTokenAddress,
8832
+ srcChainId: params.sourceChainId,
8833
+ startTime: params.startTime,
8834
+ deadline: params.deadline,
8835
+ totalIntervals: params.totalIntervals,
8836
+ intervalDuration: params.intervalDuration,
8837
+ amountInPerInterval: params.amountInPerInterval,
8838
+ minStablecoinsAmountPerInterval: params.minStablecoinAmount || 1n,
8839
+ executionDetailsHash,
8840
+ nonce
8841
+ }
8842
+ };
8843
+ return {
8844
+ orderTypedData: {
8845
+ domain: PERMIT2_DOMAIN(params.sourceChainId),
8846
+ types: CROSS_CHAIN_DCA_PERMIT2_TYPES,
8847
+ primaryType: "PermitWitnessTransferFrom",
8848
+ message
8849
+ },
8850
+ nonce
8851
+ };
8852
+ }
8676
8853
 
8677
8854
  // src/core/solana/intent-helpers.ts
8678
8855
  function createSolanaSingleChainLimitOrderIntentRequest(params) {
@@ -8734,11 +8911,12 @@ function createSolanaCrossChainOrderIntentRequest(params) {
8734
8911
  amountOutMin: params.destinationTokenMinAmount?.toString() || "1",
8735
8912
  destinationAddress: params.destinationAddress,
8736
8913
  extraTransfers: params.extraTransfers,
8737
- stopLossMaxOut: params.stopLossMaxOut?.toString(),
8914
+ stopLossType: params.stopLossType,
8915
+ stopLossTriggerPrice: params.stopLossTriggerPrice,
8738
8916
  takeProfitMinOut: params.takeProfitMinOut?.toString()
8739
8917
  };
8740
8918
  const executionDetailsString = JSON.stringify(executionDetails, Parsers.bigIntReplacer);
8741
- const executionDetailsHash = generateExecutionDetailsHash(executionDetails);
8919
+ const executionDetailsHash = generateExecutionDetailsHash(executionDetailsString);
8742
8920
  const genericData = {
8743
8921
  user: params.user,
8744
8922
  srcChainId: params.sourceChainId,