diff --git a/crates/scroll/rpc/src/eth/block.rs b/crates/scroll/rpc/src/eth/block.rs index 7dc8ec9951a..048944d57d4 100644 --- a/crates/scroll/rpc/src/eth/block.rs +++ b/crates/scroll/rpc/src/eth/block.rs @@ -1,11 +1,14 @@ //! Loads and formats Scroll block RPC response. -use crate::{ScrollEthApi, ScrollEthApiError}; +use crate::{RpcBlockHeaderMut, ScrollEthApi, ScrollEthApiError}; -use reth_rpc_convert::RpcConvert; +use alloy_consensus::BlockHeader; +use alloy_eips::BlockId; +use reth_provider::HeaderProvider; +use reth_rpc_convert::{RpcConvert, RpcTypes}; use reth_rpc_eth_api::{ helpers::{EthBlocks, LoadBlock}, - RpcNodeCore, + EthApiTypes, FromEthApiError, FullEthApiTypes, RpcBlock, RpcNodeCore, }; use reth_rpc_eth_types::error::FromEvmError; @@ -14,7 +17,33 @@ where N: RpcNodeCore, ScrollEthApiError: FromEvmError, Rpc: RpcConvert, + <::NetworkTypes as RpcTypes>::Header: RpcBlockHeaderMut, { + async fn rpc_block( + &self, + block_id: BlockId, + full: bool, + ) -> Result>, Self::Error> + where + Self: FullEthApiTypes, + { + let Some(block) = self.recovered_block(block_id).await? else { return Ok(None) }; + + let td = self + .provider() + .header_td_by_number(block.number()) + .map_err(Self::Error::from_eth_err)?; + + let mut block = block.clone_into_rpc_block( + full.into(), + |tx, tx_info| self.tx_resp_builder().fill(tx, tx_info), + |header, size| self.tx_resp_builder().convert_header(header, size), + )?; + + *block.header.total_difficulty_mut() = td; + + Ok(Some(block)) + } } impl LoadBlock for ScrollEthApi diff --git a/crates/scroll/rpc/src/lib.rs b/crates/scroll/rpc/src/lib.rs index 76ecfbec7b6..d63a7e361ee 100644 --- a/crates/scroll/rpc/src/lib.rs +++ b/crates/scroll/rpc/src/lib.rs @@ -15,3 +15,15 @@ pub mod sequencer; pub use error::{ScrollEthApiError, SequencerClientError}; pub use eth::{ScrollEthApi, ScrollReceiptBuilder}; pub use sequencer::SequencerClient; + +/// Gives mutable access to the fields of an RPC block header. +pub trait RpcBlockHeaderMut { + /// Mutable reference to the total difficulty. + fn total_difficulty_mut(&mut self) -> &mut Option; +} + +impl RpcBlockHeaderMut for alloy_rpc_types_eth::Header { + fn total_difficulty_mut(&mut self) -> &mut Option { + &mut self.total_difficulty + } +}