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

如何使用Uniswap V3 Router实现ERC20转ETH兑换?

Uniswap V3实现ERC20转ETH兑换的方案

Uniswap V3确实没有V2那种封装好的一站式兑换函数,你需要通过直接调用SwapRouter或Pool合约的核心函数来实现,核心是手动构建兑换逻辑,处理手续费转账和路径计算。以下是具体操作步骤:

1. 核心逻辑说明

V3的兑换都是基于ERC20标准的,ETH需要先转换为WETH参与交易,兑换完成后再转回ETH。你可以借助Uniswap官方提供的SwapRouter合约来简化流程,它封装了exactInputSingle(单池兑换)和exactInput(多路径兑换)函数,替代V2中swapExactTokensForETHSupportingFeeOnTransferTokens的功能。

2. 针对Fee-on-Transfer代币的处理

如果你的代币带有转账手续费(Fee-on-Transfer),需要注意:

  • 先调用代币的transfer函数将指定数量转至Pool或路由合约,实际到账数量会扣除手续费
  • 在兑换参数中设置合理的amountOutMinimum,确保扣除手续费后仍能满足最低ETH接收要求

3. Solidity代码示例

// 引入Uniswap V3接口
interface ISwapRouter {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
}

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256 amount) external;
    function balanceOf(address account) external view returns (uint256);
}

contract TokenToEthSwap {
    address public constant SWAP_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564; // 主网SwapRouter地址
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    function swapTokenForEth(address token, uint256 amountIn, uint256 minEthOut, uint24 feeTier) external {
        // 1. 批准代币给SwapRouter
        IERC20(token).approve(SWAP_ROUTER, amountIn);

        // 2. 构建兑换参数
        ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
            tokenIn: token,
            tokenOut: WETH,
            fee: feeTier, // 0.05%=500, 0.3%=3000, 1%=10000
            recipient: address(this),
            deadline: block.timestamp,
            amountIn: amountIn,
            amountOutMinimum: minEthOut * 1e18, // 转换为WETH的18位精度
            sqrtPriceLimitX96: 0 // 不限制滑点,可根据需求设置价格上限
        });

        // 3. 执行兑换
        ISwapRouter(SWAP_ROUTER).exactInputSingle(params);

        // 4. 将WETH转回ETH并发送给用户
        uint256 wethBalance = IWETH(WETH).balanceOf(address(this));
        IWETH(WETH).withdraw(wethBalance);
        payable(msg.sender).transfer(wethBalance);
    }
}

4. 关键注意事项

  • 滑点控制: sqrtPriceLimitX96参数可用于限制兑换的价格范围,避免极端滑点,计算方式可参考Uniswap官方的价格公式
  • Gas优化: V3的兑换Gas成本通常低于V2,但建议合并批准和兑换操作,减少交易次数
  • 合约权限: 确保SwapRouter有权限使用你的代币,批准操作需提前完成或在交易内执行
  • 网络适配: 测试网和主网的SwapRouter、WETH地址不同,需根据部署网络调整

内容的提问来源于stack exchange,提问作者Rakesh Pradhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:14