diff --git a/noir-projects/aztec-nr/uint-note/src/uint_note.nr b/noir-projects/aztec-nr/uint-note/src/uint_note.nr index 213863378153..dbe35b8f1bfc 100644 --- a/noir-projects/aztec-nr/uint-note/src/uint_note.nr +++ b/noir-projects/aztec-nr/uint-note/src/uint_note.nr @@ -58,6 +58,9 @@ impl NoteInterface for UintNote { } impl UintNote { + fn new(value: U128, owner_npk_m_hash: Field) -> Self { + Self { value, npk_m_hash: owner_npk_m_hash, randomness: unsafe_rand(), header: NoteHeader::empty() } + } // TODO: Merge this func with `compute_note_hiding_point`. I (benesjan) didn't do it in the initial PR to not have // to modify macros and all the related funcs in it. fn to_note_hiding_point(self) -> UintNoteHidingPoint { diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/balance_set.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/balance_set.nr index 5b30c1a77d9f..0d8943284eef 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/balance_set.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/balance_set.nr @@ -5,28 +5,28 @@ use dep::aztec::{ note::{note_getter::view_notes, note_emission::{NoteEmission, OuterNoteEmission}}, keys::{getters::get_current_public_keys, public_keys::NpkM} }; -use dep::uint_note::uint_note::OwnedNote; +use dep::uint_note::uint_note::{UintNote, UINT_NOTE_LEN, UINT_NOTE_BYTES_LEN}; -struct BalanceSet { - set: PrivateSet, +struct BalanceSet { + set: PrivateSet, } -impl BalanceSet { +impl BalanceSet { pub fn new(context: Context, storage_slot: Field) -> Self { assert(storage_slot != 0, "Storage slot 0 not allowed. Storage slots must start from 1."); Self { set: PrivateSet::new(context, storage_slot) } } } -impl BalanceSet { - unconstrained pub fn balance_of(self: Self) -> U128 where T: NoteInterface + OwnedNote { +impl BalanceSet { + unconstrained pub fn balance_of(self: Self) -> U128 { self.balance_of_with_offset(0) } - unconstrained pub fn balance_of_with_offset( + unconstrained pub fn balance_of_with_offset( self: Self, offset: u32 - ) -> U128 where T: NoteInterface + OwnedNote { + ) -> U128 { let mut balance = U128::from_integer(0); // docs:start:view_notes let mut options = NoteViewerOptions::new(); @@ -34,7 +34,7 @@ impl BalanceSet { // docs:end:view_notes for i in 0..options.limit { if i < notes.len() { - balance = balance + notes.get_unchecked(i).get_amount(); + balance = balance + notes.get_unchecked(i).value; } } if (notes.len() == options.limit) { @@ -45,17 +45,17 @@ impl BalanceSet { } } -impl BalanceSet { - pub fn add( +impl BalanceSet<&mut PrivateContext> { + pub fn add( self: Self, owner_npk_m: NpkM, addend: U128 - ) -> OuterNoteEmission where T: NoteInterface + OwnedNote + Eq { + ) -> OuterNoteEmission { if addend == U128::from_integer(0) { OuterNoteEmission::new(Option::none()) } else { // We fetch the nullifier public key hash from the registry / from our PXE - let mut addend_note = T::new(addend, owner_npk_m.hash()); + let mut addend_note = UintNote::new(addend, owner_npk_m.hash()); // docs:start:insert OuterNoteEmission::new(Option::some(self.set.insert(&mut addend_note))) @@ -63,11 +63,11 @@ impl BalanceSet { } } - pub fn sub( + pub fn sub( self: Self, owner_npk_m: NpkM, amount: U128 - ) -> OuterNoteEmission where T: NoteInterface + OwnedNote + Eq { + ) -> OuterNoteEmission { let subtracted = self.try_sub(amount, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL); // try_sub may have substracted more or less than amount. We must ensure that we subtracted at least as much as @@ -85,11 +85,11 @@ impl BalanceSet { // The `max_notes` parameter is used to fine-tune the number of constraints created by this function. The gate count // scales relatively linearly with `max_notes`, but a lower `max_notes` parameter increases the likelihood of // `try_sub` subtracting an amount smaller than `target_amount`. - pub fn try_sub( + pub fn try_sub( self: Self, target_amount: U128, max_notes: u32 - ) -> U128 where T: NoteInterface + OwnedNote + Eq { + ) -> U128 { // We are using a preprocessor here (filter applied in an unconstrained context) instead of a filter because // we do not need to prove correct execution of the preprocessor. // Because the `min_sum` notes is not constrained, users could choose to e.g. not call it. However, all this @@ -102,7 +102,7 @@ impl BalanceSet { for i in 0..options.limit { if i < notes.len() { let note = notes.get_unchecked(i); - subtracted = subtracted + note.get_amount(); + subtracted = subtracted + note.value; } } @@ -115,10 +115,10 @@ impl BalanceSet { // The preprocessor (a filter applied in an unconstrained context) does not check if total sum is larger or equal to // 'min_sum' - all it does is remove extra notes if it does reach that value. // Note that proper usage of this preprocessor requires for notes to be sorted in descending order. -pub fn preprocess_notes_min_sum( - notes: [Option; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL], +pub fn preprocess_notes_min_sum( + notes: [Option; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL], min_sum: U128 -) -> [Option; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL] where T: NoteInterface + OwnedNote { +) -> [Option; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL] { let mut selected = [Option::none(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL]; let mut sum = U128::from_integer(0); for i in 0..notes.len() { @@ -129,7 +129,7 @@ pub fn preprocess_notes_min_sum( if notes[i].is_some() & sum < min_sum { let note = notes[i].unwrap_unchecked(); selected[i] = Option::some(note); - sum = sum.add(note.get_amount()); + sum = sum.add(note.value); } } selected