60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
from typing import List
|
|
|
|
from mev_inspect.schemas.miner_payments import MinerPayment
|
|
from mev_inspect.schemas.receipts import Receipt
|
|
from mev_inspect.schemas.traces import ClassifiedTrace
|
|
from mev_inspect.traces import get_traces_by_transaction_hash
|
|
from mev_inspect.transfers import filter_transfers, get_eth_transfers
|
|
|
|
|
|
def get_miner_payments(
|
|
miner_address: str,
|
|
base_fee_per_gas: int,
|
|
traces: List[ClassifiedTrace],
|
|
receipts: List[Receipt],
|
|
) -> List[MinerPayment]:
|
|
miner_payments = []
|
|
|
|
traces_by_transaction_hash = get_traces_by_transaction_hash(traces)
|
|
|
|
for receipt in receipts:
|
|
transaciton_traces = traces_by_transaction_hash.get(
|
|
receipt.transaction_hash, []
|
|
)
|
|
|
|
if len(transaciton_traces) == 0:
|
|
continue
|
|
|
|
first_trace = sorted(transaciton_traces, key=lambda t: t.trace_address)[0]
|
|
|
|
eth_transfers = get_eth_transfers(transaciton_traces)
|
|
miner_eth_transfers = filter_transfers(
|
|
eth_transfers, to_address=miner_address.lower()
|
|
)
|
|
|
|
coinbase_transfer = sum(transfer.amount for transfer in miner_eth_transfers)
|
|
|
|
gas_cost = receipt.effective_gas_price * receipt.gas_used
|
|
total_gas_cost = gas_cost + coinbase_transfer
|
|
gas_price_with_coinbase_transfer = (
|
|
total_gas_cost / receipt.gas_used if receipt.gas_used != 0 else 0
|
|
)
|
|
|
|
miner_payments.append(
|
|
MinerPayment(
|
|
miner_address=miner_address,
|
|
block_number=receipt.block_number,
|
|
transaction_hash=receipt.transaction_hash,
|
|
transaction_index=receipt.transaction_index,
|
|
gas_price=receipt.effective_gas_price,
|
|
gas_price_with_coinbase_transfer=gas_price_with_coinbase_transfer,
|
|
base_fee_per_gas=base_fee_per_gas,
|
|
gas_used=receipt.gas_used,
|
|
coinbase_transfer=coinbase_transfer,
|
|
transaction_to_address=first_trace.to_address,
|
|
transaction_from_address=first_trace.from_address,
|
|
)
|
|
)
|
|
|
|
return miner_payments
|