-
Notifications
You must be signed in to change notification settings - Fork 0
/
SmartVoting.sol
75 lines (63 loc) · 2.21 KB
/
SmartVoting.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
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SmartVoting{
struct Candidate{
string name;
address canAddress;
uint numVotes;
}
struct Voter{
string name;
bool authorised;
bool voted;
uint who;
}
address public owner ;
string public electionName;
mapping(address => Voter) public voters;
Candidate[] public candidates;
uint public totalVotes;
function startElection(string memory _electionName) public{
owner = msg.sender;
electionName = _electionName;
}
function addCandidate(string memory _newCandidate, address _canAddress) onlyOwner public {
candidates.push(Candidate(_newCandidate,_canAddress,0));
}
// function authorizeVoter(address _voterAddress) onlyOwner public {
// voters[_voterAddress].authorised = true;
// voters[_voterAddress].voted = false;
// }
function enrollVoter(address _voterAddress, string memory _voterName) public payable{
require(msg.value >= 10e16,"Atleast 0.1Eth Required to become Voter!");
voters[_voterAddress].name = _voterName;
voters[_voterAddress].authorised = true;
voters[_voterAddress].voted = false;
}
function getNumCandidates() public view returns(uint) {
return candidates.length;
}
function voting(uint _index) public {
require(voters[msg.sender].authorised == true ,"You are Not a VOTER..");
require(voters[msg.sender].voted == false ,"You Have Already VOTED..");
voters[msg.sender].who = _index;
voters[msg.sender].voted = true;
candidates[_index].numVotes++;
totalVotes++;
}
function endVoting() public onlyOwner returns(string memory _winner) {
Candidate memory winner = candidates[0];
for(uint i=0;i<candidates.length;i++){
if(winner.numVotes < candidates[i].numVotes){
winner = candidates[i];
}
}
(bool success,) = winner.canAddress.call{value: address(this).balance}("");
require(success,"Failed to Declare Win..");
return winner.name;
}
modifier onlyOwner{
require(owner==msg.sender);
_;
}
}