1use alloy_primitives::{Address, B256};
4use alloy_rpc_types_engine::PayloadAttributes;
5use node::NodeTestContext;
6use reth_chainspec::{ChainSpec, EthereumHardfork};
7use reth_db::{test_utils::TempDatabase, DatabaseEnv};
8use reth_network_api::test_utils::PeersHandleProvider;
9use reth_node_builder::{
10 components::NodeComponentsBuilder,
11 rpc::{EngineValidatorAddOn, RethRpcAddOns},
12 FullNodeTypesAdapter, Node, NodeAdapter, NodeComponents, NodeTypes, NodeTypesWithDBAdapter,
13 PayloadTypes,
14};
15use reth_provider::providers::{BlockchainProvider, NodeTypesForProvider};
16use std::sync::Arc;
17use wallet::Wallet;
18
19pub mod node;
21pub mod testsuite;
22
23pub mod transaction;
25
26pub mod wallet;
28
29mod payload;
31
32pub mod setup_import;
34
35mod network;
37
38mod rpc;
40
41pub mod test_rlp_utils;
43
44pub mod trie;
46
47mod setup_builder;
49pub use setup_builder::E2ETestSetupBuilder;
50
51pub async fn setup<N>(
53 num_nodes: usize,
54 chain_spec: Arc<N::ChainSpec>,
55 is_dev: bool,
56 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
57 + Send
58 + Sync
59 + Copy
60 + 'static,
61) -> eyre::Result<(Vec<NodeHelperType<N>>, Wallet)>
62where
63 N: NodeBuilderHelper,
64{
65 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
66 .with_node_config_modifier(move |config| config.set_dev(is_dev))
67 .build()
68 .await
69}
70
71pub async fn setup_engine<N>(
73 num_nodes: usize,
74 chain_spec: Arc<N::ChainSpec>,
75 is_dev: bool,
76 tree_config: reth_node_api::TreeConfig,
77 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
78 + Send
79 + Sync
80 + Copy
81 + 'static,
82) -> eyre::Result<(
83 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
84 Wallet,
85)>
86where
87 N: NodeBuilderHelper,
88{
89 setup_engine_with_connection::<N>(
90 num_nodes,
91 chain_spec,
92 is_dev,
93 tree_config,
94 attributes_generator,
95 true,
96 )
97 .await
98}
99
100pub async fn setup_engine_with_connection<N>(
102 num_nodes: usize,
103 chain_spec: Arc<N::ChainSpec>,
104 is_dev: bool,
105 tree_config: reth_node_api::TreeConfig,
106 attributes_generator: impl Fn(u64) -> <<N as NodeTypes>::Payload as PayloadTypes>::PayloadAttributes
107 + Send
108 + Sync
109 + Copy
110 + 'static,
111 connect_nodes: bool,
112) -> eyre::Result<(
113 Vec<NodeHelperType<N, BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>>>,
114 Wallet,
115)>
116where
117 N: NodeBuilderHelper,
118{
119 E2ETestSetupBuilder::new(num_nodes, chain_spec, attributes_generator)
120 .with_tree_config_modifier(move |base| {
121 tree_config.clone().with_cross_block_cache_size(base.cross_block_cache_size())
123 })
124 .with_node_config_modifier(move |config| config.set_dev(is_dev))
125 .with_connect_nodes(connect_nodes)
126 .build()
127 .await
128}
129
130pub fn eth_payload_attributes_for_fork(
138 fork: EthereumHardfork,
139 timestamp: u64,
140) -> PayloadAttributes {
141 PayloadAttributes {
142 timestamp,
143 prev_randao: B256::ZERO,
144 suggested_fee_recipient: Address::ZERO,
145 withdrawals: (fork >= EthereumHardfork::Shanghai).then(Vec::new),
146 parent_beacon_block_root: (fork >= EthereumHardfork::Cancun).then_some(B256::ZERO),
147 slot_number: (fork >= EthereumHardfork::Amsterdam).then_some(timestamp),
148 ..Default::default()
149 }
150}
151
152pub type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
156type TmpNodeAdapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
157 FullNodeTypesAdapter<N, TmpDB, Provider>;
158
159pub type Adapter<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> = NodeAdapter<
161 TmpNodeAdapter<N, Provider>,
162 <<N as Node<TmpNodeAdapter<N, Provider>>>::ComponentsBuilder as NodeComponentsBuilder<
163 TmpNodeAdapter<N, Provider>,
164 >>::Components,
165>;
166
167pub type NodeHelperType<N, Provider = BlockchainProvider<NodeTypesWithDBAdapter<N, TmpDB>>> =
169 NodeTestContext<Adapter<N, Provider>, <N as Node<TmpNodeAdapter<N, Provider>>>::AddOns>;
170
171pub trait NodeBuilderHelper
173where
174 Self: Default
175 + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
176 + Node<
177 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
178 ComponentsBuilder: NodeComponentsBuilder<
179 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
180 Components: NodeComponents<
181 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
182 Network: PeersHandleProvider,
183 >,
184 >,
185 AddOns: RethRpcAddOns<
186 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
187 > + EngineValidatorAddOn<
188 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
189 >,
190 ChainSpec: From<ChainSpec> + Clone,
191 >,
192{
193}
194
195impl<T> NodeBuilderHelper for T where
196 Self: Default
197 + NodeTypesForProvider<Payload: PayloadTypes<PayloadAttributes: From<PayloadAttributes>>>
198 + Node<
199 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
200 ComponentsBuilder: NodeComponentsBuilder<
201 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
202 Components: NodeComponents<
203 TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
204 Network: PeersHandleProvider,
205 >,
206 >,
207 AddOns: RethRpcAddOns<
208 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
209 > + EngineValidatorAddOn<
210 Adapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
211 >,
212 ChainSpec: From<ChainSpec> + Clone,
213 >
214{
215}