1#[macro_use]
6extern crate newton_prover_core;
7
8pub mod api;
9pub mod cli;
10pub mod commands;
11pub mod config;
12pub mod middleware;
13pub mod processor;
14pub mod server;
15pub mod types;
16pub mod utils;
17
18pub use api::{server::NewtonRpcImpl, task_generator::TaskGeneratorApi};
20pub use server::NewtonRpcServer;
21pub use types::intent::TaskIntent;
22
23pub use thiserror::Error;
25
26use jsonrpsee::server::ServerHandle;
27use newton_data_provider::{DataProviderBuilder, DataProviderConfig};
28use newton_prover_chainio::avs::writer::AvsWriter;
29use newton_prover_core::config::{NewtonAvsConfig, NewtonAvsConfigBuilder};
30use std::sync::Arc;
31use tokio::sync::Mutex;
32use tracing::{error, info};
33
34use crate::config::NewtonRpcConfig;
35
36pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
38
39pub async fn run(
41 config: NewtonAvsConfig<NewtonRpcConfig>,
42 data_provider_config_path: Option<std::path::PathBuf>,
43) -> eyre::Result<ServerHandle> {
44 info!("Configuration loaded successfully");
45
46 let metrics_addr: std::net::SocketAddr = "0.0.0.0:9093".parse()?;
48 let _metrics_handle = newton_prover_metrics::prometheus::init_prometheus_exporter(metrics_addr).await?;
49 info!("Prometheus metrics server started on {}", metrics_addr);
50
51 let signer =
52 newton_prover_core::keys::load_ecdsa(&config.service.task_generator.signer).map_err(eyre::Error::from)?;
53
54 info!("Task Generator account address: {:?}", signer.address());
55 newton_prover_metrics::set_task_manager_address(&signer.address().to_string());
56
57 let avs_writer = Arc::new(
58 AvsWriter::new(
59 config.contracts.avs.newton_prover_task_manager,
60 config.rpc.http.clone(),
61 config.service.task_generator.signer.clone(),
62 )
63 .await?,
64 );
65
66 let data_provider_config = if let Some(config_path) = data_provider_config_path {
67 info!("Loading data provider config from: {:?}", config_path);
68 NewtonAvsConfigBuilder::new(config.chain_id)
69 .with_service_path(config_path)
70 .build::<DataProviderConfig>()?
71 } else {
72 NewtonAvsConfigBuilder::new(config.chain_id).build::<DataProviderConfig>()?
73 };
74
75 let mut data_provider_builder = DataProviderBuilder::new(data_provider_config);
76 if !config.service.data_provider.data_cache_url.is_empty() {
78 data_provider_builder.with_cache(config.service.data_provider.data_cache_url.as_str());
79 }
80 let data_provider = Arc::new(Mutex::new(data_provider_builder.build().await.unwrap()));
81
82 let quorum_number = config.service.task_generator.quorum_number.clone().into();
83 let quorum_threshold_percentage = config.service.task_generator.quorum_threshold_percentage;
84 let server = NewtonRpcServer::new(
86 avs_writer,
87 data_provider,
88 quorum_number,
89 quorum_threshold_percentage,
90 config.service,
91 Some(config.ipfs),
92 )?;
93
94 info!("Server initialized, starting...");
95
96 let h = match server.start().await {
97 Ok(handle) => {
98 info!("Server started successfully");
99 handle
100 }
101 Err(e) => {
102 error!("Server error: {}", e);
103 return Err(e);
104 }
105 };
106
107 Ok(h)
108}