From d456af044e886243577a8a48c42e7d7fdec160d5 Mon Sep 17 00:00:00 2001 From: Soubhik Singha Mahapatra <160333583+Soubhik-10@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:21:19 +0530 Subject: [PATCH] Created GeneratePayloadAttributes e2e Action (#15234) Co-authored-by: Federico Gimenez --- .../e2e-test-utils/src/testsuite/actions.rs | 36 ++++++++++++++++++- crates/e2e-test-utils/src/testsuite/mod.rs | 12 ++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/crates/e2e-test-utils/src/testsuite/actions.rs b/crates/e2e-test-utils/src/testsuite/actions.rs index 695c001f94..23dc008df2 100644 --- a/crates/e2e-test-utils/src/testsuite/actions.rs +++ b/crates/e2e-test-utils/src/testsuite/actions.rs @@ -225,6 +225,37 @@ where }) } } + +/// Store payload attributes for the next block. +#[derive(Debug, Default)] +pub struct GeneratePayloadAttributes {} + +impl Action for GeneratePayloadAttributes +where + Engine: EngineTypes, +{ + fn execute<'a>(&'a mut self, env: &'a mut Environment) -> BoxFuture<'a, Result<()>> { + Box::pin(async move { + let latest_block = env + .latest_block_info + .as_ref() + .ok_or_else(|| eyre::eyre!("No latest block information available"))?; + let block_number = latest_block.number; + let timestamp = env.latest_header_time + env.block_timestamp_increment; + let payload_attributes = alloy_rpc_types_engine::PayloadAttributes { + timestamp, + prev_randao: B256::random(), + suggested_fee_recipient: alloy_primitives::Address::random(), + withdrawals: Some(vec![]), + parent_beacon_block_root: Some(B256::ZERO), + }; + + env.payload_attributes.insert(latest_block.number + 1, payload_attributes); + debug!("Stored payload attributes for block {}", block_number + 1); + Ok(()) + }) + } +} /// Action that produces a sequence of blocks using the available clients #[derive(Debug)] pub struct ProduceBlocks { @@ -254,7 +285,10 @@ where fn execute<'a>(&'a mut self, env: &'a mut Environment) -> BoxFuture<'a, Result<()>> { Box::pin(async move { // Create a sequence for producing a single block - let mut sequence = Sequence::new(vec![Box::new(PickNextBlockProducer::default())]); + let mut sequence = Sequence::new(vec![ + Box::new(PickNextBlockProducer::default()), + Box::new(GeneratePayloadAttributes::default()), + ]); for _ in 0..self.num_blocks { sequence.execute(env).await?; } diff --git a/crates/e2e-test-utils/src/testsuite/mod.rs b/crates/e2e-test-utils/src/testsuite/mod.rs index e9ecd001a1..5e9636f17c 100644 --- a/crates/e2e-test-utils/src/testsuite/mod.rs +++ b/crates/e2e-test-utils/src/testsuite/mod.rs @@ -11,9 +11,10 @@ use reth_engine_local::LocalPayloadAttributesBuilder; use reth_node_api::{NodeTypesWithEngine, PayloadTypes}; use reth_rpc_layer::AuthClientService; use setup::Setup; -use std::marker::PhantomData; +use std::{collections::HashMap, marker::PhantomData}; pub mod actions; pub mod setup; +use alloy_rpc_types_engine::PayloadAttributes; #[cfg(test)] mod examples; @@ -46,6 +47,12 @@ pub struct Environment { pub latest_block_info: Option, /// Last producer index pub last_producer_idx: Option, + /// Stores payload attributes indexed by block number + pub payload_attributes: HashMap, + /// Tracks the latest block header timestamp + pub latest_header_time: u64, + /// Defines the increment for block timestamps (default: 2 seconds) + pub block_timestamp_increment: u64, } impl Default for Environment { @@ -55,6 +62,9 @@ impl Default for Environment { _phantom: Default::default(), latest_block_info: None, last_producer_idx: None, + payload_attributes: Default::default(), + latest_header_time: 0, + block_timestamp_increment: 2, } } }