use std::collections::BTreeMap;
use alloy_eips::eip4895::Withdrawal;
use mega_evm::revm::primitives::{Address, B256, U256};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct Env {
#[serde(rename = "currentChainID", skip_serializing_if = "Option::is_none")]
pub current_chain_id: Option<U256>,
pub current_coinbase: Address,
#[serde(default)]
pub current_difficulty: U256,
pub current_gas_limit: U256,
pub current_number: U256,
pub current_timestamp: U256,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_base_fee: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_hash: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_timestamp: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_gas_used: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_gas_limit: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_base_fee: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_hash: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_uncle_hash: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_beacon_block_root: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_difficulty: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_hashes: Option<BTreeMap<U256, B256>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ommers: Option<Vec<B256>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub withdrawals: Option<Vec<Withdrawal>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_random: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_beacon_root: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_withdrawals_root: Option<B256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_blob_gas_used: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_excess_blob_gas: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_target_blobs_per_block: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_excess_blob_gas: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_blob_gas_used: Option<U256>,
}