From 6edad6e510b006a503d6d4951bac1b1345de8ad3 Mon Sep 17 00:00:00 2001 From: tim Date: Thu, 25 Sep 2025 18:39:29 -0400 Subject: [PATCH] uniswap v4 gas histogram --- research/uniswap4-gas.png | Bin 0 -> 21753 bytes research/uniswap4_gas.py | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 research/uniswap4-gas.png create mode 100644 research/uniswap4_gas.py diff --git a/research/uniswap4-gas.png b/research/uniswap4-gas.png new file mode 100644 index 0000000000000000000000000000000000000000..d3864c69db220a786a6e612ae057d5aa9d6202a9 GIT binary patch literal 21753 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 Hr!N05zHh3X literal 0 HcmV?d00001 diff --git a/research/uniswap4_gas.py b/research/uniswap4_gas.py new file mode 100644 index 0000000..a7fb86e --- /dev/null +++ b/research/uniswap4_gas.py @@ -0,0 +1,73 @@ +import logging +import sys +from time import sleep + +import pandas as pd +from web3 import Web3 + +log = logging.getLogger(__name__) + + +def process_transaction(tx, w3): + if ( + # tx['to'] and + # tx['to'].lower() == '0xA51afAFe0263b40EdaEf0Df8781eA9aa03E381a3'.lower() and + tx['input'].startswith(bytes.fromhex('3593564c')) and + (receipt := w3.eth.get_transaction_receipt(tx.hash))['status'] == 1 + ): + return receipt['gasUsed'] + return None + + +if __name__ == '__main__': + if len(sys.argv) != 2: + print('Usage: python uniswap4_gas.py ') + rpc_url = sys.argv[1] + logging.basicConfig(level=logging.INFO) + log.setLevel(logging.DEBUG) + + num_blocks = 10000 + w3 = Web3(Web3.HTTPProvider(rpc_url, request_kwargs={'timeout':15})) + gas_data = pd.DataFrame(columns=['gas_used']) + end_block = w3.eth.block_number + start_block = end_block - num_blocks + + try: + # Process events in pages of 2000 blocks + PAGE_SIZE = 2000 + events = [] + + for block in range(start_block, end_block + 1, PAGE_SIZE): + current_end = min(block + PAGE_SIZE - 1, end_block) + log.info(f'Querying events for blocks {block} to {current_end}...') + + event_filter = w3.eth.filter({ + 'fromBlock': block, + 'toBlock': current_end, + # 'address': '0x011f31D20C8778c8Beb1093b73E3A5690Ee6271b', + 'topics': ['0x40e9cecb9f5f1f1c5b9c97dec2917b7ee92e57ba5563708daca94dd84ad7112f'], + }) + + page_events = event_filter.get_all_entries() + events.extend(page_events) + log.info(f'Found {len(page_events)} events in this page') + sleep(0.5) # Add small delay between requests + + for event in events: + try: + log.info(f"Processing transaction from block {event['blockNumber']}") + tx = w3.eth.get_transaction(event['transactionHash']) + gas_used = process_transaction(tx, w3) + + if gas_used: + new_data = pd.DataFrame({'gas_used': [gas_used]}) + gas_data = pd.concat([gas_data, new_data], ignore_index=True) + log.info(f"Transaction {event['transactionHash'].hex()}: Gas used {gas_used}") + + except Exception as e: + log.error(f"Error processing transaction: {str(e)}") + finally: + sleep(0.2) + + finally: + gas_data.to_csv('gas_data.csv', index=False)