«Ожидалось «(» но получил идентификатор «

#blockchain #smartcontracts #remix

Вопрос:

 // SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

contract CrowdFunding 
{
    
    struct Investor
    {
        address addr;
        uint amount;
    }
    
    address public owner;       
    uint public NumOfInvestors; 
    uint public deadline;       
    string public status;       
    bool public isOver;         
    uint public goalAmount;     
    uint public totalAmount;    
    mapping (uint => Investor) public investors; 
    
    modifier onlyOwner () 
    {
        require(msg.sender == owner);
        _;
    }
    
    
    function crowdfunding(uint _duration, uint _goalAmount) public
    {
        owner == msg.sender;
        deadline = now   _duration;
        
        goalAmount = _goalAmount;
        status = "Funding";
        isOver = "false";
        NumOfInvestors = 0;
        totalAmount = 0;
    }
    
    
    function fund() payable public
    {
       
        require(!isOver);
        
        Investor inv = investors[NumOfInvestors  ]; 
        inv.addr = msg.sender;                      
        inv.amount = msg.value;                     
        totalAmount  = inv.amount;
    }
    
   
    function checkGoalReached () public onlyOwner 
    {
        
        
        require(!isOver);
        
        
        require(now >= deadline);
        
        if(totalAmount >= goalAmount) 
        {  
            status = "Campaign succeeded.";
            isOver = true;
            
            
            if(!owner.send(this.balance)) 
            {
                throw;
            }
            else 
            { 
                
                uint i = 0;
                status = "Campaign Failed.";
                isOver = true;
                
                while (i <= NumOfInvestors) 
                {
                    
                    if(!investors[i].addr.send(investors[i].amount)) 
                    {
                        throw;   
                    }
                    
                    i  ;
                }
            }
        }
        
        function kill() public onlyOwner 
        {
            selfdestrct(owner);
        }

    }
}
 

Я написал контракт, но получил ошибки в первой и второй строках функции kill().

Он показывает «Ожидаемый» («но получил идентификатор» в первой строке и » Ошибка анализа: несоответствующий ввод «{» ожидание { ‘;’ , ‘=’ } [неопределенно] » во второй строке.

Я дважды проверил структуру своего кода, а также прочитал несколько статей из StackOverflow.

Что касается проблем, показанных в первой строке, в этих статьях говорилось, что в них может отсутствовать «{» или «}». Но я точно не промахнулся. (Если я действительно скучал по ним, то я чертов дурак.

Что касается проблемы, показанной во второй строке, я просто не могу сказать, почему это неправильно. Будет ли это проблема с версией??

Пожалуйста, помогите мне. Молите о помощи.

Ответ №1:

Ваш

         function kill() public onlyOwner 
        {
            selfdestrct(owner);
        }
 

Внутри другой функции переместите ее наружу, и все будет работать. Пожалуйста, проверьте закрывающиеся тормозные колодки } .
Кроме того, вы захотите исправить опечатку selfdestruct

Вот рабочий код:

 // SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

contract CrowdFunding 
{
    
    struct Investor
    {
        address payable addr;
        uint amount;
    }
    
    address payable public owner;       
    uint public NumOfInvestors; 
    uint public deadline;       
    string public status;       
    bool public isOver;         
    uint public goalAmount;     
    uint public totalAmount;    
    mapping (uint => Investor) public investors; 
    
    modifier onlyOwner () 
    {
        require(msg.sender == owner);
        _;
    }
    
    
    function crowdfunding(uint _duration, uint _goalAmount) public
    {
        owner == msg.sender;
        deadline = block.timestamp   _duration;
        
        goalAmount = _goalAmount;
        status = "Funding";
        isOver = false;
        NumOfInvestors = 0;
        totalAmount = 0;
    }
    
    
    function fund() payable public
    {
       
        require(!isOver);
        
        Investor storage inv = investors[NumOfInvestors  ]; 
        inv.addr = payable(msg.sender);                      
        inv.amount = msg.value;                     
        totalAmount  = inv.amount;
    }
    
   
    function checkGoalReached () public onlyOwner 
    {
        
        
        require(!isOver);
        
        
        require(block.timestamp >= deadline);
        
        if(totalAmount >= goalAmount) 
        {  
            status = "Campaign succeeded.";
            isOver = true;
            
            address payable self = payable(address(this));
            uint256 balance = self.balance;
            if(!owner.send(balance)) 
            {
                revert();
            }
            else 
            { 
                
                uint i = 0;
                status = "Campaign Failed.";
                isOver = true;
                
                while (i <= NumOfInvestors) 
                {
                    
                    if(!investors[i].addr.send(investors[i].amount)) 
                    {
                        revert();   
                    }
                    
                    i  ;
                }
            }
        }
        
        

    }
        function kill() public onlyOwner 
        {
            selfdestruct(owner);
        }
}


 

Комментарии:

1. Но я проверил свои скобки, и все они расположены попарно. Можете ли вы показать мне, какую закрывающую скобку вы добавили?

2. да, я добавил рабочий пример

3. Добавлен пример хорошей компиляции в ремиксе