@shapeshiftoss/swapper 18.1.0 → 20.0.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 (191) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/exactOutputFiltering.test.d.ts +1 -0
  3. package/dist/cjs/exactOutputFiltering.test.js +70 -0
  4. package/dist/cjs/swapper.d.ts +3 -3
  5. package/dist/cjs/swapper.js +29 -6
  6. package/dist/cjs/swappers/AcrossSwapper/constant.js +2 -1
  7. package/dist/cjs/swappers/AcrossSwapper/endpoints.js +1 -1
  8. package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +2 -1
  9. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.d.ts +6 -3
  10. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.js +5 -1
  11. package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +1 -1
  12. package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossStepData.d.ts +1 -0
  13. package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossStepData.js +2 -2
  14. package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossTradeContext.d.ts +1 -0
  15. package/dist/cjs/swappers/AcrossSwapper/utils/getAcrossTradeContext.js +2 -0
  16. package/dist/cjs/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +2 -0
  17. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +3 -1
  18. package/dist/cjs/swappers/AvnuSwapper/utils/getAvnuTradeContext.d.ts +1 -0
  19. package/dist/cjs/swappers/AvnuSwapper/utils/getAvnuTradeContext.js +1 -0
  20. package/dist/cjs/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.js +5 -2
  21. package/dist/cjs/swappers/BebopSwapper/getBebopTradeQuote/getBebopTradeQuote.js +2 -1
  22. package/dist/cjs/swappers/BebopSwapper/types.d.ts +2 -2
  23. package/dist/cjs/swappers/BebopSwapper/types.js +2 -0
  24. package/dist/cjs/swappers/BebopSwapper/utils/getBebopStepData.d.ts +1 -0
  25. package/dist/cjs/swappers/BebopSwapper/utils/getBebopStepData.js +2 -2
  26. package/dist/cjs/swappers/BebopSwapper/utils/getBebopTradeContext.d.ts +1 -0
  27. package/dist/cjs/swappers/BebopSwapper/utils/getBebopTradeContext.js +2 -0
  28. package/dist/cjs/swappers/BebopSwapper/utils/helpers.d.ts +1 -1
  29. package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +2 -0
  30. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +2 -0
  31. package/dist/cjs/swappers/ButterSwap/utils/helpers.js +10 -8
  32. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +2 -0
  33. package/dist/cjs/swappers/ChainflipSwapper/constants.d.ts +1 -0
  34. package/dist/cjs/swappers/ChainflipSwapper/constants.js +3 -1
  35. package/dist/cjs/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +2 -0
  36. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -0
  37. package/dist/cjs/swappers/DebridgeSwapper/constant.js +10 -8
  38. package/dist/cjs/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +2 -0
  39. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +1 -0
  40. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +2 -2
  41. package/dist/cjs/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +1 -0
  42. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +5 -1
  43. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +2 -1
  44. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +21 -9
  45. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +2 -1
  46. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +14 -9
  47. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +3 -1
  48. package/dist/cjs/swappers/NearIntentsSwapper/utils/exactOutput.test.d.ts +1 -0
  49. package/dist/cjs/swappers/NearIntentsSwapper/utils/exactOutput.test.js +61 -0
  50. package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsTradeContext.d.ts +2 -2
  51. package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsTradeContext.js +4 -2
  52. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.d.ts +3 -3
  53. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.js +27 -23
  54. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +11 -0
  55. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.d.ts +1 -0
  56. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsStepData.js +3 -3
  57. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsTradeContext.d.ts +1 -0
  58. package/dist/cjs/swappers/PortalsSwapper/utils/getPortalsTradeContext.js +7 -1
  59. package/dist/cjs/swappers/RelaySwapper/constant.js +4 -3
  60. package/dist/cjs/swappers/RelaySwapper/endpoints.js +12 -2
  61. package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.d.ts +2 -1
  62. package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +7 -2
  63. package/dist/cjs/swappers/RelaySwapper/getTradeRate/getTradeRate.d.ts +2 -1
  64. package/dist/cjs/swappers/RelaySwapper/getTradeRate/getTradeRate.js +5 -2
  65. package/dist/cjs/swappers/RelaySwapper/utils/fetchRelayTrade.js +1 -1
  66. package/dist/cjs/swappers/RelaySwapper/utils/getLatestRelayStatusMessage.js +3 -1
  67. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +2 -2
  68. package/dist/cjs/swappers/RelaySwapper/utils/getRelayTradeContext.js +22 -10
  69. package/dist/cjs/swappers/RelaySwapper/utils/helpers.d.ts +2 -2
  70. package/dist/cjs/swappers/RelaySwapper/utils/notifyTransactionIndexing.js +1 -1
  71. package/dist/cjs/swappers/RelaySwapper/utils/relayService.d.ts +6 -3
  72. package/dist/cjs/swappers/RelaySwapper/utils/relayService.js +3 -1
  73. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +5 -0
  74. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +6 -3
  75. package/dist/cjs/swappers/StonfiSwapper/endpoints.js +40 -14
  76. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +2 -0
  77. package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +2 -0
  78. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.d.ts +1 -0
  79. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.js +2 -2
  80. package/dist/cjs/swappers/SunioSwapper/utils/getSunioTradeContext.js +6 -1
  81. package/dist/cjs/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -0
  82. package/dist/cjs/swappers/ThorchainSwapper/utils/getLongtailQuote.js +2 -0
  83. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +1 -0
  84. package/dist/cjs/swappers/ZrxSwapper/types.d.ts +1 -1
  85. package/dist/cjs/swappers/ZrxSwapper/types.js +1 -0
  86. package/dist/cjs/swappers/ZrxSwapper/utils/constants.js +1 -0
  87. package/dist/cjs/swappers/ZrxSwapper/utils/helpers.d.ts +1 -1
  88. package/dist/cjs/swappers/ZrxSwapper/utils/helpers.js +5 -0
  89. package/dist/cjs/types.d.ts +22 -2
  90. package/dist/cjs/types.js +2 -0
  91. package/dist/cjs/utils/helpers.d.ts +8 -0
  92. package/dist/cjs/utils/helpers.js +18 -1
  93. package/dist/cjs/utils/helpers.test.js +17 -0
  94. package/dist/cjs/utils/test-data/setupSwapQuote.js +1 -0
  95. package/dist/cjs/utils/thorchain/getThorL1TradeQuote.js +3 -0
  96. package/dist/esm/.tsbuildinfo +1 -1
  97. package/dist/esm/exactOutputFiltering.test.d.ts +1 -0
  98. package/dist/esm/exactOutputFiltering.test.js +68 -0
  99. package/dist/esm/swapper.d.ts +3 -3
  100. package/dist/esm/swapper.js +29 -6
  101. package/dist/esm/swappers/AcrossSwapper/constant.js +4 -3
  102. package/dist/esm/swappers/AcrossSwapper/endpoints.js +2 -2
  103. package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +2 -1
  104. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.d.ts +6 -3
  105. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.js +3 -0
  106. package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +2 -2
  107. package/dist/esm/swappers/AcrossSwapper/utils/getAcrossStepData.d.ts +1 -0
  108. package/dist/esm/swappers/AcrossSwapper/utils/getAcrossStepData.js +2 -2
  109. package/dist/esm/swappers/AcrossSwapper/utils/getAcrossTradeContext.d.ts +1 -0
  110. package/dist/esm/swappers/AcrossSwapper/utils/getAcrossTradeContext.js +3 -1
  111. package/dist/esm/swappers/ArbitrumBridgeSwapper/getTradeQuote/getTradeQuote.js +2 -0
  112. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +3 -1
  113. package/dist/esm/swappers/AvnuSwapper/utils/getAvnuTradeContext.d.ts +1 -0
  114. package/dist/esm/swappers/AvnuSwapper/utils/getAvnuTradeContext.js +2 -1
  115. package/dist/esm/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.js +3 -0
  116. package/dist/esm/swappers/BebopSwapper/getBebopTradeQuote/getBebopTradeQuote.js +2 -1
  117. package/dist/esm/swappers/BebopSwapper/types.d.ts +2 -2
  118. package/dist/esm/swappers/BebopSwapper/types.js +2 -0
  119. package/dist/esm/swappers/BebopSwapper/utils/getBebopStepData.d.ts +1 -0
  120. package/dist/esm/swappers/BebopSwapper/utils/getBebopStepData.js +2 -2
  121. package/dist/esm/swappers/BebopSwapper/utils/getBebopTradeContext.d.ts +1 -0
  122. package/dist/esm/swappers/BebopSwapper/utils/getBebopTradeContext.js +3 -1
  123. package/dist/esm/swappers/BebopSwapper/utils/helpers.d.ts +1 -1
  124. package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +2 -0
  125. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +2 -0
  126. package/dist/esm/swappers/ButterSwap/utils/helpers.js +10 -8
  127. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +2 -0
  128. package/dist/esm/swappers/ChainflipSwapper/constants.d.ts +1 -0
  129. package/dist/esm/swappers/ChainflipSwapper/constants.js +2 -0
  130. package/dist/esm/swappers/ChainflipSwapper/swapperApi/getTradeQuote.js +2 -0
  131. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -0
  132. package/dist/esm/swappers/DebridgeSwapper/constant.js +11 -9
  133. package/dist/esm/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +2 -0
  134. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.d.ts +1 -0
  135. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeStepData.js +2 -2
  136. package/dist/esm/swappers/DebridgeSwapper/utils/getDebridgeTradeContext.js +1 -0
  137. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +7 -3
  138. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.d.ts +2 -1
  139. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +14 -3
  140. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.d.ts +2 -1
  141. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +7 -3
  142. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +3 -1
  143. package/dist/esm/swappers/NearIntentsSwapper/utils/exactOutput.test.d.ts +1 -0
  144. package/dist/esm/swappers/NearIntentsSwapper/utils/exactOutput.test.js +59 -0
  145. package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsTradeContext.d.ts +2 -2
  146. package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsTradeContext.js +4 -2
  147. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.d.ts +3 -3
  148. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.js +27 -23
  149. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +12 -1
  150. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.d.ts +1 -0
  151. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsStepData.js +3 -3
  152. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsTradeContext.d.ts +1 -0
  153. package/dist/esm/swappers/PortalsSwapper/utils/getPortalsTradeContext.js +7 -1
  154. package/dist/esm/swappers/RelaySwapper/constant.js +6 -5
  155. package/dist/esm/swappers/RelaySwapper/endpoints.js +15 -5
  156. package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.d.ts +2 -1
  157. package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +5 -1
  158. package/dist/esm/swappers/RelaySwapper/getTradeRate/getTradeRate.d.ts +2 -1
  159. package/dist/esm/swappers/RelaySwapper/getTradeRate/getTradeRate.js +3 -1
  160. package/dist/esm/swappers/RelaySwapper/utils/fetchRelayTrade.js +2 -2
  161. package/dist/esm/swappers/RelaySwapper/utils/getLatestRelayStatusMessage.js +3 -1
  162. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.d.ts +2 -2
  163. package/dist/esm/swappers/RelaySwapper/utils/getRelayTradeContext.js +23 -11
  164. package/dist/esm/swappers/RelaySwapper/utils/helpers.d.ts +2 -2
  165. package/dist/esm/swappers/RelaySwapper/utils/notifyTransactionIndexing.js +2 -2
  166. package/dist/esm/swappers/RelaySwapper/utils/relayService.d.ts +6 -3
  167. package/dist/esm/swappers/RelaySwapper/utils/relayService.js +1 -0
  168. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +5 -0
  169. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +6 -3
  170. package/dist/esm/swappers/StonfiSwapper/endpoints.js +41 -15
  171. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +2 -0
  172. package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +2 -0
  173. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.d.ts +1 -0
  174. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.js +2 -2
  175. package/dist/esm/swappers/SunioSwapper/utils/getSunioTradeContext.js +6 -1
  176. package/dist/esm/swappers/ThorchainSwapper/getTradeQuote/getTradeQuote.test.js +2 -0
  177. package/dist/esm/swappers/ThorchainSwapper/utils/getLongtailQuote.js +2 -0
  178. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +2 -1
  179. package/dist/esm/swappers/ZrxSwapper/types.d.ts +1 -1
  180. package/dist/esm/swappers/ZrxSwapper/types.js +1 -0
  181. package/dist/esm/swappers/ZrxSwapper/utils/constants.js +1 -0
  182. package/dist/esm/swappers/ZrxSwapper/utils/helpers.d.ts +1 -1
  183. package/dist/esm/swappers/ZrxSwapper/utils/helpers.js +5 -0
  184. package/dist/esm/types.d.ts +22 -2
  185. package/dist/esm/types.js +2 -0
  186. package/dist/esm/utils/helpers.d.ts +8 -0
  187. package/dist/esm/utils/helpers.js +15 -0
  188. package/dist/esm/utils/helpers.test.js +18 -1
  189. package/dist/esm/utils/test-data/setupSwapQuote.js +1 -0
  190. package/dist/esm/utils/thorchain/getThorL1TradeQuote.js +3 -0
  191. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { swappers } from './constants.js';
3
+ import { getTradeQuotes, getTradeRates } from './swapper.js';
4
+ import { SwapperName, TradeQuoteError } from './types.js';
5
+ import { BTC, ETH } from './utils/test-data/assets.js';
6
+ // Exact-output support is structural - a swapper cannot claim it without implementing it
7
+ describe('exact output capability', () => {
8
+ it('is implemented by the swappers whose upstream API can honour an exact buy amount', () => {
9
+ for (const swapperName of [SwapperName.NearIntents, SwapperName.Relay]) {
10
+ expect(swappers[swapperName]?.getExactOutputTradeRate).toBeDefined();
11
+ expect(swappers[swapperName]?.getExactOutputTradeQuote).toBeDefined();
12
+ }
13
+ });
14
+ it('is absent everywhere else', () => {
15
+ const exactOutputCapable = Object.values(SwapperName).filter(swapperName => swappers[swapperName]?.getExactOutputTradeRate !== undefined);
16
+ expect(exactOutputCapable).toEqual([SwapperName.Relay, SwapperName.NearIntents]);
17
+ });
18
+ });
19
+ const exactOutputInput = {
20
+ sellAsset: ETH,
21
+ buyAsset: BTC,
22
+ buyAmountCryptoBaseUnit: '100000',
23
+ affiliateBps: '0',
24
+ allowMultiHop: true,
25
+ receiveAddress: undefined,
26
+ accountNumber: undefined,
27
+ quoteOrRate: 'rate',
28
+ };
29
+ const deps = {};
30
+ describe('getTradeRates on an exact buy amount', () => {
31
+ // Silently omitting these would read as the swapper being unavailable rather than unable
32
+ it('reports an error for a swapper that cannot quote one', async () => {
33
+ const result = await getTradeRates(exactOutputInput, SwapperName.Thorchain, deps);
34
+ expect(result).toBeDefined();
35
+ expect(result?.isErr()).toBe(true);
36
+ expect(result?.unwrapErr().code).toEqual(TradeQuoteError.ExactOutputNotSupported);
37
+ expect(result?.swapperName).toEqual(SwapperName.Thorchain);
38
+ });
39
+ it('skips entirely on a zero buy amount', async () => {
40
+ const result = await getTradeRates({ ...exactOutputInput, buyAmountCryptoBaseUnit: '0' }, SwapperName.Thorchain, deps);
41
+ expect(result).toBeUndefined();
42
+ });
43
+ // The base-unit regex upstream admits padded zeros, so the check can't be a string comparison
44
+ it('skips entirely on a padded zero buy amount', async () => {
45
+ const result = await getTradeRates({ ...exactOutputInput, buyAmountCryptoBaseUnit: '00' }, SwapperName.Thorchain, deps);
46
+ expect(result).toBeUndefined();
47
+ });
48
+ });
49
+ // Quotes dispatch on the same input shape as rates, so they gate the same way
50
+ describe('getTradeQuotes on an exact buy amount', () => {
51
+ const exactOutputQuoteInput = {
52
+ ...exactOutputInput,
53
+ receiveAddress: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq',
54
+ accountNumber: 0,
55
+ quoteOrRate: 'quote',
56
+ };
57
+ it('reports an error for a swapper that cannot quote one', async () => {
58
+ const result = await getTradeQuotes(exactOutputQuoteInput, SwapperName.Thorchain, deps);
59
+ expect(result).toBeDefined();
60
+ expect(result?.isErr()).toBe(true);
61
+ expect(result?.unwrapErr().code).toEqual(TradeQuoteError.ExactOutputNotSupported);
62
+ expect(result?.swapperName).toEqual(SwapperName.Thorchain);
63
+ });
64
+ it('skips entirely on a zero buy amount', async () => {
65
+ const result = await getTradeQuotes({ ...exactOutputQuoteInput, buyAmountCryptoBaseUnit: '0' }, SwapperName.Thorchain, deps);
66
+ expect(result).toBeUndefined();
67
+ });
68
+ });
@@ -1,3 +1,3 @@
1
- import type { GetTradeQuoteInput, GetTradeRateInput, QuoteResult, RateResult, SwapperDeps, SwapperName } from './types.js';
2
- export declare const getTradeQuotes: (getTradeQuoteInput: GetTradeQuoteInput, swapperName: SwapperName, deps: SwapperDeps) => Promise<QuoteResult | undefined>;
3
- export declare const getTradeRates: (getTradeRateInput: GetTradeRateInput, swapperName: SwapperName, deps: SwapperDeps, quoteTimeoutMs?: number) => Promise<RateResult | undefined>;
1
+ import type { GetExactOutputTradeQuoteInput, GetExactOutputTradeRateInput, GetTradeQuoteInput, GetTradeRateInput, QuoteResult, RateResult, SwapperDeps, SwapperName } from './types.js';
2
+ export declare const getTradeQuotes: (getTradeQuoteInput: GetTradeQuoteInput | GetExactOutputTradeQuoteInput, swapperName: SwapperName, deps: SwapperDeps) => Promise<QuoteResult | undefined>;
3
+ export declare const getTradeRates: (getTradeRateInput: GetTradeRateInput | GetExactOutputTradeRateInput, swapperName: SwapperName, deps: SwapperDeps, quoteTimeoutMs?: number) => Promise<RateResult | undefined>;
@@ -1,17 +1,31 @@
1
1
  import { bnOrZero, timeoutMonadic, timeoutMonadicWithOriginal } from '@shapeshiftoss/utils';
2
+ import { Err } from '@sniptt/monads';
2
3
  import { QUOTE_TIMEOUT_ERROR, QUOTE_TIMEOUT_MS, swappers } from './constants.js';
3
4
  import { TradeQuoteError } from './types.js';
4
5
  import { makeSwapErrorRight } from './utils/index.js';
6
+ const EXACT_OUTPUT_NOT_SUPPORTED_ERROR = makeSwapErrorRight({
7
+ code: TradeQuoteError.ExactOutputNotSupported,
8
+ message: 'This swapper cannot derive a sell amount from an exact buy amount',
9
+ });
5
10
  export const getTradeQuotes = async (getTradeQuoteInput, swapperName, deps) => {
6
11
  if (bnOrZero(getTradeQuoteInput.affiliateBps).lt(0))
7
12
  return;
8
- if (getTradeQuoteInput.sellAmountIncludingProtocolFeesCryptoBaseUnit === '0')
9
- return;
10
13
  const swapper = swappers[swapperName];
11
14
  if (swapper === undefined)
12
15
  return;
16
+ // Compared numerically so a padded zero can't slip through as an amount
17
+ const drivingAmount = 'buyAmountCryptoBaseUnit' in getTradeQuoteInput
18
+ ? getTradeQuoteInput.buyAmountCryptoBaseUnit
19
+ : getTradeQuoteInput.sellAmountIncludingProtocolFeesCryptoBaseUnit;
20
+ if (bnOrZero(drivingAmount).isZero())
21
+ return;
22
+ const quotePromise = 'buyAmountCryptoBaseUnit' in getTradeQuoteInput
23
+ ? swapper.getExactOutputTradeQuote?.(getTradeQuoteInput, deps)
24
+ : swapper.getTradeQuote(getTradeQuoteInput, deps);
25
+ if (!quotePromise)
26
+ return { ...Err(EXACT_OUTPUT_NOT_SUPPORTED_ERROR), swapperName };
13
27
  try {
14
- const quote = await timeoutMonadic(swapper.getTradeQuote(getTradeQuoteInput, deps), QUOTE_TIMEOUT_MS, QUOTE_TIMEOUT_ERROR);
28
+ const quote = await timeoutMonadic(quotePromise, QUOTE_TIMEOUT_MS, QUOTE_TIMEOUT_ERROR);
15
29
  return {
16
30
  ...quote,
17
31
  swapperName,
@@ -26,13 +40,22 @@ export const getTradeQuotes = async (getTradeQuoteInput, swapperName, deps) => {
26
40
  export const getTradeRates = async (getTradeRateInput, swapperName, deps, quoteTimeoutMs = QUOTE_TIMEOUT_MS) => {
27
41
  if (bnOrZero(getTradeRateInput.affiliateBps).lt(0))
28
42
  return;
29
- if (getTradeRateInput.sellAmountIncludingProtocolFeesCryptoBaseUnit === '0')
30
- return;
31
43
  const swapper = swappers[swapperName];
32
44
  if (swapper === undefined)
33
45
  return;
46
+ // Compared numerically so a padded zero can't slip through as an amount
47
+ const drivingAmount = 'buyAmountCryptoBaseUnit' in getTradeRateInput
48
+ ? getTradeRateInput.buyAmountCryptoBaseUnit
49
+ : getTradeRateInput.sellAmountIncludingProtocolFeesCryptoBaseUnit;
50
+ if (bnOrZero(drivingAmount).isZero())
51
+ return;
52
+ const ratePromise = 'buyAmountCryptoBaseUnit' in getTradeRateInput
53
+ ? swapper.getExactOutputTradeRate?.(getTradeRateInput, deps)
54
+ : swapper.getTradeRate(getTradeRateInput, deps);
55
+ if (!ratePromise)
56
+ return { ...Err(EXACT_OUTPUT_NOT_SUPPORTED_ERROR), swapperName };
34
57
  try {
35
- const { timed, original } = timeoutMonadicWithOriginal(swapper.getTradeRate(getTradeRateInput, deps), quoteTimeoutMs, makeSwapErrorRight({
58
+ const { timed, original } = timeoutMonadicWithOriginal(ratePromise, quoteTimeoutMs, makeSwapErrorRight({
36
59
  code: TradeQuoteError.Timeout,
37
60
  message: `quote timed out after ${quoteTimeoutMs / 1000}s`,
38
61
  }));
@@ -1,7 +1,7 @@
1
- import { arbitrumChainId, baseChainId, blastChainId, bscChainId, ethChainId, hyperEvmChainId, inkChainId, lineaChainId, megaethChainId, modeChainId, monadChainId, optimismChainId, plasmaChainId, polygonChainId, scrollChainId, solanaChainId, soneiumChainId, unichainChainId, worldChainChainId, zkSyncEraChainId, } from '@shapeshiftoss/caip';
1
+ import { arbitrumChainId, baseChainId, blastChainId, bscChainId, ethChainId, hyperEvmChainId, inkChainId, lineaChainId, megaethChainId, modeChainId, monadChainId, optimismChainId, plasmaChainId, polygonChainId, robinhoodChainId, scrollChainId, solanaChainId, soneiumChainId, unichainChainId, worldChainChainId, zkSyncEraChainId, } from '@shapeshiftoss/caip';
2
2
  import invert from 'lodash/invert';
3
3
  import { zeroAddress } from 'viem';
4
- import { arbitrum, base, blast, bsc, hyperEvm, ink, linea, mainnet as ethereum, mode, monad, optimism, plasma, polygon, scroll, soneium, unichain, worldchain, zksync, } from 'viem/chains';
4
+ import { arbitrum, base, blast, bsc, hyperEvm, ink, linea, mainnet as ethereum, megaeth, mode, monad, optimism, plasma, polygon, robinhood, scroll, soneium, unichain, worldchain, zksync, } from 'viem/chains';
5
5
  import { TradeQuoteError } from '../../types.js';
6
6
  import { AcrossErrorCode } from './utils/types.js';
7
7
  export const chainIdToAcrossChainId = {
@@ -25,7 +25,8 @@ export const chainIdToAcrossChainId = {
25
25
  // Across uses a custom Solana chain ID
26
26
  [solanaChainId]: 34268394551451,
27
27
  [scrollChainId]: scroll.id,
28
- [megaethChainId]: 4326,
28
+ [megaethChainId]: megaeth.id,
29
+ [robinhoodChainId]: robinhood.id,
29
30
  };
30
31
  export const acrossChainIdToChainId = invert(chainIdToAcrossChainId);
31
32
  export const ACROSS_SUPPORTED_CHAIN_IDS = Object.keys(chainIdToAcrossChainId);
@@ -4,7 +4,7 @@ import { checkEvmSwapStatus, getExecutableTradeStep, isExecutableTradeQuote } fr
4
4
  import { getEvmTransactionFees, getUnsignedEvmTransaction } from '../../utils/evm/index.js';
5
5
  import { getTradeQuote } from './getTradeQuote/getTradeQuote.js';
6
6
  import { getTradeRate } from './getTradeRate/getTradeRate.js';
7
- import { acrossService } from './utils/acrossService.js';
7
+ import { acrossService, getAcrossRequestConfig } from './utils/acrossService.js';
8
8
  export const acrossApi = {
9
9
  getTradeQuote: (input, deps) => getTradeQuote(input, deps),
10
10
  getTradeRate: (input, deps) => getTradeRate(input, deps),
@@ -33,7 +33,7 @@ export const acrossApi = {
33
33
  return sourceTxStatus;
34
34
  txHash = sourceTxStatus.buyTxHash ?? txHash;
35
35
  }
36
- const maybeStatusResponse = await acrossService.get(`${config.VITE_ACROSS_API_URL}/deposit/status?depositTxnRef=${txHash}`);
36
+ const maybeStatusResponse = await acrossService.get(`${config.VITE_ACROSS_API_URL}/deposit/status?depositTxnRef=${txHash}`, getAcrossRequestConfig(config));
37
37
  if (maybeStatusResponse.isErr()) {
38
38
  return {
39
39
  buyTxHash: undefined,
@@ -16,7 +16,7 @@ export const getTradeQuote = async (input, deps) => {
16
16
  });
17
17
  if (maybeContext.isErr())
18
18
  return Err(maybeContext.unwrapErr());
19
- const { tradeCommon, stepCommon, protocolFees, stepDataArgs } = maybeContext.unwrap();
19
+ const { tradeCommon, stepCommon, protocolFees, stepDataArgs, deadline } = maybeContext.unwrap();
20
20
  const maybeStepData = await getAcrossStepData({ ...stepDataArgs, type: 'quote', input });
21
21
  if (maybeStepData.isErr())
22
22
  return Err(maybeStepData.unwrapErr());
@@ -24,6 +24,7 @@ export const getTradeQuote = async (input, deps) => {
24
24
  const tradeQuote = {
25
25
  ...tradeCommon,
26
26
  quoteOrRate: 'quote',
27
+ deadline,
27
28
  receiveAddress,
28
29
  steps: [
29
30
  {
@@ -1,5 +1,8 @@
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import type { SwapperConfig } from '../../../types.js';
1
3
  export declare const acrossService: {
2
- get: <T = any>(url: string, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../../index.js").SwapErrorRight>>;
3
- post: <T_1 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_1, any, {}>, import("../../../index.js").SwapErrorRight>>;
4
- delete: <T_2 = any>(url: string, data: any, config?: import("axios").AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_2, any, {}>, import("../../../index.js").SwapErrorRight>>;
4
+ get: <T = any>(url: string, config?: AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T, any, {}>, import("../../../types.js").SwapErrorRight>>;
5
+ post: <T_1 = any>(url: string, data: any, config?: AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_1, any, {}>, import("../../../types.js").SwapErrorRight>>;
6
+ delete: <T_2 = any>(url: string, data: any, config?: AxiosRequestConfig<any> | undefined) => Promise<import("@sniptt/monads").Result<import("axios").AxiosResponse<T_2, any, {}>, import("../../../types.js").SwapErrorRight>>;
5
7
  };
8
+ export declare const getAcrossRequestConfig: (config: SwapperConfig) => AxiosRequestConfig | undefined;
@@ -9,3 +9,6 @@ const axiosConfig = {
9
9
  };
10
10
  const acrossServiceBase = axios.create(axiosConfig);
11
11
  export const acrossService = makeSwapperAxiosServiceMonadic(acrossServiceBase);
12
+ export const getAcrossRequestConfig = (config) => config.VITE_ACROSS_API_KEY
13
+ ? { headers: { Authorization: `Bearer ${config.VITE_ACROSS_API_KEY}` } }
14
+ : undefined;
@@ -1,4 +1,4 @@
1
- import { acrossService } from './acrossService.js';
1
+ import { acrossService, getAcrossRequestConfig } from './acrossService.js';
2
2
  export const fetchAcrossTrade = (params, config) => {
3
3
  const searchParams = new URLSearchParams();
4
4
  searchParams.set('tradeType', params.tradeType);
@@ -19,5 +19,5 @@ export const fetchAcrossTrade = (params, config) => {
19
19
  if (params.slippage)
20
20
  searchParams.set('slippage', params.slippage);
21
21
  const url = `${config.VITE_ACROSS_API_URL}/swap/approval?${searchParams.toString()}`;
22
- return acrossService.get(url);
22
+ return acrossService.get(url, getAcrossRequestConfig(config));
23
23
  };
@@ -3,6 +3,7 @@ import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.j
3
3
  import type { AcrossSwapTx } from './types.js';
4
4
  type BaseArgs = {
5
5
  swapTx: AcrossSwapTx;
6
+ sellAmountCryptoBaseUnit: string;
6
7
  spenderAddress: string;
7
8
  fallbackNetworkFeeCryptoBaseUnit: string;
8
9
  };
@@ -7,7 +7,7 @@ import { makeNetworkFeeEstimationFailedErr, makeSwapErrorRight, makeTradeStepBui
7
7
  import { getEvmNetworkFeeCryptoBaseUnit } from '../../../utils/evm/index.js';
8
8
  import { getSolanaNetworkFeeCryptoBaseUnit } from '../../../utils/solana/index.js';
9
9
  export async function getAcrossStepData(args) {
10
- const { swapTx, sellAsset, spenderAddress, from, type, input, fallbackNetworkFeeCryptoBaseUnit, deps, } = args;
10
+ const { swapTx, sellAsset, sellAmountCryptoBaseUnit, spenderAddress, from, type, input, fallbackNetworkFeeCryptoBaseUnit, deps, } = args;
11
11
  const supportsEIP1559 = 'supportsEIP1559' in input ? input.supportsEIP1559 : false;
12
12
  switch (swapTx.ecosystem) {
13
13
  case 'evm': {
@@ -22,7 +22,7 @@ export async function getAcrossStepData(args) {
22
22
  };
23
23
  const stateOverride = {
24
24
  sellAsset,
25
- sellAmountCryptoBaseUnit: input.sellAmountIncludingProtocolFeesCryptoBaseUnit,
25
+ sellAmountCryptoBaseUnit,
26
26
  spenderAddress,
27
27
  };
28
28
  if (type === 'rate') {
@@ -7,6 +7,7 @@ type AcrossTradeContext = {
7
7
  stepCommon: Omit<TradeStepCommon, 'feeData'>;
8
8
  protocolFees: QuoteFeeData['protocolFees'];
9
9
  stepDataArgs: Omit<GetAcrossStepDataArgs, 'type' | 'input'>;
10
+ deadline: number;
10
11
  };
11
12
  export declare const getAcrossTradeContext: ({ input, deps, depositor, recipient, }: {
12
13
  input: AcrossTradeQuoteInput | AcrossTradeRateInput;
@@ -7,7 +7,7 @@ import { zeroAddress } from 'viem';
7
7
  import { SwapperName, TradeQuoteError } from '../../../types.js';
8
8
  import { getInputOutputRate, makeSwapErrorRight } from '../../../utils/index.js';
9
9
  import { buildAffiliateFee } from '../../../utils/affiliateFee.js';
10
- import { getTreasuryAddressFromChainId } from '../../../utils/helpers.js';
10
+ import { getTreasuryAddressFromChainId, normalizeEpochToMs } from '../../../utils/helpers.js';
11
11
  import { acrossChainIdToChainId, acrossErrorCodeToTradeQuoteError } from '../constant.js';
12
12
  import { fetchAcrossTrade } from './fetchAcrossTrade.js';
13
13
  import { assertValidTrade, getAcrossAssetAddress } from './helpers.js';
@@ -167,10 +167,12 @@ export const getAcrossTradeContext = async ({ input, deps, depositor, recipient,
167
167
  stepDataArgs: {
168
168
  swapTx: quote.swapTx,
169
169
  sellAsset,
170
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
170
171
  from: depositor,
171
172
  spenderAddress: allowanceContract,
172
173
  fallbackNetworkFeeCryptoBaseUnit: quote.fees.originGas.amount,
173
174
  deps,
174
175
  },
176
+ deadline: normalizeEpochToMs(quote.quoteExpiryTimestamp),
175
177
  });
176
178
  };
@@ -1,6 +1,7 @@
1
1
  import { supportsETH } from '@shapeshiftoss/hdwallet-core';
2
2
  import { Err, Ok } from '@sniptt/monads';
3
3
  import { assertQuoteAddresses } from '../../../utils/index.js';
4
+ import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
4
5
  import { getArbitrumBridgeStepData } from '../utils/getArbitrumBridgeStepData.js';
5
6
  import { getArbitrumBridgeTradeContext } from '../utils/getArbitrumBridgeTradeContext.js';
6
7
  export const getTradeQuoteWithWallet = async (inputWithWallet, deps) => {
@@ -32,6 +33,7 @@ export const getTradeQuote = async (input, deps) => {
32
33
  const tradeQuote = {
33
34
  ...tradeCommon,
34
35
  quoteOrRate: 'quote',
36
+ deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
35
37
  receiveAddress,
36
38
  steps: [
37
39
  {
@@ -2,6 +2,7 @@ import { Err, Ok } from '@sniptt/monads';
2
2
  import { validateAndParseAddress } from 'starknet';
3
3
  import { TradeQuoteError } from '../../../types.js';
4
4
  import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
5
+ import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
5
6
  import { getAvnuTradeContext } from '../utils/getAvnuTradeContext.js';
6
7
  export const getTradeQuote = async (input, deps) => {
7
8
  const { sellAsset, accountNumber } = input;
@@ -17,7 +18,7 @@ export const getTradeQuote = async (input, deps) => {
17
18
  const maybeContext = await getAvnuTradeContext({ input, takerAddress: normalizedSendAddress });
18
19
  if (maybeContext.isErr())
19
20
  return Err(maybeContext.unwrapErr());
20
- const { tradeCommon, stepCommon, protocolFees, quoteId, sellTokenAddress } = maybeContext.unwrap();
21
+ const { tradeCommon, stepCommon, protocolFees, quoteId, sellTokenAddress, deadline } = maybeContext.unwrap();
21
22
  const adapter = deps.assertGetStarknetChainAdapter(sellAsset.chainId);
22
23
  const feeData = await adapter.getFeeData({
23
24
  to: normalizedReceiveAddress,
@@ -32,6 +33,7 @@ export const getTradeQuote = async (input, deps) => {
32
33
  ...tradeCommon,
33
34
  receiveAddress: normalizedReceiveAddress,
34
35
  quoteOrRate: 'quote',
36
+ deadline: deadline ?? Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
35
37
  steps: [
36
38
  {
37
39
  ...stepCommon,
@@ -6,6 +6,7 @@ type AvnuTradeContext = {
6
6
  protocolFees: QuoteFeeData['protocolFees'];
7
7
  quoteId: string;
8
8
  sellTokenAddress: string;
9
+ deadline: number | undefined;
9
10
  };
10
11
  export declare const getAvnuTradeContext: ({ input, takerAddress, }: {
11
12
  input: GetStarknetTradeQuoteInput | GetStarknetTradeRateInput;
@@ -7,7 +7,7 @@ import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constant
7
7
  import { SwapperName, TradeQuoteError } from '../../../types.js';
8
8
  import { getInputOutputRate, makeSwapErrorRight } from '../../../utils/index.js';
9
9
  import { buildAffiliateFee } from '../../../utils/affiliateFee.js';
10
- import { getTreasuryAddressFromChainId } from '../../../utils/helpers.js';
10
+ import { getTreasuryAddressFromChainId, normalizeEpochToMs } from '../../../utils/helpers.js';
11
11
  import { assertValidTrade, getTokenAddress } from './helpers.js';
12
12
  export const getAvnuTradeContext = async ({ input, takerAddress, }) => {
13
13
  const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount, slippageTolerancePercentageDecimal, affiliateBps, } = input;
@@ -90,6 +90,7 @@ export const getAvnuTradeContext = async ({ input, takerAddress, }) => {
90
90
  protocolFees,
91
91
  quoteId: bestQuote.quoteId,
92
92
  sellTokenAddress,
93
+ deadline: bestQuote.expiry ? normalizeEpochToMs(bestQuote.expiry) : undefined,
93
94
  });
94
95
  }
95
96
  catch (error) {
@@ -1,6 +1,7 @@
1
1
  import { Err, Ok } from '@sniptt/monads';
2
2
  import { TradeQuoteError } from '../../../types.js';
3
3
  import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
4
+ import { normalizeEpochToMs } from '../../../utils/helpers.js';
4
5
  import { getBebopSolanaTradeContext } from '../utils/getBebopSolanaTradeContext.js';
5
6
  import { isBebopSolanaTxSafe } from '../utils/helpers.js';
6
7
  export const getBebopSolanaTradeQuote = async (input, deps) => {
@@ -27,6 +28,8 @@ export const getBebopSolanaTradeQuote = async (input, deps) => {
27
28
  const tradeQuote = {
28
29
  ...tradeCommon,
29
30
  quoteOrRate: 'quote',
31
+ // The sealed multi-signer tx is blockhash-pinned, so the provider expiry governs
32
+ deadline: normalizeEpochToMs(response.expiry),
30
33
  receiveAddress,
31
34
  steps: [
32
35
  {
@@ -17,7 +17,7 @@ export const getBebopTradeQuote = async (input, deps) => {
17
17
  });
18
18
  if (maybeContext.isErr())
19
19
  return Err(maybeContext.unwrapErr());
20
- const { tradeCommon, stepCommon, stepDataArgs } = maybeContext.unwrap();
20
+ const { tradeCommon, stepCommon, stepDataArgs, deadline } = maybeContext.unwrap();
21
21
  const maybeStepData = await getBebopStepData({ ...stepDataArgs, type: 'quote', input });
22
22
  if (maybeStepData.isErr())
23
23
  return Err(maybeStepData.unwrapErr());
@@ -25,6 +25,7 @@ export const getBebopTradeQuote = async (input, deps) => {
25
25
  const tradeQuote = {
26
26
  ...tradeCommon,
27
27
  quoteOrRate: 'quote',
28
+ deadline,
28
29
  receiveAddress,
29
30
  steps: [
30
31
  {
@@ -3,8 +3,8 @@ import type { Address, Hex } from 'viem';
3
3
  import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput, GetSolanaTradeQuoteInput, GetSolanaTradeRateInput } from '../../types.js';
4
4
  export type BebopTradeQuoteInput = GetEvmTradeQuoteInput | GetSolanaTradeQuoteInput;
5
5
  export type BebopTradeRateInput = GetEvmTradeRateInput | GetSolanaTradeRateInput;
6
- export declare const bebopSupportedEvmChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BnbSmartChainMainnet];
7
- export declare const bebopSupportedChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BnbSmartChainMainnet, KnownChainIds.SolanaMainnet];
6
+ export declare const bebopSupportedEvmChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BnbSmartChainMainnet, KnownChainIds.RobinhoodMainnet];
7
+ export declare const bebopSupportedChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.PolygonMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BaseMainnet, KnownChainIds.AvalancheMainnet, KnownChainIds.OptimismMainnet, KnownChainIds.BnbSmartChainMainnet, KnownChainIds.RobinhoodMainnet, KnownChainIds.SolanaMainnet];
8
8
  export type BebopSupportedChainId = (typeof bebopSupportedChainIds)[number];
9
9
  export type BebopMetadata = {
10
10
  name: 'bebop';
@@ -7,6 +7,7 @@ export const bebopSupportedEvmChainIds = [
7
7
  KnownChainIds.AvalancheMainnet,
8
8
  KnownChainIds.OptimismMainnet,
9
9
  KnownChainIds.BnbSmartChainMainnet,
10
+ KnownChainIds.RobinhoodMainnet,
10
11
  ];
11
12
  export const bebopSupportedChainIds = [
12
13
  ...bebopSupportedEvmChainIds,
@@ -20,6 +21,7 @@ export const chainIdToBebopChain = {
20
21
  [KnownChainIds.AvalancheMainnet]: 'avalanche',
21
22
  [KnownChainIds.OptimismMainnet]: 'optimism',
22
23
  [KnownChainIds.BnbSmartChainMainnet]: 'bsc',
24
+ [KnownChainIds.RobinhoodMainnet]: 'robinhood',
23
25
  [KnownChainIds.SolanaMainnet]: 'solana',
24
26
  };
25
27
  export const BEBOP_NATIVE_MARKER = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
@@ -3,6 +3,7 @@ import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.j
3
3
  import type { BebopQuoteResponse } from '../types.js';
4
4
  type BaseArgs = {
5
5
  tx: BebopQuoteResponse['tx'];
6
+ sellAmountCryptoBaseUnit: string;
6
7
  spenderAddress: string;
7
8
  };
8
9
  export type GetBebopStepDataArgs = StepDataArgs<BaseArgs, {
@@ -5,7 +5,7 @@ import { fromHex } from 'viem';
5
5
  import { makeNetworkFeeEstimationFailedErr } from '../../../utils/index.js';
6
6
  import { getEvmNetworkFeeCryptoBaseUnit } from '../../../utils/evm/index.js';
7
7
  export async function getBebopStepData(args) {
8
- const { tx, spenderAddress, sellAsset, type, input, from, deps } = args;
8
+ const { tx, spenderAddress, sellAsset, sellAmountCryptoBaseUnit, type, input, from, deps } = args;
9
9
  const adapter = deps.assertGetEvmChainAdapter(sellAsset.chainId);
10
10
  const supportsEIP1559 = 'supportsEIP1559' in input ? input.supportsEIP1559 : false;
11
11
  if (type === 'rate') {
@@ -40,7 +40,7 @@ export async function getBebopStepData(args) {
40
40
  supportsEIP1559,
41
41
  stateOverride: {
42
42
  sellAsset,
43
- sellAmountCryptoBaseUnit: input.sellAmountIncludingProtocolFeesCryptoBaseUnit,
43
+ sellAmountCryptoBaseUnit,
44
44
  spenderAddress,
45
45
  },
46
46
  });
@@ -6,6 +6,7 @@ type BebopTradeContext = {
6
6
  tradeCommon: TradeCommon;
7
7
  stepCommon: Omit<TradeStepCommon, 'feeData'>;
8
8
  stepDataArgs: Omit<GetBebopStepDataArgs, 'type' | 'input'>;
9
+ deadline: number;
9
10
  };
10
11
  export declare const getBebopTradeContext: ({ input, deps, from, receiver, }: {
11
12
  input: GetEvmTradeQuoteInput | GetEvmTradeRateInput;
@@ -5,7 +5,7 @@ import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constant
5
5
  import { SwapperName, TradeQuoteError } from '../../../types.js';
6
6
  import { makeSwapErrorRight } from '../../../utils/index.js';
7
7
  import { buildAffiliateFee } from '../../../utils/affiliateFee.js';
8
- import { isNativeEvmAsset } from '../../../utils/helpers.js';
8
+ import { isNativeEvmAsset, normalizeEpochToMs } from '../../../utils/helpers.js';
9
9
  import { fetchBebopQuote } from './fetchFromBebop.js';
10
10
  import { assertValidTrade, calculateRate } from './helpers.js';
11
11
  export const getBebopTradeContext = async ({ input, deps, from, receiver, }) => {
@@ -75,8 +75,10 @@ export const getBebopTradeContext = async ({ input, deps, from, receiver, }) =>
75
75
  tx: quote.tx,
76
76
  spenderAddress: allowanceContract,
77
77
  sellAsset,
78
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
78
79
  from,
79
80
  deps,
80
81
  },
82
+ deadline: normalizeEpochToMs(quote.expiry),
81
83
  });
82
84
  };
@@ -2,7 +2,7 @@ import type { AssetId, ChainId } from '@shapeshiftoss/caip';
2
2
  import type { Asset } from '@shapeshiftoss/types';
3
3
  export declare const assetIdToBebopToken: (assetId: AssetId) => string;
4
4
  export declare const assetIdToBebopSolanaToken: (assetId: AssetId) => string;
5
- export declare const isSupportedChainId: (chainId: ChainId) => chainId is import("@shapeshiftoss/types").KnownChainIds.EthereumMainnet | import("@shapeshiftoss/types").KnownChainIds.AvalancheMainnet | import("@shapeshiftoss/types").KnownChainIds.OptimismMainnet | import("@shapeshiftoss/types").KnownChainIds.BnbSmartChainMainnet | import("@shapeshiftoss/types").KnownChainIds.PolygonMainnet | import("@shapeshiftoss/types").KnownChainIds.ArbitrumMainnet | import("@shapeshiftoss/types").KnownChainIds.BaseMainnet | import("@shapeshiftoss/types").KnownChainIds.SolanaMainnet;
5
+ export declare const isSupportedChainId: (chainId: ChainId) => chainId is import("@shapeshiftoss/types").KnownChainIds.EthereumMainnet | import("@shapeshiftoss/types").KnownChainIds.AvalancheMainnet | import("@shapeshiftoss/types").KnownChainIds.OptimismMainnet | import("@shapeshiftoss/types").KnownChainIds.BnbSmartChainMainnet | import("@shapeshiftoss/types").KnownChainIds.PolygonMainnet | import("@shapeshiftoss/types").KnownChainIds.ArbitrumMainnet | import("@shapeshiftoss/types").KnownChainIds.BaseMainnet | import("@shapeshiftoss/types").KnownChainIds.SolanaMainnet | import("@shapeshiftoss/types").KnownChainIds.RobinhoodMainnet;
6
6
  export declare const assertValidTrade: ({ buyAsset, sellAsset, }: {
7
7
  buyAsset: Asset;
8
8
  sellAsset: Asset;
@@ -1,6 +1,7 @@
1
1
  import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
2
2
  import { Err, Ok } from '@sniptt/monads';
3
3
  import { assertQuoteAddresses } from '../../../utils/index.js';
4
+ import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
4
5
  import { getBobGatewayStepData } from '../utils/getBobGatewayStepData.js';
5
6
  import { getBobGatewayTradeContext } from '../utils/getBobGatewayTradeContext.js';
6
7
  export const getBobGatewayTradeQuote = async (input, deps) => {
@@ -33,6 +34,7 @@ export const getBobGatewayTradeQuote = async (input, deps) => {
33
34
  const tradeQuote = {
34
35
  ...tradeCommon,
35
36
  quoteOrRate: 'quote',
37
+ deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
36
38
  receiveAddress,
37
39
  steps: [
38
40
  {
@@ -4,6 +4,7 @@ import { Err, Ok } from '@sniptt/monads';
4
4
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
5
5
  import { SwapperName, TradeQuoteError } from '../../../types.js';
6
6
  import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
7
+ import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
7
8
  import { getButterSwapStepData } from '../utils/getButterSwapStepData.js';
8
9
  import { getButterSwapTradeContext } from '../utils/getButterSwapTradeContext.js';
9
10
  import { fetchTxData, isBuildTxSuccess } from '../xhr.js';
@@ -59,6 +60,7 @@ export const getTradeQuote = async (input, deps) => {
59
60
  const tradeQuote = {
60
61
  ...tradeCommon,
61
62
  quoteOrRate: 'quote',
63
+ deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
62
64
  receiveAddress,
63
65
  steps: [
64
66
  {
@@ -3,20 +3,22 @@ import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
3
3
  import { KnownChainIds } from '@shapeshiftoss/types';
4
4
  import { BigAmount, bnOrZero } from '@shapeshiftoss/utils';
5
5
  import { Err, Ok } from '@sniptt/monads';
6
+ import { arbitrum, avalanche, base, bsc, mainnet as ethereum, optimism, polygon, robinhood, tron, } from 'viem/chains';
6
7
  import { TradeQuoteError } from '../../../types.js';
7
8
  import { makeSwapErrorRight } from '../../../utils/index.js';
8
9
  // https://docs.butternetwork.io/butter-swap-integration/butter-api-for-routing/get-supportedchainlist#butter-chain-id-explanation
9
10
  const BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID = {
10
- 1: KnownChainIds.EthereumMainnet,
11
- 137: KnownChainIds.PolygonMainnet,
12
- 56: KnownChainIds.BnbSmartChainMainnet,
13
- 42161: KnownChainIds.ArbitrumMainnet,
14
- 10: KnownChainIds.OptimismMainnet,
15
- 8453: KnownChainIds.BaseMainnet,
16
- 43114: KnownChainIds.AvalancheMainnet,
11
+ [ethereum.id]: KnownChainIds.EthereumMainnet,
12
+ [polygon.id]: KnownChainIds.PolygonMainnet,
13
+ [bsc.id]: KnownChainIds.BnbSmartChainMainnet,
14
+ [arbitrum.id]: KnownChainIds.ArbitrumMainnet,
15
+ [optimism.id]: KnownChainIds.OptimismMainnet,
16
+ [base.id]: KnownChainIds.BaseMainnet,
17
+ [avalanche.id]: KnownChainIds.AvalancheMainnet,
18
+ [robinhood.id]: KnownChainIds.RobinhoodMainnet,
17
19
  1360108768460801: KnownChainIds.SolanaMainnet,
18
20
  1360095883558913: KnownChainIds.BitcoinMainnet,
19
- 728126428: KnownChainIds.TronMainnet,
21
+ [tron.id]: KnownChainIds.TronMainnet,
20
22
  };
21
23
  const CHAIN_ID_TO_BUTTERSWAP_CHAIN_ID = Object.entries(BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID).reduce((acc, [butterSwapChainId, chainId]) => {
22
24
  acc[chainId] = Number(butterSwapChainId);
@@ -1,5 +1,6 @@
1
1
  import { Err, Ok } from '@sniptt/monads';
2
2
  import { assertQuoteAddresses } from '../../../utils/index.js';
3
+ import { FALLBACK_QUOTE_DEADLINE_MS } from '../../../utils/helpers.js';
3
4
  import { getCetusStepData } from './getCetusStepData.js';
4
5
  import { getCetusTradeContext } from './getCetusTradeContext.js';
5
6
  export const getTradeQuote = async (input, deps) => {
@@ -24,6 +25,7 @@ export const getTradeQuote = async (input, deps) => {
24
25
  const tradeQuote = {
25
26
  ...tradeCommon,
26
27
  quoteOrRate: 'quote',
28
+ deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
27
29
  receiveAddress,
28
30
  steps: [
29
31
  {
@@ -5,6 +5,7 @@ import type { SwapSource } from '../../types.js';
5
5
  import { ChainflipNetwork } from './types.js';
6
6
  export declare const CHAINFLIP_REGULAR_QUOTE: "regular";
7
7
  export declare const CHAINFLIP_DCA_QUOTE: "dca";
8
+ export declare const CHAINFLIP_CHANNEL_DEADLINE_MS: number;
8
9
  export declare const ChainflipSupportedChainIds: readonly [KnownChainIds.EthereumMainnet, KnownChainIds.ArbitrumMainnet, KnownChainIds.BitcoinMainnet, KnownChainIds.SolanaMainnet, KnownChainIds.TronMainnet];
9
10
  export type ChainflipSupportedChainId = (typeof ChainflipSupportedChainIds)[number];
10
11
  export declare const ChainflipSupportedAssetIdsByChainId: Partial<Record<KnownChainIds, AssetId[]>>;
@@ -4,6 +4,8 @@ import { SwapperName } from '../../types.js';
4
4
  import { ChainflipNetwork } from './types.js';
5
5
  export const CHAINFLIP_REGULAR_QUOTE = 'regular';
6
6
  export const CHAINFLIP_DCA_QUOTE = 'dca';
7
+ // Deposit channels stay open ~24h - 6h keeps a 4x margin against depositing to an expired channel
8
+ export const CHAINFLIP_CHANNEL_DEADLINE_MS = 6 * 60 * 60 * 1000;
7
9
  export const ChainflipSupportedChainIds = [
8
10
  KnownChainIds.EthereumMainnet,
9
11
  KnownChainIds.ArbitrumMainnet,
@@ -1,6 +1,7 @@
1
1
  import { Err, Ok } from '@sniptt/monads';
2
2
  import { TradeQuoteError } from '../../../types.js';
3
3
  import { assertQuoteAddresses, makeSwapErrorRight } from '../../../utils/index.js';
4
+ import { CHAINFLIP_CHANNEL_DEADLINE_MS } from '../constants.js';
4
5
  import { getChainflipStepData } from '../utils/getChainflipStepData.js';
5
6
  import { getChainflipTradeContexts } from '../utils/getChainflipTradeContexts.js';
6
7
  import { calculateChainflipMinPrice, getChainFlipSwap } from '../utils/helpers.js';
@@ -66,6 +67,7 @@ export const getTradeQuote = async (input, deps) => {
66
67
  tradeQuotes.push({
67
68
  ...tradeCommon,
68
69
  quoteOrRate: 'quote',
70
+ deadline: Date.now() + CHAINFLIP_CHANNEL_DEADLINE_MS,
69
71
  receiveAddress,
70
72
  steps: [
71
73
  {