@shapeshiftoss/swapper 17.6.10 → 17.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/cjs/.tsbuildinfo +1 -1
  3. package/dist/cjs/constants.js +11 -10
  4. package/dist/cjs/cowswap-utils/constants.js +3 -0
  5. package/dist/cjs/cowswap-utils/index.js +6 -0
  6. package/dist/cjs/index.d.ts +1 -1
  7. package/dist/cjs/index.js +1 -1
  8. package/dist/cjs/solana-utils/getUnsignedSolanaTransaction.js +4 -2
  9. package/dist/cjs/swappers/AcrossSwapper/constant.js +2 -0
  10. package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.js +15 -1
  11. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +12 -1
  12. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +9 -0
  13. package/dist/cjs/swappers/BebopSwapper/BebopSwapper.js +2 -0
  14. package/dist/cjs/swappers/BebopSwapper/endpoints.js +35 -2
  15. package/dist/cjs/swappers/BebopSwapper/executeSolanaMessage.d.ts +2 -0
  16. package/dist/cjs/swappers/BebopSwapper/executeSolanaMessage.js +47 -0
  17. package/dist/cjs/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.d.ts +4 -0
  18. package/dist/cjs/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.js +91 -0
  19. package/dist/cjs/swappers/BebopSwapper/getBebopSolanaTradeRate/getBebopSolanaTradeRate.d.ts +4 -0
  20. package/dist/cjs/swappers/BebopSwapper/getBebopSolanaTradeRate/getBebopSolanaTradeRate.js +88 -0
  21. package/dist/cjs/swappers/BebopSwapper/getBebopTradeQuote/getBebopTradeQuote.js +10 -0
  22. package/dist/cjs/swappers/BebopSwapper/getBebopTradeRate/getBebopTradeRate.js +10 -0
  23. package/dist/cjs/swappers/BebopSwapper/types.d.ts +49 -1
  24. package/dist/cjs/swappers/BebopSwapper/types.js +9 -2
  25. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +19 -1
  26. package/dist/cjs/swappers/BebopSwapper/utils/fetchFromBebop.js +86 -1
  27. package/dist/cjs/swappers/BebopSwapper/utils/helpers/helpers.d.ts +13 -1
  28. package/dist/cjs/swappers/BebopSwapper/utils/helpers/helpers.js +47 -1
  29. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +17 -1
  30. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.js +10 -0
  31. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +10 -0
  32. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +10 -0
  33. package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +1 -1
  34. package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +1 -1
  35. package/dist/cjs/swappers/ChainflipSwapper/constants.js +7 -3
  36. package/dist/cjs/swappers/ChainflipSwapper/endpoints.js +14 -4
  37. package/dist/cjs/swappers/ChainflipSwapper/types.d.ts +1 -0
  38. package/dist/cjs/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +17 -0
  39. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +10 -0
  40. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +9 -0
  41. package/dist/cjs/swappers/DebridgeSwapper/DebridgeSwapper.d.ts +2 -0
  42. package/dist/cjs/swappers/DebridgeSwapper/DebridgeSwapper.js +7 -0
  43. package/dist/cjs/swappers/DebridgeSwapper/constant.d.ts +5 -0
  44. package/dist/cjs/swappers/DebridgeSwapper/constant.js +36 -0
  45. package/dist/cjs/swappers/{JupiterSwapper → DebridgeSwapper}/endpoints.d.ts +1 -1
  46. package/dist/cjs/swappers/DebridgeSwapper/endpoints.js +217 -0
  47. package/dist/cjs/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +31 -0
  48. package/dist/cjs/swappers/DebridgeSwapper/getTradeRate/getTradeRate.js +19 -0
  49. package/dist/cjs/swappers/DebridgeSwapper/index.d.ts +1 -0
  50. package/dist/cjs/swappers/DebridgeSwapper/index.js +5 -0
  51. package/dist/cjs/swappers/{JupiterSwapper/utils/jupiterService.d.ts → DebridgeSwapper/utils/debridgeService.d.ts} +1 -1
  52. package/dist/cjs/swappers/DebridgeSwapper/utils/debridgeService.js +17 -0
  53. package/dist/cjs/swappers/DebridgeSwapper/utils/fetchDebridgeSingleChainTrade.d.ts +16 -0
  54. package/dist/cjs/swappers/DebridgeSwapper/utils/fetchDebridgeSingleChainTrade.js +23 -0
  55. package/dist/cjs/swappers/DebridgeSwapper/utils/fetchDebridgeTrade.d.ts +20 -0
  56. package/dist/cjs/swappers/DebridgeSwapper/utils/fetchDebridgeTrade.js +29 -0
  57. package/dist/cjs/swappers/DebridgeSwapper/utils/getTrade.d.ts +11 -0
  58. package/dist/cjs/swappers/DebridgeSwapper/utils/getTrade.js +367 -0
  59. package/dist/cjs/swappers/DebridgeSwapper/utils/types.d.ts +155 -0
  60. package/dist/cjs/swappers/DebridgeSwapper/utils/types.js +9 -0
  61. package/dist/cjs/swappers/MayachainSwapper/utils/poolAssetHelpers/poolAssetHelpers.js +1 -1
  62. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +12 -0
  63. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +12 -0
  64. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +10 -0
  65. package/dist/cjs/swappers/RelaySwapper/constant.js +7 -10
  66. package/dist/cjs/swappers/RelaySwapper/endpoints.js +1 -1
  67. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +56 -7
  68. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +22 -7
  69. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +12 -1
  70. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.js +10 -0
  71. package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +10 -0
  72. package/dist/cjs/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
  73. package/dist/cjs/swappers/ThorchainSwapper/endpoints.js +2 -0
  74. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  75. package/dist/cjs/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.d.ts +1 -1
  76. package/dist/cjs/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.js +2 -1
  77. package/dist/cjs/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.test.js +10 -0
  78. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +9 -0
  79. package/dist/cjs/swappers/ZrxSwapper/getZrxTradeRate/getZrxTradeRate.js +9 -0
  80. package/dist/cjs/swappers/utils/affiliateFee.d.ts +17 -0
  81. package/dist/cjs/swappers/utils/affiliateFee.js +43 -0
  82. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +57 -4
  83. package/dist/cjs/thorchain-utils/index.d.ts +2 -1
  84. package/dist/cjs/thorchain-utils/index.js +2 -1
  85. package/dist/cjs/thorchain-utils/solana/constants.d.ts +1 -0
  86. package/dist/cjs/thorchain-utils/solana/constants.js +6 -0
  87. package/dist/cjs/thorchain-utils/solana/getSolanaTransactionFees.d.ts +2 -0
  88. package/dist/cjs/thorchain-utils/solana/getSolanaTransactionFees.js +41 -0
  89. package/dist/cjs/thorchain-utils/solana/getThorTxData.d.ts +12 -0
  90. package/dist/cjs/thorchain-utils/solana/getThorTxData.js +14 -0
  91. package/dist/cjs/thorchain-utils/solana/getUnsignedSolanaTransaction.d.ts +3 -0
  92. package/dist/cjs/thorchain-utils/solana/getUnsignedSolanaTransaction.js +64 -0
  93. package/dist/cjs/thorchain-utils/solana/index.d.ts +3 -0
  94. package/dist/cjs/{swappers/JupiterSwapper → thorchain-utils/solana}/index.js +3 -2
  95. package/dist/cjs/tron-utils/getUnsignedTronTransaction.js +16 -0
  96. package/dist/cjs/types.d.ts +47 -11
  97. package/dist/cjs/types.js +1 -1
  98. package/dist/cjs/utils.d.ts +3 -0
  99. package/dist/cjs/utils.js +9 -3
  100. package/dist/esm/.tsbuildinfo +1 -1
  101. package/dist/esm/constants.js +11 -10
  102. package/dist/esm/cowswap-utils/constants.js +3 -0
  103. package/dist/esm/cowswap-utils/index.js +6 -0
  104. package/dist/esm/index.d.ts +1 -1
  105. package/dist/esm/index.js +1 -1
  106. package/dist/esm/solana-utils/getUnsignedSolanaTransaction.js +3 -1
  107. package/dist/esm/swappers/AcrossSwapper/constant.js +4 -2
  108. package/dist/esm/swappers/AcrossSwapper/utils/getTrade.js +15 -1
  109. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +12 -1
  110. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +9 -0
  111. package/dist/esm/swappers/BebopSwapper/BebopSwapper.js +2 -0
  112. package/dist/esm/swappers/BebopSwapper/endpoints.js +36 -3
  113. package/dist/esm/swappers/BebopSwapper/executeSolanaMessage.d.ts +2 -0
  114. package/dist/esm/swappers/BebopSwapper/executeSolanaMessage.js +40 -0
  115. package/dist/esm/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.d.ts +4 -0
  116. package/dist/esm/swappers/BebopSwapper/getBebopSolanaTradeQuote/getBebopSolanaTradeQuote.js +87 -0
  117. package/dist/esm/swappers/BebopSwapper/getBebopSolanaTradeRate/getBebopSolanaTradeRate.d.ts +4 -0
  118. package/dist/esm/swappers/BebopSwapper/getBebopSolanaTradeRate/getBebopSolanaTradeRate.js +84 -0
  119. package/dist/esm/swappers/BebopSwapper/getBebopTradeQuote/getBebopTradeQuote.js +10 -0
  120. package/dist/esm/swappers/BebopSwapper/getBebopTradeRate/getBebopTradeRate.js +10 -0
  121. package/dist/esm/swappers/BebopSwapper/types.d.ts +49 -1
  122. package/dist/esm/swappers/BebopSwapper/types.js +8 -1
  123. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.d.ts +19 -1
  124. package/dist/esm/swappers/BebopSwapper/utils/fetchFromBebop.js +85 -2
  125. package/dist/esm/swappers/BebopSwapper/utils/helpers/helpers.d.ts +13 -1
  126. package/dist/esm/swappers/BebopSwapper/utils/helpers/helpers.js +44 -1
  127. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +17 -1
  128. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.js +10 -0
  129. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +10 -0
  130. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +10 -0
  131. package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +1 -1
  132. package/dist/esm/swappers/CetusSwapper/utils/helpers.js +1 -1
  133. package/dist/esm/swappers/ChainflipSwapper/constants.js +8 -4
  134. package/dist/esm/swappers/ChainflipSwapper/endpoints.js +14 -4
  135. package/dist/esm/swappers/ChainflipSwapper/types.d.ts +1 -0
  136. package/dist/esm/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +17 -0
  137. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +10 -0
  138. package/dist/esm/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +9 -0
  139. package/dist/esm/swappers/{JupiterSwapper/JupiterSwapper.d.ts → DebridgeSwapper/DebridgeSwapper.d.ts} +1 -1
  140. package/dist/esm/swappers/DebridgeSwapper/DebridgeSwapper.js +4 -0
  141. package/dist/esm/swappers/DebridgeSwapper/constant.d.ts +5 -0
  142. package/dist/esm/swappers/DebridgeSwapper/constant.js +30 -0
  143. package/dist/esm/swappers/{JupiterSwapper → DebridgeSwapper}/endpoints.d.ts +1 -1
  144. package/dist/esm/swappers/DebridgeSwapper/endpoints.js +211 -0
  145. package/dist/esm/swappers/DebridgeSwapper/getTradeQuote/getTradeQuote.js +27 -0
  146. package/dist/esm/swappers/DebridgeSwapper/getTradeRate/getTradeRate.js +15 -0
  147. package/dist/esm/swappers/DebridgeSwapper/index.d.ts +1 -0
  148. package/dist/esm/swappers/DebridgeSwapper/index.js +1 -0
  149. package/dist/esm/swappers/{JupiterSwapper/utils/jupiterService.d.ts → DebridgeSwapper/utils/debridgeService.d.ts} +1 -1
  150. package/dist/esm/swappers/DebridgeSwapper/utils/debridgeService.js +11 -0
  151. package/dist/esm/swappers/DebridgeSwapper/utils/fetchDebridgeSingleChainTrade.d.ts +16 -0
  152. package/dist/esm/swappers/DebridgeSwapper/utils/fetchDebridgeSingleChainTrade.js +19 -0
  153. package/dist/esm/swappers/DebridgeSwapper/utils/fetchDebridgeTrade.d.ts +20 -0
  154. package/dist/esm/swappers/DebridgeSwapper/utils/fetchDebridgeTrade.js +25 -0
  155. package/dist/esm/swappers/DebridgeSwapper/utils/getTrade.d.ts +11 -0
  156. package/dist/esm/swappers/DebridgeSwapper/utils/getTrade.js +360 -0
  157. package/dist/esm/swappers/DebridgeSwapper/utils/types.d.ts +155 -0
  158. package/dist/esm/swappers/DebridgeSwapper/utils/types.js +5 -0
  159. package/dist/esm/swappers/MayachainSwapper/utils/poolAssetHelpers/poolAssetHelpers.js +1 -1
  160. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +14 -2
  161. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +14 -2
  162. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +10 -0
  163. package/dist/esm/swappers/RelaySwapper/constant.js +9 -12
  164. package/dist/esm/swappers/RelaySwapper/endpoints.js +2 -2
  165. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +59 -10
  166. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +22 -7
  167. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +12 -1
  168. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.js +10 -0
  169. package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +10 -0
  170. package/dist/esm/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
  171. package/dist/esm/swappers/ThorchainSwapper/endpoints.js +3 -1
  172. package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +1 -0
  173. package/dist/esm/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.d.ts +1 -1
  174. package/dist/esm/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.js +2 -1
  175. package/dist/esm/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.test.js +11 -1
  176. package/dist/esm/swappers/ZrxSwapper/getZrxTradeQuote/getZrxTradeQuote.js +9 -0
  177. package/dist/esm/swappers/ZrxSwapper/getZrxTradeRate/getZrxTradeRate.js +9 -0
  178. package/dist/esm/swappers/utils/affiliateFee.d.ts +17 -0
  179. package/dist/esm/swappers/utils/affiliateFee.js +39 -0
  180. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +57 -4
  181. package/dist/esm/thorchain-utils/index.d.ts +2 -1
  182. package/dist/esm/thorchain-utils/index.js +1 -0
  183. package/dist/esm/thorchain-utils/solana/constants.d.ts +1 -0
  184. package/dist/esm/thorchain-utils/solana/constants.js +3 -0
  185. package/dist/esm/thorchain-utils/solana/getSolanaTransactionFees.d.ts +2 -0
  186. package/dist/esm/thorchain-utils/solana/getSolanaTransactionFees.js +37 -0
  187. package/dist/esm/thorchain-utils/solana/getThorTxData.d.ts +12 -0
  188. package/dist/esm/thorchain-utils/solana/getThorTxData.js +10 -0
  189. package/dist/esm/thorchain-utils/solana/getUnsignedSolanaTransaction.d.ts +3 -0
  190. package/dist/esm/thorchain-utils/solana/getUnsignedSolanaTransaction.js +60 -0
  191. package/dist/esm/thorchain-utils/solana/index.d.ts +3 -0
  192. package/dist/esm/thorchain-utils/solana/index.js +3 -0
  193. package/dist/esm/tron-utils/getUnsignedTronTransaction.js +16 -0
  194. package/dist/esm/types.d.ts +47 -11
  195. package/dist/esm/types.js +1 -1
  196. package/dist/esm/utils.d.ts +3 -0
  197. package/dist/esm/utils.js +7 -2
  198. package/package.json +19 -19
  199. package/dist/cjs/swappers/JupiterSwapper/JupiterSwapper.d.ts +0 -2
  200. package/dist/cjs/swappers/JupiterSwapper/JupiterSwapper.js +0 -27
  201. package/dist/cjs/swappers/JupiterSwapper/endpoints.js +0 -15
  202. package/dist/cjs/swappers/JupiterSwapper/errorPatterns.d.ts +0 -15
  203. package/dist/cjs/swappers/JupiterSwapper/errorPatterns.js +0 -29
  204. package/dist/cjs/swappers/JupiterSwapper/idls/referral.d.ts +0 -739
  205. package/dist/cjs/swappers/JupiterSwapper/idls/referral.js +0 -741
  206. package/dist/cjs/swappers/JupiterSwapper/index.d.ts +0 -2
  207. package/dist/cjs/swappers/JupiterSwapper/swapperApi/getTradeQuote.js +0 -191
  208. package/dist/cjs/swappers/JupiterSwapper/swapperApi/getTradeRate.js +0 -172
  209. package/dist/cjs/swappers/JupiterSwapper/utils/constants.d.ts +0 -9
  210. package/dist/cjs/swappers/JupiterSwapper/utils/constants.js +0 -14
  211. package/dist/cjs/swappers/JupiterSwapper/utils/helpers.d.ts +0 -56
  212. package/dist/cjs/swappers/JupiterSwapper/utils/helpers.js +0 -178
  213. package/dist/cjs/swappers/JupiterSwapper/utils/jupiterService.js +0 -15
  214. package/dist/esm/swappers/JupiterSwapper/JupiterSwapper.js +0 -24
  215. package/dist/esm/swappers/JupiterSwapper/endpoints.js +0 -12
  216. package/dist/esm/swappers/JupiterSwapper/errorPatterns.d.ts +0 -15
  217. package/dist/esm/swappers/JupiterSwapper/errorPatterns.js +0 -25
  218. package/dist/esm/swappers/JupiterSwapper/idls/referral.d.ts +0 -739
  219. package/dist/esm/swappers/JupiterSwapper/idls/referral.js +0 -738
  220. package/dist/esm/swappers/JupiterSwapper/index.d.ts +0 -2
  221. package/dist/esm/swappers/JupiterSwapper/index.js +0 -2
  222. package/dist/esm/swappers/JupiterSwapper/swapperApi/getTradeQuote.js +0 -187
  223. package/dist/esm/swappers/JupiterSwapper/swapperApi/getTradeRate.js +0 -168
  224. package/dist/esm/swappers/JupiterSwapper/utils/constants.d.ts +0 -9
  225. package/dist/esm/swappers/JupiterSwapper/utils/constants.js +0 -11
  226. package/dist/esm/swappers/JupiterSwapper/utils/helpers.d.ts +0 -56
  227. package/dist/esm/swappers/JupiterSwapper/utils/helpers.js +0 -169
  228. package/dist/esm/swappers/JupiterSwapper/utils/jupiterService.js +0 -12
  229. /package/dist/cjs/swappers/{JupiterSwapper/swapperApi → DebridgeSwapper/getTradeQuote}/getTradeQuote.d.ts +0 -0
  230. /package/dist/cjs/swappers/{JupiterSwapper/swapperApi → DebridgeSwapper/getTradeRate}/getTradeRate.d.ts +0 -0
  231. /package/dist/esm/swappers/{JupiterSwapper/swapperApi → DebridgeSwapper/getTradeQuote}/getTradeQuote.d.ts +0 -0
  232. /package/dist/esm/swappers/{JupiterSwapper/swapperApi → DebridgeSwapper/getTradeRate}/getTradeRate.d.ts +0 -0
@@ -1,2 +0,0 @@
1
- export * from './utils/constants.js';
2
- export * from './errorPatterns.js';
@@ -1,2 +0,0 @@
1
- export * from './utils/constants.js';
2
- export * from './errorPatterns.js';
@@ -1,187 +0,0 @@
1
- import { ASSET_NAMESPACE, CHAIN_NAMESPACE, CHAIN_REFERENCE, fromAssetId, solAssetId, toAssetId, wrappedSolAssetId, } from '@shapeshiftoss/caip';
2
- import { bn, bnOrZero, convertDecimalPercentageToBasisPoints } from '@shapeshiftoss/utils';
3
- import { Err, Ok } from '@sniptt/monads';
4
- import { PublicKey } from '@solana/web3.js';
5
- import { v4 as uuid } from 'uuid';
6
- import { SwapperName, TradeQuoteError } from '../../../types.js';
7
- import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
8
- import { COMPUTE_UNIT_MARGIN_MULTIPLIER, TOKEN_2022_PROGRAM_ID } from '../utils/constants.js';
9
- import { calculateAccountCreationCosts, createSwapInstructions, getJupiterPrice, isSupportedChainId, } from '../utils/helpers.js';
10
- export const getTradeQuote = async (input, deps) => {
11
- const { sellAsset, buyAsset, receiveAddress, accountNumber, sendAddress, sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount, } = input;
12
- const { assetsById } = deps;
13
- const jupiterUrl = deps.config.VITE_JUPITER_API_URL;
14
- const solAsset = assetsById[solAssetId];
15
- if (accountNumber === undefined) {
16
- return Err(makeSwapErrorRight({
17
- message: `accountNumber is required`,
18
- code: TradeQuoteError.UnknownError,
19
- }));
20
- }
21
- if (!isSupportedChainId(sellAsset.chainId)) {
22
- return Err(makeSwapErrorRight({
23
- message: `unsupported chainId`,
24
- code: TradeQuoteError.UnsupportedChain,
25
- details: { chainId: sellAsset.chainId },
26
- }));
27
- }
28
- if (!isSupportedChainId(buyAsset.chainId)) {
29
- return Err(makeSwapErrorRight({
30
- message: `unsupported chainId`,
31
- code: TradeQuoteError.UnsupportedChain,
32
- details: { chainId: sellAsset.chainId },
33
- }));
34
- }
35
- if (!sendAddress) {
36
- return Err(makeSwapErrorRight({
37
- message: `sendAddress is required`,
38
- code: TradeQuoteError.UnknownError,
39
- }));
40
- }
41
- if (!solAsset) {
42
- return Err(makeSwapErrorRight({
43
- message: `solAsset is required`,
44
- code: TradeQuoteError.UnknownError,
45
- }));
46
- }
47
- const adapter = deps.assertGetSolanaChainAdapter(sellAsset.chainId);
48
- const buyAssetAddress = buyAsset.assetId === solAssetId
49
- ? fromAssetId(wrappedSolAssetId).assetReference
50
- : fromAssetId(buyAsset.assetId).assetReference;
51
- const sellAssetAddress = sellAsset.assetId === solAssetId
52
- ? fromAssetId(wrappedSolAssetId).assetReference
53
- : fromAssetId(sellAsset.assetId).assetReference;
54
- const sellTokenInfo = await adapter
55
- .getConnection()
56
- .getAccountInfo(new PublicKey(sellAssetAddress));
57
- const buyTokenInfo = await adapter.getConnection().getAccountInfo(new PublicKey(buyAssetAddress));
58
- const isSellTokenToken2022 = sellTokenInfo?.owner.toString() === TOKEN_2022_PROGRAM_ID.toString();
59
- const isBuyTokenToken2022 = buyTokenInfo?.owner.toString() === TOKEN_2022_PROGRAM_ID.toString();
60
- const affiliateBps = isSellTokenToken2022 || isBuyTokenToken2022 ? '0' : input.affiliateBps;
61
- const maybePriceResponse = await getJupiterPrice({
62
- apiUrl: jupiterUrl,
63
- sourceAssetAddress: sellAssetAddress,
64
- destinationAssetAddress: buyAssetAddress,
65
- commissionBps: affiliateBps,
66
- amount: sellAmount,
67
- slippageBps: input.slippageTolerancePercentageDecimal
68
- ? convertDecimalPercentageToBasisPoints(input.slippageTolerancePercentageDecimal).toFixed()
69
- : undefined,
70
- });
71
- if (maybePriceResponse.isErr()) {
72
- return Err(makeSwapErrorRight({
73
- message: 'Quote request failed',
74
- code: TradeQuoteError.NoRouteFound,
75
- }));
76
- }
77
- const { data: priceResponse } = maybePriceResponse.unwrap();
78
- const slippageTolerancePercentageDecimal =
79
- // Divide by 100 to get actual decimal percentage from bps
80
- // e.g for 0.5% bps, Jupiter represents this as 50. 50/100 = 0.5, then we div by 100 again to honour our decimal format e.g 0.5/100 = 0.005
81
- bn(priceResponse.slippageBps).div(100).div(100).toString();
82
- const { instructions, addressLookupTableAddresses } = await createSwapInstructions({
83
- priceResponse,
84
- sendAddress,
85
- receiveAddress,
86
- affiliateBps,
87
- buyAsset,
88
- sellAsset,
89
- adapter,
90
- jupiterUrl,
91
- });
92
- const getFeeData = async () => {
93
- const sellAdapter = deps.assertGetSolanaChainAdapter(sellAsset.chainId);
94
- const getFeeDataInput = {
95
- to: '',
96
- value: '0',
97
- chainSpecific: {
98
- from: sendAddress,
99
- addressLookupTableAccounts: addressLookupTableAddresses,
100
- instructions,
101
- },
102
- };
103
- const feeData = await sellAdapter.getFeeData(getFeeDataInput);
104
- return {
105
- txFee: feeData.fast.txFee,
106
- chainSpecific: {
107
- computeUnits: bnOrZero(feeData.fast.chainSpecific.computeUnits)
108
- .times(COMPUTE_UNIT_MARGIN_MULTIPLIER)
109
- .toFixed(0),
110
- priorityFee: feeData.fast.chainSpecific.priorityFee,
111
- },
112
- };
113
- };
114
- const protocolFees = priceResponse.routePlan.reduce((acc, route) => {
115
- const feeAssetId = toAssetId({
116
- assetReference: route.swapInfo.feeMint,
117
- assetNamespace: ASSET_NAMESPACE.splToken,
118
- chainNamespace: CHAIN_NAMESPACE.Solana,
119
- chainReference: CHAIN_REFERENCE.SolanaMainnet,
120
- });
121
- const feeAsset = assetsById[feeAssetId];
122
- // If we can't find the feeAsset, we can't provide a protocol fee to display
123
- // But these fees exists at protocol level, it's mostly to make TS happy as we should have the market data and assets
124
- if (!feeAsset)
125
- return acc;
126
- acc[feeAssetId] = {
127
- requiresBalance: false,
128
- amountCryptoBaseUnit: bnOrZero(route.swapInfo.feeAmount).toFixed(0),
129
- asset: feeAsset,
130
- };
131
- return acc;
132
- }, {});
133
- const quotes = [];
134
- const feeData = await getFeeData();
135
- const rate = getInputOutputRate({
136
- sellAmountCryptoBaseUnit: priceResponse.inAmount,
137
- buyAmountCryptoBaseUnit: priceResponse.outAmount,
138
- sellAsset,
139
- buyAsset,
140
- });
141
- const accountCreationFees = calculateAccountCreationCosts(instructions);
142
- if (accountCreationFees !== '0') {
143
- const solProtocolFeeAmount = bnOrZero(protocolFees[solAssetId]?.amountCryptoBaseUnit);
144
- protocolFees[solAssetId] = {
145
- requiresBalance: true,
146
- amountCryptoBaseUnit: bnOrZero(solProtocolFeeAmount).plus(accountCreationFees).toFixed(),
147
- asset: solAsset,
148
- };
149
- }
150
- const tradeQuote = {
151
- id: uuid(),
152
- quoteOrRate: 'quote',
153
- rate,
154
- affiliateBps,
155
- receiveAddress,
156
- slippageTolerancePercentageDecimal,
157
- priceImpactPercentageDecimal: priceResponse.priceImpactPct,
158
- swapperName: SwapperName.Jupiter,
159
- steps: [
160
- {
161
- accountNumber,
162
- buyAmountBeforeFeesCryptoBaseUnit: priceResponse.outAmount,
163
- buyAmountAfterFeesCryptoBaseUnit: priceResponse.outAmount,
164
- sellAmountIncludingProtocolFeesCryptoBaseUnit: priceResponse.inAmount,
165
- jupiterQuoteResponse: priceResponse,
166
- solanaTransactionMetadata: {
167
- addressLookupTableAddresses,
168
- instructions,
169
- },
170
- feeData: {
171
- protocolFees,
172
- networkFeeCryptoBaseUnit: feeData.txFee,
173
- chainSpecific: feeData.chainSpecific,
174
- },
175
- rate,
176
- source: SwapperName.Jupiter,
177
- buyAsset,
178
- sellAsset,
179
- allowanceContract: '0x0',
180
- // Swap are so fasts on solana that times are under 100ms displaying 0 or very small amount of time is not user friendly
181
- estimatedExecutionTimeMs: undefined,
182
- },
183
- ],
184
- };
185
- quotes.push(tradeQuote);
186
- return Ok(quotes);
187
- };
@@ -1,168 +0,0 @@
1
- import { ASSET_NAMESPACE, CHAIN_NAMESPACE, CHAIN_REFERENCE, fromAssetId, solAssetId, toAssetId, wrappedSolAssetId, } from '@shapeshiftoss/caip';
2
- import { bn, bnOrZero, convertDecimalPercentageToBasisPoints } from '@shapeshiftoss/utils';
3
- import { Err, Ok } from '@sniptt/monads';
4
- import { PublicKey } from '@solana/web3.js';
5
- import { v4 as uuid } from 'uuid';
6
- import { SwapperName, TradeQuoteError } from '../../../types.js';
7
- import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
8
- import { SOLANA_RANDOM_ADDRESS, TOKEN_2022_PROGRAM_ID } from '../utils/constants.js';
9
- import { calculateAccountCreationCosts, createSwapInstructions, getJupiterPrice, isSupportedChainId, } from '../utils/helpers.js';
10
- export const getTradeRate = async (input, deps) => {
11
- const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit: sellAmount, receiveAddress, accountNumber, } = input;
12
- const { assetsById } = deps;
13
- const jupiterUrl = deps.config.VITE_JUPITER_API_URL;
14
- const solAsset = assetsById[solAssetId];
15
- if (!isSupportedChainId(sellAsset.chainId)) {
16
- return Err(makeSwapErrorRight({
17
- message: `unsupported chainId`,
18
- code: TradeQuoteError.UnsupportedChain,
19
- details: { chainId: sellAsset.chainId },
20
- }));
21
- }
22
- if (!isSupportedChainId(buyAsset.chainId)) {
23
- return Err(makeSwapErrorRight({
24
- message: `unsupported chainId`,
25
- code: TradeQuoteError.UnsupportedChain,
26
- details: { chainId: sellAsset.chainId },
27
- }));
28
- }
29
- if (buyAsset.assetId === wrappedSolAssetId || sellAsset.assetId === wrappedSolAssetId) {
30
- return Err(makeSwapErrorRight({
31
- message: `Unsupported trade pair`,
32
- code: TradeQuoteError.UnsupportedTradePair,
33
- }));
34
- }
35
- if (!solAsset) {
36
- return Err(makeSwapErrorRight({
37
- message: `solAsset should be defined`,
38
- code: TradeQuoteError.UnknownError,
39
- }));
40
- }
41
- const adapter = deps.assertGetSolanaChainAdapter(sellAsset.chainId);
42
- const buyAssetAddress = buyAsset.assetId === solAssetId
43
- ? fromAssetId(wrappedSolAssetId).assetReference
44
- : fromAssetId(buyAsset.assetId).assetReference;
45
- const sellAssetAddress = sellAsset.assetId === solAssetId
46
- ? fromAssetId(wrappedSolAssetId).assetReference
47
- : fromAssetId(sellAsset.assetId).assetReference;
48
- const sellTokenInfo = await adapter
49
- .getConnection()
50
- .getAccountInfo(new PublicKey(sellAssetAddress));
51
- const buyTokenInfo = await adapter.getConnection().getAccountInfo(new PublicKey(buyAssetAddress));
52
- const isSellTokenToken2022 = sellTokenInfo?.owner.toString() === TOKEN_2022_PROGRAM_ID.toString();
53
- const isBuyTokenToken2022 = buyTokenInfo?.owner.toString() === TOKEN_2022_PROGRAM_ID.toString();
54
- const affiliateBps = isSellTokenToken2022 || isBuyTokenToken2022 ? '0' : input.affiliateBps;
55
- const maybePriceResponse = await getJupiterPrice({
56
- apiUrl: jupiterUrl,
57
- sourceAssetAddress: sellAssetAddress,
58
- destinationAssetAddress: buyAssetAddress,
59
- commissionBps: affiliateBps,
60
- amount: sellAmount,
61
- slippageBps: input.slippageTolerancePercentageDecimal
62
- ? convertDecimalPercentageToBasisPoints(input.slippageTolerancePercentageDecimal).toFixed()
63
- : undefined,
64
- });
65
- if (maybePriceResponse.isErr()) {
66
- return Err(makeSwapErrorRight({
67
- message: 'Quote request failed',
68
- code: TradeQuoteError.NoRouteFound,
69
- }));
70
- }
71
- const { data: priceResponse } = maybePriceResponse.unwrap();
72
- const { instructions } = await createSwapInstructions({
73
- priceResponse,
74
- sendAddress: input.sendAddress ?? SOLANA_RANDOM_ADDRESS,
75
- receiveAddress,
76
- affiliateBps,
77
- buyAsset,
78
- sellAsset,
79
- adapter,
80
- jupiterUrl,
81
- });
82
- const getFeeData = async () => {
83
- const sellAdapter = deps.assertGetSolanaChainAdapter(sellAsset.chainId);
84
- const getFeeDataInput = {
85
- // Use real address and instructions for accurate fee estimation whenever possible (Solana account connected)
86
- to: input.sendAddress ?? SOLANA_RANDOM_ADDRESS,
87
- value: sellAmount,
88
- chainSpecific: {
89
- from: input.sendAddress ?? SOLANA_RANDOM_ADDRESS,
90
- instructions,
91
- },
92
- };
93
- const { fast } = await sellAdapter.getFeeData(getFeeDataInput);
94
- return { networkFeeCryptoBaseUnit: fast.txFee };
95
- };
96
- const protocolFees = priceResponse.routePlan.reduce((acc, route) => {
97
- const feeAssetId = toAssetId({
98
- assetReference: route.swapInfo.feeMint,
99
- assetNamespace: ASSET_NAMESPACE.splToken,
100
- chainNamespace: CHAIN_NAMESPACE.Solana,
101
- chainReference: CHAIN_REFERENCE.SolanaMainnet,
102
- });
103
- const feeAsset = assetsById[feeAssetId];
104
- // If we can't find the feeAsset, we can't provide a protocol fee to display
105
- // But these fees exists at protocol level, it's mostly to make TS happy as we should have the market data and assets
106
- if (!feeAsset)
107
- return acc;
108
- acc[feeAssetId] = {
109
- requiresBalance: false,
110
- amountCryptoBaseUnit: bnOrZero(route.swapInfo.feeAmount).toFixed(0),
111
- asset: feeAsset,
112
- };
113
- return acc;
114
- }, {});
115
- const rates = [];
116
- const feeData = await getFeeData();
117
- const inputOutputRate = getInputOutputRate({
118
- sellAmountCryptoBaseUnit: priceResponse.inAmount,
119
- buyAmountCryptoBaseUnit: priceResponse.outAmount,
120
- sellAsset,
121
- buyAsset,
122
- });
123
- const slippageTolerancePercentageDecimal =
124
- // Divide by 100 to get actual decimal percentage from bps
125
- // e.g for 0.5% bps, Jupiter represents this as 50. 50/100 = 0.5, then we div by 100 again to honour our decimal format e.g 0.5/100 = 0.005
126
- bn(priceResponse.slippageBps).div(100).div(100).toString();
127
- const accountCreationFees = calculateAccountCreationCosts(instructions);
128
- if (accountCreationFees !== '0') {
129
- const solProtocolFeeAmount = bnOrZero(protocolFees[solAssetId]?.amountCryptoBaseUnit);
130
- protocolFees[solAssetId] = {
131
- requiresBalance: true,
132
- amountCryptoBaseUnit: bnOrZero(solProtocolFeeAmount).plus(accountCreationFees).toFixed(),
133
- asset: solAsset,
134
- };
135
- }
136
- const tradeRate = {
137
- id: uuid(),
138
- quoteOrRate: 'rate',
139
- rate: inputOutputRate,
140
- receiveAddress,
141
- affiliateBps,
142
- priceImpactPercentageDecimal: priceResponse.priceImpactPct,
143
- slippageTolerancePercentageDecimal,
144
- swapperName: SwapperName.Jupiter,
145
- steps: [
146
- {
147
- buyAmountBeforeFeesCryptoBaseUnit: priceResponse.outAmount,
148
- buyAmountAfterFeesCryptoBaseUnit: priceResponse.outAmount,
149
- sellAmountIncludingProtocolFeesCryptoBaseUnit: priceResponse.inAmount,
150
- jupiterQuoteResponse: priceResponse,
151
- feeData: {
152
- protocolFees,
153
- ...feeData,
154
- },
155
- rate: inputOutputRate,
156
- source: SwapperName.Jupiter,
157
- buyAsset,
158
- sellAsset,
159
- accountNumber,
160
- allowanceContract: '0x0',
161
- // Swap are so fasts on solana that times are under 100ms displaying 0 or very small amount of time is not user friendly
162
- estimatedExecutionTimeMs: undefined,
163
- },
164
- ],
165
- };
166
- rates.push(tradeRate);
167
- return Ok(rates);
168
- };
@@ -1,9 +0,0 @@
1
- import type { ChainId } from '@shapeshiftoss/caip';
2
- export declare const jupiterSupportedChainIds: ChainId[];
3
- export declare const PDA_ACCOUNT_CREATION_COST = 2040000;
4
- export declare const SOLANA_RANDOM_ADDRESS = "2zHKF6tqam3tnNFPK2E9nBDkV7GMXnvdJautmzqQdn8A";
5
- export declare const TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
6
- export declare const COMPUTE_UNIT_MARGIN_MULTIPLIER = 1.6;
7
- export declare const SHAPESHIFT_JUPITER_REFERRAL_KEY = "Ajgmo453yGmcHDPoJBrMUj3GFwLVL7HaaZGNLkB8vREG";
8
- export declare const JUPITER_AFFILIATE_CONTRACT_ADDRESS = "REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3";
9
- export declare const JUPITER_REFERALL_FEE_PROJECT_ACCOUNT = "45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp";
@@ -1,11 +0,0 @@
1
- import { KnownChainIds } from '@shapeshiftoss/types';
2
- export const jupiterSupportedChainIds = [KnownChainIds.SolanaMainnet];
3
- export const PDA_ACCOUNT_CREATION_COST = 2040000;
4
- export const SOLANA_RANDOM_ADDRESS = '2zHKF6tqam3tnNFPK2E9nBDkV7GMXnvdJautmzqQdn8A';
5
- export const TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
6
- // Jupiter use 40% as a compute unit margin while calculating them, some TX reverts without this, as we add some compute units
7
- // for account creations and referral, for stability purposes we add 60% margin
8
- export const COMPUTE_UNIT_MARGIN_MULTIPLIER = 1.6;
9
- export const SHAPESHIFT_JUPITER_REFERRAL_KEY = 'Ajgmo453yGmcHDPoJBrMUj3GFwLVL7HaaZGNLkB8vREG';
10
- export const JUPITER_AFFILIATE_CONTRACT_ADDRESS = 'REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3';
11
- export const JUPITER_REFERALL_FEE_PROJECT_ACCOUNT = '45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp';
@@ -1,56 +0,0 @@
1
- import type { QuoteResponse, SwapInstructionsResponse } from '@jup-ag/api';
2
- import type { ChainId } from '@shapeshiftoss/caip';
3
- import type { solana } from '@shapeshiftoss/chain-adapters';
4
- import type { Asset, KnownChainIds } from '@shapeshiftoss/types';
5
- import type { Result } from '@sniptt/monads';
6
- import type { Connection } from '@solana/web3.js';
7
- import { PublicKey, TransactionInstruction } from '@solana/web3.js';
8
- import type { AxiosResponse } from 'axios';
9
- import type { SwapErrorRight } from '../../../types.js';
10
- export declare const isSupportedChainId: (chainId: ChainId) => chainId is KnownChainIds.SolanaMainnet;
11
- type GetJupiterQuoteArgs = {
12
- apiUrl: string;
13
- sourceAssetAddress: string;
14
- destinationAssetAddress: string;
15
- commissionBps: string;
16
- amount: string;
17
- slippageBps: string | undefined;
18
- };
19
- type GetJupiterSwapArgs = {
20
- apiUrl: string;
21
- fromAddress: string;
22
- rawQuote: unknown;
23
- toAddress?: string;
24
- feeAccount: string | undefined;
25
- };
26
- type CreateInstructionsParams = {
27
- priceResponse: QuoteResponse;
28
- sendAddress: string;
29
- receiveAddress?: string;
30
- affiliateBps: string;
31
- buyAsset: Asset;
32
- sellAsset: any;
33
- adapter: solana.ChainAdapter;
34
- jupiterUrl: string;
35
- };
36
- export declare const getJupiterPrice: ({ apiUrl, sourceAssetAddress, destinationAssetAddress, commissionBps, amount, slippageBps, }: GetJupiterQuoteArgs) => Promise<Result<AxiosResponse<QuoteResponse, any>, SwapErrorRight>>;
37
- export declare const getJupiterSwapInstructions: ({ apiUrl, fromAddress, toAddress, rawQuote, feeAccount, }: GetJupiterSwapArgs) => Promise<Result<AxiosResponse<SwapInstructionsResponse, any>, SwapErrorRight>>;
38
- export declare const getFeeTokenAccountAndInstruction: ({ feePayerPubKey, programId, buyAssetReferralPubKey, sellAssetReferralPubKey, buyTokenId, sellTokenId, instructionData, connection, }: {
39
- feePayerPubKey: PublicKey;
40
- programId: PublicKey;
41
- buyAssetReferralPubKey: PublicKey;
42
- sellAssetReferralPubKey: PublicKey;
43
- buyTokenId: string;
44
- sellTokenId: string;
45
- instructionData: Buffer;
46
- connection: Connection;
47
- }) => Promise<{
48
- tokenAccount?: PublicKey;
49
- instruction?: TransactionInstruction | undefined;
50
- }>;
51
- export declare const calculateAccountCreationCosts: (instructions: TransactionInstruction[]) => string;
52
- export declare const createSwapInstructions: ({ priceResponse, sendAddress, receiveAddress, affiliateBps, buyAsset, sellAsset, adapter, jupiterUrl, }: CreateInstructionsParams) => Promise<{
53
- instructions: TransactionInstruction[];
54
- addressLookupTableAddresses: string[];
55
- }>;
56
- export {};
@@ -1,169 +0,0 @@
1
- import { BorshInstructionCoder } from '@coral-xyz/anchor';
2
- import { ASSOCIATED_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@coral-xyz/anchor/dist/cjs/utils/token';
3
- import { fromAssetId, solAssetId, wrappedSolAssetId } from '@shapeshiftoss/caip';
4
- import { bnOrZero } from '@shapeshiftoss/utils';
5
- import { PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
6
- import { referralIdl } from '../idls/referral.js';
7
- import { JUPITER_AFFILIATE_CONTRACT_ADDRESS, JUPITER_REFERALL_FEE_PROJECT_ACCOUNT, jupiterSupportedChainIds, PDA_ACCOUNT_CREATION_COST, SHAPESHIFT_JUPITER_REFERRAL_KEY, TOKEN_2022_PROGRAM_ID, } from './constants.js';
8
- import { jupiterService } from './jupiterService.js';
9
- export const isSupportedChainId = (chainId) => {
10
- return jupiterSupportedChainIds.includes(chainId);
11
- };
12
- const JUPITER_TRANSACTION_MAX_ACCOUNTS = 54;
13
- export const getJupiterPrice = ({ apiUrl, sourceAssetAddress, destinationAssetAddress, commissionBps, amount, slippageBps, }) => jupiterService.get(`${apiUrl}/quote` +
14
- `?inputMint=${sourceAssetAddress}` +
15
- `&outputMint=${destinationAssetAddress}` +
16
- `&amount=${amount}` +
17
- (slippageBps ? `&slippageBps=${slippageBps}` : `&dynamicSlippage=true`) +
18
- `&maxAccounts=${JUPITER_TRANSACTION_MAX_ACCOUNTS}` +
19
- `&platformFeeBps=${commissionBps}`);
20
- export const getJupiterSwapInstructions = ({ apiUrl, fromAddress, toAddress, rawQuote, feeAccount, }) => jupiterService.post(`${apiUrl}/swap-instructions`, {
21
- userPublicKey: fromAddress,
22
- destinationTokenAccount: toAddress,
23
- quoteResponse: rawQuote,
24
- dynamicComputeUnitLimit: true,
25
- prioritizationFeeLamports: 'auto',
26
- feeAccount,
27
- });
28
- export const getFeeTokenAccountAndInstruction = async ({ feePayerPubKey, programId, buyAssetReferralPubKey, sellAssetReferralPubKey, buyTokenId, sellTokenId, instructionData, connection, }) => {
29
- const sellAssetTokenAccount = await connection.getAccountInfo(sellAssetReferralPubKey);
30
- if (sellAssetTokenAccount)
31
- return { tokenAccount: sellAssetReferralPubKey };
32
- const buyAssetTokenAccount = await connection.getAccountInfo(buyAssetReferralPubKey);
33
- if (buyAssetTokenAccount)
34
- return { tokenAccount: buyAssetReferralPubKey };
35
- const buyTokenInfo = await connection.getAccountInfo(new PublicKey(buyTokenId));
36
- const sellTokenInfo = await connection.getAccountInfo(new PublicKey(sellTokenId));
37
- const isSellTokenToken2022 = sellTokenInfo?.owner.toString() === TOKEN_2022_PROGRAM_ID.toString();
38
- if (buyTokenInfo?.owner.toString() !== TOKEN_PROGRAM_ID.toString() &&
39
- sellTokenInfo?.owner.toString() !== TOKEN_PROGRAM_ID.toString()) {
40
- return { tokenAccount: undefined, instruction: undefined };
41
- }
42
- const project = new PublicKey(JUPITER_REFERALL_FEE_PROJECT_ACCOUNT);
43
- const referralPubkey = isSellTokenToken2022 ? buyAssetReferralPubKey : sellAssetReferralPubKey;
44
- return {
45
- tokenAccount: referralPubkey,
46
- instruction: new TransactionInstruction({
47
- keys: [
48
- {
49
- pubkey: feePayerPubKey,
50
- isSigner: true,
51
- isWritable: true,
52
- },
53
- {
54
- pubkey: project,
55
- isWritable: false,
56
- isSigner: false,
57
- },
58
- {
59
- pubkey: new PublicKey(SHAPESHIFT_JUPITER_REFERRAL_KEY),
60
- isSigner: false,
61
- isWritable: false,
62
- },
63
- {
64
- pubkey: referralPubkey,
65
- isSigner: false,
66
- isWritable: true,
67
- },
68
- {
69
- pubkey: new PublicKey(isSellTokenToken2022 ? buyTokenId : sellTokenId),
70
- isSigner: false,
71
- isWritable: false,
72
- },
73
- {
74
- pubkey: SystemProgram.programId,
75
- isSigner: false,
76
- isWritable: false,
77
- },
78
- { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
79
- ],
80
- data: instructionData,
81
- programId,
82
- }),
83
- };
84
- };
85
- export const calculateAccountCreationCosts = (instructions) => {
86
- let totalCost = bnOrZero(0);
87
- for (const ix of instructions) {
88
- if (ix.programId.toString() === ASSOCIATED_PROGRAM_ID.toString()) {
89
- if (ix.data?.[0] === 1) {
90
- totalCost = totalCost.plus(PDA_ACCOUNT_CREATION_COST);
91
- }
92
- }
93
- }
94
- return totalCost.toString();
95
- };
96
- export const createSwapInstructions = async ({ priceResponse, sendAddress, receiveAddress, affiliateBps, buyAsset, sellAsset, adapter, jupiterUrl, }) => {
97
- const isCrossAccountTrade = receiveAddress ? receiveAddress !== sendAddress : false;
98
- const buyAssetAddress = buyAsset.assetId === solAssetId
99
- ? fromAssetId(wrappedSolAssetId).assetReference
100
- : fromAssetId(buyAsset.assetId).assetReference;
101
- const sellAssetAddress = sellAsset.assetId === solAssetId
102
- ? fromAssetId(wrappedSolAssetId).assetReference
103
- : fromAssetId(sellAsset.assetId).assetReference;
104
- const contractAddress = buyAsset.assetId === solAssetId ? undefined : fromAssetId(buyAsset.assetId).assetReference;
105
- const { instruction: createTokenAccountInstruction, destinationTokenAccount } = contractAddress && isCrossAccountTrade && receiveAddress
106
- ? await adapter.createAssociatedTokenAccountInstruction({
107
- from: sendAddress,
108
- to: receiveAddress,
109
- tokenId: contractAddress,
110
- })
111
- : { instruction: undefined, destinationTokenAccount: undefined };
112
- const [buyAssetReferralPubKey] = PublicKey.findProgramAddressSync([
113
- Buffer.from('referral_ata'),
114
- new PublicKey(SHAPESHIFT_JUPITER_REFERRAL_KEY).toBuffer(),
115
- new PublicKey(buyAssetAddress).toBuffer(),
116
- ], new PublicKey(JUPITER_AFFILIATE_CONTRACT_ADDRESS));
117
- const [sellAssetReferralPubKey] = PublicKey.findProgramAddressSync([
118
- Buffer.from('referral_ata'),
119
- new PublicKey(SHAPESHIFT_JUPITER_REFERRAL_KEY).toBuffer(),
120
- new PublicKey(sellAssetAddress).toBuffer(),
121
- ], new PublicKey(JUPITER_AFFILIATE_CONTRACT_ADDRESS));
122
- const instructionData = new BorshInstructionCoder(referralIdl).encode('initializeReferralTokenAccount', {});
123
- const { instruction: feeAccountInstruction, tokenAccount } = await getFeeTokenAccountAndInstruction({
124
- feePayerPubKey: new PublicKey(sendAddress),
125
- buyAssetReferralPubKey,
126
- sellAssetReferralPubKey,
127
- programId: new PublicKey(JUPITER_AFFILIATE_CONTRACT_ADDRESS),
128
- instructionData,
129
- buyTokenId: buyAssetAddress,
130
- sellTokenId: sellAssetAddress,
131
- connection: adapter.getConnection(),
132
- });
133
- const maybeSwapResponse = await getJupiterSwapInstructions({
134
- apiUrl: jupiterUrl,
135
- fromAddress: sendAddress,
136
- toAddress: isCrossAccountTrade ? destinationTokenAccount?.toString() : undefined,
137
- rawQuote: priceResponse,
138
- feeAccount: affiliateBps !== '0' && tokenAccount ? tokenAccount.toString() : undefined,
139
- });
140
- if (maybeSwapResponse.isErr()) {
141
- const error = maybeSwapResponse.unwrapErr();
142
- const cause = error.cause;
143
- throw Error(cause.response?.data.detail);
144
- }
145
- const { data: swapResponse } = maybeSwapResponse.unwrap();
146
- const convertJupiterInstruction = (instruction) => ({
147
- ...instruction,
148
- keys: instruction.accounts.map(account => ({
149
- ...account,
150
- pubkey: new PublicKey(account.pubkey),
151
- })),
152
- data: Buffer.from(instruction.data, 'base64'),
153
- programId: new PublicKey(instruction.programId),
154
- });
155
- const instructions = [
156
- ...swapResponse.setupInstructions.map(convertJupiterInstruction),
157
- convertJupiterInstruction(swapResponse.swapInstruction),
158
- ];
159
- if (feeAccountInstruction && affiliateBps !== '0') {
160
- instructions.unshift(feeAccountInstruction);
161
- }
162
- if (createTokenAccountInstruction) {
163
- instructions.unshift(createTokenAccountInstruction);
164
- }
165
- if (swapResponse.cleanupInstruction) {
166
- instructions.push(convertJupiterInstruction(swapResponse.cleanupInstruction));
167
- }
168
- return { instructions, addressLookupTableAddresses: swapResponse.addressLookupTableAddresses };
169
- };
@@ -1,12 +0,0 @@
1
- import { createCache, makeSwapperAxiosServiceMonadic } from '../../../utils.js';
2
- const maxAgeMillis = 15 * 1000;
3
- const cachedUrls = [];
4
- const axiosConfig = {
5
- timeout: 10000,
6
- headers: {
7
- Accept: 'application/json',
8
- 'Content-Type': 'application/json',
9
- },
10
- };
11
- const jupiterServiceBase = createCache(maxAgeMillis, cachedUrls, axiosConfig);
12
- export const jupiterService = makeSwapperAxiosServiceMonadic(jupiterServiceBase);