mina_tree/proofs/numbers/
common.rs

1use crate::{
2    proofs::{
3        field::{field, Boolean, FieldWitness},
4        witness::Witness,
5    },
6    scan_state::currency::Magnitude,
7};
8
9/// Helper trait for zkapps in-snark checks (with trait `InSnarkCheck`)
10pub trait ForZkappCheck<F: FieldWitness>: Magnitude {
11    type CheckedType;
12
13    fn to_checked(&self) -> Self::CheckedType {
14        Self::checked_from_field(self.to_field::<F>())
15    }
16    fn checked_from_field(field: F) -> Self::CheckedType;
17    fn lte(this: &Self::CheckedType, other: &Self::CheckedType, w: &mut Witness<F>) -> Boolean;
18}
19
20fn range_check_impl<F: FieldWitness, const NBITS: usize>(number: F, w: &mut Witness<F>) -> F {
21    use crate::proofs::transaction::scalar_challenge::to_field_checked_prime;
22
23    let (_, _, actual_packed) = to_field_checked_prime::<F, NBITS>(number, w);
24    actual_packed
25}
26
27pub fn range_check_flag<F: FieldWitness, const NBITS: usize>(
28    number: F,
29    w: &mut Witness<F>,
30) -> Boolean {
31    let actual = range_check_impl::<F, NBITS>(number, w);
32    field::equal(actual, number, w)
33}
34
35pub fn range_check<F: FieldWitness, const NBITS: usize>(number: F, w: &mut Witness<F>) {
36    range_check_impl::<F, NBITS>(number, w);
37}