如何使用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
相关产品推荐
相关产品推荐

