-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgetIdentityRewardsByEpoch.py
More file actions
106 lines (98 loc) · 3.09 KB
/
Copy pathgetIdentityRewardsByEpoch.py
File metadata and controls
106 lines (98 loc) · 3.09 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
#!/usr/bin/env python3
import argparse
import requests
import logging
from string import Template
import json
import sys
endpoint = 'https://try-rpc.mainnet.solana.blockdaemon.tech'
EPOCH_SLOTS = 432000
def parseArguments():
parser = argparse.ArgumentParser()
parser.add_argument('--epoch',
dest='epoch',
nargs='+')
parser.add_argument('--identity',
dest='identity',
type=str)
return parser.parse_args()
def GetLeaderSchedule(slot_number, identity, endpoint):
t = Template("""
{
"jsonrpc": "2.0",
"id": 1,
"method": "getLeaderSchedule",
"params": [
$slot,
{
"identity": "$identity"
}
] }
""")
payload = t.substitute(slot=slot_number, identity=identity)
try:
response = requests.post(endpoint, json=json.loads(payload)).json()
except requests.exceptions.RequestException as e:
logging.error('Check connection {}'.format(e))
sys.exit()
if response.get('error'):
logging.error('Check endpoint {}'.format(response))
sys.exit()
if not response.get('result'):
logging.error('Can\'t get {}'.format(response))
sys.exit()
return response['result']
def GetBlock(block_number, endpoint):
t = Template("""
{
"jsonrpc": "2.0",
"id":1,
"method":"getBlock",
"params": [
$block_number,
{
"encoding": "json",
"maxSupportedTransactionVersion":0,
"transactionDetails":"full"
}
]}
""")
payload = t.substitute(block_number=block_number)
try:
response = requests.post(endpoint, json=json.loads(payload)).json()
except requests.exceptions.RequestException as e:
logging.error('Check connection {}'.format(e))
sys.exit()
if response.get('error'):
logging.error('Check endpoint {}'.format(response))
return
if not response.get('result'):
logging.error('Can\'t get {}'.format(response))
sys.exit()
return response['result']['transactions']
def GetRewardsFromBlock(block):
rewards = 0
for t in block:
rewards = rewards + int(t['meta']['fee'])
return rewards/1E9/2
def main():
args = parseArguments()
for epoch in args.epoch:
print('Epoch: {}'.format(epoch))
print('='*20)
leader_schedule = GetLeaderSchedule(int(epoch)*EPOCH_SLOTS, args.identity, endpoint)
total_rewards = 0
for slot in leader_schedule[args.identity]:
block = GetBlock(int(epoch)*EPOCH_SLOTS+slot, endpoint)
if block is None:
rewards_block = 0
else:
rewards_block = GetRewardsFromBlock(block)
print('Slot: {}, Rewards: {} SOL'.format(int(epoch)*EPOCH_SLOTS+slot, rewards_block))
total_rewards = total_rewards + rewards_block
print('='*20)
print('Total Slots: {}'.format(len(leader_schedule[args.identity])))
print('Total Rewards: {} SOL'.format(total_rewards))
print('\n')
if __name__ == "__main__":
main()