From 10b16794725e656a883b0b8ac1089b61461ef5b8 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 09:21:09 +0000 Subject: [PATCH 01/25] WIP --- .../private_token_contract/src/main.nr | 8 ++--- .../private_token_contract/src/storage.nr | 5 +-- .../noir-aztec/src/state_vars/map.nr | 11 ++++--- .../noir-aztec/src/state_vars/set.nr | 32 +++++++++---------- .../noir-libs/value-note/src/utils.nr | 9 +++--- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr index 57ef1d2f441..257406a36b4 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr @@ -24,7 +24,7 @@ contract PrivateToken { initial_supply: Field, owner: Field ) { - let storage = Storage::init(); + let storage = Storage::init(&mut context); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); if (initial_supply != 0) { @@ -40,7 +40,7 @@ contract PrivateToken { amount: Field, owner: Field ) { - let storage = Storage::init(); + let storage = Storage::init(&mut context); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -55,7 +55,7 @@ contract PrivateToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(&mut context); let sender = context.msg_sender(); // Pick from the set of sender's notes to spend amount. @@ -73,7 +73,7 @@ contract PrivateToken { unconstrained fn getBalance( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(&mut context); // Get the set of notes owned by the user. let owner_balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr index 52fcd691490..66a0e6a0ee1 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr @@ -2,6 +2,7 @@ use dep::aztec::state_vars::{ map::Map, set::Set }; +use dep::aztec::context::PrivateContext; use dep::value_note::value_note::{ ValueNote, ValueNoteMethods, @@ -17,9 +18,9 @@ struct Storage { // highlight-next-line:storage-declaration impl Storage { - fn init() -> Self { + fn init(context: &mut PrivateContext) -> Self { Storage { - balances: Map::new(1, |slot| Set::new(slot, ValueNoteMethods)), + balances: Map::new(context, 1, |context, slot| Set::new(context, slot, ValueNoteMethods)), } } } diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr index 6965f7411da..2a081515b1f 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr @@ -1,12 +1,15 @@ +use crate::context::PrivateContext; + struct Map { + context: &mut PrivateContext, storage_slot: Field, - state_var_constructor: fn (Field) -> V, + state_var_constructor: fn (&mut PrivateContext, Field) -> V, } impl Map { - fn new(storage_slot: Field, state_var_constructor: fn (Field) -> V) -> Map { + fn new(context: &mut PrivateContext, storage_slot: Field, state_var_constructor: fn (&mut PrivateContext, Field) -> V) -> Map { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Map { storage_slot, state_var_constructor } + Map { context, storage_slot, state_var_constructor } } fn at(self, key: Field) -> V { @@ -17,6 +20,6 @@ impl Map { ])[0]; let state_var_constructor = self.state_var_constructor; - state_var_constructor(derived_storage_slot) + state_var_constructor(self.context, derived_storage_slot) } } diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr index 5127c290f41..9c508c11ae0 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr @@ -15,39 +15,40 @@ use crate::note::{ }; struct Set { + context: &mut PrivateContext, storage_slot: Field, note_interface: NoteInterface, } impl Set { - fn new(storage_slot: Field, note_interface: NoteInterface) -> Self { + fn new(context: &mut PrivateContext, storage_slot: Field, note_interface: NoteInterface) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Set { storage_slot, note_interface } + Set { context, storage_slot, note_interface } } - fn insert(self, context: &mut PrivateContext, note: &mut Note) { - create_note(context, self.storage_slot, note, self.note_interface); + fn insert(self, note: &mut Note) { + create_note(self.context, self.storage_slot, note, self.note_interface); } - fn insert_from_public(self, context: &mut PublicContext, note: &mut Note) { - create_note_hash_from_public(context, self.storage_slot, note, self.note_interface); + fn insert_from_public(self, public_context: &mut PublicContext, note: &mut Note) { + create_note_hash_from_public(public_context, self.storage_slot, note, self.note_interface); } // TODO(#1386) // Should be replaced by `assert_contains_and_remove`. - fn assert_contains_note_and_remove(self, context: &mut PrivateContext, note: Note) { + fn assert_contains_note_and_remove(self, note: Note) { let mut note_with_header = note; - ensure_note_exists(context, self.storage_slot, self.note_interface, &mut note_with_header); - self.remove(context, note_with_header); + ensure_note_exists(self.context, self.storage_slot, self.note_interface, &mut note_with_header); + self.remove(note_with_header); } // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): // replace function above ^ once public kernel injects // nonces to note hashes. - fn assert_contains_and_remove(self, context: &mut PrivateContext, note: Note) { + fn assert_contains_and_remove(self, note: Note) { let mut note_with_header = note; // Modifies note with the header which is necessary for the next step (remove). - ensure_note_hash_exists(context, self.storage_slot, self.note_interface, &mut note_with_header); + ensure_note_hash_exists(self.context, self.storage_slot, self.note_interface, &mut note_with_header); let get_header = self.note_interface.get_header; let set_header = self.note_interface.set_header; @@ -60,20 +61,19 @@ impl Set { header.nonce = 1; set_header(&mut note_with_header, header); - self.remove(context, note_with_header); + self.remove(note_with_header); } - fn remove(self, context: &mut PrivateContext, note: Note) { - destroy_note(context, self.storage_slot, note, self.note_interface); + fn remove(self, note: Note) { + destroy_note(self.context, self.storage_slot, note, self.note_interface); } fn get_notes( self, - context: &mut PrivateContext, options: NoteGetterOptions, ) -> [Option; MAX_READ_REQUESTS_PER_CALL] { let storage_slot = self.storage_slot; - let opt_notes = get_notes(context, storage_slot, self.note_interface, options); + let opt_notes = get_notes(self.context, storage_slot, self.note_interface, options); opt_notes } diff --git a/yarn-project/noir-libs/value-note/src/utils.nr b/yarn-project/noir-libs/value-note/src/utils.nr index 1afbfb4154c..03fcd7977c5 100644 --- a/yarn-project/noir-libs/value-note/src/utils.nr +++ b/yarn-project/noir-libs/value-note/src/utils.nr @@ -65,12 +65,12 @@ fn decrement_by_at_most( owner: Field, ) -> Field { let options = create_note_getter_options_for_decreasing_balance(max_amount); - let opt_notes = balance.get_notes(context, options); + let opt_notes = balance.get_notes(options); let mut decremented = 0; for i in 0..opt_notes.len() { if opt_notes[i].is_some() { - decremented += destroy_note(context, balance, owner, opt_notes[i].unwrap_unchecked()); + decremented += destroy_note(balance, owner, opt_notes[i].unwrap_unchecked()); } } @@ -92,7 +92,7 @@ fn create_note( note: &mut ValueNote, ) { // Insert the new note to the owner's set of notes. - balance.insert(context, note); + balance.insert(note); // Remove this if statement if we can wrap this create_note function in an if statement. if note.value != 0 { @@ -117,7 +117,6 @@ fn create_note( // Removes the note from the owner's set of notes. // Returns the value of the destroyed note. fn destroy_note( - context: &mut PrivateContext, balance: Set, owner: Field, note: ValueNote, @@ -126,7 +125,7 @@ fn destroy_note( // spending someone else's notes). assert(note.owner == owner); - balance.remove(context, note); + balance.remove(note); note.value } From 36665a5c1b64cf90f873f198ffc7db53d346a1e8 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 09:24:38 +0000 Subject: [PATCH 02/25] WIP --- .../src/contracts/private_token_contract/src/main.nr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr index 257406a36b4..b7fbe313eab 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr @@ -73,7 +73,8 @@ contract PrivateToken { unconstrained fn getBalance( owner: Field, ) -> Field { - let storage = Storage::init(&mut context); + // context not available here + let storage = Storage::init(); // Get the set of notes owned by the user. let owner_balance = storage.balances.at(owner); From a294e68195046fb6846040e645f7ec0f0e55dfe0 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 11:38:38 +0000 Subject: [PATCH 03/25] using Option --- .../private_token_contract/src/main.nr | 9 +-- .../private_token_contract/src/storage.nr | 28 ++++---- .../noir-aztec/src/state_vars/map.nr | 39 +++++++--- .../noir-aztec/src/state_vars/set.nr | 72 ++++++++++++++----- 4 files changed, 104 insertions(+), 44 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr index b7fbe313eab..606cfa64a52 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr @@ -2,6 +2,7 @@ mod storage; contract PrivateToken { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, utils::{increment, decrement}, @@ -24,7 +25,7 @@ contract PrivateToken { initial_supply: Field, owner: Field ) { - let storage = Storage::init(&mut context); + let storage = Storage::init(Option::some(&mut context), Option::none()); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); if (initial_supply != 0) { @@ -40,7 +41,7 @@ contract PrivateToken { amount: Field, owner: Field ) { - let storage = Storage::init(&mut context); + let storage = Storage::init(Option::some(&mut context), Option::none()); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -55,7 +56,7 @@ contract PrivateToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(&mut context); + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender = context.msg_sender(); // Pick from the set of sender's notes to spend amount. @@ -74,7 +75,7 @@ contract PrivateToken { owner: Field, ) -> Field { // context not available here - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); // Get the set of notes owned by the user. let owner_balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr index 66a0e6a0ee1..da9818d59f5 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/storage.nr @@ -1,13 +1,7 @@ -use dep::aztec::state_vars::{ - map::Map, - set::Set -}; -use dep::aztec::context::PrivateContext; -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; +use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::{map::Map, set::Set}; +use dep::std::option::Option; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; // docs:start:storage-declaration // highlight-next-line:storage-declaration @@ -18,9 +12,19 @@ struct Storage { // highlight-next-line:storage-declaration impl Storage { - fn init(context: &mut PrivateContext) -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - balances: Map::new(context, 1, |context, slot| Set::new(context, slot, ValueNoteMethods)), + balances: Map::new( + private_context, + public_context, + 1, // Storage slot + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), } } } diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr index 2a081515b1f..ab6485bca8d 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/map.nr @@ -1,25 +1,42 @@ -use crate::context::PrivateContext; +use crate::context::{PrivateContext, PublicContext}; +use dep::std::option::Option; struct Map { - context: &mut PrivateContext, + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, storage_slot: Field, - state_var_constructor: fn (&mut PrivateContext, Field) -> V, + state_var_constructor: fn(Option<&mut PrivateContext>, Option<&mut PublicContext>, Field) -> V, } impl Map { - fn new(context: &mut PrivateContext, storage_slot: Field, state_var_constructor: fn (&mut PrivateContext, Field) -> V) -> Map { + fn new( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + storage_slot: Field, + state_var_constructor: fn( + Option<&mut PrivateContext>, + Option<&mut PublicContext>, + Field, + ) -> V, + ) -> Map { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Map { context, storage_slot, state_var_constructor } + Map { + private_context, + public_context, + storage_slot, + state_var_constructor, + } } fn at(self, key: Field) -> V { // TODO(#1204): use a generator index for the storage slot - let derived_storage_slot = dep::std::hash::pedersen([ - self.storage_slot, - key, - ])[0]; + let derived_storage_slot = dep::std::hash::pedersen([self.storage_slot, key])[0]; - let state_var_constructor = self.state_var_constructor; - state_var_constructor(self.context, derived_storage_slot) + let state_var_constructor = self.state_var_constructor; + state_var_constructor( + self.private_context, + self.public_context, + derived_storage_slot, + ) } } diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr index 9c508c11ae0..1864fe96902 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/set.nr @@ -1,44 +1,67 @@ -use dep::std::option::Option; use crate::abi::PublicContextInputs; -use crate::constants_gen::{MAX_READ_REQUESTS_PER_CALL, MAX_NOTES_PER_PAGE}; -use crate::context::{ - PrivateContext, - PublicContext, -}; +use crate::constants_gen::{MAX_NOTES_PER_PAGE, MAX_READ_REQUESTS_PER_CALL}; +use crate::context::{PrivateContext, PublicContext}; use crate::note::lifecycle::{create_note, create_note_hash_from_public, destroy_note}; use crate::note::{ - note_getter::{get_notes, ensure_note_exists, ensure_note_hash_exists, view_notes}, + note_getter::{ensure_note_exists, ensure_note_hash_exists, get_notes, view_notes}, note_getter_options::NoteGetterOptions, note_interface::NoteInterface, note_viewer_options::NoteViewerOptions, utils::compute_inner_note_hash, }; +use dep::std::option::Option; struct Set { - context: &mut PrivateContext, + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, storage_slot: Field, note_interface: NoteInterface, } impl Set { - fn new(context: &mut PrivateContext, storage_slot: Field, note_interface: NoteInterface) -> Self { + fn new( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + storage_slot: Field, + note_interface: NoteInterface, + ) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Set { context, storage_slot, note_interface } + Set { + private_context, + public_context, + storage_slot, + note_interface, + } } fn insert(self, note: &mut Note) { - create_note(self.context, self.storage_slot, note, self.note_interface); + create_note( + self.private_context.unwrap(), + self.storage_slot, + note, + self.note_interface, + ); } - fn insert_from_public(self, public_context: &mut PublicContext, note: &mut Note) { - create_note_hash_from_public(public_context, self.storage_slot, note, self.note_interface); + fn insert_from_public(self, note: &mut Note) { + create_note_hash_from_public( + self.public_context.unwrap(), + self.storage_slot, + note, + self.note_interface, + ); } // TODO(#1386) // Should be replaced by `assert_contains_and_remove`. fn assert_contains_note_and_remove(self, note: Note) { let mut note_with_header = note; - ensure_note_exists(self.context, self.storage_slot, self.note_interface, &mut note_with_header); + ensure_note_exists( + self.private_context.unwrap(), + self.storage_slot, + self.note_interface, + &mut note_with_header, + ); self.remove(note_with_header); } @@ -48,7 +71,12 @@ impl Set { fn assert_contains_and_remove(self, note: Note) { let mut note_with_header = note; // Modifies note with the header which is necessary for the next step (remove). - ensure_note_hash_exists(self.context, self.storage_slot, self.note_interface, &mut note_with_header); + ensure_note_hash_exists( + self.private_context.unwrap(), + self.storage_slot, + self.note_interface, + &mut note_with_header, + ); let get_header = self.note_interface.get_header; let set_header = self.note_interface.set_header; @@ -65,7 +93,12 @@ impl Set { } fn remove(self, note: Note) { - destroy_note(self.context, self.storage_slot, note, self.note_interface); + destroy_note( + self.private_context.unwrap(), + self.storage_slot, + note, + self.note_interface, + ); } fn get_notes( @@ -73,7 +106,12 @@ impl Set { options: NoteGetterOptions, ) -> [Option; MAX_READ_REQUESTS_PER_CALL] { let storage_slot = self.storage_slot; - let opt_notes = get_notes(self.context, storage_slot, self.note_interface, options); + let opt_notes = get_notes( + self.private_context.unwrap(), + storage_slot, + self.note_interface, + options, + ); opt_notes } From 5b7ece01198a6cf60ac02c860b033362a0dbe205 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:30:33 +0000 Subject: [PATCH 04/25] non native token --- .../non_native_token_contract/src/main.nr | 43 +++++++------- .../non_native_token_contract/src/storage.nr | 56 +++++++++++-------- .../noir-aztec/src/state_vars/public_state.nr | 17 +++++- .../noir-libs/value-note/src/utils.nr | 13 ++--- 4 files changed, 74 insertions(+), 55 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr index c7dcc9557d7..b31c74bf793 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr @@ -18,6 +18,7 @@ mod transparent_note; // 3. At this point a recipient can spend the note in a private function assuming he/she knows the secret. contract NonNativeToken { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, utils::{increment, decrement}, @@ -48,10 +49,10 @@ contract NonNativeToken { initial_supply: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let balance = storage.balances.at(owner); - increment(&mut context, balance, initial_supply, owner); + increment(balance, initial_supply, owner); } // Mint Private Function @@ -66,7 +67,7 @@ contract NonNativeToken { secret: Field, canceller: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let content_hash = get_mint_content_hash(amount, owner, canceller); @@ -74,7 +75,7 @@ contract NonNativeToken { context.consume_l1_to_l2_message(inputs, msg_key, content_hash, secret); let balance = storage.balances.at(owner); - increment(&mut context, balance, amount, owner); + increment(balance, amount, owner); } // Withdraws using user's private balance. @@ -87,10 +88,10 @@ contract NonNativeToken { recipient: Field, // ethereum address in the field callerOnL1: Field, // ethereum address that can call this function on the L1 portal (0x0 if anyone can call) ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender_balance = storage.balances.at(sender); - decrement(&mut context, sender_balance, amount, sender); + decrement(sender_balance, amount, sender); let content = get_withdraw_content_hash(amount, recipient, callerOnL1); context.message_portal(content); @@ -108,7 +109,7 @@ contract NonNativeToken { secret: Field, canceller: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let content_hash = get_mint_content_hash(amount, owner_address, canceller); @@ -133,7 +134,7 @@ contract NonNativeToken { recipient: Field, callerOnL1: Field, // ethereum address that can call this function on the L1 portal (0x0 if anyone can call) ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let sender = context.msg_sender(); @@ -161,15 +162,15 @@ contract NonNativeToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender = context.msg_sender(); // Gets the set of sender's notes and picks 2 of those. let sender_balance = storage.balances.at(sender); - decrement(&mut context, sender_balance, amount, sender); + decrement(sender_balance, amount, sender); let balance = storage.balances.at(recipient); - increment(&mut context, balance, amount, recipient); + increment(balance, amount, recipient); } // Shield creates a way for a user to move tokens from the public context into the private context. @@ -178,7 +179,7 @@ contract NonNativeToken { amount: Field, secretHash: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let pending_shields = storage.pending_shields; @@ -196,7 +197,7 @@ contract NonNativeToken { // and insert it into the set of "pending_shields" and therefore // (eventually) the private data tree. let mut note = TransparentNote::new(amount, secretHash); - pending_shields.insert_from_public(&mut context, &mut note); + pending_shields.insert_from_public(&mut note); } // The shield function takes a public balance, and creates a commitment containing the amount of tokens @@ -207,17 +208,17 @@ contract NonNativeToken { secret: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let pending_shields = storage.pending_shields; let public_note = TransparentNote::new_from_secret(amount, secret); // Ensure that the note exists in the tree and remove it. - pending_shields.assert_contains_and_remove(&mut context, public_note); + pending_shields.assert_contains_and_remove(public_note); // Mint the tokens let balance = storage.balances.at(owner); - increment(&mut context, balance, amount, owner); + increment(balance, amount, owner); } #[aztec(private)] @@ -225,12 +226,12 @@ contract NonNativeToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner = context.msg_sender(); // Remove user balance let sender_balance = storage.balances.at(owner); - decrement(&mut context, sender_balance, amount, owner); + decrement(sender_balance, amount, owner); // enqueue a public function to perform the public state update. let thisAddress = context.this_address(); @@ -246,7 +247,7 @@ contract NonNativeToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let recipient_balance = storage.public_balances.at(recipient); let current_balance = recipient_balance.read(); @@ -257,7 +258,7 @@ contract NonNativeToken { unconstrained fn getBalance( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); let owner_balance = storage.balances.at(owner); balance_utils::get_balance(owner_balance) @@ -278,7 +279,7 @@ contract NonNativeToken { unconstrained fn publicBalanceOf( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.public_balances.at(owner).read() } } diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr index b1cc0d49517..688f39cf6e1 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr @@ -1,28 +1,16 @@ mod transparent_note; -use crate::transparent_note::{ - TransparentNote, - TransparentNoteMethods, - TRANSPARENT_NOTE_LEN, -}; - -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; +use crate::transparent_note::{TransparentNote, TransparentNoteMethods, TRANSPARENT_NOTE_LEN}; +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::{ - state_vars::{ - map::Map, - set::Set, - public_state::PublicState, - }, + state_vars::{map::Map, public_state::PublicState, set::Set}, types::type_serialisation::field_serialisation::{ - FIELD_SERIALISED_LEN, - FieldSerialisationMethods, + FieldSerialisationMethods, FIELD_SERIALISED_LEN, }, }; +use dep::std::option::Option; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; struct Storage { balances: Map>, @@ -33,11 +21,33 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), - pending_shields: Set::new(2, TransparentNoteMethods), - public_balances: Map::new(3, |s| PublicState::new(s, FieldSerialisationMethods)), + balances: Map::new( + private_context, + public_context, + 1, // Storage slot + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), + pending_shields: Set::new(private_context, public_context, 2, TransparentNoteMethods), + public_balances: Map::new( + private_context, + public_context, + 3, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + FieldSerialisationMethods, + ) + }, + ), } } -} \ No newline at end of file +} diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr index db90126f6bf..0f3b6351b10 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr @@ -1,6 +1,8 @@ +use crate::context::{PrivateContext, PublicContext}; use crate::oracle::storage::storage_read; use crate::oracle::storage::storage_write; use crate::types::type_serialisation::TypeSerialisationInterface; +use dep::std::option::Option; struct PublicState { storage_slot: Field, @@ -8,9 +10,18 @@ struct PublicState { } impl PublicState { - fn new(storage_slot: Field, serialisation_methods: TypeSerialisationInterface) -> Self { + fn new( + // Note: passing the contexts to new to have an interface compatible with Map. + _: Option<&mut PrivateContext>, + _: Option<&mut PublicContext>, + storage_slot: Field, + serialisation_methods: TypeSerialisationInterface, + ) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - PublicState { storage_slot, serialisation_methods } + PublicState { + storage_slot, + serialisation_methods, + } } fn read(self) -> T { @@ -22,4 +33,4 @@ impl PublicState { let fields = serialise(value); storage_write(self.storage_slot, fields); } -} \ No newline at end of file +} diff --git a/yarn-project/noir-libs/value-note/src/utils.nr b/yarn-project/noir-libs/value-note/src/utils.nr index 03fcd7977c5..13e1d42db53 100644 --- a/yarn-project/noir-libs/value-note/src/utils.nr +++ b/yarn-project/noir-libs/value-note/src/utils.nr @@ -22,17 +22,16 @@ fn create_note_getter_options_for_decreasing_balance(amount: Field) -> NoteGette // Creates a new note for the recipient. // Inserts it to the recipient's set of notes. fn increment( - context: &mut PrivateContext, balance: Set, amount: Field, recipient: Field, ) { let mut note = ValueNote::new(amount, recipient); - create_note(context, balance, recipient, &mut note); + create_note(balance, recipient, &mut note); // It won't compile if Set.insert() is in an if statement :( // if amount as u120 > 0 { - // create_note(context, balance, recipient, &mut note); + // create_note(balance, recipient, &mut note); // } } @@ -41,12 +40,11 @@ fn increment( // If the value of the removed notes exceeds the requested `amount`, create a new note containing the excess value, so that exactly `amount` is removed. // Fail if the sum of the selected notes is less than the amount. fn decrement( - context: &mut PrivateContext, balance: Set, amount: Field, owner: Field, ) { - let sum = decrement_by_at_most(context, balance, amount, owner); + let sum = decrement_by_at_most(balance, amount, owner); assert(sum == amount); } @@ -59,7 +57,6 @@ fn decrement( // // It returns the decremented amount, which should be less than or equal to max_amount. fn decrement_by_at_most( - context: &mut PrivateContext, balance: Set, max_amount: Field, owner: Field, @@ -80,13 +77,12 @@ fn decrement_by_at_most( change_value = decremented - max_amount; decremented -= change_value; } - increment(context, balance, change_value, owner); + increment(balance, change_value, owner); decremented } fn create_note( - context: &mut PrivateContext, balance: Set, owner: Field, note: &mut ValueNote, @@ -98,6 +94,7 @@ fn create_note( if note.value != 0 { // Emit the newly created encrypted note preimages via oracle calls. // docs:start:encrypted + let context = balance.private_context.unwrap(); let application_contract_address = (*context).this_address(); let note_storage_slot = balance.storage_slot; let encryption_pub_key = get_public_key(owner); From 55fbdb3a023b9b0c9d8d36a3541ae050390e78ed Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:34:12 +0000 Subject: [PATCH 05/25] child --- .../src/contracts/child_contract/src/storage.nr | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr index 5618cf75889..9eb90ff6c76 100644 --- a/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr @@ -1,6 +1,7 @@ use dep::aztec::state_vars::public_state::PublicState; use dep::aztec::types::type_serialisation::field_serialisation::FieldSerialisationMethods; use dep::aztec::types::type_serialisation::field_serialisation::FIELD_SERIALISED_LEN; +use dep::std::option::Option; struct Storage { current_value: PublicState, @@ -9,7 +10,12 @@ struct Storage { impl Storage { fn init() -> Self { Storage { - current_value: PublicState::new(1, FieldSerialisationMethods), + current_value: PublicState::new( + Option::none(), + Option::none(), + 1, + FieldSerialisationMethods, + ), } } -} \ No newline at end of file +} From 4154ea65c601323ae55d8425bcf50ee837babbca Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:43:27 +0000 Subject: [PATCH 06/25] escrow --- .../src/contracts/escrow_contract/src/main.nr | 10 +++++---- .../contracts/escrow_contract/src/storage.nr | 21 +++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr index 584664c40fb..f88c6ca08db 100644 --- a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr @@ -16,6 +16,8 @@ contract Escrow { utils as note_utils, }; + use dep::std::option::Option; + use crate::address_note::{ AddressNote, AddressNoteMethods, @@ -33,9 +35,9 @@ contract Escrow { ) { let this = context.this_address(); - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let mut note = AddressNote::new(owner, this); - storage.owners.insert(&mut context, &mut note); + storage.owners.insert( &mut note); emit_encrypted_log( &mut context, this, @@ -54,11 +56,11 @@ contract Escrow { ) { let this = context.this_address(); let sender = context.msg_sender(); - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); // We don't remove note from the owners set. If a note exists, the owner and recipient are legit. let options = NoteGetterOptions::new().select(0, sender).select(1, this).set_limit(1); - let notes = storage.owners.get_notes(&mut context, options); + let notes = storage.owners.get_notes(options); let note = notes[0].unwrap_unchecked(); // Filter is not constrained. We still need to check if the note is what we expected. assert(note.address == sender); diff --git a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/storage.nr index 580b9a33d93..205086c2b44 100644 --- a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/storage.nr @@ -1,21 +1,20 @@ -use dep::aztec::state_vars::{ - set::Set -}; +use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::set::Set; +use dep::std::option::Option; -use crate::address_note::{ - AddressNote, - AddressNoteMethods, - ADDRESS_NOTE_LEN, -}; +use crate::address_note::{AddressNote, AddressNoteMethods, ADDRESS_NOTE_LEN}; struct Storage { owners: Set, } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - owners: Set::new(1, AddressNoteMethods), + owners: Set::new(private_context, public_context, 1, AddressNoteMethods), } } -} \ No newline at end of file +} From cef297a259736320b37657bcbcb1db0333b13e14 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:51:11 +0000 Subject: [PATCH 07/25] public token --- .../public_token_contract/src/main.nr | 7 +++-- .../public_token_contract/src/storage.nr | 28 +++++++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/public_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/public_token_contract/src/main.nr index 282fd6323cc..a8ac92ccb08 100644 --- a/yarn-project/noir-contracts/src/contracts/public_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/public_token_contract/src/main.nr @@ -5,6 +5,7 @@ contract PublicToken { // docs:start:unencrypted_import use dep::aztec::oracle::logs::emit_unencrypted_log; // docs:end:unencrypted_import + use dep::std::option::Option; use crate::storage::Storage; @@ -19,7 +20,7 @@ contract PublicToken { recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let recipient_balance = storage.balances.at(recipient); let new_amount = recipient_balance.read() + amount; // docs:start:unencrypted_log @@ -37,7 +38,7 @@ contract PublicToken { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let sender = context.msg_sender(); let sender_balance = storage.balances.at(sender); @@ -66,7 +67,7 @@ contract PublicToken { unconstrained fn publicBalanceOf( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.balances.at(owner).read() } } diff --git a/yarn-project/noir-contracts/src/contracts/public_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/public_token_contract/src/storage.nr index 9513325c9fa..7106170a1b9 100644 --- a/yarn-project/noir-contracts/src/contracts/public_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/public_token_contract/src/storage.nr @@ -1,14 +1,15 @@ // docs:start:PublicState +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::{ map::Map, // highlight-start:PublicState - public_state::PublicState, + public_state::PublicState, // highlight-end:PublicState }; +use dep::std::option::Option; use dep::aztec::types::type_serialisation::field_serialisation::{ - FieldSerialisationMethods, - FIELD_SERIALISED_LEN, + FieldSerialisationMethods, FIELD_SERIALISED_LEN, }; struct Storage { @@ -17,10 +18,25 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - balances: Map::new(1, |slot| PublicState::new(slot, FieldSerialisationMethods)), + balances: Map::new( + private_context, + public_context, + 1, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + FieldSerialisationMethods, + ) + }, + ), } } } -// docs:end:PublicState \ No newline at end of file +// docs:end:PublicState From 50591cf60547a02dc5ef00552905f9385d8a44f9 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:55:03 +0000 Subject: [PATCH 08/25] child --- .../src/contracts/child_contract/src/main.nr | 11 ++++++----- .../src/contracts/child_contract/src/storage.nr | 10 +++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/child_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/child_contract/src/main.nr index b85733f8c69..d5c33f4b4ed 100644 --- a/yarn-project/noir-contracts/src/contracts/child_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/child_contract/src/main.nr @@ -4,6 +4,7 @@ mod storage; contract Child { use crate::storage::Storage; use dep::aztec::oracle::logs::emit_unencrypted_log; + use dep::std::option::Option; #[aztec(private)] fn constructor() {} @@ -37,7 +38,7 @@ contract Child { // Sets `current_value` to `new_value` #[aztec(public)] fn pubSetValue(new_value: Field) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.current_value.write(new_value); let _hash = emit_unencrypted_log(new_value); context.return_values.push(new_value); @@ -46,7 +47,7 @@ contract Child { // Increments `current_value` by `new_value` #[aztec(public)] fn pubIncValue(new_value: Field) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let old_value = storage.current_value.read(); storage.current_value.write(old_value + new_value); let _hash = emit_unencrypted_log(new_value); @@ -56,7 +57,7 @@ contract Child { // Increments `current_value` by `new_value`. Can only be called from this contract. #[aztec(public)] fn pubIncValueInternal(new_value: Field) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); assert(inputs.call_context.msg_sender == inputs.call_context.storage_contract_address); let old_value = storage.current_value.read(); storage.current_value.write(old_value + new_value); @@ -69,14 +70,14 @@ contract Child { let pubSetValueSelector = 0x5b0f91b0; let _ret = context.call_public_function(context.this_address(), pubSetValueSelector, [10]); - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.current_value.write(20); let _hash = emit_unencrypted_log(20); } #[aztec(public)] fn setValueTwiceWithNestedLast() { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.current_value.write(20); let _hash = emit_unencrypted_log(20); diff --git a/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr index 9eb90ff6c76..0bec493efd8 100644 --- a/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/child_contract/src/storage.nr @@ -1,3 +1,4 @@ +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::public_state::PublicState; use dep::aztec::types::type_serialisation::field_serialisation::FieldSerialisationMethods; use dep::aztec::types::type_serialisation::field_serialisation::FIELD_SERIALISED_LEN; @@ -8,11 +9,14 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { current_value: PublicState::new( - Option::none(), - Option::none(), + private_context, + public_context, 1, FieldSerialisationMethods, ), From d84ddb283ebc934e2b124ffb2057344345ac4358 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 12:59:55 +0000 Subject: [PATCH 09/25] price feed --- .../contracts/price_feed_contract/src/main.nr | 7 ++++--- .../price_feed_contract/src/storage.nr | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/main.nr index b98d959bdc0..eafcf396aeb 100644 --- a/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/main.nr @@ -2,6 +2,7 @@ mod storage; contract PriceFeed { use crate::storage::{Storage, Asset}; + use dep::std::option::Option; #[aztec(private)] fn constructor(){} @@ -11,7 +12,7 @@ contract PriceFeed { asset_id: Field, price: u120, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let asset = storage.assets.at(asset_id); asset.write(Asset {price: price}); @@ -22,14 +23,14 @@ contract PriceFeed { fn get_price( asset_id: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); context.return_values.push_array(storage.assets.at(asset_id).read().serialise()); } unconstrained fn fetch_price( assetId: Field, ) -> Asset { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.assets.at(assetId).read() } } diff --git a/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/storage.nr index 5ba6c683310..605b08aa91f 100644 --- a/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/price_feed_contract/src/storage.nr @@ -1,9 +1,11 @@ +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::map::Map; use dep::aztec::state_vars::public_state::PublicState; use dep::aztec::types::type_serialisation::TypeSerialisationInterface; use dep::aztec::types::type_serialisation::field_serialisation::FieldSerialisationMethods; use dep::aztec::types::type_serialisation::field_serialisation::FIELD_SERIALISED_LEN; use dep::std::hash::pedersen; +use dep::std::option::Option; struct Asset { price: u120, @@ -38,9 +40,24 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - assets: Map::new(1, |slot| PublicState::new(slot, AssetSerialisationMethods)), + assets: Map::new( + private_context, + public_context, + 1, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + AssetSerialisationMethods, + ) + }, + ), } } } \ No newline at end of file From ff0bbf06f6bbec2e40e0aee665a00cfd8905a6b1 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 13:01:43 +0000 Subject: [PATCH 10/25] private token fix --- .../src/contracts/private_token_contract/src/main.nr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr index 606cfa64a52..4a366f295d2 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr @@ -29,7 +29,7 @@ contract PrivateToken { // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); if (initial_supply != 0) { - increment(&mut context, owner_balance, initial_supply, owner); + increment(owner_balance, initial_supply, owner); } } // docs:end:constructor @@ -45,7 +45,7 @@ contract PrivateToken { // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); - increment(&mut context, owner_balance, amount, owner); + increment(owner_balance, amount, owner); } // docs:end:mint @@ -61,11 +61,11 @@ contract PrivateToken { // Pick from the set of sender's notes to spend amount. let sender_balance = storage.balances.at(sender); - decrement(&mut context, sender_balance, amount, sender); + decrement(sender_balance, amount, sender); // Creates new note for the recipient. let recipient_balance = storage.balances.at(recipient); - increment(&mut context, recipient_balance, amount, recipient); + increment(recipient_balance, amount, recipient); } // docs:end:transfer From 078a3b470fa8b9aa82f55f92378ed5eafdfdf23a Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 13:21:03 +0000 Subject: [PATCH 11/25] WIP --- .../src/storage.nr | 7 ++++- .../ecdsa_account_contract/src/storage.nr | 7 ++++- .../src/storage.nr | 7 ++++- .../contracts/lending_contract/src/main.nr | 21 +++++++------- .../contracts/lending_contract/src/storage.nr | 28 +++++++++++++++---- .../native_token_contract/src/main.nr | 20 ++++++------- .../native_token_contract/src/storage.nr | 7 ++++- .../pending_commitments_contract/src/main.nr | 18 ++++++------ .../src/storage.nr | 7 ++++- .../pokeable_token_contract/src/main.nr | 8 +++--- .../pokeable_token_contract/src/storage.nr | 7 ++++- .../src/main.nr | 26 ++++++++--------- .../src/storage.nr | 7 ++++- .../schnorr_account_contract/src/storage.nr | 7 ++++- .../src/easy_private_state.nr | 8 +++--- 15 files changed, 121 insertions(+), 64 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr index 43f6b24fc24..a470905714f 100644 --- a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr @@ -1,13 +1,18 @@ // docs:start:easy_private_token_storage use dep::aztec::state_vars::map::Map; use dep::easy_private_state::easy_private_state::EasyPrivateUint; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map, } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { balances: Map::new(1, |slot| EasyPrivateUint::new(slot)), } diff --git a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr index 63c6f31f4a4..087e7c4451a 100644 --- a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr @@ -7,13 +7,18 @@ use crate::ecdsa_public_key_note::{ EcdsaPublicKeyNoteInterface, ECDSA_PUBLIC_KEY_NOTE_LEN, }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { public_key: ImmutableSingleton, } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { public_key: ImmutableSingleton::new(1, EcdsaPublicKeyNoteInterface) } diff --git a/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/storage.nr b/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/storage.nr index 70c3495d60e..56a808be3aa 100644 --- a/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/storage.nr @@ -8,6 +8,8 @@ use dep::aztec::state_vars::{ }, // highlight-end:PublicState }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { // highlight-next-line:PublicState @@ -15,7 +17,10 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { // highlight-next-line:PublicState a: PublicState::new(1, FieldSerialisationMethods), diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr index c691af2d6b2..223ab374d99 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/main.nr @@ -12,8 +12,9 @@ mod interfaces; // - Liquidations contract Lending { use dep::aztec::public_call_stack_item::PublicCallStackItem; - use crate::storage::{Storage, Asset}; use dep::safe_math::SafeU120; + use dep::std::option::Option; + use crate::storage::{Storage, Asset}; use crate::interest_math::compute_multiplier; use crate::helpers::{covered_by_collateral, DebtReturn, debt_updates, debt_value, compute_identifier}; use crate::interfaces::{Token, Lending, PriceFeed}; @@ -36,7 +37,7 @@ contract Lending { collateral_asset: Field, stable_coin: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let asset_loc = storage.assets.at(0); let asset = asset_loc.read(); @@ -61,7 +62,7 @@ contract Lending { // keccak256("update_accumulator()") >> 224 -> 0x1873b536 #[aztec(public)] fn update_accumulator() { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let asset_loc = storage.assets.at(0); let mut asset = asset_loc.read(); @@ -119,7 +120,7 @@ contract Lending { collateral_asset: Field, ) { let _asset = Lending::at(context.this_address()).update_accumulator(context); - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let coll_asset = storage.collateral_asset.read(); assert(coll_asset == collateral_asset); @@ -161,7 +162,7 @@ contract Lending { let asset = Lending::at(context.this_address()).update_accumulator(context); let price = PriceFeed::at(asset.oracle_address).get_price(context); - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let coll_loc = storage.collateral.at(owner); let collateral: Field = coll_loc.read(); @@ -216,7 +217,7 @@ contract Lending { let asset = Lending::at(context.this_address()).update_accumulator(context); let price = PriceFeed::at(asset.oracle_address).get_price(context); - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); // Fetch collateral and static_debt, compute health of current position let collateral = storage.collateral.at(owner).read() as u120; @@ -269,7 +270,7 @@ contract Lending { stable_coin: Field, ) { let asset = Lending::at(context.this_address()).update_accumulator(context); - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); // To ensure that private is using the correct token. assert(stable_coin == storage.stable_coin.read()); @@ -285,14 +286,14 @@ contract Lending { unconstrained fn get_asset( assetId: Field, ) -> Asset { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.assets.at(assetId).read() } unconstrained fn get_position( owner: Field, ) -> Position { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); let collateral = storage.collateral.at(owner).read(); let static_debt = storage.static_debt.at(owner).read(); let asset = storage.assets.at(0).read(); @@ -301,7 +302,7 @@ contract Lending { } unconstrained fn get_assets() -> [Field; 2] { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); [storage.collateral_asset.read(), storage.stable_coin.read()] } } diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr index f2f20197258..46043bcf142 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr @@ -3,6 +3,8 @@ use dep::aztec::state_vars::public_state::PublicState; use dep::aztec::types::type_serialisation::TypeSerialisationInterface; use dep::aztec::types::type_serialisation::field_serialisation::FieldSerialisationMethods; use dep::aztec::types::type_serialisation::field_serialisation::FIELD_SERIALISED_LEN; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; // Struct to be used to represent "totals". Generally, there should be one per asset. // It stores the global values that are shared among all users, such as an accumulator @@ -54,13 +56,27 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { - collateral_asset: PublicState::new(1, FieldSerialisationMethods), - stable_coin: PublicState::new(2, FieldSerialisationMethods), - assets: Map::new(3, |slot| PublicState::new(slot, AssetSerialisationMethods)), - collateral: Map::new(4, |slot| PublicState::new(slot, FieldSerialisationMethods)), - static_debt: Map::new(5, |slot| PublicState::new(slot, FieldSerialisationMethods)), + collateral_asset: PublicState::new(private_context, + public_context,1, FieldSerialisationMethods), + stable_coin: PublicState::new(private_context, + public_context,2, FieldSerialisationMethods), + assets: Map::new(private_context, + public_context,3, |private_context, public_context, slot| PublicState::new( private_context, + public_context, + slot, AssetSerialisationMethods)), + collateral: Map::new(private_context, + public_context,4, |private_context, public_context, slot| PublicState::new( private_context, + public_context, + slot, FieldSerialisationMethods)), + static_debt: Map::new(private_context, + public_context,5, |private_context, public_context, slot| PublicState::new( private_context, + public_context, + slot, FieldSerialisationMethods)), } } } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr index 8c83cd114f7..e127bcf7bc2 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr @@ -41,7 +41,7 @@ contract NativeToken { let storage = Storage::init(); let balance = storage.balances.at(owner); - increment(&mut context, balance, initial_supply, owner); + increment(balance, initial_supply, owner); } // uint256(keccak256("owner_mint_pub(field,field)")) >> 224 -> 1071038680 @@ -67,7 +67,7 @@ contract NativeToken { let pending_shields = storage.pending_shields; let mut note = TransparentNote::new(amount, secret_hash); - pending_shields.insert_from_public(&mut context, &mut note); + pending_shields.insert_from_public(&mut note); storage.total_supply.write(storage.total_supply.read() + amount); @@ -95,7 +95,7 @@ contract NativeToken { context.consume_l1_to_l2_message(inputs, msg_key, content_hash, secret); let balance = storage.balances.at(owner); - increment(&mut context, balance, amount, owner); + increment(balance, amount, owner); } // Withdraws using user's private balance. @@ -112,7 +112,7 @@ contract NativeToken { let storage = Storage::init(); let sender_balance = storage.balances.at(sender); - decrement(&mut context, sender_balance, amount, sender); + decrement(sender_balance, amount, sender); let content = get_withdraw_content_hash(amount, recipient, callerOnL1); context.message_portal(content); @@ -248,10 +248,10 @@ contract NativeToken { // Gets the set of sender's notes and picks 2 of those. let sender_balance = storage.balances.at(from); - decrement(&mut context, sender_balance, amount, from); + decrement(sender_balance, amount, from); let balance = storage.balances.at(to); - increment(&mut context, balance, amount, to); + increment(balance, amount, to); } // Shield creates a way for a user to move tokens from the public context into the private context. @@ -279,7 +279,7 @@ contract NativeToken { // and insert it into the set of "pending_shields" and therefore // (eventually) the private data tree. let mut note = TransparentNote::new(amount, secretHash); - pending_shields.insert_from_public(&mut context, &mut note); + pending_shields.insert_from_public(&mut note); } // The shield function takes a public balance, and creates a commitment containing the amount of tokens @@ -297,11 +297,11 @@ contract NativeToken { let public_note = TransparentNote::new_from_secret(amount, secret); // Ensure that the note exists in the tree and remove it. - pending_shields.assert_contains_and_remove(&mut context, public_note); + pending_shields.assert_contains_and_remove(public_note); // Mint the tokens let balance = storage.balances.at(owner); - increment(&mut context, balance, amount, owner); + increment(balance, amount, owner); } // uint256(keccak256("unshieldTokens(field,field,field)")) >> 224 -> 2423803924 @@ -315,7 +315,7 @@ contract NativeToken { // Remove user balance let sender_balance = storage.balances.at(from); - decrement(&mut context, sender_balance, amount, from); + decrement(sender_balance, amount, from); // enqueue a public function to perform the public state update. let thisAddress = context.this_address(); diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr index 9c5877fa446..d9e956a3943 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr @@ -23,6 +23,8 @@ use dep::aztec::{ FieldSerialisationMethods, }, }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map>, @@ -33,7 +35,10 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), total_supply: PublicState::new(2, FieldSerialisationMethods), diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr index e6e02be89ab..4868f2d2c46 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr @@ -43,7 +43,7 @@ contract PendingCommitments { let mut note = ValueNote::new(amount, owner); // Insert note and emit encrypted note preimage via oracle call - owner_balance.insert(&mut context, &mut note); + owner_balance.insert(&mut note); emit_encrypted_log( &mut context, context.inputs.call_context.storage_contract_address, @@ -54,7 +54,7 @@ contract PendingCommitments { let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); // get note inserted above - let maybe_notes = owner_balance.get_notes(&mut context, options); + let maybe_notes = owner_balance.get_notes(options); let note0 = maybe_notes[0].unwrap(); assert(note.value == note0.value); @@ -62,7 +62,7 @@ contract PendingCommitments { context.return_values.push(note0.value); - owner_balance.remove(&mut context, note0); + owner_balance.remove(note0); } // Confirm cannot access commitments inserted later in same function @@ -77,7 +77,7 @@ contract PendingCommitments { let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); // get note (note inserted at bottom of function shouldn't exist yet) - let maybe_notes = owner_balance.get_notes(&mut context, options); + let maybe_notes = owner_balance.get_notes(options); assert(maybe_notes[0].is_none()); assert(maybe_notes[1].is_none()); @@ -86,7 +86,7 @@ contract PendingCommitments { // Insert note and emit encrypted note preimage via oracle call let mut note = ValueNote::new(amount, owner); - owner_balance.insert(&mut context, &mut note); + owner_balance.insert(&mut note); emit_encrypted_log( &mut context, context.inputs.call_context.storage_contract_address, @@ -115,7 +115,7 @@ contract PendingCommitments { let mut note = ValueNote::new(amount, owner); // Insert note and emit encrypted note preimage via oracle call - owner_balance.insert(&mut context, &mut note); + owner_balance.insert(&mut note); emit_encrypted_log( &mut context, context.inputs.call_context.storage_contract_address, @@ -136,13 +136,13 @@ contract PendingCommitments { let owner_balance = storage.balances.at(owner); let options = NoteGetterOptions::new().set_limit(1); - let note = owner_balance.get_notes(&mut context, options)[0].unwrap(); + let note = owner_balance.get_notes(options)[0].unwrap(); assert(expected_value == note.value); context.return_values.push(expected_value); - owner_balance.remove(&mut context, note); + owner_balance.remove(note); } // Nested/inner function to get a note and confirms that none is returned @@ -155,7 +155,7 @@ contract PendingCommitments { let owner_balance = storage.balances.at(owner); let options = NoteGetterOptions::new(); - let maybe_notes = owner_balance.get_notes(&mut context, options); + let maybe_notes = owner_balance.get_notes(options); assert(maybe_notes[0].is_none()); assert(maybe_notes[1].is_none()); diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr index c56aa30b032..5a81eff61a1 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr @@ -7,13 +7,18 @@ use dep::value_note::value_note::{ ValueNoteMethods, VALUE_NOTE_LEN, }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map>, } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), } diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr index aa83ffa88c7..203223a62b2 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr @@ -36,7 +36,7 @@ contract PokeableToken { // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let sender_balance = storage.balances.at(sender); - increment(&mut context, sender_balance, initial_supply, sender); + increment(sender_balance, initial_supply, sender); } // Transfers full balance of tokens from `sender` to a `recipient`. @@ -57,7 +57,7 @@ contract PokeableToken { let sender_balance = storage.balances.at(sender); let options = NoteGetterOptions::new(); - let maybe_notes = sender_balance.get_notes(&mut context, options); + let maybe_notes = sender_balance.get_notes(options); let mut note_sum = 0; for i in 0..maybe_notes.len() { if maybe_notes[i].is_some() { @@ -68,7 +68,7 @@ contract PokeableToken { assert(note.owner == sender); // Removes the note from the owner's set of notes. - sender_balance.remove(&mut context, note); + sender_balance.remove(note); note_sum += note.value; } @@ -76,7 +76,7 @@ contract PokeableToken { // Create new note for the recipient. let recipient_balance = storage.balances.at(recipient); - increment(&mut context, recipient_balance, note_sum, recipient); + increment(recipient_balance, note_sum, recipient); } // Helper function to get the balance of a user ("unconstrained" is a Noir alternative of Solidity's "view" function). diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr index 68af9143363..c8cf8a56d2e 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr @@ -13,6 +13,8 @@ use dep::value_note::value_note::{ ValueNoteMethods, VALUE_NOTE_LEN, }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { sender: ImmutableSingleton, @@ -21,7 +23,10 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { sender: ImmutableSingleton::new(1, AddressNoteMethods), recipient: ImmutableSingleton::new(2, AddressNoteMethods), diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr index 10236cf6d7a..340e6008c5d 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr @@ -32,7 +32,7 @@ contract PrivateTokenAirdrop { // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); if (initial_supply != 0) { - increment(&mut context, owner_balance, initial_supply, owner); + increment(owner_balance, initial_supply, owner); } } @@ -46,7 +46,7 @@ contract PrivateTokenAirdrop { // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); - increment(&mut context, owner_balance, amount, owner); + increment(owner_balance, amount, owner); } // Burn `amount` of tokens from `owner`'s balance. @@ -66,7 +66,7 @@ contract PrivateTokenAirdrop { } let balance = storage.balances.at(owner); - let sum = decrement_by_at_most(&mut context, balance, amount, owner); + let sum = decrement_by_at_most(balance, amount, owner); // If sum is 0, there are no notes to be burned. assert(sum != 0); @@ -90,7 +90,7 @@ contract PrivateTokenAirdrop { let sender = context.msg_sender(); let sender_balance = storage.balances.at(sender); - let sum = decrement_by_at_most(&mut context, sender_balance, amount, sender); + let sum = decrement_by_at_most(sender_balance, amount, sender); // If sum is 0, there are no notes to be used. assert(sum != 0); @@ -107,7 +107,7 @@ contract PrivateTokenAirdrop { // Create a new note for the recipient. let recipient_balance = storage.balances.at(recipient); - increment(&mut context, recipient_balance, amount, recipient); + increment(recipient_balance, amount, recipient); } #[aztec(private)] @@ -121,7 +121,7 @@ contract PrivateTokenAirdrop { // Pick from the set of sender's notes to spend amount. let sender_balance = storage.balances.at(sender); let total = amounts[0] + amounts[1]; - decrement(&mut context, sender_balance, total, sender); + decrement(sender_balance, total, sender); // Create claim notes. let claims = storage.claims; @@ -129,8 +129,8 @@ contract PrivateTokenAirdrop { let mut note1 = ClaimNote::new(amounts[1], secrets[1]); // Insert the new claim notes to the set. - claims.insert(&mut context, &mut note0); - claims.insert(&mut context, &mut note1); + claims.insert(&mut note0); + claims.insert(&mut note1); } #[aztec(private)] @@ -147,7 +147,7 @@ contract PrivateTokenAirdrop { // Send the value note. let balance = storage.balances.at(owner); - increment(&mut context, balance, amount, owner); + increment(balance, amount, owner); } // Transfers `amounts` of tokens from `sender` to 3 `recipients`. @@ -168,26 +168,26 @@ contract PrivateTokenAirdrop { let total = amounts[0] + amounts[1] + amounts[2]; let options = NoteGetterOptions::new().set_limit(1).set_offset(spend_note_offset); - let opt_notes = sender_balance.get_notes(&mut context, options); + let opt_notes = sender_balance.get_notes(options); // The note should always exist. let note = opt_notes[0].unwrap_unchecked(); assert(note.owner == sender); - sender_balance.remove(&mut context, note); + sender_balance.remove(note); // Assert that the note chosen to spend has enough funds. assert(note.value as u64 >= total as u64); // Add the change value back to the owner's balance. let change_value = note.value - total; - increment(&mut context, sender_balance, change_value, sender); + increment(sender_balance, change_value, sender); // Creates new note for the recipient. for i in 0..3 { let recipient_balance = storage.balances.at(recipients[i]); - increment(&mut context, recipient_balance, amounts[i], recipients[i]); + increment(recipient_balance, amounts[i], recipients[i]); } // Also emit an unencrypted log, eg. "Coins transferred" diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr index a81d91b415c..f265b70a2b7 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr @@ -8,6 +8,8 @@ use dep::value_note::value_note::{ VALUE_NOTE_LEN, }; use crate::claim_note::{CLAIM_NOTE_LEN, ClaimNote, ClaimNoteMethods}; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map>, @@ -15,7 +17,10 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), claims: Set::new(2, ClaimNoteMethods), diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr index 4dbe927ace8..6bfbec55b02 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr @@ -1,6 +1,8 @@ use dep::aztec::state_vars::{ immutable_singleton::ImmutableSingleton }; +use dep::std::option::Option; +use dep::aztec::context::{PrivateContext, PublicContext}; use crate::public_key_note::{ PublicKeyNote, @@ -13,7 +15,10 @@ struct Storage { } impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { signing_public_key: ImmutableSingleton::new(1, PublicKeyNoteMethods) } diff --git a/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr b/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr index abaf0dc72ba..91d46027fc4 100644 --- a/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr +++ b/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr @@ -45,7 +45,7 @@ impl EasyPrivateUint { let mut addend_note = ValueNote::new(addend as Field, owner); // Insert the new note to the owner's set of notes. - self.set.insert(context, &mut addend_note); + self.set.insert(&mut addend_note); // Emit the newly created encrypted note preimages via oracle calls. let owner_key = get_public_key(owner); @@ -66,7 +66,7 @@ impl EasyPrivateUint { owner: Field, ) { let options = NoteGetterOptions::with_filter(filter_notes_min_sum, subtrahend as Field); - let maybe_notes = self.set.get_notes(context, options); + let maybe_notes = self.set.get_notes(options); let mut minuend: u120 = 0; for i in 0..maybe_notes.len() { @@ -78,7 +78,7 @@ impl EasyPrivateUint { assert(note.owner == owner); // Removes the note from the owner's set of notes. - self.set.remove(context, note); + self.set.remove(note); minuend += note.value as u120; } @@ -89,7 +89,7 @@ impl EasyPrivateUint { // Creates change note for the owner. let result_value = minuend - subtrahend; let mut result_note = ValueNote::new(result_value as Field, owner); - self.set.insert(context, &mut result_note); + self.set.insert(&mut result_note); // Emit the newly created encrypted note preimages via oracle calls. let mut encrypted_data = [0; VALUE_NOTE_LEN]; From f956a3fb0ec9aaad3351fbea4cc79bb3435a125a Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 13:33:03 +0000 Subject: [PATCH 12/25] ecdsa --- .../ecdsa_account_contract/src/main.nr | 9 ++-- .../ecdsa_account_contract/src/storage.nr | 19 +++----- .../src/state_vars/immutable_singleton.nr | 47 +++++++++++++------ 3 files changed, 43 insertions(+), 32 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main.nr index b245de94164..f13ceb36ae9 100644 --- a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main.nr @@ -5,6 +5,7 @@ mod ecdsa_public_key_note; // The signing key is stored in an immutable private note and should be different from the signing key. contract EcdsaAccount { use dep::std; + use dep::std::option::Option; use dep::aztec::entrypoint; use dep::aztec::entrypoint::EntrypointPayload; use dep::aztec::abi::CallContext; @@ -32,8 +33,8 @@ contract EcdsaAccount { signature: pub [u8;64], ) { // Load public key from storage - let storage = Storage::init(); - let public_key = storage.public_key.get_note(&mut context); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let public_key = storage.public_key.get_note(); // Verify payload signature using Ethereum's signing scheme // Note that noir expects the hash of the message/challenge as input to the ECDSA verification. @@ -58,11 +59,11 @@ contract EcdsaAccount { signing_pub_key_x: pub [u8;32], signing_pub_key_y: pub [u8;32], ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let this = context.this_address(); let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this); - storage.public_key.initialise(&mut context, &mut pub_key_note); + storage.public_key.initialise(&mut pub_key_note); emit_encrypted_log( &mut context, diff --git a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr index 087e7c4451a..9a93c595e73 100644 --- a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/storage.nr @@ -1,26 +1,19 @@ -use dep::aztec::state_vars::{ - immutable_singleton::ImmutableSingleton -}; +use dep::aztec::state_vars::immutable_singleton::ImmutableSingleton; use crate::ecdsa_public_key_note::{ - EcdsaPublicKeyNote, - EcdsaPublicKeyNoteInterface, - ECDSA_PUBLIC_KEY_NOTE_LEN, + EcdsaPublicKeyNote, EcdsaPublicKeyNoteInterface, ECDSA_PUBLIC_KEY_NOTE_LEN, }; -use dep::std::option::Option; use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::std::option::Option; struct Storage { public_key: ImmutableSingleton, } impl Storage { - fn init( - private_context: Option<&mut PrivateContext>, - public_context: Option<&mut PublicContext>, - ) -> Self { + fn init(private_context: Option<&mut PrivateContext>, _: Option<&mut PublicContext>) -> Self { Storage { - public_key: ImmutableSingleton::new(1, EcdsaPublicKeyNoteInterface) + public_key: ImmutableSingleton::new(private_context, 1, EcdsaPublicKeyNoteInterface), } } -} \ No newline at end of file +} diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton.nr index 1f51638cc85..175876a88ea 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton.nr @@ -1,4 +1,4 @@ -use dep::std::hash::pedersen_with_separator; +use crate::constants_gen::{EMPTY_NULLIFIED_COMMITMENT, GENERATOR_INDEX__INITIALISATION_NULLIFIER}; use crate::context::PrivateContext; use crate::note::{ lifecycle::create_note, @@ -7,20 +7,27 @@ use crate::note::{ note_viewer_options::NoteViewerOptions, }; use crate::oracle; -use crate::constants_gen::{ - GENERATOR_INDEX__INITIALISATION_NULLIFIER, - EMPTY_NULLIFIED_COMMITMENT, -}; +use dep::std::hash::pedersen_with_separator; +use dep::std::option::Option; struct ImmutableSingleton { + context: Option<&mut PrivateContext>, storage_slot: Field, note_interface: NoteInterface, } impl ImmutableSingleton { - fn new(storage_slot: Field, note_interface: NoteInterface) -> Self { + fn new( + context: Option<&mut PrivateContext>, + storage_slot: Field, + note_interface: NoteInterface, + ) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - ImmutableSingleton { storage_slot, note_interface } + ImmutableSingleton { + context, + storage_slot, + note_interface, + } } unconstrained fn is_initialised(self) -> bool { @@ -28,25 +35,35 @@ impl ImmutableSingleton { oracle::notes::is_nullifier_emitted(nullifier) } - fn initialise(self, context: &mut PrivateContext, note: &mut Note) { + fn initialise(self, note: &mut Note) { // Nullify the storage slot. let nullifier = self.compute_initialisation_nullifier(); - context.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT); + self.context + .unwrap() + .push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT); - create_note(context, self.storage_slot, note, self.note_interface); + create_note( + self.context.unwrap(), + self.storage_slot, + note, + self.note_interface, + ); } fn compute_initialisation_nullifier(self) -> Field { - pedersen_with_separator([self.storage_slot], GENERATOR_INDEX__INITIALISATION_NULLIFIER)[0] + pedersen_with_separator( + [self.storage_slot], + GENERATOR_INDEX__INITIALISATION_NULLIFIER, + )[0] } - - fn get_note(self, context: &mut PrivateContext) -> Note { + + fn get_note(self) -> Note { let storage_slot = self.storage_slot; - get_note(context, storage_slot, self.note_interface) + get_note(self.context.unwrap(), storage_slot, self.note_interface) } unconstrained fn view_note(self) -> Note { let options = NoteViewerOptions::new().set_limit(1); view_notes(self.storage_slot, self.note_interface, options)[0].unwrap() } -} \ No newline at end of file +} From f06ea56bac9e7cfc48d59c961592955b5a0fbcee Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 13:35:26 +0000 Subject: [PATCH 13/25] schnorr account --- .../schnorr_account_contract/src/main.nr | 4 ++-- .../schnorr_account_contract/src/storage.nr | 21 ++++++------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr index 391050d2653..0d3f854581c 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr @@ -32,7 +32,7 @@ contract SchnorrAccount { signature: pub [u8;64], // schnorr signature of the payload hash ) { // Load public key from storage - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let public_key = storage.signing_public_key.get_note(&mut context); // Verify payload signature @@ -61,7 +61,7 @@ contract SchnorrAccount { signing_pub_key_x: pub Field, signing_pub_key_y: pub Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let this = context.this_address(); let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this); diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr index 6bfbec55b02..e6344a376e8 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/storage.nr @@ -1,26 +1,17 @@ -use dep::aztec::state_vars::{ - immutable_singleton::ImmutableSingleton -}; -use dep::std::option::Option; use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::immutable_singleton::ImmutableSingleton; +use dep::std::option::Option; -use crate::public_key_note::{ - PublicKeyNote, - PublicKeyNoteMethods, - PUBLIC_KEY_NOTE_LEN, -}; +use crate::public_key_note::{PublicKeyNote, PublicKeyNoteMethods, PUBLIC_KEY_NOTE_LEN}; struct Storage { signing_public_key: ImmutableSingleton, } impl Storage { - fn init( - private_context: Option<&mut PrivateContext>, - public_context: Option<&mut PublicContext>, - ) -> Self { + fn init(private_context: Option<&mut PrivateContext>, _: Option<&mut PublicContext>) -> Self { Storage { - signing_public_key: ImmutableSingleton::new(1, PublicKeyNoteMethods) + signing_public_key: ImmutableSingleton::new(private_context, 1, PublicKeyNoteMethods), } } -} \ No newline at end of file +} From 179aece96fb7269510d9512e140eb34fe1e87b1a Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 13:37:20 +0000 Subject: [PATCH 14/25] schnorr --- .../src/contracts/schnorr_account_contract/src/main.nr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr index 0d3f854581c..9bbe81dcd10 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/src/main.nr @@ -5,6 +5,7 @@ mod public_key_note; // The signing key is stored in an immutable private note and should be different from the encryption/nullifying key. contract SchnorrAccount { use dep::std; + use dep::std::option::Option; use dep::aztec::entrypoint; use dep::aztec::entrypoint::EntrypointPayload; use dep::aztec::abi::CallContext; @@ -33,7 +34,7 @@ contract SchnorrAccount { ) { // Load public key from storage let storage = Storage::init(Option::some(&mut context), Option::none()); - let public_key = storage.signing_public_key.get_note(&mut context); + let public_key = storage.signing_public_key.get_note(); // Verify payload signature let payload_fields: [Field; entrypoint::ENTRYPOINT_PAYLOAD_SIZE] = payload.serialize(); @@ -65,7 +66,7 @@ contract SchnorrAccount { let this = context.this_address(); let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this); - storage.signing_public_key.initialise(&mut context, &mut pub_key_note); + storage.signing_public_key.initialise(&mut pub_key_note); emit_encrypted_log( &mut context, From 719be2a26f9b118c99b4ac684655c80e57894c48 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:00:22 +0000 Subject: [PATCH 15/25] WIP --- .../easy_private_token_contract/src/main.nr | 17 ++++--- .../src/storage.nr | 11 +++- .../src/main.nr | 4 +- .../native_token_contract/src/main.nr | 38 +++++++------- .../pending_commitments_contract/src/main.nr | 15 ++++-- .../pokeable_token_contract/src/main.nr | 8 +-- .../src/main.nr | 23 ++++++--- .../src/easy_private_state.nr | 51 +++++++++---------- 8 files changed, 92 insertions(+), 75 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/main.nr index 0e4d01d04b0..29135c0398b 100644 --- a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/main.nr @@ -2,6 +2,7 @@ mod storage; contract EasyPrivateToken { + use dep::std::option::Option; use dep::aztec::abi::Hasher; use dep::value_note::{ balance_utils, @@ -31,10 +32,10 @@ contract EasyPrivateToken { initial_supply: u120, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let balances = storage.balances; - balances.at(owner).add(&mut context, initial_supply, owner); + balances.at(owner).add(initial_supply, owner); } // Mints `amount` of tokens to `owner`. @@ -43,10 +44,10 @@ contract EasyPrivateToken { amount: u120, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let balances = storage.balances; - balances.at(owner).add(&mut context, amount, owner); + balances.at(owner).add(amount, owner); } // Transfers `amount` of tokens from `sender` to a `recipient`. @@ -56,18 +57,18 @@ contract EasyPrivateToken { sender: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let balances = storage.balances; - balances.at(sender).sub(&mut context, amount, sender); - balances.at(recipient).add(&mut context, amount, recipient); + balances.at(sender).sub(amount, sender); + balances.at(recipient).add(amount, recipient); } // Helper function to get the balance of a user ("unconstrained" is a Noir alternative of Solidity's "view" function). unconstrained fn getBalance( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); let balances = storage.balances; // Return the sum of all notes in the set. diff --git a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr index a470905714f..caac9c3dc51 100644 --- a/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/easy_private_token_contract/src/storage.nr @@ -1,8 +1,8 @@ // docs:start:easy_private_token_storage +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::map::Map; use dep::easy_private_state::easy_private_state::EasyPrivateUint; use dep::std::option::Option; -use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map, @@ -14,7 +14,14 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - balances: Map::new(1, |slot| EasyPrivateUint::new(slot)), + balances: Map::new( + private_context, + public_context, + 1, + |private_context, public_context, slot| { + EasyPrivateUint::new(private_context, public_context, slot) + }, + ), } } } diff --git a/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/main.nr b/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/main.nr index b8437caf205..f889110058d 100644 --- a/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/example_public_state_increment_BROKE/src/main.nr @@ -29,7 +29,7 @@ contract ExamplePublicStateIncrement { // a = 100; #[aztec(public)] open internal fn initialise_a() { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.a.write(100); } @@ -38,7 +38,7 @@ contract ExamplePublicStateIncrement { fn increment_a( b: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let mut a = storage.a.read(); a += b; storage.a.write(a); diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr index e127bcf7bc2..1d39ae730db 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr @@ -38,7 +38,7 @@ contract NativeToken { initial_supply: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let balance = storage.balances.at(owner); increment(balance, initial_supply, owner); @@ -50,7 +50,7 @@ contract NativeToken { to: Field, amount: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let new_balance = storage.public_balances.at(to).read() + amount; storage.public_balances.at(to).write(new_balance); storage.total_supply.write(storage.total_supply.read() + amount); @@ -63,7 +63,7 @@ contract NativeToken { amount: Field, secret_hash: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let pending_shields = storage.pending_shields; let mut note = TransparentNote::new(amount, secret_hash); @@ -87,7 +87,7 @@ contract NativeToken { secret: Field, canceller: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let content_hash = get_mint_content_hash(amount, owner, canceller); @@ -109,7 +109,7 @@ contract NativeToken { recipient: Field, // ethereum address in the field callerOnL1: Field, // ethereum address that can call this function on the L1 portal (0x0 if anyone can call) ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender_balance = storage.balances.at(sender); decrement(sender_balance, amount, sender); @@ -131,7 +131,7 @@ contract NativeToken { secret: Field, canceller: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let content_hash = get_mint_content_hash(amount, owner_address, canceller); @@ -156,7 +156,7 @@ contract NativeToken { recipient: Field, callerOnL1: Field, // ethereum address that can call this function on the L1 portal (0x0 if anyone can call) ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let sender = context.msg_sender(); @@ -181,7 +181,7 @@ contract NativeToken { spender: Field, allowance: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.public_allowances.at(context.msg_sender()).at(spender).write(allowance); } @@ -191,7 +191,7 @@ contract NativeToken { to: Field, amount: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); // Decrease user's balance. let sender = context.msg_sender(); @@ -214,7 +214,7 @@ contract NativeToken { to: Field, amount: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); // Decrease allowance let allowance = storage.public_allowances.at(from).at(context.msg_sender()); @@ -244,7 +244,7 @@ contract NativeToken { to: Field, amount: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); // Gets the set of sender's notes and picks 2 of those. let sender_balance = storage.balances.at(from); @@ -261,7 +261,7 @@ contract NativeToken { amount: Field, secretHash: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let public_balances = storage.public_balances; let pending_shields = storage.pending_shields; @@ -291,7 +291,7 @@ contract NativeToken { secret: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let pending_shields = storage.pending_shields; let public_note = TransparentNote::new_from_secret(amount, secret); @@ -311,7 +311,7 @@ contract NativeToken { to: Field, amount: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); // Remove user balance let sender_balance = storage.balances.at(from); @@ -331,7 +331,7 @@ contract NativeToken { amount: Field, to: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let to_balance = storage.public_balances.at(to); let current_balance = to_balance.read(); @@ -342,7 +342,7 @@ contract NativeToken { unconstrained fn balance_of( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); let owner_balance = storage.balances.at(owner); balance_utils::get_balance(owner_balance) @@ -361,14 +361,14 @@ contract NativeToken { } unconstrained fn total_supply() -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.total_supply.read() } unconstrained fn public_balance_of( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.public_balances.at(owner).read() } @@ -376,7 +376,7 @@ contract NativeToken { owner: Field, spender: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); storage.public_allowances.at(owner).at(spender).read() } } diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr index 4868f2d2c46..f7c76771988 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr @@ -37,7 +37,8 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let owner_balance = storage.balances.at(owner); let mut note = ValueNote::new(amount, owner); @@ -71,7 +72,8 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let owner_balance = storage.balances.at(owner); @@ -109,7 +111,8 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let owner_balance = storage.balances.at(owner); let mut note = ValueNote::new(amount, owner); @@ -131,7 +134,8 @@ contract PendingCommitments { expected_value: Field, owner: Field, ){ - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let owner_balance = storage.balances.at(owner); @@ -150,7 +154,8 @@ contract PendingCommitments { fn get_note_zero_balance( owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let owner_balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr index 203223a62b2..46adf63bb06 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr @@ -26,7 +26,8 @@ contract PokeableToken { sender: Field, recipient: Field ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let mut sender_note = AddressNote::new(sender); let mut recipient_note = AddressNote::new(recipient); @@ -45,7 +46,8 @@ contract PokeableToken { sender: Field, recipient: Field ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + // TODO: This check is not satisfying constraints // let mut sender_note = AddressNote::new(sender); @@ -83,7 +85,7 @@ contract PokeableToken { unconstrained fn getBalance( sender: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); // Get the set of notes owned by the user. let sender_balance = storage.balances.at(sender); diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr index 340e6008c5d..1c95f589640 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr @@ -27,7 +27,8 @@ contract PrivateTokenAirdrop { initial_supply: Field, owner: Field ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -42,7 +43,8 @@ contract PrivateTokenAirdrop { amount: Field, owner: Field ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -56,7 +58,8 @@ contract PrivateTokenAirdrop { amount: Field, owner: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let msg_sender = context.msg_sender(); let this_address = context.this_address(); @@ -85,7 +88,8 @@ contract PrivateTokenAirdrop { amount: Field, recipient: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let sender = context.msg_sender(); let sender_balance = storage.balances.at(sender); @@ -115,7 +119,8 @@ contract PrivateTokenAirdrop { amounts: [Field; 2], secrets: [Field; 2], ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + let sender = context.msg_sender(); // Pick from the set of sender's notes to spend amount. @@ -139,7 +144,8 @@ contract PrivateTokenAirdrop { secret: Field, owner: Field ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + // Remove the claim note if it exists in the set. let note = ClaimNote::new(amount, secret); @@ -160,7 +166,8 @@ contract PrivateTokenAirdrop { recipients: [Field; 3], spend_note_offset: u32, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); + // Gets the set of sender's notes and picks 4 of those based on the offset. // Spends the first of those 4 notes. @@ -201,7 +208,7 @@ contract PrivateTokenAirdrop { unconstrained fn getBalance( owner: Field, ) -> Field { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); // Get the set of notes owned by the user. let owner_balance = storage.balances.at(owner); diff --git a/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr b/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr index 91d46027fc4..a78096c0772 100644 --- a/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr +++ b/yarn-project/noir-libs/easy-private-state/src/easy_private_state.nr @@ -1,46 +1,45 @@ -use dep::std::option::Option; -use dep::value_note::{ - filter::filter_notes_min_sum, - value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, - }, -}; use dep::aztec::{ - context::PrivateContext, + context::{PrivateContext, PublicContext}, log::emit_encrypted_log, note::note_getter_options::NoteGetterOptions, oracle::get_public_key::get_public_key, state_vars::set::Set, types::point::Point, }; +use dep::std::option::Option; +use dep::value_note::{ + filter::filter_notes_min_sum, + value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}, +}; struct EasyPrivateUint { + context: Option<&mut PrivateContext>, set: Set, storage_slot: Field, } impl EasyPrivateUint { - fn new(storage_slot: Field) -> Self { + fn new( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + storage_slot: Field, + ) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. let set = Set { + private_context, + public_context, storage_slot, note_interface: ValueNoteMethods, }; EasyPrivateUint { + context: private_context, set, storage_slot, } } // Very similar to `value_note::utils::increment`. - fn add( - self, - context: &mut PrivateContext, - addend: u120, - owner: Field, - ) { + fn add(self, addend: u120, owner: Field) { // Creates new note for the owner. let mut addend_note = ValueNote::new(addend as Field, owner); @@ -49,9 +48,10 @@ impl EasyPrivateUint { // Emit the newly created encrypted note preimages via oracle calls. let owner_key = get_public_key(owner); + let _context = self.context.unwrap(); emit_encrypted_log( - context, - (*context).this_address(), + _context, + (*_context).this_address(), self.set.storage_slot, owner_key, addend_note.serialise(), @@ -59,12 +59,7 @@ impl EasyPrivateUint { } // Very similar to `value_note::utils::decrement`. - fn sub( - self, - context: &mut PrivateContext, - subtrahend: u120, - owner: Field, - ) { + fn sub(self, subtrahend: u120, owner: Field) { let options = NoteGetterOptions::with_filter(filter_notes_min_sum, subtrahend as Field); let maybe_notes = self.set.get_notes(options); @@ -99,13 +94,13 @@ impl EasyPrivateUint { let owner_key = get_public_key(owner); + let _context = self.context.unwrap(); emit_encrypted_log( - context, - (*context).this_address(), + _context, + (*_context).this_address(), self.set.storage_slot, owner_key, encrypted_data, ); } } - From 472662227e2f8b327c9222e1c2a16f0123ddd205 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:29:15 +0000 Subject: [PATCH 16/25] pokeable --- .../pokeable_token_contract/src/main.nr | 11 +++--- .../pokeable_token_contract/src/storage.nr | 35 ++++++++----------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr index 46adf63bb06..d230cb5324e 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/main.nr @@ -3,6 +3,7 @@ mod address_note; contract PokeableToken { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, utils::increment, @@ -26,14 +27,13 @@ contract PokeableToken { sender: Field, recipient: Field ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let mut sender_note = AddressNote::new(sender); let mut recipient_note = AddressNote::new(recipient); - storage.sender.initialise(&mut context, &mut sender_note); - storage.recipient.initialise(&mut context, &mut recipient_note); + storage.sender.initialise(&mut sender_note); + storage.recipient.initialise(&mut recipient_note); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let sender_balance = storage.balances.at(sender); @@ -46,8 +46,7 @@ contract PokeableToken { sender: Field, recipient: Field ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); // TODO: This check is not satisfying constraints // let mut sender_note = AddressNote::new(sender); diff --git a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr index c8cf8a56d2e..0a7193f66c7 100644 --- a/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/pokeable_token_contract/src/storage.nr @@ -1,20 +1,8 @@ -use dep::aztec::state_vars::{ - immutable_singleton::ImmutableSingleton, - map::Map, - set::Set -}; -use crate::address_note::{ - AddressNote, - AddressNoteMethods, - ADDRESS_NOTE_LEN, -}; -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; -use dep::std::option::Option; +use crate::address_note::{AddressNote, AddressNoteMethods, ADDRESS_NOTE_LEN}; use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::{immutable_singleton::ImmutableSingleton, map::Map, set::Set}; +use dep::std::option::Option; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; struct Storage { sender: ImmutableSingleton, @@ -28,9 +16,16 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - sender: ImmutableSingleton::new(1, AddressNoteMethods), - recipient: ImmutableSingleton::new(2, AddressNoteMethods), - balances: Map::new(3, |slot| Set::new(slot, ValueNoteMethods)), + sender: ImmutableSingleton::new(private_context, 1, AddressNoteMethods), + recipient: ImmutableSingleton::new(private_context, 2, AddressNoteMethods), + balances: Map::new( + private_context, + public_context, + 3, + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), } } -} \ No newline at end of file +} From 4e098e09702dce950af235c3790480176b9b5ffc Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:32:10 +0000 Subject: [PATCH 17/25] pending commitments --- .../pending_commitments_contract/src/main.nr | 16 +++++-------- .../src/storage.nr | 24 +++++++++---------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr index f7c76771988..70369971055 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/main.nr @@ -6,6 +6,7 @@ mod storage; // be read/nullified before their creation etc. contract PendingCommitments { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, filter::filter_notes_min_sum, @@ -37,8 +38,7 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner_balance = storage.balances.at(owner); let mut note = ValueNote::new(amount, owner); @@ -72,8 +72,7 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner_balance = storage.balances.at(owner); @@ -111,8 +110,7 @@ contract PendingCommitments { amount: Field, owner: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner_balance = storage.balances.at(owner); let mut note = ValueNote::new(amount, owner); @@ -134,8 +132,7 @@ contract PendingCommitments { expected_value: Field, owner: Field, ){ - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner_balance = storage.balances.at(owner); @@ -154,8 +151,7 @@ contract PendingCommitments { fn get_note_zero_balance( owner: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner_balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr index 5a81eff61a1..c8c5741bd49 100644 --- a/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/pending_commitments_contract/src/storage.nr @@ -1,14 +1,7 @@ -use dep::aztec::state_vars::{ - map::Map, - set::Set -}; -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; -use dep::std::option::Option; use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::{map::Map, set::Set}; +use dep::std::option::Option; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; struct Storage { balances: Map>, @@ -20,7 +13,14 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), + balances: Map::new( + private_context, + public_context, + 1, // Storage slot + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), } } -} \ No newline at end of file +} From 8a727b65129d8b72dc479dca8e81ac8264b59168 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:36:45 +0000 Subject: [PATCH 18/25] private token airdrop --- .../src/abis/ecdsa_account_contract.json | 160 ------------------ .../src/abis/schnorr_account_contract.json | 148 ---------------- .../schnorr_single_key_account_contract.json | 103 ----------- .../src/main.nr | 3 +- .../src/storage.nr | 28 +-- 5 files changed, 16 insertions(+), 426 deletions(-) delete mode 100644 yarn-project/aztec.js/src/abis/ecdsa_account_contract.json delete mode 100644 yarn-project/aztec.js/src/abis/schnorr_account_contract.json delete mode 100644 yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json diff --git a/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json b/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json deleted file mode 100644 index 16ff4e111df..00000000000 --- a/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "name": "EcdsaAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 5, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "aztec::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "flattened_args_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_selectors", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_targets", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - }, - { - "name": "signature", - "type": { - "kind": "array", - "length": 64, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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8XQBHWe91PF0gYDxdKGQ8XQRHedQqePpIgHj6WIh4+kSIZyXCuG8TAjn5cx16POqjlcs+J2Vztvv91Qd/7Hgd3YnnatOlvMKQv1N2Ne+rfhR9/Pfhaw/VwrhvEoI59VCOP8hhPMaIZzXCuG8Tgjn9UI4bxDCeaMQzpuEcN4shPMWIZy3Mv8eNEqdj78vQu93LvPvQRcrn++14HeekO9BtxF+DyLsaz9PwLh5wMK4uZ35OqH9fsiC33cI8PsRC37fydzvK9WCc66F+7QKmM9vfR/ZORb8LhRyXLiL8LhA2Nd+oYBxc76FcXM383VC+32hBb/vEeD3xRb8vlfI95r7hHDeL4TzASGcDwrhfEgI58NCOB8RwvmoJc5IgDOe3Nb6BAwqnx8T4nOE0OfHhfgcJfT5CSE+pxL6/KQQn9MIfX5KiM/phD4/LcTnowl9fkaIz5cQ/j7xWSE+X0ro8z+F+HwZoc/PCfH5ckKfnxfi8xWEPr8gxOe/E/r8ohCfryT0+SUhPl9F6PO/hPh8NaHPLwvx+R+EPr8ixOdrCH1+VYjP1xL6/JoQn68j9Pl1IT5fT+jzG0J8voHQ5zeF+Hwjoc9vCfH5JkKf3xbi882EPr8jxOdbCH1+V4jPtxL6/G8hPt9G6PN7Qny+ndDn94X4fAehz/8R4vOdhD5/IMTnuwh9/lCIz3cT+vyREJ/vIfT5YyE+30vo8ydCfL6P0OdPhfh8P6HPnwnx+QFCnz8X4vODhD5/IcTnhwh9/lKIzw8T+vyVEJ8fIfT5ayE+P0ro8zdCfM7w6Hz+VojPmYQ+fyfE5yxCn78X4nM2oc8/CPE5Rujzf4X4nEPo849CfM4l9PknIT7nEfr8sxCf8wl9/kWIz10Iff6fEJ8LCH3+VYjPhYQ+/ybE5yJCn38X4nMxoc9/CPG5hNDnPwl9LoF6zH/X6d9E6d8I6d/M6N+Q6O+D+vuR/r6g9bPWk1pfab2hj7/6eKTXZ71e6fmrx7PuX13velB3qUplKpWrVKFSV5UqVeqmUneVeqjUU6UqlapVqlGpl0q9VeqjUq1KfVXqp1J/lQaoVKfSQJUGqTRYpSE6FirpPyyp1zFWqUGlRpWGqdSkUrNKLSoNV2mESiNVGqXSOiqNhv4Z4y39k8pxKo1XaYJKE1WapNJklaaoNFWlaSqtCz5OV2mGSjNVWl+lWSrNVmmOSnNV2kClDVXaSKWNVdpEpU1V2kylzVXaQqUtVdpKpXkqzQdGvenfD+rf0+nfl+nfW+nfH+nf4+jfp+jfa+jfL+j7+fX97fp+b33/s74fWN8fq+8X1fdP6vsJ9f11+n4zff+Vvh9J35+j71fR92/o+xn09X19vVtf/9XXQ/X1QX29TF8/0tdT9PUFfb5dn3/W52P1+Ul9vk6fv9Lnc/T5Df19X3//1d8H9fcj/X1B62etJ7W+0npDH3/18Uivz3q90vNXj+f/A4clAFWIGggA", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/aztec.js/src/abis/schnorr_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_account_contract.json deleted file mode 100644 index aefc4bfdfb3..00000000000 --- a/yarn-project/aztec.js/src/abis/schnorr_account_contract.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "SchnorrAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 3, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "field" - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "field" - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "aztec::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "flattened_args_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_selectors", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_targets", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - }, - { - "name": "signature", - "type": { - "kind": "array", - "length": 64, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json deleted file mode 100644 index bfc257473d1..00000000000 --- a/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "name": "SchnorrSingleKeyAccount", - "functions": [ - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/9Xc12/aUBzFcZIm6d4le+8dG9tg05Wme++9Ehro3u3/H44CEsprTh6+V7LAL+h8GPYdv8v/XC5XyW23tvrRXj86Gs+b5507zrsaz1tb83y18RgFxTiulgrVMAo3gkJWSZMgTirFNEzDJE02C2kUVdM4LWWVrBRkYRxVw1qSRbVgu3W3vFawy7aXOXsgOXshOfsgOfshOQcgOQchOYcgOYchOUcgOUchOccgOcchOScgOSchOacgOachOWcgOWchOecgOechORcgORchOZcgOZchOVcgOQNIzhCSswDJGUFyxpCcCSRnEZKzBMmZQnJmkJzlPcrZviNnsLsWthnNZyHmdqP5HMS8z2g+DzF3GM0XIOZOo/kixNxlNK9CzN1G8yWIucdoXoOYe43myxBzn9F8BWLuN5qvQswDRvM1iHnQaL4OMQ8ZzTcg5mGj+SbEPGI034KYR43m2xDzmNF8B2IeN5rvQswTRvM9iHnSaL4PMU8ZzQ8g5mmj+SHEPGM0P4KYZ43mxxDznNH8BGKeN5qfQswLRvMziHnRaH4OMS8ZzS8g5mWj+SXEvGI0v4KYA6P5NcQcGs1vIOaC0fwWYo6M5ncQc2w0v4eYE6N5HWIuGs0bEHPJaK5AzKnR/AFizozmTYi5bDRXIeb9RnMNYj5gNH+EmA8azZ8g5kNG82eI+bDR/AViPmI0f4WYjxrN3yDmY0bzd4j5uNH8A2I+YTT/hJhPGs2/IOZTRvNviPm00fwHYj5jNP+FmPNG8z+jOd94neb/9GlPlPYIac+M9pBoPKjxkcYL6j+rP6n+lfobuv/qfqTrs65X+v3q+6zPN9/yXpYbj9oLp71h2iulvUPNvTTaa7FWP1SLr9p01Wqrdlm1vKptVa2nah9VC6jaONWKqXZKtUSqrVGtiWovVIugtXmtVWvtVmuZWtvTWpfWfrQWorUBzZVr7lhzqev1Q3NtmnvSXIzmJjRW19hVYzmNbdTXV99XfUH1jdRX0L1T9xJdW3Wt0W9P30V9NlvHjzLRIFEAAA==", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "aztec::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "flattened_args_hashes", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_selectors", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "flattened_targets", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - }, - { - "name": "owner", - "type": { - "kind": "array", - "length": 64, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "signature", - "type": { - "kind": "array", - "length": 64, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "partial_address", - "type": { - "kind": "field" - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ] -} diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr index 1c95f589640..0ca021ecbe4 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr @@ -4,6 +4,7 @@ mod storage; contract PrivateTokenAirdrop { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, utils::{increment, decrement, decrement_by_at_most}, @@ -149,7 +150,7 @@ contract PrivateTokenAirdrop { // Remove the claim note if it exists in the set. let note = ClaimNote::new(amount, secret); - storage.claims.assert_contains_note_and_remove(&mut context, note); + storage.claims.assert_contains_note_and_remove(note); // Send the value note. let balance = storage.balances.at(owner); diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr index f265b70a2b7..c1d86591252 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/storage.nr @@ -1,15 +1,8 @@ -use dep::aztec::state_vars::{ - map::Map, - set::Set -}; -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; -use crate::claim_note::{CLAIM_NOTE_LEN, ClaimNote, ClaimNoteMethods}; -use dep::std::option::Option; +use crate::claim_note::{ClaimNote, ClaimNoteMethods, CLAIM_NOTE_LEN}; use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::aztec::state_vars::{map::Map, set::Set}; +use dep::std::option::Option; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; struct Storage { balances: Map>, @@ -22,8 +15,15 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), - claims: Set::new(2, ClaimNoteMethods), + balances: Map::new( + private_context, + public_context, + 1, // Storage slot + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), + claims: Set::new(private_context, public_context, 2, ClaimNoteMethods), } } -} \ No newline at end of file +} From 248e17187df66172fb2599d2ac3c68b8bef64cd3 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:41:56 +0000 Subject: [PATCH 19/25] native token --- .../native_token_contract/src/main.nr | 3 +- .../native_token_contract/src/storage.nr | 80 +++++++++++++------ 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr index 1d39ae730db..2879027c1fb 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/main.nr @@ -7,6 +7,7 @@ mod storage; // - Add public self-burn function for users to burn their own tokens contract NativeToken { // Libs + use dep::std::option::Option; use dep::value_note::{ balance_utils, utils::{increment, decrement}, @@ -261,7 +262,7 @@ contract NativeToken { amount: Field, secretHash: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let public_balances = storage.public_balances; let pending_shields = storage.pending_shields; diff --git a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr index d9e956a3943..25cce9b8463 100644 --- a/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/native_token_contract/src/storage.nr @@ -1,30 +1,17 @@ -use dep::value_note::value_note::{ - ValueNote, - ValueNoteMethods, - VALUE_NOTE_LEN, -}; +use dep::value_note::value_note::{ValueNote, ValueNoteMethods, VALUE_NOTE_LEN}; -use dep::non_native::{ - transparent_note::{ - TransparentNote, - TransparentNoteMethods, - TRANSPARENT_NOTE_LEN, - }, +use dep::non_native::transparent_note::{ + TransparentNote, TransparentNoteMethods, TRANSPARENT_NOTE_LEN, }; +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::{ - state_vars::{ - map::Map, - set::Set, - public_state::PublicState, - }, + state_vars::{map::Map, public_state::PublicState, set::Set}, types::type_serialisation::field_serialisation::{ - FIELD_SERIALISED_LEN, - FieldSerialisationMethods, + FieldSerialisationMethods, FIELD_SERIALISED_LEN, }, }; use dep::std::option::Option; -use dep::aztec::context::{PrivateContext, PublicContext}; struct Storage { balances: Map>, @@ -40,11 +27,54 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - balances: Map::new(1, |s| Set::new(s, ValueNoteMethods)), - total_supply: PublicState::new(2, FieldSerialisationMethods), - pending_shields: Set::new(3, TransparentNoteMethods), - public_balances: Map::new(4, |s| PublicState::new(s, FieldSerialisationMethods)), - public_allowances: Map::new(5, |s1| Map::new(s1, |s2| PublicState::new(s2, FieldSerialisationMethods))) + balances: Map::new( + private_context, + public_context, + 1, // Storage slot + |private_context, public_context, slot| { + Set::new(private_context, public_context, slot, ValueNoteMethods) + }, + ), + total_supply: PublicState::new( + private_context, + public_context, + 2, + FieldSerialisationMethods, + ), + pending_shields: Set::new(private_context, public_context, 3, TransparentNoteMethods), + public_balances: Map::new( + private_context, + public_context, + 4, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + FieldSerialisationMethods, + ) + }, + ), + public_allowances: Map::new( + private_context, + public_context, + 5, + |private_context, public_context, s1| { + Map::new( + private_context, + public_context, + s1, + |private_context, public_context, s2| { + PublicState::new( + private_context, + public_context, + s2, + FieldSerialisationMethods, + ) + }, + ) + }, + ), } } -} \ No newline at end of file +} From 7eae3941b3b7990742a9bdb1d63120f73d78fe86 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 14:44:04 +0000 Subject: [PATCH 20/25] WIP --- .../src/abis/ecdsa_account_contract.json | 160 ++++++++++++++++++ .../src/abis/schnorr_account_contract.json | 148 ++++++++++++++++ .../schnorr_single_key_account_contract.json | 103 +++++++++++ 3 files changed, 411 insertions(+) create mode 100644 yarn-project/aztec.js/src/abis/ecdsa_account_contract.json create mode 100644 yarn-project/aztec.js/src/abis/schnorr_account_contract.json create mode 100644 yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json diff --git a/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json b/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json new file mode 100644 index 00000000000..f13166ec136 --- /dev/null +++ b/yarn-project/aztec.js/src/abis/ecdsa_account_contract.json @@ -0,0 +1,160 @@ +{ + "name": "EcdsaAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 5, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "aztec::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "flattened_args_hashes", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_selectors", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_targets", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + }, + { + "name": "signature", + "type": { + "kind": "array", + "length": 64, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} diff --git a/yarn-project/aztec.js/src/abis/schnorr_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_account_contract.json new file mode 100644 index 00000000000..a246acbeaae --- /dev/null +++ b/yarn-project/aztec.js/src/abis/schnorr_account_contract.json @@ -0,0 +1,148 @@ +{ + "name": "SchnorrAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 3, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "field" + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "field" + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "aztec::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "flattened_args_hashes", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_selectors", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_targets", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + }, + { + "name": "signature", + "type": { + "kind": "array", + "length": 64, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} diff --git a/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json new file mode 100644 index 00000000000..bfc257473d1 --- /dev/null +++ b/yarn-project/aztec.js/src/abis/schnorr_single_key_account_contract.json @@ -0,0 +1,103 @@ +{ + "name": "SchnorrSingleKeyAccount", + "functions": [ + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [], + "returnTypes": [], + "bytecode": "H4sIAAAAAAAA/9Xc12/aUBzFcZIm6d4le+8dG9tg05Wme++9Ehro3u3/H44CEsprTh6+V7LAL+h8GPYdv8v/XC5XyW23tvrRXj86Gs+b5507zrsaz1tb83y18RgFxTiulgrVMAo3gkJWSZMgTirFNEzDJE02C2kUVdM4LWWVrBRkYRxVw1qSRbVgu3W3vFawy7aXOXsgOXshOfsgOfshOQcgOQchOYcgOYchOUcgOUchOccgOcchOScgOSchOacgOachOWcgOWchOecgOechORcgORchOZcgOZchOVcgOQNIzhCSswDJGUFyxpCcCSRnEZKzBMmZQnJmkJzlPcrZviNnsLsWthnNZyHmdqP5HMS8z2g+DzF3GM0XIOZOo/kixNxlNK9CzN1G8yWIucdoXoOYe43myxBzn9F8BWLuN5qvQswDRvM1iHnQaL4OMQ8ZzTcg5mGj+SbEPGI034KYR43m2xDzmNF8B2IeN5rvQswTRvM9iHnSaL4PMU8ZzQ8g5mmj+SHEPGM0P4KYZ43mxxDznNH8BGKeN5qfQswLRvMziHnRaH4OMS8ZzS8g5mWj+SXEvGI0v4KYA6P5NcQcGs1vIOaC0fwWYo6M5ncQc2w0v4eYE6N5HWIuGs0bEHPJaK5AzKnR/AFizozmTYi5bDRXIeb9RnMNYj5gNH+EmA8azZ8g5kNG82eI+bDR/AViPmI0f4WYjxrN3yDmY0bzd4j5uNH8A2I+YTT/hJhPGs2/IOZTRvNviPm00fwHYj5jNP+FmPNG8z+jOd94neb/9GlPlPYIac+M9pBoPKjxkcYL6j+rP6n+lfobuv/qfqTrs65X+v3q+6zPN9/yXpYbj9oLp71h2iulvUPNvTTaa7FWP1SLr9p01Wqrdlm1vKptVa2nah9VC6jaONWKqXZKtUSqrVGtiWovVIugtXmtVWvtVmuZWtvTWpfWfrQWorUBzZVr7lhzqev1Q3NtmnvSXIzmJjRW19hVYzmNbdTXV99XfUH1jdRX0L1T9xJdW3Wt0W9P30V9NlvHjzLRIFEAAA==", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "aztec::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "flattened_args_hashes", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_selectors", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "flattened_targets", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + }, + { + "name": "owner", + "type": { + "kind": "array", + "length": 64, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + }, + { + "name": "signature", + "type": { + "kind": "array", + "length": 64, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + }, + { + "name": "partial_address", + "type": { + "kind": "field" + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ] +} From 3754c87732ff515b4c5f4cef5ff940b50518e774 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 15:00:59 +0000 Subject: [PATCH 21/25] cleanup --- .../src/contracts/escrow_contract/src/main.nr | 2 +- .../contracts/lending_contract/src/storage.nr | 84 ++++++++++++++----- .../src/main.nr | 21 ++--- .../private_token_contract/src/main.nr | 1 - .../noir-aztec/src/state_vars/public_state.nr | 2 +- 5 files changed, 71 insertions(+), 39 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr index f88c6ca08db..80559dd3635 100644 --- a/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/escrow_contract/src/main.nr @@ -37,7 +37,7 @@ contract Escrow { let storage = Storage::init(Option::some(&mut context), Option::none()); let mut note = AddressNote::new(owner, this); - storage.owners.insert( &mut note); + storage.owners.insert(&mut note); emit_encrypted_log( &mut context, this, diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr index 46043bcf142..c3c7d65bf46 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr @@ -1,15 +1,15 @@ +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::map::Map; use dep::aztec::state_vars::public_state::PublicState; -use dep::aztec::types::type_serialisation::TypeSerialisationInterface; use dep::aztec::types::type_serialisation::field_serialisation::FieldSerialisationMethods; use dep::aztec::types::type_serialisation::field_serialisation::FIELD_SERIALISED_LEN; +use dep::aztec::types::type_serialisation::TypeSerialisationInterface; use dep::std::option::Option; -use dep::aztec::context::{PrivateContext, PublicContext}; // Struct to be used to represent "totals". Generally, there should be one per asset. // It stores the global values that are shared among all users, such as an accumulator // and last time it was updated. -// In practice, it should also point to an oracle and have more fields related to +// In practice, it should also point to an oracle and have more fields related to // loan to value ratios and other things, but we did not have enough reads/writes for this. struct Asset { interest_accumulator: u120, @@ -32,11 +32,16 @@ fn deserialiseAsset(fields: [Field; ASSET_SERIALISED_LEN]) -> Asset { } fn serialiseAsset(asset: Asset) -> [Field; ASSET_SERIALISED_LEN] { - [asset.interest_accumulator as Field, asset.last_updated_ts as Field, asset.loan_to_value as Field, asset.oracle_address] + [ + asset.interest_accumulator as Field, + asset.last_updated_ts as Field, + asset.loan_to_value as Field, + asset.oracle_address, + ] } impl Asset { - fn serialise (self: Self) -> [Field; ASSET_SERIALISED_LEN] { + fn serialise(self: Self) -> [Field; ASSET_SERIALISED_LEN] { serialiseAsset(self) } } @@ -61,22 +66,57 @@ impl Storage { public_context: Option<&mut PublicContext>, ) -> Self { Storage { - collateral_asset: PublicState::new(private_context, - public_context,1, FieldSerialisationMethods), - stable_coin: PublicState::new(private_context, - public_context,2, FieldSerialisationMethods), - assets: Map::new(private_context, - public_context,3, |private_context, public_context, slot| PublicState::new( private_context, - public_context, - slot, AssetSerialisationMethods)), - collateral: Map::new(private_context, - public_context,4, |private_context, public_context, slot| PublicState::new( private_context, - public_context, - slot, FieldSerialisationMethods)), - static_debt: Map::new(private_context, - public_context,5, |private_context, public_context, slot| PublicState::new( private_context, - public_context, - slot, FieldSerialisationMethods)), + collateral_asset: PublicState::new( + private_context, + public_context, + 1, + FieldSerialisationMethods, + ), + stable_coin: PublicState::new( + private_context, + public_context, + 2, + FieldSerialisationMethods, + ), + assets: Map::new( + private_context, + public_context, + 3, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + AssetSerialisationMethods, + ) + }, + ), + collateral: Map::new( + private_context, + public_context, + 4, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + FieldSerialisationMethods, + ) + }, + ), + static_debt: Map::new( + private_context, + public_context, + 5, + |private_context, public_context, slot| { + PublicState::new( + private_context, + public_context, + slot, + FieldSerialisationMethods, + ) + }, + ), } } -} \ No newline at end of file +} diff --git a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr index 0ca021ecbe4..42a91044375 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_airdrop_contract/src/main.nr @@ -28,8 +28,7 @@ contract PrivateTokenAirdrop { initial_supply: Field, owner: Field ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -44,8 +43,7 @@ contract PrivateTokenAirdrop { amount: Field, owner: Field ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); // Insert new note to a set of user notes and emit the newly created encrypted note preimage via oracle call. let owner_balance = storage.balances.at(owner); @@ -59,8 +57,7 @@ contract PrivateTokenAirdrop { amount: Field, owner: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let msg_sender = context.msg_sender(); let this_address = context.this_address(); @@ -89,8 +86,7 @@ contract PrivateTokenAirdrop { amount: Field, recipient: Field, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender = context.msg_sender(); let sender_balance = storage.balances.at(sender); @@ -120,8 +116,7 @@ contract PrivateTokenAirdrop { amounts: [Field; 2], secrets: [Field; 2], ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); let sender = context.msg_sender(); // Pick from the set of sender's notes to spend amount. @@ -145,8 +140,7 @@ contract PrivateTokenAirdrop { secret: Field, owner: Field ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); // Remove the claim note if it exists in the set. let note = ClaimNote::new(amount, secret); @@ -167,8 +161,7 @@ contract PrivateTokenAirdrop { recipients: [Field; 3], spend_note_offset: u32, ) { - let storage = Storage::init(Option::some(&mut context), Option::none()); - + let storage = Storage::init(Option::some(&mut context), Option::none()); // Gets the set of sender's notes and picks 4 of those based on the offset. // Spends the first of those 4 notes. diff --git a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr index 4a366f295d2..6994cc800f2 100644 --- a/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/private_token_contract/src/main.nr @@ -74,7 +74,6 @@ contract PrivateToken { unconstrained fn getBalance( owner: Field, ) -> Field { - // context not available here let storage = Storage::init(Option::none(), Option::none()); // Get the set of notes owned by the user. diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr index 0f3b6351b10..6e09fca6fc8 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/public_state.nr @@ -11,7 +11,7 @@ struct PublicState { impl PublicState { fn new( - // Note: passing the contexts to new to have an interface compatible with Map. + // Note: Passing the contexts to new(...) just to have an interface compatible with a Map. _: Option<&mut PrivateContext>, _: Option<&mut PublicContext>, storage_slot: Field, From 66b9eb6cab476bb57730e92b3916f4534fef1a32 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 19:57:10 +0000 Subject: [PATCH 22/25] WIP --- .../docs_example_contract/src/actions.nr | 36 +++++----------- .../docs_example_contract/src/main.nr | 41 ++++++++++--------- .../docs_example_contract/src/storage.nr | 19 +++++---- .../noir-aztec/src/state_vars/singleton.nr | 20 ++++++--- 4 files changed, 58 insertions(+), 58 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr index 3438b3db518..f558b875aab 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr @@ -1,8 +1,5 @@ use dep::std::option::Option; use dep::aztec::constants_gen::{MAX_READ_REQUESTS_PER_CALL, MAX_NOTES_PER_PAGE}; -use dep::aztec::context::{ - PrivateContext, -}; use dep::aztec::note::{ note_getter_options::NoteGetterOptions, note_viewer_options::NoteViewerOptions, @@ -77,81 +74,73 @@ fn add_points_to_queen( // docs:start:state_vars-SingletonInit fn init_legendary_card( - context: &mut PrivateContext, state_var: Singleton, card: &mut CardNote, ) { - state_var.initialise(context, card); + state_var.initialise(card); } // docs:end:state_vars-SingletonInit // docs:start:state_vars-SingletonReplace fn update_legendary_card( - context: &mut PrivateContext, state_var: Singleton, card: &mut CardNote, ) { - state_var.replace(context, card); + state_var.replace(card); } // docs:end:state_vars-SingletonReplace // docs:start:state_vars-SingletonGet fn get_legendary_card( - context: &mut PrivateContext, state_var: Singleton, ) -> CardNote { - state_var.get_note(context) + state_var.get_note() } // docs:end:state_vars-SingletonGet // docs:start:state_vars-ImmutableSingletonInit fn init_game_rules( - context: &mut PrivateContext, state_var: ImmutableSingleton, rules: &mut RulesNote, ) { - state_var.initialise(context, rules); + state_var.initialise(rules); } // docs:end:state_vars-ImmutableSingletonInit // docs:start:state_vars-ImmutableSingletonGet fn is_valid_card( - context: &mut PrivateContext, state_var: ImmutableSingleton, card: CardNote, ) -> bool { - let rules = state_var.get_note(context); + let rules = state_var.get_note(); card.points >= rules.min_points & card.points <= rules.max_points } // docs:end:state_vars-ImmutableSingletonGet // docs:start:state_vars-SetInsert fn add_new_card( - context: &mut PrivateContext, state_var: Set, card: &mut CardNote, ) { - state_var.insert(context, card); + state_var.insert(card); } // docs:end:state_vars-SetInsert // docs:start:state_vars-SetRemove fn remove_card( - context: &mut PrivateContext, state_var: Set, card: CardNote, ) { - state_var.remove(context, card); + state_var.remove(card); } // docs:end:state_vars-SetRemove // docs:start:state_vars-SetGet fn get_cards( - context: &mut PrivateContext, state_var: Set, options: NoteGetterOptions, ) -> [Option; MAX_READ_REQUESTS_PER_CALL] { - state_var.get_notes(context, options) + state_var.get_notes(options) } // docs:end:state_vars-SetGet @@ -181,31 +170,28 @@ unconstrained fn get_total_points(state_var: Set, accou // docs:start:state_vars-SetContains fn assert_contains_card( - context: &mut PrivateContext, state_var: Set, card: CardNote, ) { - state_var.assert_contains_and_remove(context, card); + state_var.assert_contains_and_remove(card); } // docs:end:state_vars-SetContains // docs:start:state_vars-MapAtSingletonInit fn add_new_profile( - context: &mut PrivateContext, state_var: Map>, account: Field, profile: &mut ProfileNote, ) { - state_var.at(account).initialise(context, profile); + state_var.at(account).initialise(profile); } // docs:end:state_vars-MapAtSingletonInit // docs:start:state_vars-MapAtSingletonGet fn get_profile( - context: &mut PrivateContext, state_var: Map>, account: Field, ) -> ProfileNote { - state_var.at(account).get_note(context) + state_var.at(account).get_note() } // docs:end:state_vars-MapAtSingletonGet \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/main.nr index b29ed9b35a1..6bc752cd975 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/main.nr @@ -16,6 +16,7 @@ contract DocsExample { queen::Queen, rules_note::RulesNote, }; + use dep::std::option::Option; global REPLACE_QUEEN_FUNCTION_SELECTOR = 11111111; global GET_POINTS_OF_COMMON_CARD_FUNCTION_SELECTOR = 11111111; @@ -26,20 +27,20 @@ contract DocsExample { max_points: u8, legendary_card_secret: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let mut game_rules = RulesNote::new(min_points, max_points); - actions::init_game_rules(&mut context, storage.game_rules, &mut game_rules); + actions::init_game_rules(storage.game_rules, &mut game_rules); let mut legendary_card = CardNote::new(0, legendary_card_secret, 0); - actions::init_legendary_card(&mut context, storage.legendary_card, &mut legendary_card); + actions::init_legendary_card(storage.legendary_card, &mut legendary_card); } // docs:start:storage-init #[aztec(public)] fn lock() { // highlight-next-line:storage-init - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); storage.locked.write(true); } // docs:end:storage-init @@ -47,7 +48,7 @@ contract DocsExample { // docs:start:functions-OpenFunction #[aztec(public)] fn unlock() { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); actions::unlock(storage.locked); } // docs:end:functions-OpenFunction @@ -57,7 +58,7 @@ contract DocsExample { account: Field, points: u8, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let new_queen = Queen { account, points }; @@ -69,7 +70,7 @@ contract DocsExample { // docs:start:state_vars-PublicStateWriteBeforeCall #[aztec(public)] fn replace_queen_unsafe() { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::some(&mut context)); let account = context.msg_sender(); let points = actions::get_total_points(storage.cards, account, 0); @@ -88,11 +89,11 @@ contract DocsExample { // docs:start:functions-SecretFunction #[aztec(private)] fn add_common_cards(secrets: [Field; 4]) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); for i in 0..secrets.len() as u8 { let mut card = CardNote::new(0, secrets[i], 0); - actions::add_new_card(&mut context, storage.cards, &mut card); + actions::add_new_card(storage.cards, &mut card); } } // docs:end:functions-SecretFunction @@ -102,21 +103,21 @@ contract DocsExample { new_points: u8, new_secret: Field, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let owner = inputs.call_context.msg_sender; let mut updated_card = CardNote::new(new_points, new_secret, owner); - assert(actions::is_valid_card(&mut context, storage.game_rules, updated_card)); + assert(actions::is_valid_card(storage.game_rules, updated_card)); - actions::update_legendary_card(&mut context, storage.legendary_card, &mut updated_card); + actions::update_legendary_card(storage.legendary_card, &mut updated_card); } #[aztec(private)] fn become_queen() { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); - let legendary_card = actions::get_legendary_card(&mut context, storage.legendary_card); + let legendary_card = actions::get_legendary_card(storage.legendary_card); let owner = legendary_card.owner; let result = context.call_private_function( @@ -138,11 +139,11 @@ contract DocsExample { account: Field, offset: u32, ) { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let mut total_points = 0; let options = create_account_card_getter_options(account, offset); - let cards = actions::get_cards(&mut context, storage.cards, options); + let cards = actions::get_cards(storage.cards, options); for i in 0..cards.len() { if (cards[i].is_some()) { let card = cards[i].unwrap_unchecked(); @@ -157,21 +158,21 @@ contract DocsExample { // docs:start:state_vars-check_return_notes #[aztec(private)] fn discard_largest_card() { - let storage = Storage::init(); + let storage = Storage::init(Option::some(&mut context), Option::none()); let account = context.msg_sender(); let options = create_largest_account_card_getter_options(account); - let card = actions::get_cards(&mut context, storage.cards, options)[0].unwrap_unchecked(); + let card = actions::get_cards(storage.cards, options)[0].unwrap_unchecked(); // highlight-next-line:state_vars-check_return_notes assert(card.owner == account); - actions::remove_card(&mut context, storage.cards, card); + actions::remove_card(storage.cards, card); } // docs:end:state_vars-check_return_notes // docs:start:functions-UncontrainedFunction unconstrained fn get_total_points(account: Field) -> u8 { - let storage = Storage::init(); + let storage = Storage::init(Option::none(), Option::none()); actions::get_total_points(storage.cards, account, 0) } // docs:end:functions-UncontrainedFunction diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr index fc9ae590fd5..e0c7be63c02 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr @@ -5,6 +5,8 @@ use dep::aztec::state_vars::{ set::Set, singleton::Singleton, }; +use dep::aztec::context::{PrivateContext, PublicContext}; +use dep::std::option::Option; // docs:start:state_vars-PublicStateBoolImport use dep::aztec::types::type_serialisation::bool_serialisation::{ BOOL_SERIALISED_LEN, @@ -36,20 +38,23 @@ struct Storage { // docs:start:state_vars-Set // docs:start:state_vars-MapSingleton impl Storage { - fn init() -> Self { + fn init( + private_context: Option<&mut PrivateContext>, + public_context: Option<&mut PublicContext>, + ) -> Self { Storage { // highlight-next-line:state_vars-PublicState - locked: PublicState::new(1, BoolSerialisationMethods), + locked: PublicState::new(private_context, public_context, 1, BoolSerialisationMethods), // highlight-next-line:state_vars-PublicStateCustomStruct - queen: PublicState::new(2, QueenSerialisationMethods), + queen: PublicState::new(private_context, public_context, 2, QueenSerialisationMethods), // highlight-next-line:state_vars-ImmutableSingleton - game_rules: ImmutableSingleton::new(3, RulesNoteMethods), + game_rules: ImmutableSingleton::new(private_context, 3, RulesNoteMethods), // highlight-next-line:state_vars-Singleton - legendary_card: Singleton::new(4, CardNoteMethods), + legendary_card: Singleton::new(private_context, public_context, 4, CardNoteMethods), // highlight-next-line:state_vars-Set - cards: Set::new(5, CardNoteMethods), + cards: Set::new(private_context, public_context, 5, CardNoteMethods), // highlight-next-line:state_vars-MapSingleton - profiles: Map::new(6, |slot| Singleton::new(slot, ProfileNoteMethods)), + profiles: Map::new(private_context, public_context, 6, |private_context, public_context, slot| Singleton::new(private_context, public_context, slot, ProfileNoteMethods)), } } } diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr index e5039acd2d6..7f311cdf9ff 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr @@ -1,5 +1,9 @@ use dep::std::hash::pedersen_with_separator; -use crate::context::PrivateContext; +use crate::context::{ + PrivateContext, + PublicContext, +}; +use dep::std::option::Option; use crate::oracle; use crate::note::{ lifecycle::{ @@ -16,14 +20,15 @@ use crate::constants_gen::{ }; struct Singleton { + context: Option<&mut PrivateContext>, storage_slot: Field, note_interface: NoteInterface, } impl Singleton { - fn new(storage_slot: Field, note_interface: NoteInterface) -> Self { + fn new(context: Option<&mut PrivateContext>, _: Option<&mut PublicContext>, storage_slot: Field, note_interface: NoteInterface) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Singleton { storage_slot, note_interface } + Singleton { context, storage_slot, note_interface } } unconstrained fn is_initialised(self) -> bool { @@ -31,7 +36,8 @@ impl Singleton { oracle::notes::is_nullifier_emitted(nullifier) } - fn initialise(self, context: &mut PrivateContext, note: &mut Note) { + fn initialise(self, note: &mut Note) { + let context = self.context.unwrap(); // Nullify the storage slot. let nullifier = self.compute_initialisation_nullifier(); context.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT); @@ -43,7 +49,8 @@ impl Singleton { pedersen_with_separator([self.storage_slot], GENERATOR_INDEX__INITIALISATION_NULLIFIER)[0] } - fn replace(self, context: &mut PrivateContext, new_note: &mut Note) { + fn replace(self, new_note: &mut Note) { + let context = self.context.unwrap(); let prev_note = get_note(context, self.storage_slot, self.note_interface); // Nullify previous note. @@ -53,7 +60,8 @@ impl Singleton { create_note(context, self.storage_slot, new_note, self.note_interface); } - fn get_note(self, context: &mut PrivateContext) -> Note { + fn get_note(self) -> Note { + let context = self.context.unwrap(); let mut note = get_note(context, self.storage_slot, self.note_interface); // Nullify current note to make sure it's reading the latest note. From 4e71326e09b067f6c796189b81e2ec2459f6d71b Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 20:03:15 +0000 Subject: [PATCH 23/25] fix --- .../src/contracts/lending_contract/src/storage.nr | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr index 2b48f5e050a..43dc315851d 100644 --- a/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/lending_contract/src/storage.nr @@ -41,8 +41,7 @@ fn serialiseAsset(asset: Asset) -> [Field; ASSET_SERIALISED_LEN] { } impl Asset { -// TODO(Maddiaa): Rename all serialise -> serialize - fn serialise(self: Self) -> [Field; ASSET_SERIALISED_LEN] { + fn serialize(self: Self) -> [Field; ASSET_SERIALISED_LEN] { serialiseAsset(self) } } From ba53c9916187fdb2643534effba57e679286f5b5 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 20:10:14 +0000 Subject: [PATCH 24/25] formatting --- .../src/account_contract_interface.nr | 5 +- .../docs_example_contract/src/actions.nr | 73 +++++++------------ .../docs_example_contract/src/options.nr | 10 ++- .../docs_example_contract/src/storage.nr | 36 +++++---- .../noir-aztec/src/state_vars/singleton.nr | 41 ++++++----- 5 files changed, 77 insertions(+), 88 deletions(-) diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/account_contract_interface.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/account_contract_interface.nr index ca1b3b2d4a4..ab79a11c716 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/account_contract_interface.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/account_contract_interface.nr @@ -7,6 +7,5 @@ impl AccountContractInterface { AccountContractInterface { address } } - fn send_rewards(_self: Self, _rewards: u8) { - } -} \ No newline at end of file + fn send_rewards(_self: Self, _rewards: u8) {} +} diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr index f558b875aab..6bbb133c31f 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr @@ -1,19 +1,13 @@ -use dep::std::option::Option; -use dep::aztec::constants_gen::{MAX_READ_REQUESTS_PER_CALL, MAX_NOTES_PER_PAGE}; +use dep::aztec::constants_gen::{MAX_NOTES_PER_PAGE, MAX_READ_REQUESTS_PER_CALL}; use dep::aztec::note::{ - note_getter_options::NoteGetterOptions, - note_viewer_options::NoteViewerOptions, + note_getter_options::NoteGetterOptions, note_viewer_options::NoteViewerOptions, }; use dep::aztec::state_vars::{ - immutable_singleton::ImmutableSingleton, - map::Map, - public_state::PublicState, - set::Set, + immutable_singleton::ImmutableSingleton, map::Map, public_state::PublicState, set::Set, singleton::Singleton, }; -use dep::aztec::types::type_serialisation::bool_serialisation::{ - BOOL_SERIALISED_LEN, -}; +use dep::aztec::types::type_serialisation::bool_serialisation::BOOL_SERIALISED_LEN; +use dep::std::option::Option; use crate::types::{ card_note::{CardNote, CARD_NOTE_LEN}, @@ -47,25 +41,19 @@ fn get_current_queen(state_var: PublicState) -> Que fn can_replace_queen( state_var: PublicState, new_queen: Queen, - ) -> bool { +) -> bool { let current_queen = get_current_queen(state_var); new_queen.points > current_queen.points } // docs:start:state_vars-PublicStateWriteCustom -fn replace_queen( - state_var: PublicState, - new_queen: Queen, -) { +fn replace_queen(state_var: PublicState, new_queen: Queen) { state_var.write(new_queen); } // docs:end:state_vars-PublicStateWriteCustom // docs:start:state_vars-PublicStateReadWriteCustom -fn add_points_to_queen( - state_var: PublicState, - new_points: u8, -) { +fn add_points_to_queen(state_var: PublicState, new_points: u8) { let mut queen = state_var.read(); queen.points += new_points; state_var.write(queen); @@ -73,27 +61,19 @@ fn add_points_to_queen( // docs:end:state_vars-PublicStateReadWriteCustom // docs:start:state_vars-SingletonInit -fn init_legendary_card( - state_var: Singleton, - card: &mut CardNote, -) { +fn init_legendary_card(state_var: Singleton, card: &mut CardNote) { state_var.initialise(card); } // docs:end:state_vars-SingletonInit // docs:start:state_vars-SingletonReplace -fn update_legendary_card( - state_var: Singleton, - card: &mut CardNote, -) { +fn update_legendary_card(state_var: Singleton, card: &mut CardNote) { state_var.replace(card); } // docs:end:state_vars-SingletonReplace // docs:start:state_vars-SingletonGet -fn get_legendary_card( - state_var: Singleton, -) -> CardNote { +fn get_legendary_card(state_var: Singleton) -> CardNote { state_var.get_note() } // docs:end:state_vars-SingletonGet @@ -108,29 +88,20 @@ fn init_game_rules( // docs:end:state_vars-ImmutableSingletonInit // docs:start:state_vars-ImmutableSingletonGet -fn is_valid_card( - state_var: ImmutableSingleton, - card: CardNote, -) -> bool { +fn is_valid_card(state_var: ImmutableSingleton, card: CardNote) -> bool { let rules = state_var.get_note(); - card.points >= rules.min_points & card.points <= rules.max_points + // card.points >= rules.min_points & card.points <= rules.max_points } // docs:end:state_vars-ImmutableSingletonGet // docs:start:state_vars-SetInsert -fn add_new_card( - state_var: Set, - card: &mut CardNote, - ) { +fn add_new_card(state_var: Set, card: &mut CardNote) { state_var.insert(card); } // docs:end:state_vars-SetInsert // docs:start:state_vars-SetRemove -fn remove_card( - state_var: Set, - card: CardNote, -) { +fn remove_card(state_var: Set, card: CardNote) { state_var.remove(card); } // docs:end:state_vars-SetRemove @@ -145,7 +116,7 @@ fn get_cards( // docs:end:state_vars-SetGet // docs:start:state_vars-SetView -unconstrained fn view_cards( +unconstrained fn view_cards( state_var: Set, options: NoteViewerOptions, ) -> [Option; MAX_NOTES_PER_PAGE] { @@ -153,8 +124,14 @@ unconstrained fn view_cards( } // docs:end:state_vars-SetView -unconstrained fn get_total_points(state_var: Set, account: Field, offset: u32) -> u8 { - let options = NoteViewerOptions::new().select(2, account).set_offset(offset); +unconstrained fn get_total_points( + state_var: Set, + account: Field, + offset: u32, +) -> u8 { + let options = NoteViewerOptions::new() + .select(2, account) + .set_offset(offset); let mut total_points = 0; let notes = view_cards(state_var, options); for i in 0..notes.len() { @@ -194,4 +171,4 @@ fn get_profile( ) -> ProfileNote { state_var.at(account).get_note() } -// docs:end:state_vars-MapAtSingletonGet \ No newline at end of file +// docs:end:state_vars-MapAtSingletonGet diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/options.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/options.nr index 7019f58016b..56751913f0c 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/options.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/options.nr @@ -1,7 +1,7 @@ -use dep::std::option::Option; +use crate::types::card_note::{CardNote, CARD_NOTE_LEN}; use dep::aztec::constants_gen::MAX_READ_REQUESTS_PER_CALL; use dep::aztec::note::note_getter_options::{NoteGetterOptions, Sort, SortOrder}; -use crate::types::card_note::{CardNote, CARD_NOTE_LEN}; +use dep::std::option::Option; // docs:start:state_vars-NoteGetterOptionsSelectSortOffset fn create_account_card_getter_options( @@ -57,10 +57,12 @@ fn create_account_cards_with_min_points_getter_options( // docs:end:state_vars-NoteGetterOptionsFilter // docs:start:state_vars-NoteGetterOptionsPickOne -fn create_largest_account_card_getter_options(account_address: Field) -> NoteGetterOptions { +fn create_largest_account_card_getter_options( + account_address: Field, +) -> NoteGetterOptions { NoteGetterOptions::new() .select(2, account_address) .sort(0, SortOrder.DESC) .set_limit(1) } -// docs:end:state_vars-NoteGetterOptionsPickOne \ No newline at end of file +// docs:end:state_vars-NoteGetterOptionsPickOne diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr index e0c7be63c02..b496b123225 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/storage.nr @@ -1,24 +1,20 @@ +use dep::aztec::context::{PrivateContext, PublicContext}; use dep::aztec::state_vars::{ - immutable_singleton::ImmutableSingleton, - map::Map, - public_state::PublicState, - set::Set, + immutable_singleton::ImmutableSingleton, map::Map, public_state::PublicState, set::Set, singleton::Singleton, }; -use dep::aztec::context::{PrivateContext, PublicContext}; use dep::std::option::Option; // docs:start:state_vars-PublicStateBoolImport use dep::aztec::types::type_serialisation::bool_serialisation::{ - BOOL_SERIALISED_LEN, - BoolSerialisationMethods, + BoolSerialisationMethods, BOOL_SERIALISED_LEN, }; // docs:end:state_vars-PublicStateBoolImport use crate::types::{ - card_note::{CardNote, CARD_NOTE_LEN, CardNoteMethods}, - profile_note::{ProfileNote, PROFILE_NOTE_LEN, ProfileNoteMethods}, - queen::{Queen, QUEEN_SERIALISED_LEN, QueenSerialisationMethods}, - rules_note::{RulesNote, RULES_NOTE_LEN, RulesNoteMethods}, + card_note::{CardNote, CardNoteMethods, CARD_NOTE_LEN}, + profile_note::{ProfileNote, ProfileNoteMethods, PROFILE_NOTE_LEN}, + queen::{Queen, QueenSerialisationMethods, QUEEN_SERIALISED_LEN}, + rules_note::{RulesNote, RulesNoteMethods, RULES_NOTE_LEN}, }; // docs:start:storage-declaration @@ -46,7 +42,12 @@ impl Storage { // highlight-next-line:state_vars-PublicState locked: PublicState::new(private_context, public_context, 1, BoolSerialisationMethods), // highlight-next-line:state_vars-PublicStateCustomStruct - queen: PublicState::new(private_context, public_context, 2, QueenSerialisationMethods), + queen: PublicState::new( + private_context, + public_context, + 2, + QueenSerialisationMethods, + ), // highlight-next-line:state_vars-ImmutableSingleton game_rules: ImmutableSingleton::new(private_context, 3, RulesNoteMethods), // highlight-next-line:state_vars-Singleton @@ -54,7 +55,14 @@ impl Storage { // highlight-next-line:state_vars-Set cards: Set::new(private_context, public_context, 5, CardNoteMethods), // highlight-next-line:state_vars-MapSingleton - profiles: Map::new(private_context, public_context, 6, |private_context, public_context, slot| Singleton::new(private_context, public_context, slot, ProfileNoteMethods)), + profiles: Map::new( + private_context, + public_context, + 6, + |private_context, public_context, slot| { + Singleton::new(private_context, public_context, slot, ProfileNoteMethods) + }, + ), } } } @@ -64,4 +72,4 @@ impl Storage { // docs:end:state_vars-ImmutableSingleton // docs:end:state_vars-Set // docs:end:state_vars-MapSingleton -// docs:end:storage-declaration \ No newline at end of file +// docs:end:storage-declaration diff --git a/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr b/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr index 7f311cdf9ff..561a5740c94 100644 --- a/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr +++ b/yarn-project/noir-libs/noir-aztec/src/state_vars/singleton.nr @@ -1,23 +1,14 @@ -use dep::std::hash::pedersen_with_separator; -use crate::context::{ - PrivateContext, - PublicContext, -}; -use dep::std::option::Option; -use crate::oracle; +use crate::constants_gen::{EMPTY_NULLIFIED_COMMITMENT, GENERATOR_INDEX__INITIALISATION_NULLIFIER}; +use crate::context::{PrivateContext, PublicContext}; use crate::note::{ - lifecycle::{ - create_note, - destroy_note, - }, + lifecycle::{create_note, destroy_note}, note_getter::{get_note, view_notes}, note_interface::NoteInterface, note_viewer_options::NoteViewerOptions, }; -use crate::constants_gen::{ - GENERATOR_INDEX__INITIALISATION_NULLIFIER, - EMPTY_NULLIFIED_COMMITMENT, -}; +use crate::oracle; +use dep::std::hash::pedersen_with_separator; +use dep::std::option::Option; struct Singleton { context: Option<&mut PrivateContext>, @@ -26,9 +17,18 @@ struct Singleton { } impl Singleton { - fn new(context: Option<&mut PrivateContext>, _: Option<&mut PublicContext>, storage_slot: Field, note_interface: NoteInterface) -> Self { + fn new( + context: Option<&mut PrivateContext>, + _: Option<&mut PublicContext>, + storage_slot: Field, + note_interface: NoteInterface, + ) -> Self { assert(storage_slot != 0); // Storage slot 0 not allowed. Storage slots must start from 1. - Singleton { context, storage_slot, note_interface } + Singleton { + context, + storage_slot, + note_interface, + } } unconstrained fn is_initialised(self) -> bool { @@ -46,7 +46,10 @@ impl Singleton { } fn compute_initialisation_nullifier(self) -> Field { - pedersen_with_separator([self.storage_slot], GENERATOR_INDEX__INITIALISATION_NULLIFIER)[0] + pedersen_with_separator( + [self.storage_slot], + GENERATOR_INDEX__INITIALISATION_NULLIFIER, + )[0] } fn replace(self, new_note: &mut Note) { @@ -78,4 +81,4 @@ impl Singleton { let options = NoteViewerOptions::new().set_limit(1); view_notes(self.storage_slot, self.note_interface, options)[0].unwrap() } -} \ No newline at end of file +} From f8edcbfc61c97c31c0abd01385d59c9f9cef3f67 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 1 Sep 2023 20:12:57 +0000 Subject: [PATCH 25/25] fix --- .../src/contracts/docs_example_contract/src/actions.nr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr index 6bbb133c31f..ff8e77a10b6 100644 --- a/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr +++ b/yarn-project/noir-contracts/src/contracts/docs_example_contract/src/actions.nr @@ -90,7 +90,7 @@ fn init_game_rules( // docs:start:state_vars-ImmutableSingletonGet fn is_valid_card(state_var: ImmutableSingleton, card: CardNote) -> bool { let rules = state_var.get_note(); - // card.points >= rules.min_points & card.points <= rules.max_points + card.points >= rules.min_points & card.points <= rules.max_points } // docs:end:state_vars-ImmutableSingletonGet