use midnight_circuits::verifier::{fixed_bases, Accumulator};
use midnight_proofs::{
plonk::ConstraintSystem,
poly::{kzg::params::ParamsKZG, EvaluationDomain},
};
use midnight_zk_stdlib::ZkStdLib;
use super::{Ivc, IvcCircuit, IvcProver, IvcVerifier, E, S};
pub fn setup<T: Ivc>(
params: ParamsKZG<E>,
k: u32,
ctx: T::Context,
) -> (IvcProver<T>, IvcVerifier<T>) {
let mut cs = ConstraintSystem::default();
ZkStdLib::configure(&mut cs, (IvcCircuit::<T>::arch(), (k - 1) as u8));
let domain = EvaluationDomain::new(cs.degree() as u32, k);
let relation = IvcCircuit::<T>::new(domain, cs, ctx.clone());
let vk = midnight_zk_stdlib::setup_vk(¶ms, &relation);
let pk = midnight_zk_stdlib::setup_pk(&relation, &vk);
let fixed_base_names: Vec<String> =
fixed_bases::<S>("self_vk", vk.vk()).keys().cloned().collect();
let verifier = IvcVerifier {
ctx: ctx.clone(),
vk,
params_verifier: params.verifier_params(),
};
let prover = IvcProver {
params,
relation,
pk,
state: T::genesis(&ctx),
proof: vec![],
acc: Accumulator::<S>::trivial(&fixed_base_names),
};
(prover, verifier)
}