Skip to content

Instantly share code, notes, and snippets.

@erikreppel
Created August 10, 2023 14:55
Show Gist options
  • Save erikreppel/adc582344ee87b0b2a49707b927efb7a to your computer and use it in GitHub Desktop.
Save erikreppel/adc582344ee87b0b2a49707b927efb7a to your computer and use it in GitHub Desktop.
cryo event parsing
import pandas as pd
from pathlib import Path
from web3.types import LogReceipt
from web3._utils.events import get_event_data
from eth_utils import to_hex
from web3._utils.abi import build_default_registry
from eth_abi.codec import ABICodec
def read_parquet_glob(folder):
data_dir = Path(folder)
return pd.concat(
pd.read_parquet(parquet_file)
for parquet_file in data_dir.glob('*.parquet')
)
def decode_events_df(df, abi):
codec = ABICodec(build_default_registry())
def process_row(row):
receipt = LogReceipt(
address=to_hex(row["contract_address"]),
blockNumber=row["block_number"],
blockHash="",
data=row["data"],
logIndex=row["log_index"],
topic=row["topic0"],
topics=[row[f"topic{i}"] for i in range(4)],
transactionHash=row["transaction_hash"],
transactionIndex=row["transaction_index"],
)
out = get_event_data(codec, abi, receipt)
# print(out)
d = {k: out["args"][k] for k in [event["name"] for event in abi["inputs"]]}
return pd.Series(d.values())
processed = df.apply(process_row, axis=1)
processed.columns = [e["name"] for e in abi["inputs"]]
return processed
# usage:
df = read_parquet_glob("./data")
abi = ... # json form abi
df = decode_events_df(df, abi)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment