#![cfg(feature = "rpc")]
use crate::{
generated::rego_verifier::IRegoVerifier::RegoContext,
newton_prover_task_manager::INewtonProverTaskManager::{Task, TaskResponse},
zk::Proof,
};
use tokio::task;
use risc0_ethereum_contracts::groth16;
use risc0_zkvm::{compute_image_id, default_prover, ExecutorEnv, InnerReceipt::Groth16, ProverOpts};
pub async fn prove(elf: Vec<u8>, task: Task, task_response: TaskResponse, entrypoint: String) -> eyre::Result<Proof> {
tracing::info!("Begin uploading input to Bonsai...");
std::env::set_var("RISC0_PROVER", "bonsai");
let (receipt, image_id) = task::spawn_blocking(move || {
let mut builder = ExecutorEnv::builder();
builder.write(&task).unwrap();
builder.write(&task_response).unwrap();
builder.write(&entrypoint).unwrap();
let env = builder.build().unwrap();
let receipt = default_prover()
.prove_with_opts(env, &elf, &ProverOpts::groth16())
.unwrap()
.receipt;
(receipt, compute_image_id(&elf).unwrap())
})
.await?;
receipt.verify(image_id)?;
let Groth16(snark_receipt) = receipt.clone().inner else {
return Err(eyre::eyre!("Proof system is not Groth16, which is not supported yet"));
};
let journal = receipt.journal.bytes.clone();
let seal = groth16::encode(snark_receipt.seal).map_err(|e| eyre::eyre!("Failed to encode seal: {}", e))?;
tracing::info!("Journal: {}", crate::hex!(&journal));
tracing::info!("Seal: {}", crate::hex!(&seal));
Ok(Proof::Risc0 {
receipt,
image_id,
seal,
})
}