Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions crates/rpc/rpc-convert/src/evm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
use reth_evm::EvmEnv;
use std::{convert::Infallible, fmt::Debug};

/// Performs an [`EvmEnv`] to [`EvmEnv`] conversion accompanied by the `TxReq`.
///
/// The `TxReq` represents the transaction request this [`EvmEnv`] has been created for.
///
/// Allows for custom effects on the [`EvmEnv`]. Default implementation `()` passes the input
/// argument with no change.
pub trait EvmEnvConverter<TxReq>: Clone + Debug + Unpin + Send + Sync + 'static {
/// An associated error that can occur during the conversion.
type Err;

/// Performs the conversion.
///
/// See [`EvmEnvConverter`] for more details.
fn convert_evm_env<Spec>(
&self,
request: &TxReq,
evm_env: EvmEnv<Spec>,
) -> Result<EvmEnv<Spec>, Self::Err>;
}

impl<TxReq> EvmEnvConverter<TxReq> for () {
type Err = Infallible;

fn convert_evm_env<Spec>(
&self,
_request: &TxReq,
evm_env: EvmEnv<Spec>,
) -> Result<EvmEnv<Spec>, Self::Err> {
Ok(evm_env)
}
}
2 changes: 2 additions & 0 deletions crates/rpc/rpc-convert/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]

pub mod block;
mod evm;
mod fees;
pub mod receipt;
mod rpc;
pub mod transaction;

pub use block::TryFromBlockResponse;
pub use evm::EvmEnvConverter;
pub use fees::{CallFees, CallFeesError};
pub use receipt::TryFromReceiptResponse;
pub use rpc::*;
Expand Down
105 changes: 92 additions & 13 deletions crates/rpc/rpc-convert/src/transaction.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! Compatibility functions for rpc `Transaction` type.

use crate::{
evm::EvmEnvConverter,
fees::{CallFees, CallFeesError},
RpcHeader, RpcReceipt, RpcTransaction, RpcTxReq, RpcTypes,
};
Expand All @@ -16,7 +17,7 @@ use alloy_rpc_types_eth::{
use core::error;
use reth_evm::{
revm::context_interface::{either::Either, Block},
ConfigureEvm, TxEnvFor,
ConfigureEvm, EvmEnv, TxEnvFor,
};
use reth_primitives_traits::{
HeaderTy, NodePrimitives, SealedHeader, SealedHeaderFor, TransactionMeta, TxTy,
Expand Down Expand Up @@ -144,6 +145,14 @@ pub trait RpcConvert: Send + Sync + Unpin + Clone + Debug + 'static {
block_env: &BlockEnv,
) -> Result<Self::TxEnv, Self::Error>;

/// Creates an EVM environment for execution based on `request` with corresponding
/// `cfg_env` and `block_env`.
fn evm_env<Spec>(
&self,
request: &RpcTxReq<Self::Network>,
evm_env: EvmEnv<Spec>,
) -> Result<EvmEnv<Spec>, Self::Error>;

/// Converts a set of primitive receipts to RPC representations. It is guaranteed that all
/// receipts are from the same block.
fn convert_receipts(
Expand Down Expand Up @@ -505,14 +514,24 @@ pub struct TransactionConversionError(String);
/// is [`TransactionInfo`] then `()` can be used as `Map` which trivially passes over the input
/// object.
#[derive(Debug)]
pub struct RpcConverter<Network, Evm, Receipt, Header = (), Map = (), SimTx = (), RpcTx = ()> {
pub struct RpcConverter<
Network,
Evm,
Receipt,
Header = (),
Map = (),
SimTx = (),
RpcTx = (),
EvmEnvC = (),
> {
network: PhantomData<Network>,
evm: PhantomData<Evm>,
receipt_converter: Receipt,
header_converter: Header,
mapper: Map,
sim_tx_converter: SimTx,
rpc_tx_converter: RpcTx,
evm_env_converter: EvmEnvC,
}

impl<Network, Evm, Receipt> RpcConverter<Network, Evm, Receipt> {
Expand All @@ -526,22 +545,26 @@ impl<Network, Evm, Receipt> RpcConverter<Network, Evm, Receipt> {
mapper: (),
sim_tx_converter: (),
rpc_tx_converter: (),
evm_env_converter: (),
}
}
}

impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC>
RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC>
{
/// Converts the network type
pub fn with_network<N>(self) -> RpcConverter<N, Evm, Receipt, Header, Map, SimTx, RpcTx> {
pub fn with_network<N>(
self,
) -> RpcConverter<N, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC> {
let Self {
receipt_converter,
header_converter,
mapper,
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
..
} = self;
RpcConverter {
Expand All @@ -552,14 +575,15 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}

/// Configures the header converter.
pub fn with_header_converter<HeaderNew>(
self,
header_converter: HeaderNew,
) -> RpcConverter<Network, Evm, Receipt, HeaderNew, Map, SimTx, RpcTx> {
) -> RpcConverter<Network, Evm, Receipt, HeaderNew, Map, SimTx, RpcTx, EvmEnvC> {
let Self {
receipt_converter,
header_converter: _,
Expand All @@ -568,6 +592,7 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
} = self;
RpcConverter {
receipt_converter,
Expand All @@ -577,14 +602,15 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}

/// Configures the mapper.
pub fn with_mapper<MapNew>(
self,
mapper: MapNew,
) -> RpcConverter<Network, Evm, Receipt, Header, MapNew, SimTx, RpcTx> {
) -> RpcConverter<Network, Evm, Receipt, Header, MapNew, SimTx, RpcTx, EvmEnvC> {
let Self {
receipt_converter,
header_converter,
Expand All @@ -593,6 +619,7 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
} = self;
RpcConverter {
receipt_converter,
Expand All @@ -602,21 +629,23 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}

/// Swaps the simulate transaction converter with `sim_tx_converter`.
pub fn with_sim_tx_converter<SimTxNew>(
self,
sim_tx_converter: SimTxNew,
) -> RpcConverter<Network, Evm, Receipt, Header, Map, SimTxNew, RpcTx> {
) -> RpcConverter<Network, Evm, Receipt, Header, Map, SimTxNew, RpcTx, EvmEnvC> {
let Self {
receipt_converter,
header_converter,
mapper,
network,
evm,
rpc_tx_converter,
evm_env_converter,
..
} = self;
RpcConverter {
Expand All @@ -627,21 +656,23 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}

/// Swaps the RPC transaction converter with `rpc_tx_converter`.
pub fn with_rpc_tx_converter<RpcTxNew>(
self,
rpc_tx_converter: RpcTxNew,
) -> RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTxNew> {
) -> RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTxNew, EvmEnvC> {
let Self {
receipt_converter,
header_converter,
mapper,
network,
evm,
sim_tx_converter,
evm_env_converter,
..
} = self;
RpcConverter {
Expand All @@ -652,6 +683,34 @@ impl<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}

/// Swaps the EVM environment converter with `evm_env_converter`.
pub fn with_evm_env_converter<EvmEnvNew>(
self,
evm_env_converter: EvmEnvNew,
) -> RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvNew> {
let Self {
receipt_converter,
header_converter,
mapper,
network,
evm,
sim_tx_converter,
rpc_tx_converter,
..
} = self;
RpcConverter {
receipt_converter,
header_converter,
mapper,
network,
evm,
sim_tx_converter,
rpc_tx_converter,
evm_env_converter,
}
}
}
Expand All @@ -674,12 +733,21 @@ where
mapper: Default::default(),
sim_tx_converter: Default::default(),
rpc_tx_converter: Default::default(),
evm_env_converter: Default::default(),
}
}
}

impl<Network, Evm, Receipt: Clone, Header: Clone, Map: Clone, SimTx: Clone, RpcTx: Clone> Clone
for RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
impl<
Network,
Evm,
Receipt: Clone,
Header: Clone,
Map: Clone,
SimTx: Clone,
RpcTx: Clone,
EvmEnvC: Clone,
> Clone for RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC>
{
fn clone(&self) -> Self {
Self {
Expand All @@ -690,12 +758,13 @@ impl<Network, Evm, Receipt: Clone, Header: Clone, Map: Clone, SimTx: Clone, RpcT
mapper: self.mapper.clone(),
sim_tx_converter: self.sim_tx_converter.clone(),
rpc_tx_converter: self.rpc_tx_converter.clone(),
evm_env_converter: self.evm_env_converter.clone(),
}
}
}

impl<N, Network, Evm, Receipt, Header, Map, SimTx, RpcTx> RpcConvert
for RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx>
impl<N, Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC> RpcConvert
for RpcConverter<Network, Evm, Receipt, Header, Map, SimTx, RpcTx, EvmEnvC>
where
N: NodePrimitives,
Network: RpcTypes + Send + Sync + Unpin + Clone + Debug,
Expand All @@ -713,6 +782,7 @@ where
+ Unpin
+ Sync
+ Send
+ From<EvmEnvC::Err>
+ Into<jsonrpsee_types::ErrorObject<'static>>,
> + Send
+ Sync
Expand All @@ -724,6 +794,7 @@ where
SimTx: SimTxConverter<RpcTxReq<Network>, TxTy<N>>,
RpcTx:
RpcTxConverter<TxTy<N>, Network::TransactionResponse, <Map as TxInfoMapper<TxTy<N>>>::Out>,
EvmEnvC: EvmEnvConverter<RpcTxReq<Network>>,
{
type Primitives = N;
type Network = Network;
Expand Down Expand Up @@ -760,6 +831,14 @@ where
Ok(request.try_into_tx_env(cfg_env, block_env)?)
}

fn evm_env<Spec>(
&self,
request: &RpcTxReq<Self::Network>,
evm_env: EvmEnv<Spec>,
) -> Result<EvmEnv<Spec>, Self::Error> {
Ok(self.evm_env_converter.convert_evm_env(request, evm_env)?)
}

fn convert_receipts(
&self,
receipts: Vec<ConvertReceiptInput<'_, Self::Primitives>>,
Expand Down
1 change: 1 addition & 0 deletions crates/rpc/rpc-eth-api/src/helpers/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,7 @@ pub trait Call:
}

let request_gas = request.as_ref().gas_limit();
evm_env = self.tx_resp_builder().evm_env(&request, evm_env)?;
let mut tx_env = self.create_txn_env(&evm_env, request, &mut *db)?;

// lower the basefee to 0 to avoid breaking EVM invariants (basefee < gasprice): <https://github.com/ethereum/go-ethereum/blob/355228b011ef9a85ebc0f21e7196f892038d49f0/internal/ethapi/api.go#L700-L704>
Expand Down