mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: improve e2e tests API + feeHistory test (#12058)
This commit is contained in:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user