admin管理员组文章数量:1357672
I am new to Solidity and am trying to add a struct containing a mapping to an array. However, this fails. When I run this on Remix I get a message transact to CampaignFactory.createCampaign pending ... and this goes on forever. When I try calling this contract via my JS test file I get an error Error happened while trying to execute a function inside a smart contract. The following is my code:-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract CampaignFactory{
address payable [] public deployedCampaigns;
function createCampaign(uint minimum) public{
address newCampaign = address(new Campaign(minimum,msg.sender));
deployedCampaigns.push(payable(newCampaign));
}
function getDeployedCampaigns()public view returns (address payable [] memory){
return deployedCampaigns;
}
}
contract Campaign{
struct Request{
string description;
uint value;
address payable 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++;
}
function createRequest(string memory description, uint value, address recipient) public restricted{
Request storage newRequest = requests.push();
newRequest.description = description;
newRequest.value = value;
newRequest.recipient = payable (recipient);
newRequestplete = 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 payable {
Request storage request = requests[index];
require(!requestplete);
require(request.approvalCount>approversCount/2);
request.recipient.transfer(request.value);
requestplete = true;
}
}
I also tried an alternative way that was something like this:-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract CampaignFactory {
address payable[] public deployedCampaigns;
function createCampaign(uint minimum) public {
address newCampaign = address(new Campaign(minimum, msg.sender));
deployedCampaigns.push(payable(newCampaign));
}
function getDeployedCampaigns() public view returns (address payable[] memory) {
return deployedCampaigns;
}
}
contract Campaign {
struct Request {
string description;
uint value;
address recipient;
bool complete;
uint approvalCount;
mapping(address => bool) approvals;
}
uint requestNum;
Request[] public requests;
address public manager;
uint public minimumContribution;
mapping(address => bool) public approvers;
uint public approversCount;
modifier restricted() {
require(msg.sender == manager, "Only manager can call this function");
_;
}
constructor (uint minimum, address creator) {
manager = creator;
minimumContribution = minimum;
}
function contribute() public payable {
require(msg.value > minimumContribution);
approvers[msg.sender] = true;
approversCount++;
}
event RequestCreated(string description, uint value, address recipient);
function createRequest(string memory description, uint value, address recipient) public restricted {
Request storage newRequest = requests[requestNum];
newRequest.description = description;
newRequest.value = value;
newRequest.recipient = recipient;
newRequestplete = false;
newRequest.approvalCount = 0;
requestNum++;
emit RequestCreated(description, value, recipient);
}
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(!requestplete);
payable(request.recipient).transfer(request.value);
requestplete = true;
}
function getSummary() public view returns (
uint, uint, uint, uint, address
) {
return (
minimumContribution,
address(this).balance,
requests.length,
approversCount,
manager
);
}
function getRequest(uint index) public view returns (string memory description, uint value, address recipient, bool complete, uint approvalCount) {
Request storage request = requests[index];
return (
request.description,
request.value,
request.recipient,
requestplete,
request.approvalCount
);
}
function getRequestsCount() public view returns (uint) {
return requests.length;
}
}
But even this gives the same result. Please help. Thank you in advance.
本文标签: ethereumError in adding a struct containing a mapping in an array in solidityStack Overflow
版权声明:本文标题:ethereum - Error in adding a struct containing a mapping in an array in solidity - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744080002a2587454.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论