diff --git a/crates/rpc/rpc/src/eth/api/call.rs b/crates/rpc/rpc/src/eth/api/call.rs index 6e40b76b6..6bf638cf5 100644 --- a/crates/rpc/rpc/src/eth/api/call.rs +++ b/crates/rpc/rpc/src/eth/api/call.rs @@ -47,8 +47,12 @@ where /// Estimate gas needed for execution of the `request` at the [BlockId]. pub async fn estimate_gas_at(&self, request: CallRequest, at: BlockId) -> EthResult { let (cfg, block_env, at) = self.evm_env_at(at).await?; - let state = self.state_at(at)?; - self.estimate_gas_with(cfg, block_env, request, state) + + self.on_blocking_task(|this| async move { + let state = this.state_at(at)?; + this.estimate_gas_with(cfg, block_env, request, state) + }) + .await } /// Executes the call request (`eth_call`) and returns the output diff --git a/crates/rpc/rpc/src/eth/api/server.rs b/crates/rpc/rpc/src/eth/api/server.rs index 0ec7535a2..575a1b3a3 100644 --- a/crates/rpc/rpc/src/eth/api/server.rs +++ b/crates/rpc/rpc/src/eth/api/server.rs @@ -236,14 +236,7 @@ where ) -> Result { trace!(target: "rpc::eth", ?request, ?block_number, ?state_overrides, ?block_overrides, "Serving eth_call"); Ok(self - .on_blocking_task(|this| async move { - this.call( - request, - block_number, - EvmOverrides::new(state_overrides, block_overrides), - ) - .await - }) + .call(request, block_number, EvmOverrides::new(state_overrides, block_overrides)) .await?) } @@ -265,15 +258,11 @@ where block_number: Option, ) -> Result { trace!(target: "rpc::eth", ?request, ?block_number, "Serving eth_createAccessList"); - Ok(self - .on_blocking_task(|this| async move { - let block_id = block_number.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)); - let access_list = this.create_access_list_at(request.clone(), block_number).await?; - request.access_list = Some(access_list.clone()); - let gas_used = this.estimate_gas_at(request, block_id).await?; - Ok(AccessListWithGasUsed { access_list, gas_used }) - }) - .await?) + let block_id = block_number.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)); + let access_list = self.create_access_list_at(request.clone(), block_number).await?; + request.access_list = Some(access_list.clone()); + let gas_used = self.estimate_gas_at(request, block_id).await?; + Ok(AccessListWithGasUsed { access_list, gas_used }) } /// Handler for: `eth_estimateGas` @@ -284,13 +273,10 @@ where ) -> Result { trace!(target: "rpc::eth", ?request, ?block_number, "Serving eth_estimateGas"); Ok(self - .on_blocking_task(|this| async move { - this.estimate_gas_at( - request, - block_number.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)), - ) - .await - }) + .estimate_gas_at( + request, + block_number.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)), + ) .await?) } diff --git a/crates/rpc/rpc/src/eth/api/transactions.rs b/crates/rpc/rpc/src/eth/api/transactions.rs index 6f3e1fa7f..c5b07d7ab 100644 --- a/crates/rpc/rpc/src/eth/api/transactions.rs +++ b/crates/rpc/rpc/src/eth/api/transactions.rs @@ -400,20 +400,28 @@ where } async fn transaction_receipt(&self, hash: H256) -> EthResult> { - self.on_blocking_task(|this| async move { - let (tx, meta) = match this.provider().transaction_by_hash_with_meta(hash)? { - Some((tx, meta)) => (tx, meta), - None => return Ok(None), - }; + let result = self + .on_blocking_task(|this| async move { + let (tx, meta) = match this.provider().transaction_by_hash_with_meta(hash)? { + Some((tx, meta)) => (tx, meta), + None => return Ok(None), + }; - let receipt = match this.provider().receipt_by_hash(hash)? { - Some(recpt) => recpt, - None => return Ok(None), - }; + let receipt = match this.provider().receipt_by_hash(hash)? { + Some(recpt) => recpt, + None => return Ok(None), + }; - this.build_transaction_receipt(tx, meta, receipt).await.map(Some) - }) - .await + Ok(Some((tx, meta, receipt))) + }) + .await?; + + let (tx, meta, receipt) = match result { + Some((tx, meta, receipt)) => (tx, meta, receipt), + None => return Ok(None), + }; + + self.build_transaction_receipt(tx, meta, receipt).await.map(Some) } async fn send_raw_transaction(&self, tx: Bytes) -> EthResult {