refactor: Relax apply_precompiles and expose

This commit is contained in:
sprites0
2025-09-04 18:34:24 -04:00
parent 772ff250ce
commit f6432498d8
2 changed files with 11 additions and 12 deletions

View File

@ -4,7 +4,7 @@ use crate::{
hardforks::HlHardforks, hardforks::HlHardforks,
node::{ node::{
primitives::TransactionSigned, primitives::TransactionSigned,
types::{ReadPrecompileInput, ReadPrecompileResult}, types::{HlExtras, ReadPrecompileInput, ReadPrecompileResult},
}, },
}; };
use alloy_consensus::{Transaction, TxReceipt}; use alloy_consensus::{Transaction, TxReceipt};
@ -102,7 +102,7 @@ where
{ {
/// Creates a new HlBlockExecutor. /// Creates a new HlBlockExecutor.
pub fn new(mut evm: EVM, ctx: HlBlockExecutionCtx<'a>, spec: Spec, receipt_builder: R) -> Self { pub fn new(mut evm: EVM, ctx: HlBlockExecutionCtx<'a>, spec: Spec, receipt_builder: R) -> Self {
apply_precompiles(&mut evm, &ctx); apply_precompiles(&mut evm, &ctx.extras);
Self { spec, evm, gas_used: 0, receipts: vec![], receipt_builder, ctx } Self { spec, evm, gas_used: 0, receipts: vec![], receipt_builder, ctx }
} }
@ -155,7 +155,7 @@ where
type Evm = E; type Evm = E;
fn apply_pre_execution_changes(&mut self) -> Result<(), BlockExecutionError> { fn apply_pre_execution_changes(&mut self) -> Result<(), BlockExecutionError> {
apply_precompiles(&mut self.evm, &self.ctx); apply_precompiles(&mut self.evm, &self.ctx.extras);
self.deploy_corewriter_contract()?; self.deploy_corewriter_contract()?;
Ok(()) Ok(())
@ -240,10 +240,9 @@ where
} }
} }
fn apply_precompiles<'a, DB, EVM>(evm: &mut EVM, ctx: &HlBlockExecutionCtx<'a>) pub fn apply_precompiles<EVM>(evm: &mut EVM, extras: &HlExtras)
where where
EVM: Evm<DB = &'a mut State<DB>, Precompiles = PrecompilesMap>, EVM: Evm<Precompiles = PrecompilesMap>,
DB: Database + 'a,
{ {
let block_number = evm.block().number; let block_number = evm.block().number;
let precompiles_mut = evm.precompiles_mut(); let precompiles_mut = evm.precompiles_mut();
@ -255,9 +254,7 @@ where
precompiles_mut.apply_precompile(&address, |_| None); precompiles_mut.apply_precompile(&address, |_| None);
} }
} }
for (address, precompile) in for (address, precompile) in extras.read_precompile_calls.clone().unwrap_or_default().0.iter() {
ctx.extras.read_precompile_calls.clone().unwrap_or_default().0.iter()
{
let precompile = precompile.clone(); let precompile = precompile.clone();
precompiles_mut.apply_precompile(address, |_| { precompiles_mut.apply_precompile(address, |_| {
let precompiles_map: HashMap<ReadPrecompileInput, ReadPrecompileResult> = let precompiles_map: HashMap<ReadPrecompileInput, ReadPrecompileResult> =
@ -271,7 +268,7 @@ where
// NOTE: This is adapted from hyperliquid-dex/hyper-evm-sync#5 // NOTE: This is adapted from hyperliquid-dex/hyper-evm-sync#5
const WARM_PRECOMPILES_BLOCK_NUMBER: u64 = 8_197_684; const WARM_PRECOMPILES_BLOCK_NUMBER: u64 = 8_197_684;
if block_number >= U256::from(WARM_PRECOMPILES_BLOCK_NUMBER) { if block_number >= U256::from(WARM_PRECOMPILES_BLOCK_NUMBER) {
fill_all_precompiles(ctx, precompiles_mut); fill_all_precompiles(extras, precompiles_mut);
} }
} }
@ -279,9 +276,9 @@ fn address_to_u64(address: Address) -> u64 {
address.into_u256().try_into().unwrap() address.into_u256().try_into().unwrap()
} }
fn fill_all_precompiles<'a>(ctx: &HlBlockExecutionCtx<'a>, precompiles_mut: &mut PrecompilesMap) { fn fill_all_precompiles(extras: &HlExtras, precompiles_mut: &mut PrecompilesMap) {
let lowest_address = 0x800; let lowest_address = 0x800;
let highest_address = ctx.extras.highest_precompile_address.map_or(0x80D, address_to_u64); let highest_address = extras.highest_precompile_address.map_or(0x80D, address_to_u64);
for address in lowest_address..=highest_address { for address in lowest_address..=highest_address {
let address = Address::from(U160::from(address)); let address = Address::from(U160::from(address));
precompiles_mut.apply_precompile(&address, |f| { precompiles_mut.apply_precompile(&address, |f| {

View File

@ -32,6 +32,8 @@ mod factory;
mod patch; mod patch;
pub mod receipt_builder; pub mod receipt_builder;
pub use executor::apply_precompiles;
/// HL EVM implementation. /// HL EVM implementation.
/// ///
/// This is a wrapper type around the `revm` evm with optional [`Inspector`] (tracing) /// This is a wrapper type around the `revm` evm with optional [`Inspector`] (tracing)