Uniswap V2外围合约调用异常:自定义合约执行Swap交易触发回退错误
我帮你梳理几个可能导致交易回滚的关键点,你可以逐一排查:
Deadline 参数已过期:你传入的
deadline是261639093,这个时间戳对应的是1978年左右,远早于当前区块时间(现在的时间戳已经是1700万+)。Uniswap V2的swapExactTokensForTokens函数会严格检查deadline >= block.timestamp,如果过期直接回滚。你需要传入一个未来的时间戳,比如当前时间加上300秒(5分钟),给交易留足够的上链时间。授权额度不足:在调用合约的
swap函数之前,你必须先调用_tokenIn(也就是WETH)的approve方法,授权给你的tokenSwap合约至少1000000的额度。因为swap里的transferFrom需要你提前授权,没有授权或者额度不够都会触发回滚。AmountOutMin 设置过高:虽然你能通过
getAmountOutMin获取预期输出,但要注意这个值是实时价格,交易上链时可能因为滑点导致实际输出减少。如果传入的_amountOutMin比实际能拿到的代币数量多,Uniswap会因为滑点超过限制而回滚。建议在getAmountOutMin的基础上乘以一个滑点系数(比如0.95,也就是接受5%的滑点),再传入作为_amountOutMin。交易对路径有效性:你传入的
_tokenOut(0xad6d458402f60fd3bd25163575031acdce07538d)和WETH在Ropsten测试网的Uniswap V2上有没有直接的交易对?如果没有直接交易对,你的合约会尝试走WETH中转的三路径,但这里因为_tokenIn是WETH,合约只会生成两地址路径,这时候如果没有直接交易对,swap会失败。你可以通过Uniswap V2 Factory的getPair方法查询这两个代币的交易对是否存在。钱包余额不足:确保你的钱包里有足够的
_tokenIn(WETH)余额,至少要大于等于你传入的1000000数量,否则transferFrom会因为余额不足回滚。
另外,你可以在Remix或者Ropsten区块浏览器里查看交易的详细回滚原因,比如查看交易的Input Data和Error Message,能更精准定位问题。
内容的提问来源于stack exchange,提问作者StayAway

