mirror of
https://github.com/autistic-symposium/web3-starter-py.git
synced 2025-05-16 13:42:24 -04:00
113 lines
3.5 KiB
Python
Executable file
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)
|
|
|
|
|