部署Solidity合约报invalid BigNumber string错误如何解决
报错触发原因
你遇到的Error encoding arguments: Error: invalid BigNumber string (argument="value", value="", code=INVALID_ARGUMENT, version=bignumber/5.5.0)报错核心原因是:
合约的构造函数定义了uint256类型的入参change,部署合约时必须传入符合格式的无符号整数作为初始化参数,但你在部署操作时没有在参数输入栏填入对应值,传入了空字符串。ethers.js在对构造函数参数做ABI编码时,空字符串无法被转换为Solidity要求的uint256类型对应的BigNumber格式,因此抛出参数无效错误,导致合约部署失败。
修复方案
根据实际业务需求选择以下任意一种方案即可:
- 部署时传参:在部署工具的构造参数输入区域填入合法的正整数值(例如
0、100等),不要留空,确认参数填写完成后再发起部署交易。 - 给构造参数加默认值:如果希望部署时不传参也能正常初始化,可以给构造函数的入参设置默认值,修改后的合约代码如下:
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.5; contract local{ uint256 count; function getter() public view returns(uint256) { return count ; } // 为入参change设置默认值,示例默认初始化为0 constructor (uint256 change = 0){ count = change; } }
- 移除不必要的构造入参:如果count的初始值是固定值,不需要在部署时动态传入,可以直接去掉构造函数的参数,在变量声明时或构造函数内写死初始值即可,示例代码如下:
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.5; contract local{ // 声明变量时直接初始化 uint256 count = 0; function getter() public view returns(uint256) { return count ; } constructor (){ // 也可以选择在构造函数内赋值:count = 0; } }
内容的提问来源于stack exchange,提问作者Alfaz Sozib
相关产品推荐
相关产品推荐

