-
Notifications
You must be signed in to change notification settings - Fork 0
/
Crowdfunding.sol
65 lines (54 loc) · 1.84 KB
/
Crowdfunding.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;
contract Crowdfunding {
address public manager;
uint public totalBalance;
uint public goal;
uint public donators;
bool public fundsTransferred = false;
enum Statuses {
Open,
Close
}
Statuses public currentStatus = Statuses.Open;
constructor(uint _goal) {
manager = msg.sender;
goal = _goal;
}
modifier isManager() {
require(manager == msg.sender, "Only the manager can call this function");
_;
}
modifier isOpen() {
require(currentStatus == Statuses.Open, "The Crowdfunding campaign is closed");
_;
}
function donate() public payable isOpen {
require(msg.value > 0, "Donation amount must be greater than 0");
totalBalance += msg.value;
donators++;
}
function withdrawFound() public isManager {
require(currentStatus == Statuses.Close, "The Crowdfunding campaign is not closed");
require(!fundsTransferred, "Funds already transferred");
(bool success, ) = payable(manager).call{value: totalBalance}("");
require(success, "Transfer failed");
fundsTransferred = true;
}
function closeCampain() public isManager isOpen{
require(checkGoalReached(), "Goal not reached yet");
currentStatus = Statuses.Close;
}
function checkGoalReached() public view returns (bool) {
return totalBalance >= goal;
}
function startNewCampain(uint _goal) public isManager {
require(currentStatus == Statuses.Close, "The Crowdfunding campaign is not closed");
require(fundsTransferred, "the funds have not yet been transferred");
totalBalance = 0;
donators = 0;
goal = _goal;
currentStatus = Statuses.Open;
fundsTransferred = false;
}
}