WETH合约transferFrom()函数报错:交易无理由回滚求助
问题分析
你遇到的Transaction reverted without a reason string是因为WETH合约的transferFrom函数触发了无错误信息的require检查。你已经确认源地址余额足够,那问题必然出在授权额度不足:
当你的合约调用weth.transferFrom(msg.sender, address(this), amountIn)时,WETH合约会执行以下逻辑:
- 由于
src=msg.sender(外部用户账户)不等于当前msg.sender(你的合约地址),会进入分支检查allowance[src][msg.sender](即用户给你的合约的授权额度)是否≥amountIn。 - 如果用户没有提前给你的合约授权WETH额度,或者授权额度小于
amountIn,这个require会触发回滚,且WETH的这个require没有附带错误字符串,所以你看到的报错没有理由。
解决步骤
先完成授权操作
在调用你的合约的swapSingleHopExactAmountIn函数之前,必须让用户的外部账户调用WETH合约的approve方法,授权你的合约可以转移他的WETH:// 用户通过钱包/前端执行此调用 weth.approve(你的合约地址, amountIn); // 或授权无限额度(避免重复授权) weth.approve(你的合约地址, type(uint256).max);优化合约错误提示(可选)
你可以修改合约里的require语句,让错误信息更明确,方便后续排查:require(weth.transferFrom(msg.sender, address(this), amountIn), "WETH transfer failed: check allowance and balance");前端流程优化
在前端调用swap函数之前,先检查用户给合约的授权额度是否足够,如果不足,引导用户先完成授权交易。
内容的提问来源于stack exchange,提问作者Ibrahim Khalil
相关产品推荐
相关产品推荐

