Skip to main content

newton_prover_rpc/
lib.rs

1//! Newton RPC Server
2//!
3//! High-performance JSON-RPC server for Newton protocol task management.
4
5#[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
18// Re-export main types for convenience
19pub use api::{server::NewtonRpcImpl, task_generator::TaskGeneratorApi};
20pub use server::NewtonRpcServer;
21pub use types::intent::TaskIntent;
22
23// Re-export error types
24pub 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
36/// Result type for Newton RPC operations
37pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
38
39/// Runs the Newton RPC Server
40pub 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    // Initialize Prometheus metrics exporter on port 9093
47    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    // Only enable cache if URL is not empty
77    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    // Create and start the server
85    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}