-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCrowdFund.sol
112 lines (86 loc) · 3.19 KB
/
CrowdFund.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
contract CrowdFunding{
mapping(address => uint) public contributors;
address public admin;
uint public noOfContributors;
uint public minAmount;
uint public goal;
uint public amountRaised;
uint public deadline;
struct Request{
string description;
uint value;
uint noOfVoters;
address payable recipeint;
bool completed;
mapping(address => bool) voters;
}
mapping(uint => Request) requests;
uint public numOfRequests;
event ContributeEvent(address _sender, uint _value);
event CreateRequestEvent(string _description, address _recipient, uint _value);
event MakePaymentEvent(address _recipient, uint _value);
constructor(uint _goal, uint _deadline){
goal = _goal;
deadline = block.timestamp + _deadline;
minAmount = 1000;
admin = msg.sender;
}
function contribute() public payable{
require(block.timestamp < deadline);
require(msg.value >= minAmount);
if(contributors[msg.sender] == 0){
noOfContributors++;
}
contributors[msg.sender] += msg.value;
amountRaised += msg.value;
emit ContributeEvent(msg.sender, msg.value);
}
receive() payable external{
contribute();
}
function getBalance() public view returns(uint){
return address(this).balance;
}
function getRefund() public{
require(block.timestamp > deadline && amountRaised < goal);
require(contributors[msg.sender] > 0);
address payable recipeint = payable(msg.sender);
uint value = contributors[msg.sender];
recipeint.transfer(value);
contributors[msg.sender] = 0;
}
modifier onlyAdmin{
require(msg.sender == admin);
_;
}
function createRequest(string memory _description, address payable _recipeint, uint _value) public onlyAdmin{
require(block.timestamp >= deadline, "Campaign has not finished yet!");
require(amountRaised >= goal);
Request storage request = requests[numOfRequests];
numOfRequests++;
request.description = _description;
request.recipeint = _recipeint;
request.value = _value;
request.completed = false;
request.noOfVoters = 0;
emit CreateRequestEvent(_description, _recipeint, _value);
}
function voteRequest(uint _requestNo) public {
require(contributors[msg.sender] > 0);
Request storage thisRequest = requests[_requestNo];
require(thisRequest.voters[msg.sender] == false);
thisRequest.voters[msg.sender] = true;
thisRequest.noOfVoters++;
}
function makePayment(uint _requestNo) public onlyAdmin{
require(amountRaised >= goal);
Request storage thisRequest = requests[_requestNo];
require(thisRequest.completed == false);
require(thisRequest.noOfVoters > noOfContributors / 2);
thisRequest.recipeint.transfer(thisRequest.value);
thisRequest.completed = true;
emit MakePaymentEvent(thisRequest.recipeint, thisRequest.value);
}
}