From 200978436296d4e2b731fe262b79f16039c17dd4 Mon Sep 17 00:00:00 2001 From: Luca Provini Date: Fri, 1 Mar 2024 19:41:25 +0100 Subject: [PATCH] feat: raw_tx_by_hash (#6827) Co-authored-by: Matthias Seitz --- crates/rpc/rpc-api/src/eth.rs | 17 +++++++++++++++++ crates/rpc/rpc/src/eth/api/server.rs | 20 ++++++++++++++++++++ crates/rpc/rpc/src/eth/api/transactions.rs | 14 ++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/crates/rpc/rpc-api/src/eth.rs b/crates/rpc/rpc-api/src/eth.rs index db03e13fb1..7dc39333b0 100644 --- a/crates/rpc/rpc-api/src/eth.rs +++ b/crates/rpc/rpc-api/src/eth.rs @@ -102,6 +102,14 @@ pub trait EthApi { #[method(name = "getTransactionByHash")] async fn transaction_by_hash(&self, hash: B256) -> RpcResult>; + /// Returns information about a raw transaction by block hash and transaction index position. + #[method(name = "getRawTransactionByBlockHashAndIndex")] + async fn raw_transaction_by_block_hash_and_index( + &self, + hash: B256, + index: Index, + ) -> RpcResult>; + /// Returns information about a transaction by block hash and transaction index position. #[method(name = "getTransactionByBlockHashAndIndex")] async fn transaction_by_block_hash_and_index( @@ -110,6 +118,15 @@ pub trait EthApi { index: Index, ) -> RpcResult>; + /// Returns information about a raw transaction by block number and transaction index + /// position. + #[method(name = "getRawTransactionByBlockNumberAndIndex")] + async fn raw_transaction_by_block_number_and_index( + &self, + number: BlockNumberOrTag, + index: Index, + ) -> RpcResult>; + /// Returns information about a transaction by block number and transaction index position. #[method(name = "getTransactionByBlockNumberAndIndex")] async fn transaction_by_block_number_and_index( diff --git a/crates/rpc/rpc/src/eth/api/server.rs b/crates/rpc/rpc/src/eth/api/server.rs index e5c78809e6..73d7377761 100644 --- a/crates/rpc/rpc/src/eth/api/server.rs +++ b/crates/rpc/rpc/src/eth/api/server.rs @@ -165,6 +165,16 @@ where Ok(EthTransactions::transaction_by_hash(self, hash).await?.map(Into::into)) } + /// Handler for: `eth_getRawTransactionByBlockHashAndIndex` + async fn raw_transaction_by_block_hash_and_index( + &self, + hash: B256, + index: Index, + ) -> Result> { + trace!(target: "rpc::eth", ?hash, ?index, "Serving eth_getRawTransactionByBlockHashAndIndex"); + Ok(EthApi::raw_transaction_by_block_and_tx_index(self, hash, index).await?) + } + /// Handler for: `eth_getTransactionByBlockHashAndIndex` async fn transaction_by_block_hash_and_index( &self, @@ -175,6 +185,16 @@ where Ok(EthApi::transaction_by_block_and_tx_index(self, hash, index).await?) } + /// Handler for: `eth_getRawTransactionByBlockNumberAndIndex` + async fn raw_transaction_by_block_number_and_index( + &self, + number: BlockNumberOrTag, + index: Index, + ) -> Result> { + trace!(target: "rpc::eth", ?number, ?index, "Serving eth_getRawTransactionByBlockNumberAndIndex"); + Ok(EthApi::raw_transaction_by_block_and_tx_index(self, number, index).await?) + } + /// Handler for: `eth_getTransactionByBlockNumberAndIndex` async fn transaction_by_block_number_and_index( &self, diff --git a/crates/rpc/rpc/src/eth/api/transactions.rs b/crates/rpc/rpc/src/eth/api/transactions.rs index 397407b924..307847adfd 100644 --- a/crates/rpc/rpc/src/eth/api/transactions.rs +++ b/crates/rpc/rpc/src/eth/api/transactions.rs @@ -1288,6 +1288,20 @@ where Ok(None) } + + pub(crate) async fn raw_transaction_by_block_and_tx_index( + &self, + block_id: impl Into, + index: Index, + ) -> EthResult> { + if let Some(block) = self.block_with_senders(block_id.into()).await? { + if let Some(tx) = block.transactions().nth(index.into()) { + return Ok(Some(tx.envelope_encoded())) + } + } + + Ok(None) + } } /// Represents from where a transaction was fetched. #[derive(Debug, Clone, Eq, PartialEq)]