【问题标题】:Encoding -1 as a uint256将 -1 编码为 uint256
【发布时间】:2022-01-05 21:57:46
【问题描述】:

根据liquidationCall 的 Aave 文档,必须将 uint(-1) 传递给 debtToCover 参数,以便清算 healthFactor

例如使用 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'

【问题讨论】:

    标签: ethereum solidity web3 ethers.js


    【解决方案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 版引入了整数下溢/上溢的自动还原,它甚至不允许将 -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());
    

    【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 2017-08-23
    • 2010-12-27
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 2022-01-17
    相关资源
    最近更新 更多