@cowprotocol/sdk-bridging 0.6.0 → 0.7.0

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