1#![allow(missing_docs)]
2
3use reth_cli_commands::node::NoArgs;
4use reth_enclave::start_blocking_mock_enclave_server;
5use reth_node_builder::{engine_tree_config::TreeConfig, EngineNodeLauncher};
6use reth_provider::providers::BlockchainProvider2;
7use reth_tracing::tracing::*;
8use seismic_node::chainspec::SeismicChainSpecParser;
9use seismic_rpc_api::rpc::{EthApiExt, EthApiOverrideServer, SeismicApi, SeismicApiServer};
10
11fn main() {
12 use clap::Parser;
13 use reth::cli::Cli;
14 use reth_node_ethereum::{node::EthereumAddOns, EthereumNode};
15
16 reth_cli_util::sigsegv_handler::install();
17
18 if std::env::var_os("RUST_BACKTRACE").is_none() {
20 std::env::set_var("RUST_BACKTRACE", "1");
21 }
22
23 if let Err(err) = Cli::<SeismicChainSpecParser, NoArgs>::parse().run(|builder, _| async move {
24 let engine_tree_config = TreeConfig::default();
25
26 let seismic_api = SeismicApi::new(builder.config());
28
29 let node = builder
30 .with_types_and_provider::<EthereumNode, BlockchainProvider2<_>>()
31 .with_components(EthereumNode::components())
32 .with_add_ons(EthereumAddOns::default())
33 .on_node_started(move |ctx| {
34 if ctx.config.enclave.mock_server {
35 ctx.task_executor.spawn(async move {
36 start_blocking_mock_enclave_server(
37 ctx.config.enclave.enclave_server_addr,
38 ctx.config.enclave.enclave_server_port,
39 )
40 .await;
41 });
42 }
43 Ok(())
44 })
45 .extend_rpc_modules(move |ctx| {
46 ctx.modules.replace_configured(
48 EthApiExt::new(ctx.registry.eth_api().clone()).into_rpc(),
49 )?;
50
51 ctx.modules.merge_configured(seismic_api.into_rpc())?;
53 info!(target: "reth::cli", "seismic api configured");
54 Ok(())
55 })
56 .launch_with_fn(|builder| {
57 let launcher = EngineNodeLauncher::new(
58 builder.task_executor().clone(),
59 builder.config().datadir(),
60 engine_tree_config,
61 );
62 builder.launch_with(launcher)
63 })
64 .await?;
65 node.node_exit_future.await
66 }) {
67 eprintln!("Error: {err:?}");
68 std::process::exit(1);
69 }
70}