diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr index feee4ecfeccc..71dbdaf08f06 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr @@ -35,6 +35,7 @@ contract AppSubscriptionContract { // Constructs the contract #[aztec(private)] + #[aztec(initializer)] fn constructor( target_address: AztecAddress, subscription_recipient_address: AztecAddress, diff --git a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr index a7ad7b4888e1..7782c5c3bf81 100644 --- a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr @@ -17,6 +17,7 @@ contract Counter { // docs:start:constructor #[aztec(private)] + #[aztec(initializer)] fn constructor(headstart: u64, owner: AztecAddress) { let counters = storage.counters; counters.at(owner).add(headstart, owner); diff --git a/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr index 513026f3360f..0acb8c4e028d 100644 --- a/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/easy_private_token_contract/src/main.nr @@ -13,6 +13,7 @@ contract EasyPrivateToken { * initialize the contract's initial state variables. */ #[aztec(private)] + #[aztec(initializer)] fn constructor(initial_supply: u64, owner: AztecAddress) { let balances = storage.balances; diff --git a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr index a6a388e64594..5a25136195d6 100644 --- a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr @@ -14,7 +14,8 @@ contract EasyPrivateVoting { // docs:end:storage_struct // docs:start:constructor - #[aztec(private)] // annotation to mark function as private and expose private context + #[aztec(private)] + #[aztec(initializer)] // annotation to mark function as private and expose private context fn constructor(admin: AztecAddress) { // called when contract is deployed context.call_public_function( // we cannot update public state directly from private function but we can call public function (which queues it) diff --git a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr index e741663b5df6..3ab9a2edfcd6 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_account_contract/src/main.nr @@ -26,6 +26,7 @@ contract EcdsaAccount { // Creates a new account out of an ECDSA public key to use for signature verification #[aztec(private)] + #[aztec(initializer)] fn constructor(signing_pub_key_x: pub [u8; 32], signing_pub_key_y: pub [u8; 32]) { let this = context.this_address(); let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this); diff --git a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr index f1fde13f770e..db9c51eab857 100644 --- a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr @@ -19,6 +19,7 @@ contract Escrow { // Creates a new instance // docs:start:constructor #[aztec(private)] + #[aztec(initializer)] fn constructor(owner: pub AztecAddress) { let this = context.this_address(); diff --git a/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr b/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr index 70333ebcd7e4..518284defdef 100644 --- a/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr @@ -12,6 +12,7 @@ contract FPC { } #[aztec(private)] + #[aztec(initializer)] fn constructor(other_asset: AztecAddress, fee_asset: AztecAddress) { let selector = FunctionSelector::from_signature("_initialize((Field),(Field))"); context.call_public_function( diff --git a/noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr index c7ff4fa3a4af..180522176a1e 100644 --- a/noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/import_test_contract/src/main.nr @@ -11,6 +11,7 @@ contract ImportTest { }; #[aztec(private)] + #[aztec(initializer)] fn constructor( ) {} diff --git a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr index 1aa7f911ad9a..1814d616a8d0 100644 --- a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr @@ -37,6 +37,7 @@ contract InclusionProofs { } #[aztec(private)] + #[aztec(initializer)] fn constructor(public_value: Field) { let selector = FunctionSelector::from_signature("_initialize(Field)"); context.call_public_function(context.this_address(), selector, [public_value]); diff --git a/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr index bc039a499bec..7a6e6d1376c7 100644 --- a/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr @@ -36,6 +36,7 @@ contract Lending { // Constructs the contract. #[aztec(private)] + #[aztec(initializer)] fn constructor( ) {} diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index e7e4ebdafa0c..5717762a7c1d 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -29,6 +29,7 @@ contract SchnorrAccount { // Constructs the contract #[aztec(private)] + #[aztec(initializer)] fn constructor(signing_pub_key_x: pub Field, signing_pub_key_y: pub Field) { let this = context.this_address(); // docs:start:initialize diff --git a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr index d0738221169a..ed0b66ee9235 100644 --- a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr @@ -25,7 +25,6 @@ contract StatefulTest { } #[aztec(private)] - #[aztec(initcheck)] fn create_note(owner: AztecAddress, value: Field) { if (value != 0) { let loc = storage.notes.at(owner); @@ -34,6 +33,7 @@ contract StatefulTest { } #[aztec(private)] + #[aztec(noinitcheck)] fn create_note_no_init_check(owner: AztecAddress, value: Field) { if (value != 0) { let loc = storage.notes.at(owner); @@ -54,6 +54,7 @@ contract StatefulTest { } #[aztec(private)] + #[aztec(noinitcheck)] fn destroy_and_create_no_init_check(recipient: AztecAddress, amount: Field) { let sender = context.msg_sender(); diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr index 15fc502e02a2..a61b90acb722 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr @@ -36,6 +36,7 @@ contract Test { } #[aztec(private)] + #[aztec(initializer)] // docs:start:empty-constructor fn constructor() {} // docs:end:empty-constructor @@ -227,6 +228,7 @@ contract Test { // Forcefully emits a nullifier (for testing purposes) #[aztec(private)] + #[aztec(noinitcheck)] fn emit_nullifier(nullifier: Field) { context.push_new_nullifier(nullifier, 0); } diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr index 665de878c4c2..34928ebc3d9e 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr @@ -42,6 +42,7 @@ contract TokenBlacklist { // docs:start:constructor #[aztec(private)] + #[aztec(initializer)] fn constructor(admin: AztecAddress, slow_updates_contract: AztecAddress) { // docs:end:constructor let selector = FunctionSelector::from_signature("_initialize((Field),(Field))"); diff --git a/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr index 8a00972b733a..5f55bacc779e 100644 --- a/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr @@ -24,6 +24,7 @@ contract TokenBridge { // Constructs the contract. #[aztec(private)] + #[aztec(initializer)] fn constructor(token: AztecAddress) { let selector = FunctionSelector::from_signature("_initialize((Field))"); context.call_public_function(context.this_address(), selector, [token.to_field()]); diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index 7a20030245a3..b1a37a66a779 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -54,6 +54,7 @@ contract Token { // docs:start:constructor #[aztec(private)] + #[aztec(initializer)] fn constructor(admin: AztecAddress, name: str<31>, symbol: str<31>, decimals: u8) { let selector = FunctionSelector::from_signature("_initialize((Field),(Field),(Field),u8)"); let name_s = FieldCompressedString::from_string(name); diff --git a/noir/aztec_macros/src/lib.rs b/noir/aztec_macros/src/lib.rs index 2516b380ff6a..a2b0fecdcb27 100644 --- a/noir/aztec_macros/src/lib.rs +++ b/noir/aztec_macros/src/lib.rs @@ -435,22 +435,26 @@ fn transform_module( } } + let has_initializer = module.functions.iter().any(|func| func.def.attributes.secondary.iter().any(|attr| is_custom_attribute(&attr, "aztec(initializer)"))); + for func in module.functions.iter_mut() { let mut is_private = false; let mut is_public = false; let mut is_public_vm = false; let mut is_initializer = false; - let mut skip_init_check = true; // Default to true once we're confident that the approach works + let mut insert_init_check = has_initializer; for secondary_attribute in func.def.attributes.secondary.clone() { if is_custom_attribute(&secondary_attribute, "aztec(private)") { is_private = true; } else if is_custom_attribute(&secondary_attribute, "aztec(initializer)") { is_initializer = true; - } else if is_custom_attribute(&secondary_attribute, "aztec(initcheck)") { - skip_init_check = false; + insert_init_check = false; + } else if is_custom_attribute(&secondary_attribute, "aztec(noinitcheck)") { + insert_init_check = false; } else if is_custom_attribute(&secondary_attribute, "aztec(public)") { is_public = true; + insert_init_check = false; } else if is_custom_attribute(&secondary_attribute, "aztec(public-vm)") { is_public_vm = true; } @@ -463,7 +467,7 @@ fn transform_module( func, storage_defined, is_initializer, - skip_init_check, + insert_init_check, ) .map_err(|err| (err, crate_graph.root_file_id))?; has_transformed_module = true; @@ -655,14 +659,14 @@ fn transform_function( func: &mut NoirFunction, storage_defined: bool, is_initializer: bool, - skip_init_check: bool, + insert_init_check: bool, ) -> Result<(), AztecMacroError> { let context_name = format!("{}Context", ty); let inputs_name = format!("{}ContextInputs", ty); let return_type_name = format!("{}CircuitPublicInputs", ty); // Add initialization check - if !skip_init_check { + if insert_init_check { if ty == "Public" { let error = AztecMacroError::UnsupportedAttributes { span: func.def.name.span(),