@shapeshiftoss/swapper 20.2.0 → 20.3.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 (195) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/swappers/BobGatewaySwapper/BobGatewaySwapper.js +10 -1
  3. package/dist/cjs/swappers/BobGatewaySwapper/endpoints.js +2 -33
  4. package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +5 -8
  5. package/dist/cjs/swappers/BobGatewaySwapper/swapperApi/getTradeRate.js +1 -2
  6. package/dist/cjs/swappers/BobGatewaySwapper/types.d.ts +3 -3
  7. package/dist/cjs/swappers/BobGatewaySwapper/utils/constants.d.ts +3 -2
  8. package/dist/cjs/swappers/BobGatewaySwapper/utils/constants.js +8 -5
  9. package/dist/cjs/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.d.ts +2 -2
  10. package/dist/cjs/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.js +30 -34
  11. package/dist/cjs/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.test.d.ts +1 -0
  12. package/dist/cjs/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.test.js +117 -0
  13. package/dist/cjs/swappers/BobGatewaySwapper/utils/getBobGatewayTradeContext.js +1 -2
  14. package/dist/cjs/swappers/BobGatewaySwapper/utils/helpers.d.ts +8 -11
  15. package/dist/cjs/swappers/BobGatewaySwapper/utils/helpers.js +36 -31
  16. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +2 -3
  17. package/dist/cjs/swappers/ButterSwap/types.d.ts +0 -11
  18. package/dist/cjs/swappers/ButterSwap/utils/constants.d.ts +2 -0
  19. package/dist/cjs/swappers/ButterSwap/utils/constants.js +4 -1
  20. package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.d.ts +2 -3
  21. package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.js +42 -14
  22. package/dist/cjs/swappers/ButterSwap/utils/getButterSwapStepData.test.js +120 -17
  23. package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -2
  24. package/dist/cjs/swappers/ButterSwap/xhr.js +3 -3
  25. package/dist/cjs/swappers/ChainflipSwapper/endpoints.js +3 -19
  26. package/dist/cjs/swappers/ChainflipSwapper/utils/getChainflipStepData.d.ts +1 -1
  27. package/dist/cjs/swappers/ChainflipSwapper/utils/getChainflipStepData.js +31 -12
  28. package/dist/cjs/swappers/NearIntentsSwapper/constants.d.ts +1 -0
  29. package/dist/cjs/swappers/NearIntentsSwapper/constants.js +3 -1
  30. package/dist/cjs/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +10 -5
  31. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers.js +1 -1
  32. package/dist/cjs/swappers/RelaySwapper/constant.d.ts +1 -1
  33. package/dist/cjs/swappers/RelaySwapper/constant.js +3 -2
  34. package/dist/cjs/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +1 -2
  35. package/dist/cjs/swappers/RelaySwapper/utils/getRelayAssetAddress.js +2 -1
  36. package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.d.ts +2 -3
  37. package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.js +46 -13
  38. package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.test.d.ts +1 -0
  39. package/dist/cjs/swappers/RelaySwapper/utils/getRelayStepData.test.js +139 -0
  40. package/dist/cjs/swappers/RelaySwapper/utils/helpers.js +1 -2
  41. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +1 -1
  42. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +1 -4
  43. package/dist/cjs/swappers/SunioSwapper/endpoints.js +3 -63
  44. package/dist/cjs/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +3 -4
  45. package/dist/cjs/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +7 -1
  46. package/dist/cjs/swappers/SunioSwapper/types.d.ts +0 -3
  47. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapContractCall.d.ts +11 -6
  48. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapContractCall.js +33 -30
  49. package/dist/cjs/swappers/SunioSwapper/utils/constants.d.ts +3 -3
  50. package/dist/cjs/swappers/SunioSwapper/utils/constants.js +5 -9
  51. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.d.ts +8 -3
  52. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.js +54 -20
  53. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.test.d.ts +1 -0
  54. package/dist/cjs/swappers/SunioSwapper/utils/getSunioStepData.test.js +177 -0
  55. package/dist/cjs/swappers/SunioSwapper/utils/getSunioTradeContext.js +3 -2
  56. package/dist/cjs/swappers/SunioSwapper/utils/helpers.js +2 -1
  57. package/dist/cjs/swappers/ThorchainSwapper/endpoints.js +3 -4
  58. package/dist/cjs/swappers/ThorchainSwapper/utils/addL1ToLongtailPartsToMemo/addL1ToLongtailPartsToMemo.js +6 -1
  59. package/dist/cjs/swappers/ThorchainSwapper/utils/addL1ToLongtailPartsToMemo/addL1ToLongtailPartsToMemo.test.js +15 -0
  60. package/dist/cjs/swappers/ThorchainSwapper/utils/assertValidLongtailTrade.js +7 -0
  61. package/dist/cjs/swappers/ThorchainSwapper/utils/getL1ToLongtailQuote.js +0 -2
  62. package/dist/cjs/swappers/ThorchainSwapper/utils/getL1ToLongtailRate.js +0 -2
  63. package/dist/cjs/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.d.ts +1 -1
  64. package/dist/cjs/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.js +17 -20
  65. package/dist/cjs/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.test.js +31 -0
  66. package/dist/cjs/types.d.ts +9 -8
  67. package/dist/cjs/utils/thorchain/getThorStepData.js +32 -49
  68. package/dist/cjs/utils/thorchain/getThorStepData.tron.test.d.ts +1 -0
  69. package/dist/cjs/utils/thorchain/getThorStepData.tron.test.js +93 -0
  70. package/dist/cjs/utils/thorchain/index.d.ts +0 -1
  71. package/dist/cjs/utils/thorchain/index.js +1 -14
  72. package/dist/cjs/utils/tron/constants.d.ts +1 -0
  73. package/dist/cjs/utils/tron/constants.js +5 -0
  74. package/dist/cjs/utils/tron/getTronNetworkFeeCryptoBaseUnit.d.ts +27 -0
  75. package/dist/cjs/utils/tron/getTronNetworkFeeCryptoBaseUnit.js +64 -0
  76. package/dist/cjs/utils/tron/getTronNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
  77. package/dist/cjs/utils/tron/getTronNetworkFeeCryptoBaseUnit.test.js +157 -0
  78. package/dist/cjs/utils/tron/getUnsignedTronTransaction.d.ts +2 -1
  79. package/dist/cjs/utils/tron/getUnsignedTronTransaction.js +14 -48
  80. package/dist/cjs/utils/tron/getUnsignedTronTransaction.test.d.ts +1 -0
  81. package/dist/cjs/utils/tron/getUnsignedTronTransaction.test.js +76 -0
  82. package/dist/cjs/utils/tron/index.d.ts +2 -0
  83. package/dist/cjs/utils/tron/index.js +2 -0
  84. package/dist/esm/.tsbuildinfo +1 -1
  85. package/dist/esm/swappers/BobGatewaySwapper/BobGatewaySwapper.js +11 -2
  86. package/dist/esm/swappers/BobGatewaySwapper/endpoints.js +5 -36
  87. package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeQuote.js +5 -8
  88. package/dist/esm/swappers/BobGatewaySwapper/swapperApi/getTradeRate.js +1 -2
  89. package/dist/esm/swappers/BobGatewaySwapper/types.d.ts +3 -3
  90. package/dist/esm/swappers/BobGatewaySwapper/utils/constants.d.ts +3 -2
  91. package/dist/esm/swappers/BobGatewaySwapper/utils/constants.js +8 -7
  92. package/dist/esm/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.d.ts +2 -2
  93. package/dist/esm/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.js +21 -25
  94. package/dist/esm/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.test.d.ts +1 -0
  95. package/dist/esm/swappers/BobGatewaySwapper/utils/getBobGatewayStepData.test.js +115 -0
  96. package/dist/esm/swappers/BobGatewaySwapper/utils/getBobGatewayTradeContext.js +1 -2
  97. package/dist/esm/swappers/BobGatewaySwapper/utils/helpers.d.ts +8 -11
  98. package/dist/esm/swappers/BobGatewaySwapper/utils/helpers.js +13 -30
  99. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +2 -3
  100. package/dist/esm/swappers/ButterSwap/types.d.ts +0 -11
  101. package/dist/esm/swappers/ButterSwap/utils/constants.d.ts +2 -0
  102. package/dist/esm/swappers/ButterSwap/utils/constants.js +3 -0
  103. package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.d.ts +2 -3
  104. package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.js +42 -14
  105. package/dist/esm/swappers/ButterSwap/utils/getButterSwapStepData.test.js +120 -17
  106. package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -2
  107. package/dist/esm/swappers/ButterSwap/xhr.js +3 -3
  108. package/dist/esm/swappers/ChainflipSwapper/endpoints.js +3 -19
  109. package/dist/esm/swappers/ChainflipSwapper/utils/getChainflipStepData.d.ts +1 -1
  110. package/dist/esm/swappers/ChainflipSwapper/utils/getChainflipStepData.js +32 -13
  111. package/dist/esm/swappers/NearIntentsSwapper/constants.d.ts +1 -0
  112. package/dist/esm/swappers/NearIntentsSwapper/constants.js +2 -0
  113. package/dist/esm/swappers/NearIntentsSwapper/utils/getNearIntentsStepData.js +10 -5
  114. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers.js +2 -2
  115. package/dist/esm/swappers/RelaySwapper/constant.d.ts +1 -1
  116. package/dist/esm/swappers/RelaySwapper/constant.js +2 -1
  117. package/dist/esm/swappers/RelaySwapper/getTradeQuote/getTradeQuote.js +1 -2
  118. package/dist/esm/swappers/RelaySwapper/utils/getRelayAssetAddress.js +3 -2
  119. package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.d.ts +2 -3
  120. package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.js +46 -13
  121. package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.test.d.ts +1 -0
  122. package/dist/esm/swappers/RelaySwapper/utils/getRelayStepData.test.js +137 -0
  123. package/dist/esm/swappers/RelaySwapper/utils/helpers.js +1 -2
  124. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +3 -3
  125. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +1 -4
  126. package/dist/esm/swappers/SunioSwapper/endpoints.js +5 -65
  127. package/dist/esm/swappers/SunioSwapper/getSunioTradeQuote/getSunioTradeQuote.js +3 -4
  128. package/dist/esm/swappers/SunioSwapper/getSunioTradeRate/getSunioTradeRate.js +7 -1
  129. package/dist/esm/swappers/SunioSwapper/types.d.ts +0 -3
  130. package/dist/esm/swappers/SunioSwapper/utils/buildSwapContractCall.d.ts +11 -6
  131. package/dist/esm/swappers/SunioSwapper/utils/buildSwapContractCall.js +31 -28
  132. package/dist/esm/swappers/SunioSwapper/utils/constants.d.ts +3 -3
  133. package/dist/esm/swappers/SunioSwapper/utils/constants.js +4 -8
  134. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.d.ts +8 -3
  135. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.js +52 -18
  136. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.test.d.ts +1 -0
  137. package/dist/esm/swappers/SunioSwapper/utils/getSunioStepData.test.js +175 -0
  138. package/dist/esm/swappers/SunioSwapper/utils/getSunioTradeContext.js +2 -1
  139. package/dist/esm/swappers/SunioSwapper/utils/helpers.js +3 -2
  140. package/dist/esm/swappers/ThorchainSwapper/endpoints.js +4 -5
  141. package/dist/esm/swappers/ThorchainSwapper/utils/addL1ToLongtailPartsToMemo/addL1ToLongtailPartsToMemo.js +6 -1
  142. package/dist/esm/swappers/ThorchainSwapper/utils/addL1ToLongtailPartsToMemo/addL1ToLongtailPartsToMemo.test.js +15 -0
  143. package/dist/esm/swappers/ThorchainSwapper/utils/assertValidLongtailTrade.js +7 -0
  144. package/dist/esm/swappers/ThorchainSwapper/utils/getL1ToLongtailQuote.js +0 -2
  145. package/dist/esm/swappers/ThorchainSwapper/utils/getL1ToLongtailRate.js +0 -2
  146. package/dist/esm/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.d.ts +1 -1
  147. package/dist/esm/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.js +17 -20
  148. package/dist/esm/swappers/ThorchainSwapper/utils/getUniqueAddressSubstring/getUniqueAddressSubstring.test.js +29 -1
  149. package/dist/esm/types.d.ts +9 -8
  150. package/dist/esm/utils/thorchain/getThorStepData.js +32 -49
  151. package/dist/esm/utils/thorchain/getThorStepData.tron.test.d.ts +1 -0
  152. package/dist/esm/utils/thorchain/getThorStepData.tron.test.js +91 -0
  153. package/dist/esm/utils/thorchain/index.d.ts +0 -1
  154. package/dist/esm/utils/thorchain/index.js +0 -1
  155. package/dist/esm/utils/tron/constants.d.ts +1 -0
  156. package/dist/esm/utils/tron/constants.js +2 -0
  157. package/dist/esm/utils/tron/getTronNetworkFeeCryptoBaseUnit.d.ts +27 -0
  158. package/dist/esm/utils/tron/getTronNetworkFeeCryptoBaseUnit.js +59 -0
  159. package/dist/esm/utils/tron/getTronNetworkFeeCryptoBaseUnit.test.d.ts +1 -0
  160. package/dist/esm/utils/tron/getTronNetworkFeeCryptoBaseUnit.test.js +155 -0
  161. package/dist/esm/utils/tron/getUnsignedTronTransaction.d.ts +2 -1
  162. package/dist/esm/utils/tron/getUnsignedTronTransaction.js +14 -48
  163. package/dist/esm/utils/tron/getUnsignedTronTransaction.test.d.ts +1 -0
  164. package/dist/esm/utils/tron/getUnsignedTronTransaction.test.js +74 -0
  165. package/dist/esm/utils/tron/index.d.ts +2 -0
  166. package/dist/esm/utils/tron/index.js +2 -0
  167. package/package.json +8 -8
  168. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +0 -14
  169. package/dist/cjs/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +0 -32
  170. package/dist/cjs/swappers/SunioSwapper/utils/estimateSunioNetworkFee.d.ts +0 -12
  171. package/dist/cjs/swappers/SunioSwapper/utils/estimateSunioNetworkFee.js +0 -78
  172. package/dist/cjs/swappers/SunioSwapper/utils/getSunioTransactionFees.d.ts +0 -2
  173. package/dist/cjs/swappers/SunioSwapper/utils/getSunioTransactionFees.js +0 -36
  174. package/dist/cjs/utils/thorchain/tron/getTronTransactionFees.d.ts +0 -2
  175. package/dist/cjs/utils/thorchain/tron/getTronTransactionFees.js +0 -68
  176. package/dist/cjs/utils/thorchain/tron/getUnsignedTronTransaction.d.ts +0 -3
  177. package/dist/cjs/utils/thorchain/tron/getUnsignedTronTransaction.js +0 -35
  178. package/dist/cjs/utils/thorchain/tron/index.d.ts +0 -2
  179. package/dist/cjs/utils/thorchain/tron/index.js +0 -18
  180. package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.d.ts +0 -14
  181. package/dist/esm/swappers/SunioSwapper/utils/buildSwapRouteParameters.js +0 -28
  182. package/dist/esm/swappers/SunioSwapper/utils/estimateSunioNetworkFee.d.ts +0 -12
  183. package/dist/esm/swappers/SunioSwapper/utils/estimateSunioNetworkFee.js +0 -74
  184. package/dist/esm/swappers/SunioSwapper/utils/getSunioTransactionFees.d.ts +0 -2
  185. package/dist/esm/swappers/SunioSwapper/utils/getSunioTransactionFees.js +0 -32
  186. package/dist/esm/utils/thorchain/tron/getTronTransactionFees.d.ts +0 -2
  187. package/dist/esm/utils/thorchain/tron/getTronTransactionFees.js +0 -64
  188. package/dist/esm/utils/thorchain/tron/getUnsignedTronTransaction.d.ts +0 -3
  189. package/dist/esm/utils/thorchain/tron/getUnsignedTronTransaction.js +0 -31
  190. package/dist/esm/utils/thorchain/tron/index.d.ts +0 -2
  191. package/dist/esm/utils/thorchain/tron/index.js +0 -2
  192. /package/dist/cjs/swappers/SunioSwapper/utils/{fetchFromSunio.d.ts → fetchSunioQuote.d.ts} +0 -0
  193. /package/dist/cjs/swappers/SunioSwapper/utils/{fetchFromSunio.js → fetchSunioQuote.js} +0 -0
  194. /package/dist/esm/swappers/SunioSwapper/utils/{fetchFromSunio.d.ts → fetchSunioQuote.d.ts} +0 -0
  195. /package/dist/esm/swappers/SunioSwapper/utils/{fetchFromSunio.js → fetchSunioQuote.js} +0 -0
@@ -7,6 +7,8 @@ import { TradeQuoteError } from '../../../types.js';
7
7
  import { makeNetworkFeeEstimationFailedErr, makeSwapErrorRight, makeTradeStepBuildFailedErr, } from '../../../utils/index.js';
8
8
  import { getEvmNetworkFeeCryptoBaseUnit } from '../../../utils/evm/index.js';
9
9
  import { getSolanaNetworkFeeCryptoBaseUnit, omitComputeBudgetInstructions, withComputeUnitLimit, } from '../../../utils/solana/index.js';
10
+ import { getTronContractCallFallbackFeeCryptoBaseUnit, getTronContractCallNetworkFeeCryptoBaseUnit, } from '../../../utils/tron/index.js';
11
+ import { BUTTERSWAP_TRON_DEFAULT_BANDWIDTH_BYTES, BUTTERSWAP_TRON_FALLBACK_SWAP_ENERGY, } from './constants.js';
10
12
  import { getProviderNetworkFeeCryptoBaseUnit } from './helpers.js';
11
13
  // Jupiter swap legs can consume more units than simulated when pool state moves between
12
14
  // simulation and landing (CLMM tick crossings), 1.4 matches Jupiter's dynamicComputeUnitLimit margin
@@ -114,26 +116,52 @@ export async function getButterSwapStepData(args) {
114
116
  return Err(makeTradeStepBuildFailedErr('getButterSwapStepData', error));
115
117
  }
116
118
  }
117
- // Not yet migrated to a TxBuildData variant - exec still builds from legacy metadata
118
119
  case CHAIN_NAMESPACE.Tron: {
119
- const networkFeeCryptoBaseUnit = getProviderNetworkFeeCryptoBaseUnit({ route, feeAsset });
120
+ const adapter = deps.assertGetTronChainAdapter(sellAsset.chainId);
120
121
  if (args.type === 'rate') {
122
+ // Butter's gasFee is a fraction of what the router burns, so rates price the measured swap at the router's share
123
+ const networkFeeCryptoBaseUnit = await (async () => {
124
+ if (!route.contract)
125
+ return getProviderNetworkFeeCryptoBaseUnit({ route, feeAsset });
126
+ try {
127
+ return await getTronContractCallFallbackFeeCryptoBaseUnit({
128
+ adapter,
129
+ energy: BUTTERSWAP_TRON_FALLBACK_SWAP_ENERGY,
130
+ bandwidthBytes: BUTTERSWAP_TRON_DEFAULT_BANDWIDTH_BYTES,
131
+ contractAddress: route.contract,
132
+ });
133
+ }
134
+ catch {
135
+ return getProviderNetworkFeeCryptoBaseUnit({ route, feeAsset });
136
+ }
137
+ })();
121
138
  const stepData = { networkFeeCryptoBaseUnit };
122
139
  return Ok(stepData);
123
140
  }
124
- const { buildTx } = args;
125
- const stepData = {
126
- butterSwapTransactionMetadata: {
127
- to: buildTx.to,
128
- data: buildTx.data,
129
- value: buildTx.value,
130
- method: buildTx.method,
131
- args: buildTx.args,
132
- memo: buildTx.memo,
133
- },
134
- networkFeeCryptoBaseUnit,
141
+ const { buildTx, from } = args;
142
+ const call = {
143
+ to: buildTx.to,
144
+ data: buildTx.data,
145
+ value: fromHex(buildTx.value, 'bigint').toString(),
135
146
  };
136
- return Ok(stepData);
147
+ try {
148
+ const stepData = {
149
+ transactionData: { type: 'tron', ...call },
150
+ networkFeeCryptoBaseUnit: await getTronContractCallNetworkFeeCryptoBaseUnit({
151
+ adapter,
152
+ transactionData: call,
153
+ from,
154
+ sellAsset,
155
+ sellAmountCryptoBaseUnit,
156
+ spenderAddress: buildTx.to,
157
+ fallbackEnergy: BUTTERSWAP_TRON_FALLBACK_SWAP_ENERGY,
158
+ }),
159
+ };
160
+ return Ok(stepData);
161
+ }
162
+ catch (error) {
163
+ return Err(makeNetworkFeeEstimationFailedErr('getButterSwapStepData', error));
164
+ }
137
165
  }
138
166
  default:
139
167
  return Err(makeSwapErrorRight({
@@ -15,6 +15,11 @@ const route = ROUTE_QUOTE.data[0];
15
15
  const PROVIDER_GAS_FEE_BASE_UNIT = '1333043669759539'; // 0.001333043669759539 ETH
16
16
  const SOL = { ...ETH, assetId: `${solanaChainId}/slip44:501`, chainId: solanaChainId };
17
17
  const TRX = { ...ETH, assetId: `${tronChainId}/slip44:195`, chainId: tronChainId };
18
+ const USDT_TRON = {
19
+ ...ETH,
20
+ assetId: `${tronChainId}/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t`,
21
+ chainId: tronChainId,
22
+ };
18
23
  const evmBuildTx = {
19
24
  to: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE',
20
25
  data: '0xdeadbeef',
@@ -25,6 +30,7 @@ const makeDeps = (adapters) => ({
25
30
  assertGetEvmChainAdapter: () => adapters.evm,
26
31
  assertGetUtxoChainAdapter: () => adapters.utxo,
27
32
  assertGetSolanaChainAdapter: () => adapters.solana,
33
+ assertGetTronChainAdapter: () => adapters.tron,
28
34
  });
29
35
  const evmAdapter = ({ gasPrice = '1000000000', estimatedGasLimit = '500000', throwOnGasFeeData = false, throwOnFeeData = false, } = {}) => ({
30
36
  getGasFeeData: () => {
@@ -153,36 +159,133 @@ describe('getButterSwapStepData', () => {
153
159
  });
154
160
  });
155
161
  describe('tron', () => {
156
- it('returns legacy metadata rather than transaction data, since exec still builds from it', async () => {
157
- const buildTx = {
158
- ...evmBuildTx,
162
+ const tronBuildTx = { ...evmBuildTx, to: 'TRouterAddress' };
163
+ const tronAdapter = ({ txFee = '9000000', allowance = '0' } = {}) => ({
164
+ getFeeData: vi.fn().mockResolvedValue({ fast: { txFee } }),
165
+ httpProvider: {
166
+ getChainPrices: () => Promise.resolve({ energyPrice: 100, bandwidthPrice: 1000 }),
167
+ getTrc20Allowance: vi.fn().mockResolvedValue(allowance),
168
+ getTrc20Balance: vi.fn().mockResolvedValue('100000000'),
169
+ getContractEnergyShare: vi.fn().mockResolvedValue({
170
+ callerPercent: 100,
171
+ originEnergyLimit: 0,
172
+ originEnergyAvailable: 0,
173
+ }),
174
+ },
175
+ });
176
+ it('carries the router call as transactionData and simulates it', async () => {
177
+ const adapter = tronAdapter();
178
+ const actual = await getButterSwapStepData({
179
+ type: 'quote',
180
+ input: {},
181
+ from: 'TSenderAddress',
182
+ buildTx: tronBuildTx,
183
+ deps: makeDeps({ tron: adapter }),
184
+ route,
185
+ sellAsset: TRX,
186
+ feeAsset: TRX,
187
+ sellAmountCryptoBaseUnit: '1000000',
188
+ spenderAddress: '',
189
+ });
190
+ // Butter's value is the native amount to send: the sell amount for a native sell, 0 for a token
191
+ const transactionData = {
192
+ type: 'tron',
159
193
  to: 'TRouterAddress',
160
- method: 'swapAndCall',
161
- args: [{ type: 'address', value: 'TSpender' }],
194
+ data: evmBuildTx.data,
195
+ value: '100000000000000000',
162
196
  };
197
+ expect(actual.unwrap()).toEqual({ transactionData, networkFeeCryptoBaseUnit: '9000000' });
198
+ expect(adapter.getFeeData).toHaveBeenCalledWith({
199
+ to: 'TRouterAddress',
200
+ value: '100000000000000000',
201
+ chainSpecific: { from: 'TSenderAddress', data: evmBuildTx.data, requireEnergyShare: true },
202
+ });
203
+ });
204
+ it('uses the provider value for a token sell', async () => {
163
205
  const actual = await getButterSwapStepData({
164
206
  type: 'quote',
165
207
  input: {},
166
208
  from: 'TSenderAddress',
167
- buildTx,
168
- deps: {},
209
+ buildTx: { ...tronBuildTx, value: '0x00' },
210
+ deps: makeDeps({ tron: tronAdapter() }),
211
+ route,
212
+ sellAsset: USDT_TRON,
213
+ feeAsset: TRX,
214
+ sellAmountCryptoBaseUnit: '1000000',
215
+ spenderAddress: '',
216
+ });
217
+ expect(actual.unwrap().transactionData).toMatchObject({ value: '0' });
218
+ });
219
+ it('fails a native quote when the simulation fails', async () => {
220
+ const adapter = tronAdapter();
221
+ adapter.getFeeData.mockRejectedValue(new Error('REVERT opcode executed'));
222
+ const actual = await getButterSwapStepData({
223
+ type: 'quote',
224
+ input: {},
225
+ from: 'TSenderAddress',
226
+ buildTx: tronBuildTx,
227
+ deps: makeDeps({ tron: adapter }),
169
228
  route,
170
229
  sellAsset: TRX,
171
230
  feeAsset: TRX,
172
231
  sellAmountCryptoBaseUnit: '1000000',
173
232
  spenderAddress: '',
174
233
  });
175
- expect(actual.unwrap()).toEqual({
176
- networkFeeCryptoBaseUnit: PROVIDER_GAS_FEE_BASE_UNIT,
177
- butterSwapTransactionMetadata: {
178
- to: 'TRouterAddress',
179
- data: evmBuildTx.data,
180
- value: evmBuildTx.value,
181
- method: 'swapAndCall',
182
- args: [{ type: 'address', value: 'TSpender' }],
183
- memo: undefined,
184
- },
234
+ expect(actual.isErr()).toBe(true);
235
+ });
236
+ it('prices the measured worst case when a token allowance is not granted yet', async () => {
237
+ const adapter = tronAdapter({ allowance: '0' });
238
+ adapter.getFeeData.mockRejectedValue(new Error('REVERT opcode executed'));
239
+ const actual = await getButterSwapStepData({
240
+ type: 'quote',
241
+ input: {},
242
+ from: 'TSenderAddress',
243
+ buildTx: { ...tronBuildTx, value: '0x00' },
244
+ deps: makeDeps({ tron: adapter }),
245
+ route,
246
+ sellAsset: USDT_TRON,
247
+ feeAsset: TRX,
248
+ sellAmountCryptoBaseUnit: '1000000',
249
+ spenderAddress: '',
250
+ });
251
+ // 1000000 energy * 1.2 margin * 100 sun + (4 calldata + 279 envelope) bytes * 1000 sun
252
+ expect(actual.unwrap().networkFeeCryptoBaseUnit).toBe('120283000');
253
+ });
254
+ it('rates price the measured swap at the router share', async () => {
255
+ const adapter = tronAdapter();
256
+ adapter.httpProvider.getContractEnergyShare.mockResolvedValue({
257
+ callerPercent: 5,
258
+ originEnergyLimit: 10_000_000,
259
+ originEnergyAvailable: 5_000_000,
260
+ });
261
+ const actual = await getButterSwapStepData({
262
+ type: 'rate',
263
+ input: {},
264
+ deps: makeDeps({ tron: adapter }),
265
+ route: { ...route, contract: 'TRouterAddress' },
266
+ sellAsset: TRX,
267
+ feeAsset: TRX,
268
+ sellAmountCryptoBaseUnit: '1000000',
269
+ spenderAddress: '',
270
+ });
271
+ // 1000000 * 5% caller energy * 1.2 margin * 100 sun + 2400 bytes * 1000 sun
272
+ expect(actual.unwrap()).toEqual({ networkFeeCryptoBaseUnit: '8400000' });
273
+ expect(adapter.httpProvider.getContractEnergyShare).toHaveBeenCalledWith('TRouterAddress');
274
+ });
275
+ it('rates fall back to the provider fee when the worst case cannot be priced', async () => {
276
+ const adapter = tronAdapter();
277
+ adapter.httpProvider.getContractEnergyShare.mockRejectedValue(new Error('429'));
278
+ const actual = await getButterSwapStepData({
279
+ type: 'rate',
280
+ input: {},
281
+ deps: makeDeps({ tron: adapter }),
282
+ route: { ...route, contract: 'TRouterAddress' },
283
+ sellAsset: TRX,
284
+ feeAsset: TRX,
285
+ sellAmountCryptoBaseUnit: '1000000',
286
+ spenderAddress: '',
185
287
  });
288
+ expect(actual.unwrap()).toEqual({ networkFeeCryptoBaseUnit: PROVIDER_GAS_FEE_BASE_UNIT });
186
289
  });
187
290
  });
188
291
  it('errors on an unsupported chain namespace', async () => {
@@ -40,8 +40,7 @@ export const assertValidTrade = ({ sellAsset, }) => {
40
40
  }
41
41
  return Ok(undefined);
42
42
  };
43
- // Provider reported network fee - the rate fallback when estimation fails, and the fee for the
44
- // un-migrated tron quote path (exec computes the real fee at execution)
43
+ // Provider reported network fee - the fallback when estimation fails
45
44
  export const getProviderNetworkFeeCryptoBaseUnit = ({ route, feeAsset, }) => {
46
45
  if (bnOrZero(route.gasFee?.amount).lte(0))
47
46
  return '0';
@@ -1,4 +1,5 @@
1
1
  import { fromAssetId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
2
+ import { tron } from '@shapeshiftoss/chain-adapters';
2
3
  import { chainIdToFeeAssetId } from '@shapeshiftoss/utils';
3
4
  import { Err, Ok } from '@sniptt/monads';
4
5
  import { zeroAddress } from 'viem';
@@ -20,7 +21,6 @@ export var ButterSwapErrorCode;
20
21
  ButterSwapErrorCode[ButterSwapErrorCode["InvalidAddress"] = 2007] = "InvalidAddress";
21
22
  })(ButterSwapErrorCode || (ButterSwapErrorCode = {}));
22
23
  const SOLANA_NATIVE_ADDRESS = 'So11111111111111111111111111111111111111112';
23
- const TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
24
24
  export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoPrecision, slippage, affiliate, }) => {
25
25
  const butterFromChainId = chainIdToButterSwapChainId(sellAsset.chainId);
26
26
  const butterToChainId = chainIdToButterSwapChainId(buyAsset.chainId);
@@ -39,7 +39,7 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoPrec
39
39
  if (sellAsset.chainId === solanaChainId && sellAssetIsNative)
40
40
  return SOLANA_NATIVE_ADDRESS;
41
41
  if (sellAsset.chainId === tronChainId && sellAssetIsNative)
42
- return TRON_NATIVE_ADDRESS;
42
+ return tron.TRON_ZERO_ADDRESS;
43
43
  if (sellAssetIsNative)
44
44
  return zeroAddress;
45
45
  return sellAssetAddressRaw;
@@ -48,7 +48,7 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoPrec
48
48
  if (buyAsset.chainId === solanaChainId && buyAssetIsNative)
49
49
  return SOLANA_NATIVE_ADDRESS;
50
50
  if (buyAsset.chainId === tronChainId && buyAssetIsNative)
51
- return TRON_NATIVE_ADDRESS;
51
+ return tron.TRON_ZERO_ADDRESS;
52
52
  if (buyAssetIsNative)
53
53
  return zeroAddress;
54
54
  return buyAssetAddressRaw;
@@ -1,9 +1,8 @@
1
1
  import { TxStatus } from '@shapeshiftoss/unchained-client';
2
- import { contractAddressOrUndefined } from '@shapeshiftoss/utils';
3
- import { getExecutableTradeStep, getSwapMetadata, isExecutableTradeQuote } from '../../utils/index.js';
2
+ import { getSwapMetadata } from '../../utils/index.js';
4
3
  import { getEvmTransactionFees, getUnsignedEvmTransaction } from '../../utils/evm/index.js';
5
4
  import { getSolanaTransactionFees, getUnsignedSolanaTransaction } from '../../utils/solana/index.js';
6
- import { getTronTransactionFees } from '../../utils/tron/index.js';
5
+ import { getTronTransactionFees, getUnsignedTronTransaction } from '../../utils/tron/index.js';
7
6
  import { getUnsignedUtxoTransaction, getUtxoTransactionFees } from '../../utils/utxo/index.js';
8
7
  import { ChainflipStatusMessage } from './constants.js';
9
8
  import { getTradeQuote } from './swapperApi/getTradeQuote.js';
@@ -19,22 +18,7 @@ export const chainflipApi = {
19
18
  getUtxoTransactionFees,
20
19
  getUnsignedSolanaTransaction,
21
20
  getSolanaTransactionFees,
22
- getUnsignedTronTransaction: ({ stepIndex, tradeQuote, from, assertGetTronChainAdapter }) => {
23
- if (!isExecutableTradeQuote(tradeQuote))
24
- throw new Error('Unable to execute a trade rate quote');
25
- const step = getExecutableTradeStep(tradeQuote, stepIndex);
26
- const { accountNumber, chainflipSpecific, sellAsset } = step;
27
- if (!chainflipSpecific?.depositAddress)
28
- throw Error('Missing deposit address');
29
- const adapter = assertGetTronChainAdapter(sellAsset.chainId);
30
- return adapter.buildSendApiTransaction({
31
- to: chainflipSpecific.depositAddress,
32
- from,
33
- value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
34
- accountNumber,
35
- chainSpecific: { contractAddress: contractAddressOrUndefined(sellAsset.assetId) },
36
- });
37
- },
21
+ getUnsignedTronTransaction,
38
22
  getTronTransactionFees,
39
23
  checkTradeStatus: async ({ config, swap }) => {
40
24
  if (!swap)
@@ -14,7 +14,7 @@ type ChainflipRateStepData = {
14
14
  networkFeeCryptoBaseUnit: string | undefined;
15
15
  };
16
16
  type ChainflipQuoteStepData = {
17
- transactionData?: TxBuildData;
17
+ transactionData: TxBuildData;
18
18
  networkFeeCryptoBaseUnit: string | undefined;
19
19
  };
20
20
  export declare function getChainflipStepData(args: Extract<GetChainflipStepDataArgs, {
@@ -1,5 +1,5 @@
1
1
  import { CHAIN_NAMESPACE, fromAssetId, fromChainId } from '@shapeshiftoss/caip';
2
- import { evm } from '@shapeshiftoss/chain-adapters';
2
+ import { evm, tron } from '@shapeshiftoss/chain-adapters';
3
3
  import { bn, contractAddressOrUndefined } from '@shapeshiftoss/utils';
4
4
  import { Err, Ok } from '@sniptt/monads';
5
5
  import { TradeQuoteError } from '../../../types.js';
@@ -150,23 +150,42 @@ export async function getChainflipStepData(args) {
150
150
  return Err(makeNetworkFeeEstimationFailedErr('getChainflipStepData', error));
151
151
  }
152
152
  }
153
- // Un-migrated - exec builds its tx from chainflipSpecific.depositAddress, so no transactionData is carried
154
153
  case CHAIN_NAMESPACE.Tron: {
155
- const to = depositAddress ?? from;
156
- if (!to || !from) {
157
- const stepData = { networkFeeCryptoBaseUnit: undefined };
154
+ const adapter = deps.assertGetTronChainAdapter(sellAsset.chainId);
155
+ const contractAddress = contractAddressOrUndefined(sellAsset.assetId);
156
+ if (args.type === 'rate') {
157
+ // No deposit channel yet, but every channel is a fresh address, so a fresh recipient prices the transfer
158
+ const networkFeeCryptoBaseUnit = await (async () => {
159
+ if (!from)
160
+ return;
161
+ try {
162
+ const { fast } = await adapter.getFeeData({
163
+ to: tron.generateFreshTronAddress(),
164
+ value: sellAmountCryptoBaseUnit,
165
+ chainSpecific: { from, contractAddress },
166
+ });
167
+ return fast.txFee;
168
+ }
169
+ catch { }
170
+ })();
171
+ const stepData = { networkFeeCryptoBaseUnit };
158
172
  return Ok(stepData);
159
173
  }
174
+ const transactionData = {
175
+ type: 'tron',
176
+ to: args.depositAddress,
177
+ value: sellAmountCryptoBaseUnit,
178
+ };
160
179
  try {
161
- const { fast } = await deps.assertGetTronChainAdapter(sellAsset.chainId).getFeeData({
162
- to,
163
- value: sellAmountCryptoBaseUnit,
164
- chainSpecific: {
165
- from,
166
- contractAddress: contractAddressOrUndefined(sellAsset.assetId),
167
- },
180
+ const { fast } = await adapter.getFeeData({
181
+ to: transactionData.to,
182
+ value: transactionData.value,
183
+ chainSpecific: { from, contractAddress, requireEnergyShare: true },
168
184
  });
169
- const stepData = { networkFeeCryptoBaseUnit: fast.txFee };
185
+ const stepData = {
186
+ transactionData,
187
+ networkFeeCryptoBaseUnit: fast.txFee,
188
+ };
170
189
  return Ok(stepData);
171
190
  }
172
191
  catch (error) {
@@ -2,3 +2,4 @@ export declare const ONE_CLICK_BASE_URL = "https://1click.chaindefuser.com";
2
2
  export declare const DEFAULT_SLIPPAGE_BPS = 50;
3
3
  export declare const DEFAULT_QUOTE_DEADLINE_MS: number;
4
4
  export declare const UTXO_QUOTE_DEADLINE_MS: number;
5
+ export declare const APP_FEE_SPLIT_MULTIPLIER = 2;
@@ -3,3 +3,5 @@ export const DEFAULT_SLIPPAGE_BPS = 50;
3
3
  // 1Click refunds a deposit it cannot settle by the requested deadline, and prices a quote the same at any length
4
4
  export const DEFAULT_QUOTE_DEADLINE_MS = 60 * 60 * 1000;
5
5
  export const UTXO_QUOTE_DEADLINE_MS = 4 * 60 * 60 * 1000;
6
+ // 1Click pays half of the requested appFee to its own account, so request double to receive affiliateBps
7
+ export const APP_FEE_SPLIT_MULTIPLIER = 2;
@@ -142,12 +142,17 @@ export async function getNearIntentsStepData(args) {
142
142
  const { fast } = await deps.assertGetTronChainAdapter(sellAsset.chainId).getFeeData({
143
143
  to: depositAddress,
144
144
  value: sellAmountCryptoBaseUnit,
145
- chainSpecific: {
146
- from,
147
- contractAddress: contractAddressOrUndefined(sellAsset.assetId),
148
- },
145
+ chainSpecific: { from, contractAddress, requireEnergyShare: type === 'quote' },
149
146
  });
150
- const stepData = { networkFeeCryptoBaseUnit: fast.txFee };
147
+ const networkFeeCryptoBaseUnit = fast.txFee;
148
+ if (type === 'rate') {
149
+ const stepData = { networkFeeCryptoBaseUnit };
150
+ return Ok(stepData);
151
+ }
152
+ const stepData = {
153
+ transactionData: { type: 'tron', to: depositAddress, value: sellAmountCryptoBaseUnit },
154
+ networkFeeCryptoBaseUnit,
155
+ };
151
156
  return Ok(stepData);
152
157
  }
153
158
  case CHAIN_NAMESPACE.Sui: {
@@ -5,7 +5,7 @@ import { Err, Ok } from '@sniptt/monads';
5
5
  import { zeroAddress } from 'viem';
6
6
  import { TradeQuoteError } from '../../../types.js';
7
7
  import { createTradeAmountTooSmallErr, makeSwapErrorRight } from '../../../utils/index.js';
8
- import { DEFAULT_QUOTE_DEADLINE_MS, DEFAULT_SLIPPAGE_BPS, UTXO_QUOTE_DEADLINE_MS, } from '../constants.js';
8
+ import { APP_FEE_SPLIT_MULTIPLIER, DEFAULT_QUOTE_DEADLINE_MS, DEFAULT_SLIPPAGE_BPS, UTXO_QUOTE_DEADLINE_MS, } from '../constants.js';
9
9
  import { chainIdToNearIntentsChain, QuoteRequest } from '../types.js';
10
10
  import { ApiError, OneClickService } from './oneClickService.js';
11
11
  const getTokensWithRetry = async () => {
@@ -149,7 +149,7 @@ export const buildNearIntentsQuoteRequest = ({ originAsset, destinationAsset, am
149
149
  appFees: [
150
150
  {
151
151
  recipient: DAO_TREASURY_NEAR,
152
- fee: Number(affiliateBps),
152
+ fee: Number(affiliateBps) * APP_FEE_SPLIT_MULTIPLIER,
153
153
  },
154
154
  ],
155
155
  };
@@ -14,8 +14,8 @@ export declare const relayChainIdToChainId: import("lodash").Dictionary<string>;
14
14
  export declare const DEFAULT_RELAY_EVM_TOKEN_ADDRESS: "0x0000000000000000000000000000000000000000";
15
15
  export declare const RELAY_BTC_TOKEN_ADDRESS = "bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8";
16
16
  export declare const RELAY_SOLANA_TOKEN_ADDRESS = "11111111111111111111111111111111";
17
- export declare const RELAY_TRON_TOKEN_ADDRESS = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
18
17
  export declare const DEFAULT_RELAY_EVM_USER_ADDRESS = "0x000000000000000000000000000000000000dead";
18
+ export declare const RELAY_TRON_FALLBACK_DEPOSIT_ENERGY = "100000";
19
19
  export declare const DEFAULT_RELAY_BTC_USER_ADDRESS = "bc1q4vxn43l44h30nkluqfxd9eckf45vr2awz38lwa";
20
20
  export declare const DEFAULT_RELAY_SOLANA_USER_ADDRESS = "CbKGgVKLJFb8bBrf58DnAkdryX6ubewVytn7X957YwNr";
21
21
  export declare const DEFAULT_RELAY_TRON_USER_ADDRESS = "TLsV52sRDL79HXGGm9yzwKibb6BeruhUzy";
@@ -58,8 +58,9 @@ export const relayChainIdToChainId = invert(chainIdToRelayChainId);
58
58
  export const DEFAULT_RELAY_EVM_TOKEN_ADDRESS = zeroAddress;
59
59
  export const RELAY_BTC_TOKEN_ADDRESS = 'bc1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmql8k8';
60
60
  export const RELAY_SOLANA_TOKEN_ADDRESS = '11111111111111111111111111111111';
61
- export const RELAY_TRON_TOKEN_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
62
61
  export const DEFAULT_RELAY_EVM_USER_ADDRESS = '0x000000000000000000000000000000000000dead';
62
+ // depositor energy for a TRC20 deposit measured on mainnet, for token quotes without their allowance
63
+ export const RELAY_TRON_FALLBACK_DEPOSIT_ENERGY = '100000';
63
64
  export const DEFAULT_RELAY_BTC_USER_ADDRESS = 'bc1q4vxn43l44h30nkluqfxd9eckf45vr2awz38lwa';
64
65
  export const DEFAULT_RELAY_SOLANA_USER_ADDRESS = 'CbKGgVKLJFb8bBrf58DnAkdryX6ubewVytn7X957YwNr';
65
66
  export const DEFAULT_RELAY_TRON_USER_ADDRESS = 'TLsV52sRDL79HXGGm9yzwKibb6BeruhUzy';
@@ -21,12 +21,11 @@ const getQuote = async (input, deps, relayChainMap) => {
21
21
  type: 'quote',
22
22
  input,
23
23
  });
24
- return maybeStepData.map(({ transactionData, relayTransactionMetadata, networkFeeCryptoBaseUnit, }) => ({
24
+ return maybeStepData.map(({ transactionData, networkFeeCryptoBaseUnit }) => ({
25
25
  ...stepCommon,
26
26
  accountNumber,
27
27
  allowanceContract,
28
28
  transactionData,
29
- relayTransactionMetadata,
30
29
  swapperMetadata: {
31
30
  name: 'relay',
32
31
  relayId,
@@ -1,13 +1,14 @@
1
1
  import { btcAssetId, fromAssetId, isAssetReference, solAssetId, tronAssetId, } from '@shapeshiftoss/caip';
2
+ import { tron } from '@shapeshiftoss/chain-adapters';
2
3
  import { isNativeEvmAsset } from '../../../utils/helpers.js';
3
- import { DEFAULT_RELAY_EVM_TOKEN_ADDRESS, RELAY_BTC_TOKEN_ADDRESS, RELAY_SOLANA_TOKEN_ADDRESS, RELAY_TRON_TOKEN_ADDRESS, } from '../constant.js';
4
+ import { DEFAULT_RELAY_EVM_TOKEN_ADDRESS, RELAY_BTC_TOKEN_ADDRESS, RELAY_SOLANA_TOKEN_ADDRESS, } from '../constant.js';
4
5
  export const getRelayAssetAddress = (asset) => {
5
6
  if (asset.assetId === btcAssetId)
6
7
  return RELAY_BTC_TOKEN_ADDRESS;
7
8
  if (asset.assetId === solAssetId)
8
9
  return RELAY_SOLANA_TOKEN_ADDRESS;
9
10
  if (asset.assetId === tronAssetId)
10
- return RELAY_TRON_TOKEN_ADDRESS;
11
+ return tron.TRON_ZERO_ADDRESS;
11
12
  if (isNativeEvmAsset(asset.assetId))
12
13
  return DEFAULT_RELAY_EVM_TOKEN_ADDRESS;
13
14
  const { assetReference } = fromAssetId(asset.assetId);
@@ -1,7 +1,7 @@
1
1
  import type { Result } from '@sniptt/monads';
2
2
  import type { StepDataArgs, SwapErrorRight, TxBuildData } from '../../../types.js';
3
3
  import type { SolanaComputeBudgetOptions } from '../../../utils/solana/index.js';
4
- import type { RelayQuoteItem, RelayTransactionMetadata } from './types.js';
4
+ import type { RelayQuoteItem } from './types.js';
5
5
  export declare const RELAY_SOLANA_COMPUTE_BUDGET: SolanaComputeBudgetOptions;
6
6
  type BaseArgs = {
7
7
  data: RelayQuoteItem['data'];
@@ -15,8 +15,7 @@ type RelayRateStepData = {
15
15
  networkFeeCryptoBaseUnit: string;
16
16
  };
17
17
  type RelayQuoteStepData = {
18
- transactionData?: TxBuildData;
19
- relayTransactionMetadata?: RelayTransactionMetadata;
18
+ transactionData: TxBuildData;
20
19
  networkFeeCryptoBaseUnit: string;
21
20
  };
22
21
  export type GetRelayStepDataArgs = StepDataArgs<BaseArgs, {
@@ -1,10 +1,13 @@
1
1
  import { fromChainId } from '@shapeshiftoss/caip';
2
+ import { tron } from '@shapeshiftoss/chain-adapters';
2
3
  import { bnOrZero, contractAddressOrUndefined, isToken } from '@shapeshiftoss/utils';
3
4
  import { Err, Ok } from '@sniptt/monads';
4
5
  import { makeNetworkFeeEstimationFailedErr, makeTradeStepBuildFailedErr } from '../../../utils/index.js';
5
6
  import { getEvmNetworkFeeCryptoBaseUnit } from '../../../utils/evm/index.js';
6
7
  import { getSolanaNetworkFeeCryptoBaseUnit, omitComputeBudgetInstructions, withComputeUnitLimit, } from '../../../utils/solana/index.js';
8
+ import { getTronContractCallFallbackFeeCryptoBaseUnit, getTronContractCallNetworkFeeCryptoBaseUnit, } from '../../../utils/tron/index.js';
7
9
  import { getUtxoNetworkFeeCryptoBaseUnit } from '../../../utils/utxo/index.js';
10
+ import { RELAY_TRON_FALLBACK_DEPOSIT_ENERGY } from '../constant.js';
8
11
  import { getRelayPsbtRelayer } from './getRelayPsbtRelayer.js';
9
12
  import { convertRelaySolanaInstruction } from './helpers.js';
10
13
  import { isRelayQuoteEvmItemData, isRelayQuoteSolanaItemData, isRelayQuoteTronItemData, isRelayQuoteUtxoItemData, } from './types.js';
@@ -169,25 +172,55 @@ export async function getRelayStepData({ data, sellAsset, sellAmountCryptoBaseUn
169
172
  return Err(makeNetworkFeeEstimationFailedErr('getRelayStepData', error));
170
173
  }
171
174
  }
175
+ // Native and token sells alike are a call into relay's depositor contract
172
176
  if (isRelayQuoteTronItemData(data)) {
173
- const contractAddress = data.parameter?.contract_address;
174
- const tronCallData = data.parameter?.data;
175
- const isTronToken = isToken(sellAsset.assetId);
176
- if (isTronToken && !contractAddress)
177
- return Err(makeTradeStepBuildFailedErr('getRelayStepData'));
178
- if (isTronToken && !tronCallData)
179
- return Err(makeTradeStepBuildFailedErr('getRelayStepData'));
177
+ const { contract_address: contractAddress, data: callData, call_value: callValue, } = data.parameter ?? {};
180
178
  if (type === 'rate') {
179
+ // Relay's gas figure runs ~35% under the deposit's measured energy, so rates price the measured call
180
+ const networkFeeCryptoBaseUnit = await (async () => {
181
+ if (!contractAddress || !callData)
182
+ return fallbackNetworkFeeCryptoBaseUnit;
183
+ try {
184
+ return await getTronContractCallFallbackFeeCryptoBaseUnit({
185
+ adapter: deps.assertGetTronChainAdapter(sellAsset.chainId),
186
+ energy: RELAY_TRON_FALLBACK_DEPOSIT_ENERGY,
187
+ bandwidthBytes: tron.getTronContractCallBandwidthBytes(callData),
188
+ contractAddress,
189
+ });
190
+ }
191
+ catch {
192
+ return fallbackNetworkFeeCryptoBaseUnit;
193
+ }
194
+ })();
195
+ const stepData = { networkFeeCryptoBaseUnit };
196
+ return Ok(stepData);
197
+ }
198
+ if (!contractAddress || !callData)
199
+ return Err(makeTradeStepBuildFailedErr('getRelayStepData'));
200
+ const isNativeSell = !isToken(sellAsset.assetId);
201
+ const call = {
202
+ to: contractAddress,
203
+ data: callData,
204
+ value: String(callValue ?? (isNativeSell ? sellAmountCryptoBaseUnit : 0)),
205
+ };
206
+ try {
181
207
  const stepData = {
182
- networkFeeCryptoBaseUnit: fallbackNetworkFeeCryptoBaseUnit,
208
+ transactionData: { type: 'tron', ...call },
209
+ networkFeeCryptoBaseUnit: await getTronContractCallNetworkFeeCryptoBaseUnit({
210
+ adapter: deps.assertGetTronChainAdapter(sellAsset.chainId),
211
+ transactionData: call,
212
+ from,
213
+ sellAsset,
214
+ sellAmountCryptoBaseUnit,
215
+ spenderAddress: contractAddress,
216
+ fallbackEnergy: RELAY_TRON_FALLBACK_DEPOSIT_ENERGY,
217
+ }),
183
218
  };
184
219
  return Ok(stepData);
185
220
  }
186
- const stepData = {
187
- relayTransactionMetadata: { to: contractAddress, data: tronCallData },
188
- networkFeeCryptoBaseUnit: fallbackNetworkFeeCryptoBaseUnit,
189
- };
190
- return Ok(stepData);
221
+ catch (error) {
222
+ return Err(makeNetworkFeeEstimationFailedErr('getRelayStepData', error));
223
+ }
191
224
  }
192
225
  return Err(makeTradeStepBuildFailedErr('getRelayStepData'));
193
226
  }