@shapeshiftoss/swapper 17.6.9 → 17.6.10

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 (183) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/constants.js +61 -43
  3. package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
  4. package/dist/cjs/swappers/AcrossSwapper/AcrossSwapper.js +8 -0
  5. package/dist/cjs/swappers/AcrossSwapper/constant.d.ts +9 -0
  6. package/dist/cjs/swappers/AcrossSwapper/constant.js +48 -0
  7. package/dist/cjs/swappers/AcrossSwapper/endpoints.d.ts +2 -0
  8. package/dist/cjs/swappers/AcrossSwapper/endpoints.js +113 -0
  9. package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
  10. package/dist/cjs/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +31 -0
  11. package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
  12. package/dist/cjs/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +19 -0
  13. package/dist/cjs/swappers/AcrossSwapper/index.d.ts +1 -0
  14. package/dist/cjs/swappers/AcrossSwapper/index.js +5 -0
  15. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
  16. package/dist/cjs/swappers/AcrossSwapper/utils/acrossService.js +17 -0
  17. package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
  18. package/dist/cjs/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +27 -0
  19. package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
  20. package/dist/cjs/swappers/AcrossSwapper/utils/getTrade.js +335 -0
  21. package/dist/cjs/swappers/AcrossSwapper/utils/types.d.ts +177 -0
  22. package/dist/cjs/swappers/AcrossSwapper/utils/types.js +17 -0
  23. package/dist/cjs/swappers/AvnuSwapper/endpoints.js +42 -14
  24. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
  25. package/dist/cjs/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
  26. package/dist/cjs/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
  27. package/dist/cjs/swappers/ButterSwap/ButterSwap.js +1 -0
  28. package/dist/cjs/swappers/ButterSwap/endpoints.js +56 -0
  29. package/dist/cjs/swappers/ButterSwap/swapperApi/checkTradeStatus.js +19 -0
  30. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.js +27 -14
  31. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  32. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.js +23 -16
  33. package/dist/cjs/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
  34. package/dist/cjs/swappers/ButterSwap/types.d.ts +1 -0
  35. package/dist/cjs/swappers/ButterSwap/utils/helpers.js +1 -0
  36. package/dist/cjs/swappers/ButterSwap/xhr.d.ts +2 -2
  37. package/dist/cjs/swappers/ButterSwap/xhr.js +7 -2
  38. package/dist/cjs/swappers/CetusSwapper/endpoints.js +3 -8
  39. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
  40. package/dist/cjs/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
  41. package/dist/cjs/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +11 -5
  42. package/dist/cjs/swappers/ChainflipSwapper/utils/helpers.js +8 -2
  43. package/dist/cjs/swappers/CowSwapper/CowSwapper.js +1 -1
  44. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
  45. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
  46. package/dist/cjs/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
  47. package/dist/cjs/swappers/CowSwapper/utils/helpers/helpers.js +8 -2
  48. package/dist/cjs/swappers/NearIntentsSwapper/NearIntentsSwapper.js +1 -0
  49. package/dist/cjs/swappers/NearIntentsSwapper/endpoints.js +31 -0
  50. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
  51. package/dist/cjs/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
  52. package/dist/cjs/swappers/NearIntentsSwapper/types.d.ts +1 -1
  53. package/dist/cjs/swappers/NearIntentsSwapper/types.js +6 -0
  54. package/dist/cjs/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
  55. package/dist/cjs/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
  56. package/dist/cjs/swappers/RelaySwapper/constant.js +26 -1
  57. package/dist/cjs/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  58. package/dist/cjs/swappers/RelaySwapper/utils/getTrade.js +13 -2
  59. package/dist/cjs/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
  60. package/dist/cjs/swappers/RelaySwapper/utils/types.d.ts +15 -0
  61. package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
  62. package/dist/cjs/swappers/StonfiSwapper/StonfiSwapper.js +8 -0
  63. package/dist/cjs/swappers/StonfiSwapper/endpoints.d.ts +2 -0
  64. package/dist/cjs/swappers/StonfiSwapper/endpoints.js +227 -0
  65. package/dist/cjs/swappers/StonfiSwapper/index.d.ts +4 -0
  66. package/dist/cjs/swappers/StonfiSwapper/index.js +25 -0
  67. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
  68. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +119 -0
  69. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
  70. package/dist/cjs/swappers/StonfiSwapper/swapperApi/getTradeRate.js +105 -0
  71. package/dist/cjs/swappers/StonfiSwapper/types.d.ts +60 -0
  72. package/dist/cjs/swappers/StonfiSwapper/types.js +5 -0
  73. package/dist/cjs/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
  74. package/dist/cjs/swappers/StonfiSwapper/utils/constants.js +8 -0
  75. package/dist/cjs/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
  76. package/dist/cjs/swappers/StonfiSwapper/utils/helpers.js +135 -0
  77. package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
  78. package/dist/cjs/swappers/StonfiSwapper/utils/omnistonManager.js +20 -0
  79. package/dist/cjs/swappers/SunioSwapper/endpoints.js +1 -1
  80. package/dist/cjs/swappers/SunioSwapper/utils/getQuoteOrRate.js +4 -3
  81. package/dist/cjs/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
  82. package/dist/cjs/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
  83. package/dist/cjs/swappers/utils/helpers/helpers.js +3 -0
  84. package/dist/cjs/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
  85. package/dist/cjs/thorchain-utils/getL1RateOrQuote.js +30 -5
  86. package/dist/cjs/thorchain-utils/getQuote.js +8 -2
  87. package/dist/cjs/tron-utils/getUnsignedTronTransaction.js +22 -2
  88. package/dist/cjs/types.d.ts +79 -8
  89. package/dist/cjs/types.js +2 -0
  90. package/dist/cjs/utils.d.ts +4 -3
  91. package/dist/cjs/utils.js +35 -7
  92. package/dist/esm/.tsbuildinfo +1 -1
  93. package/dist/esm/constants.js +31 -13
  94. package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.d.ts +2 -0
  95. package/dist/esm/swappers/AcrossSwapper/AcrossSwapper.js +5 -0
  96. package/dist/esm/swappers/AcrossSwapper/constant.d.ts +9 -0
  97. package/dist/esm/swappers/AcrossSwapper/constant.js +42 -0
  98. package/dist/esm/swappers/AcrossSwapper/endpoints.d.ts +2 -0
  99. package/dist/esm/swappers/AcrossSwapper/endpoints.js +107 -0
  100. package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.d.ts +3 -0
  101. package/dist/esm/swappers/AcrossSwapper/getTradeQuote/getTradeQuote.js +27 -0
  102. package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.d.ts +3 -0
  103. package/dist/esm/swappers/AcrossSwapper/getTradeRate/getTradeRate.js +15 -0
  104. package/dist/esm/swappers/AcrossSwapper/index.d.ts +1 -0
  105. package/dist/esm/swappers/AcrossSwapper/index.js +1 -0
  106. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.d.ts +5 -0
  107. package/dist/esm/swappers/AcrossSwapper/utils/acrossService.js +11 -0
  108. package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.d.ts +19 -0
  109. package/dist/esm/swappers/AcrossSwapper/utils/fetchAcrossTrade.js +23 -0
  110. package/dist/esm/swappers/AcrossSwapper/utils/getTrade.d.ts +11 -0
  111. package/dist/esm/swappers/AcrossSwapper/utils/getTrade.js +328 -0
  112. package/dist/esm/swappers/AcrossSwapper/utils/types.d.ts +177 -0
  113. package/dist/esm/swappers/AcrossSwapper/utils/types.js +13 -0
  114. package/dist/esm/swappers/AvnuSwapper/endpoints.js +43 -15
  115. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeQuote.js +10 -5
  116. package/dist/esm/swappers/AvnuSwapper/swapperApi/getTradeRate.js +8 -4
  117. package/dist/esm/swappers/BebopSwapper/utils/helpers/helpers.d.ts +1 -1
  118. package/dist/esm/swappers/ButterSwap/ButterSwap.js +2 -1
  119. package/dist/esm/swappers/ButterSwap/endpoints.js +56 -0
  120. package/dist/esm/swappers/ButterSwap/swapperApi/checkTradeStatus.js +20 -1
  121. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.js +29 -16
  122. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeQuote.test.js +1 -0
  123. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.js +25 -18
  124. package/dist/esm/swappers/ButterSwap/swapperApi/getTradeRate.test.js +2 -0
  125. package/dist/esm/swappers/ButterSwap/types.d.ts +1 -0
  126. package/dist/esm/swappers/ButterSwap/utils/helpers.js +1 -0
  127. package/dist/esm/swappers/ButterSwap/xhr.d.ts +2 -2
  128. package/dist/esm/swappers/ButterSwap/xhr.js +8 -3
  129. package/dist/esm/swappers/CetusSwapper/endpoints.js +3 -8
  130. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeQuote.js +1 -1
  131. package/dist/esm/swappers/CetusSwapper/swapperApi/getTradeRate.js +1 -1
  132. package/dist/esm/swappers/ChainflipSwapper/utils/getQuoteOrRate.js +12 -6
  133. package/dist/esm/swappers/ChainflipSwapper/utils/helpers.js +9 -3
  134. package/dist/esm/swappers/CowSwapper/CowSwapper.js +1 -1
  135. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.js +1 -1
  136. package/dist/esm/swappers/CowSwapper/getCowSwapTradeQuote/getCowSwapTradeQuote.test.js +5 -5
  137. package/dist/esm/swappers/CowSwapper/getCowSwapTradeRate/getCowSwapTradeRate.js +1 -1
  138. package/dist/esm/swappers/CowSwapper/utils/helpers/helpers.js +9 -3
  139. package/dist/esm/swappers/NearIntentsSwapper/NearIntentsSwapper.js +2 -1
  140. package/dist/esm/swappers/NearIntentsSwapper/endpoints.js +31 -0
  141. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.js +36 -1
  142. package/dist/esm/swappers/NearIntentsSwapper/swapperApi/getTradeRate.js +61 -1
  143. package/dist/esm/swappers/NearIntentsSwapper/types.d.ts +1 -1
  144. package/dist/esm/swappers/NearIntentsSwapper/types.js +6 -0
  145. package/dist/esm/swappers/NearIntentsSwapper/utils/helpers/helpers.js +23 -4
  146. package/dist/esm/swappers/PortalsSwapper/getPortalsTradeRate/getPortalsTradeRate.js +8 -3
  147. package/dist/esm/swappers/RelaySwapper/constant.js +28 -3
  148. package/dist/esm/swappers/RelaySwapper/utils/getRelayDefaultUserAddress.d.ts +1 -1
  149. package/dist/esm/swappers/RelaySwapper/utils/getTrade.js +13 -2
  150. package/dist/esm/swappers/RelaySwapper/utils/relayTokenToAssetId.js +100 -0
  151. package/dist/esm/swappers/RelaySwapper/utils/types.d.ts +15 -0
  152. package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.d.ts +2 -0
  153. package/dist/esm/swappers/StonfiSwapper/StonfiSwapper.js +5 -0
  154. package/dist/esm/swappers/StonfiSwapper/endpoints.d.ts +2 -0
  155. package/dist/esm/swappers/StonfiSwapper/endpoints.js +224 -0
  156. package/dist/esm/swappers/StonfiSwapper/index.d.ts +4 -0
  157. package/dist/esm/swappers/StonfiSwapper/index.js +4 -0
  158. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.d.ts +2 -0
  159. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeQuote.js +115 -0
  160. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.d.ts +2 -0
  161. package/dist/esm/swappers/StonfiSwapper/swapperApi/getTradeRate.js +101 -0
  162. package/dist/esm/swappers/StonfiSwapper/types.d.ts +60 -0
  163. package/dist/esm/swappers/StonfiSwapper/types.js +2 -0
  164. package/dist/esm/swappers/StonfiSwapper/utils/constants.d.ts +5 -0
  165. package/dist/esm/swappers/StonfiSwapper/utils/constants.js +5 -0
  166. package/dist/esm/swappers/StonfiSwapper/utils/helpers.d.ts +11 -0
  167. package/dist/esm/swappers/StonfiSwapper/utils/helpers.js +124 -0
  168. package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.d.ts +5 -0
  169. package/dist/esm/swappers/StonfiSwapper/utils/omnistonManager.js +17 -0
  170. package/dist/esm/swappers/SunioSwapper/endpoints.js +1 -1
  171. package/dist/esm/swappers/SunioSwapper/utils/getQuoteOrRate.js +5 -4
  172. package/dist/esm/swappers/ZrxSwapper/utils/helpers/helpers.d.ts +1 -1
  173. package/dist/esm/swappers/utils/filterBuyAssetsBySellAssetId/filterBuyAssetsBySellAssetId.js +2 -5
  174. package/dist/esm/swappers/utils/helpers/helpers.js +4 -1
  175. package/dist/esm/thorchain-utils/getCallDataFromQuote.d.ts +1 -1
  176. package/dist/esm/thorchain-utils/getL1RateOrQuote.js +31 -6
  177. package/dist/esm/thorchain-utils/getQuote.js +9 -3
  178. package/dist/esm/tron-utils/getUnsignedTronTransaction.js +22 -2
  179. package/dist/esm/types.d.ts +79 -8
  180. package/dist/esm/types.js +2 -0
  181. package/dist/esm/utils.d.ts +4 -3
  182. package/dist/esm/utils.js +34 -7
  183. package/package.json +17 -15
@@ -1,11 +1,12 @@
1
1
  import { getQuotes } from '@avnu/avnu-sdk';
2
2
  import { bn } from '@shapeshiftoss/utils';
3
3
  import { Err, Ok } from '@sniptt/monads';
4
- import { getTreasuryAddressFromChainId } from '../../utils/helpers/helpers.js';
4
+ import { validateAndParseAddress } from 'starknet';
5
5
  import { v4 as uuid } from 'uuid';
6
6
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
7
7
  import { SwapperName, TradeQuoteError } from '../../../types.js';
8
8
  import { getInputOutputRate, makeSwapErrorRight } from '../../../utils.js';
9
+ import { getTreasuryAddressFromChainId } from '../../utils/helpers/helpers.js';
9
10
  import { AVNU_SUPPORTED_CHAIN_IDS } from '../utils/constants.js';
10
11
  import { getTokenAddress } from '../utils/helpers.js';
11
12
  export const getTradeRate = async (input, deps) => {
@@ -25,6 +26,9 @@ export const getTradeRate = async (input, deps) => {
25
26
  try {
26
27
  const sellTokenAddress = getTokenAddress(sellAsset);
27
28
  const buyTokenAddress = getTokenAddress(buyAsset);
29
+ // Normalize receive address if provided (for fee estimation)
30
+ // Rate quotes may not have a receive address, so this is optional
31
+ const normalizedReceiveAddress = receiveAddress ? validateAndParseAddress(receiveAddress) : '';
28
32
  const quotes = await getQuotes({
29
33
  sellTokenAddress,
30
34
  buyTokenAddress,
@@ -50,10 +54,10 @@ export const getTradeRate = async (input, deps) => {
50
54
  const sellAdapter = deps.assertGetStarknetChainAdapter(sellAsset.chainId);
51
55
  // For rate quotes, use receiveAddress as a dummy from/to for fee estimation
52
56
  const feeData = await sellAdapter.getFeeData({
53
- to: receiveAddress ?? '',
57
+ to: normalizedReceiveAddress,
54
58
  value: sellAmount,
55
59
  chainSpecific: {
56
- from: receiveAddress ?? '',
60
+ from: normalizedReceiveAddress,
57
61
  tokenContractAddress: sellTokenAddress,
58
62
  },
59
63
  sendMax: false,
@@ -78,7 +82,7 @@ export const getTradeRate = async (input, deps) => {
78
82
  : {};
79
83
  const tradeRate = {
80
84
  id: uuid(),
81
- receiveAddress,
85
+ receiveAddress: normalizedReceiveAddress || receiveAddress,
82
86
  affiliateBps,
83
87
  rate,
84
88
  slippageTolerancePercentageDecimal: slippageTolerancePercentageDecimal ??
@@ -5,7 +5,7 @@ export declare const isSupportedChainId: (chainId: ChainId) => chainId is import
5
5
  export declare const assertValidTrade: ({ buyAsset, sellAsset, }: {
6
6
  buyAsset: Asset;
7
7
  sellAsset: Asset;
8
- }) => import("@sniptt/monads/build/result/result").ResOk<boolean, never> | import("@sniptt/monads/build/result/result").ResErr<unknown, import("../../../../types.js").SwapErrorRight>;
8
+ }) => import("@sniptt/monads/build/result/result").ResErr<unknown, import("../../../../types.js").SwapErrorRight> | import("@sniptt/monads/build/result/result").ResOk<boolean, never>;
9
9
  export declare const calculateRate: ({ buyAmount, sellAmount, buyAsset, sellAsset, }: {
10
10
  buyAmount: string;
11
11
  sellAmount: string;
@@ -1,7 +1,8 @@
1
- import { executeEvmTransaction, executeSolanaTransaction } from '../../utils.js';
1
+ import { executeEvmTransaction, executeSolanaTransaction, executeTronTransaction, } from '../../utils.js';
2
2
  export const butterSwap = {
3
3
  executeEvmTransaction,
4
4
  executeSolanaTransaction,
5
+ executeTronTransaction,
5
6
  executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
6
7
  return signAndBroadcastTransaction(txToSign);
7
8
  },
@@ -2,6 +2,8 @@ import { evm } from '@shapeshiftoss/chain-adapters';
2
2
  import BigNumber from 'bignumber.js';
3
3
  import { getSolanaTransactionFees } from '../../solana-utils/getSolanaTransactionFees.js';
4
4
  import { getUnsignedSolanaTransaction } from '../../solana-utils/getUnsignedSolanaTransaction.js';
5
+ import { getTronTransactionFees } from '../../tron-utils/getTronTransactionFees.js';
6
+ import { getUnsignedTronTransaction } from '../../tron-utils/getUnsignedTronTransaction.js';
5
7
  import { getExecutableTradeStep, isExecutableTradeQuote } from '../../utils.js';
6
8
  import { checkTradeStatus } from './swapperApi/checkTradeStatus.js';
7
9
  import { getTradeQuote } from './swapperApi/getTradeQuote.js';
@@ -64,6 +66,60 @@ export const butterSwapApi = {
64
66
  gasLimit: BigNumber.max(feeData.gasLimit, gasLimit).toFixed(),
65
67
  });
66
68
  },
69
+ getUnsignedUtxoTransaction: async ({ stepIndex, tradeQuote, xpub, accountType, assertGetUtxoChainAdapter, }) => {
70
+ if (!isExecutableTradeQuote(tradeQuote))
71
+ throw new Error('Unable to execute a trade rate quote');
72
+ const step = getExecutableTradeStep(tradeQuote, stepIndex);
73
+ const { accountNumber, sellAsset, butterSwapTransactionMetadata } = step;
74
+ if (!butterSwapTransactionMetadata)
75
+ throw new Error('Transaction metadata is required');
76
+ const { to, memo } = butterSwapTransactionMetadata;
77
+ if (!to)
78
+ throw new Error('Missing deposit address');
79
+ if (!memo)
80
+ throw new Error('Missing memo (opReturnData)');
81
+ const adapter = assertGetUtxoChainAdapter(sellAsset.chainId);
82
+ const { fast } = await adapter.getFeeData({
83
+ to,
84
+ value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
85
+ chainSpecific: { pubkey: xpub, opReturnData: memo },
86
+ sendMax: false,
87
+ });
88
+ return adapter.buildSendApiTransaction({
89
+ value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
90
+ xpub,
91
+ to,
92
+ accountNumber,
93
+ chainSpecific: {
94
+ accountType,
95
+ opReturnData: memo,
96
+ satoshiPerByte: fast.chainSpecific.satoshiPerByte,
97
+ },
98
+ });
99
+ },
100
+ getUtxoTransactionFees: async ({ stepIndex, tradeQuote, xpub, assertGetUtxoChainAdapter }) => {
101
+ if (!isExecutableTradeQuote(tradeQuote))
102
+ throw new Error('Unable to execute a trade rate quote');
103
+ const step = getExecutableTradeStep(tradeQuote, stepIndex);
104
+ const { sellAsset, butterSwapTransactionMetadata } = step;
105
+ if (!butterSwapTransactionMetadata)
106
+ throw new Error('Transaction metadata is required');
107
+ const { to, memo } = butterSwapTransactionMetadata;
108
+ if (!to)
109
+ throw new Error('Missing deposit address');
110
+ if (!memo)
111
+ throw new Error('Missing memo (opReturnData)');
112
+ const adapter = assertGetUtxoChainAdapter(sellAsset.chainId);
113
+ const { fast } = await adapter.getFeeData({
114
+ to,
115
+ value: step.sellAmountIncludingProtocolFeesCryptoBaseUnit,
116
+ chainSpecific: { pubkey: xpub, opReturnData: memo },
117
+ sendMax: false,
118
+ });
119
+ return fast.txFee;
120
+ },
67
121
  getUnsignedSolanaTransaction,
68
122
  getSolanaTransactionFees,
123
+ getTronTransactionFees,
124
+ getUnsignedTronTransaction,
69
125
  };
@@ -1,4 +1,4 @@
1
- import { solanaChainId } from '@shapeshiftoss/caip';
1
+ import { solanaChainId, tronChainId } from '@shapeshiftoss/caip';
2
2
  import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
3
3
  import { TxStatus } from '@shapeshiftoss/unchained-client';
4
4
  import { checkEvmSwapStatus, checkSolanaSwapStatus, createDefaultStatusResponse, } from '../../../utils.js';
@@ -33,6 +33,25 @@ export const checkTradeStatus = async (input) => {
33
33
  fetchIsSmartContractAddressQuery,
34
34
  });
35
35
  }
36
+ if (sellChainId === tronChainId) {
37
+ const adapter = input.assertGetTronChainAdapter(tronChainId);
38
+ const tx = await adapter.httpProvider.getTransaction({ txid: txHash });
39
+ if (!tx) {
40
+ return createDefaultStatusResponse(txHash);
41
+ }
42
+ const contractRet = tx.ret?.[0]?.contractRet;
43
+ // Only mark as confirmed if SUCCESS AND has confirmations (in a block)
44
+ const status = contractRet === 'SUCCESS' && tx.confirmations > 0
45
+ ? TxStatus.Confirmed
46
+ : contractRet === 'REVERT'
47
+ ? TxStatus.Failed
48
+ : TxStatus.Pending;
49
+ return {
50
+ status,
51
+ buyTxHash: txHash,
52
+ message: undefined,
53
+ };
54
+ }
36
55
  // Fallback: unknown same-chain type (should never happen for Butter, but just in case). Avoid bridge polling.
37
56
  return createDefaultStatusResponse(txHash);
38
57
  }
@@ -1,6 +1,6 @@
1
- import { btcAssetId, btcChainId, solanaChainId } from '@shapeshiftoss/caip';
1
+ import { btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
2
2
  import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
3
- import { bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, fromBaseUnit, toBaseUnit, } from '@shapeshiftoss/utils';
3
+ import { BigAmount, bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, } from '@shapeshiftoss/utils';
4
4
  import { Err, Ok } from '@sniptt/monads';
5
5
  import { AddressLookupTableAccount, PublicKey, TransactionMessage, VersionedTransaction, } from '@solana/web3.js';
6
6
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
@@ -12,19 +12,14 @@ export const getTradeQuote = async (input, _deps) => {
12
12
  const { sellAsset, buyAsset, sellAmountIncludingProtocolFeesCryptoBaseUnit, receiveAddress, sendAddress, slippageTolerancePercentageDecimal, accountNumber, affiliateBps, } = input;
13
13
  if (!isEvmChainId(sellAsset.chainId) &&
14
14
  sellAsset.chainId !== btcChainId &&
15
- sellAsset.chainId !== solanaChainId) {
15
+ sellAsset.chainId !== solanaChainId &&
16
+ sellAsset.chainId !== tronChainId) {
16
17
  return Err(makeSwapErrorRight({
17
18
  message: `Unsupported chain`,
18
19
  code: TradeQuoteError.UnsupportedChain,
19
20
  }));
20
21
  }
21
- // Yes, this is supposed to be supported as per checks above, but currently, Butter doesn't yield any quotes for BTC sells
22
- if (sellAsset.assetId === btcAssetId) {
23
- return Err(makeSwapErrorRight({
24
- message: `BTC sells are currently unsupported`,
25
- code: TradeQuoteError.UnsupportedChain,
26
- }));
27
- }
22
+ // TODO: Debug why same-chain Tron swaps revert (swapAndCall method works on EVM but 0 successful on Tron)
28
23
  if (!sendAddress) {
29
24
  return Err(makeSwapErrorRight({
30
25
  message: '[getTradeQuote] sendAddress is required for ButterSwap',
@@ -38,7 +33,10 @@ export const getTradeQuote = async (input, _deps) => {
38
33
  const routeResult = await getButterRoute({
39
34
  sellAsset,
40
35
  buyAsset,
41
- sellAmountCryptoBaseUnit: fromBaseUnit(sellAmountIncludingProtocolFeesCryptoBaseUnit, sellAsset.precision),
36
+ sellAmountCryptoPrecision: BigAmount.fromBaseUnit({
37
+ value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
38
+ precision: sellAsset.precision,
39
+ }).toPrecision(),
42
40
  slippage,
43
41
  affiliate: makeButterSwapAffiliate(affiliateBps),
44
42
  });
@@ -47,7 +45,10 @@ export const getTradeQuote = async (input, _deps) => {
47
45
  const routeResponse = routeResult.unwrap();
48
46
  if (!isRouteSuccess(routeResponse)) {
49
47
  if (routeResponse.errno === ButterSwapErrorCode.InsufficientAmount) {
50
- const minAmountCryptoBaseUnit = toBaseUnit(routeResponse.minAmount, sellAsset.precision);
48
+ const minAmountCryptoBaseUnit = BigAmount.fromPrecision({
49
+ value: routeResponse.minAmount,
50
+ precision: sellAsset.precision,
51
+ }).toBaseUnit();
51
52
  return Err(createTradeAmountTooSmallErr({
52
53
  minAmountCryptoBaseUnit,
53
54
  assetId: sellAsset.assetId,
@@ -97,13 +98,19 @@ export const getTradeQuote = async (input, _deps) => {
97
98
  }));
98
99
  }
99
100
  // Map gasFee.amount to networkFeeCryptoBaseUnit using fee asset precision
100
- const networkFeeCryptoBaseUnit = toBaseUnit(bnOrZero(route.gasFee?.amount), feeAsset.precision);
101
+ const networkFeeCryptoBaseUnit = BigAmount.fromPrecision({
102
+ value: bnOrZero(route.gasFee?.amount),
103
+ precision: feeAsset.precision,
104
+ }).toBaseUnit();
101
105
  // Use destination receive amount as a priority if present and defined
102
106
  // It won't for same-chain swaps, so we fall back to the source chain receive amount (i.e source chain *is* the destination chain)
103
107
  const outputAmount = route.dstChain?.totalAmountOut ?? route.srcChain.totalAmountOut;
104
108
  // TODO: affiliate fees not yet here, gut feel is that Butter won't do the swap output - fees logic for us here
105
109
  // Sanity check me when affiliates are implemented, and do the math ourselves if needed
106
- const buyAmountAfterFeesCryptoBaseUnit = toBaseUnit(outputAmount, buyAsset.precision);
110
+ const buyAmountAfterFeesCryptoBaseUnit = BigAmount.fromPrecision({
111
+ value: outputAmount,
112
+ precision: buyAsset.precision,
113
+ }).toBaseUnit();
107
114
  const rate = getInputOutputRate({
108
115
  sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
109
116
  buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
@@ -148,7 +155,10 @@ export const getTradeQuote = async (input, _deps) => {
148
155
  }
149
156
  const solanaTransactionMetadata = maybeSolanaTransactionMetadata?.unwrap();
150
157
  const step = {
151
- buyAmountBeforeFeesCryptoBaseUnit: toBaseUnit(outputAmount, buyAsset.precision),
158
+ buyAmountBeforeFeesCryptoBaseUnit: BigAmount.fromPrecision({
159
+ value: outputAmount,
160
+ precision: buyAsset.precision,
161
+ }).toBaseUnit(),
152
162
  buyAmountAfterFeesCryptoBaseUnit,
153
163
  sellAmountIncludingProtocolFeesCryptoBaseUnit,
154
164
  feeData: {
@@ -160,13 +170,16 @@ export const getTradeQuote = async (input, _deps) => {
160
170
  buyAsset,
161
171
  sellAsset,
162
172
  accountNumber,
163
- allowanceContract: route.contract ?? '0x0',
173
+ allowanceContract: sellAsset.chainId === tronChainId ? buildTx.to : route.contract ?? '0x0',
164
174
  estimatedExecutionTimeMs: route.timeEstimated * 1000,
165
175
  butterSwapTransactionMetadata: {
166
176
  to: buildTx.to,
167
177
  data: buildTx.data,
168
178
  value: buildTx.value,
169
179
  gasLimit: bnOrZero(route.gasEstimatedTarget).toFixed(),
180
+ method: buildTx.method,
181
+ args: buildTx.args,
182
+ memo: buildTx.memo,
170
183
  },
171
184
  ...(solanaTransactionMetadata && {
172
185
  solanaTransactionMetadata,
@@ -34,6 +34,7 @@ describe('getTradeQuote', () => {
34
34
  assertGetSuiChainAdapter: () => vi.fn(),
35
35
  assertGetNearChainAdapter: () => vi.fn(),
36
36
  assertGetStarknetChainAdapter: () => vi.fn(),
37
+ assertGetTonChainAdapter: () => vi.fn(),
37
38
  config: {
38
39
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
39
40
  },
@@ -1,6 +1,6 @@
1
- import { btcAssetId, btcChainId, solanaChainId } from '@shapeshiftoss/caip';
1
+ import { btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
2
2
  import { isEvmChainId } from '@shapeshiftoss/chain-adapters';
3
- import { bn, bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, toBaseUnit, } from '@shapeshiftoss/utils';
3
+ import { BigAmount, bnOrZero, chainIdToFeeAssetId, convertDecimalPercentageToBasisPoints, } from '@shapeshiftoss/utils';
4
4
  import { Err, Ok } from '@sniptt/monads';
5
5
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
6
6
  import { SwapperName, TradeQuoteError } from '../../../types.js';
@@ -11,29 +11,24 @@ export const getTradeRate = async (input, _deps) => {
11
11
  const { sellAsset, buyAsset, affiliateBps, accountNumber, receiveAddress, sellAmountIncludingProtocolFeesCryptoBaseUnit, } = input;
12
12
  if (!isEvmChainId(sellAsset.chainId) &&
13
13
  sellAsset.chainId !== btcChainId &&
14
- sellAsset.chainId !== solanaChainId) {
14
+ sellAsset.chainId !== solanaChainId &&
15
+ sellAsset.chainId !== tronChainId) {
15
16
  return Err(makeSwapErrorRight({
16
17
  message: `Unsupported chain`,
17
18
  code: TradeQuoteError.UnsupportedChain,
18
19
  }));
19
20
  }
20
- // Yes, this is supposed to be supported as per checks above, but currently, Butter doesn't yield any quotes for BTC sells
21
- if (sellAsset.assetId === btcAssetId) {
22
- return Err(makeSwapErrorRight({
23
- message: `BTC sells are currently unsupported`,
24
- code: TradeQuoteError.UnsupportedChain,
25
- }));
26
- }
27
- const amount = bn(sellAmountIncludingProtocolFeesCryptoBaseUnit)
28
- .shiftedBy(-sellAsset.precision)
29
- .toString();
21
+ const amount = BigAmount.fromBaseUnit({
22
+ value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
23
+ precision: sellAsset.precision,
24
+ }).toPrecision();
30
25
  const feeAssetId = chainIdToFeeAssetId(sellAsset.chainId);
31
26
  const slippageTolerancePercentageDecimal = getDefaultSlippageDecimalPercentageForSwapper(SwapperName.ButterSwap);
32
27
  const slippage = convertDecimalPercentageToBasisPoints(slippageTolerancePercentageDecimal).toString();
33
28
  const result = await getButterRoute({
34
29
  sellAsset,
35
30
  buyAsset,
36
- sellAmountCryptoBaseUnit: amount,
31
+ sellAmountCryptoPrecision: amount,
37
32
  slippage,
38
33
  affiliate: makeButterSwapAffiliate(affiliateBps),
39
34
  });
@@ -43,7 +38,10 @@ export const getTradeRate = async (input, _deps) => {
43
38
  const routeResponse = result.unwrap();
44
39
  if (!isRouteSuccess(routeResponse)) {
45
40
  if (routeResponse.errno === ButterSwapErrorCode.InsufficientAmount) {
46
- const minAmountCryptoBaseUnit = toBaseUnit(routeResponse.minAmount, sellAsset.precision);
41
+ const minAmountCryptoBaseUnit = BigAmount.fromPrecision({
42
+ value: routeResponse.minAmount,
43
+ precision: sellAsset.precision,
44
+ }).toBaseUnit();
47
45
  return Err(createTradeAmountTooSmallErr({
48
46
  minAmountCryptoBaseUnit,
49
47
  assetId: sellAsset.assetId,
@@ -66,7 +64,10 @@ export const getTradeRate = async (input, _deps) => {
66
64
  const outputAmount = route.dstChain?.totalAmountOut ?? route.srcChain.totalAmountOut;
67
65
  // TODO: affiliate fees not yet here, gut feel is that Butter won't do the swap output - fees logic for us here
68
66
  // Sanity check me when affiliates are implemented, and do the math ourselves if needed
69
- const buyAmountAfterFeesCryptoBaseUnit = toBaseUnit(outputAmount, buyAsset.precision);
67
+ const buyAmountAfterFeesCryptoBaseUnit = BigAmount.fromPrecision({
68
+ value: outputAmount,
69
+ precision: buyAsset.precision,
70
+ }).toBaseUnit();
70
71
  const rate = getInputOutputRate({
71
72
  sellAmountCryptoBaseUnit: sellAmountIncludingProtocolFeesCryptoBaseUnit,
72
73
  buyAmountCryptoBaseUnit: buyAmountAfterFeesCryptoBaseUnit,
@@ -82,12 +83,18 @@ export const getTradeRate = async (input, _deps) => {
82
83
  }
83
84
  // Map gasFee.amount to networkFeeCryptoBaseUnit using fee asset precision
84
85
  const networkFeeCryptoBaseUnit = bnOrZero(route.gasFee?.amount).gt(0)
85
- ? toBaseUnit(route.gasFee.amount, feeAsset.precision)
86
+ ? BigAmount.fromPrecision({
87
+ value: route.gasFee.amount,
88
+ precision: feeAsset.precision,
89
+ }).toBaseUnit()
86
90
  : '0';
87
91
  // Always a single step
88
92
  const step = {
89
93
  rate,
90
- buyAmountBeforeFeesCryptoBaseUnit: toBaseUnit(outputAmount, buyAsset.precision),
94
+ buyAmountBeforeFeesCryptoBaseUnit: BigAmount.fromPrecision({
95
+ value: outputAmount,
96
+ precision: buyAsset.precision,
97
+ }).toBaseUnit(),
91
98
  buyAmountAfterFeesCryptoBaseUnit,
92
99
  sellAmountIncludingProtocolFeesCryptoBaseUnit,
93
100
  feeData: {
@@ -25,6 +25,7 @@ describe('getTradeRate', () => {
25
25
  assertGetSuiChainAdapter: () => vi.fn(),
26
26
  assertGetNearChainAdapter: () => vi.fn(),
27
27
  assertGetStarknetChainAdapter: () => vi.fn(),
28
+ assertGetTonChainAdapter: () => vi.fn(),
28
29
  config: {
29
30
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
30
31
  },
@@ -61,6 +62,7 @@ describe('getTradeRate', () => {
61
62
  assertGetSuiChainAdapter: () => vi.fn(),
62
63
  assertGetNearChainAdapter: () => vi.fn(),
63
64
  assertGetStarknetChainAdapter: () => vi.fn(),
65
+ assertGetTonChainAdapter: () => vi.fn(),
64
66
  config: {
65
67
  VITE_BUTTERSWAP_CLIENT_ID: 'test',
66
68
  },
@@ -93,6 +93,7 @@ export type BuildTxSuccessItem = {
93
93
  type: string;
94
94
  value: unknown;
95
95
  }[];
96
+ memo?: string;
96
97
  };
97
98
  export type BuildTxResponse = {
98
99
  errno: 0;
@@ -10,6 +10,7 @@ const BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID = {
10
10
  43114: KnownChainIds.AvalancheMainnet,
11
11
  1360108768460801: KnownChainIds.SolanaMainnet,
12
12
  1360095883558913: KnownChainIds.BitcoinMainnet,
13
+ 728126428: KnownChainIds.TronMainnet,
13
14
  };
14
15
  const CHAIN_ID_TO_BUTTERSWAP_CHAIN_ID = Object.entries(BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID).reduce((acc, [butterSwapChainId, chainId]) => {
15
16
  acc[chainId] = Number(butterSwapChainId);
@@ -20,11 +20,11 @@ type ButterSwapPromise<T> = Promise<Result<T, SwapErrorRight>>;
20
20
  export type GetButterRouteArgs = {
21
21
  sellAsset: Asset;
22
22
  buyAsset: Asset;
23
- sellAmountCryptoBaseUnit: string;
23
+ sellAmountCryptoPrecision: string;
24
24
  slippage: string;
25
25
  affiliate?: string;
26
26
  };
27
- export declare const getButterRoute: ({ sellAsset, buyAsset, sellAmountCryptoBaseUnit, slippage, affiliate, }: GetButterRouteArgs) => ButterSwapPromise<RouteResponse>;
27
+ export declare const getButterRoute: ({ sellAsset, buyAsset, sellAmountCryptoPrecision, slippage, affiliate, }: GetButterRouteArgs) => ButterSwapPromise<RouteResponse>;
28
28
  export type ButterBuildTxArgs = {
29
29
  hash: string;
30
30
  slippage: string;
@@ -1,4 +1,4 @@
1
- import { fromAssetId, solanaChainId } from '@shapeshiftoss/caip';
1
+ import { fromAssetId, solanaChainId, tronChainId } from '@shapeshiftoss/caip';
2
2
  import { chainIdToFeeAssetId } from '@shapeshiftoss/utils';
3
3
  import { Err, Ok } from '@sniptt/monads';
4
4
  import { zeroAddress } from 'viem';
@@ -20,7 +20,8 @@ export var ButterSwapErrorCode;
20
20
  ButterSwapErrorCode[ButterSwapErrorCode["InvalidAddress"] = 2007] = "InvalidAddress";
21
21
  })(ButterSwapErrorCode || (ButterSwapErrorCode = {}));
22
22
  const SOLANA_NATIVE_ADDRESS = 'So11111111111111111111111111111111111111112';
23
- export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBaseUnit, slippage, affiliate, }) => {
23
+ const TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
24
+ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoPrecision, slippage, affiliate, }) => {
24
25
  const butterFromChainId = chainIdToButterSwapChainId(sellAsset.chainId);
25
26
  const butterToChainId = chainIdToButterSwapChainId(buyAsset.chainId);
26
27
  if (!butterFromChainId || !butterToChainId) {
@@ -37,6 +38,8 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
37
38
  const sellAssetAddress = (() => {
38
39
  if (sellAsset.chainId === solanaChainId && sellAssetIsNative)
39
40
  return SOLANA_NATIVE_ADDRESS;
41
+ if (sellAsset.chainId === tronChainId && sellAssetIsNative)
42
+ return TRON_NATIVE_ADDRESS;
40
43
  if (sellAssetIsNative)
41
44
  return zeroAddress;
42
45
  return sellAssetAddressRaw;
@@ -44,6 +47,8 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
44
47
  const buyAssetAddress = (() => {
45
48
  if (buyAsset.chainId === solanaChainId && buyAssetIsNative)
46
49
  return SOLANA_NATIVE_ADDRESS;
50
+ if (buyAsset.chainId === tronChainId && buyAssetIsNative)
51
+ return TRON_NATIVE_ADDRESS;
47
52
  if (buyAssetIsNative)
48
53
  return zeroAddress;
49
54
  return buyAssetAddressRaw;
@@ -54,7 +59,7 @@ export const getButterRoute = async ({ sellAsset, buyAsset, sellAmountCryptoBase
54
59
  tokenInAddress: sellAssetAddress,
55
60
  toChainId: butterToChainId,
56
61
  tokenOutAddress: buyAssetAddress,
57
- amount: sellAmountCryptoBaseUnit,
62
+ amount: sellAmountCryptoPrecision,
58
63
  type: 'exactIn',
59
64
  slippage,
60
65
  entrance: 'shapeshift',
@@ -1,5 +1,6 @@
1
1
  import { getProvidersExcluding } from '@cetusprotocol/aggregator-sdk';
2
- import { Transaction } from '@cetusprotocol/aggregator-sdk/node_modules/@mysten/sui/transactions';
2
+ import { Transaction } from '@mysten/sui/transactions';
3
+ import { toAddressNList } from '@shapeshiftoss/chain-adapters';
3
4
  import { TxStatus } from '@shapeshiftoss/unchained-client';
4
5
  import { bnOrZero } from '@shapeshiftoss/utils';
5
6
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../constants.js';
@@ -51,13 +52,7 @@ export const cetusApi = {
51
52
  intentMessage[2] = 0;
52
53
  intentMessage.set(transactionBytes, 3);
53
54
  const bip44Params = adapter.getBip44Params({ accountNumber });
54
- const addressNList = [
55
- bip44Params.purpose,
56
- bip44Params.coinType,
57
- bip44Params.accountNumber,
58
- ...(bip44Params.isChange !== undefined ? [bip44Params.isChange ? 1 : 0] : []),
59
- ...(bip44Params.addressIndex !== undefined ? [bip44Params.addressIndex] : []),
60
- ];
55
+ const addressNList = toAddressNList(bip44Params);
61
56
  return {
62
57
  addressNList,
63
58
  intentMessageBytes: intentMessage,
@@ -1,4 +1,4 @@
1
- import { Transaction } from '@cetusprotocol/aggregator-sdk/node_modules/@mysten/sui/transactions';
1
+ import { Transaction } from '@mysten/sui/transactions';
2
2
  import { bnOrZero } from '@shapeshiftoss/utils';
3
3
  import { Err } from '@sniptt/monads';
4
4
  import { v4 as uuid } from 'uuid';
@@ -1,4 +1,4 @@
1
- import { Transaction } from '@cetusprotocol/aggregator-sdk/node_modules/@mysten/sui/transactions';
1
+ import { Transaction } from '@mysten/sui/transactions';
2
2
  import { bnOrZero } from '@shapeshiftoss/utils';
3
3
  import { Err } from '@sniptt/monads';
4
4
  import { v4 as uuid } from 'uuid';
@@ -1,5 +1,5 @@
1
1
  import { CHAIN_NAMESPACE, fromAssetId, solAssetId } from '@shapeshiftoss/caip';
2
- import { assertUnreachable, bnOrZero, toBaseUnit } from '@shapeshiftoss/utils';
2
+ import { assertUnreachable, BigAmount, bnOrZero } from '@shapeshiftoss/utils';
3
3
  import { Err, Ok } from '@sniptt/monads';
4
4
  import { v4 as uuid } from 'uuid';
5
5
  import { getDefaultSlippageDecimalPercentageForSwapper } from '../../../constants.js';
@@ -66,11 +66,11 @@ export const getQuoteOrRate = async (input, deps) => {
66
66
  if (maybeQuoteResponse.isErr()) {
67
67
  const error = maybeQuoteResponse.unwrapErr();
68
68
  const cause = error.cause;
69
- if (cause.message.includes('code 400') &&
70
- cause.response?.data.detail.includes('Amount outside asset bounds')) {
69
+ if (cause?.message?.includes('code 400') &&
70
+ cause?.response?.data?.detail?.includes('Amount outside asset bounds')) {
71
71
  return Err(createTradeAmountTooSmallErr({
72
72
  assetId: sellAsset.assetId,
73
- minAmountCryptoBaseUnit: cause.response?.data.errors.minimalAmountNative[0],
73
+ minAmountCryptoBaseUnit: cause.response?.data?.errors?.minimalAmountNative?.[0],
74
74
  }));
75
75
  }
76
76
  return Err(makeSwapErrorRight({
@@ -199,7 +199,10 @@ export const getQuoteOrRate = async (input, deps) => {
199
199
  const boostRate = getChainflipQuoteRate(singleQuoteResponse.boostQuote.ingressAmountNative, singleQuoteResponse.boostQuote.egressAmountNative);
200
200
  // This is not really a buyAmount before fees but rather an input/output calculation to get the sell amount
201
201
  // prorated to the buy asset price to determine price impact
202
- const buyAmountBeforeFeesCryptoBaseUnit = toBaseUnit(bnOrZero(singleQuoteResponse.boostQuote.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)), buyAsset.precision);
202
+ const buyAmountBeforeFeesCryptoBaseUnit = BigAmount.fromPrecision({
203
+ value: bnOrZero(singleQuoteResponse.boostQuote.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)),
204
+ precision: buyAsset.precision,
205
+ }).toBaseUnit();
203
206
  const boostTradeRateOrQuote = {
204
207
  id: uuid(),
205
208
  rate: boostRate,
@@ -246,7 +249,10 @@ export const getQuoteOrRate = async (input, deps) => {
246
249
  : '0';
247
250
  // This is not really a buyAmount before fees but rather an input/output calculation to get the sell amount
248
251
  // prorated to the buy asset price to determine price impact
249
- const buyAmountBeforeFeesCryptoBaseUnit = toBaseUnit(bnOrZero(singleQuoteResponse.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)), buyAsset.precision);
252
+ const buyAmountBeforeFeesCryptoBaseUnit = BigAmount.fromPrecision({
253
+ value: bnOrZero(singleQuoteResponse.ingressAmount).times(bnOrZero(singleQuoteResponse.estimatedPrice)),
254
+ precision: buyAsset.precision,
255
+ }).toBaseUnit();
250
256
  const tradeRateOrQuote = {
251
257
  id: uuid(),
252
258
  rate,
@@ -1,5 +1,5 @@
1
1
  import { fromAssetId } from '@shapeshiftoss/caip';
2
- import { bn, bnOrZero, fromBaseUnit, isToken } from '@shapeshiftoss/utils';
2
+ import { BigAmount, bn, bnOrZero, isToken } from '@shapeshiftoss/utils';
3
3
  import { Err, Ok } from '@sniptt/monads';
4
4
  import { TradeQuoteError } from '../../../types.js';
5
5
  import { makeSwapErrorRight } from '../../../utils.js';
@@ -15,8 +15,14 @@ export const isSupportedAssetId = (chainId, assetId) => {
15
15
  return supportedAssetIds.includes(assetId);
16
16
  };
17
17
  export const calculateChainflipMinPrice = ({ sellAmountIncludingProtocolFeesCryptoBaseUnit, buyAmountAfterFeesCryptoBaseUnit, slippageTolerancePercentageDecimal, sellAsset, buyAsset, }) => {
18
- const sellAmountCryptoPrecision = fromBaseUnit(sellAmountIncludingProtocolFeesCryptoBaseUnit, sellAsset.precision);
19
- const buyAmountCryptoPrecision = fromBaseUnit(buyAmountAfterFeesCryptoBaseUnit, buyAsset.precision);
18
+ const sellAmountCryptoPrecision = BigAmount.fromBaseUnit({
19
+ value: sellAmountIncludingProtocolFeesCryptoBaseUnit,
20
+ precision: sellAsset.precision,
21
+ }).toPrecision();
22
+ const buyAmountCryptoPrecision = BigAmount.fromBaseUnit({
23
+ value: buyAmountAfterFeesCryptoBaseUnit,
24
+ precision: buyAsset.precision,
25
+ }).toPrecision();
20
26
  const estimatedPrice = bn(buyAmountCryptoPrecision).div(sellAmountCryptoPrecision);
21
27
  // This is called minimumPrice upstream but this really is a rate, let's not honour confusing terminology
22
28
  const minimumRate = estimatedPrice
@@ -9,7 +9,7 @@ export const cowSwapper = {
9
9
  throw Error('Missing appDataHash');
10
10
  const signature = await signCowOrder(orderToSign, chainId, signMessage);
11
11
  const network = assertGetCowNetwork(chainId);
12
- const maybeOrdersResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/orders/`, {
12
+ const maybeOrdersResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/orders`, {
13
13
  ...orderToSign,
14
14
  signingScheme: SigningScheme.EIP712,
15
15
  signature,
@@ -39,7 +39,7 @@ export async function getCowSwapTradeQuote(input, config) {
39
39
  });
40
40
  const { appData, appDataHash } = await getFullAppData(slippageTolerancePercentageDecimal, affiliateAppDataFragment, 'market');
41
41
  // https://api.cow.fi/docs/#/default/post_api_v1_quote
42
- const maybeQuoteResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/quote/`, {
42
+ const maybeQuoteResponse = await cowService.post(`${config.VITE_COWSWAP_BASE_URL}/${network}/api/v1/quote`, {
43
43
  sellToken: fromAssetId(sellAsset.assetId).assetReference,
44
44
  buyToken,
45
45
  receiver: receiveAddress,