@cowprotocol/sdk-bridging 0.6.0 → 0.7.0
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 +77 -8
- package/dist/index.d.mts +64 -13
- package/dist/index.d.ts +64 -13
- package/dist/index.js +560 -80
- package/dist/index.mjs +608 -139
- package/package.json +21 -19
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
@@ -33,6 +43,7 @@ __export(src_exports, {
|
|
|
33
43
|
DEFAULT_EXTRA_GAS_PROXY_CREATION: () => DEFAULT_EXTRA_GAS_PROXY_CREATION,
|
|
34
44
|
DEFAULT_GAS_COST_FOR_HOOK_ESTIMATION: () => DEFAULT_GAS_COST_FOR_HOOK_ESTIMATION,
|
|
35
45
|
HOOK_DAPP_BRIDGE_PROVIDER_PREFIX: () => HOOK_DAPP_BRIDGE_PROVIDER_PREFIX,
|
|
46
|
+
NearIntentsBridgeProvider: () => NearIntentsBridgeProvider,
|
|
36
47
|
RAW_PROVIDERS_FILES_PATH: () => RAW_PROVIDERS_FILES_PATH,
|
|
37
48
|
assertIsBridgeQuoteAndPost: () => assertIsBridgeQuoteAndPost,
|
|
38
49
|
assertIsQuoteAndPost: () => assertIsQuoteAndPost,
|
|
@@ -66,6 +77,7 @@ var BridgeQuoteErrors = /* @__PURE__ */ ((BridgeQuoteErrors2) => {
|
|
|
66
77
|
BridgeQuoteErrors2["QUOTE_ERROR"] = "QUOTE_ERROR";
|
|
67
78
|
BridgeQuoteErrors2["NO_ROUTES"] = "NO_ROUTES";
|
|
68
79
|
BridgeQuoteErrors2["INVALID_BRIDGE"] = "INVALID_BRIDGE";
|
|
80
|
+
BridgeQuoteErrors2["QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS"] = "QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS";
|
|
69
81
|
return BridgeQuoteErrors2;
|
|
70
82
|
})(BridgeQuoteErrors || {});
|
|
71
83
|
var BridgeProviderQuoteError = class extends Error {
|
|
@@ -111,7 +123,7 @@ function getPostHooks(fullAppData) {
|
|
|
111
123
|
if (!fullAppData) {
|
|
112
124
|
return [];
|
|
113
125
|
}
|
|
114
|
-
const appData = JSON.parse(fullAppData);
|
|
126
|
+
const appData = typeof fullAppData === "string" ? JSON.parse(fullAppData) : fullAppData;
|
|
115
127
|
if (!isAppDoc(appData)) {
|
|
116
128
|
return [];
|
|
117
129
|
}
|
|
@@ -141,14 +153,18 @@ var HOOK_DAPP_BRIDGE_PROVIDER_PREFIX = "cow-sdk://bridging/providers";
|
|
|
141
153
|
|
|
142
154
|
// src/BridgingSdk/findBridgeProviderFromHook.ts
|
|
143
155
|
function findBridgeProviderFromHook(fullAppData, providers) {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
156
|
+
const appDataObj = JSON.parse(fullAppData);
|
|
157
|
+
let bridgeProviderDappId = appDataObj?.metadata?.bridging?.providerId;
|
|
158
|
+
if (!bridgeProviderDappId) {
|
|
159
|
+
const postHooks = getPostHooks(appDataObj);
|
|
160
|
+
const bridgingHook = postHooks.find((hook) => {
|
|
161
|
+
return hook.dappId?.startsWith(HOOK_DAPP_BRIDGE_PROVIDER_PREFIX);
|
|
162
|
+
});
|
|
163
|
+
if (!bridgingHook) {
|
|
164
|
+
return void 0;
|
|
165
|
+
}
|
|
166
|
+
bridgeProviderDappId = bridgingHook.dappId;
|
|
150
167
|
}
|
|
151
|
-
const bridgeProviderDappId = bridgingHook.dappId;
|
|
152
168
|
return providers.find((provider) => provider.info.dappId === bridgeProviderDappId);
|
|
153
169
|
}
|
|
154
170
|
|
|
@@ -172,7 +188,7 @@ async function getCrossChainOrder(params) {
|
|
|
172
188
|
`No tx hash found for order ${orderId} . First trade, with log index ${firstTrade?.logIndex}`
|
|
173
189
|
);
|
|
174
190
|
}
|
|
175
|
-
const { params: bridgingParams, status: statusResult } = await provider.getBridgingParams(chainId,
|
|
191
|
+
const { params: bridgingParams, status: statusResult } = await provider.getBridgingParams(chainId, order, tradeTxHash) || {};
|
|
176
192
|
if (!bridgingParams || !statusResult) {
|
|
177
193
|
throw new BridgeOrderParsingError(`Bridging params cannot be derived from transaction: ${tradeTxHash}`);
|
|
178
194
|
}
|
|
@@ -326,6 +342,7 @@ async function getIntermediateSwapResult({
|
|
|
326
342
|
metadata: {
|
|
327
343
|
hooks,
|
|
328
344
|
bridging: {
|
|
345
|
+
providerId: provider.info.dappId,
|
|
329
346
|
destinationChainId: buyTokenChainId.toString(),
|
|
330
347
|
destinationTokenAddress: buyTokenAddress
|
|
331
348
|
}
|
|
@@ -367,7 +384,9 @@ async function getIntermediateTokens(params) {
|
|
|
367
384
|
intermediateTokens = cached;
|
|
368
385
|
} else {
|
|
369
386
|
intermediateTokens = await provider.getIntermediateTokens(quoteBridgeRequest);
|
|
370
|
-
|
|
387
|
+
if (intermediateTokens?.length) {
|
|
388
|
+
intermediateTokensCache?.set(cacheKey, intermediateTokens);
|
|
389
|
+
}
|
|
371
390
|
}
|
|
372
391
|
if (intermediateTokens.length === 0) {
|
|
373
392
|
throw new BridgeProviderQuoteError("NO_INTERMEDIATE_TOKENS" /* NO_INTERMEDIATE_TOKENS */);
|
|
@@ -422,13 +441,22 @@ async function getQuoteWithBridge(provider, params) {
|
|
|
422
441
|
throw new Error("Provider type is unknown: " + provider.type);
|
|
423
442
|
}
|
|
424
443
|
function createPostSwapOrderFromQuote(params) {
|
|
425
|
-
const { getBridgeProviderQuote, signer, sellTokenAddress, orderBookApi } = params;
|
|
444
|
+
const { provider, getBridgeProviderQuote, signer, sellTokenAddress, orderBookApi, initialSwapResult } = params;
|
|
426
445
|
return async function postSwapOrderFromQuote(advancedSettings, signingStepManager) {
|
|
427
446
|
await signingStepManager?.beforeBridgingSign?.();
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
447
|
+
const skipQuoteRefetch = isReceiverAccountBridgeProvider(provider);
|
|
448
|
+
const appDataOverride = advancedSettings?.appData;
|
|
449
|
+
const appDataInfo = appDataOverride && skipQuoteRefetch ? await (0, import_sdk_trading.mergeAppDataDoc)(initialSwapResult.appDataInfo.doc, appDataOverride) : initialSwapResult.appDataInfo;
|
|
450
|
+
const swapResult = skipQuoteRefetch ? {
|
|
451
|
+
...initialSwapResult,
|
|
452
|
+
appDataInfo
|
|
453
|
+
} : (
|
|
454
|
+
// Sign the hooks with the real signer
|
|
455
|
+
(await getBridgeProviderQuote(signer, advancedSettings).catch((error) => {
|
|
456
|
+
signingStepManager?.onBridgingSignError?.();
|
|
457
|
+
throw error;
|
|
458
|
+
})).swapResult
|
|
459
|
+
);
|
|
432
460
|
await signingStepManager?.afterBridgingSign?.();
|
|
433
461
|
const quoteResults = {
|
|
434
462
|
result: {
|
|
@@ -495,10 +523,12 @@ async function getQuoteWithReceiverAccountBridge(provider, params) {
|
|
|
495
523
|
swap: result.swapResult,
|
|
496
524
|
bridge: result.bridgeResult,
|
|
497
525
|
postSwapOrderFromQuote: createPostSwapOrderFromQuote({
|
|
526
|
+
provider,
|
|
498
527
|
getBridgeProviderQuote,
|
|
499
528
|
signer,
|
|
500
529
|
sellTokenAddress: swapAndBridgeRequest.sellTokenAddress,
|
|
501
|
-
orderBookApi
|
|
530
|
+
orderBookApi,
|
|
531
|
+
initialSwapResult: result.swapResult
|
|
502
532
|
})
|
|
503
533
|
};
|
|
504
534
|
}
|
|
@@ -577,7 +607,9 @@ async function getQuoteWithHookBridge(provider, params) {
|
|
|
577
607
|
getBridgeProviderQuote: (signer2, advancedSettings) => getBridgeProviderQuote(signer2, hookEstimatedGasLimit, advancedSettings),
|
|
578
608
|
signer,
|
|
579
609
|
sellTokenAddress: swapAndBridgeRequest.sellTokenAddress,
|
|
580
|
-
orderBookApi
|
|
610
|
+
orderBookApi,
|
|
611
|
+
provider,
|
|
612
|
+
initialSwapResult: result.swapResult
|
|
581
613
|
})
|
|
582
614
|
};
|
|
583
615
|
}
|
|
@@ -664,10 +696,9 @@ var SingleQuoteStrategy = class extends BaseSingleQuoteStrategy {
|
|
|
664
696
|
constructor(intermediateTokensCache) {
|
|
665
697
|
super(intermediateTokensCache);
|
|
666
698
|
}
|
|
667
|
-
async execute(request,
|
|
699
|
+
async execute(request, tradingSdk, providers) {
|
|
668
700
|
const { quoteBridgeRequest, advancedSettings } = request;
|
|
669
701
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
670
|
-
const { tradingSdk, providers } = config;
|
|
671
702
|
if (sellTokenChainId !== buyTokenChainId) {
|
|
672
703
|
const provider = providers[0];
|
|
673
704
|
if (!provider) {
|
|
@@ -703,7 +734,7 @@ function validateCrossChainRequest(sellTokenChainId, buyTokenChainId) {
|
|
|
703
734
|
);
|
|
704
735
|
}
|
|
705
736
|
}
|
|
706
|
-
function
|
|
737
|
+
function createBridgeRequestTimeoutPromise(timeoutMs, prefix) {
|
|
707
738
|
return new Promise((_, reject) => {
|
|
708
739
|
setTimeout(() => {
|
|
709
740
|
reject(new BridgeProviderError(`${prefix} timeout after ${timeoutMs}ms`, {}));
|
|
@@ -732,11 +763,11 @@ function fillTimeoutResults(results, providersToQuery) {
|
|
|
732
763
|
}
|
|
733
764
|
}
|
|
734
765
|
}
|
|
735
|
-
async function executeProviderQuotes(promises, timeout,
|
|
766
|
+
async function executeProviderQuotes(promises, timeout, providers) {
|
|
736
767
|
try {
|
|
737
768
|
await Promise.race([
|
|
738
769
|
Promise.allSettled(promises),
|
|
739
|
-
|
|
770
|
+
createBridgeRequestTimeoutPromise(timeout, `Multi-quote with ${providers.length}`)
|
|
740
771
|
]);
|
|
741
772
|
} catch {
|
|
742
773
|
console.warn("getMultiQuotes timeout occurred, returning partial results");
|
|
@@ -787,11 +818,11 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
787
818
|
constructor(intermediateTokensCache) {
|
|
788
819
|
super(intermediateTokensCache);
|
|
789
820
|
}
|
|
790
|
-
async execute(request,
|
|
821
|
+
async execute(request, tradingSdk, providers) {
|
|
791
822
|
const { quoteBridgeRequest, providerDappIds, advancedSettings, options } = request;
|
|
792
823
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
793
824
|
validateCrossChainRequest(sellTokenChainId, buyTokenChainId);
|
|
794
|
-
const providersToQuery = resolveProvidersToQuery(providerDappIds,
|
|
825
|
+
const providersToQuery = resolveProvidersToQuery(providerDappIds, providers);
|
|
795
826
|
const {
|
|
796
827
|
onQuoteResult,
|
|
797
828
|
totalTimeout = DEFAULT_TOTAL_TIMEOUT_MS,
|
|
@@ -813,10 +844,10 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
813
844
|
results,
|
|
814
845
|
index: i
|
|
815
846
|
};
|
|
816
|
-
const promise = this.createProviderQuotePromise(context,
|
|
847
|
+
const promise = this.createProviderQuotePromise(context, tradingSdk);
|
|
817
848
|
promises.push(promise);
|
|
818
849
|
}
|
|
819
|
-
await executeProviderQuotes(promises, totalTimeout,
|
|
850
|
+
await executeProviderQuotes(promises, totalTimeout, providers);
|
|
820
851
|
fillTimeoutResults(results, providersToQuery);
|
|
821
852
|
results.sort((a, b) => {
|
|
822
853
|
if (isBetterQuote(a, b))
|
|
@@ -827,14 +858,14 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
827
858
|
});
|
|
828
859
|
return results;
|
|
829
860
|
}
|
|
830
|
-
createProviderQuotePromise(context,
|
|
861
|
+
createProviderQuotePromise(context, tradingSdk) {
|
|
831
862
|
const { provider, quoteBridgeRequest, advancedSettings, providerTimeout, onQuoteResult, results, index } = context;
|
|
832
863
|
return (async () => {
|
|
833
864
|
try {
|
|
834
865
|
const baseParams = {
|
|
835
866
|
swapAndBridgeRequest: quoteBridgeRequest,
|
|
836
867
|
advancedSettings,
|
|
837
|
-
tradingSdk
|
|
868
|
+
tradingSdk,
|
|
838
869
|
quoteSigner: advancedSettings?.quoteSigner
|
|
839
870
|
};
|
|
840
871
|
const request = this.intermediateTokensCache ? {
|
|
@@ -843,7 +874,7 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
843
874
|
} : baseParams;
|
|
844
875
|
const quote = await Promise.race([
|
|
845
876
|
getQuoteWithBridge(provider, request),
|
|
846
|
-
|
|
877
|
+
createBridgeRequestTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
|
|
847
878
|
]);
|
|
848
879
|
const result = {
|
|
849
880
|
providerDappId: provider.info.dappId,
|
|
@@ -873,11 +904,11 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
873
904
|
constructor(intermediateTokensCache) {
|
|
874
905
|
super(intermediateTokensCache);
|
|
875
906
|
}
|
|
876
|
-
async execute(request,
|
|
907
|
+
async execute(request, tradingSdk, providers) {
|
|
877
908
|
const { quoteBridgeRequest, providerDappIds, advancedSettings, options } = request;
|
|
878
909
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
879
910
|
validateCrossChainRequest(sellTokenChainId, buyTokenChainId);
|
|
880
|
-
const providersToQuery = resolveProvidersToQuery(providerDappIds,
|
|
911
|
+
const providersToQuery = resolveProvidersToQuery(providerDappIds, providers);
|
|
881
912
|
const {
|
|
882
913
|
onQuoteResult,
|
|
883
914
|
totalTimeout = DEFAULT_TOTAL_TIMEOUT_MS2,
|
|
@@ -896,20 +927,20 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
896
927
|
bestResult,
|
|
897
928
|
firstError
|
|
898
929
|
};
|
|
899
|
-
const promise = this.createBestQuoteProviderPromise(context,
|
|
930
|
+
const promise = this.createBestQuoteProviderPromise(context, tradingSdk);
|
|
900
931
|
promises.push(promise);
|
|
901
932
|
}
|
|
902
|
-
await executeProviderQuotes(promises, totalTimeout,
|
|
933
|
+
await executeProviderQuotes(promises, totalTimeout, providers);
|
|
903
934
|
return bestResult.current || firstError.current;
|
|
904
935
|
}
|
|
905
|
-
createBestQuoteProviderPromise(context,
|
|
936
|
+
createBestQuoteProviderPromise(context, tradingSdk) {
|
|
906
937
|
const { provider, quoteBridgeRequest, advancedSettings, providerTimeout, onQuoteResult, bestResult, firstError } = context;
|
|
907
938
|
return (async () => {
|
|
908
939
|
try {
|
|
909
940
|
const baseParams = {
|
|
910
941
|
swapAndBridgeRequest: quoteBridgeRequest,
|
|
911
942
|
advancedSettings,
|
|
912
|
-
tradingSdk
|
|
943
|
+
tradingSdk,
|
|
913
944
|
provider,
|
|
914
945
|
quoteSigner: advancedSettings?.quoteSigner
|
|
915
946
|
};
|
|
@@ -919,7 +950,7 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
919
950
|
} : baseParams;
|
|
920
951
|
const quote = await Promise.race([
|
|
921
952
|
getQuoteWithBridge(provider, request),
|
|
922
|
-
|
|
953
|
+
createBridgeRequestTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
|
|
923
954
|
]);
|
|
924
955
|
const result = {
|
|
925
956
|
providerDappId: provider.info.dappId,
|
|
@@ -957,10 +988,11 @@ function createStrategies(intermediateTokensCache) {
|
|
|
957
988
|
var DEFAULT_CACHE_CONFIG = {
|
|
958
989
|
enabled: true,
|
|
959
990
|
intermediateTokensTtl: 5 * 60 * 1e3,
|
|
960
|
-
//
|
|
991
|
+
// 2 minutes
|
|
961
992
|
buyTokensTtl: 2 * 60 * 1e3
|
|
962
993
|
// 2 minutes
|
|
963
994
|
};
|
|
995
|
+
var DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT = 10 * 1e3;
|
|
964
996
|
var BridgingSdk = class {
|
|
965
997
|
constructor(options, adapter) {
|
|
966
998
|
this.options = options;
|
|
@@ -1007,18 +1039,18 @@ var BridgingSdk = class {
|
|
|
1007
1039
|
singleQuoteStrategy;
|
|
1008
1040
|
multiQuoteStrategy;
|
|
1009
1041
|
bestQuoteStrategy;
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
throw new BridgeProviderError("No provider found", { config: this.config });
|
|
1014
|
-
}
|
|
1015
|
-
return providers[0];
|
|
1042
|
+
availableProvidersIds = [];
|
|
1043
|
+
setAvailableProviders(ids) {
|
|
1044
|
+
this.availableProvidersIds = ids;
|
|
1016
1045
|
}
|
|
1017
1046
|
/**
|
|
1018
1047
|
* Get the providers for the bridging.
|
|
1019
1048
|
*/
|
|
1020
|
-
|
|
1021
|
-
|
|
1049
|
+
getAvailableProviders() {
|
|
1050
|
+
if (this.availableProvidersIds.length === 0) {
|
|
1051
|
+
return this.config.providers;
|
|
1052
|
+
}
|
|
1053
|
+
return this.config.providers.filter((provider) => this.availableProvidersIds.includes(provider.info.dappId));
|
|
1022
1054
|
}
|
|
1023
1055
|
/**
|
|
1024
1056
|
* Get the available sources networks for the bridging.
|
|
@@ -1030,7 +1062,21 @@ var BridgingSdk = class {
|
|
|
1030
1062
|
* Get the available target networks for the bridging.
|
|
1031
1063
|
*/
|
|
1032
1064
|
async getTargetNetworks() {
|
|
1033
|
-
|
|
1065
|
+
const providers = this.getAvailableProviders();
|
|
1066
|
+
const results = await Promise.race([
|
|
1067
|
+
Promise.allSettled(providers.map((provider) => provider.getNetworks())),
|
|
1068
|
+
createBridgeRequestTimeoutPromise(
|
|
1069
|
+
DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT,
|
|
1070
|
+
`Multi-provider getTargetNetworks with ${providers.length}`
|
|
1071
|
+
)
|
|
1072
|
+
]);
|
|
1073
|
+
return results.reduce((acc, result) => {
|
|
1074
|
+
if (result.status === "fulfilled") {
|
|
1075
|
+
const networksToAdd = (result.value || []).filter((network) => !acc.includes(network));
|
|
1076
|
+
return acc.concat(networksToAdd);
|
|
1077
|
+
}
|
|
1078
|
+
return acc;
|
|
1079
|
+
}, []);
|
|
1034
1080
|
}
|
|
1035
1081
|
/**
|
|
1036
1082
|
* Get the available buy tokens for buying in a specific target chain
|
|
@@ -1038,22 +1084,32 @@ var BridgingSdk = class {
|
|
|
1038
1084
|
* @param params
|
|
1039
1085
|
*/
|
|
1040
1086
|
async getBuyTokens(params) {
|
|
1041
|
-
const
|
|
1042
|
-
const
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1087
|
+
const providers = this.getAvailableProviders();
|
|
1088
|
+
const results = await Promise.race([
|
|
1089
|
+
Promise.allSettled(providers.map((provider) => this.getBuyTokensFromProvider(provider, params))),
|
|
1090
|
+
createBridgeRequestTimeoutPromise(
|
|
1091
|
+
DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT,
|
|
1092
|
+
`Multi-provider getBuyTokens with ${providers.length}`
|
|
1093
|
+
)
|
|
1094
|
+
]);
|
|
1095
|
+
const isRouteAvailable = results.reduce((isRouteAvailable2, result) => {
|
|
1096
|
+
if (result.status === "fulfilled" && result.value.isRouteAvailable) {
|
|
1097
|
+
return true;
|
|
1098
|
+
}
|
|
1099
|
+
return isRouteAvailable2;
|
|
1100
|
+
}, false);
|
|
1101
|
+
const tokens = results.reduce((tokens2, result) => {
|
|
1102
|
+
if (result.status === "fulfilled" && result.value.tokens) {
|
|
1103
|
+
result.value.tokens.forEach((token) => {
|
|
1104
|
+
const addressLower = token.address.toLowerCase();
|
|
1105
|
+
if (!tokens2.get(addressLower)) {
|
|
1106
|
+
tokens2.set(addressLower, token);
|
|
1107
|
+
}
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1110
|
+
return tokens2;
|
|
1111
|
+
}, /* @__PURE__ */ new Map());
|
|
1112
|
+
return { isRouteAvailable, tokens: [...tokens.values()] };
|
|
1057
1113
|
}
|
|
1058
1114
|
/**
|
|
1059
1115
|
* Get quote details, including a callback function to post the order on-chain.
|
|
@@ -1076,7 +1132,8 @@ var BridgingSdk = class {
|
|
|
1076
1132
|
quoteBridgeRequest,
|
|
1077
1133
|
advancedSettings
|
|
1078
1134
|
},
|
|
1079
|
-
this.config
|
|
1135
|
+
this.config.tradingSdk,
|
|
1136
|
+
this.getAvailableProviders()
|
|
1080
1137
|
);
|
|
1081
1138
|
}
|
|
1082
1139
|
/**
|
|
@@ -1095,7 +1152,7 @@ var BridgingSdk = class {
|
|
|
1095
1152
|
* ```
|
|
1096
1153
|
*/
|
|
1097
1154
|
async getMultiQuotes(request) {
|
|
1098
|
-
return this.multiQuoteStrategy.execute(request, this.config);
|
|
1155
|
+
return this.multiQuoteStrategy.execute(request, this.config.tradingSdk, this.getAvailableProviders());
|
|
1099
1156
|
}
|
|
1100
1157
|
/**
|
|
1101
1158
|
* Get the best quote from multiple bridge providers with progressive updates.
|
|
@@ -1113,7 +1170,7 @@ var BridgingSdk = class {
|
|
|
1113
1170
|
* @throws Error if the request is for a single-chain swap (sellTokenChainId === buyTokenChainId)
|
|
1114
1171
|
*/
|
|
1115
1172
|
async getBestQuote(request) {
|
|
1116
|
-
return this.bestQuoteStrategy.execute(request, this.config);
|
|
1173
|
+
return this.bestQuoteStrategy.execute(request, this.config.tradingSdk, this.getAvailableProviders());
|
|
1117
1174
|
}
|
|
1118
1175
|
async getOrder(params) {
|
|
1119
1176
|
const { orderBookApi } = this.config;
|
|
@@ -1123,14 +1180,11 @@ var BridgingSdk = class {
|
|
|
1123
1180
|
orderId,
|
|
1124
1181
|
orderBookApi,
|
|
1125
1182
|
env,
|
|
1126
|
-
providers: this.
|
|
1183
|
+
providers: this.getAvailableProviders()
|
|
1127
1184
|
});
|
|
1128
1185
|
}
|
|
1129
|
-
async getOrderBridgingStatus(bridgingId, originChainId) {
|
|
1130
|
-
return this.provider.getStatus(bridgingId, originChainId);
|
|
1131
|
-
}
|
|
1132
1186
|
getProviderFromAppData(fullAppData) {
|
|
1133
|
-
return findBridgeProviderFromHook(fullAppData, this.
|
|
1187
|
+
return findBridgeProviderFromHook(fullAppData, this.getAvailableProviders());
|
|
1134
1188
|
}
|
|
1135
1189
|
/**
|
|
1136
1190
|
* Clear all caches. Useful for testing and debugging.
|
|
@@ -1156,7 +1210,25 @@ var BridgingSdk = class {
|
|
|
1156
1210
|
};
|
|
1157
1211
|
}
|
|
1158
1212
|
getProviderByDappId(dappId) {
|
|
1159
|
-
return this.
|
|
1213
|
+
return this.getAvailableProviders().find((provider) => provider.info.dappId === dappId);
|
|
1214
|
+
}
|
|
1215
|
+
async getBuyTokensFromProvider(provider, params) {
|
|
1216
|
+
const providerId = provider.info.dappId;
|
|
1217
|
+
const cacheKey = getCacheKey({
|
|
1218
|
+
id: providerId,
|
|
1219
|
+
buyChainId: params.buyChainId.toString(),
|
|
1220
|
+
sellChainId: params.sellChainId?.toString(),
|
|
1221
|
+
tokenAddress: params.sellTokenAddress
|
|
1222
|
+
});
|
|
1223
|
+
const cached = this.cacheConfig.enabled && this.buyTokensCache.get(cacheKey);
|
|
1224
|
+
if (cached) {
|
|
1225
|
+
return cached;
|
|
1226
|
+
}
|
|
1227
|
+
const result = await provider.getBuyTokens(params);
|
|
1228
|
+
if (this.cacheConfig.enabled) {
|
|
1229
|
+
this.buyTokensCache.set(cacheKey, result);
|
|
1230
|
+
}
|
|
1231
|
+
return result;
|
|
1160
1232
|
}
|
|
1161
1233
|
};
|
|
1162
1234
|
|
|
@@ -1274,7 +1346,7 @@ var ACROSS_DEPOSIT_EVENT_INTERFACE = () => {
|
|
|
1274
1346
|
};
|
|
1275
1347
|
var COW_TRADE_EVENT_INTERFACE = () => {
|
|
1276
1348
|
return (0, import_sdk_common7.getGlobalAdapter)().utils.createInterface([
|
|
1277
|
-
"event Trade(address owner, address sellToken, address buyToken, uint256 sellAmount, uint256 buyAmount, uint256 feeAmount, bytes orderUid)"
|
|
1349
|
+
"event Trade(address indexed owner, address sellToken, address buyToken, uint256 sellAmount, uint256 buyAmount, uint256 feeAmount, bytes orderUid)"
|
|
1278
1350
|
]);
|
|
1279
1351
|
};
|
|
1280
1352
|
|
|
@@ -3398,8 +3470,9 @@ var import_sdk_order_book4 = require("@cowprotocol/sdk-order-book");
|
|
|
3398
3470
|
var ACROSS_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/across`;
|
|
3399
3471
|
var ACROSS_SUPPORTED_NETWORKS = [import_sdk_config5.mainnet, import_sdk_config5.polygon, import_sdk_config5.arbitrumOne, import_sdk_config5.base, import_sdk_config5.optimism];
|
|
3400
3472
|
var SLIPPAGE_TOLERANCE_BPS = 0;
|
|
3473
|
+
var providerType = "HookBridgeProvider";
|
|
3401
3474
|
var AcrossBridgeProvider = class {
|
|
3402
|
-
type =
|
|
3475
|
+
type = providerType;
|
|
3403
3476
|
api;
|
|
3404
3477
|
cowShedSdk;
|
|
3405
3478
|
supportedTokens = null;
|
|
@@ -3415,7 +3488,8 @@ var AcrossBridgeProvider = class {
|
|
|
3415
3488
|
name: "Across",
|
|
3416
3489
|
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/across/across-logo.png`,
|
|
3417
3490
|
dappId: ACROSS_HOOK_DAPP_ID,
|
|
3418
|
-
website: "https://across.to"
|
|
3491
|
+
website: "https://across.to",
|
|
3492
|
+
type: providerType
|
|
3419
3493
|
};
|
|
3420
3494
|
async getNetworks() {
|
|
3421
3495
|
return ACROSS_SUPPORTED_NETWORKS;
|
|
@@ -3500,7 +3574,8 @@ var AcrossBridgeProvider = class {
|
|
|
3500
3574
|
async decodeBridgeHook(_hook) {
|
|
3501
3575
|
throw new Error("Not implemented");
|
|
3502
3576
|
}
|
|
3503
|
-
async getBridgingParams(chainId,
|
|
3577
|
+
async getBridgingParams(chainId, order, txHash) {
|
|
3578
|
+
const orderUid = order.uid;
|
|
3504
3579
|
const adapter = (0, import_sdk_common12.getGlobalAdapter)();
|
|
3505
3580
|
const txReceipt = await adapter.getTransactionReceipt(txHash);
|
|
3506
3581
|
if (!txReceipt)
|
|
@@ -3688,7 +3763,7 @@ function toAmountsAndCosts2(request, slippageBps, bungeeQuote) {
|
|
|
3688
3763
|
const buyAmountBeforeFee = (0, import_sdk_order_book5.getBigNumber)(buyAmountFromBungeeQuote, buyTokenDecimals).big;
|
|
3689
3764
|
const buyAmountAfterFee = buyAmountBeforeFee;
|
|
3690
3765
|
const feeSellToken = bungeeQuote.route.routeDetails.routeFee.amount;
|
|
3691
|
-
const feeBuyToken =
|
|
3766
|
+
const feeBuyToken = sellAmountBeforeFee > 0n ? BigInt(feeSellToken) * buyAmountBeforeFee / sellAmountBeforeFee : 0n;
|
|
3692
3767
|
const buyAmountAfterSlippage = applyBps2(buyAmountAfterFee, slippageBps);
|
|
3693
3768
|
const bridgeFeeBps = calculateFeeBps(BigInt(bungeeQuote.route.routeDetails.routeFee.amount), BigInt(amount));
|
|
3694
3769
|
return {
|
|
@@ -3708,7 +3783,7 @@ function toAmountsAndCosts2(request, slippageBps, bungeeQuote) {
|
|
|
3708
3783
|
bridgingFee: {
|
|
3709
3784
|
feeBps: bridgeFeeBps,
|
|
3710
3785
|
amountInSellCurrency: BigInt(feeSellToken),
|
|
3711
|
-
amountInBuyCurrency:
|
|
3786
|
+
amountInBuyCurrency: feeBuyToken
|
|
3712
3787
|
}
|
|
3713
3788
|
},
|
|
3714
3789
|
slippageBps
|
|
@@ -4557,6 +4632,7 @@ var import_sdk_common15 = require("@cowprotocol/sdk-common");
|
|
|
4557
4632
|
var BUNGEE_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX2}/bungee`;
|
|
4558
4633
|
var BUNGEE_SUPPORTED_NETWORKS = [import_sdk_config8.mainnet, import_sdk_config8.polygon, import_sdk_config8.arbitrumOne, import_sdk_config8.base, import_sdk_config8.optimism, import_sdk_config8.avalanche, import_sdk_config8.gnosisChain];
|
|
4559
4634
|
var SLIPPAGE_TOLERANCE_BPS2 = 0;
|
|
4635
|
+
var providerType2 = "HookBridgeProvider";
|
|
4560
4636
|
var BungeeBridgeProvider = class {
|
|
4561
4637
|
constructor(options, _adapter) {
|
|
4562
4638
|
this.options = options;
|
|
@@ -4567,14 +4643,15 @@ var BungeeBridgeProvider = class {
|
|
|
4567
4643
|
this.api = new BungeeApi(options.apiOptions);
|
|
4568
4644
|
this.cowShedSdk = new import_sdk_cow_shed2.CowShedSdk(adapter, options.cowShedOptions?.factoryOptions);
|
|
4569
4645
|
}
|
|
4570
|
-
type =
|
|
4646
|
+
type = providerType2;
|
|
4571
4647
|
api;
|
|
4572
4648
|
cowShedSdk;
|
|
4573
4649
|
info = {
|
|
4574
4650
|
name: "Bungee",
|
|
4575
4651
|
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/bungee/bungee-logo.png`,
|
|
4576
4652
|
dappId: BUNGEE_HOOK_DAPP_ID,
|
|
4577
|
-
website: "https://www.bungee.exchange"
|
|
4653
|
+
website: "https://www.bungee.exchange",
|
|
4654
|
+
type: providerType2
|
|
4578
4655
|
};
|
|
4579
4656
|
async getNetworks() {
|
|
4580
4657
|
return BUNGEE_SUPPORTED_NETWORKS;
|
|
@@ -4668,7 +4745,8 @@ var BungeeBridgeProvider = class {
|
|
|
4668
4745
|
recipient: cowShedAccount
|
|
4669
4746
|
};
|
|
4670
4747
|
}
|
|
4671
|
-
async getBridgingParams(_chainId,
|
|
4748
|
+
async getBridgingParams(_chainId, order, _txHash) {
|
|
4749
|
+
const orderId = order.uid;
|
|
4672
4750
|
const events = await this.api.getEvents({ orderId });
|
|
4673
4751
|
const event = events?.[0];
|
|
4674
4752
|
if (!event)
|
|
@@ -4710,6 +4788,407 @@ var BungeeBridgeProvider = class {
|
|
|
4710
4788
|
return sellTokenChainId === import_sdk_config8.SupportedChainId.MAINNET && buyTokenChainId === import_sdk_config8.SupportedChainId.GNOSIS_CHAIN;
|
|
4711
4789
|
}
|
|
4712
4790
|
};
|
|
4791
|
+
|
|
4792
|
+
// src/providers/near-intents/NearIntentsBridgeProvider.ts
|
|
4793
|
+
var import_sdk_common17 = require("@cowprotocol/sdk-common");
|
|
4794
|
+
var import_sdk_config11 = require("@cowprotocol/sdk-config");
|
|
4795
|
+
var import_sdk_cow_shed3 = require("@cowprotocol/sdk-cow-shed");
|
|
4796
|
+
var import_sdk_order_book7 = require("@cowprotocol/sdk-order-book");
|
|
4797
|
+
var import_one_click_sdk_typescript2 = require("@defuse-protocol/one-click-sdk-typescript");
|
|
4798
|
+
|
|
4799
|
+
// src/providers/near-intents/NearIntentsApi.ts
|
|
4800
|
+
var import_one_click_sdk_typescript = require("@defuse-protocol/one-click-sdk-typescript");
|
|
4801
|
+
var NearIntentsApi = class {
|
|
4802
|
+
cachedTokens = [];
|
|
4803
|
+
async getTokens() {
|
|
4804
|
+
if (this.cachedTokens.length === 0) {
|
|
4805
|
+
const response = await import_one_click_sdk_typescript.OneClickService.getTokens();
|
|
4806
|
+
this.cachedTokens = response;
|
|
4807
|
+
}
|
|
4808
|
+
return this.cachedTokens;
|
|
4809
|
+
}
|
|
4810
|
+
async getQuote(request) {
|
|
4811
|
+
return await import_one_click_sdk_typescript.OneClickService.getQuote(request);
|
|
4812
|
+
}
|
|
4813
|
+
async getStatus(depositAddress) {
|
|
4814
|
+
return await import_one_click_sdk_typescript.OneClickService.getExecutionStatus(depositAddress);
|
|
4815
|
+
}
|
|
4816
|
+
async getAttestation(request) {
|
|
4817
|
+
const response = await fetch(`${import_one_click_sdk_typescript.OpenAPI.BASE}/v0/attestation`, {
|
|
4818
|
+
method: "POST",
|
|
4819
|
+
headers: {
|
|
4820
|
+
"Content-Type": "application/json"
|
|
4821
|
+
},
|
|
4822
|
+
body: JSON.stringify(request)
|
|
4823
|
+
});
|
|
4824
|
+
if (!response.ok) {
|
|
4825
|
+
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
4826
|
+
}
|
|
4827
|
+
return await response.json();
|
|
4828
|
+
}
|
|
4829
|
+
};
|
|
4830
|
+
|
|
4831
|
+
// src/providers/near-intents/const/index.ts
|
|
4832
|
+
var import_sdk_config9 = require("@cowprotocol/sdk-config");
|
|
4833
|
+
var NEAR_INTENTS_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/near-intents`;
|
|
4834
|
+
var NEAR_INTENTS_SUPPORTED_NETWORKS = [
|
|
4835
|
+
import_sdk_config9.arbitrumOne,
|
|
4836
|
+
import_sdk_config9.avalanche,
|
|
4837
|
+
import_sdk_config9.base,
|
|
4838
|
+
import_sdk_config9.bnb,
|
|
4839
|
+
import_sdk_config9.gnosisChain,
|
|
4840
|
+
import_sdk_config9.mainnet,
|
|
4841
|
+
import_sdk_config9.optimism,
|
|
4842
|
+
import_sdk_config9.polygon
|
|
4843
|
+
];
|
|
4844
|
+
var NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS = {
|
|
4845
|
+
arb: import_sdk_config9.arbitrumOne.id,
|
|
4846
|
+
avax: import_sdk_config9.avalanche.id,
|
|
4847
|
+
base: import_sdk_config9.base.id,
|
|
4848
|
+
bsc: import_sdk_config9.bnb.id,
|
|
4849
|
+
eth: import_sdk_config9.mainnet.id,
|
|
4850
|
+
gnosis: import_sdk_config9.gnosisChain.id,
|
|
4851
|
+
op: import_sdk_config9.optimism.id,
|
|
4852
|
+
pol: import_sdk_config9.polygon.id
|
|
4853
|
+
};
|
|
4854
|
+
var NEAR_INTENTS_STATUS_TO_COW_STATUS = {
|
|
4855
|
+
KNOWN_DEPOSIT_TX: "in_progress" /* IN_PROGRESS */,
|
|
4856
|
+
PENDING_DEPOSIT: "in_progress" /* IN_PROGRESS */,
|
|
4857
|
+
INCOMPLETE_DEPOSIT: "unknown" /* UNKNOWN */,
|
|
4858
|
+
PROCESSING: "in_progress" /* IN_PROGRESS */,
|
|
4859
|
+
SUCCESS: "executed" /* EXECUTED */,
|
|
4860
|
+
REFUNDED: "refund" /* REFUND */,
|
|
4861
|
+
FAILED: "unknown" /* UNKNOWN */
|
|
4862
|
+
};
|
|
4863
|
+
var ATTESTATION_PREFIX_CONST = "0x0a773570";
|
|
4864
|
+
var ATTESTION_VERSION_BYTE = "0x00";
|
|
4865
|
+
var ATTESTATOR_ADDRESS = "0x0073DD100b51C555E41B2a452E5933ef76F42790";
|
|
4866
|
+
|
|
4867
|
+
// src/providers/near-intents/util.ts
|
|
4868
|
+
var import_json_stable_stringify = __toESM(require("json-stable-stringify"));
|
|
4869
|
+
var import_sdk_common16 = require("@cowprotocol/sdk-common");
|
|
4870
|
+
var import_sdk_config10 = require("@cowprotocol/sdk-config");
|
|
4871
|
+
var calculateDeadline = (seconds) => {
|
|
4872
|
+
const secs = Number(seconds);
|
|
4873
|
+
if (!Number.isFinite(secs)) {
|
|
4874
|
+
throw new Error(`Invalid seconds value: ${seconds}`);
|
|
4875
|
+
}
|
|
4876
|
+
const d = new Date(Date.now() + secs * 1e3);
|
|
4877
|
+
return d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
4878
|
+
};
|
|
4879
|
+
var adaptToken = (token) => {
|
|
4880
|
+
const chainId = NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS[token.blockchain];
|
|
4881
|
+
if (!chainId)
|
|
4882
|
+
return null;
|
|
4883
|
+
const tokenAddress = token.contractAddress || import_sdk_config10.ETH_ADDRESS;
|
|
4884
|
+
if (!tokenAddress)
|
|
4885
|
+
return null;
|
|
4886
|
+
return {
|
|
4887
|
+
chainId,
|
|
4888
|
+
decimals: token.decimals,
|
|
4889
|
+
address: tokenAddress,
|
|
4890
|
+
name: token.symbol,
|
|
4891
|
+
// TODO: how to handle? v0/tokens doesn't return the token name
|
|
4892
|
+
symbol: token.symbol
|
|
4893
|
+
};
|
|
4894
|
+
};
|
|
4895
|
+
var adaptTokens = (tokens) => tokens.reduce((acc, token) => {
|
|
4896
|
+
const adaptedToken = adaptToken(token);
|
|
4897
|
+
if (!adaptedToken)
|
|
4898
|
+
return acc;
|
|
4899
|
+
acc.push(adaptedToken);
|
|
4900
|
+
return acc;
|
|
4901
|
+
}, []);
|
|
4902
|
+
var getTokenByAddressAndChainId = (tokens, targetTokenAddress, targetTokenChainId) => {
|
|
4903
|
+
return tokens.find((token) => {
|
|
4904
|
+
const chainId = NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS[token.blockchain];
|
|
4905
|
+
if (!chainId)
|
|
4906
|
+
return false;
|
|
4907
|
+
if (targetTokenAddress.toLowerCase() === import_sdk_config10.ETH_ADDRESS.toLowerCase()) {
|
|
4908
|
+
return chainId === targetTokenChainId && !token.contractAddress;
|
|
4909
|
+
}
|
|
4910
|
+
const tokenAddress = token.contractAddress || import_sdk_config10.ETH_ADDRESS;
|
|
4911
|
+
return tokenAddress?.toLowerCase() === targetTokenAddress.toLowerCase() && chainId === targetTokenChainId;
|
|
4912
|
+
});
|
|
4913
|
+
};
|
|
4914
|
+
var hashQuote = ({
|
|
4915
|
+
quote,
|
|
4916
|
+
quoteRequest,
|
|
4917
|
+
timestamp
|
|
4918
|
+
}) => {
|
|
4919
|
+
const adapter = (0, import_sdk_common16.getGlobalAdapter)();
|
|
4920
|
+
const data = (0, import_json_stable_stringify.default)({
|
|
4921
|
+
dry: false,
|
|
4922
|
+
swapType: quoteRequest.swapType,
|
|
4923
|
+
slippageTolerance: quoteRequest.slippageTolerance,
|
|
4924
|
+
originAsset: quoteRequest.originAsset,
|
|
4925
|
+
depositType: quoteRequest.depositType,
|
|
4926
|
+
destinationAsset: quoteRequest.destinationAsset,
|
|
4927
|
+
amount: quoteRequest.amount,
|
|
4928
|
+
refundTo: quoteRequest.refundTo,
|
|
4929
|
+
refundType: quoteRequest.refundType,
|
|
4930
|
+
recipient: quoteRequest.recipient,
|
|
4931
|
+
recipientType: quoteRequest.recipientType,
|
|
4932
|
+
deadline: quoteRequest.deadline,
|
|
4933
|
+
quoteWaitingTimeMs: !!quoteRequest.quoteWaitingTimeMs ? quoteRequest.quoteWaitingTimeMs : void 0,
|
|
4934
|
+
referral: !!quoteRequest.referral ? quoteRequest.referral : void 0,
|
|
4935
|
+
virtualChainRecipient: !!quoteRequest.virtualChainRecipient ? quoteRequest.virtualChainRecipient : void 0,
|
|
4936
|
+
virtualChainRefundRecipient: !!quoteRequest.virtualChainRefundRecipient ? quoteRequest.virtualChainRefundRecipient : void 0,
|
|
4937
|
+
customRecipientMsg: void 0,
|
|
4938
|
+
sessionId: void 0,
|
|
4939
|
+
connectedWallets: void 0,
|
|
4940
|
+
depositMode: quoteRequest.depositMode,
|
|
4941
|
+
amountIn: quote.amountIn,
|
|
4942
|
+
amountInFormatted: quote.amountInFormatted,
|
|
4943
|
+
amountInUsd: quote.amountInUsd,
|
|
4944
|
+
minAmountIn: quote.minAmountIn,
|
|
4945
|
+
amountOut: quote.amountOut,
|
|
4946
|
+
amountOutFormatted: quote.amountOutFormatted,
|
|
4947
|
+
amountOutUsd: quote.amountOutUsd,
|
|
4948
|
+
minAmountOut: quote.minAmountOut,
|
|
4949
|
+
timestamp
|
|
4950
|
+
});
|
|
4951
|
+
if (!data) {
|
|
4952
|
+
throw new Error("Failed to serialize quote data: quote or quoteRequest may be undefined or invalid");
|
|
4953
|
+
}
|
|
4954
|
+
return adapter.utils.sha256(adapter.utils.toUtf8Bytes(data));
|
|
4955
|
+
};
|
|
4956
|
+
|
|
4957
|
+
// src/providers/near-intents/NearIntentsBridgeProvider.ts
|
|
4958
|
+
var NEAR_INTENTS_HOOK_DAPP_ID2 = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/near-intents`;
|
|
4959
|
+
var REFERRAL = "cow";
|
|
4960
|
+
var providerType3 = "ReceiverAccountBridgeProvider";
|
|
4961
|
+
var NearIntentsBridgeProvider = class {
|
|
4962
|
+
type = providerType3;
|
|
4963
|
+
api;
|
|
4964
|
+
cowShedSdk;
|
|
4965
|
+
info = {
|
|
4966
|
+
name: "Near Intents",
|
|
4967
|
+
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/near-intents/near-intents-logo.png`,
|
|
4968
|
+
dappId: NEAR_INTENTS_HOOK_DAPP_ID2,
|
|
4969
|
+
website: "https://www.near.org/intents",
|
|
4970
|
+
type: providerType3
|
|
4971
|
+
};
|
|
4972
|
+
constructor(options, _adapter) {
|
|
4973
|
+
const adapter = _adapter || options?.cowShedOptions?.adapter;
|
|
4974
|
+
if (adapter) {
|
|
4975
|
+
(0, import_sdk_common17.setGlobalAdapter)(adapter);
|
|
4976
|
+
}
|
|
4977
|
+
this.api = new NearIntentsApi();
|
|
4978
|
+
this.cowShedSdk = new import_sdk_cow_shed3.CowShedSdk(adapter, options?.cowShedOptions?.factoryOptions);
|
|
4979
|
+
}
|
|
4980
|
+
async getNetworks() {
|
|
4981
|
+
return NEAR_INTENTS_SUPPORTED_NETWORKS;
|
|
4982
|
+
}
|
|
4983
|
+
async getBuyTokens(params) {
|
|
4984
|
+
const tokens = adaptTokens(await this.api.getTokens());
|
|
4985
|
+
const filteredTokens = tokens.filter((token) => token.chainId === params.buyChainId);
|
|
4986
|
+
return {
|
|
4987
|
+
tokens: filteredTokens,
|
|
4988
|
+
isRouteAvailable: filteredTokens.length > 0
|
|
4989
|
+
};
|
|
4990
|
+
}
|
|
4991
|
+
async getIntermediateTokens(request) {
|
|
4992
|
+
if (request.kind !== import_sdk_order_book7.OrderKind.SELL) {
|
|
4993
|
+
throw new BridgeProviderQuoteError("ONLY_SELL_ORDER_SUPPORTED" /* ONLY_SELL_ORDER_SUPPORTED */, { kind: request.kind });
|
|
4994
|
+
}
|
|
4995
|
+
const { sellTokenChainId, buyTokenChainId, buyTokenAddress, sellTokenAddress } = request;
|
|
4996
|
+
const tokens = adaptTokens(await this.api.getTokens());
|
|
4997
|
+
const { sourceTokens, targetTokens } = tokens.reduce(
|
|
4998
|
+
(acc, token) => {
|
|
4999
|
+
if (token.chainId === sellTokenChainId) {
|
|
5000
|
+
acc.sourceTokens.set(token.address.toLowerCase(), token);
|
|
5001
|
+
}
|
|
5002
|
+
if (token.chainId === buyTokenChainId) {
|
|
5003
|
+
acc.targetTokens.set(token.address.toLowerCase(), token);
|
|
5004
|
+
}
|
|
5005
|
+
return acc;
|
|
5006
|
+
},
|
|
5007
|
+
{
|
|
5008
|
+
sourceTokens: /* @__PURE__ */ new Map(),
|
|
5009
|
+
targetTokens: /* @__PURE__ */ new Map()
|
|
5010
|
+
}
|
|
5011
|
+
);
|
|
5012
|
+
const targetToken = targetTokens.get(buyTokenAddress.toLowerCase());
|
|
5013
|
+
if (!targetToken)
|
|
5014
|
+
return [];
|
|
5015
|
+
return Array.from(sourceTokens.values()).filter((token) => {
|
|
5016
|
+
return token.address?.toLowerCase() !== sellTokenAddress.toLowerCase();
|
|
5017
|
+
});
|
|
5018
|
+
}
|
|
5019
|
+
async getQuote(request) {
|
|
5020
|
+
const {
|
|
5021
|
+
sellTokenAddress,
|
|
5022
|
+
sellTokenChainId,
|
|
5023
|
+
buyTokenAddress,
|
|
5024
|
+
buyTokenChainId,
|
|
5025
|
+
account,
|
|
5026
|
+
amount,
|
|
5027
|
+
receiver,
|
|
5028
|
+
validFor,
|
|
5029
|
+
owner
|
|
5030
|
+
} = request;
|
|
5031
|
+
const tokens = await this.api.getTokens();
|
|
5032
|
+
const sellToken = getTokenByAddressAndChainId(tokens, sellTokenAddress, sellTokenChainId);
|
|
5033
|
+
const buyToken = getTokenByAddressAndChainId(tokens, buyTokenAddress, buyTokenChainId);
|
|
5034
|
+
if (!sellToken || !buyToken)
|
|
5035
|
+
throw new BridgeProviderQuoteError("NO_ROUTES" /* NO_ROUTES */);
|
|
5036
|
+
const quoteResponse = await this.api.getQuote({
|
|
5037
|
+
dry: false,
|
|
5038
|
+
swapType: import_one_click_sdk_typescript2.QuoteRequest.swapType.EXACT_INPUT,
|
|
5039
|
+
slippageTolerance: request.slippageBps ?? 100,
|
|
5040
|
+
originAsset: sellToken.assetId,
|
|
5041
|
+
depositType: import_one_click_sdk_typescript2.QuoteRequest.depositType.ORIGIN_CHAIN,
|
|
5042
|
+
destinationAsset: buyToken.assetId,
|
|
5043
|
+
amount: amount.toString(),
|
|
5044
|
+
refundTo: owner || account,
|
|
5045
|
+
refundType: import_one_click_sdk_typescript2.QuoteRequest.refundType.ORIGIN_CHAIN,
|
|
5046
|
+
recipient: receiver || account,
|
|
5047
|
+
recipientType: import_one_click_sdk_typescript2.QuoteRequest.recipientType.DESTINATION_CHAIN,
|
|
5048
|
+
deadline: calculateDeadline(validFor || 3600),
|
|
5049
|
+
referral: REFERRAL
|
|
5050
|
+
});
|
|
5051
|
+
const recoveredDepositAddress = await this.recoverDepositAddress(quoteResponse);
|
|
5052
|
+
if (recoveredDepositAddress?.toLowerCase() !== ATTESTATOR_ADDRESS.toLowerCase()) {
|
|
5053
|
+
throw new BridgeProviderQuoteError("QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS" /* QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS */);
|
|
5054
|
+
}
|
|
5055
|
+
const { quote, timestamp: isoDate } = quoteResponse;
|
|
5056
|
+
const payoutRatio = Number(quote.amountOutUsd) / Number(quote.amountInUsd);
|
|
5057
|
+
const slippage = 1 - payoutRatio;
|
|
5058
|
+
const slippageBps = Math.trunc(slippage * 1e4);
|
|
5059
|
+
const feeAmountInBuyCurrency = Math.trunc(Number(quote.amountIn) * slippage);
|
|
5060
|
+
const feeAmountInSellCurrency = Math.trunc(Number(quote.amountOut) * slippage);
|
|
5061
|
+
const bridgeFee = Math.trunc(Number(quote.amountIn) * slippage);
|
|
5062
|
+
return {
|
|
5063
|
+
isSell: request.kind === import_sdk_order_book7.OrderKind.SELL,
|
|
5064
|
+
depositAddress: quote.depositAddress,
|
|
5065
|
+
quoteTimestamp: new Date(isoDate).getTime(),
|
|
5066
|
+
expectedFillTimeSeconds: quote.timeEstimate,
|
|
5067
|
+
limits: {
|
|
5068
|
+
minDeposit: BigInt(quote.minAmountIn),
|
|
5069
|
+
maxDeposit: BigInt(quote.amountIn)
|
|
5070
|
+
},
|
|
5071
|
+
fees: {
|
|
5072
|
+
bridgeFee: BigInt(bridgeFee),
|
|
5073
|
+
// The bridge fee is already included in `minAmountOut`. This means `bridgeFee` represents the maximum possible fee (worst case), but the actual fee may be lower.
|
|
5074
|
+
destinationGasFee: BigInt(0)
|
|
5075
|
+
},
|
|
5076
|
+
amountsAndCosts: {
|
|
5077
|
+
beforeFee: {
|
|
5078
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5079
|
+
buyAmount: BigInt(quote.amountOut)
|
|
5080
|
+
},
|
|
5081
|
+
afterFee: {
|
|
5082
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5083
|
+
buyAmount: BigInt(quote.minAmountOut)
|
|
5084
|
+
},
|
|
5085
|
+
afterSlippage: {
|
|
5086
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5087
|
+
buyAmount: BigInt(quote.minAmountOut)
|
|
5088
|
+
},
|
|
5089
|
+
slippageBps,
|
|
5090
|
+
costs: {
|
|
5091
|
+
bridgingFee: {
|
|
5092
|
+
feeBps: slippageBps,
|
|
5093
|
+
amountInSellCurrency: BigInt(feeAmountInSellCurrency),
|
|
5094
|
+
amountInBuyCurrency: BigInt(feeAmountInBuyCurrency)
|
|
5095
|
+
}
|
|
5096
|
+
}
|
|
5097
|
+
}
|
|
5098
|
+
};
|
|
5099
|
+
}
|
|
5100
|
+
async getBridgeReceiverOverride(_request, quote) {
|
|
5101
|
+
return quote.depositAddress;
|
|
5102
|
+
}
|
|
5103
|
+
async getBridgingParams(_chainId, order, _txHash) {
|
|
5104
|
+
const depositAddress = order.receiver;
|
|
5105
|
+
if (!depositAddress)
|
|
5106
|
+
return null;
|
|
5107
|
+
const [tokens, status] = await Promise.all([this.api.getTokens(), this.api.getStatus(depositAddress)]);
|
|
5108
|
+
const qr = status.quoteResponse?.quoteRequest;
|
|
5109
|
+
const swapDetails = status.swapDetails;
|
|
5110
|
+
const quote = status.quoteResponse?.quote;
|
|
5111
|
+
const timestampMs = Date.parse(status.quoteResponse?.timestamp ?? "");
|
|
5112
|
+
if (!qr || !quote || Number.isNaN(timestampMs)) {
|
|
5113
|
+
throw new Error("Malformed quote response from NEAR Intents");
|
|
5114
|
+
}
|
|
5115
|
+
const quoteTimestamp = Math.floor(timestampMs / 1e3);
|
|
5116
|
+
const inputToken = tokens.find((t) => t.assetId === qr.originAsset);
|
|
5117
|
+
const outputToken = tokens.find((t) => t.assetId === qr.destinationAsset);
|
|
5118
|
+
if (!inputToken || !outputToken)
|
|
5119
|
+
throw new Error("Token not supported");
|
|
5120
|
+
const adaptedInput = adaptToken(inputToken);
|
|
5121
|
+
const adaptedOutput = adaptToken(outputToken);
|
|
5122
|
+
if (!adaptedInput?.chainId || !adaptedOutput?.chainId) {
|
|
5123
|
+
throw new Error("Token not supported");
|
|
5124
|
+
}
|
|
5125
|
+
return {
|
|
5126
|
+
status: {
|
|
5127
|
+
fillTimeInSeconds: quote.timeEstimate,
|
|
5128
|
+
status: NEAR_INTENTS_STATUS_TO_COW_STATUS[status.status] ?? "unknown" /* UNKNOWN */,
|
|
5129
|
+
fillTxHash: status.swapDetails?.destinationChainTxHashes?.[0]?.hash
|
|
5130
|
+
},
|
|
5131
|
+
params: {
|
|
5132
|
+
inputTokenAddress: inputToken.contractAddress ?? import_sdk_config11.ETH_ADDRESS,
|
|
5133
|
+
outputTokenAddress: outputToken.contractAddress ?? import_sdk_config11.ETH_ADDRESS,
|
|
5134
|
+
inputAmount: BigInt(quote.amountIn),
|
|
5135
|
+
outputAmount: swapDetails.amountOut ? BigInt(swapDetails.amountOut) : BigInt(quote.amountOut),
|
|
5136
|
+
owner: order.owner,
|
|
5137
|
+
quoteTimestamp,
|
|
5138
|
+
fillDeadline: quoteTimestamp + quote.timeEstimate,
|
|
5139
|
+
recipient: qr.recipient,
|
|
5140
|
+
sourceChainId: adaptedInput.chainId,
|
|
5141
|
+
destinationChainId: adaptedOutput.chainId,
|
|
5142
|
+
bridgingId: depositAddress
|
|
5143
|
+
// NEAR Intents deposit address
|
|
5144
|
+
}
|
|
5145
|
+
};
|
|
5146
|
+
}
|
|
5147
|
+
getExplorerUrl(bridgingId) {
|
|
5148
|
+
return `https://explorer.near-intents.org/transactions/${bridgingId}`;
|
|
5149
|
+
}
|
|
5150
|
+
async getStatus(bridgingId, _originChainId) {
|
|
5151
|
+
try {
|
|
5152
|
+
const statusResponse = await this.api.getStatus(bridgingId);
|
|
5153
|
+
return {
|
|
5154
|
+
status: NEAR_INTENTS_STATUS_TO_COW_STATUS[statusResponse.status] || "unknown" /* UNKNOWN */,
|
|
5155
|
+
depositTxHash: statusResponse.swapDetails?.originChainTxHashes[0]?.hash,
|
|
5156
|
+
fillTxHash: statusResponse.swapDetails?.destinationChainTxHashes[0]?.hash
|
|
5157
|
+
};
|
|
5158
|
+
} catch {
|
|
5159
|
+
return {
|
|
5160
|
+
status: "unknown" /* UNKNOWN */
|
|
5161
|
+
};
|
|
5162
|
+
}
|
|
5163
|
+
}
|
|
5164
|
+
getCancelBridgingTx(_bridgingId) {
|
|
5165
|
+
throw new Error("Not implemented");
|
|
5166
|
+
}
|
|
5167
|
+
getRefundBridgingTx(_bridgingId) {
|
|
5168
|
+
throw new Error("Not implemented");
|
|
5169
|
+
}
|
|
5170
|
+
async recoverDepositAddress({ quote, quoteRequest, timestamp }) {
|
|
5171
|
+
try {
|
|
5172
|
+
if (!quote?.depositAddress)
|
|
5173
|
+
return null;
|
|
5174
|
+
const utils = (0, import_sdk_common17.getGlobalAdapter)().utils;
|
|
5175
|
+
const quoteHash = hashQuote({ quote, quoteRequest, timestamp });
|
|
5176
|
+
const depositAddr = utils.getChecksumAddress(quote.depositAddress);
|
|
5177
|
+
const { signature } = await this.api.getAttestation({
|
|
5178
|
+
quoteHash,
|
|
5179
|
+
depositAddress: depositAddr
|
|
5180
|
+
});
|
|
5181
|
+
if (!signature || !utils.isHexString(signature))
|
|
5182
|
+
return null;
|
|
5183
|
+
const payload = utils.hexConcat([depositAddr, quoteHash]);
|
|
5184
|
+
const messageBytes = utils.hexConcat([ATTESTATION_PREFIX_CONST, ATTESTION_VERSION_BYTE, payload]);
|
|
5185
|
+
const hash = utils.keccak256(messageBytes);
|
|
5186
|
+
return utils.recoverAddress(hash, signature);
|
|
5187
|
+
} catch {
|
|
5188
|
+
return null;
|
|
5189
|
+
}
|
|
5190
|
+
}
|
|
5191
|
+
};
|
|
4713
5192
|
// Annotate the CommonJS export names for ESM import in node:
|
|
4714
5193
|
0 && (module.exports = {
|
|
4715
5194
|
AcrossBridgeProvider,
|
|
@@ -4725,6 +5204,7 @@ var BungeeBridgeProvider = class {
|
|
|
4725
5204
|
DEFAULT_EXTRA_GAS_PROXY_CREATION,
|
|
4726
5205
|
DEFAULT_GAS_COST_FOR_HOOK_ESTIMATION,
|
|
4727
5206
|
HOOK_DAPP_BRIDGE_PROVIDER_PREFIX,
|
|
5207
|
+
NearIntentsBridgeProvider,
|
|
4728
5208
|
RAW_PROVIDERS_FILES_PATH,
|
|
4729
5209
|
assertIsBridgeQuoteAndPost,
|
|
4730
5210
|
assertIsQuoteAndPost,
|