use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserOperationV06 {
pub sender: String,
pub nonce: String,
#[serde(default)]
pub init_code: Option<String>,
pub call_data: String,
pub call_gas_limit: String,
pub verification_gas_limit: String,
pub pre_verification_gas: String,
pub max_fee_per_gas: String,
pub max_priority_fee_per_gas: String,
#[serde(default)]
pub paymaster_and_data: Option<String>,
pub signature: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserOperationV07 {
pub sender: String,
pub nonce: String,
#[serde(default)]
pub factory: Option<String>,
#[serde(default)]
pub factory_data: Option<String>,
pub call_data: String,
pub call_gas_limit: String,
pub verification_gas_limit: String,
pub pre_verification_gas: String,
pub max_fee_per_gas: String,
pub max_priority_fee_per_gas: String,
#[serde(default)]
pub paymaster: Option<String>,
#[serde(default)]
pub paymaster_verification_gas_limit: Option<String>,
#[serde(default)]
pub paymaster_post_op_gas_limit: Option<String>,
#[serde(default)]
pub paymaster_data: Option<String>,
pub signature: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum UserOperation {
V06(UserOperationV06),
V07(UserOperationV07),
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UserOperationReceipt {
pub user_op_hash: String,
pub entry_point: String,
pub sender: String,
pub nonce: String,
#[serde(default)]
pub paymaster: Option<String>,
pub actual_gas_cost: String,
pub actual_gas_used: String,
pub success: bool,
#[serde(default)]
pub reason: Option<String>,
pub receipt: TransactionReceipt,
pub logs: Vec<Log>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionReceipt {
pub transaction_hash: String,
pub transaction_index: String,
pub block_hash: String,
pub block_number: String,
pub from: String,
pub to: Option<String>,
pub cumulative_gas_used: String,
pub gas_used: String,
#[serde(default)]
pub contract_address: Option<String>,
pub logs: Vec<Log>,
pub logs_bloom: String,
pub status: String,
pub effective_gas_price: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Log {
pub address: String,
pub topics: Vec<String>,
pub data: String,
pub block_number: Option<String>,
pub transaction_hash: Option<String>,
pub transaction_index: Option<String>,
pub block_hash: Option<String>,
pub log_index: Option<String>,
#[serde(default)]
pub removed: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UserOperationByHash {
pub user_operation: serde_json::Value,
pub entry_point: String,
pub transaction_hash: Option<String>,
pub block_hash: Option<String>,
pub block_number: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GasEstimation {
pub pre_verification_gas: String,
pub verification_gas_limit: String,
pub call_gas_limit: String,
#[serde(default)]
pub paymaster_verification_gas_limit: Option<String>,
#[serde(default)]
pub paymaster_post_op_gas_limit: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BundlerStateOverride {
#[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>>,
}