compiler-errors - SOLIDITY REMIX 编译器,在部署我的合约后收到此错误(无效的 BigNumber 字符串)
问题描述
我正在研究我的 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
实用性 >0.4.17 <0.8.0;
合同 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] 来自:0x5B3...eddC4to:Campaign.creatRequest(string,uint256,address) 0x7b9...b6AcEvalue:0 weidata:0x83e...00000logs:0hash:0x8d9...a5ccb 交易到 Campaign.creatRequest 错误: VM 错误:操作码无效。无效的操作码 执行可能已经抛出。调试事务以获取更多信息。
所以我做的步骤:
将我的最低贡献设置为“0”并添加创建者地址“0x0ABC”
我贡献了 1 个具有相同地址“0x0ABC”的以太币
我从混音副本中选择一个随机不同的地址并粘贴到我的“createRequest”中我添加字符串“string”数量“uint”地址“0x0CCC”
当我单击 createRequest 时,我收到上面提到的这个错误;
解决方案
Solidity 当前(v0.8)不允许将“包含映射的结构”写入存储数组。但是你可以把它写成一个映射。
mapping (uint => Request) public requests; // changed to mapping
代替
Request[] public requests; // original code
您将失去检索数组长度的能力。但是您已经将它保存在numRequest
变量中,所以一切都很好。
推荐阅读
- node.js - MongoDB:具有数组输入的复杂查询
- python - QGroupBox 中的 QButton 布局,用于在 PyQt5 中制作 UI
- isabelle - 如何使用 get 使前向消除证明更易于阅读?
- laravel - 验证永远不起作用
- nginx - osrm 无效的网址
- javascript - 记录邮递员运行数据(cvs)参数
- python-3.6 - 在 Ubuntu 18.04 上导入时出现问题
- javascript - React 的差异算法如何处理元素列表?
- javascript - RecordRTC 错误:MediaRecorder API 似乎无法录制 mimeType:audio/wav
- c# - jquery ajax 发布数据在控制器处始终为 Null