use std::path::PathBuf;
use anyhow::Result;
use cairo_air::utils::ProofFormat;
use cairo_vm::types::layout_name::LayoutName;
use clap::Parser;
use stwo_cairo_dev_utils::vm_utils::{run_and_adapt, ProgramType};
use stwo_cairo_prover::prover::create_and_serialize_proof;
use tracing::{span, Level};
use tracing_subscriber::fmt::format::FmtSpan;
#[derive(Parser, Debug)]
struct Args {
#[structopt(long = "program")]
program: PathBuf,
#[arg(long = "program_type", default_value = "json")]
program_type: ProgramType,
#[arg(long = "program_arguments_file")]
program_arguments_file: Option<PathBuf>,
#[structopt(long = "params_json")]
proof_params_json: Option<PathBuf>,
#[structopt(long = "proof_path")]
proof_path: PathBuf,
#[arg(long, value_enum, default_value_t = ProofFormat::Json)]
proof_format: ProofFormat,
#[structopt(long = "verify")]
verify: bool,
}
fn main() -> Result<()> {
let args = Args::parse();
tracing_subscriber::fmt()
.with_span_events(FmtSpan::ENTER | FmtSpan::CLOSE)
.init();
let _span = span!(Level::INFO, "run_and_prove").entered();
let prover_input = run_and_adapt(
&args.program,
args.program_type,
LayoutName::all_cairo_stwo,
args.program_arguments_file.as_ref(),
)?;
let result = create_and_serialize_proof(
prover_input,
args.verify,
args.proof_path,
args.proof_format,
args.proof_params_json,
);
match result {
Ok(_) => log::info!("✅ Proved successfully!"),
Err(ref e) => log::error!("❌ Proving failed: {e:?}"),
}
result
}