@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
@@ -9,12 +9,14 @@ import { cetusApi, cetusSwapper } from './swappers/CetusSwapper/index.js';
9
9
  import { chainflipApi, chainflipSwapper } from './swappers/ChainflipSwapper/index.js';
10
10
  import { cowApi, cowSwapper } from './swappers/CowSwapper/index.js';
11
11
  import { debridgeApi, debridgeSwapper } from './swappers/DebridgeSwapper/index.js';
12
+ import { fyndApi, fyndSwapper } from './swappers/FyndSwapper/index.js';
12
13
  import { mayachainApi, mayachainSwapper } from './swappers/MayachainSwapper/index.js';
13
14
  import { nearIntentsApi, nearIntentsSwapper } from './swappers/NearIntentsSwapper/index.js';
14
15
  import { portalsApi, portalsSwapper } from './swappers/PortalsSwapper/index.js';
15
16
  import { relayApi, relaySwapper } from './swappers/RelaySwapper/index.js';
16
17
  import { stonfiApi, stonfiSwapper } from './swappers/StonfiSwapper/index.js';
17
18
  import { sunioApi, sunioSwapper } from './swappers/SunioSwapper/index.js';
19
+ import { symbiosisApi, symbiosisSwapper } from './swappers/SymbiosisSwapper/index.js';
18
20
  import { thorchainApi, thorchainSwapper } from './swappers/ThorchainSwapper/index.js';
19
21
  import { zrxApi, zrxSwapper } from './swappers/ZrxSwapper/index.js';
20
22
  import { SwapperName, TradeQuoteError } from './types.js';
@@ -99,6 +101,14 @@ export const swappers = {
99
101
  ...bobGatewaySwapper,
100
102
  ...bobGatewayApi,
101
103
  },
104
+ [SwapperName.Symbiosis]: {
105
+ ...symbiosisSwapper,
106
+ ...symbiosisApi,
107
+ },
108
+ [SwapperName.Fynd]: {
109
+ ...fyndSwapper,
110
+ ...fyndApi,
111
+ },
102
112
  [SwapperName.Test]: undefined,
103
113
  };
104
114
  const DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE = '0.002';
@@ -118,12 +128,15 @@ const DEFAULT_STONFI_SLIPPAGE_DECIMAL_PERCENTAGE = '0.01';
118
128
  // deBridge API off-chain simulation overestimates output on some chains (e.g. SEI ~2.4%), so auto slippage (1%) is insufficient
119
129
  const DEFAULT_DEBRIDGE_SLIPPAGE_DECIMAL_PERCENTAGE = '0.03';
120
130
  const DEFAULT_BOB_GATEWAY_SLIPPAGE_DECIMAL_PERCENTAGE = '0.03';
131
+ // Symbiosis splits the tolerance across up to three legs, and a destination leg over its share pays out the transit token instead of reverting
132
+ const DEFAULT_SYMBIOSIS_SLIPPAGE_DECIMAL_PERCENTAGE = '0.01';
121
133
  export const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
122
134
  if (swapperName === undefined)
123
135
  return DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE;
124
136
  switch (swapperName) {
125
137
  case SwapperName.Zrx:
126
138
  case SwapperName.Bebop:
139
+ case SwapperName.Fynd:
127
140
  case SwapperName.Test:
128
141
  return DEFAULT_SLIPPAGE_DECIMAL_PERCENTAGE;
129
142
  case SwapperName.CowSwap:
@@ -158,6 +171,8 @@ export const getDefaultSlippageDecimalPercentageForSwapper = (swapperName) => {
158
171
  return DEFAULT_STONFI_SLIPPAGE_DECIMAL_PERCENTAGE;
159
172
  case SwapperName.BobGateway:
160
173
  return DEFAULT_BOB_GATEWAY_SLIPPAGE_DECIMAL_PERCENTAGE;
174
+ case SwapperName.Symbiosis:
175
+ return DEFAULT_SYMBIOSIS_SLIPPAGE_DECIMAL_PERCENTAGE;
161
176
  default:
162
177
  return assertUnreachable(swapperName);
163
178
  }
@@ -15,11 +15,13 @@ export * from './swappers/ChainflipSwapper/index.js';
15
15
  export * from './swappers/SunioSwapper/index.js';
16
16
  export * from './swappers/CowSwapper/index.js';
17
17
  export * from './swappers/DebridgeSwapper/index.js';
18
+ export * from './swappers/FyndSwapper/index.js';
18
19
  export * from './swappers/PortalsSwapper/index.js';
19
20
  export * from './swappers/ThorchainSwapper/index.js';
20
21
  export * from './swappers/MayachainSwapper/index.js';
21
22
  export * from './swappers/ButterSwap/index.js';
22
23
  export * from './swappers/RelaySwapper/index.js';
24
+ export * from './swappers/SymbiosisSwapper/index.js';
23
25
  export * from './utils/helpers.js';
24
26
  export * from './utils/thorchain/index.js';
25
27
  export * from './types.js';
package/dist/esm/index.js CHANGED
@@ -15,11 +15,13 @@ export * from './swappers/ChainflipSwapper/index.js';
15
15
  export * from './swappers/SunioSwapper/index.js';
16
16
  export * from './swappers/CowSwapper/index.js';
17
17
  export * from './swappers/DebridgeSwapper/index.js';
18
+ export * from './swappers/FyndSwapper/index.js';
18
19
  export * from './swappers/PortalsSwapper/index.js';
19
20
  export * from './swappers/ThorchainSwapper/index.js';
20
21
  export * from './swappers/MayachainSwapper/index.js';
21
22
  export * from './swappers/ButterSwap/index.js';
22
23
  export * from './swappers/RelaySwapper/index.js';
24
+ export * from './swappers/SymbiosisSwapper/index.js';
23
25
  export * from './utils/helpers.js';
24
26
  export * from './utils/thorchain/index.js';
25
27
  export * from './types.js';
@@ -1,7 +1,6 @@
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';
5
4
  import { getArbitrumBridgeStepData } from '../utils/getArbitrumBridgeStepData.js';
6
5
  import { getArbitrumBridgeTradeContext } from '../utils/getArbitrumBridgeTradeContext.js';
7
6
  export const getTradeQuoteWithWallet = async (inputWithWallet, deps) => {
@@ -33,7 +32,6 @@ export const getTradeQuote = async (input, deps) => {
33
32
  const tradeQuote = {
34
33
  ...tradeCommon,
35
34
  quoteOrRate: 'quote',
36
- deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
37
35
  receiveAddress,
38
36
  steps: [
39
37
  {
@@ -2,7 +2,6 @@ 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';
6
5
  import { getAvnuTradeContext } from '../utils/getAvnuTradeContext.js';
7
6
  export const getTradeQuote = async (input, deps) => {
8
7
  const { sellAsset, accountNumber } = input;
@@ -33,7 +32,7 @@ export const getTradeQuote = async (input, deps) => {
33
32
  ...tradeCommon,
34
33
  receiveAddress: normalizedReceiveAddress,
35
34
  quoteOrRate: 'quote',
36
- deadline: deadline ?? Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
35
+ deadline,
37
36
  steps: [
38
37
  {
39
38
  ...stepCommon,
@@ -13,12 +13,13 @@ export declare const fetchBebopQuote: ({ buyAsset, sellAsset, sellAmountIncludin
13
13
  affiliateBps?: string | undefined;
14
14
  apiKey: string;
15
15
  }) => Promise<Result<BebopQuoteResponse, SwapErrorRight>>;
16
- export declare const fetchBebopSolanaQuote: ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, apiKey, }: {
16
+ export declare const fetchBebopSolanaQuote: ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }: {
17
17
  buyAsset: Asset;
18
18
  sellAsset: Asset;
19
19
  sellAmountIncludingProtocolFeesCryptoBaseUnit: string;
20
20
  takerAddress: string;
21
21
  receiverAddress: string;
22
22
  slippageTolerancePercentageDecimal: string;
23
+ affiliateBps?: string | undefined;
23
24
  apiKey: string;
24
25
  }) => Promise<Result<BebopSolanaQuoteResponse, SwapErrorRight>>;
@@ -8,6 +8,9 @@ import { getTreasuryAddressFromChainId } from '../../../utils/helpers.js';
8
8
  import { chainIdToBebopChain } from '../types.js';
9
9
  import { bebopServiceFactory } from './bebopService.js';
10
10
  import { assetIdToBebopSolanaToken, assetIdToBebopToken } from './helpers.js';
11
+ // PMM charges the fee set against our api key, which nets exactly this bps
12
+ const BEBOP_PMM_AFFILIATE_BPS = '60';
13
+ const isPmmEligible = (affiliateBps) => bnOrZero(affiliateBps).eq(BEBOP_PMM_AFFILIATE_BPS);
11
14
  export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }) => {
12
15
  try {
13
16
  const sellToken = assetIdToBebopToken(sellAsset.assetId);
@@ -27,26 +30,24 @@ export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncluding
27
30
  approval_type: 'Standard',
28
31
  skip_validation: 'true',
29
32
  gasless: 'false',
30
- // PMM fees are configured against our api key on Bebop's side, not sent per quote
31
33
  source: 'shapeshift',
32
34
  };
33
35
  const jamParams = new URLSearchParams(baseParams);
34
- const pmmParams = new URLSearchParams(baseParams);
35
- // JAM settles the fee on-chain, so it still takes our bps and a recipient per quote
36
- if (affiliateBps && affiliateBps !== '0') {
37
- jamParams.set('fee', affiliateBps);
38
- jamParams.set('fee_recipient', getAddress(getTreasuryAddressFromChainId(buyAsset.chainId)));
39
- }
36
+ // Without an explicit fee JAM charges our api key's flat fee, so 1 bps is the lowest it can go
37
+ jamParams.set('fee', affiliateBps && bnOrZero(affiliateBps).gt(0) ? affiliateBps : '1');
38
+ jamParams.set('fee_recipient', getAddress(getTreasuryAddressFromChainId(buyAsset.chainId)));
40
39
  const service = bebopServiceFactory({ apiKey });
41
- const [maybeJam, maybePmm] = await Promise.all([
40
+ const requests = [
42
41
  service.get(`https://api.bebop.xyz/jam/${chainName}/v2/quote`, {
43
42
  params: jamParams,
44
43
  }),
45
- service.get(`https://api.bebop.xyz/pmm/${chainName}/v3/quote`, {
46
- params: pmmParams,
47
- }),
48
- ]);
49
- const maybeResponses = [maybeJam, maybePmm];
44
+ ];
45
+ if (isPmmEligible(affiliateBps)) {
46
+ requests.push(service.get(`https://api.bebop.xyz/pmm/${chainName}/v3/quote`, {
47
+ params: new URLSearchParams(baseParams),
48
+ }));
49
+ }
50
+ const maybeResponses = await Promise.all(requests);
50
51
  if (maybeResponses.every(maybeResponse => maybeResponse.isErr())) {
51
52
  return Err(makeSwapErrorRight({
52
53
  message: 'Failed to fetch quote from Bebop',
@@ -76,8 +77,14 @@ export const fetchBebopQuote = async ({ buyAsset, sellAsset, sellAmountIncluding
76
77
  }));
77
78
  }
78
79
  };
79
- export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, apiKey, }) => {
80
+ export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, takerAddress, receiverAddress, slippageTolerancePercentageDecimal, affiliateBps, apiKey, }) => {
80
81
  try {
82
+ if (!isPmmEligible(affiliateBps)) {
83
+ return Err(makeSwapErrorRight({
84
+ message: 'Bebop Solana is PMM only and cannot take the requested bps',
85
+ code: TradeQuoteError.NoRouteFound,
86
+ }));
87
+ }
81
88
  // Bebop's Solana routes don't wrap native SOL on the input side, so selling native SOL
82
89
  // always fails on-chain. Reject up front instead of returning an unexecutable quote.
83
90
  if (sellAsset.assetId === solAssetId) {
@@ -100,7 +107,6 @@ export const fetchBebopSolanaQuote = async ({ buyAsset, sellAsset, sellAmountInc
100
107
  approval_type: 'Standard',
101
108
  skip_validation: 'false',
102
109
  gasless: 'true',
103
- // Solana is PMM only, so its fees are configured against our api key on Bebop's side
104
110
  source: 'shapeshift',
105
111
  });
106
112
  const maybeResponse = await bebopServiceFactory({ apiKey }).get('https://api.bebop.xyz/pmm/solana/v3/quote', { params });
@@ -19,6 +19,7 @@ export const getBebopSolanaTradeContext = async ({ input, deps, takerAddress, re
19
19
  takerAddress,
20
20
  receiverAddress,
21
21
  slippageTolerancePercentageDecimal,
22
+ affiliateBps,
22
23
  apiKey: deps.config.VITE_BEBOP_API_KEY,
23
24
  });
24
25
  if (maybeBebopQuoteResponse.isErr())
@@ -1,7 +1,6 @@
1
1
  import { btcChainId } from '@shapeshiftoss/caip';
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';
5
4
  import { getBobGatewayStepData } from '../utils/getBobGatewayStepData.js';
6
5
  import { getBobGatewayTradeContext } from '../utils/getBobGatewayTradeContext.js';
7
6
  export const getBobGatewayTradeQuote = async (input, deps) => {
@@ -35,7 +34,6 @@ export const getBobGatewayTradeQuote = async (input, deps) => {
35
34
  const tradeQuote = {
36
35
  ...tradeCommon,
37
36
  quoteOrRate: 'quote',
38
- deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
39
37
  receiveAddress,
40
38
  steps: [
41
39
  {
@@ -4,7 +4,6 @@ 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';
8
7
  import { getButterSwapStepData } from '../utils/getButterSwapStepData.js';
9
8
  import { getButterSwapTradeContext } from '../utils/getButterSwapTradeContext.js';
10
9
  import { fetchTxData, isBuildTxSuccess } from '../xhr.js';
@@ -60,7 +59,6 @@ export const getTradeQuote = async (input, deps) => {
60
59
  const tradeQuote = {
61
60
  ...tradeCommon,
62
61
  quoteOrRate: 'quote',
63
- deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
64
62
  receiveAddress,
65
63
  steps: [
66
64
  {
@@ -1,6 +1,5 @@
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';
4
3
  import { getCetusStepData } from './getCetusStepData.js';
5
4
  import { getCetusTradeContext } from './getCetusTradeContext.js';
6
5
  export const getTradeQuote = async (input, deps) => {
@@ -25,7 +24,6 @@ export const getTradeQuote = async (input, deps) => {
25
24
  const tradeQuote = {
26
25
  ...tradeCommon,
27
26
  quoteOrRate: 'quote',
28
- deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
29
27
  receiveAddress,
30
28
  steps: [
31
29
  {
@@ -73,8 +73,7 @@ export const getTradeQuote = async (input, deps) => {
73
73
  {
74
74
  ...stepCommon,
75
75
  accountNumber,
76
- chainflipSpecific: { depositAddress },
77
- swapperMetadata: { name: 'chainflip', swapId },
76
+ swapperMetadata: { name: 'chainflip', swapId, depositAddress },
78
77
  transactionData,
79
78
  feeData: { networkFeeCryptoBaseUnit, protocolFees },
80
79
  },
@@ -6,6 +6,7 @@ export type ChainflipTradeRateInput = GetEvmTradeRateInput | GetUtxoTradeRateInp
6
6
  export type ChainflipMetadata = {
7
7
  name: 'chainflip';
8
8
  swapId: number | string;
9
+ depositAddress: string;
9
10
  };
10
11
  export type ChainFlipStatus = {
11
12
  status: {
@@ -1,6 +1,5 @@
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';
4
3
  import { getDebridgeStepData } from '../utils/getDebridgeStepData.js';
5
4
  import { getDebridgeTradeContext } from '../utils/getDebridgeTradeContext.js';
6
5
  export const getTradeQuote = async (input, deps) => {
@@ -24,7 +23,6 @@ export const getTradeQuote = async (input, deps) => {
24
23
  const tradeQuote = {
25
24
  ...tradeCommon,
26
25
  quoteOrRate: 'quote',
27
- deadline: Date.now() + FALLBACK_QUOTE_DEADLINE_MS,
28
26
  receiveAddress,
29
27
  steps: [
30
28
  {
@@ -0,0 +1,2 @@
1
+ import type { Swapper } from '../../types.js';
2
+ export declare const fyndSwapper: Swapper;
@@ -0,0 +1,2 @@
1
+ import { executeEvmTransaction } from '../../utils/index.js';
2
+ export const fyndSwapper = { executeEvmTransaction };
@@ -0,0 +1,2 @@
1
+ import type { SwapperApi } from '../../types.js';
2
+ export declare const fyndApi: SwapperApi;
@@ -0,0 +1,11 @@
1
+ import { checkEvmSwapStatus } from '../../utils/index.js';
2
+ import { getEvmTransactionFees, getUnsignedEvmTransaction } from '../../utils/evm/index.js';
3
+ import { getTradeQuote } from './getTradeQuote/getTradeQuote.js';
4
+ import { getTradeRate } from './getTradeRate/getTradeRate.js';
5
+ export const fyndApi = {
6
+ getTradeQuote: (input, deps) => getTradeQuote(input, deps),
7
+ getTradeRate: (input, deps) => getTradeRate(input, deps),
8
+ getUnsignedEvmTransaction,
9
+ getEvmTransactionFees,
10
+ checkTradeStatus: checkEvmSwapStatus,
11
+ };
@@ -0,0 +1,4 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { SwapErrorRight, SwapperDeps, TradeQuote } from '../../../types.js';
3
+ import type { FyndTradeQuoteInput } from '../types.js';
4
+ export declare const getTradeQuote: (input: FyndTradeQuoteInput, deps: SwapperDeps) => Promise<Result<TradeQuote[], SwapErrorRight>>;
@@ -0,0 +1,39 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { assertQuoteAddresses } from '../../../utils/index.js';
3
+ import { getFyndStepData } from '../utils/getFyndStepData.js';
4
+ import { getFyndTradeContext } from '../utils/getFyndTradeContext.js';
5
+ export const getTradeQuote = async (input, deps) => {
6
+ const { accountNumber } = input;
7
+ const maybeAddresses = assertQuoteAddresses(input);
8
+ if (maybeAddresses.isErr())
9
+ return Err(maybeAddresses.unwrapErr());
10
+ const { sendAddress, receiveAddress } = maybeAddresses.unwrap();
11
+ const maybeContext = await getFyndTradeContext({
12
+ input,
13
+ deps,
14
+ from: sendAddress,
15
+ to: receiveAddress,
16
+ });
17
+ if (maybeContext.isErr())
18
+ return Err(maybeContext.unwrapErr());
19
+ const { tradeCommon, stepCommon, protocolFees, deadline, stepDataArgs } = maybeContext.unwrap();
20
+ const maybeStepData = await getFyndStepData({ ...stepDataArgs, type: 'quote', input });
21
+ if (maybeStepData.isErr())
22
+ return Err(maybeStepData.unwrapErr());
23
+ const { transactionData, networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
24
+ const tradeQuote = {
25
+ ...tradeCommon,
26
+ quoteOrRate: 'quote',
27
+ receiveAddress,
28
+ deadline,
29
+ steps: [
30
+ {
31
+ ...stepCommon,
32
+ accountNumber,
33
+ transactionData,
34
+ feeData: { networkFeeCryptoBaseUnit, protocolFees },
35
+ },
36
+ ],
37
+ };
38
+ return Ok([tradeQuote]);
39
+ };
@@ -0,0 +1,4 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { SwapErrorRight, SwapperDeps, TradeRate } from '../../../types.js';
3
+ import type { FyndTradeRateInput } from '../types.js';
4
+ export declare const getTradeRate: (input: FyndTradeRateInput, deps: SwapperDeps) => Promise<Result<TradeRate[], SwapErrorRight>>;
@@ -0,0 +1,30 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { EVM_PLACEHOLDER_ADDRESS } from '../../../utils/evm/constants.js';
3
+ import { getFyndStepData } from '../utils/getFyndStepData.js';
4
+ import { getFyndTradeContext } from '../utils/getFyndTradeContext.js';
5
+ export const getTradeRate = async (input, deps) => {
6
+ const { accountNumber, sendAddress, receiveAddress } = input;
7
+ const from = sendAddress ?? EVM_PLACEHOLDER_ADDRESS;
8
+ const to = receiveAddress ?? from;
9
+ const maybeContext = await getFyndTradeContext({ input, deps, from, to });
10
+ if (maybeContext.isErr())
11
+ return Err(maybeContext.unwrapErr());
12
+ const { tradeCommon, stepCommon, protocolFees, stepDataArgs } = maybeContext.unwrap();
13
+ const maybeStepData = await getFyndStepData({ ...stepDataArgs, type: 'rate', input });
14
+ if (maybeStepData.isErr())
15
+ return Err(maybeStepData.unwrapErr());
16
+ const { networkFeeCryptoBaseUnit } = maybeStepData.unwrap();
17
+ const tradeRate = {
18
+ ...tradeCommon,
19
+ quoteOrRate: 'rate',
20
+ receiveAddress,
21
+ steps: [
22
+ {
23
+ ...stepCommon,
24
+ accountNumber,
25
+ feeData: { networkFeeCryptoBaseUnit, protocolFees },
26
+ },
27
+ ],
28
+ };
29
+ return Ok([tradeRate]);
30
+ };
@@ -0,0 +1,2 @@
1
+ export { fyndApi } from './endpoints.js';
2
+ export { fyndSwapper } from './FyndSwapper.js';
@@ -0,0 +1,2 @@
1
+ export { fyndApi } from './endpoints.js';
2
+ export { fyndSwapper } from './FyndSwapper.js';
@@ -0,0 +1,41 @@
1
+ import type { Address, Hex } from 'viem';
2
+ import type { GetEvmTradeQuoteInput, GetEvmTradeRateInput } from '../../types.js';
3
+ export type FyndTradeQuoteInput = GetEvmTradeQuoteInput;
4
+ export type FyndTradeRateInput = GetEvmTradeRateInput;
5
+ export type FyndTransaction = {
6
+ to: Address;
7
+ value: string;
8
+ data: Hex;
9
+ client_fee_signature_offset?: number | null;
10
+ };
11
+ export type FyndFeeBreakdown = {
12
+ router_fee: string;
13
+ client_fee: string;
14
+ max_slippage: string;
15
+ min_amount_received: string;
16
+ };
17
+ export type FyndErrorResponse = {
18
+ error: string;
19
+ code: string;
20
+ };
21
+ export type FyndRouteSwap = {
22
+ protocol: string;
23
+ };
24
+ export type FyndEncodedQuote = {
25
+ status: 'success';
26
+ amount_in: string;
27
+ amount_out: string;
28
+ gas_estimate: string;
29
+ route?: {
30
+ swaps: FyndRouteSwap[];
31
+ } | null;
32
+ transaction: FyndTransaction;
33
+ fee_breakdown: FyndFeeBreakdown;
34
+ client_fee_deadline?: number | null;
35
+ };
36
+ export type FyndFailedOrder = {
37
+ status: 'no_route_found' | 'insufficient_liquidity' | 'timeout' | 'not_ready' | 'price_check_failed' | 'encoding_failed';
38
+ };
39
+ export type FyndQuoteResponse = {
40
+ orders: (FyndEncodedQuote | FyndFailedOrder)[];
41
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ export declare const FYND_CHAINS: {
2
+ readonly "eip155:1": {
3
+ readonly name: "ethereum";
4
+ readonly routerAddress: "0x1644d2477f809cc2c71bccfd6dc9497e3f83210d";
5
+ };
6
+ readonly "eip155:8453": {
7
+ readonly name: "base";
8
+ readonly routerAddress: "0xaba5b53b03eafad1c5fc8bd5fc765fc85bb3de67";
9
+ };
10
+ readonly "eip155:42161": {
11
+ readonly name: "arbitrum";
12
+ readonly routerAddress: "0x924f147c50ea59f5180a26031a8b65b2aa1e81cd";
13
+ };
14
+ readonly "eip155:56": {
15
+ readonly name: "bsc";
16
+ readonly routerAddress: "0x7f3d12bbafb8955e51b3ab9588b34c8ad95bda4e";
17
+ };
18
+ readonly "eip155:137": {
19
+ readonly name: "polygon";
20
+ readonly routerAddress: "0xbd4e6011f03355c2a377fd9af939322a7d0a1bc1";
21
+ };
22
+ readonly "eip155:130": {
23
+ readonly name: "unichain";
24
+ readonly routerAddress: "0xcba5574597ad00ea250fd106dab4fc7461949635";
25
+ };
26
+ readonly "eip155:4663": {
27
+ readonly name: "robinhood";
28
+ readonly routerAddress: "0x09215a470bd585e59eb3f4b612fbd2678131ff9e";
29
+ };
30
+ };
31
+ export type FyndSupportedChainId = keyof typeof FYND_CHAINS;
32
+ export declare const FYND_CLIENT_FEE_SHARE = 0.8;
33
+ export declare const FYND_CLIENT_FEE_SIGNATURE_BYTES = 65;
@@ -0,0 +1,35 @@
1
+ import { KnownChainIds } from '@shapeshiftoss/types';
2
+ // Fynd Router Registry: https://docs.propellerheads.xyz/tycho/for-solvers/execution/contract-addresses
3
+ export const FYND_CHAINS = {
4
+ [KnownChainIds.EthereumMainnet]: {
5
+ name: 'ethereum',
6
+ routerAddress: '0x1644d2477f809cc2c71bccfd6dc9497e3f83210d',
7
+ },
8
+ [KnownChainIds.BaseMainnet]: {
9
+ name: 'base',
10
+ routerAddress: '0xaba5b53b03eafad1c5fc8bd5fc765fc85bb3de67',
11
+ },
12
+ [KnownChainIds.ArbitrumMainnet]: {
13
+ name: 'arbitrum',
14
+ routerAddress: '0x924f147c50ea59f5180a26031a8b65b2aa1e81cd',
15
+ },
16
+ [KnownChainIds.BnbSmartChainMainnet]: {
17
+ name: 'bsc',
18
+ routerAddress: '0x7f3d12bbafb8955e51b3ab9588b34c8ad95bda4e',
19
+ },
20
+ [KnownChainIds.PolygonMainnet]: {
21
+ name: 'polygon',
22
+ routerAddress: '0xbd4e6011f03355c2a377fd9af939322a7d0a1bc1',
23
+ },
24
+ [KnownChainIds.UnichainMainnet]: {
25
+ name: 'unichain',
26
+ routerAddress: '0xcba5574597ad00ea250fd106dab4fc7461949635',
27
+ },
28
+ [KnownChainIds.RobinhoodMainnet]: {
29
+ name: 'robinhood',
30
+ routerAddress: '0x09215a470bd585e59eb3f4b612fbd2678131ff9e',
31
+ },
32
+ };
33
+ // Fynd keeps 20% of the client fee, so request the gross bps that nets affiliateBps
34
+ export const FYND_CLIENT_FEE_SHARE = 0.8;
35
+ export const FYND_CLIENT_FEE_SIGNATURE_BYTES = 65;
@@ -0,0 +1,13 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { SwapErrorRight } from '../../../types.js';
3
+ import type { FyndEncodedQuote, FyndTradeQuoteInput, FyndTradeRateInput } from '../types.js';
4
+ import type { FyndSupportedChainId } from './constants.js';
5
+ export declare const fetchFromFynd: ({ input, chainId, sender, receiver, slippageTolerancePercentageDecimal, clientFeeBps, baseUrl, }: {
6
+ input: FyndTradeQuoteInput | FyndTradeRateInput;
7
+ chainId: FyndSupportedChainId;
8
+ sender: string;
9
+ receiver: string;
10
+ slippageTolerancePercentageDecimal: string;
11
+ clientFeeBps: number;
12
+ baseUrl: string;
13
+ }) => Promise<Result<FyndEncodedQuote, SwapErrorRight>>;
@@ -0,0 +1,38 @@
1
+ import { Err } from '@sniptt/monads';
2
+ import { FYND_CHAINS } from './constants.js';
3
+ import { fyndService } from './fyndService.js';
4
+ import { convertAssetIdToFyndToken, getFyndRequestError, validateFyndQuoteResponse, } from './helpers.js';
5
+ export const fetchFromFynd = async ({ input, chainId, sender, receiver, slippageTolerancePercentageDecimal, clientFeeBps, baseUrl, }) => {
6
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit } = input;
7
+ const maybeResponse = await fyndService.post(`${baseUrl}/${FYND_CHAINS[chainId].name}/quote`, {
8
+ orders: [
9
+ {
10
+ token_in: convertAssetIdToFyndToken(sellAsset.assetId),
11
+ token_out: convertAssetIdToFyndToken(buyAsset.assetId),
12
+ amount: sellAmountIncludingProtocolFeesCryptoBaseUnit,
13
+ side: 'sell',
14
+ sender,
15
+ receiver,
16
+ },
17
+ ],
18
+ options: {
19
+ timeout_ms: 5_000,
20
+ min_responses: 1,
21
+ encoding_options: {
22
+ slippage: slippageTolerancePercentageDecimal,
23
+ transfer_type: 'transfer_from',
24
+ // The proxy sets the fee receiver and deadline and signs the quote
25
+ ...(clientFeeBps > 0 ? { client_fee_params: { bps: clientFeeBps } } : {}),
26
+ },
27
+ },
28
+ });
29
+ if (maybeResponse.isErr())
30
+ return Err(getFyndRequestError(maybeResponse.unwrapErr()));
31
+ return validateFyndQuoteResponse(maybeResponse.unwrap().data, {
32
+ chainId,
33
+ sellAsset,
34
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
35
+ slippageTolerancePercentageDecimal,
36
+ clientFeeBps,
37
+ });
38
+ };
@@ -0,0 +1,5 @@
1
+ export declare const fyndService: {
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>>;
5
+ };
@@ -0,0 +1,3 @@
1
+ import axios from 'axios';
2
+ import { makeSwapperAxiosServiceMonadic } from '../../../utils/index.js';
3
+ export const fyndService = makeSwapperAxiosServiceMonadic(axios.create({ timeout: 10_000 }));
@@ -0,0 +1,25 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.js';
3
+ import type { FyndEncodedQuote } from '../types.js';
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 {};