-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetTokenDistributionETHMonthly.py
57 lines (51 loc) · 2.04 KB
/
getTokenDistributionETHMonthly.py
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
#import libaries
import pandas as pd
import numpy as np
from web3 import Web3, HTTPProvider
import json
from enum import Enum
from multiprocessing import Process
import numpy as np
from os.path import exists
#url of Ethereum node
urlETH = ""
#connect to Ethereum client
w3 = Web3(HTTPProvider(urlETH))
tokens =pd.read_csv('data/general/govInfoETH.csv',sep='\t')[-8:]
tokens =tokens[tokens['delegation']=='R']
tokens =tokens[tokens['name']=='Gas']
class Decimals(Enum):
ETH = 18
def getDataFromNodeHolder(holders,w3,directory,token,address,blocks):
abi = json.load(open('abi/COMP.abi'))
contract = w3.eth.contract(address=w3.to_checksum_address(address), abi=abi)
tokenDistribution=[]
decimals = contract.functions.decimals().call()
for holder in holders:
holder0 = "0x"+ holder[3:]
for block in blocks:
try:
data = contract.functions.balanceOf(w3.to_checksum_address(holder0)).call({}, block)
tokenDistribution.append({'holder':holder0,'block':block,'balance':data})
except:
pass
tokenDistributionDF = pd.DataFrame.from_records(tokenDistribution).reindex()
tokenDistributionDF['balance'] = tokenDistributionDF['balance'].apply(lambda x: x/(10**decimals))
tokenDistributionDF=tokenDistributionDF[tokenDistributionDF['balance']>0]
tokenDistributionDF.to_pickle(directory+token.lower()+'.pkl')
directory ="data/tokenDistMontly/"
processes = []
for idx,row in tokens.iterrows():
blocksMonthly =pd.read_pickle("data/time/blocksMonthly.p")
blocks = blocksMonthly.number.tolist()[1:]
tokenDistribution={}
holderstemp= pd.read_csv("data/holders/"+row['token'].lower()+".csv",delimiter ="\t",names=['holder'])
holders = holderstemp['holder'].values.tolist()
p = Process(target=getDataFromNodeHolder, args=(holders,w3,directory,row['token'],row['address'],blocks), )
processes.append(p)
# start process
p.start()
# join processes
for process in processes:
process.join()
processes.remove(process)