You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:23:10