evmole 0.8.4

Extracts function selectors and arguments from EVM bytecode
Documentation
use std::collections::BTreeMap;

use alloy_primitives::hex;
use serde::{Serializer, ser::SerializeSeq};

use crate::{DynSolType, Selector, Slot, StateMutability, control_flow_graph::Block};

pub fn selector<S: Serializer>(val: &Selector, serializer: S) -> Result<S::Ok, S::Error> {
    serializer.serialize_str(&hex::encode(val))
}

pub fn arguments<S: Serializer>(
    val: &Option<Vec<DynSolType>>,
    serializer: S,
) -> Result<S::Ok, S::Error> {
    match val {
        Some(args) => {
            let s: String = args
                .iter()
                .map(|t| t.sol_type_name().to_string())
                .collect::<Vec<String>>()
                .join(",");
            serializer.serialize_str(&s)
        }
        None => serializer.serialize_none(),
    }
}

pub fn state_mutability<S: Serializer>(
    val: &Option<StateMutability>,
    serializer: S,
) -> Result<S::Ok, S::Error> {
    match val {
        Some(sm) => serializer.serialize_str(sm.as_json_str()),
        None => serializer.serialize_none(),
    }
}

pub fn slot<S: Serializer>(val: &Slot, serializer: S) -> Result<S::Ok, S::Error> {
    serializer.serialize_str(&hex::encode(val))
}

pub fn vec_selector<S: Serializer>(val: &Vec<Selector>, serializer: S) -> Result<S::Ok, S::Error> {
    let mut s = serializer.serialize_seq(Some(val.len()))?;
    for sel in val {
        s.serialize_element(&hex::encode(sel))?;
    }
    s.end()
}

pub fn blocks<S: Serializer>(
    val: &BTreeMap<usize, Block>,
    serializer: S,
) -> Result<S::Ok, S::Error> {
    let mut s = serializer.serialize_seq(Some(val.len()))?;
    for b in val.values() {
        s.serialize_element(b)?;
    }
    s.end()
}