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