-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDemocracy.sol
161 lines (140 loc) · 5.53 KB
/
Democracy.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
pragma solidity ^0.4.8;
contract Democracy {
struct Proposal{
bytes32 name;
}
struct Ballot{
bytes32 name;
address chainperson;
bool blind;
bool finished;
}
struct votedData{
uint256 proposal;
bool isVal;
}
event Vote(
address votedPerson,
uint256 proposalIndex
);
event Finish(
bool finished
);
mapping (address => mapping(uint256 => mapping(address => votedData))) votedDatas;
mapping (address => mapping(uint256 => address[])) voted;
mapping (address => mapping(uint256 => mapping(uint256 => uint256))) voteCount;
mapping (address => Ballot[]) public ballots;
mapping (address => mapping(uint256 => Proposal[])) public proposals;
function getBallotsNum(address chainperson) public constant returns (uint count) {
return ballots[chainperson].length;
}
function getProposalsNum(address chainperson, uint ballot) public constant returns (uint count) {
return proposals[chainperson][ballot].length;
}
function getBallotIndex(address chainperson, bytes32 ballotName) public constant returns (uint index){
for (uint i=0;i<ballots[chainperson].length;i++){
if (ballots[chainperson][i].name == ballotName){
return i;
}
}
}
function isVoted(address chainperson, uint ballot) public constant returns (bool result){
for (uint8 i=0;i<voted[chainperson][ballot].length;i++){
if (voted[chainperson][ballot][i] == msg.sender){
return true;
}
}
return false;
}
function startNewBallot(bytes32 ballotName, bool blindParam, bytes32[] proposalNames) external returns (bool success){
for (uint8 y=0;y<ballots[msg.sender].length;y++){
if (ballots[msg.sender][i].name == ballotName){
revert();
}
}
ballots[msg.sender].push(Ballot({
name: ballotName,
chainperson: msg.sender,
blind: blindParam,
finished: false
}));
uint ballotsNum = ballots[msg.sender].length;
for (uint8 i=0;i<proposalNames.length;i++){
proposals[msg.sender][ballotsNum-1].push(Proposal({name:proposalNames[i]}));
}
return true;
}
function getVoted(address chainperson, uint256 ballot) public constant returns (address[]){
if (ballots[chainperson][ballot].blind == true){
revert();
}
return voted[chainperson][ballot];
}
function getVotesCount(address chainperson, uint256 ballot, bytes32 proposalName) public constant returns (uint256 count){
if (ballots[chainperson][ballot].blind == true){
revert();
}
for (uint8 i=0;i<proposals[chainperson][ballot].length;i++){
if (proposals[chainperson][ballot][i].name == proposalName){
return voteCount[chainperson][ballot][i];
}
}
}
function getVotedData(address chainperson, uint256 ballot, address voter) public constant returns (uint256 proposalNum){
if (ballots[chainperson][ballot].blind == true){
revert();
}
if (votedDatas[chainperson][ballot][voter].isVal == true){
return votedDatas[chainperson][ballot][voter].proposal;
}
}
function vote(address chainperson, uint256 ballot, uint256 proposalNum) external returns (bool success){
if (ballots[chainperson][ballot].finished == true){
revert();
}
for (uint8 i = 0;i<voted[chainperson][ballot].length;i++){
if (votedDatas[chainperson][ballot][msg.sender].isVal == true){
revert();
}
}
voted[chainperson][ballot].push(msg.sender);
voteCount[chainperson][ballot][proposalNum]++;
votedDatas[chainperson][ballot][msg.sender] = votedData({proposal: proposalNum, isVal: true});
Vote(msg.sender, proposalNum);
return true;
}
function getProposalIndex(address chainperson, uint256 ballot, bytes32 proposalName) public constant returns (uint index){
for (uint8 i=0;i<proposals[chainperson][ballot].length;i++){
if (proposals[chainperson][ballot][i].name == proposalName){
return i;
}
}
}
function finishBallot(bytes32 ballot) external returns (bool success){
for (uint8 i=0;i<ballots[msg.sender].length;i++){
if (ballots[msg.sender][i].name == ballot) {
if (ballots[msg.sender][i].chainperson == msg.sender){
ballots[msg.sender][i].finished = true;
Finish(true);
return true;
} else {
return false;
}
}
}
}
function getWinner(address chainperson, uint ballotIndex) public constant returns (bytes32 winnerName){
if (ballots[chainperson][ballotIndex].finished == false){
revert();
}
uint256 maxVotes;
bytes32 winner;
for (uint8 i=0;i<proposals[chainperson][ballotIndex].length;i++){
if (voteCount[chainperson][ballotIndex][i]>maxVotes){
maxVotes = voteCount[chainperson][ballotIndex][i];
winner = proposals[chainperson][ballotIndex][i].name;
}
}
return winner;
}
}