@shapeshiftoss/swapper 20.3.0 → 20.4.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.
Files changed (179) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +15 -0
  3. package/dist/cjs/index.d.ts +2 -0
  4. package/dist/cjs/index.js +2 -0
  5. package/dist/cjs/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  6. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
  7. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
  8. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
  9. package/dist/cjs/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
  10. package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
  11. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
  12. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
  13. package/dist/cjs/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
  14. package/dist/cjs/swappers/ChainflipSwapper/types.d.ts +1 -0
  15. package/dist/cjs/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  16. package/dist/cjs/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
  17. package/dist/cjs/swappers/FyndSwapper/FyndSwapper.js +5 -0
  18. package/dist/cjs/swappers/FyndSwapper/endpoints.d.ts +2 -0
  19. package/dist/cjs/swappers/FyndSwapper/endpoints.js +14 -0
  20. package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  21. package/dist/cjs/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +43 -0
  22. package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  23. package/dist/cjs/swappers/FyndSwapper/getTradeRate/getTradeRate.js +34 -0
  24. package/dist/cjs/swappers/FyndSwapper/index.d.ts +2 -0
  25. package/dist/cjs/swappers/FyndSwapper/index.js +7 -0
  26. package/dist/cjs/swappers/FyndSwapper/types.d.ts +41 -0
  27. package/dist/cjs/swappers/FyndSwapper/types.js +2 -0
  28. package/dist/cjs/swappers/FyndSwapper/utils/constants.d.ts +33 -0
  29. package/dist/cjs/swappers/FyndSwapper/utils/constants.js +38 -0
  30. package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
  31. package/dist/cjs/swappers/FyndSwapper/utils/fetchFromFynd.js +42 -0
  32. package/dist/cjs/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
  33. package/dist/cjs/swappers/FyndSwapper/utils/fyndService.js +9 -0
  34. package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
  35. package/dist/cjs/swappers/FyndSwapper/utils/getFyndStepData.js +48 -0
  36. package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
  37. package/dist/cjs/swappers/FyndSwapper/utils/getFyndTradeContext.js +94 -0
  38. package/dist/cjs/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
  39. package/dist/cjs/swappers/FyndSwapper/utils/helpers.js +174 -0
  40. package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
  41. package/dist/cjs/swappers/FyndSwapper/utils/helpers.test.js +101 -0
  42. package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
  43. package/dist/cjs/swappers/PortalsSwapper/endpoints.js +4 -1
  44. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +1 -1
  45. package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
  46. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
  47. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.js +4 -0
  48. package/dist/cjs/swappers/RelaySwapper/utils/relayStatus.js +3 -3
  49. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +9 -4
  50. package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
  51. package/dist/cjs/swappers/SymbiosisSwapper/SymbiosisSwapper.js +8 -0
  52. package/dist/cjs/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
  53. package/dist/cjs/swappers/SymbiosisSwapper/endpoints.js +66 -0
  54. package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  55. package/dist/cjs/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +42 -0
  56. package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  57. package/dist/cjs/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +34 -0
  58. package/dist/cjs/swappers/SymbiosisSwapper/index.d.ts +2 -0
  59. package/dist/cjs/swappers/SymbiosisSwapper/index.js +7 -0
  60. package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
  61. package/dist/cjs/swappers/SymbiosisSwapper/utils/constants.js +64 -0
  62. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
  63. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +106 -0
  64. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
  65. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +161 -0
  66. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
  67. package/dist/cjs/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +146 -0
  68. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
  69. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.js +172 -0
  70. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
  71. package/dist/cjs/swappers/SymbiosisSwapper/utils/helpers.test.js +151 -0
  72. package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
  73. package/dist/cjs/swappers/SymbiosisSwapper/utils/symbiosisService.js +18 -0
  74. package/dist/cjs/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
  75. package/dist/cjs/swappers/SymbiosisSwapper/utils/types.js +11 -0
  76. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
  77. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  78. package/dist/cjs/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
  79. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +24 -1
  80. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
  81. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +110 -0
  82. package/dist/cjs/swappers/ZrxSwapper/types.d.ts +2 -1
  83. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
  84. package/dist/cjs/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +26 -0
  85. package/dist/cjs/types.d.ts +6 -5
  86. package/dist/cjs/types.js +2 -0
  87. package/dist/cjs/utils/helpers.d.ts +1 -2
  88. package/dist/cjs/utils/helpers.js +8 -32
  89. package/dist/cjs/utils/helpers.test.js +6 -2
  90. package/dist/esm/.tsbuildinfo +1 -1
  91. package/dist/esm/constants.js +15 -0
  92. package/dist/esm/index.d.ts +2 -0
  93. package/dist/esm/index.js +2 -0
  94. package/dist/esm/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  95. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +1 -2
  96. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +2 -1
  97. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.js +21 -15
  98. package/dist/esm/swappers/BebopSwapper/utils/getBebopSolanaTradeContext.js +1 -0
  99. package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +0 -2
  100. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +0 -2
  101. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +0 -2
  102. package/dist/esm/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +1 -2
  103. package/dist/esm/swappers/ChainflipSwapper/types.d.ts +1 -0
  104. package/dist/esm/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +0 -2
  105. package/dist/esm/swappers/FyndSwapper/FyndSwapper.d.ts +2 -0
  106. package/dist/esm/swappers/FyndSwapper/FyndSwapper.js +2 -0
  107. package/dist/esm/swappers/FyndSwapper/endpoints.d.ts +2 -0
  108. package/dist/esm/swappers/FyndSwapper/endpoints.js +11 -0
  109. package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  110. package/dist/esm/swappers/FyndSwapper/getTradeQuote/getTradeQuote.js +39 -0
  111. package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  112. package/dist/esm/swappers/FyndSwapper/getTradeRate/getTradeRate.js +30 -0
  113. package/dist/esm/swappers/FyndSwapper/index.d.ts +2 -0
  114. package/dist/esm/swappers/FyndSwapper/index.js +2 -0
  115. package/dist/esm/swappers/FyndSwapper/types.d.ts +41 -0
  116. package/dist/esm/swappers/FyndSwapper/types.js +1 -0
  117. package/dist/esm/swappers/FyndSwapper/utils/constants.d.ts +33 -0
  118. package/dist/esm/swappers/FyndSwapper/utils/constants.js +35 -0
  119. package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.d.ts +13 -0
  120. package/dist/esm/swappers/FyndSwapper/utils/fetchFromFynd.js +38 -0
  121. package/dist/esm/swappers/FyndSwapper/utils/fyndService.d.ts +5 -0
  122. package/dist/esm/swappers/FyndSwapper/utils/fyndService.js +3 -0
  123. package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.d.ts +25 -0
  124. package/dist/esm/swappers/FyndSwapper/utils/getFyndStepData.js +44 -0
  125. package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.d.ts +18 -0
  126. package/dist/esm/swappers/FyndSwapper/utils/getFyndTradeContext.js +90 -0
  127. package/dist/esm/swappers/FyndSwapper/utils/helpers.d.ts +24 -0
  128. package/dist/esm/swappers/FyndSwapper/utils/helpers.js +162 -0
  129. package/dist/esm/swappers/FyndSwapper/utils/helpers.test.d.ts +1 -0
  130. package/dist/esm/swappers/FyndSwapper/utils/helpers.test.js +99 -0
  131. package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +0 -1
  132. package/dist/esm/swappers/PortalsSwapper/endpoints.js +4 -1
  133. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +2 -2
  134. package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +2 -3
  135. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +1 -0
  136. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.js +5 -1
  137. package/dist/esm/swappers/RelaySwapper/utils/relayStatus.js +3 -3
  138. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +9 -4
  139. package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.d.ts +2 -0
  140. package/dist/esm/swappers/SymbiosisSwapper/SymbiosisSwapper.js +5 -0
  141. package/dist/esm/swappers/SymbiosisSwapper/endpoints.d.ts +2 -0
  142. package/dist/esm/swappers/SymbiosisSwapper/endpoints.js +63 -0
  143. package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.d.ts +4 -0
  144. package/dist/esm/swappers/SymbiosisSwapper/getTradeQuote/getTradeQuote.js +38 -0
  145. package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.d.ts +4 -0
  146. package/dist/esm/swappers/SymbiosisSwapper/getTradeRate/getTradeRate.js +30 -0
  147. package/dist/esm/swappers/SymbiosisSwapper/index.d.ts +2 -0
  148. package/dist/esm/swappers/SymbiosisSwapper/index.js +2 -0
  149. package/dist/esm/swappers/SymbiosisSwapper/utils/constants.d.ts +19 -0
  150. package/dist/esm/swappers/SymbiosisSwapper/utils/constants.js +61 -0
  151. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.d.ts +26 -0
  152. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.js +102 -0
  153. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.d.ts +1 -0
  154. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisStepData.test.js +159 -0
  155. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.d.ts +17 -0
  156. package/dist/esm/swappers/SymbiosisSwapper/utils/getSymbiosisTradeContext.js +139 -0
  157. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.d.ts +38 -0
  158. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.js +156 -0
  159. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.d.ts +1 -0
  160. package/dist/esm/swappers/SymbiosisSwapper/utils/helpers.test.js +149 -0
  161. package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.d.ts +5 -0
  162. package/dist/esm/swappers/SymbiosisSwapper/utils/symbiosisService.js +12 -0
  163. package/dist/esm/swappers/SymbiosisSwapper/utils/types.d.ts +83 -0
  164. package/dist/esm/swappers/SymbiosisSwapper/utils/types.js +8 -0
  165. package/dist/esm/swappers/ThorchainSwapper/generated/generatedThorLongtailTokens.json +1 -0
  166. package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  167. package/dist/esm/swappers/ThorchainSwapper/utils/getLongtailQuote.js +1 -1
  168. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +25 -2
  169. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.d.ts +1 -0
  170. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.test.js +108 -0
  171. package/dist/esm/swappers/ZrxSwapper/types.d.ts +2 -1
  172. package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.d.ts +1 -0
  173. package/dist/esm/swappers/ZrxSwapper/utils/getZrxNativeCheckDeadline.js +22 -0
  174. package/dist/esm/types.d.ts +6 -5
  175. package/dist/esm/types.js +2 -0
  176. package/dist/esm/utils/helpers.d.ts +1 -2
  177. package/dist/esm/utils/helpers.js +9 -33
  178. package/dist/esm/utils/helpers.test.js +6 -2
  179. package/package.json +7 -7
@@ -0,0 +1,25 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types';
3
+ import type { FyndEncodedQuote } from '../types';
4
+ type BaseArgs = {
5
+ quote: FyndEncodedQuote;
6
+ sellAmountCryptoBaseUnit: string;
7
+ spenderAddress: string;
8
+ };
9
+ export type GetFyndStepDataArgs = StepDataArgs<BaseArgs, {
10
+ from: string;
11
+ }>;
12
+ type FyndRateStepData = {
13
+ networkFeeCryptoBaseUnit: string | undefined;
14
+ };
15
+ type FyndQuoteStepData = {
16
+ transactionData: TxBuildData;
17
+ networkFeeCryptoBaseUnit: string;
18
+ };
19
+ export declare function getFyndStepData(args: Extract<GetFyndStepDataArgs, {
20
+ type: 'rate';
21
+ }>): Promise<Result<FyndRateStepData, SwapErrorRight>>;
22
+ export declare function getFyndStepData(args: Extract<GetFyndStepDataArgs, {
23
+ type: 'quote';
24
+ }>): Promise<Result<FyndQuoteStepData, SwapErrorRight>>;
25
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFyndStepData = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ const monads_1 = require("@sniptt/monads");
6
+ const utils_1 = require("../../../utils");
7
+ const evm_1 = require("../../../utils/evm");
8
+ async function getFyndStepData(args) {
9
+ const { quote, sellAsset, sellAmountCryptoBaseUnit, spenderAddress, from, type, input, deps } = args;
10
+ const adapter = deps.assertGetEvmChainAdapter(sellAsset.chainId);
11
+ const supportsEIP1559 = 'supportsEIP1559' in input ? input.supportsEIP1559 : false;
12
+ const transactionData = {
13
+ type: 'evm',
14
+ chainId: Number((0, caip_1.fromChainId)(sellAsset.chainId).chainReference),
15
+ to: quote.transaction.to,
16
+ data: quote.transaction.data,
17
+ value: quote.transaction.value,
18
+ };
19
+ const stateOverride = { sellAsset, sellAmountCryptoBaseUnit, spenderAddress };
20
+ if (type === 'rate') {
21
+ const networkFeeCryptoBaseUnit = await (0, evm_1.getEvmNetworkFeeCryptoBaseUnit)({
22
+ adapter,
23
+ transactionData,
24
+ from,
25
+ supportsEIP1559,
26
+ stateOverride,
27
+ })
28
+ .catch(() => (0, evm_1.getEvmNetworkFeeCryptoBaseUnit)({ adapter, supportsEIP1559, gasLimit: quote.gas_estimate }))
29
+ .catch(() => undefined);
30
+ const stepData = { networkFeeCryptoBaseUnit };
31
+ return (0, monads_1.Ok)(stepData);
32
+ }
33
+ try {
34
+ const networkFeeCryptoBaseUnit = await (0, evm_1.getEvmNetworkFeeCryptoBaseUnit)({
35
+ adapter,
36
+ transactionData,
37
+ from,
38
+ supportsEIP1559,
39
+ stateOverride,
40
+ });
41
+ const stepData = { transactionData, networkFeeCryptoBaseUnit };
42
+ return (0, monads_1.Ok)(stepData);
43
+ }
44
+ catch (error) {
45
+ return (0, monads_1.Err)((0, utils_1.makeNetworkFeeEstimationFailedErr)('getFyndStepData', error));
46
+ }
47
+ }
48
+ exports.getFyndStepData = getFyndStepData;
@@ -0,0 +1,18 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { QuoteFeeData, SwapErrorRight, SwapperDeps, TradeCommon, TradeStepCommon } from '../../../types';
3
+ import type { FyndTradeQuoteInput, FyndTradeRateInput } from '../types';
4
+ import type { GetFyndStepDataArgs } from './getFyndStepData';
5
+ type FyndTradeContext = {
6
+ tradeCommon: TradeCommon;
7
+ stepCommon: Omit<TradeStepCommon, 'feeData'>;
8
+ protocolFees: QuoteFeeData['protocolFees'];
9
+ deadline: number | undefined;
10
+ stepDataArgs: Omit<GetFyndStepDataArgs, 'type' | 'input'>;
11
+ };
12
+ export declare const getFyndTradeContext: ({ input, deps, from, to, }: {
13
+ input: FyndTradeQuoteInput | FyndTradeRateInput;
14
+ deps: SwapperDeps;
15
+ from: string;
16
+ to: string;
17
+ }) => Promise<Result<FyndTradeContext, SwapErrorRight>>;
18
+ export {};
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFyndTradeContext = void 0;
4
+ const utils_1 = require("@shapeshiftoss/utils");
5
+ const monads_1 = require("@sniptt/monads");
6
+ const uuid_1 = require("uuid");
7
+ const constants_1 = require("../../../constants");
8
+ const types_1 = require("../../../types");
9
+ const utils_2 = require("../../../utils");
10
+ const helpers_1 = require("../../../utils/helpers");
11
+ const fetchFromFynd_1 = require("./fetchFromFynd");
12
+ const helpers_2 = require("./helpers");
13
+ const getFyndTradeContext = async ({ input, deps, from, to, }) => {
14
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, affiliateBps } = input;
15
+ const maybeChainId = (0, helpers_2.assertValidTrade)({ sellAsset, buyAsset });
16
+ if (maybeChainId.isErr())
17
+ return (0, monads_1.Err)(maybeChainId.unwrapErr());
18
+ const chainId = maybeChainId.unwrap();
19
+ const slippageTolerancePercentageDecimal = input.slippageTolerancePercentageDecimal ??
20
+ (0, constants_1.getDefaultSlippageDecimalPercentageForSwapper)(types_1.SwapperName.Fynd);
21
+ const clientFeeBps = (0, helpers_2.getFyndClientFeeBps)(affiliateBps);
22
+ const maybeQuote = await (0, fetchFromFynd_1.fetchFromFynd)({
23
+ input,
24
+ chainId,
25
+ sender: from,
26
+ receiver: to,
27
+ slippageTolerancePercentageDecimal,
28
+ clientFeeBps,
29
+ baseUrl: deps.config.VITE_FYND_BASE_URL,
30
+ });
31
+ if (maybeQuote.isErr())
32
+ return (0, monads_1.Err)(maybeQuote.unwrapErr());
33
+ const quote = maybeQuote.unwrap();
34
+ const { router_fee: routerFee, client_fee: clientFee } = quote.fee_breakdown;
35
+ const buyAmountBeforeFeesCryptoBaseUnit = quote.amount_out;
36
+ const buyAmountAfterFeesCryptoBaseUnit = (0, utils_1.bn)(quote.amount_out)
37
+ .minus(routerFee)
38
+ .minus(clientFee)
39
+ .toFixed();
40
+ const rate = (0, utils_2.getInputOutputRate)({
41
+ sellAmountCryptoBaseUnit: quote.amount_in,
42
+ buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
43
+ sellAsset,
44
+ buyAsset,
45
+ });
46
+ const protocols = (0, helpers_2.getFyndRouteProtocols)(quote.route?.swaps);
47
+ const source = protocols.length
48
+ ? `${types_1.SwapperName.Fynd} • ${protocols.join(', ')}`
49
+ : types_1.SwapperName.Fynd;
50
+ const allowanceContract = (0, helpers_1.isNativeEvmAsset)(sellAsset.assetId) ? '' : quote.transaction.to;
51
+ const protocolFees = (0, utils_1.bn)(routerFee).gt(0)
52
+ ? {
53
+ [buyAsset.assetId]: {
54
+ amountCryptoBaseUnit: routerFee,
55
+ asset: buyAsset,
56
+ requiresBalance: false,
57
+ },
58
+ }
59
+ : {};
60
+ return (0, monads_1.Ok)({
61
+ tradeCommon: {
62
+ id: (0, uuid_1.v4)(),
63
+ rate,
64
+ swapperName: types_1.SwapperName.Fynd,
65
+ affiliateBps,
66
+ slippageTolerancePercentageDecimal,
67
+ },
68
+ stepCommon: {
69
+ estimatedExecutionTimeMs: 0,
70
+ allowanceContract,
71
+ rate,
72
+ sellAsset,
73
+ buyAsset,
74
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
75
+ buyAmountBeforeFeesCryptoBaseUnit,
76
+ buyAmountAfterFeesCryptoBaseUnit,
77
+ source,
78
+ affiliateFee: (0, utils_1.bn)(clientFee).gt(0)
79
+ ? { assetId: buyAsset.assetId, amountCryptoBaseUnit: clientFee, asset: buyAsset }
80
+ : undefined,
81
+ },
82
+ protocolFees,
83
+ deadline: quote.client_fee_deadline ? (0, helpers_1.normalizeEpochToMs)(quote.client_fee_deadline) : undefined,
84
+ stepDataArgs: {
85
+ quote,
86
+ sellAsset,
87
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
88
+ spenderAddress: allowanceContract,
89
+ from,
90
+ deps,
91
+ },
92
+ });
93
+ };
94
+ exports.getFyndTradeContext = getFyndTradeContext;
@@ -0,0 +1,24 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { Asset } from '@shapeshiftoss/types';
3
+ import type { Result } from '@sniptt/monads';
4
+ import type { Address } from 'viem';
5
+ import type { SwapErrorRight } from '../../../types';
6
+ import type { FyndEncodedQuote, FyndQuoteResponse, FyndRouteSwap } from '../types';
7
+ import type { FyndSupportedChainId } from './constants';
8
+ export declare const getFyndRouteProtocols: (swaps: FyndRouteSwap[] | undefined) => string[];
9
+ export declare const getFyndClientFeeBps: (affiliateBps: string) => number;
10
+ export declare const convertAssetIdToFyndToken: (assetId: AssetId) => Address;
11
+ export declare const assertValidTrade: ({ sellAsset, buyAsset, }: {
12
+ sellAsset: Asset;
13
+ buyAsset: Asset;
14
+ }) => Result<FyndSupportedChainId, SwapErrorRight>;
15
+ export declare const getFyndRequestError: (error: SwapErrorRight) => SwapErrorRight;
16
+ type FyndQuoteContext = {
17
+ chainId: FyndSupportedChainId;
18
+ sellAsset: Asset;
19
+ sellAmountCryptoBaseUnit: string;
20
+ slippageTolerancePercentageDecimal: string;
21
+ clientFeeBps: number;
22
+ };
23
+ export declare const validateFyndQuoteResponse: (response: FyndQuoteResponse, context: FyndQuoteContext) => Result<FyndEncodedQuote, SwapErrorRight>;
24
+ export {};
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateFyndQuoteResponse = exports.getFyndRequestError = exports.assertValidTrade = exports.convertAssetIdToFyndToken = exports.getFyndClientFeeBps = exports.getFyndRouteProtocols = void 0;
7
+ const caip_1 = require("@shapeshiftoss/caip");
8
+ const utils_1 = require("@shapeshiftoss/utils");
9
+ const monads_1 = require("@sniptt/monads");
10
+ const axios_1 = __importDefault(require("axios"));
11
+ const viem_1 = require("viem");
12
+ const types_1 = require("../../../types");
13
+ const utils_2 = require("../../../utils");
14
+ const helpers_1 = require("../../../utils/helpers");
15
+ const constants_1 = require("./constants");
16
+ const isFyndSupportedChainId = (chainId) => chainId in constants_1.FYND_CHAINS;
17
+ // Protocol ids look like uniswap_v3, vm:balancer_v2 or fallback:rfq:bebop
18
+ const formatFyndProtocol = (protocol) => protocol
19
+ .slice(protocol.lastIndexOf(':') + 1)
20
+ .split('_')
21
+ .map(word => /^v\d+$/.test(word) ? word.toUpperCase() : word.charAt(0).toUpperCase() + word.slice(1))
22
+ .join(' ');
23
+ // The native_wrapper hop is only the WETH wrap/unwrap around the real venues
24
+ const getFyndRouteProtocols = (swaps) => {
25
+ const venues = (swaps ?? [])
26
+ .map(swap => swap.protocol)
27
+ .filter(protocol => !protocol.endsWith('native_wrapper'));
28
+ return [...new Set(venues)].map(formatFyndProtocol);
29
+ };
30
+ exports.getFyndRouteProtocols = getFyndRouteProtocols;
31
+ const getFyndClientFeeBps = (affiliateBps) => (0, utils_1.bn)(affiliateBps).div(constants_1.FYND_CLIENT_FEE_SHARE).integerValue(utils_1.BigNumber.ROUND_CEIL).toNumber();
32
+ exports.getFyndClientFeeBps = getFyndClientFeeBps;
33
+ const convertAssetIdToFyndToken = (assetId) => {
34
+ if ((0, helpers_1.isNativeEvmAsset)(assetId))
35
+ return viem_1.zeroAddress;
36
+ return (0, viem_1.getAddress)((0, caip_1.fromAssetId)(assetId).assetReference);
37
+ };
38
+ exports.convertAssetIdToFyndToken = convertAssetIdToFyndToken;
39
+ const assertValidTrade = ({ sellAsset, buyAsset, }) => {
40
+ if (sellAsset.chainId !== buyAsset.chainId) {
41
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
42
+ message: 'Fynd does not support cross-chain trades',
43
+ code: types_1.TradeQuoteError.CrossChainNotSupported,
44
+ }));
45
+ }
46
+ if (!isFyndSupportedChainId(sellAsset.chainId)) {
47
+ return (0, monads_1.Err)((0, utils_2.makeSwapErrorRight)({
48
+ message: 'Fynd only supports configured EVM chains',
49
+ code: types_1.TradeQuoteError.UnsupportedChain,
50
+ }));
51
+ }
52
+ return (0, monads_1.Ok)(sellAsset.chainId);
53
+ };
54
+ exports.assertValidTrade = assertValidTrade;
55
+ const getFyndStatusError = (status, detail) => {
56
+ const code = (() => {
57
+ switch (status.toLowerCase()) {
58
+ case 'no_route_found':
59
+ case 'insufficient_liquidity':
60
+ return types_1.TradeQuoteError.NoRouteFound;
61
+ case 'timeout':
62
+ return types_1.TradeQuoteError.Timeout;
63
+ default:
64
+ return types_1.TradeQuoteError.QueryFailed;
65
+ }
66
+ })();
67
+ return (0, utils_2.makeSwapErrorRight)({
68
+ message: `Fynd quote failed: ${status}${detail ? ` (${detail})` : ''}`,
69
+ code,
70
+ });
71
+ };
72
+ const isFyndErrorResponse = (value) => typeof value === 'object' &&
73
+ value !== null &&
74
+ 'error' in value &&
75
+ typeof value.error === 'string' &&
76
+ 'code' in value &&
77
+ typeof value.code === 'string';
78
+ const getFyndRequestError = (error) => {
79
+ const { cause } = error;
80
+ if (!axios_1.default.isAxiosError(cause))
81
+ return error;
82
+ if (cause.response?.status === 429) {
83
+ return (0, utils_2.makeSwapErrorRight)({
84
+ message: 'Fynd rate limit exceeded',
85
+ code: types_1.TradeQuoteError.RateLimitExceeded,
86
+ });
87
+ }
88
+ const body = cause.response?.data;
89
+ if (isFyndErrorResponse(body))
90
+ return getFyndStatusError(body.code, body.error);
91
+ return (0, utils_2.makeSwapErrorRight)({
92
+ message: `Fynd request failed with status ${cause.response?.status}`,
93
+ code: types_1.TradeQuoteError.QueryFailed,
94
+ cause,
95
+ });
96
+ };
97
+ exports.getFyndRequestError = getFyndRequestError;
98
+ const invalidResponse = (message, details) => (0, utils_2.makeSwapErrorRight)({ message, details, code: types_1.TradeQuoteError.InvalidResponse });
99
+ const getQuoteError = (quote, { chainId, sellAsset, sellAmountCryptoBaseUnit, slippageTolerancePercentageDecimal, clientFeeBps, }) => {
100
+ const { transaction, fee_breakdown: fees } = quote;
101
+ const pinnedRouter = constants_1.FYND_CHAINS[chainId].routerAddress;
102
+ if (!(0, viem_1.isAddress)(transaction.to, { strict: false }) ||
103
+ !(0, viem_1.isAddressEqual)(transaction.to, pinnedRouter)) {
104
+ return invalidResponse(`Fynd router ${transaction.to} is not the pinned router ${pinnedRouter} for ${chainId}`);
105
+ }
106
+ if (!(0, utils_1.bn)(quote.amount_in).eq(sellAmountCryptoBaseUnit)) {
107
+ return invalidResponse('Fynd quoted a different sell amount', {
108
+ amountIn: quote.amount_in,
109
+ sellAmountCryptoBaseUnit,
110
+ });
111
+ }
112
+ const expectedValue = (0, helpers_1.isNativeEvmAsset)(sellAsset.assetId) ? sellAmountCryptoBaseUnit : '0';
113
+ if (!(0, utils_1.bn)(transaction.value).eq(expectedValue)) {
114
+ return invalidResponse('Fynd transaction value does not match the sell amount', {
115
+ value: transaction.value,
116
+ expectedValue,
117
+ });
118
+ }
119
+ // The router enforces min_amount_received, which may not be looser than the requested slippage
120
+ const netOutput = (0, utils_1.bn)(quote.amount_out).minus(fees.router_fee).minus(fees.client_fee);
121
+ const outputFloor = netOutput
122
+ .times((0, utils_1.bn)(1).minus(slippageTolerancePercentageDecimal))
123
+ .integerValue(utils_1.BigNumber.ROUND_DOWN);
124
+ if ((0, utils_1.bn)(fees.min_amount_received).lt(outputFloor)) {
125
+ return invalidResponse('Fynd output floor is below the requested slippage', {
126
+ minAmountReceived: fees.min_amount_received,
127
+ outputFloor: outputFloor.toFixed(),
128
+ slippageTolerancePercentageDecimal,
129
+ });
130
+ }
131
+ if (clientFeeBps === 0) {
132
+ if (!(0, utils_1.bn)(fees.client_fee).isZero()) {
133
+ return invalidResponse('Fynd returned an unexpected client fee', {
134
+ clientFee: fees.client_fee,
135
+ });
136
+ }
137
+ return;
138
+ }
139
+ // Our share of the gross client fee, allowing one unit of rounding
140
+ const minClientFee = (0, utils_1.bn)(quote.amount_out)
141
+ .times(clientFeeBps)
142
+ .div(10_000)
143
+ .times(constants_1.FYND_CLIENT_FEE_SHARE)
144
+ .integerValue(utils_1.BigNumber.ROUND_DOWN)
145
+ .minus(1);
146
+ if ((0, utils_1.bn)(fees.client_fee).lt(minClientFee)) {
147
+ return invalidResponse('Fynd client fee is below the requested share', {
148
+ clientFee: fees.client_fee,
149
+ amountOut: quote.amount_out,
150
+ clientFeeBps,
151
+ });
152
+ }
153
+ // The proxy patches the signature over Fynd's zeroed placeholder at the reported offset
154
+ const offset = transaction.client_fee_signature_offset;
155
+ const signature = typeof offset === 'number'
156
+ ? transaction.data.slice(2 + offset * 2, 2 + (offset + constants_1.FYND_CLIENT_FEE_SIGNATURE_BYTES) * 2)
157
+ : '';
158
+ if (signature.length !== constants_1.FYND_CLIENT_FEE_SIGNATURE_BYTES * 2 || /^0+$/.test(signature)) {
159
+ return invalidResponse('Fynd quote is not signed for the client fee', { offset });
160
+ }
161
+ if (!quote.client_fee_deadline) {
162
+ return invalidResponse('Fynd quote is missing its client fee deadline');
163
+ }
164
+ };
165
+ const validateFyndQuoteResponse = (response, context) => {
166
+ const order = Array.isArray(response?.orders) ? response.orders[0] : undefined;
167
+ if (!order)
168
+ return (0, monads_1.Err)(invalidResponse('Fynd returned no order'));
169
+ if (order.status !== 'success')
170
+ return (0, monads_1.Err)(getFyndStatusError(order.status));
171
+ const error = getQuoteError(order, context);
172
+ return error ? (0, monads_1.Err)(error) : (0, monads_1.Ok)(order);
173
+ };
174
+ exports.validateFyndQuoteResponse = validateFyndQuoteResponse;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const types_1 = require("@shapeshiftoss/types");
4
+ const vitest_1 = require("vitest");
5
+ const assets_1 = require("../../../utils/test-data/assets");
6
+ const constants_1 = require("./constants");
7
+ const helpers_1 = require("./helpers");
8
+ (0, vitest_1.describe)('getFyndClientFeeBps', () => {
9
+ vitest_1.it.each([
10
+ ['nets the default fee after the 20% share', '60', 75],
11
+ ['rounds up so the net never falls short', '55', 69],
12
+ ['requests nothing for a fee-free swap', '0', 0],
13
+ ])('%s', (_label, affiliateBps, grossBps) => {
14
+ (0, vitest_1.expect)((0, helpers_1.getFyndClientFeeBps)(affiliateBps)).toBe(grossBps);
15
+ });
16
+ });
17
+ (0, vitest_1.describe)('validateFyndQuoteResponse', () => {
18
+ const router = constants_1.FYND_CHAINS['eip155:1'].routerAddress;
19
+ const unpinnedRouter = '0x1111111111111111111111111111111111111111';
20
+ const transaction = {
21
+ to: router,
22
+ value: '0',
23
+ data: '0x12345678',
24
+ client_fee_signature_offset: null,
25
+ };
26
+ const fees = { router_fee: '10', client_fee: '0', max_slippage: '4', min_amount_received: '986' };
27
+ const order = {
28
+ status: 'success',
29
+ amount_in: '1000',
30
+ amount_out: '1000',
31
+ gas_estimate: '21000',
32
+ transaction,
33
+ fee_breakdown: fees,
34
+ };
35
+ const context = {
36
+ chainId: types_1.KnownChainIds.EthereumMainnet,
37
+ sellAsset: assets_1.WETH,
38
+ sellAmountCryptoBaseUnit: '1000',
39
+ slippageTolerancePercentageDecimal: '0.005',
40
+ clientFeeBps: 0,
41
+ };
42
+ const validate = (overrides, contextOverrides = {}) => (0, helpers_1.validateFyndQuoteResponse)({ orders: [{ ...order, ...overrides }] }, { ...context, ...contextOverrides });
43
+ (0, vitest_1.it)('accepts a quote that matches the request', () => {
44
+ (0, vitest_1.expect)(validate({}).isOk()).toBe(true);
45
+ });
46
+ vitest_1.it.each([
47
+ ['an unpinned router', { transaction: { ...transaction, to: unpinnedRouter } }],
48
+ ['a different sell amount', { amount_in: '999' }],
49
+ ['native value on a token sell', { transaction: { ...transaction, value: '1' } }],
50
+ [
51
+ 'an output floor looser than the slippage',
52
+ { fee_breakdown: { ...fees, min_amount_received: '984' } },
53
+ ],
54
+ ['a client fee we did not request', { fee_breakdown: { ...fees, client_fee: '1' } }],
55
+ ])('rejects %s', (_label, overrides) => {
56
+ (0, vitest_1.expect)(validate(overrides).isErr()).toBe(true);
57
+ });
58
+ (0, vitest_1.it)('binds native transaction value to the requested sell amount', () => {
59
+ (0, vitest_1.expect)(validate({}, { sellAsset: assets_1.ETH }).isErr()).toBe(true);
60
+ (0, vitest_1.expect)(validate({ transaction: { ...transaction, value: '1000' } }, { sellAsset: assets_1.ETH }).isOk()).toBe(true);
61
+ });
62
+ (0, vitest_1.it)('maps a missing route to NoRouteFound', () => {
63
+ const result = (0, helpers_1.validateFyndQuoteResponse)({ orders: [{ status: 'no_route_found' }] }, context);
64
+ (0, vitest_1.expect)(result.unwrapErr().code).toBe('NoRouteFound');
65
+ });
66
+ (0, vitest_1.describe)('with a client fee', () => {
67
+ const feeContext = { clientFeeBps: 75 };
68
+ const feeOrder = {
69
+ transaction: {
70
+ ...transaction,
71
+ data: `0x12345678${'ab'.repeat(65)}`,
72
+ client_fee_signature_offset: 4,
73
+ },
74
+ fee_breakdown: {
75
+ router_fee: '2',
76
+ client_fee: '6',
77
+ max_slippage: '4',
78
+ min_amount_received: '988',
79
+ },
80
+ client_fee_deadline: 1_900_000_000,
81
+ };
82
+ (0, vitest_1.it)('accepts a signed quote carrying our share of the fee', () => {
83
+ (0, vitest_1.expect)(validate(feeOrder, feeContext).isOk()).toBe(true);
84
+ });
85
+ vitest_1.it.each([
86
+ [
87
+ 'a fee below our share',
88
+ {
89
+ fee_breakdown: { ...feeOrder.fee_breakdown, client_fee: '4', min_amount_received: '990' },
90
+ },
91
+ ],
92
+ [
93
+ 'an unsigned placeholder',
94
+ { transaction: { ...feeOrder.transaction, data: `0x12345678${'00'.repeat(65)}` } },
95
+ ],
96
+ ['a missing deadline', { client_fee_deadline: null }],
97
+ ])('rejects %s', (_label, overrides) => {
98
+ (0, vitest_1.expect)(validate({ ...feeOrder, ...overrides }, feeContext).isErr()).toBe(true);
99
+ });
100
+ });
101
+ });
@@ -4,7 +4,6 @@
4
4
  "ARB.ETH": "eip155:42161/slip44:60",
5
5
  "ARB.GLD-0XAFD091F140C21770F4E5D53D26B2859AE97555AA": "eip155:42161/erc20:0xafd091f140c21770f4e5d53d26b2859ae97555aa",
6
6
  "ARB.LEO-0X93864D81175095DD93360FFA2A529B8642F76A6E": "eip155:42161/erc20:0x93864d81175095dd93360ffa2a529b8642f76a6e",
7
- "ARB.LINK-0XF97F4DF75117A78C1A5A0DBB814AF92458539FB4": "eip155:42161/erc20:0xf97f4df75117a78c1a5a0dbb814af92458539fb4",
8
7
  "ARB.PEPE-0X25D887CE7A35172C62FEBFD67A1856F20FAEBB00": "eip155:42161/erc20:0x25d887ce7a35172c62febfd67a1856f20faebb00",
9
8
  "ARB.TGT-0X429FED88F10285E61B12BDF00848315FBDFCC341": "eip155:42161/erc20:0x429fed88f10285e61b12bdf00848315fbdfcc341",
10
9
  "ARB.USDC-0XAF88D065E77C8CC2239327C5EDB3A432268E5831": "eip155:42161/erc20:0xaf88d065e77c8cc2239327c5edb3a432268e5831",
@@ -62,7 +62,7 @@ exports.portalsApi = {
62
62
  const txStatus = relayTxStatus === unchained_client_1.TxStatus.Unknown ? unchained_client_1.TxStatus.Pending : relayTxStatus;
63
63
  return {
64
64
  status: txStatus,
65
- buyTxHash: relayRequest.data?.outTxs?.[0]?.hash,
65
+ buyTxHash: relayRequest.data?.outTxs?.[0]?.txHash,
66
66
  message: txStatus === unchained_client_1.TxStatus.Failed
67
67
  ? (0, relayStatus_1.getRelayRequestFailureMessage)(relayRequest)
68
68
  : txStatus === unchained_client_1.TxStatus.Confirmed
@@ -71,6 +71,9 @@ exports.portalsApi = {
71
71
  };
72
72
  }
73
73
  }
74
+ else {
75
+ console.error('Failed to fetch relay request:', relayResult.unwrapErr());
76
+ }
74
77
  const axelarscanResult = await (0, fetchAxelarscanStatus_1.fetchAxelarscanBridgeStatus)(txHash);
75
78
  if (axelarscanResult.isOk()) {
76
79
  const bridgeStatus = axelarscanResult.unwrap();
@@ -141,7 +141,7 @@ const getPortalsTradeQuote = async (input, deps) => {
141
141
  const tradeQuote = {
142
142
  ...tradeCommon,
143
143
  quoteOrRate: 'quote',
144
- deadline: expiryMs ?? Date.now() + helpers_1.FALLBACK_QUOTE_DEADLINE_MS,
144
+ deadline: expiryMs,
145
145
  receiveAddress,
146
146
  steps: [
147
147
  {
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getExactOutputTradeQuote = exports.getTradeQuote = void 0;
4
4
  const monads_1 = require("@sniptt/monads");
5
5
  const utils_1 = require("../../../utils");
6
- const helpers_1 = require("../../../utils/helpers");
7
6
  const getRelayStepData_1 = require("../utils/getRelayStepData");
8
7
  const getRelayTradeContext_1 = require("../utils/getRelayTradeContext");
9
8
  const getQuote = async (input, deps, relayChainMap) => {
@@ -15,7 +14,7 @@ const getQuote = async (input, deps, relayChainMap) => {
15
14
  const maybeContext = await (0, getRelayTradeContext_1.getRelayTradeContext)({ input, deps, relayChainMap });
16
15
  if (maybeContext.isErr())
17
16
  return (0, monads_1.Err)(maybeContext.unwrapErr());
18
- const { tradeCommon, stepCommon, protocolFees, relayStepInputs, stepDataArgs, relayId } = maybeContext.unwrap();
17
+ const { tradeCommon, stepCommon, protocolFees, relayStepInputs, stepDataArgs, relayId, deadline, } = maybeContext.unwrap();
19
18
  const stepResults = await Promise.all(relayStepInputs.map(async ({ data, allowanceContract }) => {
20
19
  const maybeStepData = await (0, getRelayStepData_1.getRelayStepData)({
21
20
  ...stepDataArgs,
@@ -45,7 +44,7 @@ const getQuote = async (input, deps, relayChainMap) => {
45
44
  const tradeQuote = {
46
45
  ...tradeCommon,
47
46
  quoteOrRate: 'quote',
48
- deadline: Date.now() + helpers_1.FALLBACK_QUOTE_DEADLINE_MS,
47
+ deadline,
49
48
  receiveAddress,
50
49
  steps,
51
50
  };
@@ -13,6 +13,7 @@ type RelayTradeContext = {
13
13
  }[];
14
14
  stepDataArgs: Omit<GetRelayStepDataArgs, 'type' | 'input' | 'data' | 'spenderAddress'>;
15
15
  relayId: string;
16
+ deadline: number | undefined;
16
17
  };
17
18
  export declare const getRelayTradeContext: ({ input, deps, relayChainMap, }: {
18
19
  input: RelayTradeQuoteInput | RelayTradeRateInput | RelayExactOutputTradeQuoteInput | RelayExactOutputTradeRateInput;
@@ -264,6 +264,9 @@ const getRelayTradeContext = async ({ input, deps, relayChainMap, }) => {
264
264
  .plus(appFeesBaseUnit)
265
265
  .toFixed();
266
266
  const relayId = quote.steps[0].requestId;
267
+ // Only cross-chain (protocol v2) orders carry an expiry; past it the solver submits a no-fill refund
268
+ const orderDeadline = quote.protocol?.v2?.orderData?.output?.deadline;
269
+ const deadline = orderDeadline === undefined ? undefined : (0, helpers_1.normalizeEpochToMs)(orderDeadline);
267
270
  const relayStepInputs = swapSteps.map(step => {
268
271
  const data = step.items?.[0]?.data;
269
272
  return { data, allowanceContract: (0, helpers_2.getRelayAllowanceContract)(data) };
@@ -307,6 +310,7 @@ const getRelayTradeContext = async ({ input, deps, relayChainMap, }) => {
307
310
  ...appFeesAsProtocolFee,
308
311
  },
309
312
  relayStepInputs,
313
+ deadline,
310
314
  stepDataArgs: {
311
315
  sellAsset,
312
316
  sellAmountCryptoBaseUnit,
@@ -25,14 +25,14 @@ const relayStatusToTxStatus = (status) => {
25
25
  exports.relayStatusToTxStatus = relayStatusToTxStatus;
26
26
  // Relay index requests by origin tx hash, resolving a swap we hold no relayId for
27
27
  const fetchRelayRequestByTxHash = async (txHash, config) => {
28
- const maybeResponse = await relayService_1.relayService.get(`${config.VITE_RELAY_API_URL}/requests/v2?hash=${txHash}`, (0, relayService_1.getRelayRequestConfig)(config));
28
+ const maybeResponse = await relayService_1.relayService.get(`${config.VITE_RELAY_API_URL}/requests/v3?depositTxHash=${txHash}`, (0, relayService_1.getRelayRequestConfig)(config));
29
29
  // Match the origin tx ourselves rather than trusting the listing to have filtered on it
30
- return maybeResponse.map(({ data }) => data.requests?.find(({ data: request }) => request?.inTxs?.some(({ hash }) => hash?.toLowerCase() === txHash.toLowerCase())));
30
+ return maybeResponse.map(({ data }) => data.requests?.find(({ data: request }) => request?.inTxs?.some(({ txHash: hash }) => hash?.toLowerCase() === txHash.toLowerCase())));
31
31
  };
32
32
  exports.fetchRelayRequestByTxHash = fetchRelayRequestByTxHash;
33
33
  const getRelayRequestFailureMessage = (request) => {
34
34
  const { failReason, refundFailReason } = request.data ?? {};
35
- // Relay report 'N/A' rather than omitting the reason when there isn't one
35
+ // Relay can report 'N/A' rather than null when there isn't one
36
36
  const reason = [failReason, refundFailReason].find(value => value && value !== 'N/A');
37
37
  return reason ?? 'Bridge failed';
38
38
  };
@@ -9,12 +9,12 @@ export type RelayMetadata = {
9
9
  data?: string;
10
10
  };
11
11
  export type RelayRequestTransaction = {
12
- hash?: string;
12
+ txHash?: string;
13
13
  chainId?: number;
14
14
  };
15
15
  export type RelayRequestData = {
16
- failReason?: string;
17
- refundFailReason?: string;
16
+ failReason?: string | null;
17
+ refundFailReason?: string | null;
18
18
  inTxs?: RelayRequestTransaction[];
19
19
  outTxs?: RelayRequestTransaction[];
20
20
  };
@@ -121,9 +121,14 @@ export type RelayQuoteStep = {
121
121
  requestId: string;
122
122
  items?: RelayQuoteItem[];
123
123
  };
124
+ export type RelayOrderData = {
125
+ output?: {
126
+ deadline?: number;
127
+ };
128
+ };
124
129
  export type RelayProtocolV2 = {
125
130
  orderId: string | undefined;
126
- orderData?: unknown;
131
+ orderData?: RelayOrderData;
127
132
  paymentDetails?: {
128
133
  chainId: string;
129
134
  depository: string;
@@ -0,0 +1,2 @@
1
+ import type { Swapper } from '../../types';
2
+ export declare const symbiosisSwapper: Swapper;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.symbiosisSwapper = void 0;
4
+ const utils_1 = require("../../utils");
5
+ exports.symbiosisSwapper = {
6
+ executeEvmTransaction: utils_1.executeEvmTransaction,
7
+ executeTronTransaction: utils_1.executeTronTransaction,
8
+ };
@@ -0,0 +1,2 @@
1
+ import type { SwapperApi } from '../../types';
2
+ export declare const symbiosisApi: SwapperApi;