diff --git a/crates/rpc/rpc-api/src/eth.rs b/crates/rpc/rpc-api/src/eth.rs index 2b08e40f5e..5b6553e731 100644 --- a/crates/rpc/rpc-api/src/eth.rs +++ b/crates/rpc/rpc-api/src/eth.rs @@ -62,11 +62,11 @@ pub trait EthApi { /// Returns the number of uncles in a block from a block matching the given block hash. #[method(name = "eth_getUncleCountByBlockHash")] - async fn block_uncles_count_by_hash(&self, hash: H256) -> Result; + async fn block_uncles_count_by_hash(&self, hash: H256) -> Result>; /// Returns the number of uncles in a block with given block number. #[method(name = "eth_getUncleCountByBlockNumber")] - async fn block_uncles_count_by_number(&self, number: BlockNumberOrTag) -> Result; + async fn block_uncles_count_by_number(&self, number: BlockNumberOrTag) -> Result>; /// Returns an uncle block of the given block and index. #[method(name = "eth_getUncleByBlockHashAndIndex")] diff --git a/crates/rpc/rpc-builder/tests/it/http.rs b/crates/rpc/rpc-builder/tests/it/http.rs index 9bf2c9f455..f6eec08ba3 100644 --- a/crates/rpc/rpc-builder/tests/it/http.rs +++ b/crates/rpc/rpc-builder/tests/it/http.rs @@ -71,16 +71,12 @@ where EthApiClient::block_by_number(client, block_number, false).await.unwrap(); EthApiClient::block_transaction_count_by_number(client, block_number).await.unwrap(); EthApiClient::block_transaction_count_by_hash(client, hash).await.unwrap(); + EthApiClient::block_uncles_count_by_hash(client, hash).await.unwrap(); + EthApiClient::block_uncles_count_by_number(client, block_number).await.unwrap(); // Unimplemented assert!(is_unimplemented(EthApiClient::syncing(client).await.err().unwrap())); assert!(is_unimplemented(EthApiClient::author(client).await.err().unwrap())); - assert!(is_unimplemented( - EthApiClient::block_uncles_count_by_hash(client, hash).await.err().unwrap() - )); - assert!(is_unimplemented( - EthApiClient::block_uncles_count_by_number(client, block_number).await.err().unwrap() - )); assert!(is_unimplemented( EthApiClient::uncle_by_block_hash_and_index(client, hash, index).await.err().unwrap() )); diff --git a/crates/rpc/rpc/src/eth/api/block.rs b/crates/rpc/rpc/src/eth/api/block.rs index 861b36f5e9..0863a48fdc 100644 --- a/crates/rpc/rpc/src/eth/api/block.rs +++ b/crates/rpc/rpc/src/eth/api/block.rs @@ -12,6 +12,17 @@ impl EthApi where Client: BlockProvider + StateProviderFactory + 'static, { + /// Returns the uncle headers of the given block + /// + /// Returns an empty vec if there are none. + pub(crate) fn ommers( + &self, + block_id: impl Into, + ) -> EthResult>> { + let block_id = block_id.into(); + Ok(self.client().ommers(block_id)?) + } + pub(crate) async fn block_transaction_count( &self, block_id: impl Into, diff --git a/crates/rpc/rpc/src/eth/api/server.rs b/crates/rpc/rpc/src/eth/api/server.rs index 403c9664aa..75edc235fc 100644 --- a/crates/rpc/rpc/src/eth/api/server.rs +++ b/crates/rpc/rpc/src/eth/api/server.rs @@ -89,13 +89,13 @@ where } /// Handler for: `eth_getUncleCountByBlockHash` - async fn block_uncles_count_by_hash(&self, _hash: H256) -> Result { - Err(internal_rpc_err("unimplemented")) + async fn block_uncles_count_by_hash(&self, hash: H256) -> Result> { + Ok(EthApi::ommers(self, hash)?.map(|ommers| U256::from(ommers.len()))) } /// Handler for: `eth_getUncleCountByBlockNumber` - async fn block_uncles_count_by_number(&self, _number: BlockNumberOrTag) -> Result { - Err(internal_rpc_err("unimplemented")) + async fn block_uncles_count_by_number(&self, number: BlockNumberOrTag) -> Result> { + Ok(EthApi::ommers(self, number)?.map(|ommers| U256::from(ommers.len()))) } /// Handler for: `eth_getUncleByBlockHashAndIndex` diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index 0fffa67634..dd7f86bfc8 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -140,9 +140,8 @@ impl BlockProvider for ShareableDatabase { if let Some(number) = self.block_number_for_id(id)? { let tx = self.db.tx()?; // TODO: this can be optimized to return empty Vec post-merge - let ommers = - tx.get::(number)?.map(|o| o.ommers).unwrap_or_default(); - return Ok(Some(ommers)) + let ommers = tx.get::(number)?.map(|o| o.ommers); + return Ok(ommers) } Ok(None)