light_client/
local_test_validator.rs

1use std::process::{Command, Stdio};
2
3use light_prover_client::helpers::get_project_root;
4pub use light_prover_client::prover::ProverConfig;
5
6#[derive(Debug)]
7pub struct LightValidatorConfig {
8    pub enable_indexer: bool,
9    pub prover_config: Option<ProverConfig>,
10    pub wait_time: u64,
11    pub sbf_programs: Vec<(String, String)>,
12    pub limit_ledger_size: Option<u64>,
13}
14
15impl Default for LightValidatorConfig {
16    fn default() -> Self {
17        Self {
18            enable_indexer: false,
19            prover_config: None,
20            wait_time: 35,
21            sbf_programs: vec![],
22            limit_ledger_size: None,
23        }
24    }
25}
26
27pub async fn spawn_validator(config: LightValidatorConfig) {
28    if let Some(project_root) = get_project_root() {
29        let path = "cli/test_bin/run test-validator";
30        let mut path = format!("{}/{}", project_root.trim(), path);
31        if !config.enable_indexer {
32            path.push_str(" --skip-indexer");
33        }
34
35        if let Some(limit_ledger_size) = config.limit_ledger_size {
36            path.push_str(&format!(" --limit-ledger-size {}", limit_ledger_size));
37        }
38
39        for sbf_program in config.sbf_programs.iter() {
40            path.push_str(&format!(
41                " --sbf-program {} {}",
42                sbf_program.0, sbf_program.1
43            ));
44        }
45
46        if let Some(prover_config) = config.prover_config {
47            prover_config.circuits.iter().for_each(|circuit| {
48                path.push_str(&format!(" --circuit {}", circuit));
49            });
50            if let Some(prover_mode) = prover_config.run_mode {
51                path.push_str(&format!(" --prover-run-mode {}", prover_mode));
52            }
53        } else {
54            path.push_str(" --skip-prover");
55        }
56
57        println!("Starting validator with command: {}", path);
58
59        let child = Command::new("sh")
60            .arg("-c")
61            .arg(path)
62            .stdin(Stdio::null()) // Detach from stdin
63            .stdout(Stdio::null()) // Detach from stdout
64            .stderr(Stdio::null()) // Detach from stderr
65            .spawn()
66            .expect("Failed to start server process");
67
68        // Explicitly `drop` the process to ensure we don't wait on it
69        std::mem::drop(child);
70
71        tokio::time::sleep(tokio::time::Duration::from_secs(config.wait_time)).await;
72    }
73}