升级WETH.sol至^0.8.0编译报错:int(-1)无法转uint256,如何修复?
问题:升级Solidity编译器到0.8.x后WETH合约编译错误
我尝试编译以太坊主网的WETH合约,该合约原本使用旧版本编译器(0.4.x)编译。将编译器版本改为^0.8.0后,出现如下错误:
TypeError: Explicit type conversion not allowed from "int_const -1" to "uint256". --> contracts/WETH9.sol:78:64: | 78 | if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {} | ^^^^^^^^ Error HH600: Compilation failed
相关代码片段:
if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) { require(allowance[src][msg.sender] >= wad); allowance[src][msg.sender] -= wad; }
修正方案
Solidity 0.8.x版本明确禁止将负整数常量直接转换为无符号整数(uint256)。而在0.4.x版本中,uint(-1)会被隐式转换为uint256的最大值(即2^256 - 1),这是旧版本的兼容性特性。
修复错误只需把uint(-1)替换为0.8.x版本支持的标准写法type(uint256).max,这是获取uint256类型最大值的官方推荐方式。
修正后的代码:
if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { require(allowance[src][msg.sender] >= wad); allowance[src][msg.sender] -= wad; }
内容的提问来源于stack exchange,提问作者DeFi
相关产品推荐
相关产品推荐

