1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use alloy_primitives::{Address, FixedBytes, Log, B256, U256};
use hex_literal::hex;
use reth_rpc_types::trace::parity::Action;

pub(crate) fn get_coinbase_transfer(builder: Address, action: &Action) -> Option<u128> {
    match action {
        Action::Call(action) => {
            if action.to == builder && !action.value.is_zero() {
                return Some(action.value.to())
            }
            None
        }
        _ => None,
    }
}

const TRANSFER_TOPIC: B256 =
    FixedBytes(hex!("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"));

pub(crate) fn decode_transfer(log: &Log) -> Option<(Address, Address, Address, U256)> {
    if log.topics().len() != 3 {
        return None
    }

    if log.topics().first() == Some(&TRANSFER_TOPIC) {
        let from = Address::from_slice(&log.topics()[1][12..]);
        let to = Address::from_slice(&log.topics()[2][12..]);
        let data = U256::try_from_be_slice(&log.data.data[..])?;
        return Some((log.address, from, to, data))
    }

    None
}