From cc5e5cab3c425ca5a911893a055619f06e854812 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Mon, 20 Feb 2023 20:46:25 +0100 Subject: [PATCH] feat(rpc): implement block_transaction_count (#1471) --- crates/rpc/rpc-builder/tests/it/http.rs | 8 ++------ crates/rpc/rpc/src/eth/api/block.rs | 14 ++++++++++++++ crates/rpc/rpc/src/eth/api/server.rs | 8 ++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/crates/rpc/rpc-builder/tests/it/http.rs b/crates/rpc/rpc-builder/tests/it/http.rs index b2c62c598d..9bf2c9f455 100644 --- a/crates/rpc/rpc-builder/tests/it/http.rs +++ b/crates/rpc/rpc-builder/tests/it/http.rs @@ -69,16 +69,12 @@ where EthApiClient::storage_at(client, address, U256::default(), None).await.unwrap(); EthApiClient::block_by_hash(client, hash, false).await.unwrap(); 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(); // Unimplemented assert!(is_unimplemented(EthApiClient::syncing(client).await.err().unwrap())); assert!(is_unimplemented(EthApiClient::author(client).await.err().unwrap())); - assert!(is_unimplemented( - EthApiClient::block_transaction_count_by_hash(client, hash).await.err().unwrap() - )); - assert!(is_unimplemented( - EthApiClient::block_transaction_count_by_number(client, block_number).await.err().unwrap() - )); assert!(is_unimplemented( EthApiClient::block_uncles_count_by_hash(client, hash).await.err().unwrap() )); diff --git a/crates/rpc/rpc/src/eth/api/block.rs b/crates/rpc/rpc/src/eth/api/block.rs index d9784e7f52..62b77ea4d6 100644 --- a/crates/rpc/rpc/src/eth/api/block.rs +++ b/crates/rpc/rpc/src/eth/api/block.rs @@ -12,6 +12,20 @@ impl EthApi where Client: BlockProvider + StateProviderFactory + 'static, { + pub(crate) async fn block_transaction_count( + &self, + block_id: impl Into, + ) -> EthResult> { + let block_id = block_id.into(); + // TODO support pending block + + if let Some(txs) = self.client().transactions_by_block(block_id)? { + Ok(Some(txs.len())) + } else { + Ok(None) + } + } + pub(crate) async fn block( &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 f984aea42d..4a91e757f3 100644 --- a/crates/rpc/rpc/src/eth/api/server.rs +++ b/crates/rpc/rpc/src/eth/api/server.rs @@ -67,15 +67,15 @@ where Ok(EthApi::block(self, number, full).await?) } - async fn block_transaction_count_by_hash(&self, _hash: H256) -> Result> { - Err(internal_rpc_err("unimplemented")) + async fn block_transaction_count_by_hash(&self, hash: H256) -> Result> { + Ok(EthApi::block_transaction_count(self, hash).await?.map(U256::from)) } async fn block_transaction_count_by_number( &self, - _number: BlockNumberOrTag, + number: BlockNumberOrTag, ) -> Result> { - Err(internal_rpc_err("unimplemented")) + Ok(EthApi::block_transaction_count(self, number).await?.map(U256::from)) } async fn block_uncles_count_by_hash(&self, _hash: H256) -> Result {