From d4812546586b7a3629753c17a6253653360145f2 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Tue, 7 May 2024 21:17:37 +0000 Subject: [PATCH 1/2] feat(aztec-nr): add 'with_gas()' function to avm call interface --- .../aztec-nr/aztec/src/context/interface.nr | 32 ++++++++++++------- .../src/main.nr | 12 +++---- .../src/transforms/contract_interface.rs | 1 + 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/noir-projects/aztec-nr/aztec/src/context/interface.nr b/noir-projects/aztec-nr/aztec/src/context/interface.nr index 24064952321..cac03e3702d 100644 --- a/noir-projects/aztec-nr/aztec/src/context/interface.nr +++ b/noir-projects/aztec-nr/aztec/src/context/interface.nr @@ -206,20 +206,22 @@ struct AvmCallInterface { target_contract: AztecAddress, selector: FunctionSelector, args: [Field], + gas_opts: GasOpts, } impl AvmCallInterface { - pub fn call(self, context: &mut AvmContext, gas_opts: GasOpts) -> T where T: Deserialize { - let returns = context.call_public_function(self.target_contract, self.selector, self.args, gas_opts); + pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self { + self.gas_opts = gas_opts; + self + } + + pub fn call(self, context: &mut AvmContext) -> T where T: Deserialize { + let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts); returns.deserialize_into() } - pub fn static_call( - self, - context: &mut AvmContext, - gas_opts: GasOpts - ) -> T where T: Deserialize { - let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, gas_opts); + pub fn static_call(self, context: &mut AvmContext) -> T where T: Deserialize { + let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts); returns.deserialize_into() } @@ -233,16 +235,22 @@ struct AvmVoidCallInterface { target_contract: AztecAddress, selector: FunctionSelector, args: [Field], + gas_opts: GasOpts, } impl AvmVoidCallInterface { - pub fn call(self, context: &mut AvmContext, gas_opts: GasOpts) { - let returns = context.call_public_function(self.target_contract, self.selector, self.args, gas_opts); + pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self { + self.gas_opts = gas_opts; + self + } + + pub fn call(self, context: &mut AvmContext) { + let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts); returns.assert_empty() } - pub fn static_call(self, context: &mut AvmContext, gas_opts: GasOpts) { - let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, gas_opts); + pub fn static_call(self, context: &mut AvmContext) { + let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts); returns.assert_empty() } diff --git a/noir-projects/noir-contracts/contracts/avm_nested_calls_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_nested_calls_test_contract/src/main.nr index 4a0611968ed..1ebc736cc8d 100644 --- a/noir-projects/noir-contracts/contracts/avm_nested_calls_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_nested_calls_test_contract/src/main.nr @@ -40,36 +40,36 @@ contract AvmNestedCallsTest { l2_gas: Field, da_gas: Field ) -> pub Field { - AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).call(&mut context, GasOpts::new(l2_gas, da_gas)) + AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).with_gas(GasOpts::new(l2_gas, da_gas)).call(&mut context) } // Use the `call_public_function` wrapper to initiate a nested call to the add function #[aztec(public-vm)] fn nested_call_to_add(arg_a: Field, arg_b: Field) -> pub Field { - AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).call(&mut context, GasOpts::default()) + AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).call(&mut context) } // Indirectly call_static the external call opcode to initiate a nested call to the add function #[aztec(public-vm)] fn nested_static_call_to_add(arg_a: Field, arg_b: Field) -> pub Field { - AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).static_call(&mut context, GasOpts::default()) + AvmNestedCallsTest::at(context.this_address()).add_args_return(arg_a, arg_b).static_call(&mut context) } // Indirectly call_static `set_storage_single`. Should revert since it's accessing storage. #[aztec(public-vm)] fn nested_static_call_to_set_storage() { - AvmNestedCallsTest::at(context.this_address()).set_storage_single(20).static_call(&mut context, GasOpts::default()); + AvmNestedCallsTest::at(context.this_address()).set_storage_single(20).static_call(&mut context); } #[aztec(public-vm)] fn create_same_nullifier_in_nested_call(nestedAddress: AztecAddress, nullifier: Field) { context.push_new_nullifier(nullifier, 0); - AvmNestedCallsTest::at(nestedAddress).new_nullifier(nullifier).call(&mut context, GasOpts::default()); + AvmNestedCallsTest::at(nestedAddress).new_nullifier(nullifier).call(&mut context); } #[aztec(public-vm)] fn create_different_nullifier_in_nested_call(nestedAddress: AztecAddress, nullifier: Field) { context.push_new_nullifier(nullifier, 0); - AvmNestedCallsTest::at(nestedAddress).new_nullifier(nullifier + 1).call(&mut context, GasOpts::default()); + AvmNestedCallsTest::at(nestedAddress).new_nullifier(nullifier + 1).call(&mut context); } } diff --git a/noir/noir-repo/aztec_macros/src/transforms/contract_interface.rs b/noir/noir-repo/aztec_macros/src/transforms/contract_interface.rs index 5f68ce98c8a..1afe0a30068 100644 --- a/noir/noir-repo/aztec_macros/src/transforms/contract_interface.rs +++ b/noir/noir-repo/aztec_macros/src/transforms/contract_interface.rs @@ -126,6 +126,7 @@ pub fn stub_function(aztec_visibility: &str, func: &NoirFunction) -> String { target_contract: self.target_contract, selector: {}, args: args_acc, + gas_opts: dep::aztec::context::gas::GasOpts::default(), }}", args, is_void, fn_selector, ); From 046c488a152bd17a99e17f10a4d8d6aa9b173251 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Wed, 8 May 2024 01:50:31 +0000 Subject: [PATCH 2/2] feat(aztec-nr): add enqueue functions to AvmCallInterface --- .../aztec-nr/aztec/src/context/interface.nr | 31 +++++++++++++++++++ .../src/main.nr | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/noir-projects/aztec-nr/aztec/src/context/interface.nr b/noir-projects/aztec-nr/aztec/src/context/interface.nr index cac03e3702d..7f72656252b 100644 --- a/noir-projects/aztec-nr/aztec/src/context/interface.nr +++ b/noir-projects/aztec-nr/aztec/src/context/interface.nr @@ -1,5 +1,6 @@ use dep::protocol_types::{abis::function_selector::FunctionSelector, address::{AztecAddress, EthAddress}, traits::Deserialize}; +use crate::hash::hash_args; use crate::context::private_context::PrivateContext; use crate::context::public_context::PublicContext; use crate::context::avm_context::AvmContext; @@ -229,6 +230,21 @@ impl AvmCallInterface { let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args); returns.deserialize_into() } + + pub fn enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, false, false) + } + + pub fn static_enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, true, false) + } + + pub fn delegate_enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, false, true) + } } struct AvmVoidCallInterface { @@ -258,4 +274,19 @@ impl AvmVoidCallInterface { let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args); returns.assert_empty() } + + pub fn enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, false, false) + } + + pub fn static_enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, true, false) + } + + pub fn delegate_enqueue(self, context: &mut PrivateContext) { + let args_hash = hash_args(self.args); + context.call_public_function_with_packed_args(self.target_contract, self.selector, args_hash, false, true) + } } diff --git a/noir-projects/noir-contracts/contracts/avm_acvm_interop_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_acvm_interop_test_contract/src/main.nr index bece62fc8dc..fa459a62255 100644 --- a/noir-projects/noir-contracts/contracts/avm_acvm_interop_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_acvm_interop_test_contract/src/main.nr @@ -28,7 +28,7 @@ contract AvmAcvmInteropTest { } #[aztec(public)] - fn new_nullifier_acvm(nullifier: Field) -> pub Field { + fn new_nullifier_acvm(nullifier: Field) { context.push_new_nullifier(nullifier, 0); }