@aztec/protocol-contracts 4.0.0-devnet.1-patch.1 → 4.0.0-devnet.2-patch.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "transpiled": true,
3
- "noir_version": "1.0.0-beta.18+f1db9754dd26736a9bdbfd41c5ce15fe5d62ba6b",
3
+ "noir_version": "1.0.0-beta.18+2db78f8894936db05c53430f364360ac9cc5c61f",
4
4
  "name": "PublicChecks",
5
5
  "functions": [
6
6
  {
@@ -125,7 +125,7 @@
125
125
  "name": "storage",
126
126
  "type": {
127
127
  "kind": "array",
128
- "length": 17,
128
+ "length": 15,
129
129
  "type": {
130
130
  "kind": "field"
131
131
  }
@@ -351,8 +351,8 @@
351
351
  }
352
352
  }
353
353
  },
354
- "bytecode": "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",
355
- "debug_symbols": "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"
354
+ "bytecode": "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",
355
+ "debug_symbols": "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9w2P/ed/7l7At7nK2D1HZf1Y15H3nzDU8e2V12548Lkrlf2iPHmhsrsl9fSFyvZE8KkLle2mbWv02Prm/fm2ux/19Lbd3Y96dtv+qCXPXcvutu9zX5nalnjycni/KM/uZeML9rLdvagv2Mt44t/6eBzKthtjrLKunOo3T6b0DzW21ytrfXi7f6dgf35ZhvLc0ebzKtbqFyyL/67LUo81XloPee3gUMu6KK5l1Bdr0I4iX1FjvFhj3UO+Dae9+CGysm661lJfXqeddWov1hirhpTHn6naf1/7braC3V8+fbiKe//5qR+UeOpa8v1Hn7Ylnnz0abc+ueEr6o+/NW7bm0/PvJp92wrjAxE2bNMKfT/Btk9OPZdg+6+3c8enSnm4LPsa671sUv3x+ti+o/rJr8iLvTuYtq3w1FjavsIzQ2nbpz+eGx3Qdy+Kv+BLxbuPU/X1+cQ+Ht8GrLubTbflXzdn/f4j5eVjO3ZH+c6jo/3+K9TfFdnN7F+v+JK7jw7d7sY8u0afPTnfPsG2zmdv1wh3L1/78PapXQnnQ073n+n6TIle+WJhfa0VY3VTOY7ySgk5hIlZpi+1gukDpfXXFqQNPp5WXlqQcvcl2zJea4WuwLgdVF8ssaYOFLv7IsZnShgfkjMpb7fixRLGRKzbyePDEnX3ZJS1Ubmkv/8y8PN7ONNsxl0zPl7y7b+Gx/tB758T+USJUZm+X9trJda34r95S+knSsjhTN2/v032iRJx2/s635LXWmGciNvdCMtnSlQ+klbvvi30qRK8t6PeXdp8qsTd3IkqL7aCU627x21ebcWrJfiYl5eXdvD5XMsqUV/bqL6G725H9hdbwRRu78fbC/JaCe08Nti7vViCcarjpY2qQ5m45Y9XZ90+O/F2/uoYfFthtNeWZL2L+Iav7eHl4AGB47XefqwbGLcSr/X2UjiXl+PFBXFKvL8gL5a4e/Lj/oblp0rUdaFafLxYglmW7Xh7QV4t0Xmx7njtWCRsVCn9xRIHJca7C/JqibuLs/uHg7/LnN3dpC/IHG8rMO4z3A59vsS6ntB2N+3+5RLtpRI8h6D3H5P/VIlGK+4ORp8pwY2X2zXya+uil7VF7t8u8GoJeW2j9jWwpf3uOdxPlVhn4Xo/pvSpEp0FuXvt3KdK3M23Hy9u1PWit9u13kutkFsfX7397n7rp0qsBRG5e/HdxxJ1+wiTrDPgIvePY/TnmzEI4PFSPxNdj/vcbjTIayXWHn5Df63EuqF3G5+vL5bgI9bmb5eor7bi7u7C8VoJZ12M8nYrPm7U/7z965//8vNvf/rlb3/58z9+/tuvf7/95b9nsd9+/vN//fLX61//55+//uXu//7j//+//D//9dvPv/zy8//+6f9++9tf/vrf//ztr7PS/H8/Hdc//uN2fdz+YC7+n3/4qcx/77ehHbuNjN/+XW//fhvYbWP+v/hlaeMPJt3mf7h+W26/fdh//ns29/8B"
356
356
  },
357
357
  {
358
358
  "name": "public_dispatch",
@@ -579,8 +579,8 @@
579
579
  }
580
580
  }
581
581
  },
582
- "bytecode": "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",
583
- "debug_symbols": "vb3djuU6coX5Lue6L0Qyfki/imEY7XbbaOCg22i3BxgYfvfZXGLEUmVhM5V7Z83Nya/qVMYnUYqQRFLU//7273/+t//5z3/9y1//42///ds//fP//vZvf//L77//5T//9fe//emP//jL3/76+Nv//e2Y//H22z+1P/zm8ts/6eOHnj/s/OHnj37+GPjRj/NHOX/U80c7f5xR+hmln1H6GaWfUfoZZZxRxhllnFHGGWWcUcYZZZxRxhllnFHGGaUcx/pZ1s+6frb1U9ZPXT9t/fT1s6+fK15Z8cqKV1a8suKVFa+seGXFKyteWfHKildXvLri1RWvrnh1xasrXl3x6opXV7y64rUVr614bcVrK15b8dqK11a8tuK1Fa+teLLiyYonK56seLLiySOez5+2fvr62dfPR7xyPECPgBLwCFnahEfMMv+xSoAGWIAH9IAZuT/AjoASUANagARogAV4QA+IyB6RfUYeE2pAC5iRZ0vMDDnBAh6RK369B4wFM1dOKAE1oAVIgAZYQETuEblH5Jk/bTbvzKATakALkAANsAAP6AHjhHocASWgBrQACdCAGblO8IAeMBbM5DqhBNSAFiABGhCRS0QuEblE5BqRa0SuEblG5BqRa0SuEblG5BqRa0RuEblF5BaRW0RuEblF5BaRW0RuEblFZInIEpElIktElogsEVkiskRkicgSkTUia0TWiKwRWSOyRmSNyBqRNSJrRLaIbBHZIrJFZIvIFpFnDjad4AE9YCyYOXhCCagBLUACNCAie0T2iDxzsD0ypc4cPKEEPCJLm9ACJEADLMADesBYMHPwhBIQkUdEHhF55qDYBAvwgB4wTmgzB08oATWgBUiABliAB/SAWe8fedpwgQOUgBrQAiRAAyzAA3pARK4RuUbkGpFrRK4RuUbkGpFrRK4RuUbkFpFbRG4RuUXkFpFbRG4RuUXkFpFbRJaILBFZIrJEZInIEpElIktElogsEVkjskZkjcgakTUia0TWiKwRWSOyRmSLyBaRLSJbRLaIbBHZIrJFZIvIFpE9IntE9ojsEdkjskdkj8gekT0ie0TuEblH5B6Re0TuEblH5B6Re0TuEblH5BGRR0QeEXlE5BGRR0QeEXlE5BGRx4osxxFQAmpAC5AADbAAD+gBETlyUCIHJXJQkIN1ggRogAV4QA8YC5CDgBJQAyJyjcg1IteI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"
582
+ "bytecode": "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",
583
+ "debug_symbols": "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"
584
584
  }
585
585
  ],
586
586
  "outputs": {
@@ -663,7 +663,7 @@
663
663
  "name": "storage",
664
664
  "type": {
665
665
  "kind": "array",
666
- "length": 17,
666
+ "length": 15,
667
667
  "type": {
668
668
  "kind": "field"
669
669
  }
@@ -782,15 +782,15 @@
782
782
  },
783
783
  "124": {
784
784
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/mod.nr",
785
- "source": "use crate::protocol::{address::AztecAddress, debug_log::{debug_log, debug_log_format}};\n\npub mod nonce_discovery;\npub mod partial_notes;\npub mod private_events;\npub mod private_notes;\npub mod process_message;\n\nuse crate::{\n messages::{\n discovery::process_message::process_message_ciphertext,\n logs::note::MAX_NOTE_PACKED_LEN,\n processing::{\n get_private_logs, pending_tagged_log::PendingTaggedLog, validate_and_store_enqueued_notes_and_events,\n },\n },\n utils::array,\n};\n\npub struct NoteHashAndNullifier {\n /// The result of NoteHash::compute_note_hash\n pub note_hash: Field,\n /// The result of NoteHash::compute_nullifier_unconstrained (since all of message discovery is unconstrained).\n /// This is `None` if the nullifier cannot be computed (e.g., because the nullifier hiding key is not available).\n pub inner_nullifier: Option<Field>,\n}\n\n/// A function which takes a note's packed content, address of the emitting contract, note nonce, storage slot and note\n/// type ID and attempts to compute its note hash (not hashed by note nonce nor siloed by address) and inner nullifier\n/// (not siloed by address).\n///\n/// This function must be user-provided as its implementation requires knowledge of how note type IDs are allocated in\n/// a contract. The `#[aztec]` macro automatically creates such a contract library method called\n/// `_compute_note_hash_and_nullifier`, which looks something like this:\n///\n/// ```\n/// |packed_note, owner, storage_slot, note_type_id, contract_address, randomness, note_nonce| {\n/// if note_type_id == MyNoteType::get_id() {\n/// assert(packed_note.len() == MY_NOTE_TYPE_SERIALIZATION_LENGTH);\n///\n/// let note = MyNoteType::unpack(aztec::utils::array::subarray(packed_note.storage(), 0));\n///\n/// let note_hash = note.compute_note_hash(owner, storage_slot, randomness);\n/// let note_hash_for_nullification = aztec::note::utils::compute_note_hash_for_nullification(\n/// HintedNote{ note, contract_address, metadata: SettledNoteMetadata::new(note_nonce).into() },\n/// storage_slot\n/// );\n///\n/// let inner_nullifier = note.compute_nullifier_unconstrained(owner, note_hash_for_nullification);\n///\n/// Option::some(\n/// aztec::messages::discovery::NoteHashAndNullifier {\n/// note_hash, inner_nullifier\n/// }\n/// )\n/// } else if note_type_id == MyOtherNoteType::get_id() {\n/// ... // Similar to above but calling MyOtherNoteType::unpack_content\n/// } else {\n/// Option::none() // Unknown note type ID\n/// };\n/// }\n/// ```\npub type ComputeNoteHashAndNullifier<Env> = unconstrained fn[Env](/* packed_note */BoundedVec<Field, MAX_NOTE_PACKED_LEN>, /*\n owner */ AztecAddress, /* storage_slot */ Field, /* note_type_id */ Field, /* contract_address */ AztecAddress, /*\nrandomness */ Field, /* note nonce */ Field) -> Option<NoteHashAndNullifier>;\n\n/// Performs the state synchronization process, in which private logs are downloaded and inspected to find new private\n/// notes, partial notes and events, etc., and pending partial notes are processed to search for their completion logs.\n/// This is the mechanism via which a contract updates its knowledge of its private state.\n///\n/// Note that the state is synchronized up to the latest block synchronized by PXE (referred to as \"anchor block\").\n/// That should be close to the chain tip as block synchronization is performed before contract function simulation is\n/// done.\n///\n/// Receives the address of the contract on which discovery is performed along with its\n/// `compute_note_hash_and_nullifier` function.\npub unconstrained fn do_sync_state<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n) {\n debug_log(\"Performing state synchronization\");\n\n // First we process all private logs, which can contain different kinds of messages e.g. private notes, partial\n // notes, private events, etc.\n let mut logs = get_private_logs(contract_address);\n logs.for_each(|i, pending_tagged_log: PendingTaggedLog| {\n debug_log_format(\n \"Processing log with tag {0}\",\n [pending_tagged_log.log.get(0)],\n );\n\n // We remove the tag from the pending tagged log and process the message ciphertext contained in it.\n let message_ciphertext = array::subbvec(pending_tagged_log.log, 1);\n\n process_message_ciphertext(\n contract_address,\n compute_note_hash_and_nullifier,\n message_ciphertext,\n pending_tagged_log.context,\n );\n logs.remove(i);\n });\n\n // Then we process all pending partial notes, regardless of whether they were found in the current or previous\n // executions.\n partial_notes::fetch_and_process_partial_note_completion_logs(contract_address, compute_note_hash_and_nullifier);\n\n // Finally we validate all notes and events that were found as part of the previous processes, resulting in them\n // being added to PXE's database and retrievable via oracles (get_notes) and our TS API (PXE::getPrivateEvents).\n validate_and_store_enqueued_notes_and_events(contract_address);\n}\n"
785
+ "source": "use crate::protocol::{address::AztecAddress, logging::{debug_log, debug_log_format}};\n\npub mod nonce_discovery;\npub mod partial_notes;\npub mod private_events;\npub mod private_notes;\npub mod process_message;\n\nuse crate::{\n messages::{\n discovery::process_message::process_message_ciphertext,\n logs::note::MAX_NOTE_PACKED_LEN,\n processing::{\n get_private_logs, pending_tagged_log::PendingTaggedLog, validate_and_store_enqueued_notes_and_events,\n },\n },\n utils::array,\n};\n\npub struct NoteHashAndNullifier {\n /// The result of NoteHash::compute_note_hash\n pub note_hash: Field,\n /// The result of NoteHash::compute_nullifier_unconstrained (since all of message discovery is unconstrained).\n /// This is `None` if the nullifier cannot be computed (e.g., because the nullifier hiding key is not available).\n pub inner_nullifier: Option<Field>,\n}\n\n/// A function which takes a note's packed content, address of the emitting contract, note nonce, storage slot and note\n/// type ID and attempts to compute its note hash (not hashed by note nonce nor siloed by address) and inner nullifier\n/// (not siloed by address).\n///\n/// This function must be user-provided as its implementation requires knowledge of how note type IDs are allocated in\n/// a contract. The `#[aztec]` macro automatically creates such a contract library method called\n/// `_compute_note_hash_and_nullifier`, which looks something like this:\n///\n/// ```\n/// |packed_note, owner, storage_slot, note_type_id, contract_address, randomness, note_nonce| {\n/// if note_type_id == MyNoteType::get_id() {\n/// assert(packed_note.len() == MY_NOTE_TYPE_SERIALIZATION_LENGTH);\n///\n/// let note = MyNoteType::unpack(aztec::utils::array::subarray(packed_note.storage(), 0));\n///\n/// let note_hash = note.compute_note_hash(owner, storage_slot, randomness);\n/// let note_hash_for_nullification = aztec::note::utils::compute_note_hash_for_nullification(\n/// HintedNote{ note, contract_address, metadata: SettledNoteMetadata::new(note_nonce).into() },\n/// storage_slot\n/// );\n///\n/// let inner_nullifier = note.compute_nullifier_unconstrained(owner, note_hash_for_nullification);\n///\n/// Option::some(\n/// aztec::messages::discovery::NoteHashAndNullifier {\n/// note_hash, inner_nullifier\n/// }\n/// )\n/// } else if note_type_id == MyOtherNoteType::get_id() {\n/// ... // Similar to above but calling MyOtherNoteType::unpack_content\n/// } else {\n/// Option::none() // Unknown note type ID\n/// };\n/// }\n/// ```\npub type ComputeNoteHashAndNullifier<Env> = unconstrained fn[Env](/* packed_note */BoundedVec<Field, MAX_NOTE_PACKED_LEN>, /*\n owner */ AztecAddress, /* storage_slot */ Field, /* note_type_id */ Field, /* contract_address */ AztecAddress, /*\nrandomness */ Field, /* note nonce */ Field) -> Option<NoteHashAndNullifier>;\n\n/// Performs the state synchronization process, in which private logs are downloaded and inspected to find new private\n/// notes, partial notes and events, etc., and pending partial notes are processed to search for their completion logs.\n/// This is the mechanism via which a contract updates its knowledge of its private state.\n///\n/// Note that the state is synchronized up to the latest block synchronized by PXE (referred to as \"anchor block\").\n/// That should be close to the chain tip as block synchronization is performed before contract function simulation is\n/// done.\n///\n/// Receives the address of the contract on which discovery is performed along with its\n/// `compute_note_hash_and_nullifier` function.\npub unconstrained fn do_sync_state<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n) {\n debug_log(\"Performing state synchronization\");\n\n // First we process all private logs, which can contain different kinds of messages e.g. private notes, partial\n // notes, private events, etc.\n let mut logs = get_private_logs(contract_address);\n logs.for_each(|i, pending_tagged_log: PendingTaggedLog| {\n debug_log_format(\n \"Processing log with tag {0}\",\n [pending_tagged_log.log.get(0)],\n );\n\n // We remove the tag from the pending tagged log and process the message ciphertext contained in it.\n let message_ciphertext = array::subbvec(pending_tagged_log.log, 1);\n\n process_message_ciphertext(\n contract_address,\n compute_note_hash_and_nullifier,\n message_ciphertext,\n pending_tagged_log.context,\n );\n logs.remove(i);\n });\n\n // Then we process all pending partial notes, regardless of whether they were found in the current or previous\n // executions.\n partial_notes::fetch_and_process_partial_note_completion_logs(contract_address, compute_note_hash_and_nullifier);\n\n // Finally we validate all notes and events that were found as part of the previous processes, resulting in them\n // being added to PXE's database and retrievable via oracles (get_notes) and our TS API (PXE::getPrivateEvents).\n validate_and_store_enqueued_notes_and_events(contract_address);\n}\n"
786
786
  },
787
787
  "125": {
788
788
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/nonce_discovery.nr",
789
- "source": "use crate::messages::{discovery::ComputeNoteHashAndNullifier, logs::note::MAX_NOTE_PACKED_LEN};\n\nuse crate::protocol::{\n address::AztecAddress,\n constants::MAX_NOTE_HASHES_PER_TX,\n debug_log::debug_log_format,\n hash::{compute_note_hash_nonce, compute_siloed_note_hash, compute_unique_note_hash},\n traits::ToField,\n};\n\n/// A struct with the discovered information of a complete note, required for delivery to PXE. Note that this is *not*\n/// the complete note information, since it does not include content, storage slot, etc.\npub struct DiscoveredNoteInfo {\n pub note_nonce: Field,\n pub note_hash: Field,\n pub inner_nullifier: Field,\n}\n\n/// Searches for note nonces that will result in a note that was emitted in a transaction. While rare, it is possible\n/// for multiple notes to have the exact same packed content and storage slot but different nonces, resulting in\n/// different unique note hashes. Because of this this function returns a *vector* of discovered notes, though in most\n/// cases it will contain a single element.\n///\n/// Due to how nonces are computed, this function requires knowledge of the transaction in which the note was created,\n/// more specifically the list of all unique note hashes in it plus the value of its first nullifier.\npub unconstrained fn attempt_note_nonce_discovery<Env>(\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n contract_address: AztecAddress,\n owner: AztecAddress,\n storage_slot: Field,\n randomness: Field,\n note_type_id: Field,\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n) -> BoundedVec<DiscoveredNoteInfo, MAX_NOTE_HASHES_PER_TX> {\n let discovered_notes = &mut BoundedVec::new();\n\n debug_log_format(\n \"Attempting nonce discovery on {0} potential notes on contract {1} for storage slot {2}\",\n [unique_note_hashes_in_tx.len() as Field, contract_address.to_field(), storage_slot],\n );\n\n // We need to find nonces (typically just one) that result in a note hash that, once siloed into a unique note\n // hash, is one of the note hashes created by the transaction.\n unique_note_hashes_in_tx.for_eachi(|i, expected_unique_note_hash| {\n // Nonces are computed by hashing the first nullifier in the transaction with the index of the note in the new\n // note hashes array. We therefore know for each note in every transaction what its nonce is.\n let candidate_nonce = compute_note_hash_nonce(first_nullifier_in_tx, i);\n\n // Given note nonce, note content and metadata, we can compute the note hash and silo it to check if it matches\n // the note hash at the array index we're currently processing. TODO(#11157): handle failed\n // note_hash_and_nullifier computation\n let hashes = compute_note_hash_and_nullifier(\n packed_note,\n owner,\n storage_slot,\n note_type_id,\n contract_address,\n randomness,\n candidate_nonce,\n )\n .expect(f\"Failed to compute a note hash for note type {note_type_id}\");\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, hashes.note_hash);\n let unique_note_hash = compute_unique_note_hash(candidate_nonce, siloed_note_hash);\n\n if unique_note_hash == expected_unique_note_hash {\n // Note that while we did check that the note hash is the preimage of the expected unique note hash, we\n // perform no validations on the nullifier - we fundamentally cannot, since only the application knows how\n // to compute nullifiers. We simply trust it to have provided the correct one: if it hasn't, then PXE may\n // fail to realize that a given note has been nullified already, and calls to the application could result\n // in invalid transactions (with duplicate nullifiers). This is not a concern because an application\n // already has more direct means of making a call to it fail the transaction.\n discovered_notes.push(\n DiscoveredNoteInfo {\n note_nonce: candidate_nonce,\n note_hash: hashes.note_hash,\n // TODO: The None case will be handled in a followup PR.\n // https://linear.app/aztec-labs/issue/F-265/store-external-notes\n inner_nullifier: hashes.inner_nullifier.expect(\n f\"Failed to compute nullifier for note type {note_type_id}\",\n ),\n },\n );\n\n // We don't exit the loop - it is possible (though rare) for the exact same note content to be present\n // multiple times in the same transaction with different nonces. This typically doesn't happen due to notes\n // containing random values in order to hide their contents.\n }\n });\n\n debug_log_format(\n \"Found valid nonces for a total of {0} notes\",\n [discovered_notes.len() as Field],\n );\n\n *discovered_notes\n}\n\nmod test {\n use crate::{\n messages::{discovery::NoteHashAndNullifier, logs::note::MAX_NOTE_PACKED_LEN},\n note::{\n HintedNote,\n note_interface::{NoteHash, NoteType},\n note_metadata::SettledNoteMetadata,\n utils::compute_note_hash_for_nullification,\n },\n oracle::random::random,\n test::mocks::mock_note::MockNote,\n utils::array,\n };\n\n use crate::protocol::{\n address::AztecAddress,\n hash::{compute_note_hash_nonce, compute_siloed_note_hash, compute_unique_note_hash},\n traits::{FromField, Packable},\n };\n\n use super::attempt_note_nonce_discovery;\n\n // This implementation could be simpler, but this serves as a nice example of the expected flow in a real\n // implementation, and as a sanity check that the interface is sufficient.\n unconstrained fn compute_note_hash_and_nullifier(\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n owner: AztecAddress,\n storage_slot: Field,\n note_type_id: Field,\n contract_address: AztecAddress,\n randomness: Field,\n note_nonce: Field,\n ) -> Option<NoteHashAndNullifier> {\n if note_type_id == MockNote::get_id() {\n let note = MockNote::unpack(array::subarray(packed_note.storage(), 0));\n let note_hash = note.compute_note_hash(owner, storage_slot, randomness);\n\n let note_hash_for_nullification = compute_note_hash_for_nullification(\n HintedNote {\n note,\n contract_address,\n owner,\n randomness,\n storage_slot,\n metadata: SettledNoteMetadata::new(note_nonce).into(),\n },\n );\n\n let inner_nullifier = note.compute_nullifier_unconstrained(owner, note_hash_for_nullification);\n\n Option::some(NoteHashAndNullifier { note_hash, inner_nullifier })\n } else {\n Option::none()\n }\n }\n\n global VALUE: Field = 7;\n global FIRST_NULLIFIER_IN_TX: Field = 47;\n global CONTRACT_ADDRESS: AztecAddress = AztecAddress::from_field(13);\n global OWNER: AztecAddress = AztecAddress::from_field(14);\n global STORAGE_SLOT: Field = 99;\n global RANDOMNESS: Field = 99;\n\n #[test]\n unconstrained fn no_note_hashes() {\n let unique_note_hashes_in_tx = BoundedVec::new();\n let packed_note = BoundedVec::new();\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n packed_note,\n );\n\n assert_eq(discovered_notes.len(), 0);\n }\n\n #[test(should_fail_with = \"Failed to compute a note hash\")]\n unconstrained fn failed_hash_computation() {\n let unique_note_hashes_in_tx = BoundedVec::from_array([random()]);\n let packed_note = BoundedVec::new();\n let note_type_id = 0; // This note type id is unknown to compute_note_hash_and_nullifier\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n note_type_id,\n packed_note,\n );\n\n assert_eq(discovered_notes.len(), 0);\n }\n\n struct NoteAndData {\n note: MockNote,\n note_nonce: Field,\n note_hash: Field,\n unique_note_hash: Field,\n inner_nullifier: Field,\n }\n\n unconstrained fn construct_note(value: Field, note_index_in_tx: u32) -> NoteAndData {\n let note_nonce = compute_note_hash_nonce(FIRST_NULLIFIER_IN_TX, note_index_in_tx);\n\n let hinted_note = MockNote::new(value)\n .contract_address(CONTRACT_ADDRESS)\n .owner(OWNER)\n .randomness(RANDOMNESS)\n .storage_slot(STORAGE_SLOT)\n .note_metadata(SettledNoteMetadata::new(note_nonce).into())\n .build_hinted_note();\n let note = hinted_note.note;\n\n let note_hash = note.compute_note_hash(OWNER, STORAGE_SLOT, RANDOMNESS);\n let unique_note_hash = compute_unique_note_hash(\n note_nonce,\n compute_siloed_note_hash(CONTRACT_ADDRESS, note_hash),\n );\n let inner_nullifier = note\n .compute_nullifier_unconstrained(OWNER, compute_note_hash_for_nullification(hinted_note))\n .expect(f\"Could not compute nullifier for note owned by {OWNER}\");\n\n NoteAndData { note, note_nonce, note_hash, unique_note_hash, inner_nullifier }\n }\n\n #[test]\n unconstrained fn single_note() {\n let note_index_in_tx = 2;\n let note_and_data = construct_note(VALUE, note_index_in_tx);\n\n let mut unique_note_hashes_in_tx = BoundedVec::from_array([\n random(), random(), random(), random(), random(), random(), random(),\n ]);\n unique_note_hashes_in_tx.set(note_index_in_tx, note_and_data.unique_note_hash);\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n BoundedVec::from_array(note_and_data.note.pack()),\n );\n\n assert_eq(discovered_notes.len(), 1);\n let discovered_note = discovered_notes.get(0);\n\n assert_eq(discovered_note.note_nonce, note_and_data.note_nonce);\n assert_eq(discovered_note.note_hash, note_and_data.note_hash);\n assert_eq(discovered_note.inner_nullifier, note_and_data.inner_nullifier);\n }\n\n #[test]\n unconstrained fn multiple_notes_same_preimage() {\n let first_note_index_in_tx = 3;\n let first_note_and_data = construct_note(VALUE, first_note_index_in_tx);\n\n let second_note_index_in_tx = 5;\n let second_note_and_data = construct_note(VALUE, second_note_index_in_tx);\n\n // Both notes have the same preimage (and therefore packed representation), so both should be found in the same\n // call.\n assert_eq(first_note_and_data.note, second_note_and_data.note);\n let packed_note = first_note_and_data.note.pack();\n\n let mut unique_note_hashes_in_tx = BoundedVec::from_array([\n random(), random(), random(), random(), random(), random(), random(),\n ]);\n unique_note_hashes_in_tx.set(first_note_index_in_tx, first_note_and_data.unique_note_hash);\n unique_note_hashes_in_tx.set(second_note_index_in_tx, second_note_and_data.unique_note_hash);\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n BoundedVec::from_array(packed_note),\n );\n\n assert_eq(discovered_notes.len(), 2);\n\n assert(discovered_notes.any(|discovered_note| {\n (discovered_note.note_nonce == first_note_and_data.note_nonce)\n & (discovered_note.note_hash == first_note_and_data.note_hash)\n & (discovered_note.inner_nullifier == first_note_and_data.inner_nullifier)\n }));\n\n assert(discovered_notes.any(|discovered_note| {\n (discovered_note.note_nonce == second_note_and_data.note_nonce)\n & (discovered_note.note_hash == second_note_and_data.note_hash)\n & (discovered_note.inner_nullifier == second_note_and_data.inner_nullifier)\n }));\n }\n}\n"
789
+ "source": "use crate::messages::{discovery::ComputeNoteHashAndNullifier, logs::note::MAX_NOTE_PACKED_LEN};\n\nuse crate::protocol::{\n address::AztecAddress,\n constants::MAX_NOTE_HASHES_PER_TX,\n hash::{compute_note_hash_nonce, compute_siloed_note_hash, compute_unique_note_hash},\n logging::debug_log_format,\n traits::ToField,\n};\n\n/// A struct with the discovered information of a complete note, required for delivery to PXE. Note that this is *not*\n/// the complete note information, since it does not include content, storage slot, etc.\npub struct DiscoveredNoteInfo {\n pub note_nonce: Field,\n pub note_hash: Field,\n pub inner_nullifier: Field,\n}\n\n/// Searches for note nonces that will result in a note that was emitted in a transaction. While rare, it is possible\n/// for multiple notes to have the exact same packed content and storage slot but different nonces, resulting in\n/// different unique note hashes. Because of this this function returns a *vector* of discovered notes, though in most\n/// cases it will contain a single element.\n///\n/// Due to how nonces are computed, this function requires knowledge of the transaction in which the note was created,\n/// more specifically the list of all unique note hashes in it plus the value of its first nullifier.\npub unconstrained fn attempt_note_nonce_discovery<Env>(\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n contract_address: AztecAddress,\n owner: AztecAddress,\n storage_slot: Field,\n randomness: Field,\n note_type_id: Field,\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n) -> BoundedVec<DiscoveredNoteInfo, MAX_NOTE_HASHES_PER_TX> {\n let discovered_notes = &mut BoundedVec::new();\n\n debug_log_format(\n \"Attempting nonce discovery on {0} potential notes on contract {1} for storage slot {2}\",\n [unique_note_hashes_in_tx.len() as Field, contract_address.to_field(), storage_slot],\n );\n\n // We need to find nonces (typically just one) that result in a note hash that, once siloed into a unique note\n // hash, is one of the note hashes created by the transaction.\n unique_note_hashes_in_tx.for_eachi(|i, expected_unique_note_hash| {\n // Nonces are computed by hashing the first nullifier in the transaction with the index of the note in the new\n // note hashes array. We therefore know for each note in every transaction what its nonce is.\n let candidate_nonce = compute_note_hash_nonce(first_nullifier_in_tx, i);\n\n // Given note nonce, note content and metadata, we can compute the note hash and silo it to check if it matches\n // the note hash at the array index we're currently processing. TODO(#11157): handle failed\n // note_hash_and_nullifier computation\n let hashes = compute_note_hash_and_nullifier(\n packed_note,\n owner,\n storage_slot,\n note_type_id,\n contract_address,\n randomness,\n candidate_nonce,\n )\n .expect(f\"Failed to compute a note hash for note type {note_type_id}\");\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, hashes.note_hash);\n let unique_note_hash = compute_unique_note_hash(candidate_nonce, siloed_note_hash);\n\n if unique_note_hash == expected_unique_note_hash {\n // Note that while we did check that the note hash is the preimage of the expected unique note hash, we\n // perform no validations on the nullifier - we fundamentally cannot, since only the application knows how\n // to compute nullifiers. We simply trust it to have provided the correct one: if it hasn't, then PXE may\n // fail to realize that a given note has been nullified already, and calls to the application could result\n // in invalid transactions (with duplicate nullifiers). This is not a concern because an application\n // already has more direct means of making a call to it fail the transaction.\n discovered_notes.push(\n DiscoveredNoteInfo {\n note_nonce: candidate_nonce,\n note_hash: hashes.note_hash,\n // TODO: The None case will be handled in a followup PR.\n // https://linear.app/aztec-labs/issue/F-265/store-external-notes\n inner_nullifier: hashes.inner_nullifier.expect(\n f\"Failed to compute nullifier for note type {note_type_id}\",\n ),\n },\n );\n\n // We don't exit the loop - it is possible (though rare) for the exact same note content to be present\n // multiple times in the same transaction with different nonces. This typically doesn't happen due to notes\n // containing random values in order to hide their contents.\n }\n });\n\n debug_log_format(\n \"Found valid nonces for a total of {0} notes\",\n [discovered_notes.len() as Field],\n );\n\n *discovered_notes\n}\n\nmod test {\n use crate::{\n messages::{discovery::NoteHashAndNullifier, logs::note::MAX_NOTE_PACKED_LEN},\n note::{\n HintedNote,\n note_interface::{NoteHash, NoteType},\n note_metadata::SettledNoteMetadata,\n utils::compute_note_hash_for_nullification,\n },\n oracle::random::random,\n test::mocks::mock_note::MockNote,\n utils::array,\n };\n\n use crate::protocol::{\n address::AztecAddress,\n hash::{compute_note_hash_nonce, compute_siloed_note_hash, compute_unique_note_hash},\n traits::{FromField, Packable},\n };\n\n use super::attempt_note_nonce_discovery;\n\n // This implementation could be simpler, but this serves as a nice example of the expected flow in a real\n // implementation, and as a sanity check that the interface is sufficient.\n unconstrained fn compute_note_hash_and_nullifier(\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n owner: AztecAddress,\n storage_slot: Field,\n note_type_id: Field,\n contract_address: AztecAddress,\n randomness: Field,\n note_nonce: Field,\n ) -> Option<NoteHashAndNullifier> {\n if note_type_id == MockNote::get_id() {\n let note = MockNote::unpack(array::subarray(packed_note.storage(), 0));\n let note_hash = note.compute_note_hash(owner, storage_slot, randomness);\n\n let note_hash_for_nullification = compute_note_hash_for_nullification(\n HintedNote {\n note,\n contract_address,\n owner,\n randomness,\n storage_slot,\n metadata: SettledNoteMetadata::new(note_nonce).into(),\n },\n );\n\n let inner_nullifier = note.compute_nullifier_unconstrained(owner, note_hash_for_nullification);\n\n Option::some(NoteHashAndNullifier { note_hash, inner_nullifier })\n } else {\n Option::none()\n }\n }\n\n global VALUE: Field = 7;\n global FIRST_NULLIFIER_IN_TX: Field = 47;\n global CONTRACT_ADDRESS: AztecAddress = AztecAddress::from_field(13);\n global OWNER: AztecAddress = AztecAddress::from_field(14);\n global STORAGE_SLOT: Field = 99;\n global RANDOMNESS: Field = 99;\n\n #[test]\n unconstrained fn no_note_hashes() {\n let unique_note_hashes_in_tx = BoundedVec::new();\n let packed_note = BoundedVec::new();\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n packed_note,\n );\n\n assert_eq(discovered_notes.len(), 0);\n }\n\n #[test(should_fail_with = \"Failed to compute a note hash\")]\n unconstrained fn failed_hash_computation() {\n let unique_note_hashes_in_tx = BoundedVec::from_array([random()]);\n let packed_note = BoundedVec::new();\n let note_type_id = 0; // This note type id is unknown to compute_note_hash_and_nullifier\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n note_type_id,\n packed_note,\n );\n\n assert_eq(discovered_notes.len(), 0);\n }\n\n struct NoteAndData {\n note: MockNote,\n note_nonce: Field,\n note_hash: Field,\n unique_note_hash: Field,\n inner_nullifier: Field,\n }\n\n unconstrained fn construct_note(value: Field, note_index_in_tx: u32) -> NoteAndData {\n let note_nonce = compute_note_hash_nonce(FIRST_NULLIFIER_IN_TX, note_index_in_tx);\n\n let hinted_note = MockNote::new(value)\n .contract_address(CONTRACT_ADDRESS)\n .owner(OWNER)\n .randomness(RANDOMNESS)\n .storage_slot(STORAGE_SLOT)\n .note_metadata(SettledNoteMetadata::new(note_nonce).into())\n .build_hinted_note();\n let note = hinted_note.note;\n\n let note_hash = note.compute_note_hash(OWNER, STORAGE_SLOT, RANDOMNESS);\n let unique_note_hash = compute_unique_note_hash(\n note_nonce,\n compute_siloed_note_hash(CONTRACT_ADDRESS, note_hash),\n );\n let inner_nullifier = note\n .compute_nullifier_unconstrained(OWNER, compute_note_hash_for_nullification(hinted_note))\n .expect(f\"Could not compute nullifier for note owned by {OWNER}\");\n\n NoteAndData { note, note_nonce, note_hash, unique_note_hash, inner_nullifier }\n }\n\n #[test]\n unconstrained fn single_note() {\n let note_index_in_tx = 2;\n let note_and_data = construct_note(VALUE, note_index_in_tx);\n\n let mut unique_note_hashes_in_tx = BoundedVec::from_array([\n random(), random(), random(), random(), random(), random(), random(),\n ]);\n unique_note_hashes_in_tx.set(note_index_in_tx, note_and_data.unique_note_hash);\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n BoundedVec::from_array(note_and_data.note.pack()),\n );\n\n assert_eq(discovered_notes.len(), 1);\n let discovered_note = discovered_notes.get(0);\n\n assert_eq(discovered_note.note_nonce, note_and_data.note_nonce);\n assert_eq(discovered_note.note_hash, note_and_data.note_hash);\n assert_eq(discovered_note.inner_nullifier, note_and_data.inner_nullifier);\n }\n\n #[test]\n unconstrained fn multiple_notes_same_preimage() {\n let first_note_index_in_tx = 3;\n let first_note_and_data = construct_note(VALUE, first_note_index_in_tx);\n\n let second_note_index_in_tx = 5;\n let second_note_and_data = construct_note(VALUE, second_note_index_in_tx);\n\n // Both notes have the same preimage (and therefore packed representation), so both should be found in the same\n // call.\n assert_eq(first_note_and_data.note, second_note_and_data.note);\n let packed_note = first_note_and_data.note.pack();\n\n let mut unique_note_hashes_in_tx = BoundedVec::from_array([\n random(), random(), random(), random(), random(), random(), random(),\n ]);\n unique_note_hashes_in_tx.set(first_note_index_in_tx, first_note_and_data.unique_note_hash);\n unique_note_hashes_in_tx.set(second_note_index_in_tx, second_note_and_data.unique_note_hash);\n\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n FIRST_NULLIFIER_IN_TX,\n compute_note_hash_and_nullifier,\n CONTRACT_ADDRESS,\n OWNER,\n STORAGE_SLOT,\n RANDOMNESS,\n MockNote::get_id(),\n BoundedVec::from_array(packed_note),\n );\n\n assert_eq(discovered_notes.len(), 2);\n\n assert(discovered_notes.any(|discovered_note| {\n (discovered_note.note_nonce == first_note_and_data.note_nonce)\n & (discovered_note.note_hash == first_note_and_data.note_hash)\n & (discovered_note.inner_nullifier == first_note_and_data.inner_nullifier)\n }));\n\n assert(discovered_notes.any(|discovered_note| {\n (discovered_note.note_nonce == second_note_and_data.note_nonce)\n & (discovered_note.note_hash == second_note_and_data.note_hash)\n & (discovered_note.inner_nullifier == second_note_and_data.inner_nullifier)\n }));\n }\n}\n"
790
790
  },
791
791
  "126": {
792
792
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/partial_notes.nr",
793
- "source": "use crate::{\n capsules::CapsuleArray,\n messages::{\n discovery::{ComputeNoteHashAndNullifier, nonce_discovery::attempt_note_nonce_discovery},\n encoding::MAX_MESSAGE_CONTENT_LEN,\n logs::partial_note::{decode_partial_note_private_message, MAX_PARTIAL_NOTE_PRIVATE_PACKED_LEN},\n processing::{\n enqueue_note_for_validation, get_pending_partial_notes_completion_logs,\n log_retrieval_response::LogRetrievalResponse,\n },\n },\n utils::array,\n};\n\nuse crate::protocol::{\n address::AztecAddress,\n debug_log::debug_log_format,\n hash::sha256_to_field,\n traits::{Deserialize, Serialize},\n};\n\n/// The slot in the PXE capsules where we store a `CapsuleArray` of `DeliveredPendingPartialNote`.\npub global DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT: Field = sha256_to_field(\n \"AZTEC_NR::DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT\".as_bytes(),\n);\n\n/// A partial note that was delivered but is still pending completion. Contains the information necessary to find the\n/// log that will complete it and lead to a note being discovered and delivered.\n#[derive(Serialize, Deserialize)]\npub(crate) struct DeliveredPendingPartialNote {\n pub(crate) owner: AztecAddress,\n pub(crate) storage_slot: Field,\n pub(crate) randomness: Field,\n pub(crate) note_completion_log_tag: Field,\n pub(crate) note_type_id: Field,\n pub(crate) packed_private_note_content: BoundedVec<Field, MAX_PARTIAL_NOTE_PRIVATE_PACKED_LEN>,\n pub(crate) recipient: AztecAddress,\n}\n\npub unconstrained fn process_partial_note_private_msg(\n contract_address: AztecAddress,\n recipient: AztecAddress,\n msg_metadata: u64,\n msg_content: BoundedVec<Field, MAX_MESSAGE_CONTENT_LEN>,\n) {\n // We store the information of the partial note we found in a persistent capsule in PXE, so that we can later\n // search for the public log that will complete it.\n let (owner, storage_slot, randomness, note_completion_log_tag, note_type_id, packed_private_note_content) =\n decode_partial_note_private_message(msg_metadata, msg_content);\n\n let pending = DeliveredPendingPartialNote {\n owner,\n storage_slot,\n randomness,\n note_completion_log_tag,\n note_type_id,\n packed_private_note_content,\n recipient,\n };\n\n CapsuleArray::at(\n contract_address,\n DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT,\n )\n .push(pending);\n}\n\n/// Searches for logs that would result in the completion of pending partial notes, ultimately resulting in the notes\n/// being delivered to PXE if completed.\npub unconstrained fn fetch_and_process_partial_note_completion_logs<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n) {\n let pending_partial_notes = CapsuleArray::at(\n contract_address,\n DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT,\n );\n\n debug_log_format(\n \"{} pending partial notes\",\n [pending_partial_notes.len() as Field],\n );\n\n // Each of the pending partial notes might get completed by a log containing its public values. For performance\n // reasons, we fetch all of these logs concurrently and then process them one by one, minimizing the amount of time\n // waiting for the node roundtrip.\n let maybe_completion_logs = get_pending_partial_notes_completion_logs(contract_address, pending_partial_notes);\n\n // Each entry in the maybe completion logs array corresponds to the entry in the pending partial notes array at the\n // same index. This means we can use the same index as we iterate through the responses to get both the partial\n // note and the log that might complete it.\n assert_eq(maybe_completion_logs.len(), pending_partial_notes.len());\n\n maybe_completion_logs.for_each(|i, maybe_log: Option<LogRetrievalResponse>| {\n // We clear the completion logs as we read them so that the array is empty by the time we next query it.\n // TODO(#14943): use volatile arrays to avoid having to manually clear this.\n maybe_completion_logs.remove(i);\n\n let pending_partial_note = pending_partial_notes.get(i);\n\n if maybe_log.is_none() {\n debug_log_format(\n \"Found no completion logs for partial note with tag {}\",\n [pending_partial_note.note_completion_log_tag],\n );\n\n // Note that we're not removing the pending partial note from the capsule array, so we will continue\n // searching for this tagged log when performing message discovery in the future until we either find it or\n // the entry is somehow removed from the array.\n } else {\n debug_log_format(\n \"Completion log found for partial note with tag {}\",\n [pending_partial_note.note_completion_log_tag],\n );\n let log = maybe_log.unwrap();\n\n // Public fields are assumed to all be placed at the end of the packed representation, so we combine the\n // private and public packed fields (i.e. the contents of the private message and public log plaintext to\n // get the complete packed content.\n let complete_packed_note = array::append(\n pending_partial_note.packed_private_note_content,\n log.log_payload,\n );\n\n let discovered_notes = attempt_note_nonce_discovery(\n log.unique_note_hashes_in_tx,\n log.first_nullifier_in_tx,\n compute_note_hash_and_nullifier,\n contract_address,\n pending_partial_note.owner,\n pending_partial_note.storage_slot,\n pending_partial_note.randomness,\n pending_partial_note.note_type_id,\n complete_packed_note,\n );\n\n // TODO(#11627): is there anything reasonable we can do if we get a log but it doesn't result in a note\n // being found?\n if discovered_notes.len() == 0 {\n panic(\n f\"A partial note's completion log did not result in any notes being found - this should never happen\",\n );\n }\n\n debug_log_format(\n \"Discovered {0} notes for partial note with tag {1}\",\n [discovered_notes.len() as Field, pending_partial_note.note_completion_log_tag],\n );\n\n discovered_notes.for_each(|discovered_note| {\n enqueue_note_for_validation(\n contract_address,\n pending_partial_note.owner,\n pending_partial_note.storage_slot,\n pending_partial_note.randomness,\n discovered_note.note_nonce,\n complete_packed_note,\n discovered_note.note_hash,\n discovered_note.inner_nullifier,\n log.tx_hash,\n pending_partial_note.recipient,\n );\n });\n\n // Because there is only a single log for a given tag, once we've processed the tagged log then we simply\n // delete the pending work entry, regardless of whether it was actually completed or not.\n pending_partial_notes.remove(i);\n }\n });\n}\n"
793
+ "source": "use crate::{\n capsules::CapsuleArray,\n messages::{\n discovery::{ComputeNoteHashAndNullifier, nonce_discovery::attempt_note_nonce_discovery},\n encoding::MAX_MESSAGE_CONTENT_LEN,\n logs::partial_note::{decode_partial_note_private_message, MAX_PARTIAL_NOTE_PRIVATE_PACKED_LEN},\n processing::{\n enqueue_note_for_validation, get_pending_partial_notes_completion_logs,\n log_retrieval_response::LogRetrievalResponse,\n },\n },\n utils::array,\n};\n\nuse crate::protocol::{\n address::AztecAddress,\n hash::sha256_to_field,\n logging::debug_log_format,\n traits::{Deserialize, Serialize},\n};\n\n/// The slot in the PXE capsules where we store a `CapsuleArray` of `DeliveredPendingPartialNote`.\npub global DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT: Field = sha256_to_field(\n \"AZTEC_NR::DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT\".as_bytes(),\n);\n\n/// A partial note that was delivered but is still pending completion. Contains the information necessary to find the\n/// log that will complete it and lead to a note being discovered and delivered.\n#[derive(Serialize, Deserialize)]\npub(crate) struct DeliveredPendingPartialNote {\n pub(crate) owner: AztecAddress,\n pub(crate) storage_slot: Field,\n pub(crate) randomness: Field,\n pub(crate) note_completion_log_tag: Field,\n pub(crate) note_type_id: Field,\n pub(crate) packed_private_note_content: BoundedVec<Field, MAX_PARTIAL_NOTE_PRIVATE_PACKED_LEN>,\n pub(crate) recipient: AztecAddress,\n}\n\npub unconstrained fn process_partial_note_private_msg(\n contract_address: AztecAddress,\n recipient: AztecAddress,\n msg_metadata: u64,\n msg_content: BoundedVec<Field, MAX_MESSAGE_CONTENT_LEN>,\n) {\n // We store the information of the partial note we found in a persistent capsule in PXE, so that we can later\n // search for the public log that will complete it.\n let (owner, storage_slot, randomness, note_completion_log_tag, note_type_id, packed_private_note_content) =\n decode_partial_note_private_message(msg_metadata, msg_content);\n\n let pending = DeliveredPendingPartialNote {\n owner,\n storage_slot,\n randomness,\n note_completion_log_tag,\n note_type_id,\n packed_private_note_content,\n recipient,\n };\n\n CapsuleArray::at(\n contract_address,\n DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT,\n )\n .push(pending);\n}\n\n/// Searches for logs that would result in the completion of pending partial notes, ultimately resulting in the notes\n/// being delivered to PXE if completed.\npub unconstrained fn fetch_and_process_partial_note_completion_logs<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n) {\n let pending_partial_notes = CapsuleArray::at(\n contract_address,\n DELIVERED_PENDING_PARTIAL_NOTE_ARRAY_LENGTH_CAPSULES_SLOT,\n );\n\n debug_log_format(\n \"{} pending partial notes\",\n [pending_partial_notes.len() as Field],\n );\n\n // Each of the pending partial notes might get completed by a log containing its public values. For performance\n // reasons, we fetch all of these logs concurrently and then process them one by one, minimizing the amount of time\n // waiting for the node roundtrip.\n let maybe_completion_logs = get_pending_partial_notes_completion_logs(contract_address, pending_partial_notes);\n\n // Each entry in the maybe completion logs array corresponds to the entry in the pending partial notes array at the\n // same index. This means we can use the same index as we iterate through the responses to get both the partial\n // note and the log that might complete it.\n assert_eq(maybe_completion_logs.len(), pending_partial_notes.len());\n\n maybe_completion_logs.for_each(|i, maybe_log: Option<LogRetrievalResponse>| {\n // We clear the completion logs as we read them so that the array is empty by the time we next query it.\n // TODO(#14943): use volatile arrays to avoid having to manually clear this.\n maybe_completion_logs.remove(i);\n\n let pending_partial_note = pending_partial_notes.get(i);\n\n if maybe_log.is_none() {\n debug_log_format(\n \"Found no completion logs for partial note with tag {}\",\n [pending_partial_note.note_completion_log_tag],\n );\n\n // Note that we're not removing the pending partial note from the capsule array, so we will continue\n // searching for this tagged log when performing message discovery in the future until we either find it or\n // the entry is somehow removed from the array.\n } else {\n debug_log_format(\n \"Completion log found for partial note with tag {}\",\n [pending_partial_note.note_completion_log_tag],\n );\n let log = maybe_log.unwrap();\n\n // Public fields are assumed to all be placed at the end of the packed representation, so we combine the\n // private and public packed fields (i.e. the contents of the private message and public log plaintext to\n // get the complete packed content.\n let complete_packed_note = array::append(\n pending_partial_note.packed_private_note_content,\n log.log_payload,\n );\n\n let discovered_notes = attempt_note_nonce_discovery(\n log.unique_note_hashes_in_tx,\n log.first_nullifier_in_tx,\n compute_note_hash_and_nullifier,\n contract_address,\n pending_partial_note.owner,\n pending_partial_note.storage_slot,\n pending_partial_note.randomness,\n pending_partial_note.note_type_id,\n complete_packed_note,\n );\n\n // TODO(#11627): is there anything reasonable we can do if we get a log but it doesn't result in a note\n // being found?\n if discovered_notes.len() == 0 {\n panic(\n f\"A partial note's completion log did not result in any notes being found - this should never happen\",\n );\n }\n\n debug_log_format(\n \"Discovered {0} notes for partial note with tag {1}\",\n [discovered_notes.len() as Field, pending_partial_note.note_completion_log_tag],\n );\n\n discovered_notes.for_each(|discovered_note| {\n enqueue_note_for_validation(\n contract_address,\n pending_partial_note.owner,\n pending_partial_note.storage_slot,\n pending_partial_note.randomness,\n discovered_note.note_nonce,\n complete_packed_note,\n discovered_note.note_hash,\n discovered_note.inner_nullifier,\n log.tx_hash,\n pending_partial_note.recipient,\n );\n });\n\n // Because there is only a single log for a given tag, once we've processed the tagged log then we simply\n // delete the pending work entry, regardless of whether it was actually completed or not.\n pending_partial_notes.remove(i);\n }\n });\n}\n"
794
794
  },
795
795
  "127": {
796
796
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/private_events.nr",
@@ -798,11 +798,11 @@
798
798
  },
799
799
  "128": {
800
800
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/private_notes.nr",
801
- "source": "use crate::messages::{\n discovery::{ComputeNoteHashAndNullifier, nonce_discovery::attempt_note_nonce_discovery},\n encoding::MAX_MESSAGE_CONTENT_LEN,\n logs::note::{decode_private_note_message, MAX_NOTE_PACKED_LEN},\n processing::enqueue_note_for_validation,\n};\nuse crate::protocol::{address::AztecAddress, constants::MAX_NOTE_HASHES_PER_TX, debug_log::debug_log_format};\n\npub unconstrained fn process_private_note_msg<Env>(\n contract_address: AztecAddress,\n tx_hash: Field,\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n recipient: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n msg_metadata: u64,\n msg_content: BoundedVec<Field, MAX_MESSAGE_CONTENT_LEN>,\n) {\n let (note_type_id, owner, storage_slot, randomness, packed_note) =\n decode_private_note_message(msg_metadata, msg_content);\n\n attempt_note_discovery(\n contract_address,\n tx_hash,\n unique_note_hashes_in_tx,\n first_nullifier_in_tx,\n recipient,\n compute_note_hash_and_nullifier,\n owner,\n storage_slot,\n randomness,\n note_type_id,\n packed_note,\n );\n}\n\n/// Attempts discovery of a note given information about its contents and the transaction in which it is suspected the\n/// note was created.\npub unconstrained fn attempt_note_discovery<Env>(\n contract_address: AztecAddress,\n tx_hash: Field,\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n recipient: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n owner: AztecAddress,\n storage_slot: Field,\n randomness: Field,\n note_type_id: Field,\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n) {\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n first_nullifier_in_tx,\n compute_note_hash_and_nullifier,\n contract_address,\n owner,\n storage_slot,\n randomness,\n note_type_id,\n packed_note,\n );\n\n debug_log_format(\n \"Discovered {0} notes from a private message\",\n [discovered_notes.len() as Field],\n );\n\n discovered_notes.for_each(|discovered_note| {\n enqueue_note_for_validation(\n contract_address,\n owner,\n storage_slot,\n randomness,\n discovered_note.note_nonce,\n packed_note,\n discovered_note.note_hash,\n discovered_note.inner_nullifier,\n tx_hash,\n recipient,\n );\n });\n}\n"
801
+ "source": "use crate::messages::{\n discovery::{ComputeNoteHashAndNullifier, nonce_discovery::attempt_note_nonce_discovery},\n encoding::MAX_MESSAGE_CONTENT_LEN,\n logs::note::{decode_private_note_message, MAX_NOTE_PACKED_LEN},\n processing::enqueue_note_for_validation,\n};\nuse crate::protocol::{address::AztecAddress, constants::MAX_NOTE_HASHES_PER_TX, logging::debug_log_format};\n\npub unconstrained fn process_private_note_msg<Env>(\n contract_address: AztecAddress,\n tx_hash: Field,\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n recipient: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n msg_metadata: u64,\n msg_content: BoundedVec<Field, MAX_MESSAGE_CONTENT_LEN>,\n) {\n let (note_type_id, owner, storage_slot, randomness, packed_note) =\n decode_private_note_message(msg_metadata, msg_content);\n\n attempt_note_discovery(\n contract_address,\n tx_hash,\n unique_note_hashes_in_tx,\n first_nullifier_in_tx,\n recipient,\n compute_note_hash_and_nullifier,\n owner,\n storage_slot,\n randomness,\n note_type_id,\n packed_note,\n );\n}\n\n/// Attempts discovery of a note given information about its contents and the transaction in which it is suspected the\n/// note was created.\npub unconstrained fn attempt_note_discovery<Env>(\n contract_address: AztecAddress,\n tx_hash: Field,\n unique_note_hashes_in_tx: BoundedVec<Field, MAX_NOTE_HASHES_PER_TX>,\n first_nullifier_in_tx: Field,\n recipient: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n owner: AztecAddress,\n storage_slot: Field,\n randomness: Field,\n note_type_id: Field,\n packed_note: BoundedVec<Field, MAX_NOTE_PACKED_LEN>,\n) {\n let discovered_notes = attempt_note_nonce_discovery(\n unique_note_hashes_in_tx,\n first_nullifier_in_tx,\n compute_note_hash_and_nullifier,\n contract_address,\n owner,\n storage_slot,\n randomness,\n note_type_id,\n packed_note,\n );\n\n debug_log_format(\n \"Discovered {0} notes from a private message\",\n [discovered_notes.len() as Field],\n );\n\n discovered_notes.for_each(|discovered_note| {\n enqueue_note_for_validation(\n contract_address,\n owner,\n storage_slot,\n randomness,\n discovered_note.note_nonce,\n packed_note,\n discovered_note.note_hash,\n discovered_note.inner_nullifier,\n tx_hash,\n recipient,\n );\n });\n}\n"
802
802
  },
803
803
  "129": {
804
804
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/discovery/process_message.nr",
805
- "source": "use crate::messages::{\n discovery::{\n ComputeNoteHashAndNullifier, partial_notes::process_partial_note_private_msg,\n private_events::process_private_event_msg, private_notes::process_private_note_msg,\n },\n encoding::{decode_message, MESSAGE_CIPHERTEXT_LEN, MESSAGE_PLAINTEXT_LEN},\n encryption::{aes128::AES128, message_encryption::MessageEncryption},\n msg_type::{PARTIAL_NOTE_PRIVATE_MSG_TYPE_ID, PRIVATE_EVENT_MSG_TYPE_ID, PRIVATE_NOTE_MSG_TYPE_ID},\n processing::MessageContext,\n};\n\nuse crate::protocol::{address::AztecAddress, debug_log::{debug_log, debug_log_format}};\n\n/// Processes a message that can contain notes, partial notes, or events.\n///\n/// Notes result in nonce discovery being performed prior to delivery, which requires knowledge of the transaction hash\n/// in which the notes would've been created (typically the same transaction in which the log was emitted), along with\n/// the list of unique note hashes in said transaction and the `compute_note_hash_and_nullifier` function. Once\n/// discovered, the notes are enqueued for validation.\n///\n/// Partial notes result in a pending partial note entry being stored in a PXE capsule, which will later be retrieved\n/// to search for the note's completion public log.\n///\n/// Events are processed by computing an event commitment from the serialized event data and its randomness field, then\n/// enqueueing the event data and commitment for validation.\npub unconstrained fn process_message_ciphertext<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n message_ciphertext: BoundedVec<Field, MESSAGE_CIPHERTEXT_LEN>,\n message_context: MessageContext,\n) {\n let message_plaintext_option = AES128::decrypt(message_ciphertext, message_context.recipient);\n\n if message_plaintext_option.is_some() {\n process_message_plaintext(\n contract_address,\n compute_note_hash_and_nullifier,\n message_plaintext_option.unwrap(),\n message_context,\n );\n } else {\n debug_log_format(\n \"Found invalid message from tx {0}, ignoring\",\n [message_context.tx_hash],\n );\n }\n}\n\npub unconstrained fn process_message_plaintext<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n message_plaintext: BoundedVec<Field, MESSAGE_PLAINTEXT_LEN>,\n message_context: MessageContext,\n) {\n // The first thing to do after decrypting the message is to determine what type of message we're processing. We\n // have 3 message types: private notes, partial notes and events.\n\n // We decode the message to obtain the message type id, metadata and content.\n let (msg_type_id, msg_metadata, msg_content) = decode_message(message_plaintext);\n\n if msg_type_id == PRIVATE_NOTE_MSG_TYPE_ID {\n debug_log(\"Processing private note msg\");\n\n process_private_note_msg(\n contract_address,\n message_context.tx_hash,\n message_context.unique_note_hashes_in_tx,\n message_context.first_nullifier_in_tx,\n message_context.recipient,\n compute_note_hash_and_nullifier,\n msg_metadata,\n msg_content,\n );\n } else if msg_type_id == PARTIAL_NOTE_PRIVATE_MSG_TYPE_ID {\n debug_log(\"Processing partial note private msg\");\n\n process_partial_note_private_msg(\n contract_address,\n message_context.recipient,\n msg_metadata,\n msg_content,\n );\n } else if msg_type_id == PRIVATE_EVENT_MSG_TYPE_ID {\n debug_log(\"Processing private event msg\");\n\n process_private_event_msg(\n contract_address,\n message_context.recipient,\n msg_metadata,\n msg_content,\n message_context.tx_hash,\n );\n } else {\n debug_log_format(\"Unknown msg type id {0}\", [msg_type_id as Field]);\n }\n}\n"
805
+ "source": "use crate::messages::{\n discovery::{\n ComputeNoteHashAndNullifier, partial_notes::process_partial_note_private_msg,\n private_events::process_private_event_msg, private_notes::process_private_note_msg,\n },\n encoding::{decode_message, MESSAGE_CIPHERTEXT_LEN, MESSAGE_PLAINTEXT_LEN},\n encryption::{aes128::AES128, message_encryption::MessageEncryption},\n msg_type::{PARTIAL_NOTE_PRIVATE_MSG_TYPE_ID, PRIVATE_EVENT_MSG_TYPE_ID, PRIVATE_NOTE_MSG_TYPE_ID},\n processing::MessageContext,\n};\n\nuse crate::protocol::{address::AztecAddress, logging::{debug_log, debug_log_format}};\n\n/// Processes a message that can contain notes, partial notes, or events.\n///\n/// Notes result in nonce discovery being performed prior to delivery, which requires knowledge of the transaction hash\n/// in which the notes would've been created (typically the same transaction in which the log was emitted), along with\n/// the list of unique note hashes in said transaction and the `compute_note_hash_and_nullifier` function. Once\n/// discovered, the notes are enqueued for validation.\n///\n/// Partial notes result in a pending partial note entry being stored in a PXE capsule, which will later be retrieved\n/// to search for the note's completion public log.\n///\n/// Events are processed by computing an event commitment from the serialized event data and its randomness field, then\n/// enqueueing the event data and commitment for validation.\npub unconstrained fn process_message_ciphertext<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n message_ciphertext: BoundedVec<Field, MESSAGE_CIPHERTEXT_LEN>,\n message_context: MessageContext,\n) {\n let message_plaintext_option = AES128::decrypt(message_ciphertext, message_context.recipient);\n\n if message_plaintext_option.is_some() {\n process_message_plaintext(\n contract_address,\n compute_note_hash_and_nullifier,\n message_plaintext_option.unwrap(),\n message_context,\n );\n } else {\n debug_log_format(\n \"Found invalid message from tx {0}, ignoring\",\n [message_context.tx_hash],\n );\n }\n}\n\npub unconstrained fn process_message_plaintext<Env>(\n contract_address: AztecAddress,\n compute_note_hash_and_nullifier: ComputeNoteHashAndNullifier<Env>,\n message_plaintext: BoundedVec<Field, MESSAGE_PLAINTEXT_LEN>,\n message_context: MessageContext,\n) {\n // The first thing to do after decrypting the message is to determine what type of message we're processing. We\n // have 3 message types: private notes, partial notes and events.\n\n // We decode the message to obtain the message type id, metadata and content.\n let (msg_type_id, msg_metadata, msg_content) = decode_message(message_plaintext);\n\n if msg_type_id == PRIVATE_NOTE_MSG_TYPE_ID {\n debug_log(\"Processing private note msg\");\n\n process_private_note_msg(\n contract_address,\n message_context.tx_hash,\n message_context.unique_note_hashes_in_tx,\n message_context.first_nullifier_in_tx,\n message_context.recipient,\n compute_note_hash_and_nullifier,\n msg_metadata,\n msg_content,\n );\n } else if msg_type_id == PARTIAL_NOTE_PRIVATE_MSG_TYPE_ID {\n debug_log(\"Processing partial note private msg\");\n\n process_partial_note_private_msg(\n contract_address,\n message_context.recipient,\n msg_metadata,\n msg_content,\n );\n } else if msg_type_id == PRIVATE_EVENT_MSG_TYPE_ID {\n debug_log(\"Processing private event msg\");\n\n process_private_event_msg(\n contract_address,\n message_context.recipient,\n msg_metadata,\n msg_content,\n message_context.tx_hash,\n );\n } else {\n debug_log_format(\"Unknown msg type id {0}\", [msg_type_id as Field]);\n }\n}\n"
806
806
  },
807
807
  "130": {
808
808
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/messages/encoding.nr",
@@ -834,7 +834,7 @@
834
834
  },
835
835
  "170": {
836
836
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/oracle/avm.nr",
837
- "source": "//! AVM oracles.\n//!\n//! There are only available during public execution. Calling any of them from a private or utility function will\n//! result in runtime errors.\n\nuse crate::protocol::address::{AztecAddress, EthAddress};\n\npub unconstrained fn address() -> AztecAddress {\n address_opcode()\n}\npub unconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\npub unconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\npub unconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\npub unconstrained fn version() -> Field {\n version_opcode()\n}\npub unconstrained fn block_number() -> u32 {\n block_number_opcode()\n}\npub unconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\npub unconstrained fn min_fee_per_l2_gas() -> u128 {\n min_fee_per_l2_gas_opcode()\n}\npub unconstrained fn min_fee_per_da_gas() -> u128 {\n min_fee_per_da_gas_opcode()\n}\npub unconstrained fn l2_gas_left() -> u32 {\n l2_gas_left_opcode()\n}\npub unconstrained fn da_gas_left() -> u32 {\n da_gas_left_opcode()\n}\npub unconstrained fn is_static_call() -> u1 {\n is_static_call_opcode()\n}\npub unconstrained fn note_hash_exists(note_hash: Field, leaf_index: u64) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\npub unconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\npub unconstrained fn nullifier_exists(siloed_nullifier: Field) -> u1 {\n nullifier_exists_opcode(siloed_nullifier)\n}\npub unconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\npub unconstrained fn emit_public_log(message: [Field]) {\n emit_public_log_opcode(message)\n}\npub unconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: u64) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\npub unconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\n\npub unconstrained fn call<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn call_static<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_static_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\n/// `success_copy` is placed immediately after the CALL opcode to get the success value\npub unconstrained fn success_copy() -> bool {\n success_copy_opcode()\n}\n\npub unconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\npub unconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\n/// The additional prefix is to avoid clashing with the `return` Noir keyword.\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n/// This opcode reverts using the exact data given. In general it should only be used to do rethrows, where the revert\n/// data is the same as the original revert data. For normal reverts, use Noir's `assert` which, on top of reverting,\n/// will also add an error selector to the revert data.\npub unconstrained fn revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\npub unconstrained fn storage_read(storage_slot: Field, contract_address: Field) -> Field {\n storage_read_opcode(storage_slot, contract_address)\n}\n\npub unconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeMinFeePerL2Gas)]\nunconstrained fn min_fee_per_l2_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeMinFeePerDaGas)]\nunconstrained fn min_fee_per_da_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> u1 {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(siloed_nullifier: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n// TODO(#11124): rename unencrypted to public in avm\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_public_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCalldataCopy)]\nunconstrained fn calldata_copy_opcode<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {}\n\n#[oracle(avmOpcodeReturndataSize)]\nunconstrained fn returndata_size_opcode() -> u32 {}\n\n#[oracle(avmOpcodeReturndataCopy)]\nunconstrained fn returndata_copy_opcode(rdoffset: u32, copy_size: u32) -> [Field] {}\n\n#[oracle(avmOpcodeReturn)]\nunconstrained fn return_opcode(returndata: [Field]) {}\n\n#[oracle(avmOpcodeRevert)]\nunconstrained fn revert_opcode(revertdata: [Field]) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n#[oracle(avmOpcodeSuccessCopy)]\nunconstrained fn success_copy_opcode() -> bool {}\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode(storage_slot: Field, contract_address: Field) -> Field {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode(storage_slot: Field, value: Field) {}\n"
837
+ "source": "//! AVM oracles.\n//!\n//! There are only available during public execution. Calling any of them from a private or utility function will\n//! result in runtime errors.\n\nuse crate::protocol::address::{AztecAddress, EthAddress};\n\npub unconstrained fn address() -> AztecAddress {\n address_opcode()\n}\npub unconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\npub unconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\npub unconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\npub unconstrained fn version() -> Field {\n version_opcode()\n}\npub unconstrained fn block_number() -> u32 {\n block_number_opcode()\n}\npub unconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\npub unconstrained fn min_fee_per_l2_gas() -> u128 {\n min_fee_per_l2_gas_opcode()\n}\npub unconstrained fn min_fee_per_da_gas() -> u128 {\n min_fee_per_da_gas_opcode()\n}\npub unconstrained fn l2_gas_left() -> u32 {\n l2_gas_left_opcode()\n}\npub unconstrained fn da_gas_left() -> u32 {\n da_gas_left_opcode()\n}\npub unconstrained fn is_static_call() -> u1 {\n is_static_call_opcode()\n}\npub unconstrained fn note_hash_exists(note_hash: Field, leaf_index: u64) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\npub unconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\npub unconstrained fn nullifier_exists(siloed_nullifier: Field) -> u1 {\n nullifier_exists_opcode(siloed_nullifier)\n}\npub unconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\npub unconstrained fn emit_public_log(message: [Field]) {\n emit_public_log_opcode(message)\n}\npub unconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: u64) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\npub unconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\n\npub unconstrained fn call<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn call_static<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_static_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\n/// `success_copy` is placed immediately after the CALL opcode to get the success value\npub unconstrained fn success_copy() -> bool {\n success_copy_opcode()\n}\n\npub unconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\npub unconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\n/// The additional prefix is to avoid clashing with the `return` Noir keyword.\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n/// This opcode reverts using the exact data given. In general it should only be used to do rethrows, where the revert\n/// data is the same as the original revert data. For normal reverts, use Noir's `assert` which, on top of reverting,\n/// will also add an error selector to the revert data.\npub unconstrained fn revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\npub unconstrained fn storage_read(storage_slot: Field, contract_address: Field) -> Field {\n storage_read_opcode(storage_slot, contract_address)\n}\n\npub unconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeMinFeePerL2Gas)]\nunconstrained fn min_fee_per_l2_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeMinFeePerDaGas)]\nunconstrained fn min_fee_per_da_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> u1 {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(siloed_nullifier: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitPublicLog)]\nunconstrained fn emit_public_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCalldataCopy)]\nunconstrained fn calldata_copy_opcode<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {}\n\n#[oracle(avmOpcodeReturndataSize)]\nunconstrained fn returndata_size_opcode() -> u32 {}\n\n#[oracle(avmOpcodeReturndataCopy)]\nunconstrained fn returndata_copy_opcode(rdoffset: u32, copy_size: u32) -> [Field] {}\n\n#[oracle(avmOpcodeReturn)]\nunconstrained fn return_opcode(returndata: [Field]) {}\n\n#[oracle(avmOpcodeRevert)]\nunconstrained fn revert_opcode(revertdata: [Field]) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n#[oracle(avmOpcodeSuccessCopy)]\nunconstrained fn success_copy_opcode() -> bool {}\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode(storage_slot: Field, contract_address: Field) -> Field {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode(storage_slot: Field, value: Field) {}\n"
838
838
  },
839
839
  "173": {
840
840
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/oracle/capsules.nr",
@@ -896,13 +896,13 @@
896
896
  "path": "std/array/mod.nr",
897
897
  "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a vector.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_vector();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n pub fn as_vector(self) -> [T] {}\n\n /// Returns this array as a vector.\n /// This method is deprecated in favor of `as_vector`.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_slice();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n #[deprecated(\"This method has been renamed to `as_vector`\")]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n"
898
898
  },
899
- "341": {
900
- "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr",
901
- "source": "// TODO: Expose other wrapped functions than debug (info, warn)\n// ['silent', 'fatal', 'error', 'warn', 'info', 'verbose', 'debug', 'trace']\n\npub global SILENT_LOG_LEVEL: u8 = 0;\npub global FATAL_LOG_LEVEL: u8 = 1;\npub global ERROR_LOG_LEVEL: u8 = 2;\npub global WARN_LOG_LEVEL: u8 = 3;\npub global INFO_LOG_LEVEL: u8 = 4;\npub global VERBOSE_LOG_LEVEL: u8 = 5;\npub global DEBUG_LOG_LEVEL: u8 = 6;\npub global TRACE_LOG_LEVEL: u8 = 7;\n\n/// Utility function to console.log data in the acir simulator.\n/// Example:\n/// debug_log(\"blah blah this is a debug string\");\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\n/// Same as debug_log, but allows to customize the log level.\n/// Consider changing just to 'log'\npub fn debug_log_with_level<let N: u32>(log_level: u8, msg: str<N>) {\n debug_log_format_with_level(log_level, msg, []);\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` array.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n // Safety: This oracle call returns nothing: we only call it for its side effects. It is therefore always safe\n // to call.\n unsafe { debug_log_array_oracle_wrapper(DEBUG_LOG_LEVEL, msg, args) };\n}\n\n/// Same as debug_log_format, but allows to customize the log level.\n/// Consider changing just to 'log_format'\npub fn debug_log_format_with_level<let M: u32, let N: u32>(\n log_level: u8,\n msg: str<M>,\n args: [Field; N],\n) {\n // Safety: This oracle call returns nothing: we only call it for its side effects. It is therefore always safe\n // to call.\n unsafe { debug_log_array_oracle_wrapper(log_level, msg, args) };\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` slice.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole slice: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format_slice<let M: u32>(log_level: u8, msg: str<M>, args: [Field]) {\n // Safety: This oracle call returns nothing: we only call it for its side effects. It is therefore always safe\n // to call.\n unsafe { debug_log_slice_oracle_wrapper(log_level, msg, args) };\n}\n\n// We provide two versions of the debug log oracle: one that takes args as a slice and another one that takes args as an array.\n// We do this since conversion from array to slice generates overhead in public functions, since opcodes need to be emitted for the conversion.\n// By exposing the two flavors, we avoid conversions since the AVM is able to handle both arrays an slices in this oracle.\n\nunconstrained fn debug_log_slice_oracle_wrapper<let M: u32>(\n log_level: u8,\n msg: str<M>,\n args: [Field],\n) {\n debug_log_slice_oracle(log_level, msg, args);\n}\n\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n#[oracle(utilityDebugLog)]\nunconstrained fn debug_log_slice_oracle<let M: u32>(log_level: u8, msg: str<M>, args: [Field]) {}\n\nunconstrained fn debug_log_array_oracle_wrapper<let M: u32, let N: u32>(\n log_level: u8,\n msg: str<M>,\n args: [Field; N],\n) {\n debug_log_array_oracle(log_level, msg, N, args);\n}\n\n#[oracle(utilityDebugLog)]\nunconstrained fn debug_log_array_oracle<let M: u32, let N: u32>(\n log_level: u8,\n msg: str<M>,\n length: u32,\n args: [Field; N],\n) {}\n"
902
- },
903
- "351": {
899
+ "350": {
904
900
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
905
- "source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_log::{PrivateLog, PrivateLogData},\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_siloed_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n if siloed_note_hash == 0 {\n 0\n } else {\n compute_note_nonce_and_unique_note_hash(siloed_note_hash, first_nullifier, note_index_in_tx)\n }\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: Scoped<Counted<NoteHash>>) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_note_hash(note_hash.contract_address, note_hash.innermost())\n }\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn silo_nullifier(nullifier: Scoped<Counted<Nullifier>>) -> Field {\n let value = nullifier.innermost().value;\n // Q: shouldn't we be checking whether the _whole_ scoped, counted, nullifier struct is empty?\n // A: We don't have to. The init and inner circuits add a contract address only to non-empty nullifiers.\n // So we know we should silo it if the contract address is not empty.\n if nullifier.contract_address.is_zero() {\n // Return `.value` instead of 0, because already-siloed nullifiers also have a zero\n // contract_address field, and we of course want to return that already-siloed nullifier\n // (we just don't want to silo it a second time).\n value\n } else {\n compute_siloed_nullifier(nullifier.contract_address, value)\n }\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn silo_private_log(private_log: Scoped<Counted<PrivateLogData>>) -> PrivateLog {\n let log = private_log.innermost().log;\n if private_log.contract_address.is_zero() {\n log\n } else {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(private_log.contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n }\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n app_secret_key_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n app_secret_key_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = recipient.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\npub fn silo_l2_to_l1_message(\n msg: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.inner.recipient,\n msg.inner.content,\n rollup_version_id,\n chain_id,\n )\n }\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// NB the below is the same as poseidon::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check,\n// and absorbing in chunks of 3 below.\n#[no_predicates]\npub fn poseidon2_cheaper_variable_hash<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n let sub_chunk_hash = poseidon2_hash_subarray(input, in_len);\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len());\n assert(sub_chunk_hash == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_matches_variable() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n for i in 0..in_len {\n input[i] = 3;\n }\n let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len);\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(input, in_len);\n assert(variable_chunk_hash == variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0x3b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0xaab2a5828156782b12a1dc6f336e2bc627eb1b9514b02d511f66296990c050);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n ),\n version,\n chainId,\n );\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
901
+ "source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n key_type_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n key_type_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
902
+ },
903
+ "352": {
904
+ "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/logging.nr",
905
+ "source": "// Log levels matching the JS logger:\n\n// global SILENT_LOG_LEVEL: u8 = 0;\nglobal FATAL_LOG_LEVEL: u8 = 1;\nglobal ERROR_LOG_LEVEL: u8 = 2;\nglobal WARN_LOG_LEVEL: u8 = 3;\nglobal INFO_LOG_LEVEL: u8 = 4;\nglobal VERBOSE_LOG_LEVEL: u8 = 5;\nglobal DEBUG_LOG_LEVEL: u8 = 6;\nglobal TRACE_LOG_LEVEL: u8 = 7;\n\n// --- Per-level log functions (no format args) ---\n\npub fn fatal_log<let N: u32>(msg: str<N>) {\n fatal_log_format(msg, []);\n}\n\npub fn error_log<let N: u32>(msg: str<N>) {\n error_log_format(msg, []);\n}\n\npub fn warn_log<let N: u32>(msg: str<N>) {\n warn_log_format(msg, []);\n}\n\npub fn info_log<let N: u32>(msg: str<N>) {\n info_log_format(msg, []);\n}\n\npub fn verbose_log<let N: u32>(msg: str<N>) {\n verbose_log_format(msg, []);\n}\n\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\npub fn trace_log<let N: u32>(msg: str<N>) {\n trace_log_format(msg, []);\n}\n\n// --- Per-level log functions (with format args) ---\n\npub fn fatal_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(FATAL_LOG_LEVEL, msg, args);\n}\n\npub fn error_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(ERROR_LOG_LEVEL, msg, args);\n}\n\npub fn warn_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(WARN_LOG_LEVEL, msg, args);\n}\n\npub fn info_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(INFO_LOG_LEVEL, msg, args);\n}\n\npub fn verbose_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(VERBOSE_LOG_LEVEL, msg, args);\n}\n\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(DEBUG_LOG_LEVEL, msg, args);\n}\n\npub fn trace_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n log_format(TRACE_LOG_LEVEL, msg, args);\n}\n\nfn log_format<let M: u32, let N: u32>(log_level: u8, msg: str<M>, args: [Field; N]) {\n // Safety: This oracle call returns nothing: we only call it for its side effects. It is therefore always safe\n // to call.\n unsafe { log_oracle_wrapper(log_level, msg, args) };\n}\n\nunconstrained fn log_oracle_wrapper<let M: u32, let N: u32>(\n log_level: u8,\n msg: str<M>,\n args: [Field; N],\n) {\n log_oracle(log_level, msg, N, args);\n}\n\n#[oracle(utilityLog)]\nunconstrained fn log_oracle<let M: u32, let N: u32>(\n log_level: u8,\n msg: str<M>,\n length: u32,\n args: [Field; N],\n) {}\n"
906
906
  },
907
907
  "367": {
908
908
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/poseidon2.nr",