SOLIDITY REMIX 编译器,在部署我的合约后收到此错误(无效的 BigNumber 字符串)
Posted
技术标签:
【中文标题】SOLIDITY REMIX 编译器,在部署我的合约后收到此错误(无效的 BigNumber 字符串)【英文标题】:SOLIDITY REMIX compiler, after deploying my contract getting this ERROR (Invalid BigNumber string) 【发布时间】:2021-07-24 17:00:52 【问题描述】:我正在处理我的 Udemy 课程项目.. 这门课程的问题是使用了旧版本的solidity 0.4.17.. 我正在尝试将此项目更新到当前版本...更新代码后并尝试在 Remix 编译器上编译...它在特定行上编译时没有任何错误或警告,但是当我尝试在 remix 上部署合约时:
它显示:
创建活动出错:错误编码参数:错误:无效的 BigNumber 字符串(argument="value", value="", code=INVALID_ARGUMENT, version=bignumber/5.1.1)
所以我真的不明白这里有什么问题?
这是我的solidity合约代码:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >0.4.17
合同 CampaignFactory
address[] public deployedCampaigns;
function createCampaign(uint minimum) public
address newCampaign = address ( new Campaign(minimum, msg.sender));
deployedCampaigns.push(newCampaign);
function getDeployedCampaigns() public view returns (address[] memory)
return deployedCampaigns;
合约活动
struct Request
string description;
uint value;
address recipient;
bool complete;
uint approvalCount;
mapping(address => bool) approvals;
Request[] public requests;
address public manager;
uint public minimumContribution;
mapping(address => bool) public approvers;
uint public approversCount;
modifier restricted()
require(msg.sender == manager);
_;
constructor(uint minimum, address creator)
manager = creator;
minimumContribution = minimum;
function contribute() public payable
require(msg.value > minimumContribution);
approvers[msg.sender] = true;
approversCount++;
uint numRequest;
function creatRequest(string memory description, uint value, address recipient) public restricted
Request storage newRequest = requests[numRequest++];
newRequest.description = description;
newRequest.value = value;
newRequest.recipient = recipient;
newRequest.complete = false;
newRequest.approvalCount = 0;
function approveRequest(uint index) public
Request storage request = requests[index];
require(approvers[msg.sender]);
require(!request.approvals[msg.sender]);
request.approvals[msg.sender] = true;
request.approvalCount++;
function finalizeRequest(uint index) public restricted
Request storage request = requests[index];
require(request.approvalCount > (approversCount / 2));
require(!request.complete);
payable(request.recipient).transfer(request.value);
request.complete = true;
提前感谢您抽出宝贵时间来研究这个问题...
编辑:
好的,我经理传递这个错误,但现在当我尝试创建我的请求时,我收到一个错误:
[vm] from: 0x5B3...eddC4to: Campaign.creatRequest(string,uint256,address) 0x7b9...b6AcEvalue: 0 weidata: 0x83e...00000logs: 0hash: 0x8d9...a5ccb 交易到 Campaign.creatRequest 出错:VM 错误:操作码无效。无效的操作码 执行可能已经抛出。调试事务以获取更多信息。
所以我做的步骤:
将我的最低贡献设置为“0”并添加创建者地址“0x0ABC”
我贡献了 1 个具有相同地址“0x0ABC”的以太
然后我从混音副本中随机选择一个不同的地址并粘贴到我的 “创建请求” 我添加字符串“字符串” 数量“单位” 地址“0x0CCC”
当我单击 createRequest 时,我收到了上述错误;
【问题讨论】:
这可能是由您将构造函数值输入到 Remix 的方式引起的。请编辑您的问题并显示您如何在“部署和运行事务”选项卡中输入值。您是否将creator
地址放在引号中,是否用逗号分隔它们(如果您使用的是单行输入),...?
Hey Petr Hejda 这是我的编辑版本,请看一下..
【参考方案1】:
Solidity 当前 (v0.8) 不允许将“包含映射的结构”写入存储数组。但是你可以把它写成一个映射。
mapping (uint => Request) public requests; // changed to mapping
而不是
Request[] public requests; // original code
您将失去检索数组长度的能力。但是您已经将它保存在 numRequest
变量中,所以一切都很好。
【讨论】:
以上是关于SOLIDITY REMIX 编译器,在部署我的合约后收到此错误(无效的 BigNumber 字符串)的主要内容,如果未能解决你的问题,请参考以下文章
主网在 Remix Solidity 智能合约中部署地址数组作为构造函数参数不起作用