@shapeshiftoss/swapper 17.6.7 → 17.6.8

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 (219) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +42 -24
  3. package/dist/cjs/cowswap-utils/constants.js +1 -0
  4. package/dist/cjs/cowswap-utils/index.js +2 -0
  5. package/dist/cjs/index.d.ts +2 -0
  6. package/dist/cjs/index.js +2 -0
  7. package/dist/cjs/swappers/AvnuSwapper/AvnuSwapper.d.ts +2 -0
  8. package/dist/cjs/swappers/AvnuSwapper/AvnuSwapper.js +7 -0
  9. package/dist/cjs/swappers/AvnuSwapper/endpoints.d.ts +2 -0
  10. package/dist/cjs/swappers/AvnuSwapper/endpoints.js +181 -0
  11. package/dist/cjs/swappers/AvnuSwapper/index.d.ts +1 -0
  12. package/dist/cjs/swappers/AvnuSwapper/index.js +5 -0
  13. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  14. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +142 -0
  15. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.d.ts +3 -0
  16. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +120 -0
  17. package/dist/cjs/swappers/AvnuSwapper/types.d.ts +2 -0
  18. package/dist/cjs/swappers/AvnuSwapper/types.js +2 -0
  19. package/dist/cjs/swappers/AvnuSwapper/utils/constants.d.ts +5 -0
  20. package/dist/cjs/swappers/AvnuSwapper/utils/constants.js +11 -0
  21. package/dist/cjs/swappers/AvnuSwapper/utils/helpers.d.ts +7 -0
  22. package/dist/cjs/swappers/AvnuSwapper/utils/helpers.js +21 -0
  23. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
  24. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
  25. package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -0
  26. package/dist/cjs/swappers/CetusSwapper/endpoints.js +33 -27
  27. package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeData.d.ts +24 -0
  28. package/dist/cjs/swappers/CetusSwapper/swapperApi/getCetusTradeData.js +79 -0
  29. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +44 -69
  30. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +49 -65
  31. package/dist/cjs/swappers/CetusSwapper/utils/constants.d.ts +1 -0
  32. package/dist/cjs/swappers/CetusSwapper/utils/constants.js +2 -1
  33. package/dist/cjs/swappers/CetusSwapper/utils/helpers.d.ts +6 -11
  34. package/dist/cjs/swappers/CetusSwapper/utils/helpers.js +41 -96
  35. package/dist/cjs/swappers/JupiterSwapper/utils/helpers.d.ts +0 -2
  36. package/dist/cjs/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +1 -0
  37. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -0
  38. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +68 -0
  39. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +30 -0
  40. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +53 -5
  41. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +1 -1
  42. package/dist/cjs/swappers/NearIntentsSwapper/types.js +8 -0
  43. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +28 -8
  44. package/dist/cjs/swappers/PortalsSwapper/constants.js +1 -1
  45. package/dist/cjs/swappers/PortalsSwapper/endpoints.js +92 -1
  46. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +29 -17
  47. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +21 -17
  48. package/dist/cjs/swappers/PortalsSwapper/types.js +1 -0
  49. package/dist/cjs/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.d.ts +9 -0
  50. package/dist/cjs/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.js +52 -0
  51. package/dist/cjs/swappers/PortalsSwapper/utils/fetchPortalsTradeOrder.d.ts +1 -0
  52. package/dist/cjs/swappers/PortalsSwapper/utils/fetchSquidStatus.d.ts +9 -0
  53. package/dist/cjs/swappers/PortalsSwapper/utils/fetchSquidStatus.js +57 -0
  54. package/dist/cjs/swappers/RelaySwapper/constant.js +3 -0
  55. package/dist/cjs/swappers/RelaySwapper/utils/fetchRelayTrade.js +1 -1
  56. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +16 -1
  57. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +20 -0
  58. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +13 -4
  59. package/dist/cjs/swappers/RelaySwapper/utils/types.js +5 -1
  60. package/dist/cjs/swappers/SunioSwapper/SunioSwapper.d.ts +2 -0
  61. package/dist/cjs/swappers/SunioSwapper/SunioSwapper.js +7 -0
  62. package/dist/cjs/swappers/SunioSwapper/endpoints.d.ts +2 -0
  63. package/dist/cjs/swappers/SunioSwapper/endpoints.js +131 -0
  64. package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.d.ts +3 -0
  65. package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +8 -0
  66. package/dist/cjs/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.d.ts +3 -0
  67. package/dist/cjs/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +8 -0
  68. package/dist/cjs/swappers/SunioSwapper/index.d.ts +4 -0
  69. package/dist/cjs/swappers/SunioSwapper/index.js +23 -0
  70. package/dist/cjs/swappers/SunioSwapper/types.d.ts +22 -0
  71. package/dist/cjs/swappers/SunioSwapper/types.js +12 -0
  72. package/dist/cjs/swappers/SunioSwapper/utils/abi.d.ts +48 -0
  73. package/dist/cjs/swappers/SunioSwapper/utils/abi.js +28 -0
  74. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +14 -0
  75. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +32 -0
  76. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapTransaction.d.ts +11 -0
  77. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapTransaction.js +57 -0
  78. package/dist/cjs/swappers/SunioSwapper/utils/constants.d.ts +6 -0
  79. package/dist/cjs/swappers/SunioSwapper/utils/constants.js +16 -0
  80. package/dist/cjs/swappers/SunioSwapper/utils/fetchFromSunio.d.ts +11 -0
  81. package/dist/cjs/swappers/SunioSwapper/utils/fetchFromSunio.js +45 -0
  82. package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.d.ts +4 -0
  83. package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +203 -0
  84. package/dist/cjs/swappers/SunioSwapper/utils/helpers/helpers.d.ts +4 -0
  85. package/dist/cjs/swappers/SunioSwapper/utils/helpers/helpers.js +22 -0
  86. package/dist/cjs/swappers/SunioSwapper/utils/sunioService.d.ts +6 -0
  87. package/dist/cjs/swappers/SunioSwapper/utils/sunioService.js +18 -0
  88. package/dist/cjs/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
  89. package/dist/cjs/swappers/ThorchainSwapper/endpoints.js +2 -0
  90. package/dist/cjs/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +2 -2
  91. package/dist/cjs/swappers/utils/helpers/helpers.js +7 -0
  92. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +80 -3
  93. package/dist/cjs/thorchain-utils/index.d.ts +1 -0
  94. package/dist/cjs/thorchain-utils/index.js +2 -1
  95. package/dist/cjs/thorchain-utils/tron/getThorTxData.d.ts +12 -0
  96. package/dist/cjs/thorchain-utils/tron/getThorTxData.js +14 -0
  97. package/dist/cjs/thorchain-utils/tron/getTronTransactionFees.d.ts +2 -0
  98. package/dist/cjs/thorchain-utils/tron/getTronTransactionFees.js +65 -0
  99. package/dist/cjs/thorchain-utils/tron/getUnsignedTronTransaction.d.ts +3 -0
  100. package/dist/cjs/thorchain-utils/tron/getUnsignedTronTransaction.js +35 -0
  101. package/dist/cjs/thorchain-utils/tron/index.d.ts +3 -0
  102. package/dist/cjs/thorchain-utils/tron/index.js +19 -0
  103. package/dist/cjs/types.d.ts +74 -9
  104. package/dist/cjs/types.js +2 -0
  105. package/dist/cjs/utils/tenderly/simulate.d.ts +6 -1
  106. package/dist/cjs/utils/tenderly/simulate.js +22 -2
  107. package/dist/cjs/utils/tenderly/types.d.ts +21 -0
  108. package/dist/cjs/utils.d.ts +9 -3
  109. package/dist/cjs/utils.js +53 -1
  110. package/dist/esm/.tsbuildinfo +1 -1
  111. package/dist/esm/constants.js +18 -0
  112. package/dist/esm/cowswap-utils/constants.js +1 -0
  113. package/dist/esm/cowswap-utils/index.js +2 -0
  114. package/dist/esm/index.d.ts +2 -0
  115. package/dist/esm/index.js +2 -0
  116. package/dist/esm/swappers/AvnuSwapper/AvnuSwapper.d.ts +2 -0
  117. package/dist/esm/swappers/AvnuSwapper/AvnuSwapper.js +4 -0
  118. package/dist/esm/swappers/AvnuSwapper/endpoints.d.ts +2 -0
  119. package/dist/esm/swappers/AvnuSwapper/endpoints.js +178 -0
  120. package/dist/esm/swappers/AvnuSwapper/index.d.ts +1 -0
  121. package/dist/esm/swappers/AvnuSwapper/index.js +1 -0
  122. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.d.ts +3 -0
  123. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +138 -0
  124. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.d.ts +3 -0
  125. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +116 -0
  126. package/dist/esm/swappers/AvnuSwapper/types.d.ts +2 -0
  127. package/dist/esm/swappers/AvnuSwapper/types.js +1 -0
  128. package/dist/esm/swappers/AvnuSwapper/utils/constants.d.ts +5 -0
  129. package/dist/esm/swappers/AvnuSwapper/utils/constants.js +7 -0
  130. package/dist/esm/swappers/AvnuSwapper/utils/helpers.d.ts +7 -0
  131. package/dist/esm/swappers/AvnuSwapper/utils/helpers.js +17 -0
  132. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +2 -0
  133. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +4 -0
  134. package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -0
  135. package/dist/esm/swappers/CetusSwapper/endpoints.js +28 -22
  136. package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeData.d.ts +24 -0
  137. package/dist/esm/swappers/CetusSwapper/swapperApi/getCetusTradeData.js +75 -0
  138. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +44 -69
  139. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +50 -66
  140. package/dist/esm/swappers/CetusSwapper/utils/constants.d.ts +1 -0
  141. package/dist/esm/swappers/CetusSwapper/utils/constants.js +1 -0
  142. package/dist/esm/swappers/CetusSwapper/utils/helpers.d.ts +6 -11
  143. package/dist/esm/swappers/CetusSwapper/utils/helpers.js +37 -67
  144. package/dist/esm/swappers/JupiterSwapper/utils/helpers.d.ts +0 -2
  145. package/dist/esm/swappers/MayachainSwapper/generated/generatedTradableAssetMap.json +1 -0
  146. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +3 -1
  147. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +68 -0
  148. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +30 -0
  149. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +54 -6
  150. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +1 -1
  151. package/dist/esm/swappers/NearIntentsSwapper/types.js +8 -0
  152. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +29 -9
  153. package/dist/esm/swappers/PortalsSwapper/constants.js +1 -1
  154. package/dist/esm/swappers/PortalsSwapper/endpoints.js +92 -1
  155. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeQuote/getPortalsTradeQuote.js +30 -18
  156. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +21 -17
  157. package/dist/esm/swappers/PortalsSwapper/types.js +1 -0
  158. package/dist/esm/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.d.ts +9 -0
  159. package/dist/esm/swappers/PortalsSwapper/utils/fetchAxelarscanStatus.js +47 -0
  160. package/dist/esm/swappers/PortalsSwapper/utils/fetchPortalsTradeOrder.d.ts +1 -0
  161. package/dist/esm/swappers/PortalsSwapper/utils/fetchSquidStatus.d.ts +9 -0
  162. package/dist/esm/swappers/PortalsSwapper/utils/fetchSquidStatus.js +52 -0
  163. package/dist/esm/swappers/RelaySwapper/constant.js +5 -2
  164. package/dist/esm/swappers/RelaySwapper/utils/fetchRelayTrade.js +1 -1
  165. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +18 -3
  166. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +20 -0
  167. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +13 -4
  168. package/dist/esm/swappers/RelaySwapper/utils/types.js +3 -0
  169. package/dist/esm/swappers/SunioSwapper/SunioSwapper.d.ts +2 -0
  170. package/dist/esm/swappers/SunioSwapper/SunioSwapper.js +4 -0
  171. package/dist/esm/swappers/SunioSwapper/endpoints.d.ts +2 -0
  172. package/dist/esm/swappers/SunioSwapper/endpoints.js +128 -0
  173. package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.d.ts +3 -0
  174. package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +4 -0
  175. package/dist/esm/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.d.ts +3 -0
  176. package/dist/esm/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +4 -0
  177. package/dist/esm/swappers/SunioSwapper/index.d.ts +4 -0
  178. package/dist/esm/swappers/SunioSwapper/index.js +4 -0
  179. package/dist/esm/swappers/SunioSwapper/types.d.ts +22 -0
  180. package/dist/esm/swappers/SunioSwapper/types.js +9 -0
  181. package/dist/esm/swappers/SunioSwapper/utils/abi.d.ts +48 -0
  182. package/dist/esm/swappers/SunioSwapper/utils/abi.js +25 -0
  183. package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +14 -0
  184. package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +28 -0
  185. package/dist/esm/swappers/SunioSwapper/utils/buildSwapTransaction.d.ts +11 -0
  186. package/dist/esm/swappers/SunioSwapper/utils/buildSwapTransaction.js +53 -0
  187. package/dist/esm/swappers/SunioSwapper/utils/constants.d.ts +6 -0
  188. package/dist/esm/swappers/SunioSwapper/utils/constants.js +13 -0
  189. package/dist/esm/swappers/SunioSwapper/utils/fetchFromSunio.d.ts +11 -0
  190. package/dist/esm/swappers/SunioSwapper/utils/fetchFromSunio.js +41 -0
  191. package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.d.ts +4 -0
  192. package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +199 -0
  193. package/dist/esm/swappers/SunioSwapper/utils/helpers/helpers.d.ts +4 -0
  194. package/dist/esm/swappers/SunioSwapper/utils/helpers/helpers.js +16 -0
  195. package/dist/esm/swappers/SunioSwapper/utils/sunioService.d.ts +6 -0
  196. package/dist/esm/swappers/SunioSwapper/utils/sunioService.js +14 -0
  197. package/dist/esm/swappers/ThorchainSwapper/ThorchainSwapper.js +3 -0
  198. package/dist/esm/swappers/ThorchainSwapper/endpoints.js +3 -1
  199. package/dist/esm/swappers/ThorchainSwapper/generated/generatedTradableAssetMap.json +2 -2
  200. package/dist/esm/swappers/utils/helpers/helpers.js +9 -2
  201. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +81 -4
  202. package/dist/esm/thorchain-utils/index.d.ts +1 -0
  203. package/dist/esm/thorchain-utils/index.js +1 -0
  204. package/dist/esm/thorchain-utils/tron/getThorTxData.d.ts +12 -0
  205. package/dist/esm/thorchain-utils/tron/getThorTxData.js +10 -0
  206. package/dist/esm/thorchain-utils/tron/getTronTransactionFees.d.ts +2 -0
  207. package/dist/esm/thorchain-utils/tron/getTronTransactionFees.js +61 -0
  208. package/dist/esm/thorchain-utils/tron/getUnsignedTronTransaction.d.ts +3 -0
  209. package/dist/esm/thorchain-utils/tron/getUnsignedTronTransaction.js +31 -0
  210. package/dist/esm/thorchain-utils/tron/index.d.ts +3 -0
  211. package/dist/esm/thorchain-utils/tron/index.js +3 -0
  212. package/dist/esm/types.d.ts +74 -9
  213. package/dist/esm/types.js +2 -0
  214. package/dist/esm/utils/tenderly/simulate.d.ts +6 -1
  215. package/dist/esm/utils/tenderly/simulate.js +20 -1
  216. package/dist/esm/utils/tenderly/types.d.ts +21 -0
  217. package/dist/esm/utils.d.ts +9 -3
  218. package/dist/esm/utils.js +50 -1
  219. package/package.json +9 -8
@@ -0,0 +1,53 @@
1
+ import { TronWeb } from 'tronweb';
2
+ import { SUNIO_SMART_ROUTER_CONTRACT } from './constants.js';
3
+ const convertAddressesToEvmFormat = (value) => {
4
+ if (Array.isArray(value)) {
5
+ return value.map(v => convertAddressesToEvmFormat(v));
6
+ }
7
+ if (typeof value === 'string' && value.startsWith('T') && TronWeb.isAddress(value)) {
8
+ const hex = TronWeb.address.toHex(value);
9
+ return hex.replace(/^41/, '0x');
10
+ }
11
+ return value;
12
+ };
13
+ export const buildSunioSwapTransaction = async (args) => {
14
+ const { route, from, to, sellAmountCryptoBaseUnit, minBuyAmountCryptoBaseUnit, rpcUrl, deadline, } = args;
15
+ const tronWeb = new TronWeb({
16
+ fullHost: rpcUrl,
17
+ });
18
+ const path = route.tokens;
19
+ const poolVersion = route.poolVersions;
20
+ const versionLen = Array(poolVersion.length).fill(2);
21
+ const fees = route.poolFees.map(fee => Number(fee));
22
+ const swapData = {
23
+ amountIn: sellAmountCryptoBaseUnit,
24
+ amountOutMin: minBuyAmountCryptoBaseUnit,
25
+ recipient: to,
26
+ deadline: deadline ?? Math.floor(Date.now() / 1000) + 60 * 20,
27
+ };
28
+ const parameters = [
29
+ { type: 'address[]', value: path },
30
+ { type: 'string[]', value: poolVersion },
31
+ { type: 'uint256[]', value: versionLen },
32
+ { type: 'uint24[]', value: fees },
33
+ {
34
+ type: 'tuple(uint256,uint256,address,uint256)',
35
+ value: convertAddressesToEvmFormat([
36
+ swapData.amountIn,
37
+ swapData.amountOutMin,
38
+ swapData.recipient,
39
+ swapData.deadline,
40
+ ]),
41
+ },
42
+ ];
43
+ const functionSelector = 'swapExactInput(address[],string[],uint256[],uint24[],(uint256,uint256,address,uint256))';
44
+ const options = {
45
+ feeLimit: 100_000_000,
46
+ callValue: 0,
47
+ };
48
+ const txData = await tronWeb.transactionBuilder.triggerSmartContract(SUNIO_SMART_ROUTER_CONTRACT, functionSelector, options, parameters, from);
49
+ if (!txData.result || !txData.result.result) {
50
+ throw new Error('[Sun.io] Failed to build swap transaction');
51
+ }
52
+ return txData.transaction;
53
+ };
@@ -0,0 +1,6 @@
1
+ export declare const SUNIO_SUPPORTED_CHAIN_IDS: readonly [import("@shapeshiftoss/caip").ChainId];
2
+ export declare const SUNIO_API_BASE_URL = "https://rot.endjgfsv.link";
3
+ export declare const SUNIO_SMART_ROUTER_CONTRACT: "TCFNp179Lg46D16zKoumd4Poa2WFFdtqYj";
4
+ export declare const DEFAULT_SLIPPAGE_PERCENTAGE = "0.005";
5
+ export declare const SUNIO_DEX_TYPES: "PSM,CURVE,CURVE_COMBINATION,WTRX,SUNSWAP_V1,SUNSWAP_V2,SUNSWAP_V3";
6
+ export declare const SUNIO_TRON_NATIVE_ADDRESS: "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
@@ -0,0 +1,13 @@
1
+ import { tronChainId } from '@shapeshiftoss/caip';
2
+ export const SUNIO_SUPPORTED_CHAIN_IDS = [tronChainId];
3
+ // NOTE: This domain looks suspicious, but it's the official Sun.io backend API
4
+ // Verified by inspecting XHR requests from sun.io's own frontend application
5
+ // The sun.io frontend makes requests to this endpoint with origin: https://sun.io
6
+ export const SUNIO_API_BASE_URL = 'https://rot.endjgfsv.link';
7
+ // Smart Exchange Router - aggregates liquidity across V1, V2, V3, PSM, and SunCurve
8
+ // This is the current mainnet router that sun.io's frontend uses
9
+ export const SUNIO_SMART_ROUTER_CONTRACT = 'TCFNp179Lg46D16zKoumd4Poa2WFFdtqYj';
10
+ export const DEFAULT_SLIPPAGE_PERCENTAGE = '0.005';
11
+ export const SUNIO_DEX_TYPES = 'PSM,CURVE,CURVE_COMBINATION,WTRX,SUNSWAP_V1,SUNSWAP_V2,SUNSWAP_V3';
12
+ // Native TRX token address (used when assetId is not a TRC-20 token)
13
+ export const SUNIO_TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
@@ -0,0 +1,11 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ import type { Result } from '@sniptt/monads';
3
+ import type { SwapErrorRight } from '../../../types.js';
4
+ import type { SunioQuoteResponse } from '../types.js';
5
+ import type { SunioService } from './sunioService.js';
6
+ export type FetchSunioQuoteParams = {
7
+ sellAssetId: AssetId;
8
+ buyAssetId: AssetId;
9
+ sellAmountCryptoBaseUnit: string;
10
+ };
11
+ export declare const fetchSunioQuote: (params: FetchSunioQuoteParams, service: SunioService) => Promise<Result<SunioQuoteResponse, SwapErrorRight>>;
@@ -0,0 +1,41 @@
1
+ import { Err, Ok } from '@sniptt/monads';
2
+ import { TradeQuoteError } from '../../../types.js';
3
+ import { makeSwapErrorRight } from '../../../utils.js';
4
+ import { SUNIO_API_BASE_URL, SUNIO_DEX_TYPES } from './constants.js';
5
+ import { assetIdToTronToken } from './helpers/helpers.js';
6
+ export const fetchSunioQuote = async (params, service) => {
7
+ try {
8
+ const { sellAssetId, buyAssetId, sellAmountCryptoBaseUnit } = params;
9
+ const fromToken = assetIdToTronToken(sellAssetId);
10
+ const toToken = assetIdToTronToken(buyAssetId);
11
+ const queryParams = {
12
+ fromToken,
13
+ toToken,
14
+ amountIn: sellAmountCryptoBaseUnit,
15
+ typeList: SUNIO_DEX_TYPES,
16
+ };
17
+ const url = `${SUNIO_API_BASE_URL}/swap/router`;
18
+ const maybeResponse = await service.get(url, {
19
+ params: queryParams,
20
+ });
21
+ if (maybeResponse.isErr()) {
22
+ return Err(maybeResponse.unwrapErr());
23
+ }
24
+ const { data: response } = maybeResponse.unwrap();
25
+ if (response.code !== 0 || !response.data || response.data.length === 0) {
26
+ return Err(makeSwapErrorRight({
27
+ message: `[Sun.io] ${response.message || 'No routes found'}`,
28
+ code: TradeQuoteError.NoRouteFound,
29
+ details: { response },
30
+ }));
31
+ }
32
+ return Ok(response);
33
+ }
34
+ catch (error) {
35
+ return Err(makeSwapErrorRight({
36
+ message: '[Sun.io] Failed to fetch quote',
37
+ code: TradeQuoteError.QueryFailed,
38
+ cause: error,
39
+ }));
40
+ }
41
+ };
@@ -0,0 +1,4 @@
1
+ import type { Result } from '@sniptt/monads';
2
+ import type { CommonTradeQuoteInput, GetTradeRateInput, GetTronTradeQuoteInput, SwapErrorRight, SwapperDeps, TradeQuote, TradeRate } from '../../../types.js';
3
+ export declare function getQuoteOrRate(input: GetTronTradeQuoteInput | CommonTradeQuoteInput, deps: SwapperDeps): Promise<Result<TradeQuote, SwapErrorRight>>;
4
+ export declare function getQuoteOrRate(input: GetTradeRateInput, deps: SwapperDeps): Promise<Result<TradeRate, SwapErrorRight>>;
@@ -0,0 +1,199 @@
1
+ import { tronChainId } from '@shapeshiftoss/caip';
2
+ import { bn, contractAddressOrUndefined } from '@shapeshiftoss/utils';
3
+ import { Err, Ok } from '@sniptt/monads';
4
+ import { TronWeb } from 'tronweb';
5
+ import { SwapperName, TradeQuoteError } from '../../../types.js';
6
+ import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
7
+ import { DEFAULT_SLIPPAGE_PERCENTAGE, SUNIO_SMART_ROUTER_CONTRACT } from './constants.js';
8
+ import { fetchSunioQuote } from './fetchFromSunio.js';
9
+ import { isSupportedChainId } from './helpers/helpers.js';
10
+ import { sunioServiceFactory } from './sunioService.js';
11
+ export async function getQuoteOrRate(input, deps) {
12
+ try {
13
+ const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, accountNumber, affiliateBps, slippageTolerancePercentageDecimal, } = input;
14
+ const { assertGetTronChainAdapter: _assertGetTronChainAdapter } = deps;
15
+ if (!isSupportedChainId(sellAsset.chainId)) {
16
+ return Err(makeSwapErrorRight({
17
+ message: `[${SwapperName.Sunio}] Unsupported chainId: ${sellAsset.chainId}`,
18
+ code: TradeQuoteError.UnsupportedChain,
19
+ details: { chainId: sellAsset.chainId },
20
+ }));
21
+ }
22
+ if (sellAsset.chainId !== buyAsset.chainId) {
23
+ return Err(makeSwapErrorRight({
24
+ message: `[${SwapperName.Sunio}] Cross-chain not supported`,
25
+ code: TradeQuoteError.CrossChainNotSupported,
26
+ }));
27
+ }
28
+ if (sellAsset.chainId !== tronChainId) {
29
+ return Err(makeSwapErrorRight({
30
+ message: `[${SwapperName.Sunio}] Only TRON chain supported`,
31
+ code: TradeQuoteError.UnsupportedChain,
32
+ }));
33
+ }
34
+ const service = sunioServiceFactory();
35
+ const maybeQuoteResponse = await fetchSunioQuote({
36
+ sellAssetId: sellAsset.assetId,
37
+ buyAssetId: buyAsset.assetId,
38
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
39
+ }, service);
40
+ if (maybeQuoteResponse.isErr()) {
41
+ return Err(maybeQuoteResponse.unwrapErr());
42
+ }
43
+ const quoteResponse = maybeQuoteResponse.unwrap();
44
+ const bestRoute = quoteResponse.data[0];
45
+ if (!bestRoute) {
46
+ return Err(makeSwapErrorRight({
47
+ message: '[Sun.io] No routes available',
48
+ code: TradeQuoteError.NoRouteFound,
49
+ }));
50
+ }
51
+ const isQuote = input.quoteOrRate === 'quote';
52
+ // For quotes, receiveAddress is required
53
+ if (isQuote && !receiveAddress) {
54
+ return Err(makeSwapErrorRight({
55
+ message: '[Sun.io] receiveAddress is required for quotes',
56
+ code: TradeQuoteError.InternalError,
57
+ }));
58
+ }
59
+ // Fetch network fees for both quotes and rates (when wallet connected)
60
+ let networkFeeCryptoBaseUnit = undefined;
61
+ // Estimate fees when we have an address to estimate from
62
+ if (receiveAddress) {
63
+ try {
64
+ const contractAddress = contractAddressOrUndefined(sellAsset.assetId);
65
+ const isSellingNativeTrx = !contractAddress;
66
+ const tronWeb = new TronWeb({ fullHost: deps.config.VITE_TRON_NODE_URL });
67
+ // Get chain parameters for pricing
68
+ const params = await tronWeb.trx.getChainParameters();
69
+ const bandwidthPrice = params.find(p => p.key === 'getTransactionFee')?.value ?? 1000;
70
+ const energyPrice = params.find(p => p.key === 'getEnergyFee')?.value ?? 100;
71
+ // Check if recipient needs activation (applies to all swaps)
72
+ let accountActivationFee = 0;
73
+ try {
74
+ const recipientInfoResponse = await fetch(`${deps.config.VITE_TRON_NODE_URL}/wallet/getaccount`, {
75
+ method: 'POST',
76
+ headers: { 'Content-Type': 'application/json' },
77
+ body: JSON.stringify({ address: receiveAddress, visible: true }),
78
+ });
79
+ const recipientInfo = await recipientInfoResponse.json();
80
+ const recipientExists = recipientInfo && Object.keys(recipientInfo).length > 1;
81
+ if (!recipientExists) {
82
+ accountActivationFee = 1_000_000; // 1 TRX
83
+ }
84
+ }
85
+ catch {
86
+ // Ignore activation check errors
87
+ }
88
+ // For native TRX swaps, Sun.io uses a contract call with value
89
+ // We need to estimate energy for the swap contract, not just bandwidth
90
+ if (isSellingNativeTrx) {
91
+ try {
92
+ // Sun.io contract owner provides most energy (~117k), users only pay ~2k
93
+ // Use fixed 2k energy estimate instead of querying (which returns total 120k)
94
+ const energyUsed = 2000; // User pays ~2k energy, contract covers the rest
95
+ const energyFee = energyUsed * energyPrice; // No multiplier - contract provides energy
96
+ // Estimate bandwidth for contract call (much larger than simple transfer)
97
+ const bandwidthFee = 1100 * bandwidthPrice; // ~1100 bytes for contract call (with safety buffer)
98
+ networkFeeCryptoBaseUnit = bn(energyFee)
99
+ .plus(bandwidthFee)
100
+ .plus(accountActivationFee)
101
+ .toFixed(0);
102
+ }
103
+ catch (estimationError) {
104
+ // Fallback estimate: ~2k energy + ~1100 bytes bandwidth + activation fee
105
+ const fallbackEnergyFee = 2000 * energyPrice;
106
+ const fallbackBandwidthFee = 1100 * bandwidthPrice;
107
+ networkFeeCryptoBaseUnit = bn(fallbackEnergyFee)
108
+ .plus(fallbackBandwidthFee)
109
+ .plus(accountActivationFee)
110
+ .toFixed(0);
111
+ }
112
+ }
113
+ else {
114
+ // For TRC-20 swaps through Sun.io router
115
+ // Same as TRX: contract owner provides most energy, user pays ~2k
116
+ // Sun.io provides ~217k energy, user pays ~2k
117
+ const energyFee = 2000 * energyPrice;
118
+ const bandwidthFee = 1100 * bandwidthPrice;
119
+ networkFeeCryptoBaseUnit = bn(energyFee)
120
+ .plus(bandwidthFee)
121
+ .plus(accountActivationFee)
122
+ .toFixed(0);
123
+ }
124
+ }
125
+ catch (error) {
126
+ // For rates, fall back to '0' on estimation failure
127
+ // For quotes, let it error (required for accurate swap)
128
+ if (!isQuote) {
129
+ networkFeeCryptoBaseUnit = '0';
130
+ }
131
+ else {
132
+ throw error;
133
+ }
134
+ }
135
+ }
136
+ const buyAmountCryptoBaseUnit = bn(bestRoute.amountOut)
137
+ .times(bn(10).pow(buyAsset.precision))
138
+ .toFixed(0);
139
+ // Calculate protocol fees only for quotes
140
+ const protocolFeeCryptoBaseUnit = isQuote
141
+ ? bn(bestRoute.fee).times(sellAmountIncludingProtocolFeesCryptoBaseUnit).toFixed(0)
142
+ : '0';
143
+ const buyAmountAfterFeesCryptoBaseUnit = buyAmountCryptoBaseUnit;
144
+ const rate = getInputOutputRate({
145
+ sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
146
+ buyAmountCryptoBaseUnit,
147
+ sellAsset,
148
+ buyAsset,
149
+ });
150
+ const trade = {
151
+ id: crypto.randomUUID(),
152
+ quoteOrRate: input.quoteOrRate,
153
+ rate,
154
+ slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ?? DEFAULT_SLIPPAGE_PERCENTAGE,
155
+ receiveAddress,
156
+ affiliateBps,
157
+ steps: [
158
+ {
159
+ buyAmountBeforeFeesCryptoBaseUnit: buyAmountCryptoBaseUnit,
160
+ buyAmountAfterFeesCryptoBaseUnit,
161
+ sellAmountIncludingProtocolFeesCryptoBaseUnit,
162
+ feeData: {
163
+ networkFeeCryptoBaseUnit,
164
+ protocolFees: protocolFeeCryptoBaseUnit !== '0'
165
+ ? {
166
+ [sellAsset.assetId]: {
167
+ amountCryptoBaseUnit: protocolFeeCryptoBaseUnit,
168
+ requiresBalance: false,
169
+ asset: sellAsset,
170
+ },
171
+ }
172
+ : {},
173
+ },
174
+ rate,
175
+ source: SwapperName.Sunio,
176
+ buyAsset,
177
+ sellAsset,
178
+ accountNumber,
179
+ allowanceContract: SUNIO_SMART_ROUTER_CONTRACT,
180
+ estimatedExecutionTimeMs: undefined,
181
+ ...(isQuote && {
182
+ sunioTransactionMetadata: {
183
+ route: bestRoute,
184
+ },
185
+ }),
186
+ },
187
+ ],
188
+ swapperName: SwapperName.Sunio,
189
+ };
190
+ return Ok(trade);
191
+ }
192
+ catch (error) {
193
+ return Err(makeSwapErrorRight({
194
+ message: `[Sun.io] Failed to get trade ${input.quoteOrRate}`,
195
+ code: TradeQuoteError.UnknownError,
196
+ cause: error,
197
+ }));
198
+ }
199
+ }
@@ -0,0 +1,4 @@
1
+ import type { AssetId } from '@shapeshiftoss/caip';
2
+ export declare const isSupportedChainId: (chainId: string) => boolean;
3
+ export declare const assetIdToTronToken: (assetId: AssetId) => string;
4
+ export declare const isTronChainId: (chainId: string) => chainId is import("@shapeshiftoss/caip").ChainId;
@@ -0,0 +1,16 @@
1
+ import { fromAssetId, tronChainId } from '@shapeshiftoss/caip';
2
+ import { isToken } from '@shapeshiftoss/utils';
3
+ import { SUNIO_SUPPORTED_CHAIN_IDS, SUNIO_TRON_NATIVE_ADDRESS } from '../constants.js';
4
+ export const isSupportedChainId = (chainId) => {
5
+ return SUNIO_SUPPORTED_CHAIN_IDS.includes(chainId);
6
+ };
7
+ export const assetIdToTronToken = (assetId) => {
8
+ if (isToken(assetId)) {
9
+ const { assetReference } = fromAssetId(assetId);
10
+ return assetReference;
11
+ }
12
+ return SUNIO_TRON_NATIVE_ADDRESS;
13
+ };
14
+ export const isTronChainId = (chainId) => {
15
+ return chainId === tronChainId;
16
+ };
@@ -0,0 +1,6 @@
1
+ export declare const sunioServiceFactory: () => {
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
+ };
6
+ export type SunioService = ReturnType<typeof sunioServiceFactory>;
@@ -0,0 +1,14 @@
1
+ import { createCache, makeSwapperAxiosServiceMonadic } from '../../../utils.js';
2
+ const maxAge = 5 * 1000;
3
+ const cachedUrls = ['/swap/router'];
4
+ export const sunioServiceFactory = () => {
5
+ const axiosConfig = {
6
+ timeout: 10000,
7
+ headers: {
8
+ Accept: 'application/json',
9
+ 'Content-Type': 'application/json',
10
+ },
11
+ };
12
+ const serviceBase = createCache(maxAge, cachedUrls, axiosConfig);
13
+ return makeSwapperAxiosServiceMonadic(serviceBase);
14
+ };
@@ -7,4 +7,7 @@ export const thorchainSwapper = {
7
7
  executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
8
8
  return signAndBroadcastTransaction(txToSign);
9
9
  },
10
+ executeTronTransaction: (txToSign, { signAndBroadcastTransaction }) => {
11
+ return signAndBroadcastTransaction(txToSign);
12
+ },
10
13
  };
@@ -1,5 +1,5 @@
1
1
  import { cosmosAssetId, rujiAssetId, tcyAssetId, thorchainAssetId } from '@shapeshiftoss/caip';
2
- import { checkTradeStatus, cosmossdk, evm, getInboundAddressDataForChain, utxo, } from '../../thorchain-utils/index.js';
2
+ import { checkTradeStatus, cosmossdk, evm, getInboundAddressDataForChain, tron, utxo, } from '../../thorchain-utils/index.js';
3
3
  import { SwapperName } from '../../types.js';
4
4
  import { getExecutableTradeStep, isExecutableTradeQuote } from '../../utils.js';
5
5
  import { getTradeQuote } from './getTradeQuote/getTradeQuote.js';
@@ -12,6 +12,8 @@ export const thorchainApi = {
12
12
  getEvmTransactionFees: input => evm.getEvmTransactionFees(input, swapperName),
13
13
  getUnsignedUtxoTransaction: input => utxo.getUnsignedUtxoTransaction(input, swapperName),
14
14
  getUtxoTransactionFees: input => utxo.getUtxoTransactionFees(input, swapperName),
15
+ getUnsignedTronTransaction: input => tron.getUnsignedTronTransaction(input, swapperName),
16
+ getTronTransactionFees: input => tron.getTronTransactionFees(input, swapperName),
15
17
  getUnsignedCosmosSdkTransaction: async ({ tradeQuote, stepIndex, from, config, assertGetCosmosSdkChainAdapter, }) => {
16
18
  if (!isExecutableTradeQuote(tradeQuote))
17
19
  throw new Error('Unable to execute a trade rate quote');
@@ -25,7 +25,6 @@
25
25
  "ETH.GUSD-0X056FD409E1D7A124BD7017459DFEA2F387B6D5CD": "eip155:1/erc20:0x056fd409e1d7a124bd7017459dfea2f387b6d5cd",
26
26
  "ETH.LINK-0X514910771AF9CA656AF840DFF83E8264ECF986CA": "eip155:1/erc20:0x514910771af9ca656af840dff83e8264ecf986ca",
27
27
  "ETH.LUSD-0X5F98805A4E8BE255A32880FDEC7F6728C6568BA0": "eip155:1/erc20:0x5f98805a4e8be255a32880fdec7f6728c6568ba0",
28
- "ETH.RAZE-0X5EAA69B29F99C84FE5DE8200340B4E9B4AB38EAC": "eip155:1/erc20:0x5eaa69b29f99c84fe5de8200340b4e9b4ab38eac",
29
28
  "ETH.SNX-0XC011A73EE8576FB46F5E1C5751CA3B9FE0AF2A6F": "eip155:1/erc20:0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f",
30
29
  "ETH.TGT-0X108A850856DB3F85D0269A2693D896B394C80325": "eip155:1/erc20:0x108a850856db3f85d0269a2693d896b394c80325",
31
30
  "ETH.THOR-0XA5F2211B9B8170F694421F2046281775E8468044": "eip155:1/erc20:0xa5f2211b9b8170f694421f2046281775e8468044",
@@ -34,12 +33,13 @@
34
33
  "ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7",
35
34
  "ETH.VTHOR-0X815C23ECA83261B6EC689B60CC4A58B54BC24D8D": "eip155:1/erc20:0x815c23eca83261b6ec689b60cc4a58b54bc24d8d",
36
35
  "ETH.WBTC-0X2260FAC5E5542A773AA44FBCFEDF7C193BC2C599": "eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
37
- "ETH.XDEFI-0X72B886D09C117654AB7DA13A14D603001DE0B777": "eip155:1/erc20:0x72b886d09c117654ab7da13a14d603001de0b777",
38
36
  "ETH.XRUNE-0X69FA0FEE221AD11012BAB0FDB45D444D3D2CE71C": "eip155:1/erc20:0x69fa0fee221ad11012bab0fdb45d444d3d2ce71c",
39
37
  "ETH.YFI-0X0BC529C00C6401AEF6D220BE8C6EA1667F6AD93E": "eip155:1/erc20:0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e",
40
38
  "GAIA.ATOM": "cosmos:cosmoshub-4/slip44:118",
41
39
  "LTC.LTC": "bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2",
42
40
  "THOR.RUJI": "cosmos:thorchain-1/slip44:ruji",
43
41
  "THOR.TCY": "cosmos:thorchain-1/slip44:tcy",
42
+ "TRON.TRX": "tron:0x2b6653dc/slip44:195",
43
+ "TRON.USDT-TR7NHQJEKQXGTCI8Q8ZY4PL8OTSZGJLJ6T": "tron:0x2b6653dc/trc20:tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t",
44
44
  "THOR.RUNE": "cosmos:thorchain-1/slip44:931"
45
45
  }
@@ -1,6 +1,6 @@
1
- import { arbitrumAssetId, avalancheAssetId, baseAssetId, bscAssetId, ethAssetId, fromAssetId, gnosisAssetId, optimismAssetId, polygonAssetId, } from '@shapeshiftoss/caip';
1
+ import { arbitrumAssetId, avalancheAssetId, baseAssetId, bscAssetId, ethAssetId, fromAssetId, gnosisAssetId, katanaAssetId, monadAssetId, optimismAssetId, plasmaAssetId, polygonAssetId, } from '@shapeshiftoss/caip';
2
2
  import { KnownChainIds } from '@shapeshiftoss/types';
3
- import { DAO_TREASURY_ARBITRUM, DAO_TREASURY_AVALANCHE, DAO_TREASURY_BASE, DAO_TREASURY_BITCOIN, DAO_TREASURY_BSC, DAO_TREASURY_ETHEREUM_MAINNET, DAO_TREASURY_GNOSIS, DAO_TREASURY_OPTIMISM, DAO_TREASURY_POLYGON, DAO_TREASURY_SOLANA, isTreasuryChainId, } from '@shapeshiftoss/utils';
3
+ import { DAO_TREASURY_ARBITRUM, DAO_TREASURY_AVALANCHE, DAO_TREASURY_BASE, DAO_TREASURY_BITCOIN, DAO_TREASURY_BSC, DAO_TREASURY_ETHEREUM_MAINNET, DAO_TREASURY_GNOSIS, DAO_TREASURY_OPTIMISM, DAO_TREASURY_POLYGON, DAO_TREASURY_SOLANA, DAO_TREASURY_STARKNET, isTreasuryChainId, } from '@shapeshiftoss/utils';
4
4
  export const isNativeEvmAsset = (assetId) => {
5
5
  const { chainId } = fromAssetId(assetId);
6
6
  switch (chainId) {
@@ -20,6 +20,12 @@ export const isNativeEvmAsset = (assetId) => {
20
20
  return assetId === arbitrumAssetId;
21
21
  case KnownChainIds.BaseMainnet:
22
22
  return assetId === baseAssetId;
23
+ case KnownChainIds.MonadMainnet:
24
+ return assetId === monadAssetId;
25
+ case KnownChainIds.PlasmaMainnet:
26
+ return assetId === plasmaAssetId;
27
+ case KnownChainIds.KatanaMainnet:
28
+ return assetId === katanaAssetId;
23
29
  default:
24
30
  return false;
25
31
  }
@@ -35,6 +41,7 @@ const DAO_TREASURY_BY_CHAIN_ID = {
35
41
  [KnownChainIds.BaseMainnet]: DAO_TREASURY_BASE,
36
42
  [KnownChainIds.SolanaMainnet]: DAO_TREASURY_SOLANA,
37
43
  [KnownChainIds.BitcoinMainnet]: DAO_TREASURY_BITCOIN,
44
+ [KnownChainIds.StarknetMainnet]: DAO_TREASURY_STARKNET,
38
45
  };
39
46
  export const getTreasuryAddressFromChainId = (chainId) => {
40
47
  const maybeTreasuryChainId = isTreasuryChainId(chainId) ? chainId : undefined;
@@ -1,7 +1,8 @@
1
1
  import { CHAIN_NAMESPACE, fromAssetId } from '@shapeshiftoss/caip';
2
2
  import * as adapters from '@shapeshiftoss/chain-adapters';
3
- import { assertUnreachable, bn, bnOrZero, convertDecimalPercentageToBasisPoints, convertPrecision, fromBaseUnit, isFulfilled, isRejected, toBaseUnit, } from '@shapeshiftoss/utils';
3
+ import { assertUnreachable, bn, bnOrZero, contractAddressOrUndefined, convertDecimalPercentageToBasisPoints, convertPrecision, fromBaseUnit, isFulfilled, isRejected, toBaseUnit, } from '@shapeshiftoss/utils';
4
4
  import { Err, Ok } from '@sniptt/monads';
5
+ import { TronWeb } from 'tronweb';
5
6
  import { v4 as uuid } from 'uuid';
6
7
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../index.js';
7
8
  import { TradeQuoteError } from '../types.js';
@@ -10,6 +11,7 @@ import * as evm from './evm/index.js';
10
11
  import { getLimitWithManualSlippage } from './getLimitWithManualSlippage/getLimitWithManualSlippage.js';
11
12
  import { getQuote } from './getQuote.js';
12
13
  import { addLimitToMemo, assertAndProcessMemo, getAffiliate, getNativePrecision, getSwapSource, } from './index.js';
14
+ import * as tron from './tron/index.js';
13
15
  import * as utxo from './utxo/index.js';
14
16
  const SAFE_GAS_LIMIT = '100000'; // depositWithExpiry()
15
17
  export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType, swapperName) => {
@@ -273,10 +275,73 @@ export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType
273
275
  }));
274
276
  }
275
277
  case CHAIN_NAMESPACE.Tron: {
276
- return Err(makeSwapErrorRight({
277
- message: 'Tron is not supported',
278
- code: TradeQuoteError.UnsupportedTradePair,
278
+ const maybeRoutes = await Promise.allSettled(perRouteValues.map(async (route) => {
279
+ const memo = getMemo(route);
280
+ let networkFeeCryptoBaseUnit = undefined;
281
+ // Calculate fees for rates when we have a receive address (wallet connected)
282
+ if (input.quoteOrRate === 'rate' && input.receiveAddress) {
283
+ try {
284
+ const { sellAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit } = input;
285
+ const contractAddress = contractAddressOrUndefined(sellAsset.assetId);
286
+ // Get vault address
287
+ const { vault } = await tron.getThorTxData({ sellAsset, config, swapperName });
288
+ // Estimate fees using the receive address for accurate energy calculation
289
+ const tronWeb = new TronWeb({ fullHost: deps.config.VITE_TRON_NODE_URL });
290
+ const params = await tronWeb.trx.getChainParameters();
291
+ const bandwidthPrice = params.find(p => p.key === 'getTransactionFee')?.value ?? 1000;
292
+ const energyPrice = params.find(p => p.key === 'getEnergyFee')?.value ?? 100;
293
+ let totalFee = 0;
294
+ if (contractAddress) {
295
+ // TRC20: Estimate energy with actual recipient
296
+ try {
297
+ const result = await tronWeb.transactionBuilder.triggerConstantContract(contractAddress, 'transfer(address,uint256)', {}, [
298
+ { type: 'address', value: vault },
299
+ { type: 'uint256', value: sellAmountIncludingProtocolFeesCryptoBaseUnit },
300
+ ], input.receiveAddress);
301
+ const energyUsed = result.energy_used ?? 65000;
302
+ const energyFee = energyUsed * energyPrice * 1.5; // 1.5x safety margin
303
+ const bandwidthFee = 276 * bandwidthPrice; // TRC20 bandwidth
304
+ totalFee = Math.ceil(energyFee + bandwidthFee);
305
+ }
306
+ catch {
307
+ // Fallback: Conservative estimate
308
+ totalFee = 13_000_000; // 13 TRX worst case
309
+ }
310
+ }
311
+ else {
312
+ // TRX transfer bandwidth: Base tx + memo bytes
313
+ const baseBytes = 198;
314
+ const memoBytes = route.quote.memo
315
+ ? Buffer.from(route.quote.memo, 'utf8').length
316
+ : 0;
317
+ const totalBandwidth = baseBytes + memoBytes;
318
+ totalFee = totalBandwidth * bandwidthPrice;
319
+ }
320
+ networkFeeCryptoBaseUnit = String(totalFee);
321
+ }
322
+ catch {
323
+ // Leave as undefined if estimation fails
324
+ }
325
+ }
326
+ // For quotes, fees will be calculated in getTronTransactionFees when executing
327
+ return Promise.resolve(makeThorTradeRateOrQuote({
328
+ route,
329
+ allowanceContract: '0x0',
330
+ memo,
331
+ feeData: {
332
+ networkFeeCryptoBaseUnit,
333
+ protocolFees: getProtocolFees(route.quote),
334
+ },
335
+ }));
279
336
  }));
337
+ const routes = maybeRoutes.filter(isFulfilled).map(maybeRoute => maybeRoute.value);
338
+ if (!routes.length)
339
+ return Err(makeSwapErrorRight({
340
+ message: 'Unable to create any routes',
341
+ code: TradeQuoteError.UnsupportedTradePair,
342
+ cause: maybeRoutes.filter(isRejected).map(maybeRoute => maybeRoute.reason),
343
+ }));
344
+ return Ok(routes);
280
345
  }
281
346
  case CHAIN_NAMESPACE.Sui: {
282
347
  return Err(makeSwapErrorRight({
@@ -284,6 +349,18 @@ export const getL1RateOrQuote = async (input, deps, streamingInterval, tradeType
284
349
  code: TradeQuoteError.UnsupportedTradePair,
285
350
  }));
286
351
  }
352
+ case CHAIN_NAMESPACE.Near: {
353
+ return Err(makeSwapErrorRight({
354
+ message: 'NEAR is not supported',
355
+ code: TradeQuoteError.UnsupportedTradePair,
356
+ }));
357
+ }
358
+ case CHAIN_NAMESPACE.Starknet: {
359
+ return Err(makeSwapErrorRight({
360
+ message: 'Starknet is not supported',
361
+ code: TradeQuoteError.UnsupportedTradePair,
362
+ }));
363
+ }
287
364
  default:
288
365
  return assertUnreachable(chainNamespace);
289
366
  }
@@ -13,6 +13,7 @@ export * from './getL1RateOrQuote.js';
13
13
  export * from './getPoolDetails.js';
14
14
  export * as cosmossdk from './cosmossdk/index.js';
15
15
  export * as evm from './evm/index.js';
16
+ export * as tron from './tron/index.js';
16
17
  export * as utxo from './utxo/index.js';
17
18
  export declare const getChainIdBySwapper: (swapperName: SwapperName) => import("@shapeshiftoss/caip").ChainId;
18
19
  export declare const isThorTradeRate: (quote: TradeRate | undefined) => quote is ThorTradeRate;
@@ -14,6 +14,7 @@ export * from './getL1RateOrQuote.js';
14
14
  export * from './getPoolDetails.js';
15
15
  export * as cosmossdk from './cosmossdk/index.js';
16
16
  export * as evm from './evm/index.js';
17
+ export * as tron from './tron/index.js';
17
18
  export * as utxo from './utxo/index.js';
18
19
  export const getChainIdBySwapper = (swapperName) => {
19
20
  switch (swapperName) {
@@ -0,0 +1,12 @@
1
+ import type { Asset } from '@shapeshiftoss/types';
2
+ import type { SwapperConfig, SwapperName } from '../../types.js';
3
+ type GetThorTxDataArgs = {
4
+ sellAsset: Asset;
5
+ config: SwapperConfig;
6
+ swapperName: SwapperName;
7
+ };
8
+ type GetThorTxDataReturn = {
9
+ vault: string;
10
+ };
11
+ export declare const getThorTxData: ({ sellAsset, config, swapperName, }: GetThorTxDataArgs) => Promise<GetThorTxDataReturn>;
12
+ export {};
@@ -0,0 +1,10 @@
1
+ import { getInboundAddressDataForChain } from '../getInboundAddressDataForChain.js';
2
+ import { getDaemonUrl } from '../index.js';
3
+ export const getThorTxData = async ({ sellAsset, config, swapperName, }) => {
4
+ const daemonUrl = getDaemonUrl(config, swapperName);
5
+ const res = await getInboundAddressDataForChain(daemonUrl, sellAsset.assetId, false, swapperName);
6
+ if (res.isErr())
7
+ throw res.unwrapErr();
8
+ const { address: vault } = res.unwrap();
9
+ return { vault };
10
+ };
@@ -0,0 +1,2 @@
1
+ import type { GetUnsignedTronTransactionArgs, SwapperName } from '../../types.js';
2
+ export declare const getTronTransactionFees: (args: GetUnsignedTronTransactionArgs, swapperName: SwapperName) => Promise<string>;