diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs index 1c79fa3ef8..1d7200222b 100644 --- a/crates/engine/tree/src/tree/mod.rs +++ b/crates/engine/tree/src/tree/mod.rs @@ -1524,19 +1524,13 @@ where /// Return sealed block from database or in-memory state by hash. fn sealed_header_by_hash(&self, hash: B256) -> ProviderResult> { // check memory first - let block = self - .state - .tree_state - .block_by_hash(hash) - // TODO: clone for compatibility. should we return an Arc here? - .map(|block| block.as_ref().clone().header); + let block = + self.state.tree_state.block_by_hash(hash).map(|block| block.as_ref().clone().header); if block.is_some() { Ok(block) - } else if let Some(block_num) = self.provider.block_number(hash)? { - Ok(self.provider.sealed_header(block_num)?) } else { - Ok(None) + self.provider.sealed_header_by_hash(hash) } } diff --git a/crates/storage/storage-api/src/header.rs b/crates/storage/storage-api/src/header.rs index ce984fb107..7202f51ddf 100644 --- a/crates/storage/storage-api/src/header.rs +++ b/crates/storage/storage-api/src/header.rs @@ -15,6 +15,11 @@ pub trait HeaderProvider: Send + Sync { /// Get header by block hash fn header(&self, block_hash: &BlockHash) -> ProviderResult>; + /// Retrieves the header sealed by the given block hash. + fn sealed_header_by_hash(&self, block_hash: BlockHash) -> ProviderResult> { + Ok(self.header(&block_hash)?.map(|header| SealedHeader::new(header, block_hash))) + } + /// Get header by block number fn header_by_number(&self, num: u64) -> ProviderResult>;