Contract rewards
Created On | NaN secs ago - Invalid Date UTC+0 |
Contract Code
1
import election_house
2
__S = Hash(contract='rewards', name='S')
3
4
5
def ____(initial_split: list=[decimal('0.44'), decimal('0.44'), decimal(
6
'0.01'), decimal('0.01'), decimal('0.1')], master_contract=
7
'masternodes', delegate_contract='delegates', election_max_length=
8
datetime.DAYS * 1):
9
__S['value'] = initial_split
10
__S['master_contract'] = master_contract
11
__S['delegate_contract'] = delegate_contract
12
__S['election_max_length'] = election_max_length
13
__S['vote_count'] = 0
14
__reset_current_votes()
15
16
17
def __reset_current_votes():
18
__S['current_votes', 'masternodes'] = 0
19
__S['current_votes', 'delegates'] = 0
20
__S['current_votes', 'blackhole'] = 0
21
__S['current_votes', 'foundation'] = 0
22
__S['current_votes', 'developer'] = 0
23
24
25
@__export('rewards')
26
def current_value():
27
return __S['value']
28
29
30
@__export('rewards')
31
def vote(vk: str, obj: list):
32
if __S['election_start'] is None:
33
total_nodes = len(election_house.current_value_for_policy(__S[
34
'master_contract'])) + len(election_house.
35
current_value_for_policy(__S['delegate_contract']))
36
__S['vote_count'] = 0
37
__S['min_votes_required'] = total_nodes * 2 // 3 + 1
38
__S['election_start'] = now
39
__S.clear('has_voted')
40
__reset_current_votes()
41
__tally_vote(vk, obj)
42
else:
43
__tally_vote(vk, obj)
44
if __election_is_over():
45
__update_value()
46
__S['election_start'] = None
47
48
49
def __update_value():
50
masternode_votes = __S['current_votes', 'masternodes'] or 1
51
delegate_votes = __S['current_votes', 'delegates'] or 1
52
blackhole_votes = __S['current_votes', 'blackhole'] or 1
53
foundation_votes = __S['current_votes', 'foundation'] or 1
54
developer_votes = __S['current_votes', 'developer'] or 1
55
total_votes = (masternode_votes + delegate_votes + blackhole_votes +
56
foundation_votes + developer_votes)
57
mn = masternode_votes / total_votes
58
dl = delegate_votes / total_votes
59
bh = blackhole_votes / total_votes
60
fd = foundation_votes / total_votes
61
dv = developer_votes / total_votes
62
__S['value'] = [mn, dl, bh, fd, dv]
63
64
65
def __election_is_over():
66
return __S['vote_count'] >= __S['min_votes_required'] or now - __S[
67
'election_start'] >= __S['election_max_length']
68
69
70
def __tally_vote(vk: str, obj: list):
71
__validate_vote(vk, obj)
72
a, b, c, d, e = obj
73
__S['current_votes', 'masternodes'] += a
74
__S['current_votes', 'delegates'] += b
75
__S['current_votes', 'blackhole'] += c
76
__S['current_votes', 'foundation'] += d
77
__S['current_votes', 'developer'] += e
78
__S['has_voted', vk] = True
79
__S['vote_count'] += 1
80
81
82
def __validate_vote(vk: str, obj: list):
83
assert vk in election_house.current_value_for_policy(__S['master_contract']
84
) or vk in election_house.current_value_for_policy(__S[
85
'delegate_contract']), 'Not allowed to vote!'
86
assert type(obj) == list, 'Pass a list!'
87
assert len(obj) == 5, 'Must have 5 elements!'
88
s = 0
89
for o in obj:
90
assert int(o) >= 0, 'No non-negative numbers!'
91
s += o
92
assert s == 100, 'Elements must add to 100!'
93
assert __S['has_voted', vk] is None, 'VK has already voted!'
94