light_client/
local_test_validator.rs

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