@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
@@ -7,9 +7,11 @@ const types_1 = require("../../../types");
7
7
  const utils_1 = require("../../../utils");
8
8
  const helpers_1 = require("../../../utils/helpers");
9
9
  const fetchFromZrx_1 = require("../utils/fetchFromZrx");
10
+ const getZrxNativeCheckDeadline_1 = require("../utils/getZrxNativeCheckDeadline");
10
11
  const getZrxStepData_1 = require("../utils/getZrxStepData");
11
12
  const getZrxTradeContext_1 = require("../utils/getZrxTradeContext");
12
13
  const helpers_2 = require("../utils/helpers");
14
+ const isValidDeadlineSeconds = (deadline) => Number.isSafeInteger(deadline) && deadline > 0 && Number.isSafeInteger(deadline * 1000);
13
15
  const getZrxTradeQuote = async (input, deps) => {
14
16
  const { sellAsset, buyAsset, accountNumber, affiliateBps, sellAmountIncludingProtocolFeesCryptoBaseUnit, } = input;
15
17
  const maybeAddresses = (0, utils_1.assertQuoteAddresses)(input);
@@ -42,6 +44,16 @@ const getZrxTradeQuote = async (input, deps) => {
42
44
  return (0, monads_1.Err)(maybeZrxQuoteResponse.unwrapErr());
43
45
  const { sellAmount, buyAmount, fees, permit2, transaction, route } = maybeZrxQuoteResponse.unwrap();
44
46
  const permit2Eip712 = permit2?.eip712;
47
+ const permit2Deadline = permit2Eip712 ? Number(permit2Eip712.message.deadline) : undefined;
48
+ if (permit2Deadline !== undefined &&
49
+ ((typeof permit2Eip712?.message.deadline !== 'string' &&
50
+ typeof permit2Eip712?.message.deadline !== 'number') ||
51
+ !isValidDeadlineSeconds(permit2Deadline))) {
52
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
53
+ message: 'Invalid Permit2 deadline from 0x response',
54
+ code: types_1.TradeQuoteError.InvalidResponse,
55
+ }));
56
+ }
45
57
  if (!(0, helpers_1.isNativeEvmAsset)(sellAsset.assetId) && !(0, helpers_2.isWrappedNativeSell)(route) && !permit2Eip712) {
46
58
  return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
47
59
  message: 'Missing required Permit2 metadata from 0x response',
@@ -56,6 +68,17 @@ const getZrxTradeQuote = async (input, deps) => {
56
68
  details: { transaction, permit2Eip712 },
57
69
  }));
58
70
  }
71
+ // Permit2 calldata is not decodable until the signature is spliced in, so only native sells are read
72
+ const nativeCheckDeadline = permit2Eip712
73
+ ? undefined
74
+ : (0, getZrxNativeCheckDeadline_1.getZrxNativeCheckDeadline)(transaction.data);
75
+ if (nativeCheckDeadline !== undefined && !isValidDeadlineSeconds(nativeCheckDeadline)) {
76
+ return (0, monads_1.Err)((0, utils_1.makeSwapErrorRight)({
77
+ message: 'Invalid NATIVE_CHECK deadline in 0x calldata',
78
+ code: types_1.TradeQuoteError.InvalidResponse,
79
+ }));
80
+ }
81
+ const deadlineSeconds = permit2Deadline ?? nativeCheckDeadline;
59
82
  const maybeContext = (0, getZrxTradeContext_1.getZrxTradeContext)({
60
83
  input,
61
84
  deps,
@@ -79,7 +102,7 @@ const getZrxTradeQuote = async (input, deps) => {
79
102
  const tradeQuote = {
80
103
  ...tradeCommon,
81
104
  quoteOrRate: 'quote',
82
- deadline: Date.now() + helpers_1.FALLBACK_QUOTE_DEADLINE_MS,
105
+ deadline: deadlineSeconds === undefined ? undefined : deadlineSeconds * 1000,
83
106
  receiveAddress,
84
107
  steps: [
85
108
  {
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const types_1 = require("@shapeshiftoss/types");
4
+ const monads_1 = require("@sniptt/monads");
5
+ const vitest_1 = require("vitest");
6
+ const types_2 = require("../../../types");
7
+ const assets_1 = require("../../../utils/test-data/assets");
8
+ const fetchFromZrx_1 = require("../utils/fetchFromZrx");
9
+ const getZrxTradeQuote_1 = require("./getZrxTradeQuote");
10
+ vitest_1.vi.mock('../utils/fetchFromZrx', () => ({ fetchZrxQuote: vitest_1.vi.fn() }));
11
+ vitest_1.vi.mock('../utils/getZrxStepData', () => ({
12
+ getZrxStepData: vitest_1.vi.fn(({ permit2Eip712 }) => Promise.resolve((0, monads_1.Ok)({
13
+ transactionData: {
14
+ type: 'evm',
15
+ chainId: 1,
16
+ to: '0x1111111111111111111111111111111111111111',
17
+ data: '0x1234',
18
+ value: '0',
19
+ ...(permit2Eip712 && {
20
+ signatureRequired: { type: 'permit2', eip712: permit2Eip712 },
21
+ }),
22
+ },
23
+ networkFeeCryptoBaseUnit: '100000',
24
+ }))),
25
+ }));
26
+ const input = {
27
+ sellAsset: assets_1.WETH,
28
+ buyAsset: assets_1.USDC_MAINNET,
29
+ sellAmountIncludingProtocolFeesCryptoBaseUnit: '1000000000000000000',
30
+ sendAddress: '0x1111111111111111111111111111111111111111',
31
+ receiveAddress: '0x1111111111111111111111111111111111111111',
32
+ accountNumber: 0,
33
+ affiliateBps: '0',
34
+ allowMultiHop: false,
35
+ quoteOrRate: 'quote',
36
+ chainId: types_1.KnownChainIds.EthereumMainnet,
37
+ supportsEIP1559: true,
38
+ };
39
+ const deps = {
40
+ assetsById: {},
41
+ config: { VITE_ZRX_BASE_URL: 'https://example.com' },
42
+ };
43
+ const typedData = (deadline) => ({
44
+ domain: { name: 'Permit2', chainId: 1 },
45
+ types: { PermitTransferFrom: [{ name: 'deadline', type: 'uint256' }] },
46
+ primaryType: 'PermitTransferFrom',
47
+ message: { deadline },
48
+ });
49
+ // Live Settler calldata for an ETH -> USDC sell, NATIVE_CHECK deadline 1791997786
50
+ const nativeSellCalldata = '0x1fff991f000000000000000000000000ea8eb5ba11a3ea66f417ae29abf70c6fb4ba9626000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000e750ef800000000000000000000000000000000000000000000000000000000000000a0939d83c32b72441d72643cf60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000044bd01c226000000000000000000000000000000000000000000000000000000006acfb75a000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010438c9c147000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000024d0e30db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e48d68a156000000000000000000000000666fedd4cdd4e890a5ad20e7b60975409435a64a00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c02aaa39b223fe8d0a0e5c4f27ead9083c756cc201000064fffd8963efd1fc6a506488495d951d5263988d25a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008434ee90ca000000000000000000000000f5c4f3dc02c3fb9279495a8fef7b0741da956157000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000e9a9ab900000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000';
51
+ const quoteResponse = (eip712, data = '0x1234') => ({
52
+ blockNumber: '1',
53
+ buyAmount: '1000000',
54
+ buyToken: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
55
+ sellAmount: input.sellAmountIncludingProtocolFeesCryptoBaseUnit,
56
+ sellToken: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
57
+ fees: { integratorFee: null, zeroExFee: null, gasFee: null },
58
+ issues: { allowance: null, balance: null, simulationIncomplete: false, invalidSourcesPassed: [] },
59
+ liquidityAvailable: true,
60
+ minBuyAmount: '990000',
61
+ route: { fills: [], tokens: [] },
62
+ tokenMetadata: {
63
+ buyToken: { buyTaxBps: null, sellTaxBps: null },
64
+ sellToken: { buyTaxBps: null, sellTaxBps: null },
65
+ },
66
+ totalNetworkFee: null,
67
+ zid: 'test',
68
+ permit2: eip712 ? { type: 'Permit2', hash: '0x1234', eip712 } : null,
69
+ transaction: {
70
+ to: '0x1111111111111111111111111111111111111111',
71
+ data,
72
+ gas: '100000',
73
+ gasPrice: '1000000000',
74
+ value: '0',
75
+ },
76
+ });
77
+ (0, vitest_1.describe)('getZrxTradeQuote Permit2 deadline', () => {
78
+ (0, vitest_1.beforeEach)(() => {
79
+ vitest_1.vi.mocked(fetchFromZrx_1.fetchZrxQuote).mockResolvedValue((0, monads_1.Ok)(quoteResponse(typedData('1791934983'))));
80
+ });
81
+ vitest_1.it.each(['1791934983', 1791934983])('uses the provider deadline in milliseconds (%s)', async (deadline) => {
82
+ const eip712 = typedData(deadline);
83
+ vitest_1.vi.mocked(fetchFromZrx_1.fetchZrxQuote).mockResolvedValue((0, monads_1.Ok)(quoteResponse(eip712)));
84
+ const result = await (0, getZrxTradeQuote_1.getZrxTradeQuote)(input, deps);
85
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
86
+ const [quote] = result.unwrap();
87
+ (0, vitest_1.expect)(quote.deadline).toBe(1791934983000);
88
+ (0, vitest_1.expect)(quote.steps[0].transactionData).toMatchObject({
89
+ signatureRequired: { eip712 },
90
+ });
91
+ });
92
+ vitest_1.it.each([undefined, null, true, '', 'invalid', '-1', '1.5', '9007199254740991'])('rejects an invalid Permit2 deadline (%s)', async (deadline) => {
93
+ vitest_1.vi.mocked(fetchFromZrx_1.fetchZrxQuote).mockResolvedValue((0, monads_1.Ok)(quoteResponse(typedData(deadline))));
94
+ const result = await (0, getZrxTradeQuote_1.getZrxTradeQuote)(input, deps);
95
+ (0, vitest_1.expect)(result.isErr()).toBe(true);
96
+ (0, vitest_1.expect)(result.unwrapErr().code).toBe(types_2.TradeQuoteError.InvalidResponse);
97
+ });
98
+ (0, vitest_1.it)('reads the NATIVE_CHECK deadline from native-token sell calldata', async () => {
99
+ vitest_1.vi.mocked(fetchFromZrx_1.fetchZrxQuote).mockResolvedValue((0, monads_1.Ok)(quoteResponse(null, nativeSellCalldata)));
100
+ const result = await (0, getZrxTradeQuote_1.getZrxTradeQuote)({ ...input, sellAsset: assets_1.ETH }, deps);
101
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
102
+ (0, vitest_1.expect)(result.unwrap()[0].deadline).toBe(1791997786000);
103
+ });
104
+ (0, vitest_1.it)('leaves native-token quotes without a NATIVE_CHECK action free of a fabricated deadline', async () => {
105
+ vitest_1.vi.mocked(fetchFromZrx_1.fetchZrxQuote).mockResolvedValue((0, monads_1.Ok)(quoteResponse(null)));
106
+ const result = await (0, getZrxTradeQuote_1.getZrxTradeQuote)({ ...input, sellAsset: assets_1.ETH }, deps);
107
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
108
+ (0, vitest_1.expect)(result.unwrap()[0].deadline).toBeUndefined();
109
+ });
110
+ });
@@ -1,5 +1,6 @@
1
1
  import { KnownChainIds } from '@shapeshiftoss/types';
2
- import type { Address, TypedData } from 'viem';
2
+ import type { TypedData } from 'eip-712';
3
+ import type { Address } from 'viem';
3
4
  import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput } from '../../types';
4
5
  export type ZrxTradeQuoteInput = GetEvmTradeQuoteInput;
5
6
  export type ZrxTradeRateInput = GetEvmTradeRateInput;
@@ -0,0 +1 @@
1
+ export declare const getZrxNativeCheckDeadline: (data: string) => number | undefined;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getZrxNativeCheckDeadline = void 0;
4
+ const viem_1 = require("viem");
5
+ const settlerAbi = (0, viem_1.parseAbi)([
6
+ 'function execute((address recipient, address buyToken, uint256 minAmountOut) slippage, bytes[] actions, bytes32 zid)',
7
+ 'function NATIVE_CHECK(uint256 deadline, uint256 msgValue)',
8
+ ]);
9
+ const NATIVE_CHECK_SELECTOR = (0, viem_1.toFunctionSelector)('function NATIVE_CHECK(uint256,uint256)');
10
+ // Native sells carry no Permit2, but Settler reverts with SignatureExpired past any NATIVE_CHECK deadline
11
+ const getZrxNativeCheckDeadline = (data) => {
12
+ try {
13
+ const { functionName, args } = (0, viem_1.decodeFunctionData)({ abi: settlerAbi, data: data });
14
+ if (functionName !== 'execute')
15
+ return undefined;
16
+ const deadlines = args[1]
17
+ .filter(action => action.startsWith(NATIVE_CHECK_SELECTOR))
18
+ .map(action => (0, viem_1.decodeFunctionData)({ abi: settlerAbi, data: action }))
19
+ .flatMap(decoded => decoded.functionName === 'NATIVE_CHECK' ? [Number(decoded.args[0])] : []);
20
+ return deadlines.length ? Math.min(...deadlines) : undefined;
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ };
26
+ exports.getZrxNativeCheckDeadline = getZrxNativeCheckDeadline;
@@ -43,6 +43,7 @@ export type SwapperConfig = {
43
43
  VITE_COWSWAP_BASE_URL: string;
44
44
  VITE_PORTALS_BASE_URL: string;
45
45
  VITE_ZRX_BASE_URL: string;
46
+ VITE_FYND_BASE_URL: string;
46
47
  VITE_CHAINFLIP_API_KEY: string;
47
48
  VITE_CHAINFLIP_API_URL: string;
48
49
  VITE_FEATURE_CHAINFLIP_SWAP_DCA: boolean;
@@ -56,6 +57,7 @@ export type SwapperConfig = {
56
57
  VITE_ACROSS_API_KEY: string;
57
58
  VITE_DEBRIDGE_API_URL: string;
58
59
  VITE_BOB_GATEWAY_API_KEY: string;
60
+ VITE_SYMBIOSIS_API_URL: string;
59
61
  };
60
62
  export declare enum SwapperName {
61
63
  Thorchain = "THORChain",
@@ -76,7 +78,9 @@ export declare enum SwapperName {
76
78
  Stonfi = "STON.fi",
77
79
  Across = "Across",
78
80
  Debridge = "deBridge",
79
- BobGateway = "BOB Gateway"
81
+ BobGateway = "BOB Gateway",
82
+ Symbiosis = "Symbiosis",
83
+ Fynd = "Fynd"
80
84
  }
81
85
  export type SwapSource = SwapperName | `${SwapperName} • ${string}`;
82
86
  export type SwapErrorRight = {
@@ -343,9 +347,6 @@ export type TradeStepCommon = {
343
347
  estimatedExecutionTimeMs: number | undefined;
344
348
  swapperMetadata?: SwapperMetadata;
345
349
  stonfiTransactionData?: StonfiTransactionData;
346
- chainflipSpecific?: {
347
- depositAddress?: string;
348
- };
349
350
  affiliateFee?: AffiliateFee;
350
351
  };
351
352
  export type TradeQuoteStep = TradeStepCommon & {
@@ -452,7 +453,7 @@ export type TradeQuote = TradeQuoteBase & {
452
453
  } & {
453
454
  quoteOrRate: 'quote';
454
455
  receiveAddress: string;
455
- deadline: number;
456
+ deadline?: number;
456
457
  };
457
458
  export type MultiHopTradeQuote = TradeQuote & {
458
459
  steps: MultiHopTradeQuoteSteps;
package/dist/cjs/types.js CHANGED
@@ -22,6 +22,8 @@ var SwapperName;
22
22
  SwapperName["Across"] = "Across";
23
23
  SwapperName["Debridge"] = "deBridge";
24
24
  SwapperName["BobGateway"] = "BOB Gateway";
25
+ SwapperName["Symbiosis"] = "Symbiosis";
26
+ SwapperName["Fynd"] = "Fynd";
25
27
  })(SwapperName || (exports.SwapperName = SwapperName = {}));
26
28
  var TradeQuoteError;
27
29
  (function (TradeQuoteError) {
@@ -1,7 +1,6 @@
1
1
  import type { AssetId, ChainId } from '@shapeshiftoss/caip';
2
2
  import type { TradeAmount, TradeStepCommon } from '../types';
3
3
  import { SwapperName } from '../types';
4
- export declare const FALLBACK_QUOTE_DEADLINE_MS = 60000;
5
4
  export declare const getTradeAmount: (input: {
6
5
  sellAmountIncludingProtocolFeesCryptoBaseUnit: string;
7
6
  } | {
@@ -10,5 +9,5 @@ export declare const getTradeAmount: (input: {
10
9
  export declare const normalizeEpochToMs: (value: number) => number;
11
10
  export declare const isNativeEvmAsset: (assetId: AssetId) => boolean;
12
11
  export declare const getTreasuryAddressFromChainId: (chainId: ChainId) => string;
13
- export type DepositAddressStep = Pick<TradeStepCommon, 'chainflipSpecific' | 'swapperMetadata'>;
12
+ export type DepositAddressStep = Pick<TradeStepCommon, 'swapperMetadata'>;
14
13
  export declare const getDepositAddress: (step: DepositAddressStep, swapperName: SwapperName) => string | undefined;
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDepositAddress = exports.getTreasuryAddressFromChainId = exports.isNativeEvmAsset = exports.normalizeEpochToMs = exports.getTradeAmount = exports.FALLBACK_QUOTE_DEADLINE_MS = void 0;
3
+ exports.getDepositAddress = exports.getTreasuryAddressFromChainId = exports.isNativeEvmAsset = exports.normalizeEpochToMs = exports.getTradeAmount = void 0;
4
4
  const caip_1 = require("@shapeshiftoss/caip");
5
5
  const types_1 = require("@shapeshiftoss/types");
6
6
  const utils_1 = require("@shapeshiftoss/utils");
7
7
  const types_2 = require("../types");
8
- // Deadline for providers without their own expiry - short enough to keep priced amounts honest
9
- exports.FALLBACK_QUOTE_DEADLINE_MS = 60_000;
10
8
  const getTradeAmount = (input) => 'buyAmountCryptoBaseUnit' in input
11
9
  ? { direction: 'exactOut', cryptoBaseUnit: input.buyAmountCryptoBaseUnit }
12
10
  : { direction: 'exactIn', cryptoBaseUnit: input.sellAmountIncludingProtocolFeesCryptoBaseUnit };
@@ -23,33 +21,8 @@ const normalizeEpochToMs = (value) => {
23
21
  };
24
22
  exports.normalizeEpochToMs = normalizeEpochToMs;
25
23
  const isNativeEvmAsset = (assetId) => {
26
- const { chainId } = (0, caip_1.fromAssetId)(assetId);
27
- switch (chainId) {
28
- case types_1.KnownChainIds.EthereumMainnet:
29
- return assetId === caip_1.ethAssetId;
30
- case types_1.KnownChainIds.AvalancheMainnet:
31
- return assetId === caip_1.avalancheAssetId;
32
- case types_1.KnownChainIds.OptimismMainnet:
33
- return assetId === caip_1.optimismAssetId;
34
- case types_1.KnownChainIds.BnbSmartChainMainnet:
35
- return assetId === caip_1.bscAssetId;
36
- case types_1.KnownChainIds.PolygonMainnet:
37
- return assetId === caip_1.polygonAssetId;
38
- case types_1.KnownChainIds.GnosisMainnet:
39
- return assetId === caip_1.gnosisAssetId;
40
- case types_1.KnownChainIds.ArbitrumMainnet:
41
- return assetId === caip_1.arbitrumAssetId;
42
- case types_1.KnownChainIds.BaseMainnet:
43
- return assetId === caip_1.baseAssetId;
44
- case types_1.KnownChainIds.MonadMainnet:
45
- return assetId === caip_1.monadAssetId;
46
- case types_1.KnownChainIds.PlasmaMainnet:
47
- return assetId === caip_1.plasmaAssetId;
48
- case types_1.KnownChainIds.KatanaMainnet:
49
- return assetId === caip_1.katanaAssetId;
50
- default:
51
- return false;
52
- }
24
+ const { chainId, chainNamespace } = (0, caip_1.fromAssetId)(assetId);
25
+ return chainNamespace === caip_1.CHAIN_NAMESPACE.Evm && assetId === (0, utils_1.chainIdToFeeAssetId)(chainId);
53
26
  };
54
27
  exports.isNativeEvmAsset = isNativeEvmAsset;
55
28
  const DAO_TREASURY_BY_CHAIN_ID = {
@@ -84,8 +57,11 @@ const getTreasuryAddressFromChainId = (chainId) => {
84
57
  exports.getTreasuryAddressFromChainId = getTreasuryAddressFromChainId;
85
58
  const getDepositAddress = (step, swapperName) => {
86
59
  switch (swapperName) {
87
- case types_2.SwapperName.Chainflip:
88
- return step.chainflipSpecific?.depositAddress || undefined;
60
+ case types_2.SwapperName.Chainflip: {
61
+ if (step.swapperMetadata?.name !== 'chainflip')
62
+ return;
63
+ return step.swapperMetadata.depositAddress || undefined;
64
+ }
89
65
  case types_2.SwapperName.NearIntents: {
90
66
  if (step.swapperMetadata?.name !== 'nearIntents')
91
67
  return;
@@ -57,7 +57,9 @@ const helpers_1 = require("./helpers");
57
57
  const makeStep = (step) => step;
58
58
  (0, vitest_1.describe)('getDepositAddress', () => {
59
59
  (0, vitest_1.it)('reads the chainflip deposit address', () => {
60
- const step = makeStep({ chainflipSpecific: { depositAddress: 'bc1qdeposit' } });
60
+ const step = makeStep({
61
+ swapperMetadata: { name: 'chainflip', swapId: 1, depositAddress: 'bc1qdeposit' },
62
+ });
61
63
  (0, vitest_1.expect)((0, helpers_1.getDepositAddress)(step, types_2.SwapperName.Chainflip)).toBe('bc1qdeposit');
62
64
  });
63
65
  (0, vitest_1.it)('returns undefined when chainflip has no deposit address', () => {
@@ -80,7 +82,9 @@ const makeStep = (step) => step;
80
82
  (0, vitest_1.expect)((0, helpers_1.getDepositAddress)(step, types_2.SwapperName.NearIntents)).toBeUndefined();
81
83
  });
82
84
  (0, vitest_1.it)('returns undefined for swappers that do not use deposit addresses', () => {
83
- const step = makeStep({ chainflipSpecific: { depositAddress: 'bc1qdeposit' } });
85
+ const step = makeStep({
86
+ swapperMetadata: { name: 'chainflip', swapId: 1, depositAddress: 'bc1qdeposit' },
87
+ });
84
88
  (0, vitest_1.expect)((0, helpers_1.getDepositAddress)(step, types_2.SwapperName.Relay)).toBeUndefined();
85
89
  });
86
90
  });