UniswapV2 swapExactTokensForETH在Kovan测试网执行失败排查
代码存在的问题如下:
- 核心逻辑缺失:你注释了
DAI.transferFrom(msg.sender, address(this), amountIn)这行代码,导致合约没有从调用者账户中拿到对应数量的DAI。后续你给Uniswap路由授权的是合约自身持有的DAI额度,而合约账户里根本没有对应DAI,兑换操作自然会失败。 - 变量名拼写错误:你定义的Uniswap路由实例变量名为
uniswapRouter2,但调用兑换方法时写的是uniswapRouter.swapExactTokensForETH,该变量未定义,代码甚至无法正常编译。 - 交易有效期设置不合理:
deadline = block.timestamp + 15仅给交易留了15秒的打包窗口,Kovan测试网出块时间波动极大,很容易出现交易还没被打包就过期的问题,建议将有效期调整为block.timestamp + 1800(预留30分钟)。 - 未处理ETH接收逻辑:你调用
swapExactTokensForETH时指定接收兑换后ETH的地址是合约自身address(this),如果你的合约没有实现receive()或fallback()payable函数来接收ETH,Uniswap向合约转ETH时会触发回滚,导致整个交易失败。 - ERC20授权逻辑不兼容:DAI等部分ERC20代币要求,当已给某地址授权过非0额度时,再次调整授权额度需要先将额度设为0再写入新值,你直接调用
approve的写法如果碰到合约之前已经给路由授权过剩余额度的情况,会直接触发approve failed报错。 - 输入参数校验缺失:你没有校验传入的
daiAmount是否是符合DAI 18位小数精度的数值,若调用方传入的是按DAI枚数计算的数值(比如传1代表1枚DAI)而没有转成wei单位,会导致实际兑换金额过小,触发交易池的最小输出限制导致失败。 - 滑点设置不规范:你将
swapExactTokensForETH的最小接收量参数设为0,虽然不会直接导致交易失败,但测试网资金池深度差,很容易出现兑换后得到的ETH数量远低于预期的情况,同时主网环境下该写法会让你面临极高的抢跑损失风险,建议按预期输出的90%设置最小接收量阈值。
内容的提问来源于stack exchange,提问作者Steven Ooi
相关产品推荐
相关产品推荐

