@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 +277 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +109 -22
- package/dist/index.d.ts +109 -22
- package/dist/index.js +277 -99
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/src/auth/siwe.ts +10 -11
- package/src/constants.ts +32 -8
- package/src/core/evm/intent-helpers.ts +131 -8
- package/src/core/evm/intent-provider.ts +5 -4
- package/src/core/evm/permit2.ts +36 -0
- package/src/core/orders/api/fetch.ts +12 -39
- package/src/core/orders/cross-chain.ts +3 -0
- package/src/core/orders/single-chain.ts +21 -8
- package/src/core/sdk.ts +12 -6
- package/src/core/solana/intent-helpers.ts +6 -4
- package/src/core/sui/intent-helpers.ts +4 -1
- package/src/index.ts +4 -0
- package/src/types/api.ts +14 -3
- package/src/types/intent.ts +36 -2
- package/src/utils/base-validator.ts +0 -4
- package/src/utils/generate-execution-details-hash.ts +9 -32
- package/src/utils/quote/address.ts +4 -0
- package/src/utils/quote/aggregator.ts +29 -9
- package/src/utils/quote/pricing/constants.ts +33 -0
- package/src/utils/quote/pricing/decimals.ts +11 -0
- package/src/utils/quote/pricing/estimate-amount-out.ts +36 -0
- package/src/utils/quote/pricing/expenses.ts +62 -0
- package/src/utils/quote/pricing/gas.ts +28 -0
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
5954
|
-
|
|
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
|
|
6003
|
-
|
|
6004
|
-
|
|
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
|
|
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
|
|
6662
|
-
|
|
6663
|
-
|
|
6664
|
-
|
|
6665
|
-
|
|
6666
|
-
|
|
6667
|
-
|
|
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(
|
|
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 ||
|
|
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 ||
|
|
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(
|
|
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 ||
|
|
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
|
-
|
|
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(
|
|
8919
|
+
const executionDetailsHash = generateExecutionDetailsHash(executionDetailsString);
|
|
8742
8920
|
const genericData = {
|
|
8743
8921
|
user: params.user,
|
|
8744
8922
|
srcChainId: params.sourceChainId,
|