diff --git a/packages/swapper/src/swappers/ButterSwap/ButterSwap.ts b/packages/swapper/src/swappers/ButterSwap/ButterSwap.ts
index 3a99f1a8df7..ebd8d474ecf 100644
--- a/packages/swapper/src/swappers/ButterSwap/ButterSwap.ts
+++ b/packages/swapper/src/swappers/ButterSwap/ButterSwap.ts
@@ -1,9 +1,14 @@
import type { Swapper } from '../../types'
-import { executeEvmTransaction, executeSolanaTransaction } from '../../utils'
+import {
+ executeEvmTransaction,
+ executeSolanaTransaction,
+ executeTronTransaction,
+} from '../../utils'
export const butterSwap: Swapper = {
executeEvmTransaction,
executeSolanaTransaction,
+ executeTronTransaction,
executeUtxoTransaction: (txToSign, { signAndBroadcastTransaction }) => {
return signAndBroadcastTransaction(txToSign)
},
diff --git a/packages/swapper/src/swappers/ButterSwap/endpoints.ts b/packages/swapper/src/swappers/ButterSwap/endpoints.ts
index de4de070ea4..fca82e9eeff 100644
--- a/packages/swapper/src/swappers/ButterSwap/endpoints.ts
+++ b/packages/swapper/src/swappers/ButterSwap/endpoints.ts
@@ -3,6 +3,8 @@ import BigNumber from 'bignumber.js'
import { getSolanaTransactionFees } from '../../solana-utils/getSolanaTransactionFees'
import { getUnsignedSolanaTransaction } from '../../solana-utils/getUnsignedSolanaTransaction'
+import { getTronTransactionFees } from '../../tron-utils/getTronTransactionFees'
+import { getUnsignedTronTransaction } from '../../tron-utils/getUnsignedTronTransaction'
import type { SwapperApi } from '../../types'
import { getExecutableTradeStep, isExecutableTradeQuote } from '../../utils'
import { checkTradeStatus } from './swapperApi/checkTradeStatus'
@@ -85,4 +87,6 @@ export const butterSwapApi: SwapperApi = {
},
getUnsignedSolanaTransaction,
getSolanaTransactionFees,
+ getTronTransactionFees,
+ getUnsignedTronTransaction,
}
diff --git a/packages/swapper/src/swappers/ButterSwap/swapperApi/checkTradeStatus.ts b/packages/swapper/src/swappers/ButterSwap/swapperApi/checkTradeStatus.ts
index 71285b79153..659b0cf654d 100644
--- a/packages/swapper/src/swappers/ButterSwap/swapperApi/checkTradeStatus.ts
+++ b/packages/swapper/src/swappers/ButterSwap/swapperApi/checkTradeStatus.ts
@@ -1,4 +1,4 @@
-import { solanaChainId } from '@shapeshiftoss/caip'
+import { solanaChainId, tronChainId } from '@shapeshiftoss/caip'
import { isEvmChainId } from '@shapeshiftoss/chain-adapters'
import { TxStatus } from '@shapeshiftoss/unchained-client'
@@ -52,6 +52,31 @@ export const checkTradeStatus = async (input: CheckTradeStatusInput): Promise
0
+ ? TxStatus.Confirmed
+ : contractRet === 'REVERT'
+ ? TxStatus.Failed
+ : TxStatus.Pending
+
+ return {
+ status,
+ buyTxHash: txHash,
+ message: undefined,
+ }
+ }
+
// Fallback: unknown same-chain type (should never happen for Butter, but just in case). Avoid bridge polling.
return createDefaultStatusResponse(txHash)
}
diff --git a/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeQuote.ts b/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeQuote.ts
index 3b1f78fdc75..e50abed5251 100644
--- a/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeQuote.ts
+++ b/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeQuote.ts
@@ -1,4 +1,4 @@
-import { btcAssetId, btcChainId, solanaChainId } from '@shapeshiftoss/caip'
+import { btcAssetId, btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip'
import { isEvmChainId } from '@shapeshiftoss/chain-adapters'
import {
bnOrZero,
@@ -52,7 +52,8 @@ export const getTradeQuote = async (
if (
!isEvmChainId(sellAsset.chainId) &&
sellAsset.chainId !== btcChainId &&
- sellAsset.chainId !== solanaChainId
+ sellAsset.chainId !== solanaChainId &&
+ sellAsset.chainId !== tronChainId
) {
return Err(
makeSwapErrorRight({
diff --git a/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeRate.ts b/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeRate.ts
index 7742212d893..faf1af86da7 100644
--- a/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeRate.ts
+++ b/packages/swapper/src/swappers/ButterSwap/swapperApi/getTradeRate.ts
@@ -1,4 +1,4 @@
-import { btcAssetId, btcChainId, solanaChainId } from '@shapeshiftoss/caip'
+import { btcAssetId, btcChainId, solanaChainId, tronChainId } from '@shapeshiftoss/caip'
import { isEvmChainId } from '@shapeshiftoss/chain-adapters'
import {
bn,
@@ -42,7 +42,8 @@ export const getTradeRate = async (
if (
!isEvmChainId(sellAsset.chainId) &&
sellAsset.chainId !== btcChainId &&
- sellAsset.chainId !== solanaChainId
+ sellAsset.chainId !== solanaChainId &&
+ sellAsset.chainId !== tronChainId
) {
return Err(
makeSwapErrorRight({
diff --git a/packages/swapper/src/swappers/ButterSwap/utils/helpers.ts b/packages/swapper/src/swappers/ButterSwap/utils/helpers.ts
index 741847c4abc..3b1c36fdf81 100644
--- a/packages/swapper/src/swappers/ButterSwap/utils/helpers.ts
+++ b/packages/swapper/src/swappers/ButterSwap/utils/helpers.ts
@@ -12,6 +12,7 @@ const BUTTERSWAP_CHAIN_ID_TO_CHAIN_ID: Record = {
43114: KnownChainIds.AvalancheMainnet,
1360108768460801: KnownChainIds.SolanaMainnet,
1360095883558913: KnownChainIds.BitcoinMainnet,
+ 728126428: KnownChainIds.TronMainnet,
}
const CHAIN_ID_TO_BUTTERSWAP_CHAIN_ID: Record = Object.entries(
diff --git a/packages/swapper/src/swappers/ButterSwap/xhr.ts b/packages/swapper/src/swappers/ButterSwap/xhr.ts
index dbb78612e5d..d29d50c4e41 100644
--- a/packages/swapper/src/swappers/ButterSwap/xhr.ts
+++ b/packages/swapper/src/swappers/ButterSwap/xhr.ts
@@ -1,4 +1,4 @@
-import { fromAssetId, solanaChainId } from '@shapeshiftoss/caip'
+import { fromAssetId, solanaChainId, tronChainId } from '@shapeshiftoss/caip'
import type { Asset } from '@shapeshiftoss/types'
import { chainIdToFeeAssetId } from '@shapeshiftoss/utils'
import type { Result } from '@sniptt/monads'
@@ -39,6 +39,7 @@ export type GetButterRouteArgs = {
}
const SOLANA_NATIVE_ADDRESS = 'So11111111111111111111111111111111111111112'
+const TRON_NATIVE_ADDRESS = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb'
export const getButterRoute = async ({
sellAsset,
@@ -67,12 +68,14 @@ export const getButterRoute = async ({
const sellAssetAddress = (() => {
if (sellAsset.chainId === solanaChainId && sellAssetIsNative) return SOLANA_NATIVE_ADDRESS
+ if (sellAsset.chainId === tronChainId && sellAssetIsNative) return TRON_NATIVE_ADDRESS
if (sellAssetIsNative) return zeroAddress
return sellAssetAddressRaw
})()
const buyAssetAddress = (() => {
if (buyAsset.chainId === solanaChainId && buyAssetIsNative) return SOLANA_NATIVE_ADDRESS
+ if (buyAsset.chainId === tronChainId && buyAssetIsNative) return TRON_NATIVE_ADDRESS
if (buyAssetIsNative) return zeroAddress
return buyAssetAddressRaw
})()
diff --git a/packages/swapper/src/tron-utils/getUnsignedTronTransaction.ts b/packages/swapper/src/tron-utils/getUnsignedTronTransaction.ts
index 7a6702e0bb3..70a0112718b 100644
--- a/packages/swapper/src/tron-utils/getUnsignedTronTransaction.ts
+++ b/packages/swapper/src/tron-utils/getUnsignedTronTransaction.ts
@@ -13,11 +13,20 @@ export const getUnsignedTronTransaction = ({
const step = getExecutableTradeStep(tradeQuote, stepIndex)
- const { accountNumber, sellAsset, relayTransactionMetadata, nearIntentsSpecific } = step
+ const {
+ accountNumber,
+ sellAsset,
+ relayTransactionMetadata,
+ nearIntentsSpecific,
+ butterSwapTransactionMetadata,
+ } = step
const adapter = assertGetTronChainAdapter(sellAsset.chainId)
- const to = relayTransactionMetadata?.to ?? nearIntentsSpecific?.depositAddress
+ const to =
+ relayTransactionMetadata?.to ??
+ nearIntentsSpecific?.depositAddress ??
+ butterSwapTransactionMetadata?.to
if (!to) throw new Error('Missing transaction destination address')
const value = step.sellAmountIncludingProtocolFeesCryptoBaseUnit