diff --git a/Cargo.lock b/Cargo.lock index 06c419a21330..1c4cede353eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8123,7 +8123,6 @@ dependencies = [ "reth-errors", "reth-evm", "reth-evm-ethereum", - "reth-evm-optimism", "reth-network-api", "reth-network-peers", "reth-node-api", diff --git a/crates/optimism/rpc/src/eth/receipt.rs b/crates/optimism/rpc/src/eth/receipt.rs index ec22be71e5a2..494b66ea5422 100644 --- a/crates/optimism/rpc/src/eth/receipt.rs +++ b/crates/optimism/rpc/src/eth/receipt.rs @@ -38,7 +38,7 @@ where } } -/// Applies OP specific fields to a receipt. +/// Applies OP specific fields to a receipt builder. pub fn op_receipt_fields( resp_builder: ReceiptBuilder, tx: &TransactionSigned, diff --git a/crates/optimism/rpc/src/eth/transaction.rs b/crates/optimism/rpc/src/eth/transaction.rs index 69a16cd3cc0a..326c3c73d1c8 100644 --- a/crates/optimism/rpc/src/eth/transaction.rs +++ b/crates/optimism/rpc/src/eth/transaction.rs @@ -1,8 +1,10 @@ -//! Loads and formats OP transaction RPC response. +//! Loads and formats OP transaction RPC response. + +use std::sync::Arc; use reth_evm_optimism::RethL1BlockInfo; use reth_primitives::TransactionSigned; -use reth_provider::BlockReaderIdExt; +use reth_provider::{BlockReaderIdExt, TransactionsProvider}; use reth_rpc_eth_api::{ helpers::{EthApiSpec, EthSigner, EthTransactions, LoadTransaction}, RawTransactionForwarder, @@ -17,7 +19,7 @@ impl EthTransactions for OpEthApi { EthTransactions::provider(&self.inner) } - fn raw_tx_forwarder(&self) -> Option> { + fn raw_tx_forwarder(&self) -> Option> { self.inner.raw_tx_forwarder() } @@ -29,7 +31,7 @@ impl EthTransactions for OpEthApi { impl LoadTransaction for OpEthApi { type Pool = Eth::Pool; - fn provider(&self) -> impl reth_provider::TransactionsProvider { + fn provider(&self) -> impl TransactionsProvider { LoadTransaction::provider(&self.inner) } diff --git a/crates/rpc/rpc/Cargo.toml b/crates/rpc/rpc/Cargo.toml index 56a28e8057e3..b6a0020dca33 100644 --- a/crates/rpc/rpc/Cargo.toml +++ b/crates/rpc/rpc/Cargo.toml @@ -32,7 +32,6 @@ reth-network-peers.workspace = true reth-evm.workspace = true reth-rpc-eth-types.workspace = true reth-rpc-server-types.workspace = true -reth-evm-optimism = { workspace = true, optional = true } reth-node-api.workspace = true # eth @@ -94,6 +93,5 @@ optimism = [ "reth-rpc-eth-api/optimism", "reth-revm/optimism", "jsonrpsee-types", - "reth-evm-optimism", "reth-rpc-eth-types/optimism", ] diff --git a/crates/rpc/rpc/src/eth/helpers/mod.rs b/crates/rpc/rpc/src/eth/helpers/mod.rs index 37a073d5622a..175d72c7648c 100644 --- a/crates/rpc/rpc/src/eth/helpers/mod.rs +++ b/crates/rpc/rpc/src/eth/helpers/mod.rs @@ -9,7 +9,6 @@ mod fees; #[cfg(feature = "optimism")] pub mod optimism; mod pending_block; -#[cfg(not(feature = "optimism"))] mod receipt; mod spec; mod state; diff --git a/crates/rpc/rpc/src/eth/helpers/optimism.rs b/crates/rpc/rpc/src/eth/helpers/optimism.rs index d6ed66f63aef..03d45dbe4709 100644 --- a/crates/rpc/rpc/src/eth/helpers/optimism.rs +++ b/crates/rpc/rpc/src/eth/helpers/optimism.rs @@ -1,138 +1,9 @@ //! Loads and formats OP transaction RPC response. use jsonrpsee_types::error::ErrorObject; -use reth_evm_optimism::RethL1BlockInfo; -use reth_primitives::{Receipt, TransactionMeta, TransactionSigned}; -use reth_provider::{BlockIdReader, ChainSpecProvider}; -use reth_rpc_eth_api::helpers::LoadReceipt; -use reth_rpc_eth_types::{EthApiError, EthResult, EthStateCache, ReceiptBuilder}; +use reth_rpc_eth_types::EthApiError; use reth_rpc_server_types::result::internal_rpc_err; -use reth_rpc_types::{AnyTransactionReceipt, OptimismTransactionReceiptFields, ToRpcError}; -use revm::L1BlockInfo; - -use crate::EthApi; - -/// L1 fee and data gas for a transaction, along with the L1 block info. -#[derive(Debug, Default, Clone)] -pub struct OptimismTxMeta { - /// The L1 block info. - pub l1_block_info: Option, - /// The L1 fee for the block. - pub l1_fee: Option, - /// The L1 data gas for the block. - pub l1_data_gas: Option, -} - -impl OptimismTxMeta { - /// Creates a new [`OptimismTxMeta`]. - pub const fn new( - l1_block_info: Option, - l1_fee: Option, - l1_data_gas: Option, - ) -> Self { - Self { l1_block_info, l1_fee, l1_data_gas } - } -} - -impl EthApi -where - Provider: BlockIdReader + ChainSpecProvider, -{ - /// Builds [`OptimismTxMeta`] object using the provided [`TransactionSigned`], L1 block - /// info and block timestamp. The [`L1BlockInfo`] is used to calculate the l1 fee and l1 data - /// gas for the transaction. If the [`L1BlockInfo`] is not provided, the meta info will be - /// empty. - pub fn build_op_tx_meta( - &self, - tx: &TransactionSigned, - l1_block_info: Option, - block_timestamp: u64, - ) -> EthResult { - let Some(l1_block_info) = l1_block_info else { return Ok(OptimismTxMeta::default()) }; - - let (l1_fee, l1_data_gas) = if !tx.is_deposit() { - let envelope_buf = tx.envelope_encoded(); - - let inner_l1_fee = l1_block_info - .l1_tx_data_fee( - &self.inner.provider().chain_spec(), - block_timestamp, - &envelope_buf, - tx.is_deposit(), - ) - .map_err(|_| OptimismEthApiError::L1BlockFeeError)?; - let inner_l1_data_gas = l1_block_info - .l1_data_gas(&self.inner.provider().chain_spec(), block_timestamp, &envelope_buf) - .map_err(|_| OptimismEthApiError::L1BlockGasError)?; - ( - Some(inner_l1_fee.saturating_to::()), - Some(inner_l1_data_gas.saturating_to::()), - ) - } else { - (None, None) - }; - - Ok(OptimismTxMeta::new(Some(l1_block_info), l1_fee, l1_data_gas)) - } -} - -impl LoadReceipt for EthApi -where - Self: Send + Sync, - Provider: BlockIdReader + ChainSpecProvider, -{ - #[inline] - fn cache(&self) -> &EthStateCache { - self.inner.cache() - } - - async fn build_transaction_receipt( - &self, - tx: TransactionSigned, - meta: TransactionMeta, - receipt: Receipt, - ) -> EthResult { - let (block, receipts) = self - .cache() - .get_block_and_receipts(meta.block_hash) - .await? - .ok_or(EthApiError::UnknownBlockNumber)?; - - let block = block.unseal(); - let l1_block_info = reth_evm_optimism::extract_l1_info(&block).ok(); - let optimism_tx_meta = self.build_op_tx_meta(&tx, l1_block_info, block.timestamp)?; - - let resp_builder = ReceiptBuilder::new(&tx, meta, &receipt, &receipts)?; - let resp_builder = op_receipt_fields(resp_builder, &tx, &receipt, optimism_tx_meta); - - Ok(resp_builder.build()) - } -} - -/// Applies OP specific fields to a receipt. -fn op_receipt_fields( - resp_builder: ReceiptBuilder, - tx: &TransactionSigned, - receipt: &Receipt, - optimism_tx_meta: OptimismTxMeta, -) -> ReceiptBuilder { - let mut op_fields = OptimismTransactionReceiptFields::default(); - - if tx.is_deposit() { - op_fields.deposit_nonce = receipt.deposit_nonce.map(reth_primitives::U64::from); - op_fields.deposit_receipt_version = - receipt.deposit_receipt_version.map(reth_primitives::U64::from); - } else if let Some(l1_block_info) = optimism_tx_meta.l1_block_info { - op_fields.l1_fee = optimism_tx_meta.l1_fee; - op_fields.l1_gas_used = optimism_tx_meta.l1_data_gas.map(|dg| { - dg + l1_block_info.l1_fee_overhead.unwrap_or_default().saturating_to::() - }); - op_fields.l1_fee_scalar = Some(f64::from(l1_block_info.l1_base_fee_scalar) / 1_000_000.0); - op_fields.l1_gas_price = Some(l1_block_info.l1_base_fee.saturating_to()); - } - - resp_builder.add_other_fields(op_fields.into()) -} +use reth_rpc_types::ToRpcError; /// Optimism specific errors, that extend [`EthApiError`]. #[derive(Debug, thiserror::Error)]