use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum TracerType {
#[serde(rename = "callTracer")]
CallTracer,
#[serde(rename = "prestateTracer")]
PrestateTracer,
#[serde(rename = "4byteTracer")]
FourByteTracer,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TracerConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub only_top_call: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub with_log: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TracerOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub tracer: Option<TracerType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracer_config: Option<TracerConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<String>,
}
impl TracerOptions {
#[must_use]
pub fn call_tracer() -> Self {
Self {
tracer: Some(TracerType::CallTracer),
tracer_config: Some(TracerConfig {
only_top_call: Some(false),
with_log: Some(true),
}),
timeout: None,
}
}
#[must_use]
pub fn prestate_tracer() -> Self {
Self {
tracer: Some(TracerType::PrestateTracer),
tracer_config: None,
timeout: None,
}
}
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StateOverride {
#[serde(skip_serializing_if = "Option::is_none")]
pub balance: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<std::collections::HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_diff: Option<std::collections::HashMap<String, String>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CallFrame {
#[serde(rename = "type")]
pub call_type: String,
pub from: String,
#[serde(default)]
pub to: Option<String>,
#[serde(default)]
pub value: Option<String>,
pub gas: String,
pub gas_used: String,
pub input: String,
#[serde(default)]
pub output: Option<String>,
#[serde(default)]
pub error: Option<String>,
#[serde(default)]
pub revert_reason: Option<String>,
#[serde(default)]
pub calls: Vec<CallFrame>,
#[serde(default)]
pub logs: Vec<TraceLog>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceLog {
pub address: String,
pub topics: Vec<String>,
pub data: String,
#[serde(default)]
pub position: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BlockTrace {
#[serde(default)]
pub tx_hash: Option<String>,
pub result: serde_json::Value,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceCallObject {
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<String>,
pub to: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_price: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_priority_fee_per_gas: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceCallOptions {
#[serde(flatten)]
pub tracer: TracerOptions,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_overrides: Option<std::collections::HashMap<String, StateOverride>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_overrides: Option<BlockOverrides>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BlockOverrides {
#[serde(skip_serializing_if = "Option::is_none")]
pub number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub difficulty: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_limit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coinbase: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub random: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_fee: Option<String>,
}