From 5ac3bfd43f3731aaefc787f57c88b3cedaca13cd Mon Sep 17 00:00:00 2001 From: Nico Chamo Date: Wed, 27 May 2026 15:55:18 +0000 Subject: [PATCH] refactor(aztec-nr): use constructor methods for MessageDelivery variants --- boxes/boxes/react/src/contracts/src/main.nr | 4 +- boxes/boxes/vite/src/contracts/src/main.nr | 4 +- .../framework-description/events_and_logs.md | 12 +-- .../framework-description/note_delivery.md | 22 ++--- .../framework-description/state_variables.md | 16 ++-- docs/docs-developers/docs/aztec-nr/index.md | 2 +- .../docs/aztec-nr/standards/escrow.md | 2 +- .../docs/resources/migration_notes.md | 15 ++++ .../contract_tutorials/counter_contract.md | 2 +- .../contracts/bob_token_contract/src/main.nr | 10 +-- .../contracts/counter_contract/src/main.nr | 4 +- docs/examples/contracts/nft/src/main.nr | 2 +- .../webapp-tutorial/contracts/src/main.nr | 2 +- .../contract_self/contract_self_private.nr | 4 +- .../aztec-nr/aztec/src/event/event_message.nr | 9 +- .../aztec/src/messages/message_delivery.nr | 87 ++++++++++--------- .../aztec-nr/aztec/src/note/note_message.nr | 25 +++--- .../aztec-nr/uint-note/src/uint_note.nr | 2 +- .../compile_failure/bob_token/src/main.nr | 10 +-- .../compile_failure/invalid_event/src/main.nr | 2 +- .../ecdsa_k_account_contract/src/main.nr | 2 +- .../ecdsa_r_account_contract/src/main.nr | 2 +- .../schnorr_account_contract/src/main.nr | 2 +- .../app/app_subscription_contract/src/main.nr | 4 +- .../app/card_game_contract/src/cards.nr | 2 +- .../app/crowdfunding_contract/src/main.nr | 2 +- .../contracts/app/escrow_contract/src/main.nr | 2 +- .../contracts/app/nft_contract/src/main.nr | 2 +- .../app/nft_contract/src/types/nft_note.nr | 2 +- .../app/private_token_contract/src/main.nr | 18 ++-- .../app/simple_token_contract/src/main.nr | 10 +-- .../app/token_blacklist_contract/src/main.nr | 10 +-- .../contracts/app/token_contract/src/main.nr | 24 ++--- .../handshake_registry_contract/src/main.nr | 4 +- .../test/benchmarking_contract/src/main.nr | 4 +- .../contracts/test/child_contract/src/main.nr | 2 +- .../test/counter/counter_contract/src/main.nr | 16 ++-- .../test/custom_message_contract/src/main.nr | 4 +- .../custom_sync_state_contract/src/main.nr | 2 +- .../test/event_only_contract/src/main.nr | 2 +- .../test/nested_utility_contract/src/main.nr | 2 +- .../test/no_constructor_contract/src/main.nr | 2 +- .../test/note_getter_contract/src/main.nr | 4 +- .../test/offchain_effect_contract/src/main.nr | 4 +- .../offchain_payment_contract/src/main.nr | 6 +- .../pending_note_hashes_contract/src/main.nr | 12 +-- .../private_init_test_contract/src/main.nr | 4 +- .../test/scope_test_contract/src/main.nr | 2 +- .../contracts/test/spam_contract/src/main.nr | 2 +- .../test/state_vars_contract/src/main.nr | 8 +- .../test/stateful_test_contract/src/main.nr | 6 +- .../test/static_child_contract/src/main.nr | 4 +- .../contracts/test/test_contract/src/main.nr | 4 +- .../test/test_log_contract/src/main.nr | 14 +-- .../test/updatable_contract/src/main.nr | 2 +- .../test/updated_contract/src/main.nr | 2 +- .../side_effect_contract/src/main.nr | 2 +- .../templates/counter/contract/src/main.nr | 4 +- 58 files changed, 232 insertions(+), 204 deletions(-) diff --git a/boxes/boxes/react/src/contracts/src/main.nr b/boxes/boxes/react/src/contracts/src/main.nr index c721bb21c9dc..8b8ae22a3461 100644 --- a/boxes/boxes/react/src/contracts/src/main.nr +++ b/boxes/boxes/react/src/contracts/src/main.nr @@ -21,14 +21,14 @@ contract BoxReact { let new_number = FieldNote { value: number }; self.storage.numbers.at(owner).initialize(new_number).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } #[external("private")] fn setNumber(number: Field, owner: AztecAddress) { self.storage.numbers.at(owner).replace(|_old| FieldNote { value: number }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/boxes/boxes/vite/src/contracts/src/main.nr b/boxes/boxes/vite/src/contracts/src/main.nr index c721bb21c9dc..8b8ae22a3461 100644 --- a/boxes/boxes/vite/src/contracts/src/main.nr +++ b/boxes/boxes/vite/src/contracts/src/main.nr @@ -21,14 +21,14 @@ contract BoxReact { let new_number = FieldNote { value: number }; self.storage.numbers.at(owner).initialize(new_number).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } #[external("private")] fn setNumber(number: Field, owner: AztecAddress) { self.storage.numbers.at(owner).replace(|_old| FieldNote { value: number }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/docs/docs-developers/docs/aztec-nr/framework-description/events_and_logs.md b/docs/docs-developers/docs/aztec-nr/framework-description/events_and_logs.md index 3931ce379ae5..1f7c9af2d67d 100644 --- a/docs/docs-developers/docs/aztec-nr/framework-description/events_and_logs.md +++ b/docs/docs-developers/docs/aztec-nr/framework-description/events_and_logs.md @@ -40,7 +40,7 @@ fn transfer(to: AztecAddress, amount: u128) { self.emit(Transfer { from, to, amount }).deliver_to( to, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); } ``` @@ -55,15 +55,15 @@ You can deliver the same event to multiple recipients with different delivery mo ```rust let message = self.emit(Transfer { from, to, amount }); -message.deliver_to(from, MessageDelivery.OFFCHAIN); -message.deliver_to(to, MessageDelivery.ONCHAIN_CONSTRAINED); +message.deliver_to(from, MessageDelivery::offchain()); +message.deliver_to(to, MessageDelivery::onchain_constrained()); ``` The `MessageDelivery` options are: -- **`ONCHAIN_CONSTRAINED`** - Constrained encryption with onchain delivery. Slowest proving but provides cryptographic guarantees that recipients can decrypt messages. -- **`ONCHAIN_UNCONSTRAINED`** - Unconstrained encryption with onchain delivery. Faster proving, but trusts the sender to encrypt correctly. -- **`OFFCHAIN`** - Unconstrained encryption with offchain delivery. Lowest cost, but requires custom infrastructure to deliver messages to recipients. +- **`onchain_constrained()`** - Constrained encryption with onchain delivery. Slowest proving but provides cryptographic guarantees that recipients can decrypt messages. +- **`onchain_unconstrained()`** - Unconstrained encryption with onchain delivery. Faster proving, but trusts the sender to encrypt correctly. +- **`offchain()`** - Unconstrained encryption with offchain delivery. Lowest cost, but requires custom infrastructure to deliver messages to recipients. :::note Emitting private events is optional. Onchain delivery publishes encrypted data to Ethereum blobs, inheriting Ethereum's data availability guarantees. You can choose to share information offchain instead. diff --git a/docs/docs-developers/docs/aztec-nr/framework-description/note_delivery.md b/docs/docs-developers/docs/aztec-nr/framework-description/note_delivery.md index 84ff696a8936..531f0c23ef1e 100644 --- a/docs/docs-developers/docs/aztec-nr/framework-description/note_delivery.md +++ b/docs/docs-developers/docs/aztec-nr/framework-description/note_delivery.md @@ -28,7 +28,7 @@ pub contract PrivateToken { fn mint(amount: u128, recipient: AztecAddress) { // Adding to the balance returns a MaybeNoteMessage self.storage.balances.at(recipient).add(amount) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); } } ``` @@ -37,7 +37,7 @@ pub contract PrivateToken { Aztec provides three delivery modes that offer different tradeoffs between cost, proving time, and guarantees: -### `MessageDelivery.OFFCHAIN` +### `MessageDelivery::offchain()` **Fully offchain delivery with no guarantees.** @@ -76,7 +76,7 @@ This is expected to be the most common delivery method when you don't need const ```rust // Change note - sender is motivated to deliver to themselves self.storage.balances.at(sender).add(change_amount) - .deliver(MessageDelivery.OFFCHAIN); + .deliver(MessageDelivery::offchain()); ``` :::info TODO @@ -119,7 +119,7 @@ await contract.methods.process_message(ciphertext, messageContext.toNoirStruct() See the [aztec.js documentation](../../aztec-js/index.md) for more details on accessing transaction effects. -### `MessageDelivery.ONCHAIN_UNCONSTRAINED` +### `MessageDelivery::onchain_unconstrained()` **Onchain delivery with no content guarantees.** @@ -133,10 +133,10 @@ This mode provides the same low proving time as `OFFCHAIN` while avoiding the ne ```rust // Minting to an admin who controls the contract self.storage.balances.at(admin).add(amount) - .deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + .deliver(MessageDelivery::onchain_unconstrained()); ``` -### `MessageDelivery.ONCHAIN_CONSTRAINED` +### `MessageDelivery::onchain_constrained()` **Onchain delivery with guaranteed correct content.** @@ -150,7 +150,7 @@ self.storage.balances.at(admin).add(amount) ```rust // Minting to an arbitrary recipient - must guarantee delivery self.storage.balances.at(recipient).add(amount) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); ``` ## Choosing a Delivery Mode @@ -199,7 +199,7 @@ You can deliver a note to an address other than the note's owner using `.deliver ```rust // Create a note owned by `owner` but deliver it to `auditor` self.storage.balances.at(owner).add(amount) - .deliver_to(auditor, MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver_to(auditor, MessageDelivery::onchain_constrained()); ``` **Important:** The recipient (e.g. an `auditor`) can see the note was created but **cannot use it** - only the owner can spend the note (this is authorized by the contract logic). The recipient also cannot see when/if the note is nullified. @@ -219,12 +219,12 @@ fn transfer(amount: u128, sender: AztecAddress, recipient: AztecAddress) { // Subtract from sender - unconstrained since sender is the caller self.storage.balances.at(sender) .sub(amount) - .deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + .deliver(MessageDelivery::onchain_unconstrained()); // Add to recipient - constrained delivery for untrusted sender self.storage.balances.at(recipient) .add(amount) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); } ``` @@ -238,6 +238,6 @@ fn constructor(admin: AztecAddress) { // Use unconstrained delivery since we don't know if deployer is incentivized self.storage.admin .initialize(AddressNote { address: admin }, admin) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); } ``` diff --git a/docs/docs-developers/docs/aztec-nr/framework-description/state_variables.md b/docs/docs-developers/docs/aztec-nr/framework-description/state_variables.md index 424e2b1fac72..54737d16d1ca 100644 --- a/docs/docs-developers/docs/aztec-nr/framework-description/state_variables.md +++ b/docs/docs-developers/docs/aztec-nr/framework-description/state_variables.md @@ -273,9 +273,9 @@ When working with private state variables, many operations return a `NoteMessage #### Delivery Methods Private notes need to be communicated to their recipients so they know the note exists and can use it. The [`NoteMessage`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/note/struct.NoteMessage) wrapper forces you to make an explicit choice about how this happens: - - [`MessageDelivery.ONCHAIN_CONSTRAINED`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDeliveryEnum#structfield.ONCHAIN_CONSTRAINED): Verified in the circuit (most secure, but highest cost) - Use when the sender cannot be trusted to deliver correctly (e.g., protocol fees, multisig config updates). **Warning:** Currently [not fully constrained](https://github.com/AztecProtocol/aztec-packages/issues/14565) - the log's tag is unconstrained. - - [`MessageDelivery.ONCHAIN_UNCONSTRAINED`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDeliveryEnum#structfield.ONCHAIN_UNCONSTRAINED): Message stored onchain but no guarantees on content - Use when the sender is incentivized to deliver correctly but may not have an offchain channel to the recipient. - - [`MessageDelivery.OFFCHAIN`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDeliveryEnum#structfield.OFFCHAIN): Lowest cost, no onchain data - Use when the sender and recipient can communicate and the sender is incentivized to deliver correctly. + - [`MessageDelivery::onchain_constrained()`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDelivery#method.onchain_constrained): Verified in the circuit (most secure, but highest cost) - Use when the sender cannot be trusted to deliver correctly (e.g., protocol fees, multisig config updates). **Warning:** Currently [not fully constrained](https://github.com/AztecProtocol/aztec-packages/issues/14565) - the log's tag is unconstrained. + - [`MessageDelivery::onchain_unconstrained()`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDelivery#method.onchain_unconstrained): Message stored onchain but no guarantees on content - Use when the sender is incentivized to deliver correctly but may not have an offchain channel to the recipient. + - [`MessageDelivery::offchain()`](pathname:///aztec-nr-api/#api_ref_version/noir_aztec/messages/message_delivery/struct.MessageDelivery#method.offchain): Lowest cost, no onchain data - Use when the sender and recipient can communicate and the sender is incentivized to deliver correctly. #include_code note_delivery /noir-projects/noir-contracts/contracts/app/private_token_contract/src/main.nr rust @@ -324,7 +324,7 @@ fn perform_admin_action() { // value of the counter and can update it again in the future. self.storage.admin_call_count .replace(|current| UintNote{ value: current.value + 1 }) // wouldn't it be great if we didn't have to deal with this wrapping and unwrapping? - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); // ... } @@ -381,7 +381,7 @@ This function allows us to get the note of a `PrivateMutable`, essentially readi #[external("private")] fn read_settings() { let owner = self.msg_sender(); - self.storage.user_settings.at(owner).get_note().deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.user_settings.at(owner).get_note().deliver(MessageDelivery::onchain_constrained()); } ``` @@ -484,11 +484,11 @@ When initializing, you still pass an owner address, but this specifies who can d ```rust // owner_address determines who can see the note, not where it's stored -self.storage.admin.initialize(note, owner_address).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); +self.storage.admin.initialize(note, owner_address).deliver(MessageDelivery::onchain_constrained()); ``` :::warning -`SinglePrivateMutable` uses a nullify-and-recreate pattern when reading. Unless the caller is incentivized to deliver the note message correctly, you should use `MessageDelivery.ONCHAIN_CONSTRAINED` to prevent malicious actors from bricking the contract by failing to deliver the note. +`SinglePrivateMutable` uses a nullify-and-recreate pattern when reading. Unless the caller is incentivized to deliver the note message correctly, you should use `MessageDelivery::onchain_constrained()` to prevent malicious actors from bricking the contract by failing to deliver the note. ::: ## Containers @@ -558,7 +558,7 @@ fn transfer(from: AztecAddress, to: AztecAddress, amount: u128) { // Access the balance for the 'to' address let new_note = UintNote { value: amount }; - self.storage.balances.at(to).insert(new_note).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.balances.at(to).insert(new_note).deliver(MessageDelivery::onchain_unconstrained()); } ``` diff --git a/docs/docs-developers/docs/aztec-nr/index.md b/docs/docs-developers/docs/aztec-nr/index.md index 3e42007a7d72..ff432fa96e7a 100644 --- a/docs/docs-developers/docs/aztec-nr/index.md +++ b/docs/docs-developers/docs/aztec-nr/index.md @@ -30,7 +30,7 @@ A good example of this is writing to private state variables. These functions re ```rust storage.votes.insert(new_vote); // compiler error - unused NoteMessage return value -storage.votes.insert(new_vote).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); // deliver the note message onchain +storage.votes.insert(new_vote).deliver(MessageDelivery::onchain_constrained()); // deliver the note message onchain ``` ## Contract Development diff --git a/docs/docs-developers/docs/aztec-nr/standards/escrow.md b/docs/docs-developers/docs/aztec-nr/standards/escrow.md index 96b07e92846d..26adf054c719 100644 --- a/docs/docs-developers/docs/aztec-nr/standards/escrow.md +++ b/docs/docs-developers/docs/aztec-nr/standards/escrow.md @@ -71,7 +71,7 @@ pub fn _share_escrow( ) { let event_struct = EscrowDetailsLogContent { escrow, master_secret_keys }; emit_event_in_private(context, event_struct).deliver_to( - account, MessageDelivery.ONCHAIN_CONSTRAINED, + account, MessageDelivery::onchain_constrained(), ); } ``` diff --git a/docs/docs-developers/docs/resources/migration_notes.md b/docs/docs-developers/docs/resources/migration_notes.md index b08984cb5ebe..ed1b0db89a2a 100644 --- a/docs/docs-developers/docs/resources/migration_notes.md +++ b/docs/docs-developers/docs/resources/migration_notes.md @@ -9,6 +9,21 @@ Aztec is in active development. Each version may introduce breaking changes that ## TBD +### [Aztec.nr] `MessageDelivery` API syntax change + +`MessageDelivery` variants are now accessed via constructor functions instead of dot notation: + +```diff +- MessageDelivery.OFFCHAIN ++ MessageDelivery::offchain() + +- MessageDelivery.ONCHAIN_UNCONSTRAINED ++ MessageDelivery::onchain_unconstrained() + +- MessageDelivery.ONCHAIN_CONSTRAINED ++ MessageDelivery::onchain_constrained() +``` + ### [Aztec.js] `AccountManager.create` takes an options bag `AccountManager.create` no longer takes `salt` as a positional argument. The trailing `salt?: Salt` parameter has been folded into a new `AccountManagerCreateOptions` bag alongside `immutablesHash` and `deployer`: diff --git a/docs/docs-developers/docs/tutorials/contract_tutorials/counter_contract.md b/docs/docs-developers/docs/tutorials/contract_tutorials/counter_contract.md index d711ab648824..b1c4075e848f 100644 --- a/docs/docs-developers/docs/tutorials/contract_tutorials/counter_contract.md +++ b/docs/docs-developers/docs/tutorials/contract_tutorials/counter_contract.md @@ -108,7 +108,7 @@ Let’s create a constructor method to run on deployment that assigns an initial #include_code constructor /docs/examples/contracts/counter_contract/src/main.nr rust -This function accesses the counters from storage. It adds the `headstart` value to the `owner`'s counter using `at().add()`, then calls `.deliver(MessageDelivery.ONCHAIN_CONSTRAINED)` to ensure the note is delivered onchain. +This function accesses the counters from storage. It adds the `headstart` value to the `owner`'s counter using `at().add()`, then calls `.deliver(MessageDelivery::onchain_constrained())` to ensure the note is delivered onchain. We have annotated this and other functions with `#[external("private")]` which are ABI macros so the compiler understands it will handle private inputs. diff --git a/docs/examples/contracts/bob_token_contract/src/main.nr b/docs/examples/contracts/bob_token_contract/src/main.nr index 165e931fcbd4..f790c46fefee 100644 --- a/docs/examples/contracts/bob_token_contract/src/main.nr +++ b/docs/examples/contracts/bob_token_contract/src/main.nr @@ -86,7 +86,7 @@ pub contract BobToken { self.enqueue_self._deduct_public_balance(sender, amount); // Add to private balance self.storage.private_balances.at(sender).add(amount as u128).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } // docs:end:public_to_private @@ -107,11 +107,11 @@ pub contract BobToken { let sender = self.msg_sender(); // Spend sender's notes (consumes existing notes) self.storage.private_balances.at(sender).sub(amount as u128).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); // Create new notes for recipient self.storage.private_balances.at(to).add(amount as u128).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } // docs:end:transfer_private @@ -144,7 +144,7 @@ pub contract BobToken { // If check passes, mint tokens privately self.storage.private_balances.at(employee).add(amount as u128).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } // docs:end:mint_private @@ -155,7 +155,7 @@ pub contract BobToken { let sender = self.msg_sender(); // Remove from private balance self.storage.private_balances.at(sender).sub(amount as u128).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); // Enqueue public credit self.enqueue_self._credit_public_balance(sender, amount); diff --git a/docs/examples/contracts/counter_contract/src/main.nr b/docs/examples/contracts/counter_contract/src/main.nr index da23da3d221f..7d18e0e1bb0e 100644 --- a/docs/examples/contracts/counter_contract/src/main.nr +++ b/docs/examples/contracts/counter_contract/src/main.nr @@ -28,7 +28,7 @@ pub contract Counter { // We can name our initializer anything we want as long as it's marked as aztec(initializer) fn initialize(headstart: u128, owner: AztecAddress) { self.storage.counters.at(owner).add(headstart).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } // docs:end:constructor @@ -37,7 +37,7 @@ pub contract Counter { #[external("private")] fn increment(owner: AztecAddress) { debug_log_format("Incrementing counter for owner {0}", [owner.to_field()]); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); } // docs:end:increment diff --git a/docs/examples/contracts/nft/src/main.nr b/docs/examples/contracts/nft/src/main.nr index d4181cac3cb5..4ed879e3a0da 100644 --- a/docs/examples/contracts/nft/src/main.nr +++ b/docs/examples/contracts/nft/src/main.nr @@ -57,7 +57,7 @@ pub contract NFTPunk { // we create an NFT note and insert it to the PrivateSet - a collection of notes meant to be read in private let new_nft = NFTNote { token_id }; - self.storage.owners.at(to).insert(new_nft).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.owners.at(to).insert(new_nft).deliver(MessageDelivery::onchain_constrained()); // calling the internal public function above to indicate that the NFT is taken self.enqueue_self._mark_nft_exists(token_id, true); diff --git a/docs/examples/webapp-tutorial/contracts/src/main.nr b/docs/examples/webapp-tutorial/contracts/src/main.nr index 872daafd4370..7c3e3756f7c9 100644 --- a/docs/examples/webapp-tutorial/contracts/src/main.nr +++ b/docs/examples/webapp-tutorial/contracts/src/main.nr @@ -95,7 +95,7 @@ pub contract PodRacing { .at(game_id) .at(player) .insert(GameRoundNote::new(track1, track2, track3, track4, track5, round, player)) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); self.enqueue(PodRacing::at(self.context.this_address()).validate_and_play_round( player, diff --git a/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr index 73aff857495e..57a95da52b9e 100644 --- a/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr +++ b/noir-projects/aztec-nr/aztec/src/contract_self/contract_self_private.nr @@ -180,8 +180,8 @@ impl bool { + self.variant == other.variant + } +} + +impl MessageDelivery { /// Delivers the message fully off-chain, with no guarantees whatsoever. /// /// ## Use Cases /// /// This delivery method is suitable when the sender is required to send the message to the recipient because of - /// some external reason, and where the sender is able to directly contact the recipient off-chain. In these cases, - /// it might be unnecessary to force the sender to spend proving time guaranteeing message correctness, or to pay - /// transaction fees in order to use the chain as a medium. + /// some external reason, and where the sender is able to directly contact the recipient off-chain. In these + /// cases, it might be unnecessary to force the sender to spend proving time guaranteeing message correctness, or + /// to pay transaction fees in order to use the chain as a medium. /// /// For example, if performing a payment in exchange for some good or service, the recipient will only accept the /// payment once they receive note and event messages, allowing them to observe the balance increase. The sender - /// has no reason not to deliver the message correctly to the recipient, and in all likelihood has a way to send it - /// to them. + /// has no reason not to deliver the message correctly to the recipient, and in all likelihood has a way to send + /// it to them. /// /// Similarly, in games and other applications that might rely on some server processing state, players might be /// required to update the server with their current state. @@ -59,7 +79,9 @@ pub struct MessageDeliveryEnum { /// No information is revelead on-chain about sender, recipient, or the message contents. The message itself /// reveals no information about the sender or recipient, and requires knowledge of the recipient's private address /// keys in order to obtain the plaintext. - pub OFFCHAIN: u8, + pub fn offchain() -> Self { + Self { variant: 1 } + } /// Delivers the message on-chain, but with no guarantees on the content. /// @@ -85,7 +107,7 @@ pub struct MessageDeliveryEnum { /// An undecryptable or otherwise invalid note or event message will however simply be ignored by the recipient, /// who can always validate the existence of the note or event on-chain. /// - /// These guarantees make this delivery mechanism be quite similar to [`MessageDeliveryEnum::OFFCHAIN`], except the + /// These guarantees make this delivery mechanism be quite similar to [`MessageDelivery::offchain`], except the /// sender does not need to establish an off-chain communication channel with the recipient, and neither party /// needs to worry about backups. /// @@ -109,19 +131,21 @@ pub struct MessageDeliveryEnum { /// /// Identifying that a log corresponds to a message between a given sender and recipient requires, among other /// things, knowledge of both of their addresses **and** either the sender's or recipient's private address key. - pub ONCHAIN_UNCONSTRAINED: u8, + pub fn onchain_unconstrained() -> Self { + Self { variant: 2 } + } /// Delivers the message on-chain, guaranteeing the recipient will receive the correct content. /// /// >**WARNING**: this delivery mode is [currently NOT fully /// constrained](https://github.com/AztecProtocol/aztec-packages/issues/14565). The log's tag is unconstrained, - /// meaning a malicious sender could manipulate it to prevent the recipient from finding the message. + /// meaning a malicious sender could manipulate it to prevent the recipient from finding the message. /// /// ## Use Cases /// /// This delivery method is suitable for all use cases, since it always works as expected. It is however the most - /// costly method, and there are multiple scenarios where alternatives such as [`MessageDeliveryEnum::OFFCHAIN`] or - /// [`MessageDeliveryEnum::ONCHAIN_UNCONSTRAINED`] will suffice. + /// costly method, and there are multiple scenarios where alternatives such as [`MessageDelivery::offchain`] or + /// [`MessageDelivery::onchain_unconstrained`] will suffice. /// /// If the sender cannot be relied on to correctly send the message to the recipient (e.g. because they have no /// incentive to do so, such as when paying a fee to a protocol, creating the change note after spending a third @@ -146,8 +170,8 @@ pub struct MessageDeliveryEnum { /// Additionally, the constraining of the log's tag results in additional DA usage and hence transaction fees due /// to the emission of nullifiers. /// - /// Proving time is also increased as circuit gates are introduced to guarantee both the correct encryption of the - /// message, and selection of log tag. + /// Proving time is also increased as circuit gates are introduced to guarantee both the correct encryption of + /// the message, and selection of log tag. /// /// ## Privacy /// @@ -160,26 +184,11 @@ pub struct MessageDeliveryEnum { /// /// Identifying that a log corresponds to a message between a given sender and recipient requires, among other /// things, knowledge of both of their addresses **and** either the sender's or recipient's private address key. - pub ONCHAIN_CONSTRAINED: u8, + pub fn onchain_constrained() -> Self { + Self { variant: 3 } + } } -/// Specifies how to deliver a message to a recipient. -/// -/// All messages are delivered encrypted to their recipient's public address key, so no other account will be able to -/// read their contents. This enum instead configures which **guarantees** exist regarding delivery. -/// -/// There are two aspects to delivery guarantees: -/// - the medium on which the message is sent (off-chain or on-chain) -/// - whether the contract constrains the message to be constructed correctly -/// -/// For scenarios where the sender is incentivized to deliver the message correctly, use -/// [`MessageDeliveryEnum::OFFCHAIN`] (the cheapest delivery option, but requiring that sender and recipient can -/// communicate off-chain) or [`MessageDeliveryEnum::ONCHAIN_UNCONSTRAINED`]. If the sender cannot be trusted to send -/// the -/// message to the recipient, use [`MessageDeliveryEnum::ONCHAIN_CONSTRAINED`]. -pub global MessageDelivery: MessageDeliveryEnum = - MessageDeliveryEnum { OFFCHAIN: 1, ONCHAIN_UNCONSTRAINED: 2, ONCHAIN_CONSTRAINED: 3 }; - /// Performs private delivery of a message to `recipient` according to `delivery_mode`. /// /// The message is encoded into plaintext and then encrypted for `recipient`. This function takes a _function_ that @@ -191,7 +200,7 @@ pub global MessageDelivery: MessageDeliveryEnum = /// emitted in the current transaction. This is typically only used for note messages: since the note will not actually /// be created, there is no point in delivering the message. /// -/// `delivery_mode` must be one of [`MessageDeliveryEnum`]. +/// `delivery_mode` must be a [`MessageDelivery`] value. /// /// ## Privacy /// @@ -202,7 +211,7 @@ pub fn do_private_message_delivery( encode_into_message_plaintext: fn[Env]() -> [Field; MESSAGE_PLAINTEXT_LEN], maybe_note_hash_counter: Option, recipient: AztecAddress, - delivery_mode: u8, + delivery_mode: MessageDelivery, ) { // This function relies on `delivery_mode` being a constant in order to reduce circuit constraints when // unconstrained usage is requested. If `delivery_mode` were a runtime value the compiler would be unable to @@ -210,10 +219,10 @@ pub fn do_private_message_delivery( assert_constant(delivery_mode); // The following maps out the 3 dimensions across which we configure message delivery. - let constrained_encryption = delivery_mode == MessageDelivery.ONCHAIN_CONSTRAINED; - let deliver_as_offchain_message = delivery_mode == MessageDelivery.OFFCHAIN; + let constrained_encryption = delivery_mode == MessageDelivery::onchain_constrained(); + let deliver_as_offchain_message = delivery_mode == MessageDelivery::offchain(); // TODO(#14565): Add constrained tagging - let _constrained_tagging = delivery_mode == MessageDelivery.ONCHAIN_CONSTRAINED; + let _constrained_tagging = delivery_mode == MessageDelivery::onchain_constrained(); let contract_address = context.this_address(); diff --git a/noir-projects/aztec-nr/aztec/src/note/note_message.nr b/noir-projects/aztec-nr/aztec/src/note/note_message.nr index c9e37383c0aa..d660648225e3 100644 --- a/noir-projects/aztec-nr/aztec/src/note/note_message.nr +++ b/noir-projects/aztec-nr/aztec/src/note/note_message.nr @@ -1,6 +1,9 @@ use crate::{ context::PrivateContext, - messages::{logs::note::encode_private_note_message, message_delivery::do_private_message_delivery}, + messages::{ + logs::note::encode_private_note_message, + message_delivery::{do_private_message_delivery, MessageDelivery}, + }, note::{lifecycle::NewNote, note_interface::NoteType}, }; use crate::protocol::{address::AztecAddress, traits::Packable}; @@ -32,7 +35,7 @@ where /// /// The message is first encrypted to the owner's public key, ensuring no other actor can read it. /// - /// The `delivery_mode` must be one of [`crate::messages::message_delivery::MessageDeliveryEnum`], and will inform + /// The `delivery_mode` must be a [`crate::messages::message_delivery::MessageDelivery`] value, and will inform /// costs (both proving time and TX fees) as well as delivery guarantees. This value must be a compile-time /// constant. /// @@ -45,7 +48,7 @@ where /// as normal. This prevents both 'king of the hill' attacks (where a sender would otherwise fail to deliver a note /// to an invalid recipient) and forced privacy leaks (where an invalid recipient results in a unique transaction /// fingerprint, e.g. one lacking the private logs that would correspond to message delivery). - pub fn deliver(self, delivery_mode: u8) { + pub fn deliver(self, delivery_mode: MessageDelivery) { self.deliver_to(self.new_note.owner, delivery_mode); } @@ -63,7 +66,7 @@ where /// institutional contract may require to have some actor receive all notes created for compliance purposes. Or a /// low value application like a game might deliver all notes offchain to a centralized server that then serves /// them via the app, bypassing the need for contract sync and improving UX. - pub fn deliver_to(self, recipient: AztecAddress, delivery_mode: u8) { + pub fn deliver_to(self, recipient: AztecAddress, delivery_mode: MessageDelivery) { // Technical note: we're about to call a closure that needs access to `new_note`, but we can't pass `self` to // it because the closure might execute in unconstrained mode, and since `self` contains a mutable reference to // `context` this would cause for a mutable reference to cross the constrained-unconstrained barrier, which is @@ -126,10 +129,9 @@ where /// Same as [`NoteMessage::deliver`], except the message will only be delivered if it actually exists. /// - /// Messages delivered using [`crate::messages::message_delivery::MessageDeliveryEnum::ONCHAIN_CONSTRAINED`] will - /// pay - /// proving costs regardless of whether the message exists or not. - pub fn deliver(self, delivery_mode: u8) { + /// Messages delivered using [`crate::messages::message_delivery::MessageDelivery::onchain_constrained()`] will + /// pay proving costs regardless of whether the message exists or not. + pub fn deliver(self, delivery_mode: MessageDelivery) { if self.maybe_new_note.is_some() { NoteMessage::new(self.maybe_new_note.unwrap_unchecked(), self.context).deliver(delivery_mode); } @@ -137,10 +139,9 @@ where /// Same as [`NoteMessage::deliver_to`], except the message will only be delivered if it actually exists. /// - /// Messages delivered using [`crate::messages::message_delivery::MessageDeliveryEnum::ONCHAIN_CONSTRAINED`] will - /// pay - /// proving costs regardless of whether the message exists or not. - pub fn deliver_to(self, recipient: AztecAddress, delivery_mode: u8) { + /// Messages delivered using [`crate::messages::message_delivery::MessageDelivery::onchain_constrained()`] will + /// pay proving costs regardless of whether the message exists or not. + pub fn deliver_to(self, recipient: AztecAddress, delivery_mode: MessageDelivery) { if self.maybe_new_note.is_some() { NoteMessage::new(self.maybe_new_note.unwrap_unchecked(), self.context).deliver_to(recipient, delivery_mode); } diff --git a/noir-projects/aztec-nr/uint-note/src/uint_note.nr b/noir-projects/aztec-nr/uint-note/src/uint_note.nr index 87fb76f7f4db..c37e63d889ae 100644 --- a/noir-projects/aztec-nr/uint-note/src/uint_note.nr +++ b/noir-projects/aztec-nr/uint-note/src/uint_note.nr @@ -124,7 +124,7 @@ impl UintNote { || encode_partial_note_private_message(private_log_content, owner, randomness, commitment), Option::none(), recipient, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); let partial_note = PartialUintNote { commitment }; diff --git a/noir-projects/contract-snapshots/test_programs/compile_failure/bob_token/src/main.nr b/noir-projects/contract-snapshots/test_programs/compile_failure/bob_token/src/main.nr index 1a812b3dba3f..8196be49a48c 100644 --- a/noir-projects/contract-snapshots/test_programs/compile_failure/bob_token/src/main.nr +++ b/noir-projects/contract-snapshots/test_programs/compile_failure/bob_token/src/main.nr @@ -70,7 +70,7 @@ contract BobToken { let sender = self.msg_sender(); self.enqueue_self._deduct_public_balance(sender, amount); self.storage.private_balances.at(sender).add(amount).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -86,10 +86,10 @@ contract BobToken { pub fn transfer_private(to: AztecAddress, amount: u128) { let sender = self.msg_sender(); self.storage.private_balances.at(sender).sub(amount).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); self.storage.private_balances.at(to).add(amount).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -114,7 +114,7 @@ contract BobToken { unconstrained fn mint_private(employee: AztecAddress, amount: u128) { self.enqueue_self._assert_is_owner(self.msg_sender()); self.storage.private_balances.at(employee).add(amount).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -122,7 +122,7 @@ contract BobToken { fn private_to_public(amount: u128) { let sender = self.msg_sender(); self.storage.private_balances.at(sender).sub(amount).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); self.enqueue_self._credit_public_balance(sender, amount); } diff --git a/noir-projects/contract-snapshots/test_programs/compile_failure/invalid_event/src/main.nr b/noir-projects/contract-snapshots/test_programs/compile_failure/invalid_event/src/main.nr index 7bfb2bc47c26..4691a8a80279 100644 --- a/noir-projects/contract-snapshots/test_programs/compile_failure/invalid_event/src/main.nr +++ b/noir-projects/contract-snapshots/test_programs/compile_failure/invalid_event/src/main.nr @@ -13,7 +13,7 @@ contract InvalidEventContract { fn trigger_event_check() { self.emit(InvalidEvent {}).deliver_to( self.msg_sender(), - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); } } diff --git a/noir-projects/noir-contracts/contracts/account/ecdsa_k_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/account/ecdsa_k_account_contract/src/main.nr index d4df63a887ac..66e172ac072c 100644 --- a/noir-projects/noir-contracts/contracts/account/ecdsa_k_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/account/ecdsa_k_account_contract/src/main.nr @@ -34,7 +34,7 @@ pub contract EcdsaKAccount { unsafe { set_sender_for_tags(self.address) }; // The note message gets delivered to the note owner which is set by the SinglePrivateImmutable to be this // contract. - self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery::onchain_constrained()); } // @dev: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts file diff --git a/noir-projects/noir-contracts/contracts/account/ecdsa_r_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/account/ecdsa_r_account_contract/src/main.nr index 4a1c4519b525..993eb1b3be53 100644 --- a/noir-projects/noir-contracts/contracts/account/ecdsa_r_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/account/ecdsa_r_account_contract/src/main.nr @@ -34,7 +34,7 @@ pub contract EcdsaRAccount { unsafe { set_sender_for_tags(self.address) }; // The note message gets delivered to the note owner which is set by the SinglePrivateImmutable to be this // contract. - self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery::onchain_constrained()); } // @dev: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts file diff --git a/noir-projects/noir-contracts/contracts/account/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/account/schnorr_account_contract/src/main.nr index dff7facab5db..b180679358f5 100644 --- a/noir-projects/noir-contracts/contracts/account/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/account/schnorr_account_contract/src/main.nr @@ -45,7 +45,7 @@ pub contract SchnorrAccount { unsafe { set_sender_for_tags(self.address) }; // The note message gets delivered to the note owner which is set by the SinglePrivateImmutable to be this // contract. - self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.signing_public_key.initialize(pub_key_note).deliver(MessageDelivery::onchain_constrained()); } // @dev: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts file diff --git a/noir-projects/noir-contracts/contracts/app/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/app_subscription_contract/src/main.nr index af16e92c3dbd..50c843b2cc7b 100644 --- a/noir-projects/noir-contracts/contracts/app/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/app_subscription_contract/src/main.nr @@ -95,7 +95,7 @@ pub contract AppSubscription { remaining_txs: note.remaining_txs - 1, } }) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); self.context.set_as_fee_payer(); @@ -159,7 +159,7 @@ pub contract AppSubscription { .subscriptions .at(subscriber) .initialize_or_replace(|_| SubscriptionNote { expiry_block_number, remaining_txs: tx_count }) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); // docs:end:owned_private_mutable_initialize } diff --git a/noir-projects/noir-contracts/contracts/app/card_game_contract/src/cards.nr b/noir-projects/noir-contracts/contracts/app/card_game_contract/src/cards.nr index 104a9d2b6f88..184562ab877b 100644 --- a/noir-projects/noir-contracts/contracts/app/card_game_contract/src/cards.nr +++ b/noir-projects/noir-contracts/contracts/app/card_game_contract/src/cards.nr @@ -155,7 +155,7 @@ impl Deck<&mut PrivateContext> { let mut inserted_cards = @[]; for card in cards { let card_note = CardNote::from_card(card); - self.owned_set.at(owner).insert(card_note.note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.owned_set.at(owner).insert(card_note.note).deliver(MessageDelivery::onchain_constrained()); inserted_cards = inserted_cards.push_back(card_note); } diff --git a/noir-projects/noir-contracts/contracts/app/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/crowdfunding_contract/src/main.nr index 57a3f78bcad2..48aedb5c07a5 100644 --- a/noir-projects/noir-contracts/contracts/app/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/crowdfunding_contract/src/main.nr @@ -58,7 +58,7 @@ pub contract Crowdfunding { // We don't constrain encryption because the donor is sending the note to himself. And hence by performing // encryption incorrectly would harm himself only. - self.storage.donation_receipts.at(donor).insert(note).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.donation_receipts.at(donor).insert(note).deliver(MessageDelivery::onchain_unconstrained()); } // Withdraws balance to the operator. Requires that msg_sender() is the operator. diff --git a/noir-projects/noir-contracts/contracts/app/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/escrow_contract/src/main.nr index 90df07accb10..3e5bf11b5713 100644 --- a/noir-projects/noir-contracts/contracts/app/escrow_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/escrow_contract/src/main.nr @@ -23,7 +23,7 @@ pub contract Escrow { #[initializer] fn constructor(owner: AztecAddress) { let note = AddressNote { address: owner }; - self.storage.owner.initialize(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.owner.initialize(note).deliver(MessageDelivery::onchain_constrained()); } // Withdraws balance. Requires that msg.sender is the owner. diff --git a/noir-projects/noir-contracts/contracts/app/nft_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/nft_contract/src/main.nr index 90189549f536..f4980f753298 100644 --- a/noir-projects/noir-contracts/contracts/app/nft_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/nft_contract/src/main.nr @@ -221,7 +221,7 @@ pub contract NFT { let new_note = NFTNote { token_id }; - nfts.at(to).insert(new_note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + nfts.at(to).insert(new_note).deliver(MessageDelivery::onchain_constrained()); } #[authorize_once("from", "authwit_nonce")] diff --git a/noir-projects/noir-contracts/contracts/app/nft_contract/src/types/nft_note.nr b/noir-projects/noir-contracts/contracts/app/nft_contract/src/types/nft_note.nr index 183a85c618a3..095d3a673a70 100644 --- a/noir-projects/noir-contracts/contracts/app/nft_contract/src/types/nft_note.nr +++ b/noir-projects/noir-contracts/contracts/app/nft_contract/src/types/nft_note.nr @@ -120,7 +120,7 @@ impl NFTNote { || encode_partial_note_private_message(private_log_content, owner, randomness, commitment), Option::none(), recipient, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); let partial_note = PartialNFTNote { commitment }; diff --git a/noir-projects/noir-contracts/contracts/app/private_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/private_token_contract/src/main.nr index 9c2eed4d5971..aa79f15d5356 100644 --- a/noir-projects/noir-contracts/contracts/app/private_token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/private_token_contract/src/main.nr @@ -33,12 +33,12 @@ pub contract PrivateToken { // Admin itself is the owner of the underlying note because we want admin to be able to transfer the admin // privileges to someone else which requires being able to nullify the note. We use constrained onchain message // delivery because we don't know if the party deploying this contract is incentivized to deliver the note. - self.storage.admin.initialize(AddressNote { address: admin }, admin).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.admin.initialize(AddressNote { address: admin }, admin).deliver(MessageDelivery::onchain_constrained()); // Mint the initial admin balance to the admin. - self.storage.balances.at(admin).add(initial_admin_balance).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(admin).add(initial_admin_balance).deliver(MessageDelivery::onchain_constrained()); self.storage.total_supply.initialize(UintNote { value: initial_admin_balance }, admin).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -52,15 +52,15 @@ pub contract PrivateToken { // We deliver the new note message to the admin using unconstrained delivery, since the admin is motivated to // deliver the message to themselves (hence no need to constrain it). - replacement_note_message.deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + replacement_note_message.deliver(MessageDelivery::onchain_unconstrained()); // We increase the total supply and once again use unconstrained delivery, since the admin is motivated to // deliver the message (he's the owner of the new note as well). self.storage.total_supply.replace(|current| UintNote { value: current.value + amount }, admin).deliver( - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); // At last we mint the tokens to the recipient. - self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery::onchain_constrained()); } // docs:end:note_delivery @@ -78,15 +78,15 @@ pub contract PrivateToken { }, new_admin, ) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); } // docs:end:owned_single_private_mutable_replace // Transfers `amount` of tokens from `sender` to a `recipient`. #[external("private")] fn transfer(amount: u128, sender: AztecAddress, recipient: AztecAddress) { - self.storage.balances.at(sender).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); - self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(sender).sub(amount).deliver(MessageDelivery::onchain_constrained()); + self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery::onchain_constrained()); } // Helper function to get the balance of a user. diff --git a/noir-projects/noir-contracts/contracts/app/simple_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/simple_token_contract/src/main.nr index 06c66a0df8fc..eb2f64c7cc72 100644 --- a/noir-projects/noir-contracts/contracts/app/simple_token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/simple_token_contract/src/main.nr @@ -125,7 +125,7 @@ pub contract SimpleToken { #[authorize_once("from", "authwit_nonce")] #[external("private")] fn transfer_from_private_to_public(from: AztecAddress, to: AztecAddress, amount: u128, authwit_nonce: Field) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._increase_public_balance(to, amount); } @@ -134,16 +134,16 @@ pub contract SimpleToken { let from = self.msg_sender(); let change = self.internal.subtract_balance(from, amount, INITIAL_TRANSFER_CALL_MAX_NOTES); - self.storage.balances.at(from).add(change).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.balances.at(from).add(change).deliver(MessageDelivery::onchain_unconstrained()); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::onchain_unconstrained()); - self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery::onchain_unconstrained()); } #[authorize_once("from", "authwit_nonce")] #[external("private")] fn burn_private(from: AztecAddress, amount: u128, authwit_nonce: Field) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._reduce_total_supply(amount); } diff --git a/noir-projects/noir-contracts/contracts/app/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/token_blacklist_contract/src/main.nr index c50f84e73b0d..4ce15509facb 100644 --- a/noir-projects/noir-contracts/contracts/app/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/token_blacklist_contract/src/main.nr @@ -198,7 +198,7 @@ pub contract TokenBlacklist { assert(notes.len() == 1, "note not popped"); // Add the token note to user's balances set - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::onchain_constrained()); } #[authorize_once("from", "authwit_nonce")] @@ -209,7 +209,7 @@ pub contract TokenBlacklist { let to_roles = self.storage.roles.at(to).get_current_value(); assert(!to_roles.is_blacklisted, "Blacklisted: Recipient"); - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._increase_public_balance(to, amount); } @@ -222,8 +222,8 @@ pub contract TokenBlacklist { let to_roles = self.storage.roles.at(to).get_current_value(); assert(!to_roles.is_blacklisted, "Blacklisted: Recipient"); - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_unconstrained()); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::onchain_unconstrained()); } #[authorize_once("from", "authwit_nonce")] @@ -232,7 +232,7 @@ pub contract TokenBlacklist { let from_roles = self.storage.roles.at(from).get_current_value(); assert(!from_roles.is_blacklisted, "Blacklisted: Sender"); - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._reduce_total_supply(amount); } diff --git a/noir-projects/noir-contracts/contracts/app/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app/token_contract/src/main.nr index 8afb7bdd16c9..bfced8c7bb61 100644 --- a/noir-projects/noir-contracts/contracts/app/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app/token_contract/src/main.nr @@ -177,7 +177,7 @@ pub contract Token { #[authorize_once("from", "authwit_nonce")] #[external("private")] fn transfer_to_public(from: AztecAddress, to: AztecAddress, amount: u128, authwit_nonce: Field) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._increase_public_balance(to, amount); } @@ -203,7 +203,7 @@ pub contract Token { amount: u128, authwit_nonce: Field, ) -> PartialUintNote { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._increase_public_balance(to, amount); // We prepare the private balance increase (the partial note for the change). @@ -221,15 +221,15 @@ pub contract Token { // note for `from` with the change amount, e.g. if `amount` is 10 and two notes are nullified with amounts 8 and // 5, then the change will be 3 (since 8 + 5 - 10 = 3). let change = self.internal.subtract_balance(from, amount, INITIAL_TRANSFER_CALL_MAX_NOTES); - self.storage.balances.at(from).add(change).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.balances.at(from).add(change).deliver(MessageDelivery::onchain_unconstrained()); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::onchain_unconstrained()); // We don't constrain encryption of the note log in `transfer` (unlike in `transfer_in_private`) because the // transfer // function is only designed to be used in situations where the event is not strictly necessary (e.g. payment to // another person where the payment is considered to be successful when the other party successfully decrypts a // note). - self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery::onchain_unconstrained()); } #[internal("private")] @@ -284,8 +284,8 @@ pub contract Token { #[authorize_once("from", "authwit_nonce")] #[external("private")] fn transfer_in_private(from: AztecAddress, to: AztecAddress, amount: u128, authwit_nonce: Field) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::onchain_constrained()); } // docs:end:transfer_in_private @@ -305,17 +305,17 @@ pub contract Token { amount: u128, authwit_nonce: Field, ) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.OFFCHAIN); - self.storage.balances.at(to).add(amount).deliver(MessageDelivery.OFFCHAIN); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::offchain()); + self.storage.balances.at(to).add(amount).deliver(MessageDelivery::offchain()); - self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery.OFFCHAIN); + self.emit(Transfer { from, to, amount }).deliver_to(to, MessageDelivery::offchain()); } // docs:end:transfer_in_private_with_offchain_delivery #[authorize_once("from", "authwit_nonce")] #[external("private")] fn burn_private(from: AztecAddress, amount: u128, authwit_nonce: Field) { - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._reduce_total_supply(amount); } @@ -385,7 +385,7 @@ pub contract Token { authwit_nonce: Field, ) { // First we subtract the `amount` from the private balance of `from` - self.storage.balances.at(from).sub(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(from).sub(amount).deliver(MessageDelivery::onchain_constrained()); partial_note.complete_from_private( self.context, diff --git a/noir-projects/noir-contracts/contracts/message_discovery/handshake_registry_contract/src/main.nr b/noir-projects/noir-contracts/contracts/message_discovery/handshake_registry_contract/src/main.nr index 2a5b6a0416dd..ecb293d21be6 100644 --- a/noir-projects/noir-contracts/contracts/message_discovery/handshake_registry_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/message_discovery/handshake_registry_contract/src/main.nr @@ -74,7 +74,7 @@ pub contract HandshakeRegistry { // We use onchain unconstrained delivery rather than `OFFCHAIN` so the note is // discoverable via normal PXE sync. self.storage.handshakes.at(recipient).at(sender).initialize_or_replace(|_| note).deliver( - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); let log_tag = compute_log_tag( @@ -107,7 +107,7 @@ pub contract HandshakeRegistry { // `PrivateMutable::get_note` proves the current note by nullifying and recreating it. Deliver the // replacement to the sender so later validation calls can prove the same current handshake again. - replacement_note_message.deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + replacement_note_message.deliver(MessageDelivery::onchain_unconstrained()); } /// Returns the app-siloed shared secret for an existing handshake. diff --git a/noir-projects/noir-contracts/contracts/test/benchmarking_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/benchmarking_contract/src/main.nr index 7f77d9c3e57f..37f8bbe88eff 100644 --- a/noir-projects/noir-contracts/contracts/test/benchmarking_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/benchmarking_contract/src/main.nr @@ -33,7 +33,7 @@ pub contract Benchmarking { #[external("private")] fn create_note(owner: AztecAddress, value: Field) { let note = FieldNote { value }; - self.storage.notes.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.notes.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); } // Deletes a note at a specific index in the set and creates a new one with the same value. // We explicitly pass in the note index so we can ensure we consume different notes when sending @@ -46,7 +46,7 @@ pub contract Benchmarking { let mut getter_options = NoteGetterOptions::new(); let notes = owner_notes.pop_notes(getter_options.set_limit(1).set_offset(index)); let note = notes.get(0); - owner_notes.insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + owner_notes.insert(note).deliver(MessageDelivery::onchain_constrained()); } // Reads and writes to public storage and enqueues a call to another public function. diff --git a/noir-projects/noir-contracts/contracts/test/child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/child_contract/src/main.nr index 5a61e3058d0b..c0165f8e2b7a 100644 --- a/noir-projects/noir-contracts/contracts/test/child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/child_contract/src/main.nr @@ -52,7 +52,7 @@ pub contract Child { fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { let note = FieldNote { value: new_value }; - self.storage.private_values.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.private_values.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); new_value } diff --git a/noir-projects/noir-contracts/contracts/test/counter/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/counter/counter_contract/src/main.nr index 05604beb931f..2f0f887b2161 100644 --- a/noir-projects/noir-contracts/contracts/test/counter/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/counter/counter_contract/src/main.nr @@ -20,13 +20,13 @@ pub contract Counter { #[external("private")] // We can name our initializer anything we want as long as it's marked as aztec(initializer) fn initialize(headstart: u64, owner: AztecAddress) { - self.storage.counters.at(owner).add(headstart as u128).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(headstart as u128).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] fn increment(owner: AztecAddress) { debug_log_format("Incrementing counter for owner {0}", [owner.to_field()]); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] @@ -35,8 +35,8 @@ pub contract Counter { "Incrementing counter twice for owner {0}", [owner.to_field()], ); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] @@ -45,14 +45,14 @@ pub contract Counter { "Incrementing and decrementing counter for owner {0}", [owner.to_field()], ); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); - self.storage.counters.at(owner).sub(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); + self.storage.counters.at(owner).sub(1).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] fn decrement(owner: AztecAddress) { debug_log_format("Decrementing counter for owner {0}", [owner.to_field()]); - self.storage.counters.at(owner).sub(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).sub(1).deliver(MessageDelivery::onchain_constrained()); } #[external("utility")] @@ -64,7 +64,7 @@ pub contract Counter { fn increment_self_and_other(other_counter: AztecAddress, owner: AztecAddress) { debug_log_format("Incrementing counter for other {0}", [owner.to_field()]); - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); self.call(Counter::at(other_counter).increment(owner)); } diff --git a/noir-projects/noir-contracts/contracts/test/custom_message_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/custom_message_contract/src/main.nr index b31163f2336c..e0d4ffed8682 100644 --- a/noir-projects/noir-contracts/contracts/test/custom_message_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/custom_message_contract/src/main.nr @@ -162,7 +162,7 @@ contract CustomMessage { || msg0, Option::none(), recipient, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); // Part 1: randomness (message_id) and remaining event fields @@ -176,7 +176,7 @@ contract CustomMessage { || msg1, Option::none(), recipient, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); } } diff --git a/noir-projects/noir-contracts/contracts/test/custom_sync_state_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/custom_sync_state_contract/src/main.nr index 87b1215db425..5dab85a79e22 100644 --- a/noir-projects/noir-contracts/contracts/test/custom_sync_state_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/custom_sync_state_contract/src/main.nr @@ -35,7 +35,7 @@ contract CustomSyncState { fn constructor(owner: AztecAddress, value: Field) { let note = FieldNote { value }; self.storage.value.at(owner).initialize(note).deliver( - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); } diff --git a/noir-projects/noir-contracts/contracts/test/event_only_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/event_only_contract/src/main.nr index 22b602c6a769..1ae9673fc419 100644 --- a/noir-projects/noir-contracts/contracts/test/event_only_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/event_only_contract/src/main.nr @@ -14,6 +14,6 @@ contract EventOnly { #[external("private")] fn emit_event_for_msg_sender(value: Field) { let sender = self.msg_sender(); - self.emit(TestEvent { value }).deliver_to(sender, MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.emit(TestEvent { value }).deliver_to(sender, MessageDelivery::onchain_unconstrained()); } } diff --git a/noir-projects/noir-contracts/contracts/test/nested_utility_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/nested_utility_contract/src/main.nr index c212d6dbecae..c77da1bb9c0c 100644 --- a/noir-projects/noir-contracts/contracts/test/nested_utility_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/nested_utility_contract/src/main.nr @@ -40,7 +40,7 @@ pub contract NestedUtility { fn set_pow_args(x: Field, n: Field) { let owner = self.msg_sender(); self.storage.pow_args.at(owner).initialize_or_replace(|_| PowNote { x, n }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/noir-projects/noir-contracts/contracts/test/no_constructor_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/no_constructor_contract/src/main.nr index 58fc240d69c6..a20a93f1e219 100644 --- a/noir-projects/noir-contracts/contracts/test/no_constructor_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/no_constructor_contract/src/main.nr @@ -32,7 +32,7 @@ pub contract NoConstructor { let owner = self.msg_sender(); let note = FieldNote { value }; - self.storage.private_mutable.at(owner).initialize(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.private_mutable.at(owner).initialize(note).deliver(MessageDelivery::onchain_constrained()); } /// Helper function used to test that call to `initialize_private_mutable` was successful or not yet performed. diff --git a/noir-projects/noir-contracts/contracts/test/note_getter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/note_getter_contract/src/main.nr index 284231238cd7..df31f84dd8ed 100644 --- a/noir-projects/noir-contracts/contracts/test/note_getter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/note_getter_contract/src/main.nr @@ -30,7 +30,7 @@ pub contract NoteGetter { let owner = self.msg_sender(); let note = FieldNote { value }; - self.storage.set.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.set.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); } #[external("utility")] @@ -48,7 +48,7 @@ pub contract NoteGetter { let owner = self.msg_sender(); let note = PackedNote { high, low }; - self.storage.packed_set.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.packed_set.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); } #[external("utility")] diff --git a/noir-projects/noir-contracts/contracts/test/offchain_effect_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/offchain_effect_contract/src/main.nr index 409a7d673cd3..04cf710b6d89 100644 --- a/noir-projects/noir-contracts/contracts/test/offchain_effect_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/offchain_effect_contract/src/main.nr @@ -53,14 +53,14 @@ contract OffchainEffect { #[external("private")] fn emit_event_as_offchain_message_for_msg_sender(a: u64, b: u64, c: u64) { - self.emit(TestEvent { a, b, c }).deliver_to(self.msg_sender(), MessageDelivery.OFFCHAIN); + self.emit(TestEvent { a, b, c }).deliver_to(self.msg_sender(), MessageDelivery::offchain()); } #[external("private")] fn emit_note_as_offchain_message(value: u128, owner: AztecAddress) { let note = UintNote { value }; - self.storage.balances.at(owner).insert(note).deliver_to(self.msg_sender(), MessageDelivery.OFFCHAIN); + self.storage.balances.at(owner).insert(note).deliver_to(self.msg_sender(), MessageDelivery::offchain()); } /// Emits a single offchain message in a regular (non-static) private call. The matching diff --git a/noir-projects/noir-contracts/contracts/test/offchain_payment_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/offchain_payment_contract/src/main.nr index d896eff05ad2..68f638fa29d7 100644 --- a/noir-projects/noir-contracts/contracts/test/offchain_payment_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/offchain_payment_contract/src/main.nr @@ -19,7 +19,7 @@ contract OffchainPayment { #[external("private")] fn mint(amount: u128, recipient: AztecAddress) { // Minted notes are delivered onchain to ensure the recipient can always discover them. - self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] @@ -27,9 +27,9 @@ contract OffchainPayment { let sender = self.msg_sender(); // Sender change note and recipient note are both delivered offchain. - self.storage.balances.at(sender).sub(amount).deliver(MessageDelivery.OFFCHAIN); + self.storage.balances.at(sender).sub(amount).deliver(MessageDelivery::offchain()); - self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery.OFFCHAIN); + self.storage.balances.at(recipient).add(amount).deliver(MessageDelivery::offchain()); } #[external("utility")] diff --git a/noir-projects/noir-contracts/contracts/test/pending_note_hashes_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/pending_note_hashes_contract/src/main.nr index 3af4565e73ff..8c58660d859b 100644 --- a/noir-projects/noir-contracts/contracts/test/pending_note_hashes_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/pending_note_hashes_contract/src/main.nr @@ -45,7 +45,7 @@ pub contract PendingNoteHashes { // Insert note // docs:start:private_set_insert - owner_balance.insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + owner_balance.insert(note).deliver(MessageDelivery::onchain_constrained()); // docs:end:private_set_insert let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); @@ -91,7 +91,7 @@ pub contract PendingNoteHashes { let note = FieldNote { value: amount }; // Insert note - owner_balance.insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + owner_balance.insert(note).deliver(MessageDelivery::onchain_constrained()); } // Nested/inner function to create and insert a note @@ -106,7 +106,7 @@ pub contract PendingNoteHashes { let note = FieldNote::unpack([amount.to_field()]); // Insert note - owner_balance.insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + owner_balance.insert(note).deliver(MessageDelivery::onchain_constrained()); } // Nested/inner function to create and insert a note @@ -120,10 +120,10 @@ pub contract PendingNoteHashes { // Insert note let message = owner_balance.insert(note); - message.deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + message.deliver(MessageDelivery::onchain_constrained()); // Deliver note message again - message.deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + message.deliver(MessageDelivery::onchain_constrained()); } // Nested/inner function to get a note and confirm it matches the expected value @@ -315,7 +315,7 @@ pub contract PendingNoteHashes { let recipient_balance = self.storage.balances.at(recipient); let note = FieldNote { value: i as Field }; - recipient_balance.insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + recipient_balance.insert(note).deliver(MessageDelivery::onchain_constrained()); } } diff --git a/noir-projects/noir-contracts/contracts/test/private_init_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/private_init_test_contract/src/main.nr index 914301a00aba..9690654b4498 100644 --- a/noir-projects/noir-contracts/contracts/test/private_init_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/private_init_test_contract/src/main.nr @@ -22,7 +22,7 @@ pub contract PrivateInitTest { fn initialize(initial_value: Field) { let owner = self.msg_sender(); self.storage.value.at(owner).initialize(FieldNote { value: initial_value }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -30,7 +30,7 @@ pub contract PrivateInitTest { fn private_init_check_write_value(new_value: Field) { let owner = self.msg_sender(); self.storage.value.at(owner).replace(|_old| FieldNote { value: new_value }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/noir-projects/noir-contracts/contracts/test/scope_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/scope_test_contract/src/main.nr index 53a41d35fdde..762a6fa72146 100644 --- a/noir-projects/noir-contracts/contracts/test/scope_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/scope_test_contract/src/main.nr @@ -29,7 +29,7 @@ pub contract ScopeTest { #[external("private")] fn create_note(owner: AztecAddress, value: Field) { let note = FieldNote { value }; - self.storage.note.at(owner).initialize(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.note.at(owner).initialize(note).deliver(MessageDelivery::onchain_constrained()); } /// Reads the note owned by the specified owner and returns its value. diff --git a/noir-projects/noir-contracts/contracts/test/spam_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/spam_contract/src/main.nr index 7de11f2d7754..e4732d0006a9 100644 --- a/noir-projects/noir-contracts/contracts/test/spam_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/spam_contract/src/main.nr @@ -26,7 +26,7 @@ pub contract Spam { let caller = self.msg_sender(); for _ in 0..MAX_NOTE_HASHES_PER_CALL { - self.storage.balances.at(caller).add(1).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.storage.balances.at(caller).add(1).deliver(MessageDelivery::onchain_unconstrained()); } for i in 0..MAX_NULLIFIERS_PER_CALL { diff --git a/noir-projects/noir-contracts/contracts/test/state_vars_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/state_vars_contract/src/main.nr index 5d7d15081a88..8c8b46966d2a 100644 --- a/noir-projects/noir-contracts/contracts/test/state_vars_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/state_vars_contract/src/main.nr @@ -98,7 +98,7 @@ pub contract StateVars { let owner = self.msg_sender(); let new_note = FieldNote { value }; - self.storage.private_immutable.at(owner).initialize(new_note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.private_immutable.at(owner).initialize(new_note).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] @@ -106,14 +106,14 @@ pub contract StateVars { let owner = self.msg_sender(); let private_mutable = FieldNote { value }; - self.storage.private_mutable.at(owner).initialize(private_mutable).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.private_mutable.at(owner).initialize(private_mutable).deliver(MessageDelivery::onchain_constrained()); } #[external("private")] fn update_private_mutable(randomness: Field, value: Field) { let owner = self.msg_sender(); self.storage.private_mutable.at(owner).replace(|_old_note| FieldNote { value }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } @@ -129,7 +129,7 @@ pub contract StateVars { let new_value = old_note.value + 1; FieldNote { value: new_value } }) - .deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + .deliver(MessageDelivery::onchain_constrained()); } #[external("utility")] diff --git a/noir-projects/noir-contracts/contracts/test/stateful_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/stateful_test_contract/src/main.nr index 51ccd1cd095c..e27a7917256a 100644 --- a/noir-projects/noir-contracts/contracts/test/stateful_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/stateful_test_contract/src/main.nr @@ -41,7 +41,7 @@ pub contract StatefulTest { fn create_note(owner: AztecAddress, value: Field) { if (value != 0) { let note = FieldNote { value }; - self.storage.notes.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.notes.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); } } @@ -50,7 +50,7 @@ pub contract StatefulTest { fn create_note_no_init_check(owner: AztecAddress, value: Field) { if (value != 0) { let note = FieldNote { value }; - self.storage.notes.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.notes.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); } } @@ -61,7 +61,7 @@ pub contract StatefulTest { let _ = self.storage.notes.at(sender).pop_notes(NoteGetterOptions::new().set_limit(2)); - self.storage.notes.at(recipient).insert(FieldNote { value: 92 }).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.notes.at(recipient).insert(FieldNote { value: 92 }).deliver(MessageDelivery::onchain_constrained()); } #[external("public")] diff --git a/noir-projects/noir-contracts/contracts/test/static_child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/static_child_contract/src/main.nr index 310b07212f2b..3173f580a67b 100644 --- a/noir-projects/noir-contracts/contracts/test/static_child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/static_child_contract/src/main.nr @@ -46,7 +46,7 @@ pub contract StaticChild { #[view] fn private_illegal_set_value(new_value: Field, owner: AztecAddress) -> Field { let note = FieldNote { value: new_value }; - self.storage.a_private_value.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.a_private_value.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); new_value } @@ -55,7 +55,7 @@ pub contract StaticChild { fn private_set_value(new_value: Field, owner: AztecAddress, sender: AztecAddress) -> Field { let note = FieldNote { value: new_value }; - self.storage.a_private_value.at(owner).insert(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.a_private_value.at(owner).insert(note).deliver(MessageDelivery::onchain_constrained()); new_value } diff --git a/noir-projects/noir-contracts/contracts/test/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/test_contract/src/main.nr index 10084a241a8b..1affd074978a 100644 --- a/noir-projects/noir-contracts/contracts/test/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/test_contract/src/main.nr @@ -132,7 +132,7 @@ pub contract Test { #[external("private")] fn call_create_note(value: u128, owner: AztecAddress, storage_slot: Field, make_tx_hybrid: bool) { let note = UintNote { value }; - create_note(self.context, owner, storage_slot, note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + create_note(self.context, owner, storage_slot, note).deliver(MessageDelivery::onchain_constrained()); if make_tx_hybrid { self.enqueue_self.dummy_public_call(); @@ -307,7 +307,7 @@ pub contract Test { value4: fields[4], }; - self.emit(event).deliver_to(owner, MessageDelivery.ONCHAIN_UNCONSTRAINED); + self.emit(event).deliver_to(owner, MessageDelivery::onchain_unconstrained()); // this contract has reached max number of functions, so using this one fn // to test nested and non nested encrypted logs diff --git a/noir-projects/noir-contracts/contracts/test/test_log_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/test_log_contract/src/main.nr index 67c83345d957..9a1a865815e3 100644 --- a/noir-projects/noir-contracts/contracts/test/test_log_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/test_log_contract/src/main.nr @@ -70,14 +70,14 @@ pub contract TestLog { fn emit_encrypted_events(other: AztecAddress, preimages: [Field; 4]) { let event0 = ExampleEvent0 { value0: preimages[0], value1: preimages[1] }; - self.emit(event0).deliver_to(self.msg_sender(), MessageDelivery.ONCHAIN_CONSTRAINED); + self.emit(event0).deliver_to(self.msg_sender(), MessageDelivery::onchain_constrained()); // We duplicate the emission, but swapping the sender and recipient: - self.emit(event0).deliver_to(other, MessageDelivery.ONCHAIN_CONSTRAINED); + self.emit(event0).deliver_to(other, MessageDelivery::onchain_constrained()); let event1 = ExampleEvent1 { value2: AztecAddress::from_field(preimages[2]), value3: preimages[3] as u8 }; - self.emit(event1).deliver_to(self.msg_sender(), MessageDelivery.ONCHAIN_CONSTRAINED); + self.emit(event1).deliver_to(self.msg_sender(), MessageDelivery::onchain_constrained()); } #[external("public")] @@ -105,11 +105,11 @@ pub contract TestLog { let note_set = self.storage.example_set.at(other); // Create the first note and message, then immediately nullify. This squashes all effects. - note_set.insert(FieldNote { value: 0 }).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + note_set.insert(FieldNote { value: 0 }).deliver(MessageDelivery::onchain_unconstrained()); let _ = note_set.pop_notes(NoteGetterOptions::new()); // Deliver a second note message. Only this one will be included in the logs. - note_set.insert(FieldNote { value: 1 }).deliver(MessageDelivery.ONCHAIN_UNCONSTRAINED); + note_set.insert(FieldNote { value: 1 }).deliver(MessageDelivery::onchain_unconstrained()); } #[external("private")] @@ -125,12 +125,12 @@ pub contract TestLog { self.emit(ExampleEvent0 { value0: random_value_0, value1: random_value_1 }).deliver_to( other, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); self.emit(ExampleEvent0 { value0: random_value_2, value1: random_value_3 }).deliver_to( other, - MessageDelivery.ONCHAIN_UNCONSTRAINED, + MessageDelivery::onchain_unconstrained(), ); if num_nested_calls > 0 { diff --git a/noir-projects/noir-contracts/contracts/test/updatable_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/updatable_contract/src/main.nr index 32b02fe244ff..15591b4c35ba 100644 --- a/noir-projects/noir-contracts/contracts/test/updatable_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/updatable_contract/src/main.nr @@ -27,7 +27,7 @@ contract Updatable { fn initialize(initial_value: Field) { let owner = self.msg_sender(); let note = FieldNote { value: initial_value }; - self.storage.private_value.at(owner).initialize(note).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.private_value.at(owner).initialize(note).deliver(MessageDelivery::onchain_constrained()); self.enqueue_self._initialize_public_value(initial_value); } diff --git a/noir-projects/noir-contracts/contracts/test/updated_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test/updated_contract/src/main.nr index 8be8f3e34667..47aea4a6fc48 100644 --- a/noir-projects/noir-contracts/contracts/test/updated_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test/updated_contract/src/main.nr @@ -28,7 +28,7 @@ contract Updated { let owner = self.msg_sender(); self.storage.private_value.at(owner).replace(|_old| FieldNote { value: 27 }).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/noir-projects/protocol-fuzzer/contracts/side_effect_contract/src/main.nr b/noir-projects/protocol-fuzzer/contracts/side_effect_contract/src/main.nr index db015882abb0..3160c1484aaa 100644 --- a/noir-projects/protocol-fuzzer/contracts/side_effect_contract/src/main.nr +++ b/noir-projects/protocol-fuzzer/contracts/side_effect_contract/src/main.nr @@ -58,7 +58,7 @@ pub contract SideEffect { assert(value != 0, "note value must be non-zero"); let note = UintNote { value }; create_note(self.context, owner, storage_slot, note).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } diff --git a/yarn-project/aztec/scripts/templates/counter/contract/src/main.nr b/yarn-project/aztec/scripts/templates/counter/contract/src/main.nr index 72d1451613b8..1aaa70e264ad 100644 --- a/yarn-project/aztec/scripts/templates/counter/contract/src/main.nr +++ b/yarn-project/aztec/scripts/templates/counter/contract/src/main.nr @@ -27,14 +27,14 @@ pub contract Counter { // Delivers the note to the recipient onchain with provable correctness. // Without delivery, the recipient can't find or decrypt the note. self.storage.counters.at(owner).add(initial_value).deliver( - MessageDelivery.ONCHAIN_CONSTRAINED, + MessageDelivery::onchain_constrained(), ); } // Adds 1 to the owner's counter. #[external("private")] fn increment(owner: AztecAddress) { - self.storage.counters.at(owner).add(1).deliver(MessageDelivery.ONCHAIN_CONSTRAINED); + self.storage.counters.at(owner).add(1).deliver(MessageDelivery::onchain_constrained()); } // Returns the current value of the owner's counter.