use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum TraceType {
Trace,
StateDiff,
VmTrace,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceCallRequest {
#[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 value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceAction {
pub call_type: Option<String>,
pub from: Option<String>,
pub to: Option<String>,
pub gas: Option<String>,
pub input: Option<String>,
pub value: Option<String>,
pub init: Option<String>,
pub address: Option<String>,
pub refund_address: Option<String>,
pub balance: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceResult {
pub gas_used: Option<String>,
pub output: Option<String>,
pub address: Option<String>,
pub code: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Trace {
pub action: TraceAction,
pub block_hash: Option<String>,
pub block_number: Option<u64>,
pub result: Option<TraceResult>,
pub error: Option<String>,
pub subtraces: u32,
pub trace_address: Vec<u32>,
pub transaction_hash: Option<String>,
pub transaction_position: Option<u32>,
#[serde(rename = "type")]
pub trace_type: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StateDiffAccount {
pub balance: Option<StateDiffValue>,
pub code: Option<StateDiffValue>,
pub nonce: Option<StateDiffValue>,
pub storage: Option<std::collections::HashMap<String, StateDiffValue>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(untagged)]
pub enum StateDiffValue {
Unchanged(String),
Changed { from: String, to: String },
Added { from: (), to: String },
Removed { from: String, to: () },
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceCallResponse {
#[serde(default)]
pub trace: Vec<Trace>,
#[serde(default)]
pub state_diff: Option<std::collections::HashMap<String, StateDiffAccount>>,
#[serde(default)]
pub vm_trace: Option<serde_json::Value>,
pub output: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TraceFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub from_block: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to_block: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_address: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to_address: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub count: Option<u32>,
}