feat: improve e2e tests API + feeHistory test (#12058)

This commit is contained in:
Arsenii Kulikov
2024-10-25 09:01:44 +04:00
committed by GitHub
parent c3182f2a64
commit d9889787a7
16 changed files with 202 additions and 62 deletions

View File

@ -45,3 +45,4 @@ alloy-rpc-types.workspace = true
alloy-network.workspace = true
alloy-consensus = { workspace = true, features = ["kzg"] }
tracing.workspace = true
derive_more.workspace = true

View File

@ -50,12 +50,13 @@ impl<E: EngineTypes, ChainSpec: EthereumHardforks> EngineApiTestContext<E, Chain
payload: E::BuiltPayload,
payload_builder_attributes: E::PayloadBuilderAttributes,
expected_status: PayloadStatusEnum,
versioned_hashes: Vec<B256>,
) -> eyre::Result<B256>
where
E::ExecutionPayloadEnvelopeV3: From<E::BuiltPayload> + PayloadEnvelopeExt,
E::ExecutionPayloadEnvelopeV4: From<E::BuiltPayload> + PayloadEnvelopeExt,
{
let versioned_hashes =
payload.block().blob_versioned_hashes_iter().copied().collect::<Vec<_>>();
// submit payload to engine api
let submission = if self
.chain_spec

View File

@ -49,6 +49,7 @@ pub async fn setup<N>(
num_nodes: usize,
chain_spec: Arc<N::ChainSpec>,
is_dev: bool,
attributes_generator: impl Fn(u64) -> <<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadBuilderAttributes + Copy + 'static,
) -> eyre::Result<(Vec<NodeHelperType<N, N::AddOns>>, TaskManager, Wallet)>
where
N: Default + Node<TmpNodeAdapter<N>> + NodeTypesWithEngine<ChainSpec: EthereumHardforks>,
@ -84,7 +85,7 @@ where
.launch()
.await?;
let mut node = NodeTestContext::new(node).await?;
let mut node = NodeTestContext::new(node, attributes_generator).await?;
// Connect each node in a chain.
if let Some(previous_node) = nodes.last_mut() {
@ -109,6 +110,7 @@ pub async fn setup_engine<N>(
num_nodes: usize,
chain_spec: Arc<N::ChainSpec>,
is_dev: bool,
attributes_generator: impl Fn(u64) -> <<N as NodeTypesWithEngine>::Engine as PayloadTypes>::PayloadBuilderAttributes + Copy + 'static,
) -> eyre::Result<(
Vec<NodeHelperType<N, N::AddOns, BlockchainProvider2<NodeTypesWithDBAdapter<N, TmpDB>>>>,
TaskManager,
@ -166,7 +168,7 @@ where
})
.await?;
let mut node = NodeTestContext::new(node).await?;
let mut node = NodeTestContext::new(node, attributes_generator).await?;
// Connect each node in a chain.
if let Some(previous_node) = nodes.last_mut() {

View File

@ -59,12 +59,15 @@ where
AddOns: RethRpcAddOns<Node>,
{
/// Creates a new test node
pub async fn new(node: FullNode<Node, AddOns>) -> eyre::Result<Self> {
pub async fn new(
node: FullNode<Node, AddOns>,
attributes_generator: impl Fn(u64) -> Engine::PayloadBuilderAttributes + 'static,
) -> eyre::Result<Self> {
let builder = node.payload_builder.clone();
Ok(Self {
inner: node.clone(),
payload: PayloadTestContext::new(builder).await?,
payload: PayloadTestContext::new(builder, attributes_generator).await?,
network: NetworkTestContext::new(node.network.clone()),
engine_api: EngineApiTestContext {
chain_spec: node.chain_spec(),
@ -90,7 +93,6 @@ where
&mut self,
length: u64,
tx_generator: impl Fn(u64) -> Pin<Box<dyn Future<Output = Bytes>>>,
attributes_generator: impl Fn(u64) -> Engine::PayloadBuilderAttributes + Copy,
) -> eyre::Result<Vec<(Engine::BuiltPayload, Engine::PayloadBuilderAttributes)>>
where
Engine::ExecutionPayloadEnvelopeV3: From<Engine::BuiltPayload> + PayloadEnvelopeExt,
@ -101,7 +103,7 @@ where
for i in 0..length {
let raw_tx = tx_generator(i).await;
let tx_hash = self.rpc.inject_tx(raw_tx).await?;
let (payload, eth_attr) = self.advance_block(vec![], attributes_generator).await?;
let (payload, eth_attr) = self.advance_block().await?;
let block_hash = payload.block().hash();
let block_number = payload.block().number;
self.assert_new_block(tx_hash, block_hash, block_number).await?;
@ -116,14 +118,13 @@ where
/// It triggers the resolve payload via engine api and expects the built payload event.
pub async fn new_payload(
&mut self,
attributes_generator: impl Fn(u64) -> Engine::PayloadBuilderAttributes,
) -> eyre::Result<(Engine::BuiltPayload, Engine::PayloadBuilderAttributes)>
where
<Engine as EngineTypes>::ExecutionPayloadEnvelopeV3:
From<Engine::BuiltPayload> + PayloadEnvelopeExt,
{
// trigger new payload building draining the pool
let eth_attr = self.payload.new_payload(attributes_generator).await.unwrap();
let eth_attr = self.payload.new_payload().await.unwrap();
// first event is the payload attributes
self.payload.expect_attr_event(eth_attr.clone()).await?;
// wait for the payload builder to have finished building
@ -137,8 +138,6 @@ where
/// Advances the node forward one block
pub async fn advance_block(
&mut self,
versioned_hashes: Vec<B256>,
attributes_generator: impl Fn(u64) -> Engine::PayloadBuilderAttributes,
) -> eyre::Result<(Engine::BuiltPayload, Engine::PayloadBuilderAttributes)>
where
<Engine as EngineTypes>::ExecutionPayloadEnvelopeV3:
@ -146,16 +145,11 @@ where
<Engine as EngineTypes>::ExecutionPayloadEnvelopeV4:
From<Engine::BuiltPayload> + PayloadEnvelopeExt,
{
let (payload, eth_attr) = self.new_payload(attributes_generator).await?;
let (payload, eth_attr) = self.new_payload().await?;
let block_hash = self
.engine_api
.submit_payload(
payload.clone(),
eth_attr.clone(),
PayloadStatusEnum::Valid,
versioned_hashes,
)
.submit_payload(payload.clone(), eth_attr.clone(), PayloadStatusEnum::Valid)
.await?;
// trigger forkchoice update via engine api to commit the block to the blockchain

View File

@ -5,29 +5,36 @@ use reth_payload_primitives::{Events, PayloadBuilder, PayloadTypes};
use tokio_stream::wrappers::BroadcastStream;
/// Helper for payload operations
#[derive(Debug)]
#[derive(derive_more::Debug)]
pub struct PayloadTestContext<T: PayloadTypes> {
pub payload_event_stream: BroadcastStream<Events<T>>,
payload_builder: PayloadBuilderHandle<T>,
pub timestamp: u64,
#[debug(skip)]
attributes_generator: Box<dyn Fn(u64) -> T::PayloadBuilderAttributes>,
}
impl<T: PayloadTypes> PayloadTestContext<T> {
/// Creates a new payload helper
pub async fn new(payload_builder: PayloadBuilderHandle<T>) -> eyre::Result<Self> {
pub async fn new(
payload_builder: PayloadBuilderHandle<T>,
attributes_generator: impl Fn(u64) -> T::PayloadBuilderAttributes + 'static,
) -> eyre::Result<Self> {
let payload_events = payload_builder.subscribe().await?;
let payload_event_stream = payload_events.into_stream();
// Cancun timestamp
Ok(Self { payload_event_stream, payload_builder, timestamp: 1710338135 })
Ok(Self {
payload_event_stream,
payload_builder,
timestamp: 1710338135,
attributes_generator: Box::new(attributes_generator),
})
}
/// Creates a new payload job from static attributes
pub async fn new_payload(
&mut self,
attributes_generator: impl Fn(u64) -> T::PayloadBuilderAttributes,
) -> eyre::Result<T::PayloadBuilderAttributes> {
pub async fn new_payload(&mut self) -> eyre::Result<T::PayloadBuilderAttributes> {
self.timestamp += 1;
let attributes = attributes_generator(self.timestamp);
let attributes = (self.attributes_generator)(self.timestamp);
self.payload_builder.send_new_payload(attributes.clone()).await.unwrap()?;
Ok(attributes)
}