@aztec/protocol-contracts 2.0.0-nightly.20250828 → 2.0.0-nightly.20250830
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.11+nightly-2025-08-
|
|
3
|
+
"noir_version": "1.0.0-beta.11+nightly-2025-08-28-aztec",
|
|
4
4
|
"name": "AuthRegistry",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -2447,7 +2447,7 @@
|
|
|
2447
2447
|
}
|
|
2448
2448
|
},
|
|
2449
2449
|
"bytecode": "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",
|
|
2450
|
-
"debug_symbols": "rVvbbhs5DP0XP+
|
|
2450
|
+
"debug_symbols": "rVvbbhs5DP0XP+dBJCVSyq8UiyJtvYsAQVpkkwKLov++lERpJi6kjGf8ksOxPScSxZtuv07fzl/e/vn8+Pz3939P959+nb68PD49Pf7z+en714fXx+/P+umvk8t/IJ3u/d0JXQWogBWogq8QTvdRgU/3SUEqxAqpALkKUAErUAVfIVSoLFRZqLJQZfGVxVcWrywAimToDYMhG4phNEwVgzMEQ+MLxheMLxhfML5gfMH4gvGx8bHxsfGx8bHxsfGx8Un+HSpmHro7xfysao35PVH0hsGQDcUwGqaKyRmCIRoaXzK+ZHzJ+JLxJeNLxgfONQGagE2gJvgmhCZwEzKP2gdAfitlQd9ClwXfBP0xQhakCbEJ+jqqeiBbYnk922IVGmG2xyr4JoQmcBOkCdGEbI1IWVAe9FmgJvgmhCZwE6QJsQmpDhhk+6wCNAGbQE3wTQhN4CaICdkyMWQBmoBNoCbkFnIWQhO4CdKE2IRkQrbRKkATMjP/Vik7fW4UVtfB6jlYHQer36D+EPMPs8Yx1hBQMBiyoRhGw/yyBQK0SIAWCtBiAVowQIsGaOGAoMaDgtEwVcwqLwiGaEiGykdYgwJZz8i6RlT7VjBVzKovCIZoSIa+YnbigmxofGx8bHxifGJ82dlJx1jI0BtmPh1XYUMxjIapYnSGmS/oaFAZjfzENTwXJENvGAwzex5sXyJ81rXoU9g69NwSA/zWp5YzPr++nM/5m1US0dTy4+Hl/Px6un9+e3q6O/18eHorP/r3x8NzwdeHF/1Wvf/8/E1RCf9+fDpn6ffd8rYbv+ol2ctM0F9Xz9hKELKFFIIgvCLgrQTqu5GNQt0XQicJ+I6DxhwcsPUiuV2NCI6kNSI4jqNGhFkjfKNgdkszCNM7Ch5TCEgwCkGMQwqZ9SS1AdFI5ReKkDZ3RLi1giXSsBXb9Sky0ifMTEsHotlWwMW46AqGsDAE2cPAObtVBka/i4FSZwg4YJjrEnjRZfRDXU7GlEILEsQLAaihv2OY2Kb3LhqF9+vRuDCsOYdfOHzaxxG4acOzgzHHTBuIXRuyUxuRek9WMeeqnqh/9p7ARBtT6/K8WBfsss8QOgPvsvAQffeytKsNQbAzRLjeR1B6J1DSekhlK8WiyAi4yiG4lSBSJwhhF0GP3MnxkIAmDNQDN8lqJCXtYVhHftkc+RM1v0je79EC+j6SK9+8ogUoLfNg2tWF49UEcFOCTsZW1ujC5k4g9l5gwiEFxQkHSWsGUlpMUi4o0jRQtoBNtAq2FxR+mr4oLaWAh1WshAsWmLDE0MuauM6iBNs5ZBkWiROOSaWpE9XeDr8ur67h0Iq3K2RV7/7BMdWqJ79o1cexVnlmZb16Rwxu3BK5gUa2ciDs49iq1Zk+tBzoHhPH+pg5ri4LLI5LQ8fNMWbYFYdLXxytsslFhTIn8RQ6iU6sRiSzbCA9L2s6WBWe7+eXYVJqaSjkbqhMcTgTCHx8ahXk+NwqxBtMruYKWaZGOjdwI4XwPD2k1M2MmIckk3gonLpGhHAYQXhiZeJ7vhcfx7GdaTY3aUbmYemIBqT3DH6mjti1QQ7HHGGatLEn7Rj2cZBr7dAF0TjmmNhp6vVPCvsYNHz0njgO+zTK0fUybBXGLjnEHdeGwFFtbGSQiS5m9pn6pBV2alP6DB6F3LgfM9sSWaqXNLZx4cPa5OO2Ne1JWuwi4bgn8yga+qgAM4/TypSEpa+ssHgckcRpVenTMjCBhkuHcRJGQ0rQ15lSWqXai2QdJ3aKqa9JkFtVcxfFevTHU0IMx1NC5KMpIcrxlBDj8ZQwbcdG10/uuOunw4F0xrDV9ac92ej6H/hKr9JVHhe2H5B4v5Cs1jouSNLMSqUnhnebJ3xNM3rw0MJ27PdpYqZMIULfxVkvf11D4lNfV1U5DRWyPRZO9nJ0G3xWN9BSN6yGV9wVHL6vreqMMo05jsdTcNOA2iOZ8HplEy5JwvEl2hsEdnByPLKDi0dDO7h0PLYDuOPBfd6SjdEdAI+HdwA6Gt+nFFsD/LwzGyP8BxFgCSMT752HIiG3hKIgu2q76PqiAei2wHCaDTA3V1ivCQ0rREB3Aw9GuIEHIx72YKQbeDD6G3jwtCVbPRj5Bh6Mhyf+U4rNHjztzNYabeo4QLg4ThjvWdOEBR0v69OOV6tclzu1NA2vfSkD4mqEL/cGP2jKsnmg8sp1/mjKLAunuDhxSuj3rMnGXrhS4jRakwWaDTGFZeKri5crxcI1LEtxo/JqdeUPllk9IKstx9WW4WWVNdum2r7HBNNNlY2bTHOSjbtMmtiOb6rMSTbuiGxvyWRr5oPx2bpbBbfYroJb7FfBLTas4BY7VnCLLauPPDmGZcq1qi4uPXm247RtOvxBQ8QvIUViGjdkFmadSBselWMcBuvZ6uDmYP1BW2KvZUWnaOMcNtu8SqtKh9aHSzaf0+Qy1a3Te4CLMwl/6ePD18eX91cYyn2FYBcWgt1YCPVEbD5Olk/EFuR8DLSeVy4YFX09r5wxn1dmO6/Mdl45m0o+r1xQ+XKKLrcXyK4vkN1fILvAIHaDoV1hsDsM4JzdYigClRqo3WMI7SKDtJsM0a4y5GPR5S5DEZIJ5TZDO7kMefe03GcoQjl77u1GQxFCE7gJmTkrpNxqKEIyodxryLopFxvyVme52VCEzFwKvp8PL48PX57OWfl5fN6ev7ax0MfX/360b9qFkx8v37+ev729nPO4LbdO9M8nUAfQ6u2vfHcgP2qOBXH5EfKjqhVSyMNejqxrEz5pCeX77zUPBs5fl4Pq9aN4x9QIdMUzpvw9tddVf5Ta65offWH3/XWtshHyR2H+D7m/ofMY1I+ydf4P",
|
|
2451
2451
|
"brillig_names": [
|
|
2452
2452
|
"emit_authorization_as_offchain_effect",
|
|
2453
2453
|
"store_in_execution_cache_oracle_wrapper",
|
|
@@ -3531,7 +3531,7 @@
|
|
|
3531
3531
|
},
|
|
3532
3532
|
"61": {
|
|
3533
3533
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr",
|
|
3534
|
-
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3534
|
+
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n /// Makes the call to this private function.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n /// This enables contracts to interact with each other while maintaining\n /// privacy. This \"composability\" of private contract functions is a key\n /// feature of the Aztec network.\n ///\n /// If a user's transaction includes multiple private function calls, then\n /// by the design of Aztec, the following information will remain private[1]:\n /// - The function selectors and contract addresses of all private function\n /// calls will remain private, so an observer of the public mempool will\n /// not be able to look at a tx and deduce which private functions have\n /// been executed.\n /// - The arguments and return values of all private function calls will\n /// remain private.\n /// - The person who initiated the tx will remain private.\n /// - The notes and nullifiers and private logs that are emitted by all\n /// private function calls will (if designed well) not leak any user\n /// secrets, nor leak which functions have been executed.\n ///\n /// [1] Caveats: Some of these privacy guarantees depend on how app\n /// developers design their smart contracts. Some actions _can_ leak\n /// information, such as:\n /// - Calling an internal public function.\n /// - Calling a public function and not setting msg_sender to Option::none\n /// (see https://github.com/AztecProtocol/aztec-packages/pull/16433)\n /// - Calling any public function will always leak details about the nature\n /// of the transaction, so devs should be careful in their contract\n /// designs. If it can be done in a private function, then that will give\n /// the best privacy.\n /// - Not padding the side-effects of a tx to some standardised, uniform\n /// size. The kernel circuits can take hints to pad side-effects, so a\n /// wallet should be able to request for a particular amount of padding.\n /// Wallets should ideally agree on some standard.\n /// - Padding should include:\n /// - Padding the lengths of note & nullifier arrays\n /// - Padding private logs with random fields, up to some standardised\n /// size.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Advanced\n /// * The call is added to the private call stack and executed by kernel\n /// circuits after this function completes\n /// * The called function can modify its own contract's private state\n /// * Side effects from the called function are included in this transaction\n /// * The call inherits the current transaction's context and gas limits\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n /// Makes a _read-only_ call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// See `call` for more general info on private function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n /// Makes a read-only call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the call to this public function.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Makes a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a call to this public function, to be executed later.\n ///\n /// Unlike private functions which execute immediately on the user's device,\n /// public function calls are \"enqueued\" and executed some time later by a\n /// block proposer.\n ///\n /// This means a public function cannot return any values back to a private\n /// function, because by the time the public function is being executed,\n /// the private function which called it has already completed execution.\n /// (In fact, the private function has been executed and proven, along with\n /// all other private function calls of the user's tx. A single proof of the\n /// tx has been submitted to the Aztec network, and some time later a\n /// proposer has picked the tx up from the mempool and begun executing all\n /// of the enqueued public functions).\n ///\n /// # Privacy warning\n /// Enqueueing a public function call is an inherently leaky action.\n /// Many interesting applications will require some interaction with public\n /// state, but smart contract developers should try to use public function\n /// calls sparingly, and carefully.\n /// _Internal_ public function calls are especially leaky, because they\n /// completely leak which private contract made the call.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n /// Enqueues a call to this public function, and designates it to be the\n /// teardown function for this tx. Only one teardown function call can be\n /// made by a tx.\n ///\n /// Niche function: Only wallet developers and paymaster contract developers\n /// (aka Fee-payment contracts) will need to make use of this function.\n ///\n /// Aztec supports a three-phase execution model: setup, app logic, teardown.\n /// The phases exist to enable a fee payer to take on the risk of paying\n /// a transaction fee, safe in the knowledge that their payment (in whatever\n /// token or method the user chooses) will succeed, regardless of whether\n /// the app logic will succeed. The \"setup\" phase ensures the fee payer\n /// has sufficient balance to pay the proposer their fees.\n /// The teardown phase is primarily intended to: calculate exactly\n /// how much the user owes, based on gas consumption, and refund the user\n /// any change.\n ///\n /// Note: in some cases, the cost of refunding the user (i.e. DA costs of\n /// tx side-effects) might exceed the refund amount. For app logic with\n /// fairly stable and predictable gas consumption, a material refund amount\n /// is unlikely. For app logic with unpredictable gas consumption, a\n /// refund might be important to the user (e.g. if a hefty function reverts\n /// very early). Wallet/FPC/Paymaster developers should be mindful of this.\n ///\n /// See `enqueue` for more information about enqueuing public function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3535
3535
|
},
|
|
3536
3536
|
"68": {
|
|
3537
3537
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.11+nightly-2025-08-
|
|
3
|
+
"noir_version": "1.0.0-beta.11+nightly-2025-08-28-aztec",
|
|
4
4
|
"name": "ContractClassRegistry",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -8340,7 +8340,7 @@
|
|
|
8340
8340
|
},
|
|
8341
8341
|
"5": {
|
|
8342
8342
|
"path": "std/cmp.nr",
|
|
8343
|
-
"source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl<T, let N: u32> Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl<T> Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n if result {\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n }\n result\n }\n}\n\nimpl<let N: u32> Eq for str<N> {\n fn eq(self, other: str<N>) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl<A, B> Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl<A, B, C> Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl<A, B, C, D> Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl<A, B, C, D, E> Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl<T, let N: u32> Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl<T> Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl<A, B> Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl<A, B, C> Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D> Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D, E> Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max<T>(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min<T>(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use super::{Eq, max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n\n #[test]\n fn correctly_handles_unequal_length_slices() {\n let slice_1 = &[0, 1, 2, 3];\n let slice_2 = &[0, 1, 2];\n assert(!slice_1.eq(slice_2));\n }\n}\n"
|
|
8343
|
+
"source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl<T, let N: u32> Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl<T> Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n if result {\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n }\n result\n }\n}\n\nimpl<let N: u32> Eq for str<N> {\n fn eq(self, other: str<N>) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl<A, B> Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl<A, B, C> Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl<A, B, C, D> Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl<A, B, C, D, E> Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl<T, let N: u32> Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl<T> Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let self_len = self.len();\n let other_len = other.len();\n let min_len = if self_len < other_len {\n self_len\n } else {\n other_len\n };\n\n let mut result = Ordering::equal();\n for i in 0..min_len {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n\n if result != Ordering::equal() {\n result\n } else {\n self_len.cmp(other_len)\n }\n }\n}\n\nimpl<A, B> Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl<A, B, C> Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D> Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D, E> Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max<T>(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min<T>(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use super::{Eq, max, min, Ord};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n\n #[test]\n fn correctly_handles_unequal_length_slices() {\n let slice_1 = &[0, 1, 2, 3];\n let slice_2 = &[0, 1, 2];\n assert(!slice_1.eq(slice_2));\n }\n\n #[test]\n fn lexicographic_ordering_for_slices() {\n assert(&[2_u32].cmp(&[1_u32, 1_u32, 1_u32]) == super::Ordering::greater());\n assert(&[1_u32, 2_u32].cmp(&[1_u32, 2_u32, 3_u32]) == super::Ordering::less());\n }\n}\n"
|
|
8344
8344
|
},
|
|
8345
8345
|
"54": {
|
|
8346
8346
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/contract_class_registry/src/main.nr",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.11+nightly-2025-08-
|
|
3
|
+
"noir_version": "1.0.0-beta.11+nightly-2025-08-28-aztec",
|
|
4
4
|
"name": "ContractInstanceRegistry",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
|
-
"bytecode": "
|
|
39
|
-
"debug_symbols": "pZhRbuM4DIbv4uc8SCIpib3KYFCkbToIEKRFpl1gUfTuSyqi7HQhYap5iT/T8W+SoijZH8vT4eH91/3x/Pzye7n78bE8XI6n0/HX/enlcf92fDmL9WNx+pPDcge7JaflDncLh3LwztUjLXdJjl7OvRo8VYBYAe0S2iUyC5klmiWiQa6QwCBVUI+
|
|
38
|
+
"bytecode": "JwACBAEoAAABBIBFJwAABAMnAgEEACcCAgQAHwoAAQACgEQlAAAARSUAAABNLgIAAYBEKAIAAgSARCcCAwQBOw4AAwACKACAQwQAAyYlAAADsB4CAAIJJwIDAQEkAgACAAAAaSUAAAPZHgIAAgEnAgQAACsCAAUAAAAAAAAAAAIAAAAAAAAAAC0IAQYnAgcEBQAIAQcBJwMGBAEAIgYCBy0KBwgtDgQIACIIAggtDgQIACIIAggtDgQIACIIAggtDgUILQgBBQAAAQIBLQgBBwAAAQIBLQgBCAAAAQIBLQgBCQAAAQIBJwIKAAEtCAELJwIMBAQACAEMAScDCwQBACILAgwtCgwNLQ4KDQAiDQINLQ4CDQAiDQINLQ4EDS0OCwUtDgYHJwICBAItDgIIJwICAQAtDgIJJwIGBAAnAgoEAS0KBgEjAAABSw0iAAGAQwAGJAIABgAAAyQjAAABYC0LBwYtCwYLACILAgstDgsGJwILBAQtCAEMJwINBAUACAENAScDDAQBACIGAg0nAg4EBAAiDAIPPw8ADQAPLQsFBi0LCAstDgYFLQ4MBy0OCwgtDgMJACoMCgUtCwUDCioDBAUKKgUCBCQCAAQAAAHWJQAAA+seAgACBi8KAAMABBwKBAUEHAoFAwACKgQDBSwCAAMALV4Ji4K6N7Q7maExYRj9INQvUWbJ6fE/teplqW0eCm0EKgUDBBwKBAYEHAoGBQACKgQFBgQqBgMEHAoEBwEcCgcGABwKBgcBAioEBggsAgAEADAz6iRuUG6Jjpf1cMr/1wTLC7RgMT+3ILKeE55cEAABBCoIBAkcCgkKBBwKCggAAioJCAoEKgoDCRwKCQoBHAoKAwAcCgMKAQIqCQMLBCoLBAkcCgkLBBwKCwQAHAoECQUWCgoEHAoDCgUcCgQDBQQqCgkEHAoICQUWCgcIHAoGBwUcCggGBQQqBwkIHAoFCQUMKgIJBSkCAAIFAAFRgCQCAAUAAAMLIwAAAvMEKgcIAwQqBgIEACoDBAItCgIBIwAAAyMEKgoEBQQqAwIEACoFBAItCgIBIwAAAyMmLQsIBgwqAQYLJAIACwAAAzojAAADoi0LBwsAIgsCDQAqDQEOLQsODC0LBQ0AIg0CDwAqDwEQLQsQDgAqDA4PLQsJDC4CAAuAAygAgAQEAAUlAAAD/S4IgAUADgAiDgIQACoQAREtDg8RLQ4NBS0ODgctDgYILQ4MCSMAAAOiACoBCgYtCgYBIwAAAUsoAIAEBHgADQAAAIAEgAMkAIADAAAD2CoBAAEF96Hzr6Wt1Mo8BAIBJioBAAEFnWxwmVvf/NM8BAIBJioBAAEFAtxuJ4B2Ep08BAIBJi4BgAOABgsAgAYAAoAHJACABwAABBgjAAAEIy4AgAOABSMAAASKLgAAAYAFAQAAAYAEAAEBAIADgASACS4AgAOACi4AgAWACwsAgAqACYAMJACADAAABHYuAYAKgAguBIAIgAsBAIAKAAKACgEAgAsAAoALIwAABEUoAYAFBAABAwCABgACgAYjAAAEiiY=",
|
|
39
|
+
"debug_symbols": "pZhRbuM4DIbv4uc8SCIpib3KYFCkbToIEKRFpl1gUfTuSyqi7HQhYap5iT/T8W+SoijZH8vT4eH91/3x/Pzye7n78bE8XI6n0/HX/enlcf92fDmL9WNx+pPDcge7JaflDncLh3LwztUjLXdJjl7OvRo8VYBYAe0S2iUyC5klmiWiQa6QwCBVUI+uYI9gb6CCoMBXCA4NcgUPBqlCCAaxAqhgVIgVShQFqAKZhcwSzVKiKJArlCgKpAoligL6CMlhYGeABnwFcGCQK6iHwQmQ6ASvECuoG1cgA9EJQSChQa6QwcAsbBauFnRgYBaPBmYpOWSFWAGcARronyW9iGAg2QiSBCxRFDBLcV4hiQ44BbEACWSJHZJCrKAFAFlBLfIsAjCQh6LcTvrQK6hF0kKklqCgFvGHIhiYRQcOUUEt8vSoFV4g6ByIClRBQ8akoBbxJ2rZICtQBTKLlg2JP1HHi7yCWsSfqCFfQS3iRsx2V0azcAU2i1YLiatJa16dTzpexaI1fwWzBLWQglrE56x3aUXlcpc4n3UoC0CtqAy1ojKaBdFA7xIPs2b1CmaJMrhRlWOqkHy9S6dDgWw6GlcBrs9i5wyapf6HNa4rVB0OVZmvPn9+7hbrafdvl8NBW9qmyUnre91fDue35e78fjrtln/2p/fyp9+v+3M5vu0vclW8Ppyf5CiCz8fTQelzt97t+rd66Qe53i6cVglpnzcivi8i3SFDFRFmbiKRbzRCXwPAJawawpx6Gt8IJnSDGYik4FLVSCFQk6DbnNLADSYI5gYTul4ocZCOAIksHQHYTaQj+ZRbJC72Isl9BekMFoj0hk06U7yR4EEyKFplbAQA4ba4RmEgWHElzGsiwH8p0EGFQosD/ZoIHd4bhUF9BlnILZDguK8BfQ1iqyxp1HNehMzmBWzy+T+NUXlSsIbhCdOkRuSmkXkuluRbaSRwfY1BgcrGy2rDJx7kg0f1FVp5xSkFRpuqTHlKwbvQOoaLNJcL6byt64R+LkbznVKr0AjYne8BBxoJzA0ZVb9pwflWY1BesjNuZe5i3PhBU80Pu80vpEHT4NhWJM59L8Igo4HW8hIm6C6NPFoMklsXA9kedUWG0bAlBF1w3Whg0EaJ2MaFYsC+xmihdzFbkcma73IvGICRiHO+ibj+EguDSpWXkdxEovfYFRmlJBK0lHC/SGCw2Mt7W+uEGNduCl+mzFhjXZ9k+zGr4ZrGZs58S4PyWu886Ud0LR8RcVaDmsamK39PI+emsdmRfksj+dRWOcyzGutKGf2kxhpL4kk/sm9jm9HParQ6zUSTGhmbBsOcBvv1lQWnNVo+mCbnC6/zhSfnC0iFt+Uhz+UU5EuKaWCYm3NA3voHbF97vmr88TIF/SWG4mgnxK0+HGxq3fs/39O1t0AOk7vCaAPLif52X/lV4aec7h+Pl5uPop8qdTnuH06Hevr8fn7cXH3799Wu2EfV18vL4+Hp/XJQpfXLqvz88NIx5FXnp35K1dMUdz57PfXlKslp+vmpzvwH",
|
|
40
40
|
"brillig_names": [
|
|
41
41
|
"get_update_delay"
|
|
42
42
|
]
|
|
@@ -2335,7 +2335,7 @@
|
|
|
2335
2335
|
}
|
|
2336
2336
|
},
|
|
2337
2337
|
"bytecode": "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",
|
|
2338
|
-
"debug_symbols": "
|
|
2338
|
+
"debug_symbols": "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",
|
|
2339
2339
|
"brillig_names": [
|
|
2340
2340
|
"store_in_execution_cache_oracle_wrapper",
|
|
2341
2341
|
"call_private_function_internal",
|
|
@@ -2398,8 +2398,8 @@
|
|
|
2398
2398
|
}
|
|
2399
2399
|
}
|
|
2400
2400
|
},
|
|
2401
|
-
"bytecode": "
|
|
2402
|
-
"debug_symbols": "
|
|
2401
|
+
"bytecode": "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",
|
|
2402
|
+
"debug_symbols": "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",
|
|
2403
2403
|
"brillig_names": [
|
|
2404
2404
|
"set_update_delay"
|
|
2405
2405
|
]
|
|
@@ -2626,8 +2626,8 @@
|
|
|
2626
2626
|
}
|
|
2627
2627
|
}
|
|
2628
2628
|
},
|
|
2629
|
-
"bytecode": "JwACBAEoAAABBIBNJwAABAMnAgIEAScCAwQAHwoAAgADgEwuCIBMAAElAAAARSUAAACjKAIAAQSATScCAgQAOw4AAgABKACAQwAAAywAgEQAAAAAAA6S+filNOhY/Pd32iBuCLDGIOz53rIdE0eYE/
|
|
2630
|
-
"debug_symbols": "
|
|
2629
|
+
"bytecode": "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",
|
|
2630
|
+
"debug_symbols": "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",
|
|
2631
2631
|
"brillig_names": [
|
|
2632
2632
|
"update"
|
|
2633
2633
|
]
|
|
@@ -3598,7 +3598,7 @@
|
|
|
3598
3598
|
},
|
|
3599
3599
|
"61": {
|
|
3600
3600
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr",
|
|
3601
|
-
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3601
|
+
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n /// Makes the call to this private function.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n /// This enables contracts to interact with each other while maintaining\n /// privacy. This \"composability\" of private contract functions is a key\n /// feature of the Aztec network.\n ///\n /// If a user's transaction includes multiple private function calls, then\n /// by the design of Aztec, the following information will remain private[1]:\n /// - The function selectors and contract addresses of all private function\n /// calls will remain private, so an observer of the public mempool will\n /// not be able to look at a tx and deduce which private functions have\n /// been executed.\n /// - The arguments and return values of all private function calls will\n /// remain private.\n /// - The person who initiated the tx will remain private.\n /// - The notes and nullifiers and private logs that are emitted by all\n /// private function calls will (if designed well) not leak any user\n /// secrets, nor leak which functions have been executed.\n ///\n /// [1] Caveats: Some of these privacy guarantees depend on how app\n /// developers design their smart contracts. Some actions _can_ leak\n /// information, such as:\n /// - Calling an internal public function.\n /// - Calling a public function and not setting msg_sender to Option::none\n /// (see https://github.com/AztecProtocol/aztec-packages/pull/16433)\n /// - Calling any public function will always leak details about the nature\n /// of the transaction, so devs should be careful in their contract\n /// designs. If it can be done in a private function, then that will give\n /// the best privacy.\n /// - Not padding the side-effects of a tx to some standardised, uniform\n /// size. The kernel circuits can take hints to pad side-effects, so a\n /// wallet should be able to request for a particular amount of padding.\n /// Wallets should ideally agree on some standard.\n /// - Padding should include:\n /// - Padding the lengths of note & nullifier arrays\n /// - Padding private logs with random fields, up to some standardised\n /// size.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Advanced\n /// * The call is added to the private call stack and executed by kernel\n /// circuits after this function completes\n /// * The called function can modify its own contract's private state\n /// * Side effects from the called function are included in this transaction\n /// * The call inherits the current transaction's context and gas limits\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n /// Makes a _read-only_ call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// See `call` for more general info on private function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n /// Makes a read-only call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the call to this public function.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Makes a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a call to this public function, to be executed later.\n ///\n /// Unlike private functions which execute immediately on the user's device,\n /// public function calls are \"enqueued\" and executed some time later by a\n /// block proposer.\n ///\n /// This means a public function cannot return any values back to a private\n /// function, because by the time the public function is being executed,\n /// the private function which called it has already completed execution.\n /// (In fact, the private function has been executed and proven, along with\n /// all other private function calls of the user's tx. A single proof of the\n /// tx has been submitted to the Aztec network, and some time later a\n /// proposer has picked the tx up from the mempool and begun executing all\n /// of the enqueued public functions).\n ///\n /// # Privacy warning\n /// Enqueueing a public function call is an inherently leaky action.\n /// Many interesting applications will require some interaction with public\n /// state, but smart contract developers should try to use public function\n /// calls sparingly, and carefully.\n /// _Internal_ public function calls are especially leaky, because they\n /// completely leak which private contract made the call.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n /// Enqueues a call to this public function, and designates it to be the\n /// teardown function for this tx. Only one teardown function call can be\n /// made by a tx.\n ///\n /// Niche function: Only wallet developers and paymaster contract developers\n /// (aka Fee-payment contracts) will need to make use of this function.\n ///\n /// Aztec supports a three-phase execution model: setup, app logic, teardown.\n /// The phases exist to enable a fee payer to take on the risk of paying\n /// a transaction fee, safe in the knowledge that their payment (in whatever\n /// token or method the user chooses) will succeed, regardless of whether\n /// the app logic will succeed. The \"setup\" phase ensures the fee payer\n /// has sufficient balance to pay the proposer their fees.\n /// The teardown phase is primarily intended to: calculate exactly\n /// how much the user owes, based on gas consumption, and refund the user\n /// any change.\n ///\n /// Note: in some cases, the cost of refunding the user (i.e. DA costs of\n /// tx side-effects) might exceed the refund amount. For app logic with\n /// fairly stable and predictable gas consumption, a material refund amount\n /// is unlikely. For app logic with unpredictable gas consumption, a\n /// refund might be important to the user (e.g. if a hefty function reverts\n /// very early). Wallet/FPC/Paymaster developers should be mindful of this.\n ///\n /// See `enqueue` for more information about enqueuing public function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3602
3602
|
},
|
|
3603
3603
|
"68": {
|
|
3604
3604
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
|
package/artifacts/FeeJuice.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.11+nightly-2025-08-
|
|
3
|
+
"noir_version": "1.0.0-beta.11+nightly-2025-08-28-aztec",
|
|
4
4
|
"name": "FeeJuice",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -1997,7 +1997,7 @@
|
|
|
1997
1997
|
}
|
|
1998
1998
|
},
|
|
1999
1999
|
"bytecode": "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",
|
|
2000
|
-
"debug_symbols": "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",
|
|
2000
|
+
"debug_symbols": "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SwKXBC4JXBK4JHBJ4JLAJYFLApcELglcErgkcEngksAlgUsClwQuCVwSuCRwSeCSwCWBSwKXBC4JXBK4JHBJ4JLAJYFLApckLklckrgkcUniksQliUsSlyQuSVySuCRxSeKSxCWJSxKXJC5JXJK4JHFJ4pLEJYlLEpckLklckrgkcUniksQliUsSlyQuSVySuCRxSeKSxCWJSxKXJC5JXJK4JHFJ4pLEJYlLEpckLklckrgkcUniksQluVzSZzxp3Wd0YhBPmj9mPGnzrbQ597rjSYs2oxCVaMSTNu+l59zrjictxownLVfdUXG6JO2fP/7wf3/49ec//PGXn/73h//4x/G///33P//pbz//5c/X//7t//11/80ff/35l19+/p/f//XXv/zpp//6+68//f6Xv/zp/LsfHtd//vP4MOrH4wb8dz/+cDzX/2wP/bE1Pf6vzb80+fH48Oz833b+b28/Hp+E/e6o3Or7zX883k68vr8/fvRHffdxkXp85lffrXH87zi/W/Z3H28r/ni853Z99/mJ4fFm4f7+453TH4+3Qff3H+9yHv87v1/P7z+/Q/X49v31Zj/a/Gs7/3r+0VFe2vlHvb5DfjTZ33Gsp/v5117fIcdzPv7on//83T//Pw==",
|
|
2001
2001
|
"brillig_names": [
|
|
2002
2002
|
"build_msg_block",
|
|
2003
2003
|
"attach_len_to_msg_block",
|
|
@@ -3024,7 +3024,7 @@
|
|
|
3024
3024
|
},
|
|
3025
3025
|
"62": {
|
|
3026
3026
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr",
|
|
3027
|
-
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3027
|
+
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n /// Makes the call to this private function.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n /// This enables contracts to interact with each other while maintaining\n /// privacy. This \"composability\" of private contract functions is a key\n /// feature of the Aztec network.\n ///\n /// If a user's transaction includes multiple private function calls, then\n /// by the design of Aztec, the following information will remain private[1]:\n /// - The function selectors and contract addresses of all private function\n /// calls will remain private, so an observer of the public mempool will\n /// not be able to look at a tx and deduce which private functions have\n /// been executed.\n /// - The arguments and return values of all private function calls will\n /// remain private.\n /// - The person who initiated the tx will remain private.\n /// - The notes and nullifiers and private logs that are emitted by all\n /// private function calls will (if designed well) not leak any user\n /// secrets, nor leak which functions have been executed.\n ///\n /// [1] Caveats: Some of these privacy guarantees depend on how app\n /// developers design their smart contracts. Some actions _can_ leak\n /// information, such as:\n /// - Calling an internal public function.\n /// - Calling a public function and not setting msg_sender to Option::none\n /// (see https://github.com/AztecProtocol/aztec-packages/pull/16433)\n /// - Calling any public function will always leak details about the nature\n /// of the transaction, so devs should be careful in their contract\n /// designs. If it can be done in a private function, then that will give\n /// the best privacy.\n /// - Not padding the side-effects of a tx to some standardised, uniform\n /// size. The kernel circuits can take hints to pad side-effects, so a\n /// wallet should be able to request for a particular amount of padding.\n /// Wallets should ideally agree on some standard.\n /// - Padding should include:\n /// - Padding the lengths of note & nullifier arrays\n /// - Padding private logs with random fields, up to some standardised\n /// size.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Advanced\n /// * The call is added to the private call stack and executed by kernel\n /// circuits after this function completes\n /// * The called function can modify its own contract's private state\n /// * Side effects from the called function are included in this transaction\n /// * The call inherits the current transaction's context and gas limits\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n /// Makes a _read-only_ call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// See `call` for more general info on private function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n /// Makes a read-only call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the call to this public function.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Makes a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a call to this public function, to be executed later.\n ///\n /// Unlike private functions which execute immediately on the user's device,\n /// public function calls are \"enqueued\" and executed some time later by a\n /// block proposer.\n ///\n /// This means a public function cannot return any values back to a private\n /// function, because by the time the public function is being executed,\n /// the private function which called it has already completed execution.\n /// (In fact, the private function has been executed and proven, along with\n /// all other private function calls of the user's tx. A single proof of the\n /// tx has been submitted to the Aztec network, and some time later a\n /// proposer has picked the tx up from the mempool and begun executing all\n /// of the enqueued public functions).\n ///\n /// # Privacy warning\n /// Enqueueing a public function call is an inherently leaky action.\n /// Many interesting applications will require some interaction with public\n /// state, but smart contract developers should try to use public function\n /// calls sparingly, and carefully.\n /// _Internal_ public function calls are especially leaky, because they\n /// completely leak which private contract made the call.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n /// Enqueues a call to this public function, and designates it to be the\n /// teardown function for this tx. Only one teardown function call can be\n /// made by a tx.\n ///\n /// Niche function: Only wallet developers and paymaster contract developers\n /// (aka Fee-payment contracts) will need to make use of this function.\n ///\n /// Aztec supports a three-phase execution model: setup, app logic, teardown.\n /// The phases exist to enable a fee payer to take on the risk of paying\n /// a transaction fee, safe in the knowledge that their payment (in whatever\n /// token or method the user chooses) will succeed, regardless of whether\n /// the app logic will succeed. The \"setup\" phase ensures the fee payer\n /// has sufficient balance to pay the proposer their fees.\n /// The teardown phase is primarily intended to: calculate exactly\n /// how much the user owes, based on gas consumption, and refund the user\n /// any change.\n ///\n /// Note: in some cases, the cost of refunding the user (i.e. DA costs of\n /// tx side-effects) might exceed the refund amount. For app logic with\n /// fairly stable and predictable gas consumption, a material refund amount\n /// is unlikely. For app logic with unpredictable gas consumption, a\n /// refund might be important to the user (e.g. if a hefty function reverts\n /// very early). Wallet/FPC/Paymaster developers should be mindful of this.\n ///\n /// See `enqueue` for more information about enqueuing public function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
3028
3028
|
},
|
|
3029
3029
|
"69": {
|
|
3030
3030
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
|
package/artifacts/Router.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.11+nightly-2025-08-
|
|
3
|
+
"noir_version": "1.0.0-beta.11+nightly-2025-08-28-aztec",
|
|
4
4
|
"name": "Router",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -1903,7 +1903,7 @@
|
|
|
1903
1903
|
}
|
|
1904
1904
|
},
|
|
1905
1905
|
"bytecode": "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",
|
|
1906
|
-
"debug_symbols": "
|
|
1906
|
+
"debug_symbols": "rZZbjuowDIb30mceYjtXtoIQKtAZVaoK6sCRjhB7H2fIBUZKVGBe+NuUfLUd2/Wl2Xfb8+emHz8OX81ydWm2Uz8M/edmOOzaU38YefXSCP8jVbPERSP1TcxN7E0cy3XRgP8j8A1c+S4yNqep6/yTOyi/6thO3XhqluN5GBbNv3Y4//zp69iOP3pqJ34qFk037lkZ+NEPnb+6LvJuUd4qjQubNUHaDkrPBSiCAFBG3wHsXACApkAAMCYjhJmLQEQTEIgOiwhZQZCJViA5lRDmkaDKBEK0gUAkoETQlUgoctEPUBLycRI8QkwFYlU8EL7MsSCi+XZIktkOaYt2uNqZpMRAVKJoB9RSg1zyRQr5GkNqm3wBVWTUXCGd0ots2ZVahoLO0XBUzFCopCgIzK4IUndJKp6ASFIJIg2UINVjsQkhTY6H+mVGLUuddYnh3N25aHoC4gxkiJNFSOVwyehoCFkpS2WL4i/qFuH9wq0yTO6lxlYY9H7RVRkzi64e1bldCPX7bQjNH0RkLgPhNcbcqOr3e1mt7lAIEU+GrxWU6o6wVnfRF/kweNhnzMhNVYCwRTMq/dAIk3oIX1tb6odU+fSbu25mnENZhFQtsS4Wr+HWrIuQSkycxjRLkXplntP8aYkTIc9jj1+qNd+2u356HH0R+TG/FymoDKr8m1l1UJ6HgXMTbVA/EfM6iaAQFIMyj9hUkkGVz1NW5hHvJxPU+t599T5NfbsdOm+VN/w87qKRfHv6f4xP4gR/nA67bn+eOu9QHuP5vSvOXYlrHtd5ZcWdWel1Gt79Erdh5CUfk28=",
|
|
1907
1907
|
"brillig_names": [
|
|
1908
1908
|
"store_in_execution_cache_oracle_wrapper",
|
|
1909
1909
|
"notify_enqueued_public_function_call_wrapper"
|
|
@@ -3690,7 +3690,7 @@
|
|
|
3690
3690
|
}
|
|
3691
3691
|
},
|
|
3692
3692
|
"bytecode": "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",
|
|
3693
|
-
"debug_symbols": "
|
|
3693
|
+
"debug_symbols": "rZZbjuowDIb30mceYjtXtoIQKtAZVaoK6sCRjhB7H2fIBUZKVGBe+NuEfLET2/Wl2Xfb8+emHz8OX81ydWm2Uz8M/edmOOzaU38YefTSCP8jVbPERSP1TcxN7E0cy3XRgP8j8Atc+S0yNqep6/zMHZS3OrZTN56a5XgehkXzrx3OP3/6Orbjj57aiWfFounGPSsDP/qh80/XRV4tykulcWGxJkjLQem5AEUQAMroO4CdCwDQFAgAxmSEMHMRiGgCAtFhESErCDLRCiSnEsI8ElSZQIg2EIgElAi6chKKXPQDlIR8nQSPEFOBWBUvhB/zWRDRfDskyWyHtEU7XO1OUmAgKlG0A2qhQS75IoV8jSG1Tb6AKjJqrpBO4UW27EotQkHn03BUjFCohCgIzK4IUndBKp6ASFIJIg2UIBVnTIoOCznl1S8jajHqrEtGOHd3K5qegDgDGeJkEVK5WjI6GkJWylLSoviLrEV4P22rDJMrqbEVBr2fclXGzJSrn+rcGoT6/SKE5g9OZC4D4TXG3FPV71eyWt6hECLeDD8rKOUdYS3voi/yoe2wz5iRS6oAYYtmVKqhESbVEH62tlQNqfLhN3fVzDiHsgipWmJdTF7DhVkXIZUzcRpTJ0XqlW5O84cl9oPcjT1+p9b82u766bHxReRp3hcpqAyq/M6sOih3w8CxiTao74d5nERQCIpBmUdsKsmgyscpK/OI15MJan3tvnqfpr7dDp23yht+HnfRSH49/T/Gmdi/H6fDrtufp847lJt43nfFsStxzc06j6y4Miu9Tq27H+IyjDzkz+Qb",
|
|
3694
3694
|
"brillig_names": [
|
|
3695
3695
|
"store_in_execution_cache_oracle_wrapper",
|
|
3696
3696
|
"notify_enqueued_public_function_call_wrapper"
|
|
@@ -4610,7 +4610,7 @@
|
|
|
4610
4610
|
},
|
|
4611
4611
|
"63": {
|
|
4612
4612
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr",
|
|
4613
|
-
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
4613
|
+
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, ToField},\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\nuse crate::hash::{hash_args, hash_calldata};\nuse crate::oracle::execution_cache;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field];\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\n// PrivateCallInterface\n\npub struct PrivateCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n /// Makes the call to this private function.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n /// This enables contracts to interact with each other while maintaining\n /// privacy. This \"composability\" of private contract functions is a key\n /// feature of the Aztec network.\n ///\n /// If a user's transaction includes multiple private function calls, then\n /// by the design of Aztec, the following information will remain private[1]:\n /// - The function selectors and contract addresses of all private function\n /// calls will remain private, so an observer of the public mempool will\n /// not be able to look at a tx and deduce which private functions have\n /// been executed.\n /// - The arguments and return values of all private function calls will\n /// remain private.\n /// - The person who initiated the tx will remain private.\n /// - The notes and nullifiers and private logs that are emitted by all\n /// private function calls will (if designed well) not leak any user\n /// secrets, nor leak which functions have been executed.\n ///\n /// [1] Caveats: Some of these privacy guarantees depend on how app\n /// developers design their smart contracts. Some actions _can_ leak\n /// information, such as:\n /// - Calling an internal public function.\n /// - Calling a public function and not setting msg_sender to Option::none\n /// (see https://github.com/AztecProtocol/aztec-packages/pull/16433)\n /// - Calling any public function will always leak details about the nature\n /// of the transaction, so devs should be careful in their contract\n /// designs. If it can be done in a private function, then that will give\n /// the best privacy.\n /// - Not padding the side-effects of a tx to some standardised, uniform\n /// size. The kernel circuits can take hints to pad side-effects, so a\n /// wallet should be able to request for a particular amount of padding.\n /// Wallets should ideally agree on some standard.\n /// - Padding should include:\n /// - Padding the lengths of note & nullifier arrays\n /// - Padding private logs with random fields, up to some standardised\n /// size.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Advanced\n /// * The call is added to the private call stack and executed by kernel\n /// circuits after this function completes\n /// * The called function can modify its own contract's private state\n /// * Side effects from the called function are included in this transaction\n /// * The call inherits the current transaction's context and gas limits\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn call(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n\n /// Makes a _read-only_ call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// See `call` for more general info on private function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T {\n execution_cache::store(self.args, self.args_hash);\n let returns_hash = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n // If T is () (i.e. if the function does not return anything) then `get_preimage` will constrain that the\n // returns hash is empty as per the protocol rules.\n returns_hash.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PrivateStaticCallInterface\n\npub struct PrivateStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PrivateStaticCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self {\n target_contract,\n selector,\n name,\n args_hash,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n }\n }\n\n /// Makes a read-only call to this private function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn view(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize,\n {\n execution_cache::store(self.args, self.args_hash);\n let returns = context.call_private_function_with_args_hash(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.get_preimage()\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PrivateStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicCallInterface\n\npub struct PublicCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n gas_opts: GasOpts,\n return_type: T,\n is_static: bool,\n}\n\nimpl<let M: u32, T> PublicCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n is_static: bool,\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n gas_opts: GasOpts::default(),\n return_type: std::mem::zeroed(),\n is_static,\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the call to this public function.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn call(self, context: &mut PublicContext) -> T {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Makes a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n // If T is () (i.e. if the function does not return anything) then `as_array` will constrain that `returns` has\n // a length of 0 (since that is ()'s deserialization length).\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a call to this public function, to be executed later.\n ///\n /// Unlike private functions which execute immediately on the user's device,\n /// public function calls are \"enqueued\" and executed some time later by a\n /// block proposer.\n ///\n /// This means a public function cannot return any values back to a private\n /// function, because by the time the public function is being executed,\n /// the private function which called it has already completed execution.\n /// (In fact, the private function has been executed and proven, along with\n /// all other private function calls of the user's tx. A single proof of the\n /// tx has been submitted to the Aztec network, and some time later a\n /// proposer has picked the tx up from the mempool and begun executing all\n /// of the enqueued public functions).\n ///\n /// # Privacy warning\n /// Enqueueing a public function call is an inherently leaky action.\n /// Many interesting applications will require some interaction with public\n /// state, but smart contract developers should try to use public function\n /// calls sparingly, and carefully.\n /// _Internal_ public function calls are especially leaky, because they\n /// completely leak which private contract made the call.\n /// See also: https://docs.aztec.network/developers/reference/considerations/privacy_considerations\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n false,\n )\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n\n /// Enqueues a call to this public function, and designates it to be the\n /// teardown function for this tx. Only one teardown function call can be\n /// made by a tx.\n ///\n /// Niche function: Only wallet developers and paymaster contract developers\n /// (aka Fee-payment contracts) will need to make use of this function.\n ///\n /// Aztec supports a three-phase execution model: setup, app logic, teardown.\n /// The phases exist to enable a fee payer to take on the risk of paying\n /// a transaction fee, safe in the knowledge that their payment (in whatever\n /// token or method the user chooses) will succeed, regardless of whether\n /// the app logic will succeed. The \"setup\" phase ensures the fee payer\n /// has sufficient balance to pay the proposer their fees.\n /// The teardown phase is primarily intended to: calculate exactly\n /// how much the user owes, based on gas consumption, and refund the user\n /// any change.\n ///\n /// Note: in some cases, the cost of refunding the user (i.e. DA costs of\n /// tx side-effects) might exceed the refund amount. For app logic with\n /// fairly stable and predictable gas consumption, a material refund amount\n /// is unlikely. For app logic with unpredictable gas consumption, a\n /// refund might be important to the user (e.g. if a hefty function reverts\n /// very early). Wallet/FPC/Paymaster developers should be mindful of this.\n ///\n /// See `enqueue` for more information about enqueuing public function calls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn set_as_teardown(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.set_public_teardown_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n false,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// PublicStaticCallInterface\n\npub struct PublicStaticCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n return_type: T,\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let M: u32, T> PublicStaticCallInterface<M, T>\nwhere\n T: Deserialize,\n{\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n Self {\n target_contract,\n selector,\n name,\n args,\n return_type: std::mem::zeroed(),\n is_static: true,\n gas_opts: GasOpts::default(),\n }\n }\n\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n /// Makes the read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state or emit events. Any nested calls are constrained to\n /// also be staticcalls.\n ///\n /// Will revert if the called function reverts or runs out of gas.\n ///\n /// # Arguments\n /// * `context` - The PublicContext -- made magically available to the body\n /// of every #[public] function as `context`, through the\n /// #[public] annotation's macro.\n ///\n /// # Returns\n /// * `T` - Whatever data the called function has returned.\n ///\n pub unconstrained fn view(self, context: &mut PublicContext) -> T {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array())\n }\n\n /// Enqueues a read-only call to this public function.\n ///\n /// This is similar to Solidity's `staticcall`. The called function\n /// cannot modify state, emit L2->L1 messages, nor emit events. Any nested\n /// calls are constrained to also be staticcalls.\n ///\n /// # Arguments\n /// * `context` - The PrivateContext -- made magically available to the body\n /// of every #[private] function as `context`, through the\n /// #[private] annotation's macro.\n ///\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let calldata = self.args.push_front(self.selector.to_field());\n let calldata_hash = hash_calldata(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n self.target_contract,\n calldata_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let M: u32, T> CallInterface<M> for PublicStaticCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\n// UtilityCallInterface\n\npub struct UtilityCallInterface<let M: u32, T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args_hash: Field,\n args: [Field],\n return_type: T,\n}\n\nimpl<let M: u32, T> CallInterface<M> for UtilityCallInterface<M, T> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<M> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n false\n }\n}\n\nimpl<let M: u32, T> UtilityCallInterface<M, T> {\n pub fn new(\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<M>,\n args: [Field],\n ) -> Self {\n let args_hash = hash_args(args);\n Self { target_contract, selector, name, args_hash, args, return_type: std::mem::zeroed() }\n }\n\n pub fn get_args(self) -> [Field] {\n self.args\n }\n\n pub fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n pub fn get_name(self) -> str<M> {\n self.name\n }\n\n pub fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n}\n"
|
|
4614
4614
|
},
|
|
4615
4615
|
"70": {
|
|
4616
4616
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@aztec/protocol-contracts",
|
|
3
3
|
"homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/protocol-contracts",
|
|
4
4
|
"description": "Canonical Noir contracts for the Aztec Network",
|
|
5
|
-
"version": "2.0.0-nightly.
|
|
5
|
+
"version": "2.0.0-nightly.20250830",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./dest/index.js",
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
]
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@aztec/constants": "2.0.0-nightly.
|
|
77
|
-
"@aztec/foundation": "2.0.0-nightly.
|
|
78
|
-
"@aztec/stdlib": "2.0.0-nightly.
|
|
76
|
+
"@aztec/constants": "2.0.0-nightly.20250830",
|
|
77
|
+
"@aztec/foundation": "2.0.0-nightly.20250830",
|
|
78
|
+
"@aztec/stdlib": "2.0.0-nightly.20250830",
|
|
79
79
|
"lodash.chunk": "^4.2.0",
|
|
80
80
|
"lodash.omit": "^4.5.0",
|
|
81
81
|
"tslib": "^2.4.0"
|