From fb342b059e2cff9cac75f84f7a27e1dae00b701f Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Wed, 12 Jun 2024 02:04:15 +0200 Subject: [PATCH] Add genesis param to customize collector address --- Cargo.lock | 1 + Cargo.toml | 1 + src/evm_config.rs | 31 ++++++++++++++++++------------- src/lib.rs | 14 +++++++++++++- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1a1922f..a5caf16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6497,6 +6497,7 @@ dependencies = [ "reth-evm-ethereum", "reth-node-ethereum", "revm", + "serde_json", "tikv-jemallocator", ] diff --git a/Cargo.toml b/Cargo.toml index 3c91cc7..d789b16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ clap = { version = "4.5.6", features = ["derive"] } alloy-sol-macro = "0.7.6" alloy-sol-types = "0.7.6" revm = "9.0.0" +serde_json = "1.0.117" [target.'cfg(unix)'.dependencies] tikv-jemallocator = { version = "0.5.0", optional = true } diff --git a/src/evm_config.rs b/src/evm_config.rs index 294dcba..68ffb4a 100644 --- a/src/evm_config.rs +++ b/src/evm_config.rs @@ -12,18 +12,16 @@ use reth_evm_ethereum::EthEvmConfig; use revm::handler::mainnet::reward_beneficiary as reward_beneficiary_mainnet; use std::sync::Arc; -// TODO: Define a per-network collector address configurable via genesis file -const COLLECTOR_ADDRESS: Address = address!("6BBe78ee9e474842Dbd4AB4987b3CeFE88426A92"); - /// Reward beneficiary with gas fee. #[inline] pub fn reward_beneficiary( context: &mut Context, gas: &Gas, + collector_address: Address, ) -> Result<(), EVMError> { reward_beneficiary_mainnet::(context, gas)?; if SPEC::enabled(SpecId::LONDON) { - mint_basefee_to_collector_address::(context, gas)?; + mint_basefee_to_collector_address::(context, gas, collector_address)?; } Ok(()) } @@ -33,6 +31,7 @@ pub fn reward_beneficiary( pub fn mint_basefee_to_collector_address( context: &mut Context, gas: &Gas, + collector_address: Address, ) -> Result<(), EVMError> { // TODO: Define a per-network collector address configurable via genesis file let base_fee = context.evm.env.block.basefee; @@ -42,7 +41,7 @@ pub fn mint_basefee_to_collector_address( .evm .inner .journaled_state - .load_account(COLLECTOR_ADDRESS, &mut context.evm.inner.db)?; + .load_account(collector_address, &mut context.evm.inner.db)?; collector_account.mark_touch(); collector_account.info.balance = collector_account @@ -54,19 +53,23 @@ pub fn mint_basefee_to_collector_address( } /// Custom EVM configuration -#[derive(Debug, Clone, Copy, Default)] -pub struct GnosisEvmConfig; +#[derive(Debug, Clone, Copy)] +pub struct GnosisEvmConfig { + pub collector_address: Address, +} impl ConfigureEvm for GnosisEvmConfig { type DefaultExternalContext<'a> = (); fn evm<'a, DB: Database + 'a>(&self, db: DB) -> Evm<'a, Self::DefaultExternalContext<'a>, DB> { + let collector_address = self.collector_address; EvmBuilder::default() .with_db(db) - .append_handler_register_box(Box::new(|h| { + .append_handler_register_box(Box::new(move |h| { spec_to_generic!(h.spec_id(), { - h.post_execution.reward_beneficiary = - Arc::new(reward_beneficiary::); + h.post_execution.reward_beneficiary = Arc::new(move |context, gas| { + reward_beneficiary::(context, gas, collector_address) + }); }); })) .build() @@ -77,13 +80,15 @@ impl ConfigureEvm for GnosisEvmConfig { DB: Database + 'a, I: GetInspector, { + let collector_address = self.collector_address; EvmBuilder::default() .with_db(db) .with_external_context(inspector) - .append_handler_register_box(Box::new(|h| { + .append_handler_register_box(Box::new(move |h| { spec_to_generic!(h.spec_id(), { - h.post_execution.reward_beneficiary = - Arc::new(reward_beneficiary::); + h.post_execution.reward_beneficiary = Arc::new(move |context, gas| { + reward_beneficiary::(context, gas, collector_address) + }); }); })) .append_handler_register(inspector_handle_register) diff --git a/src/lib.rs b/src/lib.rs index b68904a..f13c2eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ use evm_config::GnosisEvmConfig; use execute::GnosisExecutorProvider; +use eyre::eyre; use reth::{ api::NodeTypes, builder::{ @@ -98,7 +99,18 @@ where ctx: &BuilderContext, ) -> eyre::Result<(Self::EVM, Self::Executor)> { let chain_spec = ctx.chain_spec(); - let evm_config = GnosisEvmConfig; + let collector_address = ctx + .config() + .chain + .genesis() + .config + .extra_fields + .get("eip1559collector") + .ok_or(eyre!("no eip1559collector field"))?; + + let evm_config = GnosisEvmConfig { + collector_address: serde_json::from_value(collector_address.clone())?, + }; let executor = GnosisExecutorProvider::new(chain_spec, evm_config); Ok((evm_config, executor))