-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathcontract.sol
More file actions
240 lines (214 loc) · 11.1 KB
/
Copy pathcontract.sol
File metadata and controls
240 lines (214 loc) · 11.1 KB
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
pragma solidity >=0.5.0 < 0.6.0;
contract TokenReward {
struct Member {
string name;
bool isWhitelisted;
uint8 accumulatedPoints;
uint8 rating;
}
//Mappings
address owner;//declaring state variable owner
mapping(address => Member) public members;//each Member is recognised by an address
mapping(address => uint ) public reward;//captures the reward in uint of each address
mapping(address => bool ) public admins;//captures the addresses that are admins or not
mapping(address => uint ) public balances;//captures the balances in uint of each address
//Events
event Whitelisted(address indexed _member, string _name);//Triggers a searchable whitelisted member.
event Blacklisted(address indexed _member, string _name);//Triggers a searchable blacklisted member.
event NewReward(address indexed _member, uint reward);//Triggers a searchable rewarded member with amount of reward.
event NewRating(address indexed _ratedBy, address indexed _memberRated, uint rating);//Populates searchable rated member with rating.
//Modifiers
modifier OnlyOwner() {
require(msg.sender == owner, "Only contract owner is allowed to call this function");
_;//This allows only the owner to make changes
}
modifier OnlyAdminOrOwner() {
require(admins[msg.sender] == true, "Only admins or contract owner is allowed to call this function");
_;//This allows only admin or owner to make changes
}
modifier IsWhitelisted(address __member) {
Member memory memberStruct = members[__member];//Any member that is whitelisted is now called memberStruct
require(memberStruct.isWhitelisted == true, "This address is not whitelisted");
_;//This allows only whitelisted member to make changes
}
//Initializing permissions for both the creator and admins
constructor () public {
owner = msg.sender;
admins[msg.sender] = true;
}
//This function adds a new Admin and can be called only by the owner
// It's convention (but not required) to start function parameter
// variable names with an underscore (_) in order to differentiate them from global variables.
function _addAdmin(address __newAdmin) public OnlyOwner returns(bool) {
admins[__newAdmin] = true;
return true;
}
//This function adds a new member to the whitelist and emits the event
//and can be called only by admins and the owner.
function _AddMember(address __member, string memory __memberName) public OnlyAdminOrOwner returns(bool) {
Member memory __memberStruct;
__memberStruct.name = __memberName;
__memberStruct.isWhitelisted = true;
members[__member] = __memberStruct;
emit Whitelisted(__member, __memberStruct.name);
return true;
}
//This function blacklist a member and can be called only by admins and the owner
function _blackListMember(address __member) public OnlyAdminOrOwner returns(bool) {
Member storage memberStruct = members[__member];
memberStruct.isWhitelisted = false;
emit Blacklisted(__member, memberStruct.name);
return true;
}
// This function checks if a member is whitelisted or not
function _isWhitelisted(address __member)internal view returns(bool) {
Member memory memberStruct = members[__member];
return memberStruct.isWhitelisted;
}
//This function rate a member and can be called by whitelisted members
function _rateMember(address __membertorate) public IsWhitelisted(__membertorate) returns(bool) {
Member storage __memberStruct = members[__membertorate];
uint8 ratingPoint;
require(admins[msg.sender] || _isWhitelisted(msg.sender), "You're not qualified to rate any member");
if (admins[msg.sender]) {
ratingPoint = 3;
}
if (members[__membertorate].rating == 5) {
ratingPoint = 2;
} else {
ratingPoint = 1;
}
__memberStruct.accumulatedPoints = __memberStruct.accumulatedPoints + ratingPoint;
(uint8 __memberPoint, uint8 __starRating) = _calculateReward(__memberStruct.accumulatedPoints, __memberStruct.rating);
__memberStruct.accumulatedPoints = __memberPoint;
__memberStruct.rating = __starRating;
emit NewRating(msg.sender, __membertorate, ratingPoint);
return true;
}
//This function rewards members
function _rewardMember(address __memberToReward) public OnlyAdminOrOwner returns(bool) {
require(admins[__memberToReward] == false, "admins cannot be rewarded tokens");
require(members[__memberToReward].rating >= 3, "member do not have a proven track record");
balances[__memberToReward] = balances[__memberToReward] + 2;
return true;
}
//This function helps calculate the members' reward base on point scored and star rating
function _calculateReward(uint8 __pointsScored, uint8 __starRating) internal pure returns(uint8, uint8) {
if (__pointsScored < 10 ) {
return (__pointsScored, __starRating);
}
uint8 __pointremained = __pointsScored % uint8(15);
if (__starRating < 5) {
uint8 currentStarRating = __starRating + uint8(1);
return (__pointremained, currentStarRating);
}
return (__pointremained, __starRating);
}
}
pragma solidity >=0.5.0 < 0.6.0;
contract TokenReward {
struct Member {
string name;
bool isWhitelisted;
uint8 accumulatedPoints;
uint8 rating;
}
//Mappings
address owner;//declaring state variable owner
mapping(address => Member) public members;//each Member is recognised by an address
mapping(address => uint ) public reward;//captures the reward in uint of each address
mapping(address => bool ) public admins;//captures the addresses that are admins or not
mapping(address => uint ) public balances;//captures the balances in uint of each address
//Events
event Whitelisted(address indexed _member, string _name);//Triggers a searchable whitelisted member.
event Blacklisted(address indexed _member, string _name);//Triggers a searchable blacklisted member.
event NewReward(address indexed _member, uint reward);//Triggers a searchable rewarded member with amount of reward.
event NewRating(address indexed _ratedBy, address indexed _memberRated, uint rating);//Populates searchable rated member with rating.
//Modifiers
modifier OnlyOwner() {
require(msg.sender == owner, "Only contract owner is allowed to call this function");
_;//This allows only the owner to make changes
}
modifier OnlyAdminOrOwner() {
require(admins[msg.sender] == true, "Only admins or contract owner is allowed to call this function");
_;//This allows only admin or owner to make changes
}
modifier IsWhitelisted(address __member) {
Member memory memberStruct = members[__member];//Any member that is whitelisted is now called memberStruct
require(memberStruct.isWhitelisted == true, "This address is not whitelisted");
_;//This allows only whitelisted member to make changes
}
//Initializing permissions for both the creator and admins
constructor () public {
owner = msg.sender;
admins[msg.sender] = true;
}
//This function adds a new Admin and can be called only by the owner
// It's convention (but not required) to start function parameter
// variable names with an underscore (_) in order to differentiate them from global variables.
function _addAdmin(address __newAdmin) public OnlyOwner returns(bool) {
admins[__newAdmin] = true;
return true;
}
//This function adds a new member to the whitelist and emits the event
//and can be called only by admins and the owner.
function _AddMember(address __member, string memory __memberName) public OnlyAdminOrOwner returns(bool) {
Member memory __memberStruct;
__memberStruct.name = __memberName;
__memberStruct.isWhitelisted = true;
members[__member] = __memberStruct;
emit Whitelisted(__member, __memberStruct.name);
return true;
}
//This function blacklist a member and can be called only by admins and the owner
function _blackListMember(address __member) public OnlyAdminOrOwner returns(bool) {
Member storage memberStruct = members[__member];
memberStruct.isWhitelisted = false;
emit Blacklisted(__member, memberStruct.name);
return true;
}
// This function checks if a member is whitelisted or not
function _isWhitelisted(address __member)internal view returns(bool) {
Member memory memberStruct = members[__member];
return memberStruct.isWhitelisted;
}
//This function rate a member and can be called by whitelisted members
function _rateMember(address __membertorate) public IsWhitelisted(__membertorate) returns(bool) {
Member storage __memberStruct = members[__membertorate];
uint8 ratingPoint;
require(admins[msg.sender] || _isWhitelisted(msg.sender), "You're not qualified to rate any member");
if (admins[msg.sender]) {
ratingPoint = 3;
}
if (members[__membertorate].rating == 5) {
ratingPoint = 2;
} else {
ratingPoint = 1;
}
__memberStruct.accumulatedPoints = __memberStruct.accumulatedPoints + ratingPoint;
(uint8 __memberPoint, uint8 __starRating) = _calculateReward(__memberStruct.accumulatedPoints, __memberStruct.rating);
__memberStruct.accumulatedPoints = __memberPoint;
__memberStruct.rating = __starRating;
emit NewRating(msg.sender, __membertorate, ratingPoint);
return true;
}
//This function rewards members
function _rewardMember(address __memberToReward) public OnlyAdminOrOwner returns(bool) {
require(admins[__memberToReward] == false, "admins cannot be rewarded tokens");
require(members[__memberToReward].rating >= 3, "member do not have a proven track record");
balances[__memberToReward] = balances[__memberToReward] + 2;
return true;
}
//This function helps calculate the members' reward base on point scored and star rating
function _calculateReward(uint8 __pointsScored, uint8 __starRating) internal pure returns(uint8, uint8) {
if (__pointsScored < 10 ) {
return (__pointsScored, __starRating);
}
uint8 __pointremained = __pointsScored % uint8(15);
if (__starRating < 5) {
uint8 currentStarRating = __starRating + uint8(1);
return (__pointremained, currentStarRating);
}
return (__pointremained, __starRating);
}
}