#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. Добавлен пример хорошей компиляции в ремиксе