@cowprotocol/sdk-bridging 0.6.1 → 0.8.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 +75 -13
- package/dist/index.d.ts +75 -13
- package/dist/index.js +587 -80
- package/dist/index.mjs +635 -139
- package/package.json +20 -18
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: {
|
|
@@ -479,6 +507,11 @@ async function getQuoteWithReceiverAccountBridge(provider, params) {
|
|
|
479
507
|
});
|
|
480
508
|
(0, import_sdk_common4.log)(`Bridge receiver override: ${bridgeReceiverOverride}`);
|
|
481
509
|
swapResult.tradeParameters.receiver = bridgeReceiverOverride;
|
|
510
|
+
swapResult.appDataInfo = await (0, import_sdk_trading.mergeAppDataDoc)(swapResult.appDataInfo.doc, {
|
|
511
|
+
metadata: {
|
|
512
|
+
bridging: overrideAppDataWithBridgingQuoteDetails(swapResult.appDataInfo.doc.metadata.bridging, bridgeResult)
|
|
513
|
+
}
|
|
514
|
+
});
|
|
482
515
|
return {
|
|
483
516
|
bridgeResult,
|
|
484
517
|
swapResult: {
|
|
@@ -495,10 +528,12 @@ async function getQuoteWithReceiverAccountBridge(provider, params) {
|
|
|
495
528
|
swap: result.swapResult,
|
|
496
529
|
bridge: result.bridgeResult,
|
|
497
530
|
postSwapOrderFromQuote: createPostSwapOrderFromQuote({
|
|
531
|
+
provider,
|
|
498
532
|
getBridgeProviderQuote,
|
|
499
533
|
signer,
|
|
500
534
|
sellTokenAddress: swapAndBridgeRequest.sellTokenAddress,
|
|
501
|
-
orderBookApi
|
|
535
|
+
orderBookApi,
|
|
536
|
+
initialSwapResult: result.swapResult
|
|
502
537
|
})
|
|
503
538
|
};
|
|
504
539
|
}
|
|
@@ -577,7 +612,9 @@ async function getQuoteWithHookBridge(provider, params) {
|
|
|
577
612
|
getBridgeProviderQuote: (signer2, advancedSettings) => getBridgeProviderQuote(signer2, hookEstimatedGasLimit, advancedSettings),
|
|
578
613
|
signer,
|
|
579
614
|
sellTokenAddress: swapAndBridgeRequest.sellTokenAddress,
|
|
580
|
-
orderBookApi
|
|
615
|
+
orderBookApi,
|
|
616
|
+
provider,
|
|
617
|
+
initialSwapResult: result.swapResult
|
|
581
618
|
})
|
|
582
619
|
};
|
|
583
620
|
}
|
|
@@ -590,6 +627,8 @@ async function getAccountBridgeResult(provider, context) {
|
|
|
590
627
|
const bridgingQuote = await provider.getQuote(bridgeRequest);
|
|
591
628
|
const bridgeReceiverOverride = await provider.getBridgeReceiverOverride(bridgeRequest, bridgingQuote);
|
|
592
629
|
const bridgeResult = {
|
|
630
|
+
id: bridgingQuote.id,
|
|
631
|
+
signature: bridgingQuote.signature,
|
|
593
632
|
providerInfo: provider.info,
|
|
594
633
|
tradeParameters: bridgeRequest,
|
|
595
634
|
// Just the bridge (not the swap & bridge)
|
|
@@ -621,6 +660,7 @@ async function getHookBridgeResult(provider, context) {
|
|
|
621
660
|
});
|
|
622
661
|
const appDataInfo = await (0, import_sdk_trading.mergeAppDataDoc)(swapAppData.doc, {
|
|
623
662
|
metadata: {
|
|
663
|
+
bridging: overrideAppDataWithBridgingQuoteDetails(swapResult.appDataInfo.doc.metadata.bridging, bridgingQuote),
|
|
624
664
|
hooks: {
|
|
625
665
|
pre: swapResultHooks?.pre,
|
|
626
666
|
post: [...postHooks, ...[bridgeHook.postHook]]
|
|
@@ -644,6 +684,15 @@ async function getHookBridgeResult(provider, context) {
|
|
|
644
684
|
};
|
|
645
685
|
return { bridgeResult, bridgeHook, appDataInfo };
|
|
646
686
|
}
|
|
687
|
+
function overrideAppDataWithBridgingQuoteDetails(bridgingMetaData, quote) {
|
|
688
|
+
if (!bridgingMetaData)
|
|
689
|
+
return bridgingMetaData;
|
|
690
|
+
return {
|
|
691
|
+
...bridgingMetaData,
|
|
692
|
+
...quote.id ? { quoteId: quote.id } : void 0,
|
|
693
|
+
...quote.signature ? { quoteSignature: quote.signature } : void 0
|
|
694
|
+
};
|
|
695
|
+
}
|
|
647
696
|
|
|
648
697
|
// src/BridgingSdk/strategies/QuoteStrategy.ts
|
|
649
698
|
var QuoteStrategy = class {
|
|
@@ -664,10 +713,9 @@ var SingleQuoteStrategy = class extends BaseSingleQuoteStrategy {
|
|
|
664
713
|
constructor(intermediateTokensCache) {
|
|
665
714
|
super(intermediateTokensCache);
|
|
666
715
|
}
|
|
667
|
-
async execute(request,
|
|
716
|
+
async execute(request, tradingSdk, providers) {
|
|
668
717
|
const { quoteBridgeRequest, advancedSettings } = request;
|
|
669
718
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
670
|
-
const { tradingSdk, providers } = config;
|
|
671
719
|
if (sellTokenChainId !== buyTokenChainId) {
|
|
672
720
|
const provider = providers[0];
|
|
673
721
|
if (!provider) {
|
|
@@ -703,7 +751,7 @@ function validateCrossChainRequest(sellTokenChainId, buyTokenChainId) {
|
|
|
703
751
|
);
|
|
704
752
|
}
|
|
705
753
|
}
|
|
706
|
-
function
|
|
754
|
+
function createBridgeRequestTimeoutPromise(timeoutMs, prefix) {
|
|
707
755
|
return new Promise((_, reject) => {
|
|
708
756
|
setTimeout(() => {
|
|
709
757
|
reject(new BridgeProviderError(`${prefix} timeout after ${timeoutMs}ms`, {}));
|
|
@@ -732,11 +780,11 @@ function fillTimeoutResults(results, providersToQuery) {
|
|
|
732
780
|
}
|
|
733
781
|
}
|
|
734
782
|
}
|
|
735
|
-
async function executeProviderQuotes(promises, timeout,
|
|
783
|
+
async function executeProviderQuotes(promises, timeout, providers) {
|
|
736
784
|
try {
|
|
737
785
|
await Promise.race([
|
|
738
786
|
Promise.allSettled(promises),
|
|
739
|
-
|
|
787
|
+
createBridgeRequestTimeoutPromise(timeout, `Multi-quote with ${providers.length}`)
|
|
740
788
|
]);
|
|
741
789
|
} catch {
|
|
742
790
|
console.warn("getMultiQuotes timeout occurred, returning partial results");
|
|
@@ -787,11 +835,11 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
787
835
|
constructor(intermediateTokensCache) {
|
|
788
836
|
super(intermediateTokensCache);
|
|
789
837
|
}
|
|
790
|
-
async execute(request,
|
|
838
|
+
async execute(request, tradingSdk, providers) {
|
|
791
839
|
const { quoteBridgeRequest, providerDappIds, advancedSettings, options } = request;
|
|
792
840
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
793
841
|
validateCrossChainRequest(sellTokenChainId, buyTokenChainId);
|
|
794
|
-
const providersToQuery = resolveProvidersToQuery(providerDappIds,
|
|
842
|
+
const providersToQuery = resolveProvidersToQuery(providerDappIds, providers);
|
|
795
843
|
const {
|
|
796
844
|
onQuoteResult,
|
|
797
845
|
totalTimeout = DEFAULT_TOTAL_TIMEOUT_MS,
|
|
@@ -813,10 +861,10 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
813
861
|
results,
|
|
814
862
|
index: i
|
|
815
863
|
};
|
|
816
|
-
const promise = this.createProviderQuotePromise(context,
|
|
864
|
+
const promise = this.createProviderQuotePromise(context, tradingSdk);
|
|
817
865
|
promises.push(promise);
|
|
818
866
|
}
|
|
819
|
-
await executeProviderQuotes(promises, totalTimeout,
|
|
867
|
+
await executeProviderQuotes(promises, totalTimeout, providers);
|
|
820
868
|
fillTimeoutResults(results, providersToQuery);
|
|
821
869
|
results.sort((a, b) => {
|
|
822
870
|
if (isBetterQuote(a, b))
|
|
@@ -827,14 +875,14 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
827
875
|
});
|
|
828
876
|
return results;
|
|
829
877
|
}
|
|
830
|
-
createProviderQuotePromise(context,
|
|
878
|
+
createProviderQuotePromise(context, tradingSdk) {
|
|
831
879
|
const { provider, quoteBridgeRequest, advancedSettings, providerTimeout, onQuoteResult, results, index } = context;
|
|
832
880
|
return (async () => {
|
|
833
881
|
try {
|
|
834
882
|
const baseParams = {
|
|
835
883
|
swapAndBridgeRequest: quoteBridgeRequest,
|
|
836
884
|
advancedSettings,
|
|
837
|
-
tradingSdk
|
|
885
|
+
tradingSdk,
|
|
838
886
|
quoteSigner: advancedSettings?.quoteSigner
|
|
839
887
|
};
|
|
840
888
|
const request = this.intermediateTokensCache ? {
|
|
@@ -843,7 +891,7 @@ var MultiQuoteStrategy = class extends BaseMultiQuoteStrategy {
|
|
|
843
891
|
} : baseParams;
|
|
844
892
|
const quote = await Promise.race([
|
|
845
893
|
getQuoteWithBridge(provider, request),
|
|
846
|
-
|
|
894
|
+
createBridgeRequestTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
|
|
847
895
|
]);
|
|
848
896
|
const result = {
|
|
849
897
|
providerDappId: provider.info.dappId,
|
|
@@ -873,11 +921,11 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
873
921
|
constructor(intermediateTokensCache) {
|
|
874
922
|
super(intermediateTokensCache);
|
|
875
923
|
}
|
|
876
|
-
async execute(request,
|
|
924
|
+
async execute(request, tradingSdk, providers) {
|
|
877
925
|
const { quoteBridgeRequest, providerDappIds, advancedSettings, options } = request;
|
|
878
926
|
const { sellTokenChainId, buyTokenChainId } = quoteBridgeRequest;
|
|
879
927
|
validateCrossChainRequest(sellTokenChainId, buyTokenChainId);
|
|
880
|
-
const providersToQuery = resolveProvidersToQuery(providerDappIds,
|
|
928
|
+
const providersToQuery = resolveProvidersToQuery(providerDappIds, providers);
|
|
881
929
|
const {
|
|
882
930
|
onQuoteResult,
|
|
883
931
|
totalTimeout = DEFAULT_TOTAL_TIMEOUT_MS2,
|
|
@@ -896,20 +944,20 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
896
944
|
bestResult,
|
|
897
945
|
firstError
|
|
898
946
|
};
|
|
899
|
-
const promise = this.createBestQuoteProviderPromise(context,
|
|
947
|
+
const promise = this.createBestQuoteProviderPromise(context, tradingSdk);
|
|
900
948
|
promises.push(promise);
|
|
901
949
|
}
|
|
902
|
-
await executeProviderQuotes(promises, totalTimeout,
|
|
950
|
+
await executeProviderQuotes(promises, totalTimeout, providers);
|
|
903
951
|
return bestResult.current || firstError.current;
|
|
904
952
|
}
|
|
905
|
-
createBestQuoteProviderPromise(context,
|
|
953
|
+
createBestQuoteProviderPromise(context, tradingSdk) {
|
|
906
954
|
const { provider, quoteBridgeRequest, advancedSettings, providerTimeout, onQuoteResult, bestResult, firstError } = context;
|
|
907
955
|
return (async () => {
|
|
908
956
|
try {
|
|
909
957
|
const baseParams = {
|
|
910
958
|
swapAndBridgeRequest: quoteBridgeRequest,
|
|
911
959
|
advancedSettings,
|
|
912
|
-
tradingSdk
|
|
960
|
+
tradingSdk,
|
|
913
961
|
provider,
|
|
914
962
|
quoteSigner: advancedSettings?.quoteSigner
|
|
915
963
|
};
|
|
@@ -919,7 +967,7 @@ var BestQuoteStrategy = class extends BaseBestQuoteStrategy {
|
|
|
919
967
|
} : baseParams;
|
|
920
968
|
const quote = await Promise.race([
|
|
921
969
|
getQuoteWithBridge(provider, request),
|
|
922
|
-
|
|
970
|
+
createBridgeRequestTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
|
|
923
971
|
]);
|
|
924
972
|
const result = {
|
|
925
973
|
providerDappId: provider.info.dappId,
|
|
@@ -957,10 +1005,11 @@ function createStrategies(intermediateTokensCache) {
|
|
|
957
1005
|
var DEFAULT_CACHE_CONFIG = {
|
|
958
1006
|
enabled: true,
|
|
959
1007
|
intermediateTokensTtl: 5 * 60 * 1e3,
|
|
960
|
-
//
|
|
1008
|
+
// 2 minutes
|
|
961
1009
|
buyTokensTtl: 2 * 60 * 1e3
|
|
962
1010
|
// 2 minutes
|
|
963
1011
|
};
|
|
1012
|
+
var DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT = 10 * 1e3;
|
|
964
1013
|
var BridgingSdk = class {
|
|
965
1014
|
constructor(options, adapter) {
|
|
966
1015
|
this.options = options;
|
|
@@ -1007,18 +1056,18 @@ var BridgingSdk = class {
|
|
|
1007
1056
|
singleQuoteStrategy;
|
|
1008
1057
|
multiQuoteStrategy;
|
|
1009
1058
|
bestQuoteStrategy;
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
throw new BridgeProviderError("No provider found", { config: this.config });
|
|
1014
|
-
}
|
|
1015
|
-
return providers[0];
|
|
1059
|
+
availableProvidersIds = [];
|
|
1060
|
+
setAvailableProviders(ids) {
|
|
1061
|
+
this.availableProvidersIds = ids;
|
|
1016
1062
|
}
|
|
1017
1063
|
/**
|
|
1018
1064
|
* Get the providers for the bridging.
|
|
1019
1065
|
*/
|
|
1020
|
-
|
|
1021
|
-
|
|
1066
|
+
getAvailableProviders() {
|
|
1067
|
+
if (this.availableProvidersIds.length === 0) {
|
|
1068
|
+
return this.config.providers;
|
|
1069
|
+
}
|
|
1070
|
+
return this.config.providers.filter((provider) => this.availableProvidersIds.includes(provider.info.dappId));
|
|
1022
1071
|
}
|
|
1023
1072
|
/**
|
|
1024
1073
|
* Get the available sources networks for the bridging.
|
|
@@ -1030,7 +1079,21 @@ var BridgingSdk = class {
|
|
|
1030
1079
|
* Get the available target networks for the bridging.
|
|
1031
1080
|
*/
|
|
1032
1081
|
async getTargetNetworks() {
|
|
1033
|
-
|
|
1082
|
+
const providers = this.getAvailableProviders();
|
|
1083
|
+
const results = await Promise.race([
|
|
1084
|
+
Promise.allSettled(providers.map((provider) => provider.getNetworks())),
|
|
1085
|
+
createBridgeRequestTimeoutPromise(
|
|
1086
|
+
DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT,
|
|
1087
|
+
`Multi-provider getTargetNetworks with ${providers.length}`
|
|
1088
|
+
)
|
|
1089
|
+
]);
|
|
1090
|
+
return results.reduce((acc, result) => {
|
|
1091
|
+
if (result.status === "fulfilled") {
|
|
1092
|
+
const networksToAdd = (result.value || []).filter((network) => !acc.includes(network));
|
|
1093
|
+
return acc.concat(networksToAdd);
|
|
1094
|
+
}
|
|
1095
|
+
return acc;
|
|
1096
|
+
}, []);
|
|
1034
1097
|
}
|
|
1035
1098
|
/**
|
|
1036
1099
|
* Get the available buy tokens for buying in a specific target chain
|
|
@@ -1038,22 +1101,32 @@ var BridgingSdk = class {
|
|
|
1038
1101
|
* @param params
|
|
1039
1102
|
*/
|
|
1040
1103
|
async getBuyTokens(params) {
|
|
1041
|
-
const
|
|
1042
|
-
const
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1104
|
+
const providers = this.getAvailableProviders();
|
|
1105
|
+
const results = await Promise.race([
|
|
1106
|
+
Promise.allSettled(providers.map((provider) => this.getBuyTokensFromProvider(provider, params))),
|
|
1107
|
+
createBridgeRequestTimeoutPromise(
|
|
1108
|
+
DEFAULT_MULTI_PROVIDER_REQUEST_TIMEOUT,
|
|
1109
|
+
`Multi-provider getBuyTokens with ${providers.length}`
|
|
1110
|
+
)
|
|
1111
|
+
]);
|
|
1112
|
+
const isRouteAvailable = results.reduce((isRouteAvailable2, result) => {
|
|
1113
|
+
if (result.status === "fulfilled" && result.value.isRouteAvailable) {
|
|
1114
|
+
return true;
|
|
1115
|
+
}
|
|
1116
|
+
return isRouteAvailable2;
|
|
1117
|
+
}, false);
|
|
1118
|
+
const tokens = results.reduce((tokens2, result) => {
|
|
1119
|
+
if (result.status === "fulfilled" && result.value.tokens) {
|
|
1120
|
+
result.value.tokens.forEach((token) => {
|
|
1121
|
+
const addressLower = token.address.toLowerCase();
|
|
1122
|
+
if (!tokens2.get(addressLower)) {
|
|
1123
|
+
tokens2.set(addressLower, token);
|
|
1124
|
+
}
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1127
|
+
return tokens2;
|
|
1128
|
+
}, /* @__PURE__ */ new Map());
|
|
1129
|
+
return { isRouteAvailable, tokens: [...tokens.values()] };
|
|
1057
1130
|
}
|
|
1058
1131
|
/**
|
|
1059
1132
|
* Get quote details, including a callback function to post the order on-chain.
|
|
@@ -1076,7 +1149,8 @@ var BridgingSdk = class {
|
|
|
1076
1149
|
quoteBridgeRequest,
|
|
1077
1150
|
advancedSettings
|
|
1078
1151
|
},
|
|
1079
|
-
this.config
|
|
1152
|
+
this.config.tradingSdk,
|
|
1153
|
+
this.getAvailableProviders()
|
|
1080
1154
|
);
|
|
1081
1155
|
}
|
|
1082
1156
|
/**
|
|
@@ -1095,7 +1169,7 @@ var BridgingSdk = class {
|
|
|
1095
1169
|
* ```
|
|
1096
1170
|
*/
|
|
1097
1171
|
async getMultiQuotes(request) {
|
|
1098
|
-
return this.multiQuoteStrategy.execute(request, this.config);
|
|
1172
|
+
return this.multiQuoteStrategy.execute(request, this.config.tradingSdk, this.getAvailableProviders());
|
|
1099
1173
|
}
|
|
1100
1174
|
/**
|
|
1101
1175
|
* Get the best quote from multiple bridge providers with progressive updates.
|
|
@@ -1113,7 +1187,7 @@ var BridgingSdk = class {
|
|
|
1113
1187
|
* @throws Error if the request is for a single-chain swap (sellTokenChainId === buyTokenChainId)
|
|
1114
1188
|
*/
|
|
1115
1189
|
async getBestQuote(request) {
|
|
1116
|
-
return this.bestQuoteStrategy.execute(request, this.config);
|
|
1190
|
+
return this.bestQuoteStrategy.execute(request, this.config.tradingSdk, this.getAvailableProviders());
|
|
1117
1191
|
}
|
|
1118
1192
|
async getOrder(params) {
|
|
1119
1193
|
const { orderBookApi } = this.config;
|
|
@@ -1123,14 +1197,11 @@ var BridgingSdk = class {
|
|
|
1123
1197
|
orderId,
|
|
1124
1198
|
orderBookApi,
|
|
1125
1199
|
env,
|
|
1126
|
-
providers: this.
|
|
1200
|
+
providers: this.getAvailableProviders()
|
|
1127
1201
|
});
|
|
1128
1202
|
}
|
|
1129
|
-
async getOrderBridgingStatus(bridgingId, originChainId) {
|
|
1130
|
-
return this.provider.getStatus(bridgingId, originChainId);
|
|
1131
|
-
}
|
|
1132
1203
|
getProviderFromAppData(fullAppData) {
|
|
1133
|
-
return findBridgeProviderFromHook(fullAppData, this.
|
|
1204
|
+
return findBridgeProviderFromHook(fullAppData, this.getAvailableProviders());
|
|
1134
1205
|
}
|
|
1135
1206
|
/**
|
|
1136
1207
|
* Clear all caches. Useful for testing and debugging.
|
|
@@ -1156,7 +1227,25 @@ var BridgingSdk = class {
|
|
|
1156
1227
|
};
|
|
1157
1228
|
}
|
|
1158
1229
|
getProviderByDappId(dappId) {
|
|
1159
|
-
return this.
|
|
1230
|
+
return this.getAvailableProviders().find((provider) => provider.info.dappId === dappId);
|
|
1231
|
+
}
|
|
1232
|
+
async getBuyTokensFromProvider(provider, params) {
|
|
1233
|
+
const providerId = provider.info.dappId;
|
|
1234
|
+
const cacheKey = getCacheKey({
|
|
1235
|
+
id: providerId,
|
|
1236
|
+
buyChainId: params.buyChainId.toString(),
|
|
1237
|
+
sellChainId: params.sellChainId?.toString(),
|
|
1238
|
+
tokenAddress: params.sellTokenAddress
|
|
1239
|
+
});
|
|
1240
|
+
const cached = this.cacheConfig.enabled && this.buyTokensCache.get(cacheKey);
|
|
1241
|
+
if (cached) {
|
|
1242
|
+
return cached;
|
|
1243
|
+
}
|
|
1244
|
+
const result = await provider.getBuyTokens(params);
|
|
1245
|
+
if (this.cacheConfig.enabled) {
|
|
1246
|
+
this.buyTokensCache.set(cacheKey, result);
|
|
1247
|
+
}
|
|
1248
|
+
return result;
|
|
1160
1249
|
}
|
|
1161
1250
|
};
|
|
1162
1251
|
|
|
@@ -1274,7 +1363,7 @@ var ACROSS_DEPOSIT_EVENT_INTERFACE = () => {
|
|
|
1274
1363
|
};
|
|
1275
1364
|
var COW_TRADE_EVENT_INTERFACE = () => {
|
|
1276
1365
|
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)"
|
|
1366
|
+
"event Trade(address indexed owner, address sellToken, address buyToken, uint256 sellAmount, uint256 buyAmount, uint256 feeAmount, bytes orderUid)"
|
|
1278
1367
|
]);
|
|
1279
1368
|
};
|
|
1280
1369
|
|
|
@@ -3398,8 +3487,9 @@ var import_sdk_order_book4 = require("@cowprotocol/sdk-order-book");
|
|
|
3398
3487
|
var ACROSS_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/across`;
|
|
3399
3488
|
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
3489
|
var SLIPPAGE_TOLERANCE_BPS = 0;
|
|
3490
|
+
var providerType = "HookBridgeProvider";
|
|
3401
3491
|
var AcrossBridgeProvider = class {
|
|
3402
|
-
type =
|
|
3492
|
+
type = providerType;
|
|
3403
3493
|
api;
|
|
3404
3494
|
cowShedSdk;
|
|
3405
3495
|
supportedTokens = null;
|
|
@@ -3415,7 +3505,8 @@ var AcrossBridgeProvider = class {
|
|
|
3415
3505
|
name: "Across",
|
|
3416
3506
|
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/across/across-logo.png`,
|
|
3417
3507
|
dappId: ACROSS_HOOK_DAPP_ID,
|
|
3418
|
-
website: "https://across.to"
|
|
3508
|
+
website: "https://across.to",
|
|
3509
|
+
type: providerType
|
|
3419
3510
|
};
|
|
3420
3511
|
async getNetworks() {
|
|
3421
3512
|
return ACROSS_SUPPORTED_NETWORKS;
|
|
@@ -3500,7 +3591,8 @@ var AcrossBridgeProvider = class {
|
|
|
3500
3591
|
async decodeBridgeHook(_hook) {
|
|
3501
3592
|
throw new Error("Not implemented");
|
|
3502
3593
|
}
|
|
3503
|
-
async getBridgingParams(chainId,
|
|
3594
|
+
async getBridgingParams(chainId, order, txHash) {
|
|
3595
|
+
const orderUid = order.uid;
|
|
3504
3596
|
const adapter = (0, import_sdk_common12.getGlobalAdapter)();
|
|
3505
3597
|
const txReceipt = await adapter.getTransactionReceipt(txHash);
|
|
3506
3598
|
if (!txReceipt)
|
|
@@ -3660,6 +3752,7 @@ function toBridgeQuoteResult2(request, slippageBps, bungeeQuoteWithBuildTx) {
|
|
|
3660
3752
|
const { kind } = request;
|
|
3661
3753
|
const { bungeeQuote, buildTx } = bungeeQuoteWithBuildTx;
|
|
3662
3754
|
return {
|
|
3755
|
+
id: bungeeQuoteWithBuildTx.bungeeQuote.route.quoteId.toString(),
|
|
3663
3756
|
isSell: kind === import_sdk_order_book5.OrderKind.SELL,
|
|
3664
3757
|
amountsAndCosts: toAmountsAndCosts2(request, slippageBps, bungeeQuote),
|
|
3665
3758
|
quoteTimestamp: Number(bungeeQuote.quoteTimestamp),
|
|
@@ -3688,7 +3781,7 @@ function toAmountsAndCosts2(request, slippageBps, bungeeQuote) {
|
|
|
3688
3781
|
const buyAmountBeforeFee = (0, import_sdk_order_book5.getBigNumber)(buyAmountFromBungeeQuote, buyTokenDecimals).big;
|
|
3689
3782
|
const buyAmountAfterFee = buyAmountBeforeFee;
|
|
3690
3783
|
const feeSellToken = bungeeQuote.route.routeDetails.routeFee.amount;
|
|
3691
|
-
const feeBuyToken =
|
|
3784
|
+
const feeBuyToken = sellAmountBeforeFee > 0n ? BigInt(feeSellToken) * buyAmountBeforeFee / sellAmountBeforeFee : 0n;
|
|
3692
3785
|
const buyAmountAfterSlippage = applyBps2(buyAmountAfterFee, slippageBps);
|
|
3693
3786
|
const bridgeFeeBps = calculateFeeBps(BigInt(bungeeQuote.route.routeDetails.routeFee.amount), BigInt(amount));
|
|
3694
3787
|
return {
|
|
@@ -3708,7 +3801,7 @@ function toAmountsAndCosts2(request, slippageBps, bungeeQuote) {
|
|
|
3708
3801
|
bridgingFee: {
|
|
3709
3802
|
feeBps: bridgeFeeBps,
|
|
3710
3803
|
amountInSellCurrency: BigInt(feeSellToken),
|
|
3711
|
-
amountInBuyCurrency:
|
|
3804
|
+
amountInBuyCurrency: feeBuyToken
|
|
3712
3805
|
}
|
|
3713
3806
|
},
|
|
3714
3807
|
slippageBps
|
|
@@ -4557,6 +4650,7 @@ var import_sdk_common15 = require("@cowprotocol/sdk-common");
|
|
|
4557
4650
|
var BUNGEE_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX2}/bungee`;
|
|
4558
4651
|
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
4652
|
var SLIPPAGE_TOLERANCE_BPS2 = 0;
|
|
4653
|
+
var providerType2 = "HookBridgeProvider";
|
|
4560
4654
|
var BungeeBridgeProvider = class {
|
|
4561
4655
|
constructor(options, _adapter) {
|
|
4562
4656
|
this.options = options;
|
|
@@ -4567,14 +4661,15 @@ var BungeeBridgeProvider = class {
|
|
|
4567
4661
|
this.api = new BungeeApi(options.apiOptions);
|
|
4568
4662
|
this.cowShedSdk = new import_sdk_cow_shed2.CowShedSdk(adapter, options.cowShedOptions?.factoryOptions);
|
|
4569
4663
|
}
|
|
4570
|
-
type =
|
|
4664
|
+
type = providerType2;
|
|
4571
4665
|
api;
|
|
4572
4666
|
cowShedSdk;
|
|
4573
4667
|
info = {
|
|
4574
4668
|
name: "Bungee",
|
|
4575
4669
|
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/bungee/bungee-logo.png`,
|
|
4576
4670
|
dappId: BUNGEE_HOOK_DAPP_ID,
|
|
4577
|
-
website: "https://www.bungee.exchange"
|
|
4671
|
+
website: "https://www.bungee.exchange",
|
|
4672
|
+
type: providerType2
|
|
4578
4673
|
};
|
|
4579
4674
|
async getNetworks() {
|
|
4580
4675
|
return BUNGEE_SUPPORTED_NETWORKS;
|
|
@@ -4668,7 +4763,8 @@ var BungeeBridgeProvider = class {
|
|
|
4668
4763
|
recipient: cowShedAccount
|
|
4669
4764
|
};
|
|
4670
4765
|
}
|
|
4671
|
-
async getBridgingParams(_chainId,
|
|
4766
|
+
async getBridgingParams(_chainId, order, _txHash) {
|
|
4767
|
+
const orderId = order.uid;
|
|
4672
4768
|
const events = await this.api.getEvents({ orderId });
|
|
4673
4769
|
const event = events?.[0];
|
|
4674
4770
|
if (!event)
|
|
@@ -4710,6 +4806,416 @@ var BungeeBridgeProvider = class {
|
|
|
4710
4806
|
return sellTokenChainId === import_sdk_config8.SupportedChainId.MAINNET && buyTokenChainId === import_sdk_config8.SupportedChainId.GNOSIS_CHAIN;
|
|
4711
4807
|
}
|
|
4712
4808
|
};
|
|
4809
|
+
|
|
4810
|
+
// src/providers/near-intents/NearIntentsBridgeProvider.ts
|
|
4811
|
+
var import_sdk_common17 = require("@cowprotocol/sdk-common");
|
|
4812
|
+
var import_sdk_config11 = require("@cowprotocol/sdk-config");
|
|
4813
|
+
var import_sdk_cow_shed3 = require("@cowprotocol/sdk-cow-shed");
|
|
4814
|
+
var import_sdk_order_book7 = require("@cowprotocol/sdk-order-book");
|
|
4815
|
+
var import_one_click_sdk_typescript2 = require("@defuse-protocol/one-click-sdk-typescript");
|
|
4816
|
+
|
|
4817
|
+
// src/providers/near-intents/NearIntentsApi.ts
|
|
4818
|
+
var import_one_click_sdk_typescript = require("@defuse-protocol/one-click-sdk-typescript");
|
|
4819
|
+
var NearIntentsApi = class {
|
|
4820
|
+
cachedTokens = [];
|
|
4821
|
+
async getTokens() {
|
|
4822
|
+
if (this.cachedTokens.length === 0) {
|
|
4823
|
+
const response = await import_one_click_sdk_typescript.OneClickService.getTokens();
|
|
4824
|
+
this.cachedTokens = response;
|
|
4825
|
+
}
|
|
4826
|
+
return this.cachedTokens;
|
|
4827
|
+
}
|
|
4828
|
+
async getQuote(request) {
|
|
4829
|
+
return await import_one_click_sdk_typescript.OneClickService.getQuote(request);
|
|
4830
|
+
}
|
|
4831
|
+
async getStatus(depositAddress) {
|
|
4832
|
+
return await import_one_click_sdk_typescript.OneClickService.getExecutionStatus(depositAddress);
|
|
4833
|
+
}
|
|
4834
|
+
async getAttestation(request) {
|
|
4835
|
+
const response = await fetch(`${import_one_click_sdk_typescript.OpenAPI.BASE}/v0/attestation`, {
|
|
4836
|
+
method: "POST",
|
|
4837
|
+
headers: {
|
|
4838
|
+
"Content-Type": "application/json"
|
|
4839
|
+
},
|
|
4840
|
+
body: JSON.stringify(request)
|
|
4841
|
+
});
|
|
4842
|
+
if (!response.ok) {
|
|
4843
|
+
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
4844
|
+
}
|
|
4845
|
+
return await response.json();
|
|
4846
|
+
}
|
|
4847
|
+
};
|
|
4848
|
+
|
|
4849
|
+
// src/providers/near-intents/const/index.ts
|
|
4850
|
+
var import_sdk_config9 = require("@cowprotocol/sdk-config");
|
|
4851
|
+
var NEAR_INTENTS_HOOK_DAPP_ID = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/near-intents`;
|
|
4852
|
+
var NEAR_INTENTS_SUPPORTED_NETWORKS = [
|
|
4853
|
+
import_sdk_config9.arbitrumOne,
|
|
4854
|
+
import_sdk_config9.avalanche,
|
|
4855
|
+
import_sdk_config9.base,
|
|
4856
|
+
import_sdk_config9.bnb,
|
|
4857
|
+
import_sdk_config9.gnosisChain,
|
|
4858
|
+
import_sdk_config9.mainnet,
|
|
4859
|
+
import_sdk_config9.optimism,
|
|
4860
|
+
import_sdk_config9.polygon
|
|
4861
|
+
];
|
|
4862
|
+
var NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS = {
|
|
4863
|
+
arb: import_sdk_config9.arbitrumOne.id,
|
|
4864
|
+
avax: import_sdk_config9.avalanche.id,
|
|
4865
|
+
base: import_sdk_config9.base.id,
|
|
4866
|
+
bsc: import_sdk_config9.bnb.id,
|
|
4867
|
+
eth: import_sdk_config9.mainnet.id,
|
|
4868
|
+
gnosis: import_sdk_config9.gnosisChain.id,
|
|
4869
|
+
op: import_sdk_config9.optimism.id,
|
|
4870
|
+
pol: import_sdk_config9.polygon.id
|
|
4871
|
+
};
|
|
4872
|
+
var NEAR_INTENTS_STATUS_TO_COW_STATUS = {
|
|
4873
|
+
KNOWN_DEPOSIT_TX: "in_progress" /* IN_PROGRESS */,
|
|
4874
|
+
PENDING_DEPOSIT: "in_progress" /* IN_PROGRESS */,
|
|
4875
|
+
INCOMPLETE_DEPOSIT: "unknown" /* UNKNOWN */,
|
|
4876
|
+
PROCESSING: "in_progress" /* IN_PROGRESS */,
|
|
4877
|
+
SUCCESS: "executed" /* EXECUTED */,
|
|
4878
|
+
REFUNDED: "refund" /* REFUND */,
|
|
4879
|
+
FAILED: "unknown" /* UNKNOWN */
|
|
4880
|
+
};
|
|
4881
|
+
var ATTESTATION_PREFIX_CONST = "0x0a773570";
|
|
4882
|
+
var ATTESTION_VERSION_BYTE = "0x00";
|
|
4883
|
+
var ATTESTATOR_ADDRESS = "0x0073DD100b51C555E41B2a452E5933ef76F42790";
|
|
4884
|
+
|
|
4885
|
+
// src/providers/near-intents/util.ts
|
|
4886
|
+
var import_json_stable_stringify = __toESM(require("json-stable-stringify"));
|
|
4887
|
+
var import_sdk_common16 = require("@cowprotocol/sdk-common");
|
|
4888
|
+
var import_sdk_config10 = require("@cowprotocol/sdk-config");
|
|
4889
|
+
var calculateDeadline = (seconds) => {
|
|
4890
|
+
const secs = Number(seconds);
|
|
4891
|
+
if (!Number.isFinite(secs)) {
|
|
4892
|
+
throw new Error(`Invalid seconds value: ${seconds}`);
|
|
4893
|
+
}
|
|
4894
|
+
const d = new Date(Date.now() + secs * 1e3);
|
|
4895
|
+
return d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
4896
|
+
};
|
|
4897
|
+
var adaptToken = (token) => {
|
|
4898
|
+
const chainId = NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS[token.blockchain];
|
|
4899
|
+
if (!chainId)
|
|
4900
|
+
return null;
|
|
4901
|
+
const tokenAddress = token.contractAddress || import_sdk_config10.ETH_ADDRESS;
|
|
4902
|
+
if (!tokenAddress)
|
|
4903
|
+
return null;
|
|
4904
|
+
return {
|
|
4905
|
+
chainId,
|
|
4906
|
+
decimals: token.decimals,
|
|
4907
|
+
address: tokenAddress,
|
|
4908
|
+
name: token.symbol,
|
|
4909
|
+
// TODO: how to handle? v0/tokens doesn't return the token name
|
|
4910
|
+
symbol: token.symbol
|
|
4911
|
+
};
|
|
4912
|
+
};
|
|
4913
|
+
var adaptTokens = (tokens) => tokens.reduce((acc, token) => {
|
|
4914
|
+
const adaptedToken = adaptToken(token);
|
|
4915
|
+
if (!adaptedToken)
|
|
4916
|
+
return acc;
|
|
4917
|
+
acc.push(adaptedToken);
|
|
4918
|
+
return acc;
|
|
4919
|
+
}, []);
|
|
4920
|
+
var getTokenByAddressAndChainId = (tokens, targetTokenAddress, targetTokenChainId) => {
|
|
4921
|
+
return tokens.find((token) => {
|
|
4922
|
+
const chainId = NEAR_INTENTS_BLOCKCHAIN_CHAIN_IDS[token.blockchain];
|
|
4923
|
+
if (!chainId)
|
|
4924
|
+
return false;
|
|
4925
|
+
if (targetTokenAddress.toLowerCase() === import_sdk_config10.ETH_ADDRESS.toLowerCase()) {
|
|
4926
|
+
return chainId === targetTokenChainId && !token.contractAddress;
|
|
4927
|
+
}
|
|
4928
|
+
const tokenAddress = token.contractAddress || import_sdk_config10.ETH_ADDRESS;
|
|
4929
|
+
return tokenAddress?.toLowerCase() === targetTokenAddress.toLowerCase() && chainId === targetTokenChainId;
|
|
4930
|
+
});
|
|
4931
|
+
};
|
|
4932
|
+
var hashQuote = ({
|
|
4933
|
+
quote,
|
|
4934
|
+
quoteRequest,
|
|
4935
|
+
timestamp
|
|
4936
|
+
}) => {
|
|
4937
|
+
const adapter = (0, import_sdk_common16.getGlobalAdapter)();
|
|
4938
|
+
const data = (0, import_json_stable_stringify.default)({
|
|
4939
|
+
dry: false,
|
|
4940
|
+
swapType: quoteRequest.swapType,
|
|
4941
|
+
slippageTolerance: quoteRequest.slippageTolerance,
|
|
4942
|
+
originAsset: quoteRequest.originAsset,
|
|
4943
|
+
depositType: quoteRequest.depositType,
|
|
4944
|
+
destinationAsset: quoteRequest.destinationAsset,
|
|
4945
|
+
amount: quoteRequest.amount,
|
|
4946
|
+
refundTo: quoteRequest.refundTo,
|
|
4947
|
+
refundType: quoteRequest.refundType,
|
|
4948
|
+
recipient: quoteRequest.recipient,
|
|
4949
|
+
recipientType: quoteRequest.recipientType,
|
|
4950
|
+
deadline: quoteRequest.deadline,
|
|
4951
|
+
quoteWaitingTimeMs: !!quoteRequest.quoteWaitingTimeMs ? quoteRequest.quoteWaitingTimeMs : void 0,
|
|
4952
|
+
referral: !!quoteRequest.referral ? quoteRequest.referral : void 0,
|
|
4953
|
+
virtualChainRecipient: !!quoteRequest.virtualChainRecipient ? quoteRequest.virtualChainRecipient : void 0,
|
|
4954
|
+
virtualChainRefundRecipient: !!quoteRequest.virtualChainRefundRecipient ? quoteRequest.virtualChainRefundRecipient : void 0,
|
|
4955
|
+
customRecipientMsg: void 0,
|
|
4956
|
+
sessionId: void 0,
|
|
4957
|
+
connectedWallets: void 0,
|
|
4958
|
+
depositMode: quoteRequest.depositMode,
|
|
4959
|
+
amountIn: quote.amountIn,
|
|
4960
|
+
amountInFormatted: quote.amountInFormatted,
|
|
4961
|
+
amountInUsd: quote.amountInUsd,
|
|
4962
|
+
minAmountIn: quote.minAmountIn,
|
|
4963
|
+
amountOut: quote.amountOut,
|
|
4964
|
+
amountOutFormatted: quote.amountOutFormatted,
|
|
4965
|
+
amountOutUsd: quote.amountOutUsd,
|
|
4966
|
+
minAmountOut: quote.minAmountOut,
|
|
4967
|
+
timestamp
|
|
4968
|
+
});
|
|
4969
|
+
if (!data) {
|
|
4970
|
+
throw new Error("Failed to serialize quote data: quote or quoteRequest may be undefined or invalid");
|
|
4971
|
+
}
|
|
4972
|
+
return adapter.utils.sha256(adapter.utils.toUtf8Bytes(data));
|
|
4973
|
+
};
|
|
4974
|
+
|
|
4975
|
+
// src/providers/near-intents/NearIntentsBridgeProvider.ts
|
|
4976
|
+
var NEAR_INTENTS_HOOK_DAPP_ID2 = `${HOOK_DAPP_BRIDGE_PROVIDER_PREFIX}/near-intents`;
|
|
4977
|
+
var REFERRAL = "cow";
|
|
4978
|
+
var providerType3 = "ReceiverAccountBridgeProvider";
|
|
4979
|
+
var NearIntentsBridgeProvider = class {
|
|
4980
|
+
type = providerType3;
|
|
4981
|
+
api;
|
|
4982
|
+
cowShedSdk;
|
|
4983
|
+
info = {
|
|
4984
|
+
name: "Near Intents",
|
|
4985
|
+
logoUrl: `${RAW_PROVIDERS_FILES_PATH}/near-intents/near-intents-logo.png`,
|
|
4986
|
+
dappId: NEAR_INTENTS_HOOK_DAPP_ID2,
|
|
4987
|
+
website: "https://www.near.org/intents",
|
|
4988
|
+
type: providerType3
|
|
4989
|
+
};
|
|
4990
|
+
constructor(options, _adapter) {
|
|
4991
|
+
const adapter = _adapter || options?.cowShedOptions?.adapter;
|
|
4992
|
+
if (adapter) {
|
|
4993
|
+
(0, import_sdk_common17.setGlobalAdapter)(adapter);
|
|
4994
|
+
}
|
|
4995
|
+
this.api = new NearIntentsApi();
|
|
4996
|
+
this.cowShedSdk = new import_sdk_cow_shed3.CowShedSdk(adapter, options?.cowShedOptions?.factoryOptions);
|
|
4997
|
+
}
|
|
4998
|
+
async getNetworks() {
|
|
4999
|
+
return NEAR_INTENTS_SUPPORTED_NETWORKS;
|
|
5000
|
+
}
|
|
5001
|
+
async getBuyTokens(params) {
|
|
5002
|
+
const tokens = adaptTokens(await this.api.getTokens());
|
|
5003
|
+
const filteredTokens = tokens.filter((token) => token.chainId === params.buyChainId);
|
|
5004
|
+
return {
|
|
5005
|
+
tokens: filteredTokens,
|
|
5006
|
+
isRouteAvailable: filteredTokens.length > 0
|
|
5007
|
+
};
|
|
5008
|
+
}
|
|
5009
|
+
async getIntermediateTokens(request) {
|
|
5010
|
+
if (request.kind !== import_sdk_order_book7.OrderKind.SELL) {
|
|
5011
|
+
throw new BridgeProviderQuoteError("ONLY_SELL_ORDER_SUPPORTED" /* ONLY_SELL_ORDER_SUPPORTED */, { kind: request.kind });
|
|
5012
|
+
}
|
|
5013
|
+
const { sellTokenChainId, buyTokenChainId, buyTokenAddress, sellTokenAddress } = request;
|
|
5014
|
+
const tokens = adaptTokens(await this.api.getTokens());
|
|
5015
|
+
const { sourceTokens, targetTokens } = tokens.reduce(
|
|
5016
|
+
(acc, token) => {
|
|
5017
|
+
if (token.chainId === sellTokenChainId) {
|
|
5018
|
+
acc.sourceTokens.set(token.address.toLowerCase(), token);
|
|
5019
|
+
}
|
|
5020
|
+
if (token.chainId === buyTokenChainId) {
|
|
5021
|
+
acc.targetTokens.set(token.address.toLowerCase(), token);
|
|
5022
|
+
}
|
|
5023
|
+
return acc;
|
|
5024
|
+
},
|
|
5025
|
+
{
|
|
5026
|
+
sourceTokens: /* @__PURE__ */ new Map(),
|
|
5027
|
+
targetTokens: /* @__PURE__ */ new Map()
|
|
5028
|
+
}
|
|
5029
|
+
);
|
|
5030
|
+
const targetToken = targetTokens.get(buyTokenAddress.toLowerCase());
|
|
5031
|
+
if (!targetToken)
|
|
5032
|
+
return [];
|
|
5033
|
+
return Array.from(sourceTokens.values()).filter((token) => {
|
|
5034
|
+
return token.address?.toLowerCase() !== sellTokenAddress.toLowerCase();
|
|
5035
|
+
});
|
|
5036
|
+
}
|
|
5037
|
+
async getQuote(request) {
|
|
5038
|
+
const {
|
|
5039
|
+
sellTokenAddress,
|
|
5040
|
+
sellTokenChainId,
|
|
5041
|
+
buyTokenAddress,
|
|
5042
|
+
buyTokenChainId,
|
|
5043
|
+
account,
|
|
5044
|
+
amount,
|
|
5045
|
+
receiver,
|
|
5046
|
+
validFor,
|
|
5047
|
+
owner
|
|
5048
|
+
} = request;
|
|
5049
|
+
const tokens = await this.api.getTokens();
|
|
5050
|
+
const sellToken = getTokenByAddressAndChainId(tokens, sellTokenAddress, sellTokenChainId);
|
|
5051
|
+
const buyToken = getTokenByAddressAndChainId(tokens, buyTokenAddress, buyTokenChainId);
|
|
5052
|
+
if (!sellToken || !buyToken)
|
|
5053
|
+
throw new BridgeProviderQuoteError("NO_ROUTES" /* NO_ROUTES */);
|
|
5054
|
+
const quoteResponse = await this.api.getQuote({
|
|
5055
|
+
dry: false,
|
|
5056
|
+
swapType: import_one_click_sdk_typescript2.QuoteRequest.swapType.EXACT_INPUT,
|
|
5057
|
+
slippageTolerance: request.slippageBps ?? 100,
|
|
5058
|
+
originAsset: sellToken.assetId,
|
|
5059
|
+
depositType: import_one_click_sdk_typescript2.QuoteRequest.depositType.ORIGIN_CHAIN,
|
|
5060
|
+
destinationAsset: buyToken.assetId,
|
|
5061
|
+
amount: amount.toString(),
|
|
5062
|
+
refundTo: owner || account,
|
|
5063
|
+
refundType: import_one_click_sdk_typescript2.QuoteRequest.refundType.ORIGIN_CHAIN,
|
|
5064
|
+
recipient: receiver || account,
|
|
5065
|
+
recipientType: import_one_click_sdk_typescript2.QuoteRequest.recipientType.DESTINATION_CHAIN,
|
|
5066
|
+
deadline: calculateDeadline(validFor || 3600),
|
|
5067
|
+
referral: REFERRAL
|
|
5068
|
+
});
|
|
5069
|
+
const recoveredDepositAddress = await this.recoverDepositAddress(quoteResponse);
|
|
5070
|
+
if (recoveredDepositAddress?.address.toLowerCase() !== ATTESTATOR_ADDRESS.toLowerCase()) {
|
|
5071
|
+
throw new BridgeProviderQuoteError("QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS" /* QUOTE_DOES_NOT_MATCH_DEPOSIT_ADDRESS */);
|
|
5072
|
+
}
|
|
5073
|
+
const { quote, timestamp: isoDate } = quoteResponse;
|
|
5074
|
+
const payoutRatio = Number(quote.amountOutUsd) / Number(quote.amountInUsd);
|
|
5075
|
+
const slippage = 1 - payoutRatio;
|
|
5076
|
+
const slippageBps = Math.trunc(slippage * 1e4);
|
|
5077
|
+
const feeAmountInBuyCurrency = Math.trunc(Number(quote.amountIn) * slippage);
|
|
5078
|
+
const feeAmountInSellCurrency = Math.trunc(Number(quote.amountOut) * slippage);
|
|
5079
|
+
const bridgeFee = Math.trunc(Number(quote.amountIn) * slippage);
|
|
5080
|
+
return {
|
|
5081
|
+
id: recoveredDepositAddress.quoteHash,
|
|
5082
|
+
signature: quoteResponse.signature,
|
|
5083
|
+
isSell: request.kind === import_sdk_order_book7.OrderKind.SELL,
|
|
5084
|
+
depositAddress: quote.depositAddress,
|
|
5085
|
+
quoteTimestamp: new Date(isoDate).getTime(),
|
|
5086
|
+
expectedFillTimeSeconds: quote.timeEstimate,
|
|
5087
|
+
limits: {
|
|
5088
|
+
minDeposit: BigInt(quote.minAmountIn),
|
|
5089
|
+
maxDeposit: BigInt(quote.amountIn)
|
|
5090
|
+
},
|
|
5091
|
+
fees: {
|
|
5092
|
+
bridgeFee: BigInt(bridgeFee),
|
|
5093
|
+
// 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.
|
|
5094
|
+
destinationGasFee: BigInt(0)
|
|
5095
|
+
},
|
|
5096
|
+
amountsAndCosts: {
|
|
5097
|
+
beforeFee: {
|
|
5098
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5099
|
+
buyAmount: BigInt(quote.amountOut)
|
|
5100
|
+
},
|
|
5101
|
+
afterFee: {
|
|
5102
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5103
|
+
buyAmount: BigInt(quote.minAmountOut)
|
|
5104
|
+
},
|
|
5105
|
+
afterSlippage: {
|
|
5106
|
+
sellAmount: BigInt(quote.amountIn),
|
|
5107
|
+
buyAmount: BigInt(quote.minAmountOut)
|
|
5108
|
+
},
|
|
5109
|
+
slippageBps,
|
|
5110
|
+
costs: {
|
|
5111
|
+
bridgingFee: {
|
|
5112
|
+
feeBps: slippageBps,
|
|
5113
|
+
amountInSellCurrency: BigInt(feeAmountInSellCurrency),
|
|
5114
|
+
amountInBuyCurrency: BigInt(feeAmountInBuyCurrency)
|
|
5115
|
+
}
|
|
5116
|
+
}
|
|
5117
|
+
}
|
|
5118
|
+
};
|
|
5119
|
+
}
|
|
5120
|
+
async getBridgeReceiverOverride(_request, quote) {
|
|
5121
|
+
return quote.depositAddress;
|
|
5122
|
+
}
|
|
5123
|
+
async getBridgingParams(_chainId, order, _txHash) {
|
|
5124
|
+
const depositAddress = order.receiver;
|
|
5125
|
+
if (!depositAddress)
|
|
5126
|
+
return null;
|
|
5127
|
+
const [tokens, status] = await Promise.all([this.api.getTokens(), this.api.getStatus(depositAddress)]);
|
|
5128
|
+
const qr = status.quoteResponse?.quoteRequest;
|
|
5129
|
+
const swapDetails = status.swapDetails;
|
|
5130
|
+
const quote = status.quoteResponse?.quote;
|
|
5131
|
+
const timestampMs = Date.parse(status.quoteResponse?.timestamp ?? "");
|
|
5132
|
+
if (!qr || !quote || Number.isNaN(timestampMs)) {
|
|
5133
|
+
throw new Error("Malformed quote response from NEAR Intents");
|
|
5134
|
+
}
|
|
5135
|
+
const quoteTimestamp = Math.floor(timestampMs / 1e3);
|
|
5136
|
+
const inputToken = tokens.find((t) => t.assetId === qr.originAsset);
|
|
5137
|
+
const outputToken = tokens.find((t) => t.assetId === qr.destinationAsset);
|
|
5138
|
+
if (!inputToken || !outputToken)
|
|
5139
|
+
throw new Error("Token not supported");
|
|
5140
|
+
const adaptedInput = adaptToken(inputToken);
|
|
5141
|
+
const adaptedOutput = adaptToken(outputToken);
|
|
5142
|
+
if (!adaptedInput?.chainId || !adaptedOutput?.chainId) {
|
|
5143
|
+
throw new Error("Token not supported");
|
|
5144
|
+
}
|
|
5145
|
+
return {
|
|
5146
|
+
status: {
|
|
5147
|
+
fillTimeInSeconds: quote.timeEstimate,
|
|
5148
|
+
status: NEAR_INTENTS_STATUS_TO_COW_STATUS[status.status] ?? "unknown" /* UNKNOWN */,
|
|
5149
|
+
fillTxHash: status.swapDetails?.destinationChainTxHashes?.[0]?.hash
|
|
5150
|
+
},
|
|
5151
|
+
params: {
|
|
5152
|
+
inputTokenAddress: inputToken.contractAddress ?? import_sdk_config11.ETH_ADDRESS,
|
|
5153
|
+
outputTokenAddress: outputToken.contractAddress ?? import_sdk_config11.ETH_ADDRESS,
|
|
5154
|
+
inputAmount: BigInt(quote.amountIn),
|
|
5155
|
+
outputAmount: swapDetails.amountOut ? BigInt(swapDetails.amountOut) : BigInt(quote.amountOut),
|
|
5156
|
+
owner: order.owner,
|
|
5157
|
+
quoteTimestamp,
|
|
5158
|
+
fillDeadline: quoteTimestamp + quote.timeEstimate,
|
|
5159
|
+
recipient: qr.recipient,
|
|
5160
|
+
sourceChainId: adaptedInput.chainId,
|
|
5161
|
+
destinationChainId: adaptedOutput.chainId,
|
|
5162
|
+
bridgingId: depositAddress
|
|
5163
|
+
// NEAR Intents deposit address
|
|
5164
|
+
}
|
|
5165
|
+
};
|
|
5166
|
+
}
|
|
5167
|
+
getExplorerUrl(bridgingId) {
|
|
5168
|
+
return `https://explorer.near-intents.org/transactions/${bridgingId}`;
|
|
5169
|
+
}
|
|
5170
|
+
async getStatus(bridgingId, _originChainId) {
|
|
5171
|
+
try {
|
|
5172
|
+
const statusResponse = await this.api.getStatus(bridgingId);
|
|
5173
|
+
return {
|
|
5174
|
+
status: NEAR_INTENTS_STATUS_TO_COW_STATUS[statusResponse.status] || "unknown" /* UNKNOWN */,
|
|
5175
|
+
depositTxHash: statusResponse.swapDetails?.originChainTxHashes[0]?.hash,
|
|
5176
|
+
fillTxHash: statusResponse.swapDetails?.destinationChainTxHashes[0]?.hash
|
|
5177
|
+
};
|
|
5178
|
+
} catch {
|
|
5179
|
+
return {
|
|
5180
|
+
status: "unknown" /* UNKNOWN */
|
|
5181
|
+
};
|
|
5182
|
+
}
|
|
5183
|
+
}
|
|
5184
|
+
getCancelBridgingTx(_bridgingId) {
|
|
5185
|
+
throw new Error("Not implemented");
|
|
5186
|
+
}
|
|
5187
|
+
getRefundBridgingTx(_bridgingId) {
|
|
5188
|
+
throw new Error("Not implemented");
|
|
5189
|
+
}
|
|
5190
|
+
async recoverDepositAddress({
|
|
5191
|
+
quote,
|
|
5192
|
+
quoteRequest,
|
|
5193
|
+
timestamp
|
|
5194
|
+
}) {
|
|
5195
|
+
try {
|
|
5196
|
+
if (!quote?.depositAddress)
|
|
5197
|
+
return null;
|
|
5198
|
+
const utils = (0, import_sdk_common17.getGlobalAdapter)().utils;
|
|
5199
|
+
const quoteHash = hashQuote({ quote, quoteRequest, timestamp });
|
|
5200
|
+
const depositAddr = utils.getChecksumAddress(quote.depositAddress);
|
|
5201
|
+
const { signature } = await this.api.getAttestation({
|
|
5202
|
+
quoteHash,
|
|
5203
|
+
depositAddress: depositAddr
|
|
5204
|
+
});
|
|
5205
|
+
if (!signature || !utils.isHexString(signature))
|
|
5206
|
+
return null;
|
|
5207
|
+
const payload = utils.hexConcat([depositAddr, quoteHash]);
|
|
5208
|
+
const messageBytes = utils.hexConcat([ATTESTATION_PREFIX_CONST, ATTESTION_VERSION_BYTE, payload]);
|
|
5209
|
+
const hash = utils.keccak256(messageBytes);
|
|
5210
|
+
return {
|
|
5211
|
+
address: await utils.recoverAddress(hash, signature),
|
|
5212
|
+
quoteHash
|
|
5213
|
+
};
|
|
5214
|
+
} catch {
|
|
5215
|
+
return null;
|
|
5216
|
+
}
|
|
5217
|
+
}
|
|
5218
|
+
};
|
|
4713
5219
|
// Annotate the CommonJS export names for ESM import in node:
|
|
4714
5220
|
0 && (module.exports = {
|
|
4715
5221
|
AcrossBridgeProvider,
|
|
@@ -4725,6 +5231,7 @@ var BungeeBridgeProvider = class {
|
|
|
4725
5231
|
DEFAULT_EXTRA_GAS_PROXY_CREATION,
|
|
4726
5232
|
DEFAULT_GAS_COST_FOR_HOOK_ESTIMATION,
|
|
4727
5233
|
HOOK_DAPP_BRIDGE_PROVIDER_PREFIX,
|
|
5234
|
+
NearIntentsBridgeProvider,
|
|
4728
5235
|
RAW_PROVIDERS_FILES_PATH,
|
|
4729
5236
|
assertIsBridgeQuoteAndPost,
|
|
4730
5237
|
assertIsQuoteAndPost,
|