如何使用wagmi计算Swap功能的预估Gas费用
解决wagmi计算Swap预估Gas费用的问题
你的代码只配置了普通ETH转账的参数,而Swap本质是调用DEX合约的特定方法,必须传入合约调用的calldata(data字段)才能正确估算Swap操作的Gas费用。以下是修正方案:
核心问题说明
useEstimateGas如果只传account、to、value,只会计算普通ETH转账的Gas。Swap需要调用DEX合约的swap方法(比如Uniswap的swapExactETHForTokens),因此必须补充data参数,该参数是合约方法调用的编码数据。
修正后的代码示例(以Uniswap V2为例)
import { useEstimateGas } from 'wagmi' import { parseEther, encodeFunctionData } from 'viem' import { config } from './config' // 简化的Uniswap V2 Router ABI,仅保留swapExactETHForTokens方法 const uniswapV2RouterABI = [ { inputs: [ { internalType: 'uint256', name: 'amountOutMin', type: 'uint256' }, { internalType: 'address[]', name: 'path', type: 'address[]' }, { internalType: 'address', name: 'to', type: 'address' }, { internalType: 'uint256', name: 'deadline', type: 'uint256' } ], name: 'swapExactETHForTokens', outputs: [{ internalType: 'uint256[]', name: 'amounts', type: 'uint256[]' }], stateMutability: 'payable', type: 'function' } ] function App() { // 构造Swap所需参数 const swapArgs = [ parseEther('0'), // 最小输出代币数量,可根据滑点需求调整 [ '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', // WETH合约地址 '0x6B175474E89094C44Da98b954EedeAC495271d0F' // DAI合约地址 ], '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // 代币接收地址 Math.floor(Date.now() / 1000) + 60 * 20 // 交易过期时间(20分钟后) ] // 生成合约调用的calldata const swapData = encodeFunctionData({ abi: uniswapV2RouterABI, functionName: 'swapExactETHForTokens', args: swapArgs }) const gasEstimate = useEstimateGas({ account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', to: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D', // Uniswap V2 Router合约地址 value: parseEther('0.01'), // 要兑换的ETH数量 data: swapData // 关键:传入Swap方法的编码数据 }) // 渲染结果 if (gasEstimate.isLoading) return <div>估算Gas中...</div> if (gasEstimate.error) return <div>估算失败:{gasEstimate.error.message}</div> return <div>预估Gas费用:{gasEstimate.data.toString()}</div> }
注意事项
- 替换为你实际使用的DEX合约地址、ABI和Swap方法(比如Uniswap V3用
exactInput方法)。 amountOutMin建议通过行情接口计算合理值,避免因滑点过大导致交易失败。deadline需设置合理的过期时间,防止交易在链上等待过久失效。
内容的提问来源于stack exchange,提问作者Wishwajith Dissanayake
相关产品推荐
相关产品推荐

