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