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智能合约并部署上链

Remix-IDE

主网在 Remix Solidity 智能合约中部署地址数组作为构造函数参数不起作用

Solidity开发神器Remix

初识SolidityRemix与Geth节点结合部署智能合约

“指定的输入源无效” - Remix Solidity IDE 错误