DeclarationError: Identifier not found or not unique. --> tests/4_Ballot_test.sol:66:9: | 66 | Request storage request = requests[index]; | ^^^^^^^

DeclarationError: Identifier not found or not unique. --> tests/4_Ballot_test.sol:66:9: | 66 | Request storage request = requests[index]; | ^^^^^^^

我发现我的代码中没有拼写错误,但它一直返回错误消息 - DeclarationError: Identifier not found or not unique。 --> tests/4_Ballot_test.sol:66:9: | 66 |请求存储request = requests[index]; | ^^^^^^^

函数 finalizeRequest 有相同的代码并且没有错误。谁能帮忙? 谢谢

// SPDX-License-Identifier: AFL-3.0

pragma solidity ^0.8.7;

contract 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;
}
}

contract Campaign {
    struct Request {
        string description;
        uint value;
        address recipient;
        bool complete;
        uint approvalCount;
        mapping(address => bool) approvals;
    }


uint numRequests;
mapping (uint => Request) 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{
            Request storage r = requests[numRequests++];
            r.description = description;
            r.value = value;
            r.recipient = recipient;
            r.complete = false;
            r.approvalsCount = 0;
        
    }
}

function approveRequest(uint index) {
    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) restricted {
    Request storage request = requests[index];
    
    require(request.approvalCount > (approversCount / 2));
    require(!request.complete);
    
    request.recipient.transfer(request.value);
    request.complete = true;
}
// SPDX-License-Identifier: AFL-3.0

pragma solidity ^0.8.7;

contract 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;
    }
}

contract Campaign {
    struct Request {
        string description;
        uint value;
        address payable recipient;
        bool complete;
        uint approvalCount;
        mapping(address => bool) approvals;
    }


    uint numRequests;
    mapping (uint => 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 payable recipient) public{
            Request storage r = requests[numRequests++];
            r.description = description;
            r.value = value;
            r.recipient = recipient;
            r.complete = false;
            r.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);
    
        request.recipient.transfer(request.value);
        request.complete = true;
    }
    
}

我修复了一些小问题,所以,您可以使用下面的代码。

// SPDX-License-Identifier: AFL-3.0

pragma solidity ^0.8.7;

contract CampaignFactory {
    address[] public deployedCampaigns;

    function createCampaign(uint256 minimum) public {
        address newCampaign = address(new Campaign(minimum, msg.sender));
        deployedCampaigns.push(newCampaign);
    }

    function getDeployedCampaigns() public view returns (address[] memory) {
        return deployedCampaigns;
    }
}

contract Campaign {
    struct Request {
        string description;
        uint256 value;
        address payable recipient;
        bool complete;
        uint256 approvalCount;
        mapping(address => bool) approvals;
    }

    uint256 numRequests;
    mapping(uint256 => Request) requests;
    address public manager;
    uint256 public minimumContribution;
    mapping(address => bool) public approvers;
    uint256 public approversCount;

    modifier restricted() {
        require(msg.sender == manager);
        _;
    }

    constructor(uint256 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,
        uint256 value,
        address payable recipient
    ) public {
        Request storage r = requests[numRequests++];
        r.description = description;
        r.value = value;
        r.recipient = recipient;
        r.complete = false;
        r.approvalCount = 0;
    }

    function approveRequest(uint256 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(uint256 index) restricted public {
        Request storage request = requests[index];

        require(request.approvalCount > (approversCount / 2));
        require(!request.complete);

        request.recipient.transfer(request.value);
        request.complete = true;
    }
}