import { useQuote, TradeType } from '0xtrails'
import { useWalletClient, useAccount } from 'wagmi'
import { useState, useEffect } from 'react'
export const CustomSwap = () => {
const { data: walletClient } = useWalletClient()
const { address } = useAccount()
const { quote, swap, isLoadingQuote, quoteError, refetchQuote } = useQuote({
walletClient,
fromTokenAddress: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // USDC on Ethereum
fromChainId: 1,
toTokenAddress: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', // USDC on Base
toChainId: 8453,
swapAmount: '1000000', // 1 USDC (6 decimals)
tradeType: TradeType.EXACT_INPUT,
toRecipient: address,
slippageTolerance: '0.005', // 0.5%
onStatusUpdate: (states) => {
console.log('Transaction status:', states)
},
})
// Refresh quotes every 30 seconds
useEffect(() => {
const interval = setInterval(() => {
refetchQuote?.()
}, 30000)
return () => clearInterval(interval)
}, [refetchQuote])
const handleSwap = async () => {
if (!swap) return
try {
const result = await swap()
console.log('Swap result:', result)
} catch (error) {
console.error('Swap failed:', error)
}
}
if (isLoadingQuote) return <div>Loading quote...</div>
if (quoteError) return <div>Error: {String(quoteError)}</div>
if (!quote) return <div>No quote available</div>
return (
<div>
<h3>Quote</h3>
<p>From: {quote.originAmountFormatted} {quote.originToken.symbol}</p>
<p>To: {quote.destinationAmountFormatted} {quote.destinationToken.symbol}</p>
<p>Fee: {quote.totalFeeAmountUsdDisplay}</p>
<p>Rate: 1 {quote.originToken.symbol} = {quote.destinationTokenRate} {quote.destinationToken.symbol}</p>
<p>Est. Time: {quote.completionEstimateSeconds}s</p>
<button onClick={handleSwap}>Execute Swap</button>
</div>
)
}