tempo_evm/
context.rs

1use std::collections::HashMap;
2
3use alloy_evm::eth::EthBlockExecutionCtx;
4use alloy_primitives::{Address, B256, Bytes};
5use reth_evm::NextBlockEnvAttributes;
6use tempo_primitives::subblock::PartialValidatorKey;
7
8/// Execution context for Tempo block.
9#[derive(Debug, Clone, derive_more::Deref)]
10pub struct TempoBlockExecutionCtx<'a> {
11    /// Inner [`EthBlockExecutionCtx`].
12    #[deref]
13    pub inner: EthBlockExecutionCtx<'a>,
14    /// Non-payment gas limit for the block.
15    pub general_gas_limit: u64,
16    /// DKG ceremony data to include in the block's extra_data header field.
17    pub extra_data: Bytes,
18    /// Shared gas limit for the block.
19    pub shared_gas_limit: u64,
20    /// Validator set for the block.
21    ///
22    /// Only set for un-finalized blocks coming from consensus layer.
23    ///
24    /// When this is set to `None`, no validation of subblock signatures is performed.
25    /// Make sure to always set this field when executing blocks from untrusted sources
26    pub validator_set: Option<Vec<B256>>,
27    /// Mapping from a subblock validator public key to the fee recipient configured.
28    ///
29    /// Used to provide EVM with the fee recipient context when executing subblock transactions.
30    pub subblock_fee_recipients: HashMap<PartialValidatorKey, Address>,
31}
32
33/// Context required for next block environment.
34#[derive(Debug, Clone, derive_more::Deref)]
35pub struct TempoNextBlockEnvAttributes {
36    /// Inner [`NextBlockEnvAttributes`].
37    #[deref]
38    pub inner: NextBlockEnvAttributes,
39    /// Non-payment gas limit for the block.
40    pub general_gas_limit: u64,
41    /// Shared gas limit for the block.
42    pub shared_gas_limit: u64,
43    /// Milliseconds portion of the timestamp.
44    pub timestamp_millis_part: u64,
45    /// DKG ceremony data to include in the block's extra_data header field.
46    pub extra_data: Bytes,
47    /// Mapping from a subblock validator public key to the fee recipient configured.
48    pub subblock_fee_recipients: HashMap<PartialValidatorKey, Address>,
49}
50
51#[cfg(feature = "rpc")]
52impl reth_rpc_eth_api::helpers::pending_block::BuildPendingEnv<tempo_primitives::TempoHeader>
53    for TempoNextBlockEnvAttributes
54{
55    fn build_pending_env(parent: &crate::SealedHeader<tempo_primitives::TempoHeader>) -> Self {
56        use alloy_consensus::BlockHeader as _;
57
58        let shared_gas_limit = parent.gas_limit() / tempo_consensus::TEMPO_SHARED_GAS_DIVISOR;
59        let general_gas_limit =
60            (parent.gas_limit() - shared_gas_limit) / tempo_consensus::TEMPO_GENERAL_GAS_DIVISOR;
61
62        Self {
63            inner: NextBlockEnvAttributes::build_pending_env(parent),
64            general_gas_limit,
65            shared_gas_limit,
66            timestamp_millis_part: parent.timestamp_millis_part,
67            extra_data: Bytes::default(),
68            subblock_fee_recipients: Default::default(),
69        }
70    }
71}