From cfd5e5f6bd48e02c61d34c174244fdb06f677d93 Mon Sep 17 00:00:00 2001 From: Gregory Edison Date: Sat, 20 Sep 2025 13:52:24 +0200 Subject: [PATCH 1/2] feat: add missing td to rpc header Signed-off-by: Gregory Edison --- crates/scroll/rpc/src/eth/block.rs | 38 +++++++++++++++++++++++++++--- crates/scroll/rpc/src/lib.rs | 12 ++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/crates/scroll/rpc/src/eth/block.rs b/crates/scroll/rpc/src/eth/block.rs index 7dc8ec9951a..cc6d214fd2b 100644 --- a/crates/scroll/rpc/src/eth/block.rs +++ b/crates/scroll/rpc/src/eth/block.rs @@ -1,11 +1,15 @@ //! Loads and formats Scroll block RPC response. -use crate::{ScrollEthApi, ScrollEthApiError}; +use crate::{RpcBlockHeaderMut, ScrollEthApi, ScrollEthApiError}; +use std::future::Future; -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 +18,35 @@ where N: RpcNodeCore, ScrollEthApiError: FromEvmError, Rpc: RpcConvert, + < as EthApiTypes>::NetworkTypes as RpcTypes>::Header: RpcBlockHeaderMut, { + fn rpc_block( + &self, + block_id: BlockId, + full: bool, + ) -> impl Future>, Self::Error>> + Send + where + Self: FullEthApiTypes, + { + async move { + 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 + } +} From c4ecf94e750dc7cb4a92e454407505391e545311 Mon Sep 17 00:00:00 2001 From: Gregory Edison Date: Mon, 22 Sep 2025 17:04:32 +0200 Subject: [PATCH 2/2] fix: lints Signed-off-by: Gregory Edison --- crates/scroll/rpc/src/eth/block.rs | 33 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/crates/scroll/rpc/src/eth/block.rs b/crates/scroll/rpc/src/eth/block.rs index cc6d214fd2b..048944d57d4 100644 --- a/crates/scroll/rpc/src/eth/block.rs +++ b/crates/scroll/rpc/src/eth/block.rs @@ -1,7 +1,6 @@ //! Loads and formats Scroll block RPC response. use crate::{RpcBlockHeaderMut, ScrollEthApi, ScrollEthApiError}; -use std::future::Future; use alloy_consensus::BlockHeader; use alloy_eips::BlockId; @@ -18,34 +17,32 @@ where N: RpcNodeCore, ScrollEthApiError: FromEvmError, Rpc: RpcConvert, - < as EthApiTypes>::NetworkTypes as RpcTypes>::Header: RpcBlockHeaderMut, + <::NetworkTypes as RpcTypes>::Header: RpcBlockHeaderMut, { - fn rpc_block( + async fn rpc_block( &self, block_id: BlockId, full: bool, - ) -> impl Future>, Self::Error>> + Send + ) -> Result>, Self::Error> where Self: FullEthApiTypes, { - async move { - let Some(block) = self.recovered_block(block_id).await? else { return Ok(None) }; + 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 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), - )?; + 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; + *block.header.total_difficulty_mut() = td; - Ok(Some(block)) - } + Ok(Some(block)) } }