web3-starter-py/web3toolkit/scripts/get_contracts_deployed.py
mvonsteinkirch 58a160dcf5 💾
2022-12-26 18:15:56 -08:00

113 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
# author: steinkirch
import os
import ethereumetl
import pandas as pd
from utils.os import load_config, create_dir, run_exec
from utils.plots import plot_bar, open_csv, save_csv
def get_data_for_contracts_by_block() -> dict:
"""Prepare a dict of data to extract contracts by block."""
data = {}
create_dir('data')
env_keys = ['PROVIDER_URL',
'TX_FILE',
'START_BLOCK',
'OUTPUT_FILE']
env_vars = load_config(env_keys)
data['provider_uri'] = env_vars['PROVIDER_URL']
data['tx_file'] = env_vars['TX_FILE']
data['start_block'] = env_vars['START_BLOCK']
data['output_file'] = env_vars['OUTPUT_FILE']
# adding this manually
data['last_block_2015'] = 778482
data['last_block_2016'] = 2912406
data['last_block_2017'] = 4832685
data['last_block_2018'] = 6988614
data['last_block_2019'] = 9193265
data['last_block_2020'] = 11565018
data['last_block_2021'] = 13916165
data['last_block_2022'] = 15978869
data['buffer_for_chunk_size'] = 10000
return data
def export_blocks_and_transactions(end_block, data) -> dict:
"""Run ethereumetl export_blocks_and_transactions."""
run_exec(['ethereumetl', 'export_blocks_and_transactions', \
f'--start-block {data["start_block"]}', \
f'--end-block {end_block}', \
f'--provider-uri {data["provider_uri"]}', \
f'--transactions-output {data["tx_file"]}'])
txs = open_csv(data['tx_file'])
contracts = txs[txs['to_address'].isnull()]
os.remove(data['tx_file'])
return contracts + txs['from_address'].unique().tolist()
def get_contracts_by_block(data, year) -> dict:
"""Extract unique contracts by block for a given year."""
contracts = []
last_block_year = data[f'last_block_{year}']
start_block = int(data['start_block'])
end_block = start_block + 9999
while (end_block <= last_block_year + data['buffer_for_chunk_size']):
end_block_used = min(end_block, last_block_year)
contracts.append(export_blocks_and_transactions(end_block_used, data))
start_block += data['buffer_for_chunk_size']
end_block += data['buffer_for_chunk_size']
return contracts
def get_unique_contracts(contracts, year) -> None:
"""Extract and save a list of unique contracts."""
unique_contract = [*set(contracts)]
print(f"✅ Unique contract for {year})): {str(len(unique_contract))}")
return pd.DataFrame(unique_contract, columns=["contracts"])
if __name__ == "__main__":
###########
# Set up
###########
contracts_by_year = {}
all_contracts = pd.DataFrame()
years = list(range(2015, 2022))
data = get_data_for_contracts_by_block()
start_block = int(data['start_block'])
###########
# Get data
###########
for year in years:
contracts = get_contracts_by_block(data, year)
contracts_by_year[year] = len(contracts)
all_contracts.append(get_unique_contracts(contracts, year))
start_block += 1
all_contracts = all_contracts['contract_deployers'].unique()
all_contracts_df = pd.DataFrame(all_contracts, columns=['contract'])
save_csv(all_contracts_df, data['output_file'])
###########
# Plot data
###########
y_data = [y for y in contracts_by_year[year] if year == years.revers().pop()]
plot_bar({'contract deployed': y_data}, years)