当在0.8.0版本的编译器中时, 合约中专门写了一个处理apprve的函数,
function set_all_approve() public {
IERC20(USDC).approve(UNI_V2_router, uint(0)-1);
}
部署好合约之后,我想第一步操作就给router授权,所以执行了set_all_approve() , 但是返回报错:VM Exception while processing transaction: reverted 这是什么原因呢。
我把编译器版本改为0.6.0这个函数就能通过执行。 不懂其中的原因,求大佬帮忙解释一下。
0.8.0 默认会对数学计算做溢出检查,代码中 0 减 1 是会溢出的。
而在0.8.0之前的编译器中, 是不会进行溢出检查,因此可以成功。
如果要使用最大值,建议使用type(uint).max
, 参考文档:https://learnblockchain.cn/docs/solidity/types.html#integers
而不是使用 -1
,尽管他们存储值一样。