use thiserror::Error;
use ark_ff::Field;
use ark_relations::r1cs::{
ConstraintSynthesizer, ConstraintSystemRef, SynthesisError, LinearCombination,
};
#[derive(Error, Debug)]
pub enum CircuitError {
#[error("Circuit compilation failed")]
CompilationError,
#[error("Constraint system error")]
ConstraintError,
}
#[derive(Debug, Clone)]
pub struct ArithmeticCircuit<F: Field> {
pub num_constraints: usize,
pub num_variables: usize,
pub num_inputs: usize,
pub witness: Vec<F>,
}
impl<F: Field> ArithmeticCircuit<F> {
pub fn new(num_constraints: usize, num_variables: usize, num_inputs: usize) -> Self {
Self {
num_constraints,
num_variables,
num_inputs,
witness: Vec::new(),
}
}
pub fn compile_for_evm(&self) -> Result<Vec<u8>, CircuitError> {
Ok(Vec::new())
}
}
impl<F: Field> ConstraintSynthesizer<F> for ArithmeticCircuit<F> {
fn generate_constraints(
self,
cs: ConstraintSystemRef<F>,
) -> Result<(), SynthesisError> {
let a = cs.new_witness_variable(|| Ok(F::one()))?;
let b = cs.new_witness_variable(|| Ok(F::one()))?;
let c = cs.new_input_variable(|| Ok(F::one()))?;
let lc_a = LinearCombination::<F>::from(a);
let lc_b = LinearCombination::<F>::from(b);
let lc_c = LinearCombination::<F>::from(c);
cs.enforce_constraint(lc_a, lc_b, lc_c)?;
Ok(())
}
}
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct EVMCircuitConfig {
pub max_constraint_complexity: usize,
pub optimize_for_gas: bool,
}