use core::fmt; use super::{HlEthApi, HlRpcNodeCore}; use crate::{HlBlock, node::evm::apply_precompiles}; use alloy_consensus::transaction::TxHashRef; use alloy_evm::Evm; use alloy_primitives::B256; use reth::rpc::server_types::eth::EthApiError; use reth_evm::{ConfigureEvm, Database, EvmEnvFor, HaltReasonFor, InspectorFor, SpecFor, TxEnvFor}; use reth_primitives::{NodePrimitives, Recovered}; use reth_provider::{ProviderError, ProviderTx}; use reth_rpc_eth_api::{ FromEvmError, RpcConvert, RpcNodeCore, helpers::{Call, EthCall}, }; use revm::{DatabaseCommit, context::result::ResultAndState}; impl HlRpcNodeCore for N where N: RpcNodeCore> {} impl EthCall for HlEthApi where N: HlRpcNodeCore, EthApiError: FromEvmError, Rpc: RpcConvert< Primitives = N::Primitives, Error = EthApiError, TxEnv = TxEnvFor, Spec = SpecFor, >, { } impl Call for HlEthApi where N: HlRpcNodeCore, EthApiError: FromEvmError, Rpc: RpcConvert< Primitives = N::Primitives, Error = EthApiError, TxEnv = TxEnvFor, Spec = SpecFor, >, { #[inline] fn call_gas_limit(&self) -> u64 { self.inner.eth_api.gas_cap() } #[inline] fn max_simulate_blocks(&self) -> u64 { self.inner.eth_api.max_simulate_blocks() } fn transact( &self, db: DB, evm_env: EvmEnvFor, tx_env: TxEnvFor, ) -> Result>, Self::Error> where DB: Database + fmt::Debug, { let block_number = evm_env.block_env().number; let hl_extras = self.get_hl_extras(block_number.to::().into())?; let mut evm = self.evm_config().evm_with_env(db, evm_env); apply_precompiles(&mut evm, &hl_extras); let res = evm.transact(tx_env).map_err(Self::Error::from_evm_err)?; Ok(res) } fn transact_with_inspector( &self, db: DB, evm_env: EvmEnvFor, tx_env: TxEnvFor, inspector: I, ) -> Result>, Self::Error> where DB: Database + fmt::Debug, I: InspectorFor, { let block_number = evm_env.block_env().number; let hl_extras = self.get_hl_extras(block_number.to::().into())?; let mut evm = self.evm_config().evm_with_env_and_inspector(db, evm_env, inspector); apply_precompiles(&mut evm, &hl_extras); let res = evm.transact(tx_env).map_err(Self::Error::from_evm_err)?; Ok(res) } fn replay_transactions_until<'a, DB, I>( &self, db: &mut DB, evm_env: EvmEnvFor, transactions: I, target_tx_hash: B256, ) -> Result where DB: Database + DatabaseCommit + core::fmt::Debug, I: IntoIterator>>, { let block_number = evm_env.block_env().number; let hl_extras = self.get_hl_extras(block_number.to::().into())?; let mut evm = self.evm_config().evm_with_env(db, evm_env); apply_precompiles(&mut evm, &hl_extras); let mut index = 0; for tx in transactions { if *tx.tx_hash() == target_tx_hash { // reached the target transaction break; } let tx_env = self.evm_config().tx_env(tx); evm.transact_commit(tx_env).map_err(Self::Error::from_evm_err)?; index += 1; } Ok(index) } }