From e692b325914766987432aac9cb56a2123b0de722 Mon Sep 17 00:00:00 2001 From: LHerskind Date: Mon, 10 Jun 2024 22:44:19 +0000 Subject: [PATCH] refactor: add note emission wrapper --- .../aztec-nr/aztec/src/encrypted_logs.nr | 1 + .../encrypted_logs/encrypted_note_emission.nr | 56 +++++++++++++++++++ noir-projects/aztec-nr/aztec/src/note.nr | 1 + .../aztec-nr/aztec/src/note/lifecycle.nr | 7 ++- .../aztec-nr/aztec/src/note/note_emission.nr | 16 ++++++ .../aztec/src/state_vars/private_immutable.nr | 10 ++-- .../aztec/src/state_vars/private_mutable.nr | 39 ++++--------- .../src/state_vars/private_mutable/test.nr | 3 +- .../aztec/src/state_vars/private_set.nr | 6 +- .../aztec-nr/value-note/src/utils.nr | 5 +- .../app_subscription_contract/src/main.nr | 17 ++---- .../contracts/card_game_contract/src/cards.nr | 5 +- .../contracts/child_contract/src/main.nr | 7 +-- .../crowdfunding_contract/src/main.nr | 5 +- .../delegated_on_contract/src/main.nr | 5 +- .../docs_example_contract/src/main.nr | 26 +++------ .../ecdsa_account_contract/src/main.nr | 5 +- .../contracts/escrow_contract/src/main.nr | 5 +- .../inclusion_proofs_contract/src/main.nr | 5 +- .../pending_note_hashes_contract/src/main.nr | 34 ++++------- .../schnorr_account_contract/src/main.nr | 5 +- .../static_child_contract/src/main.nr | 11 ++-- .../contracts/test_contract/src/main.nr | 23 ++------ .../token_blacklist_contract/src/main.nr | 14 +++-- .../src/types/balances_map.nr | 15 ++--- .../contracts/token_contract/src/main.nr | 21 ++++--- .../contracts/token_contract/src/types.nr | 1 - .../token_contract/src/types/balances_map.nr | 20 ++----- .../token_contract/src/types/emission.nr | 45 --------------- .../token_contract/src/types/token_note.nr | 7 +-- 30 files changed, 182 insertions(+), 238 deletions(-) create mode 100644 noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr create mode 100644 noir-projects/aztec-nr/aztec/src/note/note_emission.nr delete mode 100644 noir-projects/noir-contracts/contracts/token_contract/src/types/emission.nr diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs.nr index 2d2fad296f56..a8d92e002f6f 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs.nr @@ -2,3 +2,4 @@ mod header; mod incoming_body; mod outgoing_body; mod payload; +mod encrypted_note_emission; \ No newline at end of file diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr new file mode 100644 index 000000000000..738edf18edb2 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr @@ -0,0 +1,56 @@ +use crate::{ + context::PrivateContext, note::{note_emission::NoteEmission, note_interface::NoteInterface}, + encrypted_logs::payload::compute_encrypted_note_log +}; +use dep::protocol_types::{ + address::AztecAddress, grumpkin_point::GrumpkinPoint, abis::note_hash::NoteHash, + constants::MAX_NEW_NOTE_HASHES_PER_CALL, utils::arrays::find_index +}; + +fn emit_with_keys( + context: &mut PrivateContext, + storage_slot: Field, + note: Note, + ovpk: GrumpkinPoint, + ivpk: GrumpkinPoint +) where Note: NoteInterface { + let note_hash_counter = note.get_header().note_hash_counter; + + let note_exists_index = find_index( + context.new_note_hashes.storage, + |n: NoteHash| n.counter == note_hash_counter + ); + assert( + note_exists_index as u32 != MAX_NEW_NOTE_HASHES_PER_CALL, "Can only emit a note log for an existing note." + ); + + let contract_address: AztecAddress = context.this_address(); + let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); + + let encrypted_log: [u8; M] = compute_encrypted_note_log(contract_address, storage_slot, ovsk_app, ovpk, ivpk, note); + + context.emit_raw_note_log(note_hash_counter, encrypted_log); +} + +pub fn with_az_enc( + context: &mut PrivateContext, + ov: AztecAddress, + iv: AztecAddress +) -> fn[(&mut PrivateContext, AztecAddress, AztecAddress)](NoteEmission) -> () where Note: NoteInterface { + | e: NoteEmission | { + let header = context.get_header(); + let ovpk = header.get_ovpk_m(context, ov); + let ivpk = header.get_ivpk_m(context, iv); + emit_with_keys(context, e.storage_slot, e.note, ovpk, ivpk); + } +} + +pub fn with_az_enc_with_keys( + context: &mut PrivateContext, + ovpk: GrumpkinPoint, + ivpk: GrumpkinPoint +) -> fn[(&mut PrivateContext, GrumpkinPoint, GrumpkinPoint)](NoteEmission) -> () where Note: NoteInterface { + | e: NoteEmission | { + emit_with_keys(context, e.storage_slot, e.note, ovpk, ivpk); + } +} diff --git a/noir-projects/aztec-nr/aztec/src/note.nr b/noir-projects/aztec-nr/aztec/src/note.nr index 6479366face8..644450efc4f8 100644 --- a/noir-projects/aztec-nr/aztec/src/note.nr +++ b/noir-projects/aztec-nr/aztec/src/note.nr @@ -6,3 +6,4 @@ mod note_header; mod note_interface; mod note_viewer_options; mod utils; +mod note_emission; \ No newline at end of file diff --git a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr index 7cf4b727f88c..0915fd23b66b 100644 --- a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr +++ b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr @@ -2,7 +2,8 @@ use dep::protocol_types::grumpkin_point::GrumpkinPoint; use crate::context::{PrivateContext, PublicContext}; use crate::note::{ note_header::NoteHeader, note_interface::NoteInterface, - utils::{compute_note_hash_for_insertion, compute_note_hash_for_consumption} + utils::{compute_note_hash_for_insertion, compute_note_hash_for_consumption}, + note_emission::NoteEmission }; use crate::oracle::notes::{notify_created_note, notify_nullified_note}; @@ -10,7 +11,7 @@ pub fn create_note( context: &mut PrivateContext, storage_slot: Field, note: &mut Note -) where Note: NoteInterface { +) -> NoteEmission where Note: NoteInterface { let contract_address = (*context).this_address(); let note_hash_counter = context.side_effect_counter; @@ -34,7 +35,7 @@ pub fn create_note( context.push_new_note_hash(inner_note_hash); - // Note::broadcast(*note, context, storage_slot, ovpk_m, ivpk_m); + NoteEmission::new(storage_slot, *note) } pub fn create_note_hash_from_public( diff --git a/noir-projects/aztec-nr/aztec/src/note/note_emission.nr b/noir-projects/aztec-nr/aztec/src/note/note_emission.nr new file mode 100644 index 000000000000..5ac684ecff12 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/note/note_emission.nr @@ -0,0 +1,16 @@ +struct NoteEmission { + storage_slot: Field, + note: Note +} + +impl NoteEmission { + pub fn new(storage_slot: Field, note: Note) -> Self { + Self { storage_slot, note } + } + + pub fn emit(self, _emit: fn[Env](Self) -> ()) { + _emit(self) + } + + pub fn discard(self) {} +} diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr index 967df14e52f0..e6c01bd32125 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_immutable.nr @@ -6,7 +6,7 @@ use dep::protocol_types::{ use crate::context::{PrivateContext, UnconstrainedContext}; use crate::note::{ lifecycle::create_note, note_getter::{get_note, view_notes}, note_interface::NoteInterface, - note_viewer_options::NoteViewerOptions + note_viewer_options::NoteViewerOptions, note_emission::NoteEmission }; use crate::oracle::notes::check_nullifier_exists; use crate::state_vars::storage::Storage; @@ -46,15 +46,13 @@ impl PrivateImmutable { // docs:start:initialize pub fn initialize( self, - note: &mut Note, - ovpk_m: GrumpkinPoint, - ivpk_m: GrumpkinPoint - ) where Note: NoteInterface { + note: &mut Note + ) -> NoteEmission where Note: NoteInterface { // Nullify the storage slot. let nullifier = self.compute_initialization_nullifier(); self.context.push_new_nullifier(nullifier, 0); - create_note(self.context, self.storage_slot, note, ovpk_m, ivpk_m); + create_note(self.context, self.storage_slot, note) } // docs:end:initialize diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr index b7e37162a966..1a66e07692cb 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr @@ -6,7 +6,7 @@ use dep::protocol_types::{ use crate::context::{PrivateContext, UnconstrainedContext}; use crate::note::{ lifecycle::{create_note, destroy_note}, note_getter::{get_note, view_notes}, - note_interface::NoteInterface, note_viewer_options::NoteViewerOptions + note_interface::NoteInterface, note_viewer_options::NoteViewerOptions, note_emission::NoteEmission }; use crate::oracle::notes::check_nullifier_exists; use crate::state_vars::storage::Storage; @@ -50,41 +50,32 @@ impl PrivateMutable { // docs:start:initialize pub fn initialize( self, - note: &mut Note, - ovpk_m: GrumpkinPoint, - ivpk_m: GrumpkinPoint - ) where Note: NoteInterface { + note: &mut Note + ) -> NoteEmission where Note: NoteInterface { // Nullify the storage slot. let nullifier = self.compute_initialization_nullifier(); self.context.push_new_nullifier(nullifier, 0); - create_note(self.context, self.storage_slot, note, ovpk_m, ivpk_m); + create_note(self.context, self.storage_slot, note) } // docs:end:initialize // docs:start:replace pub fn replace( self, - new_note: &mut Note, - ovpk_m: GrumpkinPoint, - ivpk_m: GrumpkinPoint - ) where Note: NoteInterface { + new_note: &mut Note + ) -> NoteEmission where Note: NoteInterface { let prev_note: Note = get_note(self.context, self.storage_slot); // Nullify previous note. destroy_note(self.context, prev_note); // Add replacement note. - create_note(self.context, self.storage_slot, new_note, ovpk_m, ivpk_m); + create_note(self.context, self.storage_slot, new_note) } // docs:end:replace - pub fn initialize_or_replace( - self, - note: &mut Note, - ovpk_m: GrumpkinPoint, - ivpk_m: GrumpkinPoint - ) where Note: NoteInterface { + pub fn initialize_or_replace(self, note: &mut Note) -> NoteEmission where Note: NoteInterface { let is_initialized = check_nullifier_exists(self.compute_initialization_nullifier()); // check_nullifier_exists() is an unconstrained function - we can constrain a true value by providing an @@ -98,18 +89,14 @@ impl PrivateMutable { // This means that an honest oracle will assist the prover to produce a valid proof, while a malicious oracle // (i.e. one that returns an incorrect value for is_initialized) will simply fail to produce a proof. if (!is_initialized) { - self.initialize(note, ovpk_m, ivpk_m); + self.initialize(note) } else { - self.replace(note, ovpk_m, ivpk_m) + self.replace(note) } } // docs:start:get_note - pub fn get_note( - self, - ovpk_m: GrumpkinPoint, - ivpk_m: GrumpkinPoint - ) -> Note where Note: NoteInterface { + pub fn get_note(self) -> NoteEmission where Note: NoteInterface { let mut note = get_note(self.context, self.storage_slot); // Nullify current note to make sure it's reading the latest note. @@ -117,9 +104,7 @@ impl PrivateMutable { // Add the same note again. // Because a nonce is added to every note in the kernel, its nullifier will be different. - create_note(self.context, self.storage_slot, &mut note, ovpk_m, ivpk_m); - - note + create_note(self.context, self.storage_slot, &mut note) } // docs:end:get_note } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr index f0272af161f1..992dca5512bb 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable/test.nr @@ -2,6 +2,7 @@ use dep::protocol_types::{address::AztecAddress, grumpkin_point::GrumpkinPoint}; use crate::{context::PrivateContext, state_vars::private_mutable::PrivateMutable}; use crate::test::{mocks::mock_note::MockNote, helpers::context_builder::ContextBuilder}; use dep::std::{unsafe::zeroed, test::OracleMock}; +use crate::encrypted_logs::encrypted_note_emission::with_az_enc_with_keys; global contract_address = AztecAddress::from_field(13); global storage_slot = 17; @@ -27,7 +28,7 @@ fn test_initialize_or_replace_without_nullifier() { let mut note = MockNote::new(value).contract_address(contract_address).storage_slot(storage_slot).build(); OracleMock::mock("checkNullifierExists").returns(0); - state_var.initialize_or_replace(&mut note, ovpk_m, ivpk_m); + state_var.initialize_or_replace(&mut note).emit(with_az_enc_with_keys(state_var.context, ovpk_m, ivpk_m)); // Since we reported there was no nullifier, we should initialize and see the following side-effects: // - a new note being created diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr index cf7c3e3395d0..5e7a6d01c7b5 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_set.nr @@ -7,7 +7,7 @@ use crate::note::{ constants::MAX_NOTES_PER_PAGE, lifecycle::{create_note, create_note_hash_from_public, destroy_note}, note_getter::{get_notes, view_notes}, note_getter_options::NoteGetterOptions, note_header::NoteHeader, note_interface::NoteInterface, note_viewer_options::NoteViewerOptions, - utils::compute_note_hash_for_read_request + utils::compute_note_hash_for_read_request, note_emission::NoteEmission }; use crate::state_vars::storage::Storage; @@ -39,8 +39,8 @@ impl PrivateSet { impl PrivateSet { // docs:start:insert - pub fn insert(self, note: &mut Note) where Note: NoteInterface { - create_note(self.context, self.storage_slot, note); + pub fn insert(self, note: &mut Note) -> NoteEmission where Note: NoteInterface { + create_note(self.context, self.storage_slot, note) } // docs:end:insert diff --git a/noir-projects/aztec-nr/value-note/src/utils.nr b/noir-projects/aztec-nr/value-note/src/utils.nr index 8c3de1814c58..93abbab5de9d 100644 --- a/noir-projects/aztec-nr/value-note/src/utils.nr +++ b/noir-projects/aztec-nr/value-note/src/utils.nr @@ -1,6 +1,7 @@ use dep::aztec::prelude::{AztecAddress, PrivateContext, PrivateSet, NoteGetterOptions}; use dep::aztec::note::note_getter_options::SortOrder; use dep::aztec::protocol_types::grumpkin_point::GrumpkinPoint; +use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use crate::{filter::filter_notes_min_sum, value_note::{ValueNote, VALUE_NOTE_LEN, VALUE_NOTE_BYTES_LEN}}; // Sort the note values (0th field) in descending order. @@ -19,12 +20,10 @@ pub fn increment( ) { let header = balance.context.get_header(); let recipient_npk_m_hash = header.get_npk_m_hash(balance.context, recipient); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(balance.context, outgoing_viewer); - let recipient_ivpk_m = header.get_ivpk_m(balance.context, recipient); let mut note = ValueNote::new(amount, recipient_npk_m_hash); // Insert the new note to the owner's set of notes and emit the log if value is non-zero. - balance.insert(&mut note, outgoing_viewer_ovpk_m, recipient_ivpk_m); + balance.insert(&mut note).emit(with_az_enc(balance.context, outgoing_viewer, recipient)); } // Find some of the `owner`'s notes whose values add up to the `amount`. diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr index f3fca6cfb155..b26feb591578 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr @@ -9,6 +9,7 @@ contract AppSubscription { AztecAddress, FunctionSelector, PrivateContext, NoteHeader, Map, PrivateMutable, PublicMutable, SharedImmutable }, + encrypted_logs::encrypted_note_emission::with_az_enc, protocol_types::{traits::is_empty, grumpkin_point::GrumpkinPoint} }, authwit::{account::AccountActions, auth_witness::get_auth_witness, auth::assert_current_call_valid_authwit}, @@ -37,18 +38,14 @@ contract AppSubscription { assert(context.msg_sender().to_field() == 0); assert_current_call_valid_authwit(&mut context, user_address); - let header = context.get_header(); - // We are emitting both the outgoing and the incoming logs to the subscriber here because passing a separate - // outgoing_viewer arg to entrypoint function is impractical and the outgoing are not so valuable here. - let subscriber_ovpk_m = header.get_ovpk_m(&mut context, user_address); - let subscriber_ivpk_m = header.get_ivpk_m(&mut context, user_address); - - let mut note = storage.subscriptions.at(user_address).get_note(subscriber_ovpk_m, subscriber_ivpk_m); + let mut note = storage.subscriptions.at(user_address).get_note().note; assert(note.remaining_txs as u64 > 0, "you're out of txs"); note.remaining_txs -= 1; - storage.subscriptions.at(user_address).replace(&mut note, subscriber_ovpk_m, subscriber_ivpk_m); + // We are emitting both the outgoing and the incoming logs to the subscriber here because passing a separate + // outgoing_viewer arg to entrypoint function is impractical and the outgoing are not so valuable here. + storage.subscriptions.at(user_address).replace(&mut note).emit(with_az_enc(&mut context, user_address, user_address)); context.set_as_fee_payer(); @@ -117,11 +114,9 @@ contract AppSubscription { AppSubscription::at(context.this_address()).assert_block_number(expiry_block_number).enqueue_view(&mut context); let header = context.get_header(); let subscriber_npk_m_hash = header.get_npk_m_hash(&mut context, subscriber_address); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let subscriber_ivpk_m = header.get_ivpk_m(&mut context, subscriber_address); let mut subscription_note = SubscriptionNote::new(subscriber_npk_m_hash, expiry_block_number, tx_count); - storage.subscriptions.at(subscriber_address).initialize_or_replace(&mut subscription_note, msg_sender_ovpk_m, subscriber_ivpk_m); + storage.subscriptions.at(subscriber_address).initialize_or_replace(&mut subscription_note).emit(with_az_enc(&mut context, context.msg_sender(), subscriber_address)); } unconstrained fn is_initialized(subscriber_address: AztecAddress) -> pub bool { diff --git a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr index d10ca9e1739f..7319519bb992 100644 --- a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr +++ b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr @@ -6,7 +6,8 @@ use dep::aztec::{ traits::{ToField, Serialize, FromField}, grumpkin_point::GrumpkinPoint, constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL }, - note::note_getter::view_notes, state_vars::PrivateSet, note::constants::MAX_NOTES_PER_PAGE + encrypted_logs::encrypted_note_emission::with_az_enc_with_keys, note::note_getter::view_notes, + state_vars::PrivateSet, note::constants::MAX_NOTES_PER_PAGE }; use dep::std; use dep::std::{option::Option}; @@ -113,7 +114,7 @@ impl Deck<&mut PrivateContext> { let mut inserted_cards = &[]; for card in cards { let mut card_note = CardNote::from_card(card, owner_npk_m_hash); - self.set.insert(&mut card_note.note, msg_sender_ovpk_m, owner_ivpk_m); + self.set.insert(&mut card_note.note).emit(with_az_enc_with_keys(self.set.context, msg_sender_ovpk_m, owner_ivpk_m)); inserted_cards = inserted_cards.push_back(card_note); } diff --git a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr index 8542d7a0ffd0..ae26aeb997cc 100644 --- a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr @@ -5,7 +5,8 @@ contract Child { use dep::aztec::{ context::gas::GasOpts, protocol_types::{abis::call_context::CallContext, grumpkin_point::GrumpkinPoint}, - note::{note_getter_options::NoteGetterOptions, note_header::NoteHeader} + note::{note_getter_options::NoteGetterOptions, note_header::NoteHeader}, + encrypted_logs::encrypted_note_emission::with_az_enc }; use dep::value_note::value_note::ValueNote; @@ -53,11 +54,9 @@ contract Child { fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_map_with_private_values.at(owner).insert(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + storage.a_map_with_private_values.at(owner).insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); new_value } diff --git a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr index 3daa552c1009..efc9f49bb080 100644 --- a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr @@ -8,6 +8,7 @@ contract Crowdfunding { abis::function_selector::FunctionSelector, address::AztecAddress, traits::Serialize, grumpkin_point::GrumpkinPoint }, + encrypted_logs::encrypted_note_emission::with_az_enc, state_vars::{PrivateSet, PublicImmutable, SharedImmutable} }; use dep::value_note::value_note::ValueNote; @@ -85,10 +86,8 @@ contract Crowdfunding { // 3) Create a value note for the donor so that he can later on claim a rewards token in the Claim // contract by proving that the hash of this note exists in the note hash tree. let donor_npk_m_hash = header.get_npk_m_hash(&mut context, donor); - let donor_ovpk_m = header.get_ovpk_m(&mut context, donor); - let donor_ivpk_m = header.get_ivpk_m(&mut context, donor); let mut note = ValueNote::new(amount as Field, donor_npk_m_hash); - storage.donation_receipts.insert(&mut note, donor_ovpk_m, donor_ivpk_m); + storage.donation_receipts.insert(&mut note).emit(with_az_enc(&mut context, donor, donor)); } // docs:end:donate diff --git a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr index 595cc922ffd9..a794ba095fc7 100644 --- a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr @@ -4,6 +4,7 @@ contract DelegatedOn { AztecAddress, FunctionSelector, NoteHeader, NoteGetterOptions, NoteViewerOptions, PublicMutable, PrivateSet, PrivateContext, Map }; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::aztec::{protocol_types::grumpkin_point::GrumpkinPoint}; use dep::value_note::value_note::ValueNote; @@ -17,11 +18,9 @@ contract DelegatedOn { fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_map_with_private_values.at(owner).insert(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + storage.a_map_with_private_values.at(owner).insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); new_value } diff --git a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr index 1f30d2e214f9..94364d1fbd77 100644 --- a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr @@ -18,6 +18,7 @@ contract DocsExample { PrivateContext, Map, PublicMutable, PublicImmutable, PrivateMutable, PrivateImmutable, PrivateSet, SharedImmutable, Deserialize }; + use dep::aztec::encrypted_logs::encrypted_note_emission::{with_az_enc, with_az_enc_with_keys}; use dep::aztec::note::note_getter_options::Comparator; use dep::aztec::protocol_types::grumpkin_point::GrumpkinPoint; // how to import methods from other files/folders within your workspace @@ -170,11 +171,9 @@ contract DocsExample { fn initialize_private_immutable(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut new_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); - storage.private_immutable.initialize(&mut new_card, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.private_immutable.initialize(&mut new_card).emit(with_az_enc(&mut context, context.msg_sender(), context.msg_sender())); } // docs:end:initialize-private-mutable @@ -183,12 +182,10 @@ contract DocsExample { fn initialize_private(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut legendary_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); // create and broadcast note - storage.legendary_card.initialize(&mut legendary_card, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.legendary_card.initialize(&mut legendary_card).emit(with_az_enc(&mut context, context.msg_sender(), context.msg_sender())); } #[aztec(private)] @@ -200,7 +197,7 @@ contract DocsExample { for i in 0..amounts.len() { let mut note = CardNote::new(amounts[i], 1, msg_sender_npk_m_hash); - storage.set.insert(&mut note, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.set.insert(&mut note).emit(with_az_enc_with_keys(&mut context, msg_sender_ovpk_m, msg_sender_ivpk_m)); } } @@ -208,11 +205,9 @@ contract DocsExample { fn insert_note(amount: u8, randomness: Field) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut note = CardNote::new(amount, randomness, msg_sender_npk_m_hash); - storage.set.insert(&mut note, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.set.insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), context.msg_sender())); } // docs:start:state_vars-NoteGetterOptionsComparatorExampleNoir @@ -234,11 +229,9 @@ contract DocsExample { fn update_legendary_card(randomness: Field, points: u8) { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); let mut new_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); - storage.legendary_card.replace(&mut new_card, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.legendary_card.replace(&mut new_card).emit(with_az_enc(&mut context, context.msg_sender(), context.msg_sender())); DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); } @@ -249,18 +242,17 @@ contract DocsExample { let header = context.get_header(); let msg_sender_npk_m_hash = header.get_npk_m_hash(&mut context, context.msg_sender()); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let msg_sender_ivpk_m = header.get_ivpk_m(&mut context, context.msg_sender()); // docs:start:state_vars-PrivateMutableGet - let card = storage.legendary_card.get_note(msg_sender_ovpk_m, msg_sender_ivpk_m); + let card = storage.legendary_card.get_note().note; + // docs:end:state_vars-PrivateMutableGet let points = card.points + 1; let mut new_card = CardNote::new(points, card.randomness, msg_sender_npk_m_hash); // docs:start:state_vars-PrivateMutableReplace - storage.legendary_card.replace(&mut new_card, msg_sender_ovpk_m, msg_sender_ivpk_m); + storage.legendary_card.replace(&mut new_card).emit(with_az_enc(&mut context, context.msg_sender(), context.msg_sender())); // docs:end:state_vars-PrivateMutableReplace DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); diff --git a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr index 2c2635acbd33..7b0fe4b5fc5d 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr @@ -4,6 +4,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::aztec::prelude::{AztecAddress, FunctionSelector, NoteHeader, NoteGetterOptions, PrivateContext, PrivateImmutable}; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::aztec::protocol_types::abis::call_context::CallContext; use dep::std; @@ -32,11 +33,9 @@ contract EcdsaAccount { // Not emitting outgoing for msg_sender here to not have to register keys for the contract through which we // deploy this (typically MultiCallEntrypoint). I think it's ok here as I feel the outgoing here is not that // important. - let this_ovpk_m = header.get_ovpk_m(&mut context, this); - let this_ivpk_m = header.get_ivpk_m(&mut context, this); let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_npk_m_hash); - storage.public_key.initialize(&mut pub_key_note, this_ovpk_m, this_ivpk_m); + storage.public_key.initialize(&mut pub_key_note).emit(with_az_enc(&mut context, this, this)); } // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts diff --git a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr index 6fbc11a494d9..fb946829aca5 100644 --- a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr @@ -1,6 +1,7 @@ // Sample escrow contract that stores a balance of a private token on behalf of an owner. contract Escrow { use dep::aztec::prelude::{AztecAddress, EthAddress, FunctionSelector, NoteHeader, PrivateContext, PrivateImmutable}; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::address_note::address_note::AddressNote; @@ -17,11 +18,9 @@ contract Escrow { fn constructor(owner: AztecAddress) { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = AddressNote::new(owner, owner_npk_m_hash); - storage.owner.initialize(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + storage.owner.initialize(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); } // Withdraws balance. Requires that msg.sender is the owner. diff --git a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr index c7a3a9249f69..29eccd6f8e3a 100644 --- a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr @@ -4,6 +4,7 @@ contract InclusionProofs { AztecAddress, EthAddress, FunctionSelector, NoteHeader, NoteGetterOptions, PrivateContext, Map, PrivateSet, PublicMutable }; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::aztec::protocol_types::{grumpkin_point::GrumpkinPoint, contract_class_id::ContractClassId, header::Header}; use dep::aztec::{note::note_getter_options::NoteStatus}; @@ -33,11 +34,9 @@ contract InclusionProofs { let owner_private_values = storage.private_values.at(owner); let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value, owner_npk_m_hash); - owner_private_values.insert(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + owner_private_values.insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); } // docs:end:create_note diff --git a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr index 4a926ee88d49..0d81a34bef83 100644 --- a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr @@ -8,6 +8,7 @@ contract PendingNoteHashes { use dep::value_note::{balance_utils, filter::filter_notes_min_sum, value_note::{VALUE_NOTE_LEN, ValueNote}}; use dep::aztec::protocol_types::grumpkin_point::GrumpkinPoint; use dep::aztec::protocol_types::constants::{MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NEW_NOTE_HASHES_PER_CALL}; + use dep::aztec::encrypted_logs::encrypted_note_emission::{with_az_enc, with_az_enc_with_keys}; #[aztec(storage)] struct Storage { @@ -30,13 +31,11 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); // Insert note - owner_balance.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); // get note inserted above @@ -65,12 +64,10 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); // Insert note let mut note = ValueNote::new(amount, owner_npk_m_hash); - owner_balance.insert(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); 0 } @@ -86,13 +83,11 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); // Insert note - owner_balance.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); } // Nested/inner function to create and insert a note @@ -108,14 +103,12 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); note.randomness = 2; // Insert note - owner_balance.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); } // Nested/inner function to create and insert a note @@ -126,21 +119,16 @@ contract PendingNoteHashes { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(amount, owner_npk_m_hash); // Insert note - owner_balance.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + let emission = owner_balance.insert(&mut note); + + emission.emit(with_az_enc(&mut context, outgoing_viewer, owner)); // Emit note again - context.encrypt_and_emit_note( - note.get_header().storage_slot, - outgoing_viewer_ovpk_m, - owner_ivpk_m, - note - ); + emission.emit(with_az_enc(&mut context, outgoing_viewer, owner)); } // Nested/inner function to get a note and confirm it matches the expected value @@ -358,7 +346,7 @@ contract PendingNoteHashes { let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut good_note = ValueNote::new(10, owner_npk_m_hash); // Insert good note with real log - owner_balance.insert(&mut good_note, outgoing_viewer_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut good_note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); // We will emit a note log with an incorrect preimage to ensure the pxe throws // This note has not been inserted... @@ -390,7 +378,7 @@ contract PendingNoteHashes { for i in 0..max_notes_per_call() { let mut note = ValueNote::new(i as Field, owner_npk_m_hash); - owner_balance.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + owner_balance.insert(&mut note).emit(with_az_enc_with_keys(context, outgoing_viewer_ovpk_m, owner_ivpk_m)); } } diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index 1bacb629def1..e8002ea3636c 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -7,6 +7,7 @@ contract SchnorrAccount { use dep::aztec::prelude::{AztecAddress, FunctionSelector, NoteHeader, PrivateContext, PrivateImmutable}; use dep::aztec::state_vars::{Map, PublicMutable}; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::authwit::{ entrypoint::{app::AppPayload, fee::FeePayload}, account::AccountActions, auth_witness::get_auth_witness @@ -34,12 +35,10 @@ contract SchnorrAccount { // Not emitting outgoing for msg_sender here to not have to register keys for the contract through which we // deploy this (typically MultiCallEntrypoint). I think it's ok here as I feel the outgoing here is not that // important. - let this_ovpk_m = header.get_ovpk_m(&mut context, this); - let this_ivpk_m = header.get_ivpk_m(&mut context, this); // docs:start:initialize let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_npk_m_hash); - storage.signing_public_key.initialize(&mut pub_key_note, this_ovpk_m, this_ivpk_m); + storage.signing_public_key.initialize(&mut pub_key_note).emit(with_az_enc(&mut context, this, this)); // docs:end:initialize } diff --git a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr index 5426201d3c0c..bde4f15fb5ae 100644 --- a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr @@ -4,7 +4,8 @@ contract StaticChild { use dep::aztec::{ context::{PublicContext, gas::GasOpts}, protocol_types::{abis::{call_context::CallContext}}, - note::{note_getter_options::NoteGetterOptions, note_header::NoteHeader} + note::{note_getter_options::NoteGetterOptions, note_header::NoteHeader}, + encrypted_logs::encrypted_note_emission::with_az_enc }; use dep::value_note::value_note::ValueNote; @@ -41,10 +42,8 @@ contract StaticChild { fn private_illegal_set_value(new_value: Field, owner: AztecAddress) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk_m = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note, msg_sender_ovpk_m, owner_ivpk_m); + storage.a_private_value.insert(&mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); new_value } @@ -57,10 +56,8 @@ contract StaticChild { ) -> Field { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note, outgoing_viewer_ovpk_m, owner_ivpk_m); + storage.a_private_value.insert(&mut note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); new_value } diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr index ad470e0af06a..eb3e3fef412b 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr @@ -7,6 +7,7 @@ contract Test { AztecAddress, EthAddress, FunctionSelector, NoteHeader, NoteGetterOptions, NoteViewerOptions, PrivateContext, PrivateImmutable, PrivateSet, SharedImmutable }; + use dep::aztec::encrypted_logs::encrypted_note_emission::with_az_enc; use dep::aztec::protocol_types::{ abis::private_circuit_public_inputs::PrivateCircuitPublicInputs, @@ -94,17 +95,9 @@ contract Test { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(&mut context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value, owner_npk_m_hash); - create_note( - &mut context, - storage_slot, - &mut note, - outgoing_viewer_ovpk_m, - owner_ivpk_m - ); + create_note(&mut context, storage_slot, &mut note).emit(with_az_enc(&mut context, outgoing_viewer, owner)); } #[aztec(private)] @@ -317,17 +310,9 @@ contract Test { let header = context.get_header(); let owner_npk_m_hash = header.get_npk_m_hash(&mut context, owner); - let msg_sender_ovpk = header.get_ovpk_m(&mut context, context.msg_sender()); - let owner_ivpk_m = header.get_ivpk_m(&mut context, owner); let mut note = ValueNote::new(value + 1, owner_npk_m_hash); - create_note( - &mut context, - storage_slot, - &mut note, - msg_sender_ovpk, - owner_ivpk_m - ); + create_note(&mut context, storage_slot, &mut note).emit(with_az_enc(&mut context, context.msg_sender(), owner)); storage_slot += 1; Test::at(context.this_address()).call_create_note(value + 2, owner, outgoing_viewer, storage_slot).call(&mut context); } @@ -405,7 +390,7 @@ contract Test { // The test note is not being broadcasted (TestNote::broadcast(...) does not actually broadcast) and for this // reason we are passing zero values for the public keys below. This means that if we want to interact with // this note in the future, we will need to manually add it to PXE by calling pxe.addNote(...). - storage.example_constant.initialize(&mut note, GrumpkinPoint::zero(), GrumpkinPoint::zero()); + storage.example_constant.initialize(&mut note).discard(); } #[aztec(private)] diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr index 181b6483a47b..cb53d49bf75f 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr @@ -12,7 +12,8 @@ contract TokenBlacklist { // Libs use dep::aztec::{ hash::compute_secret_hash, - prelude::{AztecAddress, FunctionSelector, Map, NoteGetterOptions, PrivateSet, PublicMutable, SharedMutable} + prelude::{AztecAddress, FunctionSelector, Map, NoteGetterOptions, PrivateSet, PublicMutable, SharedMutable}, + encrypted_logs::encrypted_note_emission::with_az_enc }; use dep::authwit::{auth::{assert_current_call_valid_authwit, assert_current_call_valid_authwit_public}}; @@ -177,7 +178,8 @@ contract TokenBlacklist { pending_shields.remove(note); // Add the token note to user's balances set - storage.balances.add(context.msg_sender(), to, U128::from_integer(amount)); + let caller = context.msg_sender(); + storage.balances.add(to, U128::from_integer(amount)).emit(with_az_enc(&mut context, caller, to)); } #[aztec(private)] @@ -193,7 +195,7 @@ contract TokenBlacklist { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)); + storage.balances.sub(from, U128::from_integer(amount)).emit(with_az_enc(&mut context, from, from)); TokenBlacklist::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context); } @@ -213,8 +215,8 @@ contract TokenBlacklist { } let amount = U128::from_integer(amount); - storage.balances.sub(from, amount); - storage.balances.add(from, to, amount); + storage.balances.sub(from, amount).emit(with_az_enc(&mut context, from, from)); + storage.balances.add(to, amount).emit(with_az_enc(&mut context, from, to)); } #[aztec(private)] @@ -228,7 +230,7 @@ contract TokenBlacklist { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)); + storage.balances.sub(from, U128::from_integer(amount)).emit(with_az_enc(&mut context, from, from)); TokenBlacklist::at(context.this_address())._reduce_total_supply(amount).enqueue(&mut context); } diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr index 0e3084fd7c3c..6d1ffe37838d 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/balances_map.nr @@ -2,9 +2,9 @@ use dep::aztec::prelude::{AztecAddress, NoteGetterOptions, NoteViewerOptions, No use dep::aztec::{ context::{PrivateContext, UnconstrainedContext}, hash::pedersen_hash, protocol_types::constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, - note::{note_getter::view_notes, note_getter_options::SortOrder} + note::{note_getter::view_notes, note_getter_options::SortOrder, note_emission::NoteEmission} }; -use crate::types::token_note::{TokenNote, OwnedNote}; +use crate::types::{token_note::{TokenNote, OwnedNote}}; struct BalancesMap { map: Map, Context> @@ -58,21 +58,18 @@ impl BalancesMap { impl BalancesMap { pub fn add( self: Self, - outgoing_viewer: AztecAddress, owner: AztecAddress, addend: U128 - ) where T: NoteInterface + OwnedNote { + ) -> NoteEmission where T: NoteInterface + OwnedNote { let context = self.map.context; let header = context.get_header(); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(context, owner); // We fetch the nullifier public key hash from the registry / from our PXE let owner_npk_m_hash = header.get_npk_m_hash(context, owner); let mut addend_note = T::new(addend, owner_npk_m_hash); // docs:start:insert - self.map.at(owner).insert(&mut addend_note, outgoing_viewer_ovpk_m, owner_ivpk_m); + self.map.at(owner).insert(&mut addend_note) // docs:end:insert } @@ -80,7 +77,7 @@ impl BalancesMap { self: Self, owner: AztecAddress, subtrahend: U128 - ) where T: NoteInterface + OwnedNote { + ) -> NoteEmission where T: NoteInterface + OwnedNote { // docs:start:get_notes let options = NoteGetterOptions::with_filter(filter_notes_min_sum, subtrahend); let maybe_notes = self.map.at(owner).get_notes(options); @@ -108,7 +105,7 @@ impl BalancesMap { // without the == true, it includes 'minuend.ge(subtrahend)' as part of the error. assert(minuend >= subtrahend, "Balance too low"); - self.add(owner, owner, minuend - subtrahend); + self.add(owner, minuend - subtrahend) } } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index 1200261cce14..6f28fb6d0773 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -16,7 +16,8 @@ contract Token { use dep::aztec::{ hash::compute_secret_hash, - prelude::{NoteGetterOptions, Map, PublicMutable, SharedImmutable, PrivateSet, AztecAddress} + prelude::{NoteGetterOptions, Map, PublicMutable, SharedImmutable, PrivateSet, AztecAddress}, + encrypted_logs::encrypted_note_emission::with_az_enc }; // docs:start:import_authwit @@ -193,11 +194,8 @@ contract Token { // TODO: Nuke this - test functions do not belong to token contract! #[aztec(private)] fn privately_mint_private_note(amount: Field) { - storage.balances.add( - context.msg_sender(), - context.msg_sender(), - U128::from_integer(amount) - ).emit(&mut context); + let caller = context.msg_sender(); + storage.balances.add(caller, U128::from_integer(amount)).emit(with_az_enc(&mut context, caller, caller)); Token::at(context.this_address()).assert_minter_and_mint(context.msg_sender(), amount).enqueue(&mut context); } @@ -290,7 +288,8 @@ contract Token { // Add the token note to user's balances set // Note: Using context.msg_sender() as a sender below makes this incompatible with escrows because we send // outgoing logs to that address and to send outgoing logs you need to get a hold of ovsk_m. - storage.balances.add(context.msg_sender(), to, U128::from_integer(amount)).emit(&mut context); + let from = context.msg_sender(); + storage.balances.add(to, U128::from_integer(amount)).emit(with_az_enc(&mut context, from, to)); } // docs:end:redeem_shield @@ -303,7 +302,7 @@ contract Token { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)).emit(&mut context); + storage.balances.sub(from, U128::from_integer(amount)).emit(with_az_enc(&mut context, from, from)); Token::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context); } @@ -321,8 +320,8 @@ contract Token { // docs:end:assert_current_call_valid_authwit let amount = U128::from_integer(amount); - storage.balances.sub(from, amount).emit(&mut context); - storage.balances.add(from, to, amount).emit(&mut context); + storage.balances.sub(from, amount).emit(with_az_enc(&mut context, from, from)); + storage.balances.add(to, amount).emit(with_az_enc(&mut context, from, to)); } // docs:end:transfer @@ -335,7 +334,7 @@ contract Token { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)).emit(&mut context); + storage.balances.sub(from, U128::from_integer(amount)).emit(with_az_enc(&mut context, from, from)); Token::at(context.this_address())._reduce_total_supply(amount).enqueue(&mut context); } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types.nr index f6ff12fb9b96..62a1bb2a363e 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types.nr @@ -1,4 +1,3 @@ mod transparent_note; mod balances_map; mod token_note; -mod emission; \ No newline at end of file diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr index c6451db026bf..6d1ffe37838d 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/balances_map.nr @@ -2,9 +2,9 @@ use dep::aztec::prelude::{AztecAddress, NoteGetterOptions, NoteViewerOptions, No use dep::aztec::{ context::{PrivateContext, UnconstrainedContext}, hash::pedersen_hash, protocol_types::constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, - note::{note_getter::view_notes, note_getter_options::SortOrder} + note::{note_getter::view_notes, note_getter_options::SortOrder, note_emission::NoteEmission} }; -use crate::types::{token_note::{TokenNote, OwnedNote}, emission::NoteEmission}; +use crate::types::{token_note::{TokenNote, OwnedNote}}; struct BalancesMap { map: Map, Context> @@ -58,31 +58,19 @@ impl BalancesMap { impl BalancesMap { pub fn add( self: Self, - outgoing_viewer: AztecAddress, owner: AztecAddress, addend: U128 ) -> NoteEmission where T: NoteInterface + OwnedNote { let context = self.map.context; let header = context.get_header(); - let outgoing_viewer_ovpk_m = header.get_ovpk_m(context, outgoing_viewer); - let owner_ivpk_m = header.get_ivpk_m(context, owner); // We fetch the nullifier public key hash from the registry / from our PXE let owner_npk_m_hash = header.get_npk_m_hash(context, owner); let mut addend_note = T::new(addend, owner_npk_m_hash); - let owner_storage = self.map.at(owner); - // docs:start:insert - owner_storage.insert(&mut addend_note); + self.map.at(owner).insert(&mut addend_note) // docs:end:insert - - NoteEmission::new( - owner_storage.storage_slot, - addend_note, - outgoing_viewer_ovpk_m, - owner_ivpk_m - ) } pub fn sub( @@ -117,7 +105,7 @@ impl BalancesMap { // without the == true, it includes 'minuend.ge(subtrahend)' as part of the error. assert(minuend >= subtrahend, "Balance too low"); - self.add(owner, owner, minuend - subtrahend) + self.add(owner, minuend - subtrahend) } } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/emission.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/emission.nr deleted file mode 100644 index 4d11682ae71e..000000000000 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/emission.nr +++ /dev/null @@ -1,45 +0,0 @@ -use dep::aztec::{ - prelude::{AztecAddress, NoteHeader, NoteInterface, PrivateContext}, - encrypted_logs::{payload::compute_encrypted_note_log}, note::note_interface::NoteInterface, - protocol_types::{grumpkin_point::GrumpkinPoint} -}; - -struct NoteEmission { - storage_slot: Field, - note: Note, - ovpk: GrumpkinPoint, - ivpk: GrumpkinPoint, -} - -impl NoteEmission { - pub fn new(storage_slot: Field, note: Note, ovpk: GrumpkinPoint, ivpk: GrumpkinPoint) -> Self { - Self { storage_slot, note, ovpk, ivpk } - } - - pub fn emit(self, context: &mut PrivateContext) where Note: NoteInterface { - let note_hash_counter = self.note.get_header().note_hash_counter; - - let contract_address = context.this_address(); - let ovsk_app = context.request_ovsk_app(self.ovpk.hash()); - - // Current unoptimized size of the encrypted log - // incoming_tag (32 bytes) - // outgoing_tag (32 bytes) - // eph_pk (64 bytes) - // incoming_header (48 bytes) - // outgoing_header (48 bytes) - // outgoing_body (176 bytes) - // incoming_body_fixed (64 bytes) - // incoming_body_variable (N * 32 bytes + 16 bytes padding) - let encrypted_log: [u8; M] = compute_encrypted_note_log( - contract_address, - self.storage_slot, - ovsk_app, - self.ovpk, - self.ivpk, - self.note - ); - - context.emit_raw_log(note_hash_counter, encrypted_log); - } -} diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr index f1afad92e9cf..9d4302125f9d 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr @@ -2,13 +2,12 @@ use dep::aztec::{ prelude::{AztecAddress, NoteHeader, NoteInterface, PrivateContext}, protocol_types::{constants::GENERATOR_INDEX__NOTE_NULLIFIER, grumpkin_point::GrumpkinPoint, hash::poseidon2_hash}, note::utils::compute_note_hash_for_consumption, oracle::unsafe_rand::unsafe_rand, - keys::getters::get_nsk_app + note::note_emission::NoteEmission, keys::getters::get_nsk_app }; trait OwnedNote { fn new(amount: U128, owner_npk_m_hash: Field) -> Self; fn get_amount(self) -> U128; - fn get_owner_npk_m_hash(self) -> Field; } global TOKEN_NOTE_LEN: Field = 3; // 3 plus a header. @@ -76,8 +75,4 @@ impl OwnedNote for TokenNote { fn get_amount(self) -> U128 { self.amount } - - fn get_owner_npk_m_hash(self) -> Field { - self.npk_m_hash - } }