//! Loads OP pending block for a RPC response. use crate::OpEthApi; use reth_evm::ConfigureEvm; use reth_node_api::FullNodeComponents; use reth_primitives::{ revm_primitives::BlockEnv, BlockHashOrNumber, BlockNumber, SealedBlockWithSenders, B256, }; use reth_provider::{ BlockReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, ExecutionOutcome, StateProviderFactory, }; use reth_rpc_eth_api::{ helpers::{LoadPendingBlock, SpawnBlocking}, FromEthApiError, }; use reth_rpc_eth_types::{EthApiError, PendingBlock}; use reth_transaction_pool::TransactionPool; impl LoadPendingBlock for OpEthApi where Self: SpawnBlocking, N: FullNodeComponents, { #[inline] fn provider( &self, ) -> impl BlockReaderIdExt + EvmEnvProvider + ChainSpecProvider + StateProviderFactory { self.inner.provider() } #[inline] fn pool(&self) -> impl TransactionPool { self.inner.pool() } #[inline] fn pending_block(&self) -> &tokio::sync::Mutex> { self.inner.pending_block() } #[inline] fn evm_config(&self) -> &impl ConfigureEvm { self.inner.evm_config() } /// Returns the locally built pending block async fn local_pending_block(&self) -> Result, Self::Error> { // See: let latest = self .provider() .latest_header() .map_err(Self::Error::from_eth_err)? .ok_or_else(|| EthApiError::UnknownBlockNumber)?; let (_, block_hash) = latest.split(); self.provider() .sealed_block_with_senders(BlockHashOrNumber::from(block_hash), Default::default()) .map_err(Self::Error::from_eth_err) } fn receipts_root( &self, _block_env: &BlockEnv, execution_outcome: &ExecutionOutcome, block_number: BlockNumber, ) -> B256 { execution_outcome .optimism_receipts_root_slow( block_number, self.provider().chain_spec().as_ref(), _block_env.timestamp.to::(), ) .expect("Block is present") } }