libzeropool 0.5.6

zk-SNARK circuit and cryptography for ZeroPool
Documentation

use crate::fawkes_crypto::ff_uint::{PrimeField, Num, NumRepr};


#[derive(Clone, Debug)]
pub struct BoundedNum<Fr:PrimeField, const L: usize>(pub(crate)Num<Fr>);

impl<Fr:PrimeField, const L: usize> Copy for BoundedNum<Fr, L> {}

impl<Fr:PrimeField, const L: usize> Eq for BoundedNum<Fr, L> {}

impl<Fr:PrimeField, const L: usize> PartialEq for BoundedNum<Fr, L> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.0.eq(&other.0)
    }
}


impl<Fr:PrimeField, const L: usize> BoundedNum<Fr, L> {
    pub fn new(n:Num<Fr>) -> Self {
        assert!(L < Fr::MODULUS_BITS as usize && n.to_uint() < (NumRepr::<Fr::Inner>::ONE << L as u32));
        Self::new_unchecked(n)
    }

    pub fn new_trimmed(n:Num<Fr>) -> Self {
        assert!((L as u32) < Fr::MODULUS_BITS);
        let t = Num::from_uint_unchecked(n.to_uint() & ((NumRepr::<Fr::Inner>::ONE << L as u32) - NumRepr::<Fr::Inner>::ONE));
        Self::new_unchecked(t)
    }

    pub fn new_unchecked(n:Num<Fr>) -> Self {
        Self(n)
    }

    pub fn as_num(&self) -> &Num<Fr> {
        &self.0
    }

    pub fn to_num(&self) -> Num<Fr> {
        self.0
    }
}