@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/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 postHooks = getPostHooks(fullAppData);
145
- const bridgingHook = postHooks.find((hook) => {
146
- return hook.dappId?.startsWith(HOOK_DAPP_BRIDGE_PROVIDER_PREFIX);
147
- });
148
- if (!bridgingHook) {
149
- return void 0;
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, orderId, tradeTxHash) || {};
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
- intermediateTokensCache?.set(cacheKey, intermediateTokens);
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 { swapResult } = await getBridgeProviderQuote(signer, advancedSettings).catch((error) => {
429
- signingStepManager?.onBridgingSignError?.();
430
- throw error;
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, config) {
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 createBridgeQuoteTimeoutPromise(timeoutMs, prefix) {
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, config) {
783
+ async function executeProviderQuotes(promises, timeout, providers) {
736
784
  try {
737
785
  await Promise.race([
738
786
  Promise.allSettled(promises),
739
- createBridgeQuoteTimeoutPromise(timeout, `Multi-quote with ${config.providers.length}`)
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, config) {
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, config.providers);
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, config);
864
+ const promise = this.createProviderQuotePromise(context, tradingSdk);
817
865
  promises.push(promise);
818
866
  }
819
- await executeProviderQuotes(promises, totalTimeout, config);
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, config) {
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: config.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
- createBridgeQuoteTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
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, config) {
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, config.providers);
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, config);
947
+ const promise = this.createBestQuoteProviderPromise(context, tradingSdk);
900
948
  promises.push(promise);
901
949
  }
902
- await executeProviderQuotes(promises, totalTimeout, config);
950
+ await executeProviderQuotes(promises, totalTimeout, providers);
903
951
  return bestResult.current || firstError.current;
904
952
  }
905
- createBestQuoteProviderPromise(context, config) {
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: config.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
- createBridgeQuoteTimeoutPromise(providerTimeout, `Provider ${provider.info.dappId}`)
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
- // 5 minutes
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
- get provider() {
1011
- const { providers } = this.config;
1012
- if (!providers[0]) {
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
- getProviders() {
1021
- return this.config.providers;
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
- return this.provider.getNetworks();
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 providerId = this.provider.info.dappId;
1042
- const cacheKey = getCacheKey({
1043
- id: providerId,
1044
- buyChainId: params.buyChainId.toString(),
1045
- sellChainId: params.sellChainId?.toString(),
1046
- tokenAddress: params.sellTokenAddress
1047
- });
1048
- const cached = this.cacheConfig.enabled && this.buyTokensCache.get(cacheKey);
1049
- if (cached) {
1050
- return cached;
1051
- }
1052
- const result = await this.provider.getBuyTokens(params);
1053
- if (this.cacheConfig.enabled) {
1054
- this.buyTokensCache.set(cacheKey, result);
1055
- }
1056
- return result;
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.config.providers
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.getProviders());
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.config.providers.find((provider) => provider.info.dappId === dappId);
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 = "HookBridgeProvider";
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, orderUid, txHash) {
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 = 0;
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: BigInt(feeBuyToken)
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 = "HookBridgeProvider";
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, orderId, _txHash) {
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,