首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码-1作为uint256

编码-1作为uint256
EN

Stack Overflow用户
提问于 2021-11-28 22:46:40
回答 1查看 2.2K关注 0票数 0

根据liquidationCall的Aave文档,必须为debtToCover参数传递uint(- 1 )才能清算healthFactor <1的帐户的最大金额。如何使用web3、醚等将-1编码为uint256?

例如,使用web3尝试此操作会产生一个错误。

代码语言:javascript
复制
> 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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-28 23:07:27

uint代表“无符号整数”,因此它不接受-1作为有效值。

Solidity将uint(-1)转换为uint的最大值,直到0.7.6版本,因为该值会向下流动。

代码语言:javascript
复制
pragma solidity ^0.7;

contract MyContract {
    // returns 115792089237316195423570985008687907853269984665640564039457584007913129639935
    function foo() external pure returns (uint256) {
        return uint(-1);
    }
}

版本0.8.0引入了对整数下溢/溢出的自动还原,它甚至不允许将-1文本转换为uint,但您可以这样测试还原:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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开始的大数字)。

代码语言:javascript
复制
const BN = web3.utils.BN;
const number = (new BN(2)).pow(new BN(256)).sub(new BN(1));
console.log(number.toString());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70148129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档