use std::fmt::Debug;
use snarkvm_curves::{
templates::bls12::{Bls12Parameters, G1Prepared},
traits::ProjectiveCurve,
};
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
bits::{Boolean, ToBytesGadget},
curves::templates::bls12::AffineGadget,
fields::FpGadget,
integers::uint::UInt8,
traits::{
curves::GroupGadget,
eq::{ConditionalEqGadget, EqGadget},
},
};
pub type G1Gadget<P> = AffineGadget<
<P as Bls12Parameters>::G1Parameters,
<P as Bls12Parameters>::Fp,
FpGadget<<P as Bls12Parameters>::Fp>,
>;
#[derive(Derivative)]
#[derivative(
Clone(bound = "G1Gadget<P>: Clone"),
Debug(bound = "G1Gadget<P>: Debug"),
PartialEq(bound = "G1Gadget<P>: Debug"),
Eq(bound = "G1Gadget<P>: Debug")
)]
pub struct G1PreparedGadget<P: Bls12Parameters>(pub G1Gadget<P>);
impl<P: Bls12Parameters> G1PreparedGadget<P> {
pub fn get_value(&self) -> Option<G1Prepared<P>> {
Some(G1Prepared::from_affine(self.0.get_value().unwrap().into_affine()))
}
pub fn from_affine<CS: ConstraintSystem<P::Fp>>(_cs: CS, q: G1Gadget<P>) -> Result<Self, SynthesisError> {
Ok(G1PreparedGadget(q))
}
}
impl<P: Bls12Parameters> ToBytesGadget<P::Fp> for G1PreparedGadget<P> {
#[inline]
fn to_bytes<CS: ConstraintSystem<P::Fp>>(&self, mut cs: CS) -> Result<Vec<UInt8>, SynthesisError> {
self.0.to_bytes(&mut cs.ns(|| "g_alpha to bytes"))
}
fn to_bytes_strict<CS: ConstraintSystem<P::Fp>>(&self, cs: CS) -> Result<Vec<UInt8>, SynthesisError> {
self.to_bytes(cs)
}
}
impl<P: Bls12Parameters> EqGadget<<P as Bls12Parameters>::Fp> for G1PreparedGadget<P> {}
impl<P: Bls12Parameters> ConditionalEqGadget<<P as Bls12Parameters>::Fp> for G1PreparedGadget<P> {
fn conditional_enforce_equal<CS: ConstraintSystem<P::Fp>>(
&self,
cs: CS,
other: &Self,
condition: &Boolean,
) -> Result<(), SynthesisError> {
self.0.conditional_enforce_equal(cs, &other.0, condition)
}
fn cost() -> usize {
2 * <FpGadget<<P as Bls12Parameters>::Fp> as ConditionalEqGadget<<P as Bls12Parameters>::Fp>>::cost()
}
}