将 -1 编码为 uint256
Encoding -1 as a uint256
根据 liquidationCall
的 Aave 文档,必须为 debtToCover 参数传递 uint(-1) 才能清算 healthFactor < 1 的帐户的最大可能金额。如何编码 - 1 作为 uint256 使用 web3、ethers 等?
例如,使用 web3 尝试此操作会产生错误。
> web3.eth.abi.encodeParameter("uint", "-1")
Uncaught:
Error: value out-of-bounds (argument=null, value="-1", code=INVALID_ARGUMENT, version=abi/5.0.7)
at Logger.makeError (-/node_modules/@ethersproject/logger/lib/index.js:199:21)
at Logger.throwError (-/node_modules/@ethersproject/logger/lib/index.js:208:20)
at Logger.throwArgumentError (-/node_modules/@ethersproject/logger/lib/index.js:211:21)
at NumberCoder.Coder._throwError (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/abstract-coder.js:40:16)
at NumberCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/number.js:40:18)
at -/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/array.js:71:19
at Array.forEach (<anonymous>)
at Object.pack (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/array.js:57:12)
at TupleCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/tuple.js:36:24)
at AbiCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/abi-coder.js:86:15)
at ABICoder.encodeParameters (-/node_modules/web3-eth-abi/lib/index.js:120:27)
at ABICoder.encodeParameter (-/node_modules/web3-eth-abi/lib/index.js:78:17) {
reason: 'value out-of-bounds',
code: 'INVALID_ARGUMENT',
argument: null,
value: '-1'
uint
代表“无符号整数”,因此它不接受 -1
作为有效值。
Solidity 将 uint(-1)
转换为 uint
的最大值,直到版本 0.7.6,因为该值下溢。
pragma solidity ^0.7;
contract MyContract {
// returns 115792089237316195423570985008687907853269984665640564039457584007913129639935
function foo() external pure returns (uint256) {
return uint(-1);
}
}
版本 0.8.0 引入了对整数 underflow/overflow 的自动还原,它甚至不允许将 -1
文字转换为 uint
,但您可以通过这种方式测试还原:
pragma solidity ^0.8;
contract MyContract {
// reverts on underflow
function foo() external pure returns (uint256) {
uint256 number = 0;
number--;
return number;
}
}
许多 JS 库也不允许将 -1
传递给“无符号整数”,仅仅是因为它是数据类型的无效值。但是由于 -1
有效地表示旧版本 Solidity 中的最大值,您可以传递 uint 最大值。
对于 uint8
,即 (2^8)-1
(或 255)
const BN = web3.utils.BN;
const number = (new BN(2)).pow(new BN(8)).sub(new BN(1));
console.log(number.toString());
对于 uint256
,即 (2^256)-1
(或从 115 开始的大数...)
const BN = web3.utils.BN;
const number = (new BN(2)).pow(new BN(256)).sub(new BN(1));
console.log(number.toString());
根据 liquidationCall
的 Aave 文档,必须为 debtToCover 参数传递 uint(-1) 才能清算 healthFactor < 1 的帐户的最大可能金额。如何编码 - 1 作为 uint256 使用 web3、ethers 等?
例如,使用 web3 尝试此操作会产生错误。
> web3.eth.abi.encodeParameter("uint", "-1")
Uncaught:
Error: value out-of-bounds (argument=null, value="-1", code=INVALID_ARGUMENT, version=abi/5.0.7)
at Logger.makeError (-/node_modules/@ethersproject/logger/lib/index.js:199:21)
at Logger.throwError (-/node_modules/@ethersproject/logger/lib/index.js:208:20)
at Logger.throwArgumentError (-/node_modules/@ethersproject/logger/lib/index.js:211:21)
at NumberCoder.Coder._throwError (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/abstract-coder.js:40:16)
at NumberCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/number.js:40:18)
at -/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/array.js:71:19
at Array.forEach (<anonymous>)
at Object.pack (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/array.js:57:12)
at TupleCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/coders/tuple.js:36:24)
at AbiCoder.encode (-/node_modules/web3-eth-abi/node_modules/@ethersproject/abi/lib/abi-coder.js:86:15)
at ABICoder.encodeParameters (-/node_modules/web3-eth-abi/lib/index.js:120:27)
at ABICoder.encodeParameter (-/node_modules/web3-eth-abi/lib/index.js:78:17) {
reason: 'value out-of-bounds',
code: 'INVALID_ARGUMENT',
argument: null,
value: '-1'
uint
代表“无符号整数”,因此它不接受 -1
作为有效值。
Solidity 将 uint(-1)
转换为 uint
的最大值,直到版本 0.7.6,因为该值下溢。
pragma solidity ^0.7;
contract MyContract {
// returns 115792089237316195423570985008687907853269984665640564039457584007913129639935
function foo() external pure returns (uint256) {
return uint(-1);
}
}
版本 0.8.0 引入了对整数 underflow/overflow 的自动还原,它甚至不允许将 -1
文字转换为 uint
,但您可以通过这种方式测试还原:
pragma solidity ^0.8;
contract MyContract {
// reverts on underflow
function foo() external pure returns (uint256) {
uint256 number = 0;
number--;
return number;
}
}
许多 JS 库也不允许将 -1
传递给“无符号整数”,仅仅是因为它是数据类型的无效值。但是由于 -1
有效地表示旧版本 Solidity 中的最大值,您可以传递 uint 最大值。
对于 uint8
,即 (2^8)-1
(或 255)
const BN = web3.utils.BN;
const number = (new BN(2)).pow(new BN(8)).sub(new BN(1));
console.log(number.toString());
对于 uint256
,即 (2^256)-1
(或从 115 开始的大数...)
const BN = web3.utils.BN;
const number = (new BN(2)).pow(new BN(256)).sub(new BN(1));
console.log(number.toString());