@aztec/protocol-contracts 0.46.7 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/AuthRegistry.json +1 -1
- package/artifacts/ContractClassRegisterer.json +1 -1
- package/artifacts/ContractInstanceDeployer.json +1 -1
- package/artifacts/GasToken.json +1 -1
- package/artifacts/KeyRegistry.json +1 -1
- package/artifacts/MultiCallEntrypoint.json +1 -1
- package/package.json +4 -4
package/artifacts/GasToken.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"transpiled":true,"noir_version":"0.31.0+b209fadb740dc98378d9b984ff31c7d32d9a87be","name":"GasToken","functions":[{"name":"claim","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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"},{"name":"_increase_public_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(internal)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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j46Jj46Jj46Jj46Jj46Jj46Jj46Jz46Jz46Jz46Jz46Jz46Jz46Jz46J79i5Wx07d6tj52517Nytjp271bFztzp27lbHzt3q2LlbHTt3q2PnbnXs3K2OnbvVsXO3OnbuVsfO3erYuVsdO3erY+dudezcrY6du9Wxc7c6du5Wx87d6ti5Wx07d6tj52517Nytjp271bFztzp27lbHzt3q2LlbHTt3q2PnbnXs3K2OnbvVsXO3OnbuVsfO3erYuVsdO3erY+dud+zc7Y6du/2ZnTuL67erba47h9S4nFH76YjbnlTLq9nro3J82K33javlsPL9u12eDr9UP9DVB7r6RFc/0dUvdPUbXX2Rq//M7iilekNXj2atoVlraNYamrWGZq09gLVf5L8lsG1jKy9q5X5gKzds5Y6tfGArD2zlia18YivHMtSxDHUsQweWoQPL0IFl6MAydGAZOrAMHViGDixDB5ahA8vQwDI0sAwNLEMDy9DAMjSwDA0sQwPL0MAyNLAMTSxDE8vQxDI0sQxNLEMTy9DEMjSxDE0sQxPL0Ill6MQydGIZOrEMnViGTixDJ5ahE8vQiWXoxDJ0YRm6sAxdWIYuLEMXlqELy9CFZejCMnRhGbqwDN1Yhm4sQzeWoRvL0I1l6MYydGMZurEM3ViGbixDC8vQwjK0sAwtLEMLy9DCMrSwDC0sQwvL0KIytA4qQ+ugMrQOKkProDK0DipD66AytA4qQ+ugMrQOKkPrwDLUsAw1LEMNy1DDMvQRzqIvVDmWoYZlKNZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FhfUUFdZTVFhPUWE9RYX1FBXWU1RYT1FhPUWF9RQV1lNUWE9RYT1FdmBFRWfpVIqepVMxepZO5ehZOhWkZ+lUkp6lU1F6lk5l6Vk6FaZn6VyaYpVFZ+lcmmKlRWfpXJpitUVn6VyaYsVFZ+lcmmLVRWfpXJpi5UVn6VyaYvVFZ+lcmmIFRmfpXJpiFUZn6VyaYiVGZ+lcmmI1RmfpXJpiRUZn6VyaYlVGZ+lcmmJlRmfpXJpidUZn6VyaYoVGZ+lcmmKVRmfpXJpipUZn6VyaYrVGZ+lcmmLFRmfpXJpi1UZn6VyaYuVGZ+lcmmL1RmfpXJpiBUdn6VyaYhVHZ+lcmmIlR+ehXJpiNUfvD+WWzqUp1nR0HsqlKdZ1dB7KpSnWdmQHVnd0ls6lKVZ4dJbOpSlWeXSWzqUpVnp0ls6lKVZ7dJbOpSlWfHSWzqUpVn10ls6lKVZ+dJbOpSlWf3SWzqUpVoB0ln6fpnveK93LLqWPGD865tOncx2X6nPZ08dy+62jLhewtKcb+Lj1dETNS9lpdn366br/gzaJdN1977rWft15/df4vO7+6etm+vXhzDsP7zn8w8N7rvj44ctt/UXddryo28aLum2+qNvOF3Xb9aJuu1/UbesF3daO42Xc9vzFP17/7c3rP3z7zffnS97/s7+//eO7N9+9/fDLd//863//yfnsvwE="},{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/+2b3U7bQBCF18GhBoOb2HGckEAIBaTehRSScMfLtM/d60p9haqss6Mclmm0UcdLVool5LG9O+ebsz+EyERqfSSvP5GJ2+Z8rN4f1ObFnGf/dzwI5po1yRkFwtkKhPMoEM5YkDNiOPU5NrFed3rNfVLr9fjuIXbWA30Ez9W2RLZqYgJ8eC1V6Wr2fAzJEVwZ8Ng8o7PGSc0zBEtNkXUbuEeFtuAe6RzBPdrBSCcxpgjX+5RskOXyvs4+XcOJyUXcKcT4bAzWxQ3V2Jav8bGRMXn1rqExqVcx+d42uRO4pjE4NbHgb44H1I7Mz6k1F2KIR9CW2pEfLWDVx7narJfTLf1iq18GbY6hn7230DWNtfaqa2J9btOeAPkb8HCm86byed+MTWx5l0JNGXgioz1f6fxn6u0RWdfXEGfAcy7Os1578nWux+4zsMvkfXrUXnUsr84srzJogwydBvyLQJdy03WH0ZbzYrHS2l0HL7oMT9ezF11GW9CLZ62dO3iRMzy5Zy9yRlvOi+U3rV04eFEwPIVnLwpGW86Lef0ZoOfgRY/h6Xn2osdoC66Rel6UDl6UDE/p2YuS0Rb04ofW7jt40Wd4+p696DPagl5819qVgxcVw1N59qJitAX3zvrzxcDBiwHDM/DsxYDRFvRirrWHDl4MGZ6hZy+GjLbgGqm1Lxy8uGB4Ljx7QXq7MvcCZK4CZC72gDmxYhntRb1/jhy8GDE8I89e4HcuuzCXe8CcWLGM9uJJa48dvBgzPGPPXpDersx5gMxFgMz9AJnLAJmrAJn3YT4nViyjvaz30EsHLy4ZnkvPXpDersx5gMyjAJmLPWBOrFhGe1l/N3fl4MUVw3Pl2QvS25V5ECBzdw+YEyuW0V4utPbEwYsJwzPx7AXp7co8DJC5CpB5FCBzESBzP0DmMkDmwxr0w5zvATO+e/S7UZ75c2rxkGfKYlQWYwpxBozU9kXJva+SWbWT1lTcj/X42POFrqeNas9XOu+XBmrSeW/l89Z/I9yZXPQO3y3j1b2JI+FxuoO8EejQ/RjiX9CW2pEftB8Qu36X68bE91v6Tax+GbS5gX63Vj+6prHW3v00cVNzy2Ved9RmLX8Fngb2wUd8J1eBV8pipGMCPNfyPA8N1TnDd/j+KNm1N7W8OrG8yqAN7tEftW8emA/M/2LGzxMncA956F7LqgX/v2EKOf4CARQXTpY1AAA=","debug_symbols":"ndpBattQGIXRvWhsiu9v6T3JWymlOIlTDMYOsVMoJnuv3dIF9Mz0JN3ZNzq82/Cyf/r48f1wej1fhu3X23A8P++uh/PpfroN6y81/3l7edudHi8u1937ddhuWl8N+9PL/anX52p4PRz3w7aW9vlt9RgtMNqsZRQZlYw2MhplNMmoyajLSIrYSBGjFDFKEaMUMUoRoxQxShGjFDFKEaMUMUoRkxQxSRGTFDFJEZMUMUkRkxQxSRGTFDFJEU2KaFJEkyKaFNGkiCZFNCmiSRFNimhSRJciuhTRpYguRXQpoksRXYroUkSXIroUMUsRsxQxSxGzFDFLEbMUMUsRsxQxSxGzFLFIEYsUsUgRixSxSBGLFLFIEYsUsUgRixSR9ZpWoVXRakOrkVYTrRqtOq1mWlEboTZCbYTaCLURaiPURqiNUBuhNkJtFLVR1EZRG0VtFLVR1EZRG0VtEGiGRDNEmiHTDKFmSDVDrBlyzRBshmQzRJsh2wzhZkg3Q7wZ8s0QcIaEM0ScIeMMIWdIOUPMGXLOEHSGpDNEnSHrDGFnSDtD3BnyzhB4hsQzRJ4h8wyhZ0g9Q+wZcs8QfIbkM0SfIfsM4WdIP0P8GfLPEICGBDREoCEDDSFoSEFDDBpy0BCEhiQ0RKEhCw1haEhDQxwa8tAQiIZENESiIRMNoWhIRUMsGnLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0bKLnuSiRS5a5KJFLlrkokUuWuSi9d8uej/93L0fdk/H/eNu7+Pjx+n531Xf+/H66+3vl/u/vwE="},{"name":"deploy","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"artifact_hash","type":{"kind":"field"},"visibility":"private"},{"name":"private_functions_root","type":{"kind":"field"},"visibility":"private"},{"name":"public_bytecode_commitment","type":{"kind":"field"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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z79m/5a/5sItw/+a8Xv+mvI9f830PX9NfM9fM3/PX7N8z1+zfs9fA3gKlCHmowOxD5UH0zgenx7Hl7Zy2ctxqJ3wUDF896HW7enjtvHnR/g7vxX0PP547+OXex9/uvfx497Hn+99/OXex1/vffzt3sffb338+d637nzvW3e+96073/vWne996873vnXne9+6871v3fnet+5871t3ufetu9z71l3ufesu9751l3vfugv1c38+VlnMcX586ud+9fgr9ZNnPvb1zMt6enzqJ0/9+NRPnvrxqZ889eNT+/368an9fv341M/96rfRK/Vzv358ar9fPf5G7ffrx6e+devHp75168envnXrx6e+devHp75168envnXrx7/3rbvd+9bd7n3r7t9/674zO2Zcnh8ex/Xll4e+fiVmH+9eQLl7AdPdC4i7FzDfvYDl7gWsPAU8j7TxHQlxV47jsXJ5XKJypHEsX9K9vBdcylO6aRgYDzV+96GQXwBMQ7n38ad7Hz/uffz53sdf7n389d7H3+59/P3Wxx+Hex//3rfueO9bd7z3rTve+9Yd733rjve+dcd737rjvW/d8d63brn3rVvufeuWe9+65d63LmIaRc/j3/vWLfe+dcu9b91y71u33PvWnaif+7XfEp4m6ud+/fjUT57ab0pOE/WTp3586idP/fjUT57q8YPa79ePT+3368enfu7XfuFnCurnfv34ce/jU/v9+vGpb9368alv3frxqW/d+vGpb93q8WfqW7d+fOpbt378e9+6871vXcgUkI7H//5b951fLxy2r18HG15+ye7r18Hm5e4FrHcvYLt7AfvNC1iGuxcw3r2Awl3AkdwfBYw/FXD2k48NLS9Dacf9uDOWSanYUCqW2w389Mvh5/8dcruBhgK43UBDAdxuoKEAbjdQL2DldgMNBXC7gYYCuN1A/R2blfuGbyiA+9ZuKIDoJn4eiehufR4Jclu+rHN82eJ68YLasVdynOP0SBvfkfbvPhL0t0kg0286Hn+89/HLvY8/3fv4ce/jz/c+/nLv46/3Pv527+Pf+9bd733r7ve+dfd737r7vW9dyNSbjse/96273/vW3e996+73vnX3W9+6Mdz61o3h1rduDLe+dWO49a0bw61v3RhufevGcOtbN4Zb37ox3PrWjeHet+5I/dyvvfAXI/Vzv3586idP7aWnGKmf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o9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epuedFau55kZp7XqTmnhepuedlCKlqlbxUkZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnk9Sc88nqbnnk9Tc80lq7vk0hFS1Sl5qkpp7PknNPZ+k5p5PUnPPJ6m555PU3PNJau75JDX3fJKaez5JzT2fpOaeT1JzzyepuedTptnY+1qeH16n82oT3bcN1SZ6Ju/bdnx4Pa820TO5odpEz+SGahM9kxuqTZRv69Vmmp/cUG2m+7Zebab7tl5tonzbUG1IVSvlpTLNT26o9rZe6qjgtv7oqIDa8zzOUebjIMO2VP7NXf/sZ73ck44/UC+17/lAvdTO5wP1UnufD9QbYvVS+58P1EvtgD5QL7UH+kC91I7pA/WK+Svu6ccfqFfMX3FPQP5AvWL+insK8gfqFfNX3JOQP1CvmL/inob8gXrF/BX3ROQP1Cvmr7inIn+gXjF/xT0Z+QP1ivkr7unIH6hXzF9xT0j+QL1i/op7tuy79c7x/F3VOS7qTXUfNdSb6nk1z8/fsZiX89+x4J5C+oF6Uz2v6vVyTyL9QL2p8mBDvanyYEO9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GqqV8lKZNgk1VCvlpTJtzWmoVspLZdoQ01CtlJfKtA2loVopL5Vp80dDtVJeKtOWi4ZqpbxUpo0ODdVKealM2wsaqpXyUpkm9TdUK+WlMk28b6hWyktlmkrfUK2Ul8o0Ob6hWikvlWm6e0O1Ul4q0wT2hmqlvFSmKekN1Up5Kam556vU3PNVau75KjX3fJWae75KzT1fpeaer1Jzz1epueer1NzzVWru+So193yVmnu+Ss09X6Xmnq9Sc89Xqbnnq9Tc801q7vkmNfd8k5p7vknNPd+GkKpWyUttUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+Sc0936Tmnm9Sc883qbnnm9Tc801q7vkmNfd8k5p7vknNPd+k5p5vUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+Sc0936Tmnm9Sc883qbnnm9Tc801q7vkmNfd8k5p7vknNPd+k5p5vUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+Sc0936Tmnm9Sc883qbnnm9Tc801q7vkmNfd8k5p7vknNPd+k5p5vUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+Sc0936Tmnm9Sc883qbnnm9Tc801q7vkmNfd8k5p7vkvNPd+l5p7vUnPPd6m55/sQUtUqealdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vSnPP10Fp7vmjWiEv9ahWyEs9qhXyUo9qQ6paIS/1qFbISz2qFfJSj2qFvNSjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Up5KaW5549qpbyU0tzzR7VSXkpp7vmjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Up5KaW5549qpbyU0tzzR7VSXkpp7vmjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Up5KaW5549qpbyU0tzzR7VSXkpp7vmjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Up5KaW5549qpbyU0tzzR7VSXkpp7vmjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Up5KaW5549qpbyU0tzzR7VSXkpp7vmjWikvpTT3/FGtlJdSmnv+qFbKSynNPX9UK+WllOaeP6qV8lJKc88f1Sp5qVFq7vkoNfd8lJp7PkrNPX/UIlWtkpcapeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89HqbnnY6bZ2I9TD8epy1752e+cY5qm+ceHp2kbv86xL3/xJ5ehPD9chvWV3Xj2k7f9+Mml8pPnKD8+O8d0rn0i92Ht39Q+kRez9m9qH9ZeVvtEPt3av6l9otRi7d/UPlGGs/Zvap8o0Vr7N7VP9F2JtX9L+5JpM4m1f1N79/V0tXdfL6v22xPGvM/n2ruvp6t9WHtZ7d3X09Xefb2s2q9f2i/n2ruvp6u9+3q62ruvJ6t9pi151v5N7d3X09Xefb2s2s/P39Odl/Vce/f1dLUPay+rvft6utq7r6ervft6utq7r6ervft6stpn2ths7d/U3n09Xe3d19PV3n09Xe3D2stq776ervbu6+lq776ervbu6+lq776erPaT+3q62ruvp6u9+3q62ruvp6t9WHtZ7d3X09XefT1d7d3X09XefT1d7d3Xk9U+3NfT1d59PV3t3dfT1d59PV3tw9rLau++nq727uvpau++nq727uvpau++nqz2s/t6uto733fVftzjKdG47xNS++rejDmsvaz2zve62jvf62rvfK+rvfO9rvbO97LaL873utr793Z0tffv7ehq776ervZh7ZNqX92NuLivp6u9+3q62ruvp6u9+3pZta/uSFvc15PVfnVfT1d79/V0tXdfT1d79/V0tQ9rn1T76u/pru7r6Wrvvp6u9u7r6Wrvvp6u9u7ryWq/ua+nq737errau6+nq737errah7WX1d59PV3t3dfT1d59PV3t3dfT1d59PVntd/f1dLV3X09Xe/f1dLV3X09X+7D2stq7r6ervft6utq7r6ervft6utq7r6eq/TS4r6ervft6utq7r6ervft6utqHtZfV3n09Xe3d19PV3n09Xe3d19PV3n09We1H9/V0tXdfT1d79/V0tXe+x2uP3G4xjU7h7Ao5K7Mr5ETLrpBzJ7lCxemQXSFnOHaFnLTYFfLvObArFFaIXCH3FNgVck+hr0K1HWdTcU+BXSH3FNgVck+BXKHJPYW+CtV28EyTewrsCrmnwK6QewrsCoUVIlfIPQV2hdxT6KtQ9Xd9JvcU2BVyT4FdIfcUyBUK9xTYFXJPgV0h9xTYFXJPgV2hsELkCrmnwK6QewrsCrmnwK6QewrsCrmnQK7Q7J4Cu0LuKbAr5J4Cu0LuKbArFFaIXCH3FNgVck+BXSH3FNgVck+BXSH3FMgVWtxTYFfIPQV2hdxTYFfIPQV2hcIKkSvkngK7Qu4psCvkngK7Qu4psCvkngK5Qqt7CuwKuafArpB7CuwKuafArlBYIXKFnIdaFBq3J4+plAWpUHVG4+o8xK6Q8xC5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N6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rutVt999qtvnvtVt+9dqvvj+Y1rpWr2r12q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+m61W319WO1W/xrXyVV9jevkqr7GdXJVX+M2r3GdXNXXuE6u6mtcJ1f1Na6Tq/oa18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18tVWe1W/xrXy1VZ7Vb/GtfLVVntVv8a18pVDV671Qev3eqD1271wWu3+tcwXuNauarBa7f64LVbffDa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"},{"name":"set_portal","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/72WzW7TQBSFx0nTRKR14tAkzv+fx2mpWIKQkNiz5glAIIEELBAs4FF4B16kD8GeNRLbMufOz4njNpKlqiNNM75zvnvuzLjyZKquVMt0pWbKNURUrI7NT4T+QvmRGdRMj2IV+ZDGJKiadjJVlxGER2vz58ET5S0y1VDFBlVDvGSqUVYg47FVSM9Qn0Tb2muaUrS0tvXxmta25lLjqZkF3Qk1p8cyPMHQ9HiF+RSjpxHrqFsfkcUaEzHsbGVwbe3Vfm0aVFYBcWwU13sNplYB71Pm2LFWHavooNdCOjzGe48qPJ4WuWZThi23io4s8hwjLrK8+WitOJCtBleLRJLkMUa3Jnn+86pW3Kc2d7570wl2iyfYkRNsF08Qw4THlpjek2KeYXTbsfXk2HrwsAvpuoV0bNYNUt1UUlIsqcfXKMlU9Mr8PqQTxGe6ZoPqjNiZ1SR2KOh7hj3aFxSCPtE+0b5DXzPs0YGgEAyIDogOHPqFYY8OBYVgSHRIdOjQdwx7NBUUgpRoSjR16FuGPToSFIIR0RHRkUNfMuzRsaAQjImOiY4d+olhj04EhWBCdEJ0Yn8rI8btG8MenQoKwZTolOjUoV8Z9uhMUAhmRGdEZ+VCZ+EVOIAYtzcMe3QuKARzonOic4d+ZNijC0EhWBBdEF2UC12Et+YAYtyWDHt0KSgES6JLosuy2zJsS0VkXh0ZVEeG97KW9DBiNvs7wx5dCQrBiuiK6KrstgrncwAxbh8Y9uhaUAjWRNdE1w79zLBHN4JCsCG6IbopF7oJbhWR6b249Ksj8zsvzGz2D4Y9mgkKQUY0I5qV3bLwpldE0sOIfPb/8SOeCaj45a6Hi4lp2n/OTcajnWuKFitdtMpVyJhzBqvOKTrnZeDC3kgunP6R2TsoLiMRXiKELhX/tU9+uWAutZdtaWwnajaISe+Au9sF/i//7JS1V7BchJLionTYmy73Ru/dubgmXboU/v4Frb3PZTyQrkuTSLGZfXfCXc1qtCtHn0eOiIoXwjwUp1lcXiwuyXZnfFqItmKNY91S7vYydzuYi7V2k40NRukV+n+JxmtyCw0AAA==","debug_symbols":"7ZzralpREEbfxd+hnG/2nn3Jq5RSbC5FCCYkplBC371a9UTRVhpk6WH7z8scZ76RxT7IwrfR7d231+9fJ9P7x5fR9ee30cPjzXg2eZzOn72Nuk/q/rz68jSeLl54mY2fZ6ProNBdje6mt4uHKf26Gt1PHu5G11bnj3eqlaVVtbJ7Xy3XnmoPJa+qPZr11Xs/2i2mdbHlA8XF+zmKx7xZ/OVqkdUayhobyuoNZU0NZc0NZS0NZa181mzvWcO/x89lHTVX3xhDy+mtG/T0GvT0Nujpw6Cnj4Oe3gc9fTrv6VPop09b0+/W1lBXtTXVA7XZS/+58b02rJaSL0vZXcqZn60nWUo480PvNEs589PoNEs580PuNEs587PzNEu5HMl7lnI5kvcspVyWsruUy33K7lLi4Z8W8vZSlpfZxy4LH7ssfuyyvxwi/Y9QwcLBLzx06yYKMZ3tD1wxN5S1NJS1tpPVu4ayqqGsxmf9j4NXtc+qunGmL4Zazh8GPn8c+Pw+8PnTwOfPA5//KPcL/e25Qi5b8y+bVKBJ6ogmIpoY0SQQTSLRxIkmiWiSiSYE8YkgPhPEZ4L4TBCfCeIzQXwmiM8E8ZkgPhPEZ4L4QhBfCOILQXwhiC8E8YUgvhDEF4L4QhBfCOIrQXwliK8E8ZUgvhLEV4L4ShBfCeIrQXwliFfXIV2EdDGkS0C6RKSLI10S0iUjXQrSBWFfCPtC2BfCvhD2hbAvhH0h7AthXwj7Qtg3hH1D2DeEfUPYN4R9Q9g3hH1D2DeEfUPYDwj7AWE/IOwHhP2AsB8Q9gPCfkDYDwj7AWE/IuxHhP2IsB8R9iPCfkTYjwj7EWE/IuxHhH1H2HeEfUfYd4R9R9h3hH1H2HeEfUTXE+LrCRH2hBh7QpQ9Ic6eEGlPiLUnRNsT4u0JEfeEmHtC1D0h7p4QeU+IvSdE3xPi7wkR+IQYfEIUPiEOnxCJT4jFJ0TjE+LxCRH5hJh8QlQ+IS6fEJlPiM0nROcT4vMJEfqEGH1ClD4hTp8QqU+I1SdE6xPi9Rni9Rni9Rni9Rni9VkXkS6OdElIl4x0KUgXhH3E6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE6zPE67OjeH0e+/+t9Zq2uuxWe+pn8qz3mfZ+tLv1xe4HiksK6z/2KinHzeJV2NxS2NJS2NpQ2KM4n4MJq5bChpbCxpbCekthW7qp8JZuKo6iT6eu/0vV5OWMw9aGwh5FJh9MWLUU1loKG1oKG1sK6y2FTS2FzW2EnT/5MX6ejL893L3ML1m89zq9mU0ep6uns59Py3fmtb8B"},{"name":"claim_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"},{"name":"leaf_index","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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"},{"name":"mint_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/+2aWW/jNhDH5StOE6/XSRPftyXbm/jKOnZ3m6YPfS7Qh770sQV6Ar3Q8zv26/S5aDkzHP7lKPGCi1YIijWgiBr+fxxyKIkaImGQC4LDfGB+ncD+zNVhUA4OzClDx/uBlkwha45MOcioKaJKorKRlQU5LpEwzyXjISgMzZ/jTaDOuPmgYI6DMCj8fednzEVRFOkoclEvDwfUwAmVthntc5l6Le2Voc44L0XrycodR60IcOj6pleFkILDIz6KVG0qc7Z4RH9EQ+29FaIGnoKYx2PxdCxHzrqiZkpR1laU0GBJNEdSpHMSye9Hdrqkg3lyk49pqL0nyf7S76n09ykdBS6W7GU5lBCeFPhcthNSESfvmePMRewUETvbjdjb6N6ZafBjcz4X8akVV3mQ51QCVhXNmRQZ/QVmRWuMkqAGtAa0ZtEfYFa0zigJ6kDrQOsW/QlmRRuMkqABtAG0YdHPYFa0ySgJmkCbQJsW/QpmRVuMkqAFtAW0ZdEvYFa0zSgJ2kDbQNsW7cOsaIdREnSAdoB2LPozzIp2GSVBF2gXaNei38KsaI9REvSA9oD25JxEav5I1R9p70fMmFYwK9pnlAR9oH2g/aS3vvO2BzHevodZ0QGjJBgAHQAdJL0NXAQ9kao/0vZHGv5INxXkFREz8/M7zIoOGSXBEOgQ6DDpbeie4j2I8fY5zIqOGCXBCOgI6MiiC5gVDRklQQg0BBomOxq6KfZEzv2Rqj9S80fq/kjDH2n6I61U5qXjj3RTmZdqKmN5RcTMc/MdzIpGjJIgAhoBjSz6K8yKjhklwRjoGOg42dGxG5snUvVH2o+1Yw1/pP4YImbugi9hVnTCKAkmQCdAJ0lvEzcmT6Tmj4T+SHs/YsJwBbOiU0ZJMAU6BTpNepu6JWsPQktv5iPkM7cMBkhiNGshNT+MwoacjunvGbt6tuvqQuCpFLWGEqYLiGbIi+YHXJxb/cIEghTLDAuXZKKDe/yhXOlwiVlGKruEY6nIipEq1cOMzn3T0gexbt3pMKfcNNpb9Be5XvnBXK8yydr8kRPGGHzgUlZCLngon1BpG8vSc9I4yy4iG8mgVHZZaeX+bYSyKAgtyzZCxV6Ko093Hck2ArdXhjrjvBBY4UmmikOxqoOiYHlbG9vBsC2o6yK3ULQtVALXvN2pUIz0BexsxLpULDhRAfdpe2cuSg/OxUUYr8lZ5yS6dC/LS8gv8XhcPoRUU0Fa/ki4HzHP048wKzpzT8cs9lQCnSW9zdyYPJF2Kl5qqXSs4Y8MU0FeYyyD/Yi5cb6BWdE5o/weBToHOk96m7sp3YMYb1/DrOiC0bmsC4ougC6S3hYuHJ5IbT9iOvgbzIrKKkOCJdAl0GXS29I96J5I3R8Z+yNdf6Tmjwz2I1SdDfDe7zB4z/fJcuf7ZLn7fbJiV6tdV1cCL6WoNXS/XEG0xvpxLav3tdVv7PfJVr5PtmSig9fav+RKh0vMNlLZcziWiqwYqVI9rOncNy39GevWnQ6775MONrxXLjYFxGZ15/skjNfk7MK6clNyfO+UrKzre5H8fgT9W7oN+ZVtZCnrO13SdntettlJdSJPm36erd3QrjC09e7QnofxmpyNFAfTba1cQ34tmjWCnkSq/kjNH6n7Iw1/pOmPtPyRtj/S8Ue6qcxLNZXh91Lx0v8fRayRyg2Tzj02SOWpHPojo1Sm8s07+c07+b+e/U4qEQv9kSiVsVQf6w1TTeURqz/WiI1TGUstlTv5NYY/+deXJFpKcz3kDbcMBrspQWDVki6upcV4urhhV5tdV7HkbIsaSky2EL1A/vFS0sWXVv+uTRdvJF28IRMd3OO2XOlwibmJVPYOHEtFVoxUqR5e0Llvrk9j3brTYU4XabS3WfyDmaRauq1LQSjet9mdf3CDtZzYYM1bkUSRvGwg3yC/p/ieTTXZo/NqRA7rf9DxD/Dv8iGuJwAA","debug_symbols":"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"},{"name":"check_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"fee_limit","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"7ZzvbhzHEcTfhZ+FYLq7ev7oVYIgkG05ECBQhkUHCAS/e07x3d4pXIis9oG6gvzJprRz07NVZB3rVr9Pdz+9/eG3f/3z3f3PHz7evf77p7v3H3588/Duw/3hq0937W/W/venH395c//5Dz4+vPn14e51e3X39v6nw39/f3X387v3b+9e++q//+PV5wXGLnB2QbALwC5IdkFnFwx2wWQXLHKBs0o7q7SzSjurtLNKO6u0s0o7q7SzSjurdLBKB6t0sEoHq3SwSgerdLBKB6t0sEoHqzRYpcEqDVZpsEqDVRqs0mCVBqs0WKXBKp2s0skqnazSySqdrNLJKp2s0skqnazSySrdWaU7q3Rnle6s0p1VurNKd1bpzirdWaU7q/RglR6s0oNVerBKD1bpwSo9WKUHq/RglR6s0pNVerJKT1bpySo9WaUnq/RklZ6s0pNVerJKL1bpxSq9WKUXq/RilV6s0otVerFKL1bpxSptja5OGt2dNLo8aXR70uj6pNH9SaMLlEY3KI2uUBqteaEuozXnCzO+MeMrM74z40szvjXjazO6NzO6ODPnO1Jac7o7M7o8M7o9M7o+M7o/M7pAM7pBM7pCM7pDs+CLcVpzukYzukczukgzukkzukozukszukwzuk0zuk4z8J+G0JrTjZrRlZrRnZrRpZrRrZrRtZrRvZrRxZrRzZrR1ZrR3ZrR5ZrR7ZrR9ZrR/ZrRBZvRDZvRFZvRHZvRJZt1/nNPWnO6ZzO6aDO6aTO6ajO6azO6bDO6bTO6bjO6b7PBf9hNa05XbkZ3bkaXbka3bkbXbkb3bkYXb0Y3b0ZXbzb5Jxxozen2zej6zej+zegCzugGzugKzugOzugSzugWzhb/WAv/XAv9YAvdwzndwzndwzndwzndwzndwzndwzndwzndw7nxDzPRmtM9nNM9nNM9nNM9nNM9nNM9nNM9nPPPr/EPsBWeYKM1559h4x9i459i4x9j459j4x9ko3s4p3s4p3s4D/6xRVpzuodzuodzuodzuodzuodzuodzuodzuodzuodz8M+q0prTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZzTPZx3/ql0WnO6h3O6h3O6h3O6h3O6h3O6h3O6h3O6h3O6h/P9Hi5jnRYlbH2x7tWjq+HLj1cjbG5XY+5cPHIerx0L5xeO0zzjxuZZtzXPft/4DeexG5vHrzBPxNjmQV7Oc9wkXmITXGOTgW2T2XY2yatsEudN1s4m4yU22Q2WRPZtk9Gf3uSsyTxrsntxj821HW1cXnycaP9HB+JiovHERCtObl/z/I1x+GR859rD58zHaw+N6MV3hu29LubppCtxcV/gx+n3S26Z6U16epeePqSnh/T0XXr6IT39lJ5eOa2iKadVNOW0iqacVtGU0yqaclrF/kfLMtMrZ220K2SttX76pczM2xPz79dQO7/ht+03fM+L15ynyZfq5NZkJzfZyV128pCdHLKTp+zkXXZy2SSyKTu5bIa6bIa6bIa6bIa6bIa6bIa6bIa6bIa6bIa6bIa6bIaGbIaGbIaGbIaGbIaGbIaGbIaGbIaGbIaGbIaGbIZCNkMhm6GQzVDIZihkMxSyGQrZDIVshkI2QyGboSmboSmboSmboSmboSmboSmboSmboSmboSmboSmboV02Q7tshnbZDO2yGdplM7TLZmiXzdAum6FdNkO7bIYO2Qwdshk6ZDN0yGbokM3QIZuhQzZDh2yGDtkMHbIZOmUzdMpm6JTN0CmboVM2Q6dshk7ZDJ2yGTplM3TKZuiSzdAlm6FLNkOXbIZeg7HzjSaXzdAlm6FLNkOXbIYu1QxFU81QNNUMRVPNUDTVDEVTzVA01QxFU81QyNJ+0FQzFLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyylKWU5RynKKUpZTlLKcomyqGZqynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUcpyilKWU5SynKKU5RSlLKcoZTlFKcspSllOUT6DUzTx1OTWxjZ52he7PL46Y47ttd23q3dfOh3bID6euHim2fHiebjhlxcfD+vf02HjezosvqfD5vd02P7yhx1+Pmx8fX7r4/Sj+PC/6zxIbAcY6geY6gdY2gfoz0A43fgBTP0AfuMHSNsOMNsXB3h8NXydXhphc7t6d46R2xvIdXHCON2Y+OvG7N+Y/OvG7N+YWw/0b3Zjbv2Nwje7Mbf+BoS6MRFjuzHIyxtzPO2tv1u56mnt1t/acKcd2E57cfX5tLf+Pog8bZxPu3ZO+/SbpvVUK9ZnnDbp8+L3w/Mm8RKb4CU2yWtsktg26Xua9JfYZLzEJvMqmvi2ybCvp1TYOMVU2Lr47j4O9AxM0JUHcpx+bQlPfzRQXOMOrXbaoy/DYxme8Q+Bn7GJ27bJ5581/7/JM/7N7jNu7VrnTeaf0xrx0gM9oXW/xh1a/az18q8P5IGTZod4mI8H8lsbiDbqH+uGFdd5cV0U16G4LovrenHdKK6bxXVF3Wcrriv6ZRb9Mot+mUW/zKJfZtEvs+iXWfTLLPplFf2yin5ZRb+sol9W0S+r6JdV9Msq+mUV/bJqfhmtFddZcZ0X10VxHYrrsriuF9eN4rpZXFf0ixX9YkW/WNEvVvSLFf1iRb9Y0S9W9IsV/WJFv3jRL170ixf94kW/eNEvXvSLF/3iRb940S9e9EsU/RJFv0TRL1H0SxT9EkW/RNEvUfRLFP0SRb+g6BcU/YKiX1D0C4p+QdEvKPoFRb+g6BcU/ZJFv2TRL1n0Sxb9kkW/ZNEvWfRLFv2SRb9k0S+96Jde9Esv+qUX/dKLfulFv/SiX3rRL73ol2JPO0bRL8V+dxT73VHodw9f/fvNr+/e/PD+7cfDms9/+dv9jw/vPtwfv3z4zy9//M3h2v8C"},{"name":"balance_of_public","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"}],"return_type":{"abi_type":{"kind":"field"},"visibility":"public"}},"bytecode":"H4sIAAAAAAAC/83YW2/rRBAH8E3itA1NHCd2mmvbtLFzT3NOKYgjKI8g8cojD4i7kLiJixBfkS8FO7M7+09qHVcrHVnHUmpnPD/P7tppM01VTamzQOntUtmNIipUJ3pXodfHSo70QVW/KqGqSCijk6SqmU1TNT6ixOBW/zjPlHFntffoRI2ukKoKpZ7UVcVUpHKqnvLhB/rVyGQ4p+Y8bQ36YXKInaU4oy/4id6/Y5JPbfJ5VjVBdQ52bnIa5pDpXwgLbTKlhCZoE7Rp6S8IC20xpYQWaAu0Zek3CAsNmVJCCBqChpb+ibDQNlNKaIO2QduW/oiw0IgpJUSgEWhk6a8IC+0wpYQOaAe0Y/Z50iwmutoUYaFdppTQBe2Cdi39GmGhMVNKiEFj0NjSrxAWmjClhAQ0AU0s/QlhoT2mlNAD7YH28svTc9U8SdOftIqJntN3CAu9YEoJF6AXoBeWfomw0D5TSuiD9kH7+YH23QNWQHS17xEWOmBKCQPQAeggX23gBlhAdLXfEBY6ZEoJQ9Ah6DBfbeh+x3iSrj9J/Enbn7T8SaeUKrE/aZYyl6iUgT1z9/UT/Q/CQkdMKWEEOgId5auN3DJ4kq4/6ZUysJY/if1JUgp5ZsX0U/AtwkLHTClhDDoGHeerjd1iFxBd7Q+EhU6YUsIEdAI6yVebuC8+niQupUrbn7RKmUtSChkWkxuKX+K7/yuGCl/45Rs+ZatMugB9xUBhu+RSl8elrgyemEM5Q83FFZKm6CFuTvjwxubf2h5lVuHEGYXoxSMemXcyXYrNMkm7RmFzomqCdFIqTGmvf1Sig2E9GfD7FTvbVyaH55gdtGkycm7dMKc65nSZqro63vgucHvHlewNqdnLNHiwE/MBlQs2Ds6bfZ4ExeRoSDKZqw+Dg5yauTNPx0vbtRkvreF1nQ8b9m2Qcjl1YzrJQJbXFPmI1sWt2C1WLD1esRmGl+oLfm4etZq95ZQ850nSpeZgc5OTmkPa50noT6Jiogf4O8JCF0wpYQG6AF3kqy3cb44Coqv9gLDQJVNKWIIuQZf5akv3J8iTdPzJ2J8k/iTyJ+Ebn76+Py8QFrpiSgkr0BXoKl9t5ap5kqY/ifxJWMpcYn+SlEKeWTH9FPyNsNA1U0pYg65B1/lqa/cp9SSjYqIHeIew0A1TStiAbkA3+Wobd2s9SeZPQn8S+ZO5P4n9ycKf9Eq5L2N/kpRyX8JS5vLMiunPzc8IC90ypYQt6BZ0m6+2df9r8iRjfxL6k87bOrDYn8zf1hXrlzKXyJ9s3vj09efmJcJCd0wpYQe6A93lq+3cn6gCQi1H9TP0HY8MFZoN6S4o23SxqbniYRd7x6XujkvtDd6ZQzlDjc0eSS/Rv9ybLvbe5r9ru9gH08U+UIhePOJPzTuZLpmHTNJeoLA5UTVBOikVaInvp/pKjwfDejJg7mJpto8YL3qy4LU92XRRtX0eN3YH+MS1lkT2PBVq2fZcym41c3FO22d2JVUjdN2jvlX1/55sZEwG0eCUD6f2rSn0xXGh0DS+lBYiu+KqBLaSTT8YoNobQMPa82MwlUFWHd+bsIyIMhrunyDTTFR1RoeDf+n1P22FxfXTHQAA","debug_symbols":"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"}],"outputs":{"globals":{"storage":[{"fields":[{"name":"balances","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000001"}}],"kind":"struct"}},{"name":"portal_address","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000002"}}],"kind":"struct"}}],"kind":"struct"}]},"structs":{"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::mint_public_parameters"}}],"kind":"struct","path":"GasToken::mint_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"fee_limit","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::check_balance_parameters"}}],"kind":"struct","path":"GasToken::check_balance_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::set_portal_parameters"}}],"kind":"struct","path":"GasToken::set_portal_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}},{"name":"leaf_index","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_public_parameters"}}],"kind":"struct","path":"GasToken::claim_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"artifact_hash","type":{"kind":"field"}},{"name":"private_functions_root","type":{"kind":"field"}},{"name":"public_bytecode_commitment","type":{"kind":"field"}},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::deploy_parameters"}}],"kind":"struct","path":"GasToken::deploy_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}}],"kind":"struct","path":"GasToken::balance_of_public_parameters"}},{"name":"return_type","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::balance_of_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_parameters"}}],"kind":"struct","path":"GasToken::claim_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::_increase_public_balance_parameters"}}],"kind":"struct","path":"GasToken::_increase_public_balance_abi"}]}},"file_map":{"123":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__SECRET_HASH, GENERATOR_INDEX__MESSAGE_NULLIFIER, ARGS_HASH_CHUNK_COUNT,\n GENERATOR_INDEX__FUNCTION_ARGS, ARGS_HASH_CHUNK_LENGTH, MAX_ARGS_LENGTH\n},\n traits::Hash, hash::{pedersen_hash, compute_siloed_nullifier, sha256_to_field}\n};\nuse crate::oracle::logs_traits::{LensForEncryptedLog, ToBytesForUnencryptedLog};\n\npub fn compute_secret_hash(secret: Field) -> Field {\n pedersen_hash([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<T, N, M>(\n contract_address: AztecAddress,\n log: T\n) -> Field where T: ToBytesForUnencryptedLog<N, M> {\n let message_bytes: [u8; N] = log.to_be_bytes_arr();\n // can't use N - not in scope error\n let n = message_bytes.len();\n let mut hash_bytes = [0; M];\n // Address is converted to 32 bytes in ts\n let address_bytes = contract_address.to_be_bytes_arr();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes = (n as Field).to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[36 + i] = message_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field\n) -> Field {\n let mut hash_bytes = [0 as u8; 192];\n let sender_bytes = sender.to_field().to_be_bytes(32);\n let chain_id_bytes = chain_id.to_be_bytes(32);\n let recipient_bytes = recipient.to_field().to_be_bytes(32);\n let version_bytes = version.to_be_bytes(32);\n let content_bytes = content.to_be_bytes(32);\n let secret_hash_bytes = secret_hash.to_be_bytes(32);\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret and index of the message hash\n// in the L1 to L2 message tree\npub fn compute_message_nullifier(message_hash: Field, secret: Field, leaf_index: Field) -> Field {\n pedersen_hash(\n [message_hash, secret, leaf_index],\n GENERATOR_INDEX__MESSAGE_NULLIFIER\n )\n}\n\nstruct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<N>(args: [Field; N]) -> Field {\n hash_args(args.as_slice())\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n assert(args.len() <= MAX_ARGS_LENGTH, \"Args length exceeds maximum\");\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n let mut current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n\n let mut current_chunk_index = 0;\n let mut index_inside_current_chunk = 0;\n for i in 0..args.len() {\n current_chunk_values[index_inside_current_chunk] = args[i];\n index_inside_current_chunk+=1;\n if index_inside_current_chunk == ARGS_HASH_CHUNK_LENGTH {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n current_chunk_index+=1;\n index_inside_current_chunk = 0;\n }\n }\n if index_inside_current_chunk > 0 {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nfn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..MAX_ARGS_LENGTH {\n input.add(i as Field);\n }\n let hash = input.hash();\n assert(hash == 0x11e40f2a780822f7971803048c9a2100579de352e7dadd99981760964da65b57);\n}\n\n#[test]\nfn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nfn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nfn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nfn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"127":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr","source":"#[oracle(packArgumentsArray)]\nunconstrained fn pack_arguments_array_oracle<N>(_args: [Field; N]) -> Field {}\n\n#[oracle(packArguments)]\nunconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {}\n\n/// - Pack arguments (array version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments_array<N>(args: [Field; N]) -> Field {\n pack_arguments_array_oracle(args)\n}\n\n/// - Pack arguments (slice version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments(args: [Field]) -> Field {\n pack_arguments_oracle(args)\n}\n\n"},"130":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr","source":"use dep::protocol_types::{\n constants::PUBLIC_DATA_TREE_HEIGHT, hash::pedersen_hash,\n public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, traits::{Hash, Serialize},\n utils::arr_copy_slice\n};\n\nglobal LEAF_PREIMAGE_LENGTH: u32 = 4;\nglobal PUBLIC_DATA_WITNESS: Field = 45;\n\nstruct PublicDataWitness {\n index: Field,\n leaf_preimage: PublicDataTreeLeafPreimage,\n path: [Field; PUBLIC_DATA_TREE_HEIGHT],\n}\n\n#[oracle(getPublicDataTreeWitness)]\nunconstrained fn get_public_data_witness_oracle(\n _block_number: u32,\n _leaf_slot: Field\n) -> [Field; PUBLIC_DATA_WITNESS] {}\n\nunconstrained pub fn get_public_data_witness(block_number: u32, leaf_slot: Field) -> PublicDataWitness {\n let fields = get_public_data_witness_oracle(block_number, leaf_slot);\n PublicDataWitness {\n index: fields[0],\n leaf_preimage: PublicDataTreeLeafPreimage { slot: fields[1], value: fields[2], next_index: fields[3] as u32, next_slot: fields[4] },\n path: arr_copy_slice(fields, [0; PUBLIC_DATA_TREE_HEIGHT], 1 + LEAF_PREIMAGE_LENGTH)\n }\n}\n"},"137":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_call_stack_item::PrivateCallStackItem},\n address::AztecAddress, constants::PRIVATE_CALL_STACK_ITEM_LENGTH\n};\n\n#[oracle(callPrivateFunction)]\nunconstrained fn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> PrivateCallStackItem {\n let fields = call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n PrivateCallStackItem::deserialize(fields)\n}\n"},"141":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_contract_instance.nr","source":"use dep::protocol_types::{\n address::AztecAddress, contract_instance::ContractInstance, utils::arr_copy_slice,\n constants::CONTRACT_INSTANCE_LENGTH, utils::reader::Reader\n};\n\n#[oracle(getContractInstance)]\nunconstrained fn get_contract_instance_oracle(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {}\n\n// Returns a ContractInstance plus a boolean indicating whether the instance was found.\n#[oracle(avmOpcodeGetContractInstance)]\nunconstrained fn get_contract_instance_oracle_avm(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {}\n\nunconstrained fn get_contract_instance_internal(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n get_contract_instance_oracle(address)\n}\n\nunconstrained pub fn get_contract_instance_internal_avm(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {\n get_contract_instance_oracle_avm(address)\n}\n\npub fn get_contract_instance(address: AztecAddress) -> ContractInstance {\n let instance = ContractInstance::deserialize(get_contract_instance_internal(address));\n assert(instance.to_address().eq(address));\n instance\n}\n\npub fn get_contract_instance_avm(address: AztecAddress) -> Option<ContractInstance> {\n let mut reader = Reader::new(get_contract_instance_internal_avm(address));\n let found = reader.read();\n if found == 0 {\n Option::none()\n } else {\n Option::some(reader.read_struct(ContractInstance::deserialize))\n }\n}\n"},"142":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr","source":"use dep::protocol_types::{\n abis::{\n function_selector::FunctionSelector, public_call_stack_item::PublicCallStackItem,\n function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_context::CallContext, read_request::ReadRequest, note_hash::NoteHash, nullifier::Nullifier,\n log_hash::LogHash, global_variables::GlobalVariables, gas::Gas\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n messaging::l2_to_l1_message::L2ToL1Message, header::Header, address::AztecAddress,\n utils::reader::Reader,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH\n}\n};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\npub fn parse_public_call_stack_item_from_oracle(fields: [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH]) -> PublicCallStackItem {\n let mut reader = Reader::new(fields);\n\n // Note: Not using PublicCirclePublicInputs::deserialize here, because everything below args_hash is 0 and\n // there is no more data in fields because there is only ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE fields!\n // WARNING: if updating, see comment in public_call_stack_item.ts's PublicCallStackItem.hash()\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData { selector: FunctionSelector::from_field(reader.read()), is_private: false },\n public_inputs: PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n start_side_effect_counter: reader.read_u32(),\n args_hash: reader.read(),\n returns_hash: 0,\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n nullifier_non_existent_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter: 0,\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n global_variables: GlobalVariables::empty(),\n prover_address: AztecAddress::zero(),\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0\n },\n is_execution_request: true\n };\n reader.finish();\n\n item\n}\n"},"145":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr","source":"use dep::protocol_types::{address::AztecAddress};\n\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: u64 = 17;\n\n// Obtains membership witness (index and sibling path) for a message in the L1 to L2 message tree.\n#[oracle(getL1ToL2MembershipWitness)]\nunconstrained fn get_l1_to_l2_membership_witness_oracle(\n _contract_address: AztecAddress,\n _message_hash: Field,\n _secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {}\n\nunconstrained pub fn get_l1_to_l2_membership_witness(\n contract_address: AztecAddress,\n message_hash: Field,\n secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {\n get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret)\n}\n"},"146":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/map.nr","source":"use dep::protocol_types::{hash::pedersen_hash, storage::map::derive_storage_slot_in_map, traits::ToField};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:map\nstruct Map<K, V, Context> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, T, Context> Storage<T> for Map<K, T, Context> {}\n\nimpl<K, V, Context> Map<K, V, Context> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map { context, storage_slot, state_var_constructor }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = derive_storage_slot_in_map(self.storage_slot, key);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n"},"148":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr","source":"use crate::context::{PublicContext, UnconstrainedContext};\nuse crate::oracle::storage::storage_read;\nuse dep::protocol_types::traits::{Deserialize, Serialize};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:public_mutable_struct\nstruct PublicMutable<T, Context> {\n context: Context,\n storage_slot: Field,\n}\n// docs:end:public_mutable_struct\n\nimpl<T, Context> Storage<T> for PublicMutable<T, Context> {}\n\nimpl<T, Context> PublicMutable<T, Context> {\n // docs:start:public_mutable_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicMutable { context, storage_slot }\n }\n // docs:end:public_mutable_struct_new\n}\n\nimpl<T, T_SERIALIZED_LEN> PublicMutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // docs:start:public_mutable_struct_read\n pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write(self, value: T) {\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T, T_SERIALIZED_LEN> PublicMutable<T, UnconstrainedContext> where T: Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n"},"151":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr","source":"use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext}, oracle::storage::storage_read,\n state_vars::storage::Storage\n};\nuse dep::protocol_types::{constants::INITIALIZATION_SLOT_SEPARATOR, traits::{Deserialize, Serialize}};\n\n// Just like PublicImmutable but with the ability to read from private functions.\nstruct SharedImmutable<T, Context>{\n context: Context,\n storage_slot: Field,\n}\n\nimpl<T, Context> Storage<T> for SharedImmutable<T, Context> {}\n\nimpl<T, Context> SharedImmutable<T, Context> {\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Self { context, storage_slot }\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // Intended to be only called once. \n pub fn initialize(self, value: T) {\n // We check that the struct is not yet initialized by checking if the initialization slot is 0\n let initialization_slot = INITIALIZATION_SLOT_SEPARATOR + self.storage_slot;\n let init_field: Field = self.context.storage_read(initialization_slot);\n assert(init_field == 0, \"SharedImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n self.context.storage_write(initialization_slot, 0xdead);\n self.context.storage_write(self.storage_slot, value);\n }\n\n pub fn read_public(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, UnconstrainedContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read_public(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, &mut PrivateContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n pub fn read_private(self) -> T {\n let header = self.context.get_header();\n let mut fields = [0; T_SERIALIZED_LEN];\n\n for i in 0..fields.len() {\n fields[i] =\n header.public_storage_historical_read(\n self.storage_slot + i as Field,\n (*self.context).this_address()\n );\n }\n T::deserialize(fields)\n }\n}\n"},"169":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{GAS_LENGTH, FIXED_DA_GAS, FIXED_L2_GAS}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered, utils::reader::Reader,\n abis::gas_fees::GasFees\n};\nuse std::ops::{Add, Sub};\n\nstruct Gas {\n da_gas: u32,\n l2_gas: u32,\n}\n\nimpl Gas {\n pub fn new(da_gas: u32, l2_gas: u32) -> Self {\n Self { da_gas, l2_gas }\n }\n\n pub fn tx_overhead() -> Self {\n Self { da_gas: FIXED_DA_GAS, l2_gas: FIXED_L2_GAS }\n }\n\n pub fn compute_fee(self, fees: GasFees) -> Field {\n (self.da_gas as Field) * fees.fee_per_da_gas + (self.l2_gas as Field) * fees.fee_per_l2_gas\n }\n\n pub fn is_empty(self) -> bool {\n (self.da_gas == 0) & (self.l2_gas == 0)\n }\n\n pub fn within(self, limits: Gas) -> bool {\n (self.da_gas <= limits.da_gas) & (self.l2_gas <= limits.l2_gas)\n }\n}\n\nimpl Add for Gas {\n fn add(self, other: Gas) -> Self {\n Gas::new(self.da_gas + other.da_gas, self.l2_gas + other.l2_gas)\n }\n}\n\nimpl Sub for Gas {\n fn sub(self, other: Gas) -> Self {\n Gas::new(self.da_gas - other.da_gas, self.l2_gas - other.l2_gas)\n }\n}\n\nimpl Serialize<GAS_LENGTH> for Gas {\n fn serialize(self) -> [Field; GAS_LENGTH] {\n [self.da_gas as Field, self.l2_gas as Field]\n }\n}\n\nimpl Deserialize<GAS_LENGTH> for Gas {\n fn deserialize(serialized: [Field; GAS_LENGTH]) -> Gas {\n Gas::new(serialized[0] as u32, serialized[1] as u32)\n }\n}\n\nimpl Eq for Gas {\n fn eq(self, other : Gas) -> bool {\n (self.da_gas == other.da_gas) & (self.l2_gas == other.l2_gas)\n }\n}\n\nimpl Empty for Gas {\n fn empty() -> Self {\n Gas::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Gas::empty();\n let serialized = item.serialize();\n let deserialized = Gas::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n"},"171":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash.nr","source":"use crate::{\n abis::read_request::ScopedReadRequest, address::AztecAddress,\n abis::side_effect::{Ordered, OrderedValue, Readable, Scoped},\n constants::{NOTE_HASH_LENGTH, SCOPED_NOTE_HASH_LENGTH}, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct NoteHash {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for NoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteHash {\n fn eq(self, other: NoteHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter) \n }\n}\n\nimpl Empty for NoteHash {\n fn empty() -> Self {\n NoteHash {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_HASH_LENGTH> for NoteHash {\n fn serialize(self) -> [Field; NOTE_HASH_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_HASH_LENGTH> for NoteHash {\n fn deserialize(values: [Field; NOTE_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl NoteHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNoteHash {\n ScopedNoteHash { note_hash: self, contract_address }\n }\n}\n\nstruct ScopedNoteHash {\n note_hash: NoteHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<NoteHash> for ScopedNoteHash {\n fn inner(self) -> NoteHash {\n self.note_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNoteHash {\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNoteHash {\n fn value(self) -> Field {\n self.note_hash.value\n }\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl Eq for ScopedNoteHash {\n fn eq(self, other: ScopedNoteHash) -> bool {\n (self.note_hash == other.note_hash)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedNoteHash {\n fn empty() -> Self {\n ScopedNoteHash {\n note_hash: NoteHash::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn serialize(self) -> [Field; SCOPED_NOTE_HASH_LENGTH] {\n array_concat(self.note_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn deserialize(values: [Field; SCOPED_NOTE_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n note_hash: reader.read_struct(NoteHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNoteHash {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.note_hash.value, read_request.value(), \"Value of the note hash does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the note hash does not match read request\");\n assert(\n read_request.counter() > self.note_hash.counter, \"Read request counter must be greater than the counter of the note hash\"\n );\n }\n}\n\nimpl ScopedNoteHash {\n pub fn expose_to_public(self) -> NoteHash {\n // Hide the actual counter when exposing it to the public kernel.\n NoteHash { value: self.note_hash.value, counter: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = NoteHash::empty();\n let serialized = item.serialize();\n let deserialized = NoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNoteHash::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"172":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_fees.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::GAS_FEES_LENGTH, hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty},\n abis::side_effect::Ordered, utils::reader::Reader\n};\n\nstruct GasFees {\n fee_per_da_gas: Field,\n fee_per_l2_gas: Field,\n}\n\nimpl GasFees {\n pub fn new(fee_per_da_gas: Field, fee_per_l2_gas: Field) -> Self {\n Self { fee_per_da_gas, fee_per_l2_gas }\n }\n\n pub fn default() -> Self {\n GasFees::new(1, 1)\n }\n\n pub fn is_empty(self) -> bool {\n (self.fee_per_da_gas == 0) & (self.fee_per_l2_gas == 0)\n }\n}\n\nimpl Serialize<GAS_FEES_LENGTH> for GasFees {\n fn serialize(self) -> [Field; GAS_FEES_LENGTH] {\n [self.fee_per_da_gas, self.fee_per_l2_gas]\n }\n}\n\nimpl Deserialize<GAS_FEES_LENGTH> for GasFees {\n fn deserialize(serialized: [Field; GAS_FEES_LENGTH]) -> GasFees {\n GasFees::new(serialized[0], serialized[1])\n }\n}\n\nimpl Eq for GasFees {\n fn eq(self, other : GasFees) -> bool {\n (self.fee_per_da_gas == other.fee_per_da_gas) & (self.fee_per_l2_gas == other.fee_per_l2_gas)\n }\n}\n\nimpl Empty for GasFees {\n fn empty() -> Self {\n GasFees::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasFees::empty();\n let serialized = item.serialize();\n let deserialized = GasFees::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"174":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr","source":"use crate::{\n abis::{\n call_context::CallContext, max_block_number::MaxBlockNumber, gas_settings::GasSettings,\n validation_requests::KeyValidationRequestAndGenerator, note_hash::NoteHash, nullifier::Nullifier,\n private_call_request::PrivateCallRequest, read_request::ReadRequest,\n log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n constants::{\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_L2_TO_L1_MSGS_PER_CALL, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS, MAX_ENCRYPTED_LOGS_PER_CALL,\n MAX_UNENCRYPTED_LOGS_PER_CALL, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, hash::pedersen_hash, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n transaction::tx_context::TxContext, utils::arrays::validate_array\n};\n\nstruct PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: u32,\n nullifier_read_requests: u32,\n key_validation_requests_and_generators: u32,\n note_hashes: u32,\n nullifiers: u32,\n l2_to_l1_msgs: u32,\n private_call_requests: u32,\n public_call_stack_hashes: u32,\n note_encrypted_logs_hashes: u32,\n encrypted_logs_hashes: u32,\n unencrypted_logs_hashes: u32,\n}\n\nimpl PrivateCircuitPublicInputsArrayLengths {\n pub fn new(public_inputs: PrivateCircuitPublicInputs) -> Self {\n PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: validate_array(public_inputs.note_hash_read_requests),\n nullifier_read_requests: validate_array(public_inputs.nullifier_read_requests),\n key_validation_requests_and_generators: validate_array(public_inputs.key_validation_requests_and_generators),\n note_hashes: validate_array(public_inputs.note_hashes),\n nullifiers: validate_array(public_inputs.nullifiers),\n l2_to_l1_msgs: validate_array(public_inputs.l2_to_l1_msgs),\n private_call_requests: validate_array(public_inputs.private_call_requests),\n public_call_stack_hashes: validate_array(public_inputs.public_call_stack_hashes),\n note_encrypted_logs_hashes: validate_array(public_inputs.note_encrypted_logs_hashes),\n encrypted_logs_hashes: validate_array(public_inputs.encrypted_logs_hashes),\n unencrypted_logs_hashes: validate_array(public_inputs.unencrypted_logs_hashes)\n }\n }\n}\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: [ReadRequest; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest; MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator; MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n\n note_hashes: [NoteHash; MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier; MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: Field,\n l2_to_l1_msgs: [L2ToL1Message; MAX_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter : u32,\n end_side_effect_counter : u32,\n note_encrypted_logs_hashes: [NoteLogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash; MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n // Note: The chain_id and version here are not redundant to the values in self.historical_header.global_variables because\n // they can be different in case of a protocol upgrade. In such a situation we could be using header from a block\n // before the upgrade took place but be using the updated protocol to execute and prove the transaction.\n tx_context: TxContext,\n}\n\nimpl Eq for PrivateCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.call_context.eq(other.call_context) &\n self.args_hash.eq(other.args_hash) &\n (self.returns_hash == other.returns_hash) &\n (self.min_revertible_side_effect_counter == other.min_revertible_side_effect_counter) &\n (self.is_fee_payer == other.is_fee_payer) &\n (self.max_block_number == other.max_block_number) &\n (self.note_hash_read_requests == other.note_hash_read_requests) &\n (self.nullifier_read_requests == other.nullifier_read_requests) &\n (self.key_validation_requests_and_generators == other.key_validation_requests_and_generators) &\n (self.note_hashes == other.note_hashes) &\n (self.nullifiers == other.nullifiers) &\n (self.private_call_requests == other.private_call_requests) &\n (self.public_call_stack_hashes == other.public_call_stack_hashes) &\n (self.l2_to_l1_msgs == other.l2_to_l1_msgs) &\n (self.start_side_effect_counter == other.start_side_effect_counter) &\n (self.end_side_effect_counter == other.end_side_effect_counter) &\n (self.note_encrypted_logs_hashes == other.note_encrypted_logs_hashes) &\n (self.encrypted_logs_hashes == other.encrypted_logs_hashes) &\n (self.unencrypted_logs_hashes == other.unencrypted_logs_hashes) &\n self.historical_header.eq(other.historical_header) &\n self.tx_context.eq(other.tx_context)\n }\n}\n\nimpl Serialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new();\n fields.extend_from_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n\n fields.push(self.min_revertible_side_effect_counter as Field);\n fields.push(if self.is_fee_payer { 1 } else { 0 } as Field);\n\n fields.extend_from_array(self.max_block_number.serialize());\n\n for i in 0..self.note_hash_read_requests.len() {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..self.nullifier_read_requests.len() {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..self.key_validation_requests_and_generators.len() {\n fields.extend_from_array(self.key_validation_requests_and_generators[i].serialize());\n }\n for i in 0..self.note_hashes.len() {\n fields.extend_from_array(self.note_hashes[i].serialize());\n }\n for i in 0..self.nullifiers.len() {\n fields.extend_from_array(self.nullifiers[i].serialize());\n }\n for i in 0..self.private_call_requests.len() {\n fields.extend_from_array(self.private_call_requests[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n fields.push(self.public_teardown_function_hash);\n for i in 0..self.l2_to_l1_msgs.len() {\n fields.extend_from_array(self.l2_to_l1_msgs[i].serialize());\n }\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n for i in 0..self.note_encrypted_logs_hashes.len() {\n fields.extend_from_array(self.note_encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.encrypted_logs_hashes.len() {\n fields.extend_from_array(self.encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.unencrypted_logs_hashes.len() {\n fields.extend_from_array(self.unencrypted_logs_hashes[i].serialize());\n }\n fields.extend_from_array(self.historical_header.serialize());\n fields.extend_from_array(self.tx_context.serialize());\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn deserialize(serialized: [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n let inputs = Self {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n min_revertible_side_effect_counter: reader.read() as u32,\n is_fee_payer: reader.read() == 1,\n max_block_number: reader.read_struct(MaxBlockNumber::deserialize),\n note_hash_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL]),\n nullifier_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL]),\n key_validation_requests_and_generators: reader.read_struct_array(KeyValidationRequestAndGenerator::deserialize, [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL]),\n note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL]),\n nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL]),\n private_call_requests: reader.read_struct_array(PrivateCallRequest::deserialize, [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n public_teardown_function_hash: reader.read(),\n l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL]),\n start_side_effect_counter: reader.read() as u32,\n end_side_effect_counter: reader.read() as u32,\n note_encrypted_logs_hashes: reader.read_struct_array(NoteLogHash::deserialize, [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL]),\n encrypted_logs_hashes: reader.read_struct_array(EncryptedLogHash::deserialize, [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL]),\n unencrypted_logs_hashes: reader.read_struct_array(LogHash::deserialize, [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL]),\n historical_header: reader.read_struct(Header::deserialize),\n tx_context: reader.read_struct(TxContext::deserialize),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PrivateCircuitPublicInputs {\n fn empty() -> Self {\n PrivateCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\n returns_hash: 0,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter : 0 as u32,\n end_side_effect_counter : 0 as u32,\n note_encrypted_logs_hashes: [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n tx_context: TxContext::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PrivateCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PrivateCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PrivateCircuitPublicInputs::empty();\n let hash = inputs.hash();\n // Value from private_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x15c9b0a92b9b541598e24c9f0b0b4b04b7f2408599751c45aa12de671fd9b363;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"175":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item_compressed.nr","source":"use crate::abis::{call_context::CallContext, function_data::FunctionData, gas::Gas};\nuse crate::address::AztecAddress;\nuse crate::constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH};\nuse crate::traits::{Hash, Empty, Serialize, Deserialize};\nuse crate::utils::reader::Reader;\n\n/**\n * A compressed version of the PublicCallStackItem struct used to compute the \"hash\"\n * of a PublicCallStackItem.\n * \n * Historically, we have been zeroing most values in the PublicCallStackItem struct\n * to compute the hash involved when adding a PublicCallStackItem to the PublicCallStack.\n * \n * This struct is used to store the values that we did not zero out, and allow us to hash\n * only these, thereby skipping a lot of computation and saving us a lot of constraints\n * \n * Essentially this struct exists such that we don't have a `hash` function in the \n * PublicCallStackItem struct that practically throws away some values of the struct\n * without clearly indicating that it does so.\n */\nstruct PublicCallStackItemCompressed {\n contract_address: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n revert_code: u8,\n start_gas_left: Gas,\n end_gas_left: Gas,\n}\n\nimpl Eq for PublicCallStackItemCompressed {\n fn eq(self, other: PublicCallStackItemCompressed) -> bool {\n (self.contract_address == other.contract_address)\n & (self.call_context == other.call_context)\n & (self.function_data == other.function_data)\n & (self.args_hash == other.args_hash)\n & (self.returns_hash == other.returns_hash)\n & (self.revert_code == other.revert_code)\n & (self.start_gas_left == other.start_gas_left)\n & (self.end_gas_left == other.end_gas_left)\n }\n}\n\nimpl Hash for PublicCallStackItemCompressed {\n fn hash(self) -> Field {\n std::hash::pedersen_hash_with_separator(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PublicCallStackItemCompressed {\n fn empty() -> Self {\n PublicCallStackItemCompressed {\n contract_address: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n }\n }\n}\n\nimpl Serialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn serialize(self) -> [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n fields.push(self.revert_code as Field);\n fields.extend_from_array(self.start_gas_left.serialize());\n fields.extend_from_array(self.end_gas_left.serialize());\n\n assert_eq(fields.len(), PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn deserialize(fields: [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH]) -> PublicCallStackItemCompressed {\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItemCompressed {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n revert_code: reader.read() as u8,\n start_gas_left: reader.read_struct(Gas::deserialize),\n end_gas_left: reader.read_struct(Gas::deserialize),\n };\n reader.finish();\n item\n }\n}\n"},"177":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/global_variables.nr","source":"use crate::{\n address::{AztecAddress, EthAddress}, abis::gas_fees::GasFees,\n constants::{GENERATOR_INDEX__GLOBAL_VARIABLES, GLOBAL_VARIABLES_LENGTH},\n traits::{Deserialize, Empty, Hash, Serialize}, utils::reader::Reader\n};\n\n// docs:start:global-variables\nstruct GlobalVariables {\n chain_id : Field,\n version : Field,\n block_number : Field,\n timestamp : u64,\n coinbase : EthAddress,\n fee_recipient : AztecAddress,\n gas_fees : GasFees\n}\n// docs:end:global-variables\n\nimpl GlobalVariables {\n fn is_empty(self) -> bool {\n (self.chain_id == 0)\n & (self.version == 0)\n & (self.block_number == 0)\n & (self.timestamp == 0)\n & (self.coinbase.is_zero())\n & (self.fee_recipient.is_zero())\n & (self.gas_fees.is_empty())\n }\n}\n\nimpl Serialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn serialize(self) -> [Field; GLOBAL_VARIABLES_LENGTH] {\n let mut serialized: BoundedVec<Field, GLOBAL_VARIABLES_LENGTH> = BoundedVec::new();\n\n serialized.push(self.chain_id);\n serialized.push(self.version);\n serialized.push(self.block_number);\n serialized.push(self.timestamp as Field);\n serialized.push(self.coinbase.to_field());\n serialized.push(self.fee_recipient.to_field());\n serialized.extend_from_array(self.gas_fees.serialize());\n\n serialized.storage\n }\n}\n\nimpl Deserialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn deserialize(serialized: [Field; GLOBAL_VARIABLES_LENGTH]) -> GlobalVariables {\n let mut reader = Reader::new(serialized);\n GlobalVariables {\n chain_id: reader.read(),\n version: reader.read(),\n block_number: reader.read(),\n timestamp: reader.read() as u64,\n coinbase: EthAddress::from_field(reader.read()),\n fee_recipient: AztecAddress::from_field(reader.read()),\n gas_fees: reader.read_struct(GasFees::deserialize)\n }\n }\n}\n\nimpl Eq for GlobalVariables {\n fn eq(self, other : GlobalVariables) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.block_number == other.block_number) &\n (self.timestamp == other.timestamp) &\n (self.coinbase == other.coinbase) &\n (self.fee_recipient == other.fee_recipient) &\n (self.gas_fees == other.gas_fees) \n }\n}\n\nimpl Empty for GlobalVariables {\n fn empty() -> Self {\n Self {\n chain_id: 0,\n version: 0,\n block_number: 0,\n timestamp: 0,\n coinbase: EthAddress::empty(),\n fee_recipient: AztecAddress::empty(),\n gas_fees: GasFees::empty()\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let vars = GlobalVariables::empty();\n let _serialized = vars.serialize();\n let _deserialized = GlobalVariables::deserialize(_serialized);\n}\n"},"178":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/read_request.nr","source":"use crate::{\n abis::side_effect::{Ordered, Scoped}, traits::{Empty, Serialize, Deserialize},\n address::AztecAddress, constants::{READ_REQUEST_LENGTH, SCOPED_READ_REQUEST_LEN},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct ReadRequest {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for ReadRequest {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for ReadRequest {\n fn eq(self, read_request: ReadRequest) -> bool {\n (self.value == read_request.value)\n & (self.counter == read_request.counter)\n }\n}\n\nimpl Empty for ReadRequest {\n fn empty() -> Self {\n ReadRequest {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn serialize(self) -> [Field; READ_REQUEST_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn deserialize(values: [Field; READ_REQUEST_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl ReadRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedReadRequest {\n ScopedReadRequest { read_request: self, contract_address }\n }\n}\n\nstruct ScopedReadRequest {\n read_request: ReadRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<ReadRequest> for ScopedReadRequest {\n fn inner(self) -> ReadRequest {\n self.read_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Eq for ScopedReadRequest {\n fn eq(self, other: ScopedReadRequest) -> bool {\n (self.read_request == other.read_request)\n & (self.contract_address.eq(other.contract_address))\n }\n}\n\nimpl Empty for ScopedReadRequest {\n fn empty() -> Self {\n ScopedReadRequest {\n read_request: ReadRequest::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn serialize(self) -> [Field; SCOPED_READ_REQUEST_LEN] {\n array_concat(self.read_request.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn deserialize(values: [Field; SCOPED_READ_REQUEST_LEN]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n read_request: reader.read_struct(ReadRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedReadRequest {\n pub fn value(self) -> Field {\n self.read_request.value\n }\n pub fn counter(self) -> u32 {\n self.read_request.counter\n }\n}\n\n#[test]\nfn serialization_of_empty_read() {\n let item = ReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"181":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request_and_generator.nr","source":"use crate::{\n address::AztecAddress,\n abis::validation_requests::{\n key_validation_request::KeyValidationRequest,\n scoped_key_validation_request_and_generator::ScopedKeyValidationRequestAndGenerator\n},\n constants::KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct KeyValidationRequestAndGenerator {\n request: KeyValidationRequest,\n sk_app_generator: Field,\n}\n\nimpl Eq for KeyValidationRequestAndGenerator {\n fn eq(self, other: KeyValidationRequestAndGenerator) -> bool {\n (self.request == other.request) & (self.sk_app_generator == other.sk_app_generator)\n }\n}\n\nimpl Empty for KeyValidationRequestAndGenerator {\n fn empty() -> Self {\n KeyValidationRequestAndGenerator {\n request: KeyValidationRequest::empty(),\n sk_app_generator: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH] {\n array_concat(self.request.serialize(), [self.sk_app_generator])\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH]) -> Self {\n let mut reader = Reader::new(fields);\n let res = Self {\n request: reader.read_struct(KeyValidationRequest::deserialize),\n sk_app_generator: reader.read(),\n };\n reader.finish();\n res\n }\n}\n\nimpl KeyValidationRequestAndGenerator {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedKeyValidationRequestAndGenerator {\n ScopedKeyValidationRequestAndGenerator { request: self, contract_address }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = KeyValidationRequestAndGenerator::empty();\n let serialized = item.serialize();\n let deserialized = KeyValidationRequestAndGenerator::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"182":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr","source":"use crate::{constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize}, point::Point};\n\nstruct KeyValidationRequest {\n pk_m: Point,\n sk_app: Field, // not a grumpkin scalar because it's output of poseidon2\n}\n\nimpl Eq for KeyValidationRequest {\n fn eq(self, request: KeyValidationRequest) -> bool {\n (request.pk_m.eq(self.pk_m))\n & (request.sk_app.eq(self.sk_app))\n }\n}\n\nimpl Empty for KeyValidationRequest {\n fn empty() -> Self {\n KeyValidationRequest {\n pk_m: Point::empty(),\n sk_app: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_LENGTH] {\n [\n self.pk_m.x,\n self.pk_m.y,\n self.pk_m.is_infinite as Field,\n self.sk_app,\n ]\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_LENGTH]) -> Self {\n Self {\n pk_m: Point { x:fields[0], y: fields[1], is_infinite: fields[2] as bool},\n sk_app: fields[3],\n }\n }\n}\n\n"},"186":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/nullifier.nr","source":"use crate::{\n abis::{side_effect::{Ordered, OrderedValue, Readable, Scoped}, read_request::ScopedReadRequest},\n address::AztecAddress, constants::{NULLIFIER_LENGTH, SCOPED_NULLIFIER_LENGTH},\n hash::compute_siloed_nullifier, traits::{Empty, Hash, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct Nullifier {\n value: Field,\n counter: u32,\n note_hash: Field,\n}\n\nimpl Ordered for Nullifier {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for Nullifier {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for Nullifier {\n fn eq(self, other: Nullifier) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.note_hash == other.note_hash) \n }\n}\n\nimpl Empty for Nullifier {\n fn empty() -> Self {\n Nullifier {\n value: 0,\n counter: 0,\n note_hash: 0,\n }\n }\n}\n\nimpl Serialize<NULLIFIER_LENGTH> for Nullifier {\n fn serialize(self) -> [Field; NULLIFIER_LENGTH] {\n [self.value, self.counter as Field, self.note_hash]\n }\n}\n\nimpl Deserialize<NULLIFIER_LENGTH> for Nullifier {\n fn deserialize(values: [Field; NULLIFIER_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n note_hash: values[2],\n }\n }\n}\n\nimpl Readable for Nullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n // Public kernels output Nullifier instead of ScopedNullifier.\n // The nullifier value has been siloed.\n let siloed_request_value = compute_siloed_nullifier(read_request.contract_address, read_request.value());\n assert_eq(self.value, siloed_request_value, \"Value of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl Nullifier {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNullifier {\n ScopedNullifier { nullifier: self, contract_address }\n }\n}\n\nstruct ScopedNullifier {\n nullifier: Nullifier,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<Nullifier> for ScopedNullifier {\n fn inner(self) -> Nullifier {\n self.nullifier\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNullifier {\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNullifier {\n fn value(self) -> Field {\n self.nullifier.value\n }\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl Eq for ScopedNullifier {\n fn eq(self, other: ScopedNullifier) -> bool {\n (self.nullifier == other.nullifier)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedNullifier {\n fn empty() -> Self {\n ScopedNullifier {\n nullifier: Nullifier::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn serialize(self) -> [Field; SCOPED_NULLIFIER_LENGTH] {\n array_concat(self.nullifier.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn deserialize(values: [Field; SCOPED_NULLIFIER_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n nullifier: reader.read_struct(Nullifier::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.nullifier.value, read_request.value(), \"Value of the nullifier does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.nullifier.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl ScopedNullifier {\n pub fn nullified_note_hash(self) -> Field {\n self.nullifier.note_hash\n }\n\n pub fn expose_to_public(self) -> Nullifier {\n // Hide the actual counter and note hash when exposing it to the public kernel.\n Nullifier { value: self.nullifier.value, counter: 0, note_hash: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Nullifier::empty();\n let serialized = item.serialize();\n let deserialized = Nullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNullifier::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"195":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_selector.nr","source":"use crate::utils::field::field_from_bytes;\nuse crate::traits::{Serialize, Deserialize, FromField, ToField, Empty};\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl Serialize<1> for FunctionSelector {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n}\n\nimpl Deserialize<1> for FunctionSelector {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n\nimpl FromField for FunctionSelector {\n fn from_field(field: Field) -> Self {\n Self { inner: field as u32 }\n }\n}\n\nimpl ToField for FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n}\n\nimpl Empty for FunctionSelector {\n fn empty() -> Self {\n Self { inner: 0 as u32 }\n }\n}\n\nimpl FunctionSelector {\n pub fn from_u32(value: u32) -> Self {\n Self { inner: value }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n}\n"},"196":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr","source":"use crate::{\n abis::{\n private_call_stack_item::PrivateCallStackItem, call_context::CallContext,\n function_data::FunctionData, caller_context::CallerContext,\n side_effect::{Ordered, RangeOrdered, Scoped}\n},\n address::AztecAddress, constants::{PRIVATE_CALL_REQUEST_LENGTH, SCOPED_PRIVATE_CALL_REQUEST_LENGTH},\n traits::{Empty, Serialize, Deserialize}, utils::reader::Reader\n};\n\nstruct PrivateCallRequest {\n target: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n caller_context: CallerContext,\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n}\n\nimpl Ordered for PrivateCallRequest {\n fn counter(self) -> u32 {\n self.start_side_effect_counter\n }\n}\n\nimpl RangeOrdered for PrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.start_side_effect_counter\n }\n fn counter_end(self) -> u32 {\n self.end_side_effect_counter\n }\n}\n\nimpl Eq for PrivateCallRequest {\n fn eq(self, other: PrivateCallRequest) -> bool {\n (self.target == other.target) \n & (self.call_context == other.call_context) \n & (self.function_data == other.function_data) \n & (self.args_hash == other.args_hash) \n & (self.returns_hash == other.returns_hash)\n & (self.caller_context == other.caller_context)\n & (self.start_side_effect_counter == other.start_side_effect_counter)\n & (self.end_side_effect_counter == other.end_side_effect_counter)\n }\n}\n\nimpl Empty for PrivateCallRequest {\n fn empty() -> Self {\n PrivateCallRequest {\n target: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n caller_context: CallerContext::empty(),\n start_side_effect_counter: 0,\n end_side_effect_counter: 0,\n }\n }\n}\n\nimpl Serialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn serialize(self) -> [Field; PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.push(self.target.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n fields.extend_from_array(self.caller_context.serialize());\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n assert_eq(fields.len(), PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn deserialize(fields: [Field; PRIVATE_CALL_REQUEST_LENGTH]) -> PrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = PrivateCallRequest {\n target: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n caller_context: reader.read_struct(CallerContext::deserialize),\n start_side_effect_counter: reader.read_u32(),\n end_side_effect_counter: reader.read_u32(),\n };\n reader.finish();\n item\n }\n}\n\nimpl PrivateCallRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedPrivateCallRequest {\n ScopedPrivateCallRequest { call_request: self, contract_address }\n }\n\n pub fn matches_stack_item(self, stack_item: PrivateCallStackItem) -> bool {\n (self.target == stack_item.contract_address)\n & (self.call_context == stack_item.public_inputs.call_context)\n & (self.function_data == stack_item.function_data)\n & (self.args_hash == stack_item.public_inputs.args_hash)\n & (self.returns_hash == stack_item.public_inputs.returns_hash)\n & (self.start_side_effect_counter\n == stack_item.public_inputs.start_side_effect_counter)\n & (self.end_side_effect_counter\n == stack_item.public_inputs.end_side_effect_counter)\n }\n}\n\nstruct ScopedPrivateCallRequest {\n call_request: PrivateCallRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<PrivateCallRequest> for ScopedPrivateCallRequest {\n fn inner(self) -> PrivateCallRequest {\n self.call_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedPrivateCallRequest {\n fn counter(self) -> u32 {\n self.call_request.counter_start()\n }\n}\n\nimpl RangeOrdered for ScopedPrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.call_request.counter_start()\n }\n fn counter_end(self) -> u32 {\n self.call_request.counter_end()\n }\n}\n\nimpl Eq for ScopedPrivateCallRequest {\n fn eq(self, other: ScopedPrivateCallRequest) -> bool {\n (self.call_request == other.call_request)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedPrivateCallRequest {\n fn empty() -> Self {\n ScopedPrivateCallRequest {\n call_request: PrivateCallRequest::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn serialize(self) -> [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, SCOPED_PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.call_request.serialize());\n fields.extend_from_array(self.contract_address.serialize());\n\n assert_eq(fields.len(), SCOPED_PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn deserialize(fields: [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH]) -> ScopedPrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = ScopedPrivateCallRequest {\n call_request: reader.read_struct(PrivateCallRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = ScopedPrivateCallRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedPrivateCallRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"201":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress}, abis::gas::Gas,\n abis::gas_fees::GasFees,\n constants::{\n GAS_SETTINGS_LENGTH, DEFAULT_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_INCLUSION_FEE\n},\n hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n utils::reader::Reader\n};\n\nstruct GasSettings {\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field,\n}\n\nimpl GasSettings {\n pub fn new(\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field\n ) -> Self {\n Self { gas_limits, teardown_gas_limits, max_fees_per_gas, inclusion_fee }\n }\n\n pub fn default() -> Self {\n GasSettings::new(\n Gas::new(DEFAULT_GAS_LIMIT, DEFAULT_GAS_LIMIT),\n Gas::new(DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT),\n GasFees::new(DEFAULT_MAX_FEE_PER_GAS, DEFAULT_MAX_FEE_PER_GAS),\n DEFAULT_INCLUSION_FEE\n )\n }\n}\n\nimpl Eq for GasSettings {\n fn eq(self, other: Self) -> bool {\n (self.gas_limits == other.gas_limits) & (self.teardown_gas_limits == other.teardown_gas_limits) & (self.max_fees_per_gas == other.max_fees_per_gas) & (self.inclusion_fee == other.inclusion_fee)\n }\n}\n\nimpl Empty for GasSettings {\n fn empty() -> Self {\n GasSettings::new(\n Gas::empty(), Gas::empty(), GasFees::empty(), 0\n )\n }\n}\n\nimpl Serialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn serialize(self) -> [Field; GAS_SETTINGS_LENGTH] {\n let mut serialized: BoundedVec<Field, GAS_SETTINGS_LENGTH> = BoundedVec::new();\n\n serialized.extend_from_array(self.gas_limits.serialize());\n serialized.extend_from_array(self.teardown_gas_limits.serialize());\n serialized.extend_from_array(self.max_fees_per_gas.serialize());\n serialized.push(self.inclusion_fee);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn deserialize(serialized: [Field; GAS_SETTINGS_LENGTH]) -> GasSettings {\n let mut reader = Reader::new(serialized);\n GasSettings::new(reader.read_struct(Gas::deserialize), reader.read_struct(Gas::deserialize), reader.read_struct(GasFees::deserialize), reader.read())\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasSettings::empty();\n let serialized = item.serialize();\n let deserialized = GasSettings::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"210":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr","source":"use crate::{\n abis::{function_data::FunctionData, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress,\n constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PRIVATE_CALL_STACK_ITEM_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader\n};\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n function_data: FunctionData,\n public_inputs: PrivateCircuitPublicInputs,\n}\n\nimpl Eq for PrivateCallStackItem {\n fn eq(self, other: Self) -> bool {\n self.contract_address.eq(other.contract_address) &\n self.function_data.eq(other.function_data) &\n self.public_inputs.eq(other.public_inputs)\n }\n}\n\nimpl Serialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn serialize(self) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_STACK_ITEM_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.function_data.serialize());\n fields.extend_from_array(self.public_inputs.serialize());\n\n assert_eq(fields.len(), PRIVATE_CALL_STACK_ITEM_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn deserialize(serialized: [Field; PRIVATE_CALL_STACK_ITEM_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let item = Self {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n public_inputs: reader.read_struct(PrivateCircuitPublicInputs::deserialize),\n };\n\n reader.finish();\n item\n }\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PrivateCallStackItem {\n fn empty() -> Self {\n PrivateCallStackItem {\n contract_address: AztecAddress::empty(),\n function_data: FunctionData::empty(),\n public_inputs: PrivateCircuitPublicInputs::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = PrivateCallStackItem::empty();\n let serialized = item.serialize();\n let deserialized = PrivateCallStackItem::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let mut item = PrivateCallStackItem::empty();\n item.function_data.is_private = true;\n let hash = item.hash();\n\n // Value from private_call_stack_item.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x065f2831db9ac0db5e710bd3a865b5facd8cf83f1585e1af8fd1d6ce9c47f685;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"211":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/caller_context.nr","source":"use crate::address::AztecAddress;\nuse crate::traits::{Empty, Serialize, Deserialize};\nuse crate::constants::CALLER_CONTEXT_LENGTH;\nuse crate::utils::reader::Reader;\n\nstruct CallerContext {\n msg_sender: AztecAddress,\n storage_contract_address: AztecAddress,\n is_static_call: bool,\n}\n\nimpl Eq for CallerContext {\n fn eq(self, other: CallerContext) -> bool {\n other.msg_sender.eq(self.msg_sender)\n & other.storage_contract_address.eq(self.storage_contract_address)\n & other.is_static_call == self.is_static_call\n }\n}\n\nimpl Empty for CallerContext {\n fn empty() -> Self {\n CallerContext {\n msg_sender: AztecAddress::zero(),\n storage_contract_address: AztecAddress::zero(),\n is_static_call: false,\n }\n }\n}\n\nimpl CallerContext {\n pub fn is_empty(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero() & !self.is_static_call\n }\n\n // Different to an empty context, a hidden context won't reveal the caller's msg_sender and storage_contract_address,\n // but will still propagate the is_static_call flag.\n pub fn is_hidden(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero()\n }\n}\n\nimpl Serialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn serialize(self) -> [Field; CALLER_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, CALLER_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.msg_sender.serialize());\n fields.extend_from_array(self.storage_contract_address.serialize());\n fields.push(self.is_static_call as Field);\n\n assert_eq(fields.len(), CALLER_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn deserialize(fields: [Field; CALLER_CONTEXT_LENGTH]) -> CallerContext {\n let mut reader = Reader::new(fields);\n\n let item = CallerContext {\n msg_sender: reader.read_struct(AztecAddress::deserialize),\n storage_contract_address: reader.read_struct(AztecAddress::deserialize),\n is_static_call: reader.read_bool(),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = CallerContext::empty();\n let serialized = item.serialize();\n let deserialized = CallerContext::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"213":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr","source":"use crate::{\n abis::side_effect::{Ordered, OrderedValue, Scoped}, address::AztecAddress,\n constants::{\n LOG_HASH_LENGTH, NOTE_LOG_HASH_LENGTH, ENCRYPTED_LOG_HASH_LENGTH, SCOPED_LOG_HASH_LENGTH,\n SCOPED_ENCRYPTED_LOG_HASH_LENGTH\n},\n traits::{Empty, Serialize, Deserialize}, utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct LogHash {\n value: Field,\n counter: u32,\n length: Field,\n}\n\nimpl Ordered for LogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for LogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for LogHash {\n fn eq(self, other: LogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n }\n}\n\nimpl Empty for LogHash {\n fn empty() -> Self {\n LogHash {\n value: 0,\n counter: 0,\n length: 0,\n }\n }\n}\n\nimpl Serialize<LOG_HASH_LENGTH> for LogHash {\n fn serialize(self) -> [Field; LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length]\n }\n}\n\nimpl Deserialize<LOG_HASH_LENGTH> for LogHash {\n fn deserialize(values: [Field; LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n }\n }\n}\n\nimpl LogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedLogHash {\n ScopedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedLogHash {\n log_hash: LogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<LogHash> for ScopedLogHash {\n fn inner(self) -> LogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedLogHash {\n fn eq(self, other: ScopedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedLogHash {\n fn empty() -> Self {\n ScopedLogHash {\n log_hash: LogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn serialize(self) -> [Field; SCOPED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn deserialize(values: [Field; SCOPED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(LogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedLogHash {\n pub fn expose_to_public(self) -> Self {\n // Hide the counter when exposing to public.\n Self {\n log_hash: LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length },\n contract_address: self.contract_address\n }\n }\n}\n\nstruct EncryptedLogHash {\n value: Field,\n counter: u32,\n length: Field,\n randomness: Field,\n}\n\nimpl Ordered for EncryptedLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for EncryptedLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for EncryptedLogHash {\n fn eq(self, other: EncryptedLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.randomness == other.randomness) \n }\n}\n\nimpl Empty for EncryptedLogHash {\n fn empty() -> Self {\n EncryptedLogHash {\n value: 0,\n counter: 0,\n length: 0,\n randomness: 0,\n }\n }\n}\n\nimpl Serialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn serialize(self) -> [Field; ENCRYPTED_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.randomness]\n }\n}\n\nimpl Deserialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn deserialize(values: [Field; ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n randomness: values[3],\n }\n }\n}\n\nimpl EncryptedLogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedEncryptedLogHash {\n ScopedEncryptedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<EncryptedLogHash> for ScopedEncryptedLogHash {\n fn inner(self) -> EncryptedLogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl ScopedEncryptedLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the secret randomness and counter when exposing to public\n // Expose as a LogHash rather than EncryptedLogHash to avoid bringing an unnec. 0 value around\n // The log hash will already be silo'd when we call this\n LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length }\n }\n}\n\nimpl Ordered for ScopedEncryptedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedEncryptedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedEncryptedLogHash {\n fn eq(self, other: ScopedEncryptedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedEncryptedLogHash {\n fn empty() -> Self {\n ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn serialize(self) -> [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn deserialize(values: [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(EncryptedLogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nstruct NoteLogHash {\n value: Field,\n counter: u32,\n length: Field,\n note_hash_counter: u32,\n}\n\nimpl NoteLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the actual counter and note hash counter when exposing it to the public kernel.\n // The counter is usually note_hash.counter + 1, so it can be revealing.\n // Expose as a LogHash rather than NoteLogHash to avoid bringing an unnec. 0 value around\n LogHash { value: self.value, counter: 0, length: self.length }\n }\n}\n\nimpl Ordered for NoteLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for NoteLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteLogHash {\n fn eq(self, other: NoteLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.note_hash_counter == other.note_hash_counter) \n }\n}\n\nimpl Empty for NoteLogHash {\n fn empty() -> Self {\n NoteLogHash {\n value: 0,\n counter: 0,\n length: 0,\n note_hash_counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn serialize(self) -> [Field; NOTE_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.note_hash_counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn deserialize(values: [Field; NOTE_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n note_hash_counter: values[3] as u32,\n }\n }\n}\n"},"217":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/append_only_tree_snapshot.nr","source":"struct AppendOnlyTreeSnapshot {\n root : Field,\n // TODO(Alvaro) change this to a u64\n next_available_leaf_index : u32\n}\n\nglobal APPEND_ONLY_TREE_SNAPSHOT_LENGTH: u32 = 2;\n\nimpl AppendOnlyTreeSnapshot {\n pub fn serialize(self) -> [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH] {\n [self.root, self.next_available_leaf_index as Field]\n }\n\n pub fn deserialize(serialized: [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH]) -> AppendOnlyTreeSnapshot {\n AppendOnlyTreeSnapshot { root: serialized[0], next_available_leaf_index: serialized[1] as u32 }\n }\n\n pub fn zero() -> Self {\n Self { root: 0, next_available_leaf_index: 0 }\n }\n}\n\nimpl Eq for AppendOnlyTreeSnapshot {\n fn eq(self, other : AppendOnlyTreeSnapshot) -> bool {\n (self.root == other.root) & (self.next_available_leaf_index == other.next_available_leaf_index)\n }\n}\n"},"218":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::AztecAddress,\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader\n};\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, other: CallContext) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl Serialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n let mut serialized: BoundedVec<Field, CALL_CONTEXT_LENGTH> = BoundedVec::new();\n\n serialized.push(self.msg_sender.to_field());\n serialized.push(self.storage_contract_address.to_field());\n serialized.push(self.function_selector.to_field());\n serialized.push(self.is_delegate_call as Field);\n serialized.push(self.is_static_call as Field);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn deserialize(serialized: [Field; CALL_CONTEXT_LENGTH]) -> CallContext {\n let mut reader = Reader::new(serialized);\n CallContext {\n msg_sender: AztecAddress::from_field(reader.read()),\n storage_contract_address: AztecAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()),\n is_delegate_call: reader.read() as bool,\n is_static_call: reader.read() as bool,\n }\n }\n}\n\nimpl Empty for CallContext {\n fn empty() -> Self {\n CallContext {\n msg_sender: AztecAddress::empty(),\n storage_contract_address: AztecAddress::empty(),\n function_selector: FunctionSelector::empty(),\n is_delegate_call: false,\n is_static_call: false,\n }\n }\n}\n\n#[test]\nfn serialize_deserialize_of_empty() {\n let context = CallContext::empty();\n let serialized = context.serialize();\n let deserialized = CallContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = true;\n\n let address: AztecAddress = AztecAddress::from_field(69420);\n context1.msg_sender = address;\n context2.msg_sender = address;\n\n assert(context1.eq(context2));\n}\n\n#[test(should_fail)]\nfn not_eq_test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = false;\n\n let address1: AztecAddress = AztecAddress::from_field(69420);\n let address2: AztecAddress = AztecAddress::from_field(42069);\n\n context1.msg_sender = address1;\n context2.msg_sender = address2;\n\n assert(context1.eq(context2));\n}\n\n#[test]\nfn hash_smoke() {\n let context = CallContext::empty();\n let _hashed = context.hash();\n}\n"},"219":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/max_block_number.nr","source":"use crate::{constants::MAX_BLOCK_NUMBER_LENGTH, traits::{Deserialize, Serialize, Empty}};\n\nstruct MaxBlockNumber {\n _opt: Option<u32>\n}\n\nimpl Empty for MaxBlockNumber {\n fn empty() -> Self {\n Self { _opt: Option::none() }\n }\n}\n\nimpl Eq for MaxBlockNumber {\n fn eq(self, other: Self) -> bool {\n self._opt == other._opt\n }\n}\n\nimpl Serialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn serialize(self) -> [Field; MAX_BLOCK_NUMBER_LENGTH] {\n [self._opt._is_some as Field, self._opt._value as Field]\n }\n}\n\nimpl Deserialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn deserialize(serialized: [Field; MAX_BLOCK_NUMBER_LENGTH]) -> MaxBlockNumber {\n MaxBlockNumber {\n _opt: Option {\n _is_some: serialized[0] as bool,\n _value: serialized[1] as u32,\n }\n }\n }\n}\n\nimpl MaxBlockNumber {\n pub fn new(max_block_number: u32) -> Self {\n Self { _opt: Option::some(max_block_number) }\n }\n\n pub fn is_none(self) -> bool {\n self._opt.is_none()\n }\n\n pub fn is_some(self) -> bool {\n self._opt.is_some()\n }\n\n pub fn unwrap(self) -> u32 {\n self._opt.unwrap()\n }\n\n pub fn unwrap_unchecked(self) -> u32 {\n self._opt.unwrap_unchecked()\n }\n\n pub fn min(lhs: MaxBlockNumber, rhs: MaxBlockNumber) -> MaxBlockNumber {\n if rhs.is_none() {\n lhs // lhs might also be none, but in that case both would be\n } else {\n MaxBlockNumber::min_with_u32(lhs, rhs.unwrap_unchecked())\n }\n }\n\n pub fn min_with_u32(lhs: MaxBlockNumber, rhs: u32) -> MaxBlockNumber {\n if lhs._opt.is_none() {\n MaxBlockNumber::new(rhs)\n } else {\n let lhs_value = lhs._opt.unwrap_unchecked();\n\n MaxBlockNumber::new(if lhs_value < rhs { lhs_value } else { rhs })\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = MaxBlockNumber::empty();\n let serialized = item.serialize();\n let deserialized = MaxBlockNumber::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn zeroed_is_none() {\n // Large parts of the kernel rely on zeroed to initialize structs. This conveniently matches what `default` does,\n // and though we should eventually move everything to use `default`, it's good to check for now that both are\n // equivalent.\n let a = MaxBlockNumber::empty();\n assert(a.is_none());\n}\n\n#[test]\nfn serde_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert(b.is_none());\n}\n\n#[test]\nfn serde_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert_eq(b.unwrap(), 13);\n}\n\n#[test(should_fail)]\nfn default_unwrap_panics() {\n let a = MaxBlockNumber::empty();\n let _ = a.unwrap();\n}\n\n#[test]\nfn min_default_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::empty();\n\n assert(MaxBlockNumber::min(a, b).is_none());\n}\n\n#[test]\nfn min_default_some() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::new(13);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_some_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::new(42);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_with_u32_default() {\n let a = MaxBlockNumber::empty();\n let b = 42;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 42);\n}\n\n#[test]\nfn min_with_u32_some() {\n let a = MaxBlockNumber::new(13);\n let b = 42;\n let c = 8;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min_with_u32(a, c).unwrap(), 8);\n}\n"},"22":{"path":"std/field/bn254.nr","source":"use crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\nglobal TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n let x_bytes = x.to_le_bytes(32);\n\n let mut low: Field = 0;\n let mut high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n low += (x_bytes[i] as Field) * offset;\n high += (x_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n\n (low, high)\n}\n\nunconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nfn compute_lt(x: Field, y: Field, num_bytes: u32) -> bool {\n let x_bytes = x.to_le_radix(256, num_bytes);\n let y_bytes = y.to_le_radix(256, num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i];\n let y_byte = y_bytes[num_bytes - 1 - i];\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\nfn compute_lte(x: Field, y: Field, num_bytes: u32) -> bool {\n if x == y {\n true\n } else {\n compute_lt(x, y, num_bytes)\n }\n}\n\nunconstrained fn lt_32_hint(x: Field, y: Field) -> bool {\n compute_lt(x, y, 32)\n}\n\nunconstrained fn lte_16_hint(x: Field, y: Field) -> bool {\n compute_lte(x, y, 16)\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n let borrow = lte_16_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size(128);\n rhi.assert_max_bit_size(128);\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size(128);\n xhi.assert_max_bit_size(128);\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(compute_lt(b, a, 32));\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n compute_lt(b, a, 32)\n } else if a == b {\n false\n } else {\n // Take a hint of the comparison and verify it\n if lt_32_hint(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{decompose_hint, decompose, compute_lt, assert_gt, gt, lt, TWO_POW_128, compute_lte, PLO, PHI};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n fn check_compute_lt() {\n assert(compute_lt(0, 1, 16));\n assert(compute_lt(0, 0x100, 16));\n assert(compute_lt(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lt(0, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_compute_lte() {\n assert(compute_lte(0, 1, 16));\n assert(compute_lte(0, 0x100, 16));\n assert(compute_lte(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lte(0, TWO_POW_128, 16));\n\n assert(compute_lte(0, 0, 16));\n assert(compute_lte(0x100, 0x100, 16));\n assert(compute_lte(TWO_POW_128 - 1, TWO_POW_128 - 1, 16));\n assert(compute_lte(TWO_POW_128, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"},"222":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr","source":"use crate::{\n abis::function_selector::FunctionSelector,\n constants::{GENERATOR_INDEX__FUNCTION_DATA, FUNCTION_DATA_LENGTH}, hash::pedersen_hash,\n traits::{Serialize, Hash, Deserialize, Empty}\n};\n\nstruct FunctionData {\n selector : FunctionSelector,\n is_private : bool,\n}\n\nimpl Eq for FunctionData {\n fn eq(self, other: Self) -> bool {\n self.selector.eq(other.selector) &\n (self.is_private == other.is_private)\n }\n}\n\nimpl Serialize<FUNCTION_DATA_LENGTH> for FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn serialize(self) -> [Field; FUNCTION_DATA_LENGTH] {\n [\n self.selector.to_field(),\n self.is_private as Field,\n ]\n }\n}\n\nimpl Deserialize<FUNCTION_DATA_LENGTH> for FunctionData {\n fn deserialize(serialized: [Field; FUNCTION_DATA_LENGTH]) -> Self {\n Self {\n selector: FunctionSelector::from_field(serialized[0]),\n is_private: serialized[1] as bool,\n }\n }\n}\n\nimpl Hash for FunctionData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n\nimpl Empty for FunctionData {\n fn empty() -> Self {\n FunctionData {\n selector: FunctionSelector::empty(),\n is_private: false\n }\n }\n\n}\n\n#[test]\nfn serialization_of_empty() {\n let data = FunctionData::empty();\n let serialized = data.serialize();\n let deserialized = FunctionData::deserialize(serialized);\n assert(data.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let data = FunctionData::empty();\n let hash = data.hash();\n\n // Value from function_data.test.ts \"computes empty function data hash\" test\n let test_data_empty_hash = 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"229":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/messaging/l2_to_l1_message.nr","source":"use crate::{\n address::{AztecAddress, EthAddress},\n constants::{L2_TO_L1_MESSAGE_LENGTH, SCOPED_L2_TO_L1_MESSAGE_LENGTH},\n abis::side_effect::{Ordered, Scoped}, traits::{Deserialize, Empty, Serialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\n// Note: Not to be confused with L2ToL1Msg in Solidity\nstruct L2ToL1Message {\n recipient: EthAddress,\n content: Field,\n counter: u32,\n}\n\nimpl Ordered for L2ToL1Message {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Empty for L2ToL1Message {\n fn empty() -> Self {\n Self {\n recipient: EthAddress::empty(),\n content: 0,\n counter: 0,\n }\n }\n}\n\nimpl Eq for L2ToL1Message {\n fn eq(self, other: Self) -> bool {\n (self.recipient == other.recipient) & (self.content == other.content) & (self.counter == other.counter)\n }\n}\n\nimpl Serialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn serialize(self) -> [Field; L2_TO_L1_MESSAGE_LENGTH] {\n [self.recipient.to_field(), self.content, self.counter as Field]\n }\n}\n\nimpl Deserialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn deserialize(values: [Field; L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n Self {\n recipient: EthAddress::from_field(values[0]),\n content: values[1],\n counter: values[2] as u32,\n }\n }\n}\n\nimpl L2ToL1Message {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedL2ToL1Message {\n ScopedL2ToL1Message { message: self, contract_address }\n }\n}\n\nstruct ScopedL2ToL1Message {\n message: L2ToL1Message,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<L2ToL1Message> for ScopedL2ToL1Message {\n fn inner(self) -> L2ToL1Message {\n self.message\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedL2ToL1Message {\n fn counter(self) -> u32 {\n self.message.counter\n }\n}\n\nimpl Eq for ScopedL2ToL1Message {\n fn eq(self, other: ScopedL2ToL1Message) -> bool {\n (self.message == other.message)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedL2ToL1Message {\n fn empty() -> Self {\n ScopedL2ToL1Message {\n message: L2ToL1Message::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn serialize(self) -> [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH] {\n array_concat(self.message.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn deserialize(values: [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n message: reader.read_struct(L2ToL1Message::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\n#[test]\nfn serialization_of_empty_l2() {\n let item = L2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = L2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped_l2() {\n let item = ScopedL2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = ScopedL2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"23":{"path":"std/field/mod.nr","source":"mod bn254;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n\n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(self, _bit_size: u32) -> [u1] {}\n\n #[builtin(to_be_bits)]\n fn __to_be_bits(self, bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n let num_bytes = (modulus_num_bits() as u32 + 7) / 8;\n let x_bytes = x.to_le_bytes(num_bytes);\n let y_bytes = y.to_le_bytes(num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i] as u8;\n let y_byte = y_bytes[num_bytes - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\n"},"231":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr","source":"use crate::{hash::pedersen_hash, traits::ToField};\n\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field where K: ToField {\n pedersen_hash([storage_slot, key.to_field()], 0)\n}\n"},"236":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr","source":"use crate::traits::{Serialize, Deserialize};\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\nglobal U8_SERIALIZED_LEN: Field = 1;\nglobal U32_SERIALIZED_LEN: Field = 1;\nglobal U64_SERIALIZED_LEN: Field = 1;\nglobal U128_SERIALIZED_LEN: Field = 1;\nglobal FIELD_SERIALIZED_LEN: Field = 1;\n\nimpl Serialize<BOOL_SERIALIZED_LEN> for bool {\n fn serialize(self) -> [Field; BOOL_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<BOOL_SERIALIZED_LEN> for bool {\n fn deserialize(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n }\n}\n\nimpl Serialize<U8_SERIALIZED_LEN> for u8 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U8_SERIALIZED_LEN> for u8 {\n fn deserialize(fields: [Field; U8_SERIALIZED_LEN]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Serialize<U32_SERIALIZED_LEN> for u32 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U32_SERIALIZED_LEN> for u32 {\n fn deserialize(fields: [Field; U32_SERIALIZED_LEN]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Serialize<U64_SERIALIZED_LEN> for u64 {\n fn serialize(self) -> [Field; U64_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U64_SERIALIZED_LEN> for u64 {\n fn deserialize(fields: [Field; U64_SERIALIZED_LEN]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Serialize<U128_SERIALIZED_LEN> for U128 {\n fn serialize(self) -> [Field; 1] {\n [self.to_integer()]\n }\n\n}\n\nimpl Deserialize<U128_SERIALIZED_LEN> for U128 {\n fn deserialize(fields: [Field; U128_SERIALIZED_LEN]) -> Self {\n U128::from_integer(fields[0])\n }\n}\n\nimpl Serialize<FIELD_SERIALIZED_LEN> for Field {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self]\n }\n}\n\nimpl Deserialize<FIELD_SERIALIZED_LEN> for Field {\n fn deserialize(fields: [Field; FIELD_SERIALIZED_LEN]) -> Self {\n fields[0]\n }\n}\n"},"237":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr","source":"use crate::utils::field::field_from_bytes;\n\n// Trait: is_empty\n//\n// The general is_empty trait checks if a data type is is empty,\n// and it defines empty for the basic data types as 0.\n//\n// If a Field is equal to zero, then it is regarded as zero.\n// We will go with this definition for now, however it can be problematic \n// if a value can actually be zero. In a future refactor, we can \n// use the optional type for safety. Doing it now would lead to a worse devex\n// and would make it harder to sync up with the cpp code.\n// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty.\ntrait Empty {\n fn empty() -> Self;\n}\n\nimpl Empty for Field { fn empty() -> Self {0} }\n\nimpl Empty for u1 { fn empty() -> Self {0} }\nimpl Empty for u8 { fn empty() -> Self {0} }\nimpl Empty for u32 { fn empty() -> Self {0} }\nimpl Empty for u64 { fn empty() -> Self {0} }\nimpl Empty for U128 { fn empty() -> Self {U128::from_integer(0)} }\n\npub fn is_empty<T>(item: T) -> bool where T: Empty + Eq {\n item.eq(T::empty())\n}\n\npub fn is_empty_array<T, N>(array: [T; N]) -> bool where T: Empty + Eq {\n array.all(|elem| is_empty(elem))\n}\n\ntrait Hash {\n fn hash(self) -> Field;\n}\n\ntrait ToField {\n fn to_field(self) -> Field;\n}\n\nimpl ToField for Field {\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u1 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u8 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u32 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u64 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for U128 {\n fn to_field(self) -> Field {\n self.to_integer()\n }\n}\nimpl<N> ToField for str<N> {\n fn to_field(self) -> Field {\n assert(N < 32, \"String doesn't fit in a field, consider using Serialize instead\");\n field_from_bytes(self.as_bytes(), true)\n }\n}\n\ntrait FromField {\n fn from_field(value: Field) -> Self;\n}\n\nimpl FromField for Field {\n fn from_field(value: Field) -> Self {\n value\n }\n}\n\nimpl FromField for bool { fn from_field(value: Field) -> Self { value as bool } }\nimpl FromField for u1 { fn from_field(value: Field) -> Self { value as u1 } }\nimpl FromField for u8 { fn from_field(value: Field) -> Self { value as u8 } }\nimpl FromField for u32 { fn from_field(value: Field) -> Self { value as u32 } }\nimpl FromField for u64 { fn from_field(value: Field) -> Self { value as u64 } }\nimpl FromField for U128 {\n fn from_field(value: Field) -> Self {\n U128::from_integer(value)\n }\n}\n\n// docs:start:serialize\ntrait Serialize<N> {\n fn serialize(self) -> [Field; N];\n}\n// docs:end:serialize\n\nimpl<N> Serialize<N> for [Field; N] {\n fn serialize(self) -> [Field; N] {\n self\n }\n}\nimpl<N> Serialize<N> for str<N> {\n fn serialize(self) -> [Field; N] {\n let mut result = [0; N];\n let bytes: [u8; N] = self.as_bytes();\n for i in 0..N {\n result[i] = field_from_bytes([bytes[i];1], true);\n }\n result\n }\n}\n\n// docs:start:deserialize\ntrait Deserialize<N> {\n fn deserialize(fields: [Field; N]) -> Self;\n}\n// docs:end:deserialize\n\nimpl<N> Deserialize<N> for [Field; N] {\n fn deserialize(fields: [Field; N]) -> Self {\n fields\n }\n}\n"},"238":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr","source":"// Utility function to console.log data in the acir simulator\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<M, N>(_msg: str<M>, args: [Field]) {}\n\n/// NOTE: call this with a str<N> msg of form\n/// \"some string with {0} and {1} ... {N}\"\n/// and an array of N field which will be formatted\n/// into the string in the simulator.\n/// Example:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\nunconstrained pub fn debug_log_format<M, N>(msg: str<M>, args: [Field; N]) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n/// NOTE: call this with a str<N> msg of length > 1\n/// Example:\n/// `debug_log(\"blah blah this is a debug string\");`\nunconstrained pub fn debug_log<N>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n"},"239":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr","source":"use crate::{\n constants::CONTENT_COMMITMENT_LENGTH, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct ContentCommitment {\n num_txs: Field,\n txs_effects_hash: Field,\n in_hash: Field,\n out_hash: Field,\n}\n\nimpl Serialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn serialize(self) -> [Field; CONTENT_COMMITMENT_LENGTH] {\n let mut fields: BoundedVec<Field, CONTENT_COMMITMENT_LENGTH> = BoundedVec::new();\n\n fields.push(self.num_txs);\n fields.push(self.txs_effects_hash);\n fields.push(self.in_hash);\n fields.push(self.out_hash);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn deserialize(serialized: [Field; CONTENT_COMMITMENT_LENGTH]) -> Self {\n let num_txs = serialized[0];\n\n let txs_effects_hash = serialized[1];\n\n let in_hash = serialized[2];\n\n let out_hash = serialized[3];\n\n Self {\n num_txs,\n txs_effects_hash,\n in_hash,\n out_hash,\n }\n }\n}\n\nimpl Empty for ContentCommitment {\n fn empty() -> Self {\n Self {\n num_txs: 0,\n txs_effects_hash: 0,\n in_hash: 0,\n out_hash: 0,\n }\n }\n}\n\nimpl Eq for ContentCommitment {\n fn eq(self, other: Self) -> bool {\n (self.num_txs == other.num_txs)\n & (self.txs_effects_hash == other.txs_effects_hash)\n & (self.in_hash == other.in_hash)\n & (self.out_hash == other.out_hash)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let empty = ContentCommitment::empty();\n let serialized = empty.serialize();\n let deserialized = ContentCommitment::deserialize(serialized);\n\n assert(empty.eq(deserialized));\n}\n"},"240":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/public_data_tree_leaf_preimage.nr","source":"use crate::{merkle_tree::leaf_preimage::IndexedTreeLeafPreimage, traits::{Empty, Hash}};\n\nstruct PublicDataTreeLeafPreimage {\n slot : Field,\n value: Field,\n next_slot :Field,\n next_index : u32,\n}\n\nimpl Empty for PublicDataTreeLeafPreimage {\n fn empty() -> Self {\n Self {\n slot: 0,\n value: 0,\n next_slot: 0,\n next_index: 0,\n }\n }\n}\n\nimpl Hash for PublicDataTreeLeafPreimage {\n fn hash(self) -> Field {\n if self.is_empty() {\n 0\n } else {\n std::hash::pedersen_hash([self.slot, self.value, (self.next_index as Field), self.next_slot])\n }\n }\n}\n\nimpl IndexedTreeLeafPreimage for PublicDataTreeLeafPreimage {\n fn get_key(self) -> Field {\n self.slot\n }\n\n fn get_next_key(self) -> Field {\n self.next_slot\n }\n\n fn as_leaf(self) -> Field {\n self.hash()\n }\n}\n\nimpl PublicDataTreeLeafPreimage {\n pub fn is_empty(self) -> bool {\n (self.slot == 0) & (self.value == 0) & (self.next_slot == 0) & (self.next_index == 0)\n }\n}\n"},"241":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/header.nr","source":"use crate::{\n abis::{\n append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n global_variables::{GlobalVariables, GLOBAL_VARIABLES_LENGTH}\n},\n constants::{GENERATOR_INDEX__BLOCK_HASH, HEADER_LENGTH, STATE_REFERENCE_LENGTH, CONTENT_COMMITMENT_LENGTH},\n hash::pedersen_hash, state_reference::StateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice, content_commitment::ContentCommitment\n};\n\n// docs:start:header\nstruct Header {\n last_archive: AppendOnlyTreeSnapshot,\n content_commitment: ContentCommitment,\n state: StateReference,\n global_variables: GlobalVariables,\n total_fees: Field\n}\n// docs:end:header\n\nimpl Eq for Header {\n fn eq(self, other: Self) -> bool {\n self.last_archive.eq(other.last_archive) &\n self.content_commitment.eq(other.content_commitment) &\n self.state.eq(other.state) &\n self.global_variables.eq(other.global_variables) &\n self.total_fees.eq(other.total_fees)\n }\n}\n\nimpl Serialize<HEADER_LENGTH> for Header {\n fn serialize(self) -> [Field; HEADER_LENGTH] {\n let mut fields: BoundedVec<Field, HEADER_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.last_archive.serialize());\n fields.extend_from_array(self.content_commitment.serialize());\n fields.extend_from_array(self.state.serialize());\n fields.extend_from_array(self.global_variables.serialize());\n fields.push(self.total_fees);\n\n fields.storage\n }\n}\n\nimpl Deserialize<HEADER_LENGTH> for Header {\n fn deserialize(serialized: [Field; HEADER_LENGTH]) -> Self {\n let mut offset = 0;\n\n let last_archive_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let content_commitment_fields = arr_copy_slice(serialized, [0; CONTENT_COMMITMENT_LENGTH], offset);\n offset = offset + CONTENT_COMMITMENT_LENGTH;\n\n let state_fields = arr_copy_slice(serialized, [0; STATE_REFERENCE_LENGTH], offset);\n offset = offset + STATE_REFERENCE_LENGTH;\n\n let global_variables_fields = arr_copy_slice(serialized, [0; GLOBAL_VARIABLES_LENGTH], offset);\n offset = offset + GLOBAL_VARIABLES_LENGTH;\n\n let total_fees = serialized[offset];\n\n Header {\n last_archive: AppendOnlyTreeSnapshot::deserialize(last_archive_fields),\n content_commitment: ContentCommitment::deserialize(content_commitment_fields),\n state: StateReference::deserialize(state_fields),\n global_variables: GlobalVariables::deserialize(global_variables_fields),\n total_fees\n }\n }\n}\n\nimpl Empty for Header {\n fn empty() -> Self {\n Self {\n last_archive: AppendOnlyTreeSnapshot::zero(),\n content_commitment: ContentCommitment::empty(),\n state: StateReference::empty(),\n global_variables: GlobalVariables::empty(),\n total_fees: 0\n }\n }\n}\n\nimpl Hash for Header {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__BLOCK_HASH)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let header = Header::empty();\n let serialized = header.serialize();\n let deserialized = Header::deserialize(serialized);\n assert(header.eq(deserialized));\n}\n\n#[test]\nfn hash_smoke() {\n let header = Header::empty();\n let _hashed = header.hash();\n}\n\n#[test]\nfn empty_hash_is_zero() {\n let header = Header::empty();\n let hash = header.hash();\n\n // Value from new_contract_data.test.ts \"computes empty hash\" test\n let test_data_empty_hash = 0x124e8c40a6eca2e3ad10c04050b01a3fad00df3cea47b13592c7571b6914c7a7;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"242":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, log_hash::{LogHash, ScopedLogHash, ScopedEncryptedLogHash},\n note_hash::ScopedNoteHash, nullifier::ScopedNullifier\n},\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX\n},\n merkle_tree::root::root_from_sibling_path, messaging::l2_to_l1_message::ScopedL2ToL1Message,\n recursion::verification_key::VerificationKey, traits::is_empty,\n utils::field::field_from_bytes_32_trunc\n};\nuse std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path)\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n pedersen_hash(\n [\n tx_hash,\n note_index_in_tx as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, inner_note_hash: Field) -> Field {\n let inputs = [nonce, inner_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn compute_siloed_encrypted_log_hash(address: AztecAddress, randomness: Field, log_hash: Field) -> Field {\n // TODO: Using 0 GENERATOR_INDEX here as interim before we move to posiedon\n // NB: A unique separator will be needed for masked_contract_address\n let mut masked_contract_address = pedersen_hash([address.to_field(), randomness], 0);\n if randomness == 0 {\n // In some cases, we actually want to reveal the contract address we are siloing with:\n // e.g. 'handshaking' contract w/ known address\n // An app providing randomness = 0 signals to not mask the address.\n masked_contract_address = address.to_field();\n }\n accumulate_sha256([masked_contract_address, log_hash])\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedEncryptedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_encrypted_log_hash(\n log_hash.contract_address,\n log_hash.log_hash.randomness,\n log_hash.log_hash.value\n )\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(msg: ScopedL2ToL1Message, rollup_version_id: Field, chain_id: Field) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes = input[offset].to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly.\npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<N>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,\n 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,\n 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), EthAddress::from_field(3), 5, 2, 4);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n"},"243":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot, constants::PARTIAL_STATE_REFERENCE_LENGTH,\n traits::{Deserialize, Empty, Serialize}\n};\n\nstruct PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot,\n nullifier_tree: AppendOnlyTreeSnapshot,\n public_data_tree: AppendOnlyTreeSnapshot,\n}\n\nimpl Eq for PartialStateReference {\n fn eq(self, other: PartialStateReference) -> bool {\n self.note_hash_tree.eq(other.note_hash_tree) &\n self.nullifier_tree.eq(other.nullifier_tree) &\n self.public_data_tree.eq(other.public_data_tree)\n }\n}\n\nimpl Serialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn serialize(self) -> [Field; PARTIAL_STATE_REFERENCE_LENGTH] {\n let serialized_note_hash_tree = self.note_hash_tree.serialize();\n let serialized_nullifier_tree = self.nullifier_tree.serialize();\n let serialized_public_data_tree = self.public_data_tree.serialize();\n\n [\n serialized_note_hash_tree[0], \n serialized_note_hash_tree[1],\n serialized_nullifier_tree[0],\n serialized_nullifier_tree[1],\n serialized_public_data_tree[0],\n serialized_public_data_tree[1],\n ]\n }\n}\n\nimpl Deserialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn deserialize(serialized: [Field; PARTIAL_STATE_REFERENCE_LENGTH]) -> PartialStateReference {\n PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[0], serialized[1]]\n ),\n nullifier_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[2], serialized[3]]\n ),\n public_data_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[4], serialized[5]]\n ),\n }\n }\n}\n\nimpl Empty for PartialStateReference {\n fn empty() -> Self {\n Self {\n note_hash_tree: AppendOnlyTreeSnapshot::zero(),\n nullifier_tree: AppendOnlyTreeSnapshot::zero(),\n public_data_tree: AppendOnlyTreeSnapshot::zero(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let partial = PartialStateReference::empty();\n let _serialized = partial.serialize();\n let _deserialized = PartialStateReference::deserialize(_serialized);\n}\n"},"245":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr","source":"use crate::{\n constants::{GENERATOR_INDEX__TX_CONTEXT, TX_CONTEXT_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n abis::gas_settings::GasSettings\n};\n\n// docs:start:tx-context\nstruct TxContext {\n chain_id : Field,\n version : Field,\n gas_settings: GasSettings,\n}\n// docs:end:tx-context\n\nimpl TxContext {\n pub fn new(chain_id: Field, version: Field, gas_settings: GasSettings) -> Self {\n TxContext { chain_id, version, gas_settings }\n }\n}\n\nimpl Eq for TxContext {\n fn eq(self, other: Self) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.gas_settings.eq(other.gas_settings))\n }\n}\n\nimpl Empty for TxContext {\n fn empty() -> Self {\n TxContext {\n chain_id: 0,\n version: 0,\n gas_settings: GasSettings::empty(),\n }\n }\n}\n\nimpl Serialize<TX_CONTEXT_LENGTH> for TxContext {\n fn serialize(self) -> [Field; TX_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, TX_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.push(self.chain_id);\n fields.push(self.version);\n fields.extend_from_array(self.gas_settings.serialize());\n\n assert_eq(fields.len(), TX_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<TX_CONTEXT_LENGTH> for TxContext {\n fn deserialize(serialized: [Field; TX_CONTEXT_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let context = Self {\n chain_id: reader.read(),\n version: reader.read(),\n gas_settings: reader.read_struct(GasSettings::deserialize),\n };\n\n reader.finish();\n context\n }\n}\n\nimpl Hash for TxContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__TX_CONTEXT)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let context = TxContext::empty();\n let serialized = context.serialize();\n let deserialized = TxContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let context = TxContext::empty();\n let hash = context.hash();\n\n // Value from tx_context.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x17e4357684c5a4349b4587c95b0b6161dcb4a3c5b02d4eb2ecc3b02c80193261;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"249":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_instance.nr","source":"use crate::{\n address::{\n aztec_address::AztecAddress, eth_address::EthAddress, partial_address::PartialAddress,\n public_keys_hash::PublicKeysHash\n},\n contract_class_id::ContractClassId,\n constants::{GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA, CONTRACT_INSTANCE_LENGTH},\n traits::{Deserialize, Hash, Serialize}\n};\n\nstruct ContractInstance {\n salt : Field,\n deployer: AztecAddress,\n contract_class_id : ContractClassId,\n initialization_hash : Field,\n public_keys_hash : PublicKeysHash,\n}\n\nimpl Eq for ContractInstance {\n fn eq(self, other: Self) -> bool {\n self.public_keys_hash.eq(other.public_keys_hash) &\n self.initialization_hash.eq(other.initialization_hash) &\n self.contract_class_id.eq(other.contract_class_id) &\n self.salt.eq(other.salt)\n }\n}\n\nimpl Serialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn serialize(self) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n [\n self.salt,\n self.deployer.to_field(),\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys_hash.to_field()\n ]\n }\n}\n\nimpl Deserialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn deserialize(serialized: [Field; CONTRACT_INSTANCE_LENGTH]) -> Self {\n Self {\n salt: serialized[0],\n deployer: AztecAddress::from_field(serialized[1]),\n contract_class_id: ContractClassId::from_field(serialized[2]),\n initialization_hash: serialized[3],\n public_keys_hash: PublicKeysHash::from_field(serialized[4]),\n }\n }\n}\n\nimpl Hash for ContractInstance {\n fn hash(self) -> Field {\n self.to_address().to_field()\n }\n}\n\nimpl ContractInstance {\n fn to_address(self) -> AztecAddress {\n AztecAddress::compute(\n self.public_keys_hash,\n PartialAddress::compute(\n self.contract_class_id,\n self.salt,\n self.initialization_hash,\n self.deployer\n )\n )\n }\n}\n"},"250":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr","source":"use crate::constants::GENERATOR_INDEX__CONTRACT_LEAF;\nuse crate::traits::{ToField, FromField, Hash, Serialize, Deserialize};\n\nstruct ContractClassId {\n inner: Field\n}\n\nimpl Eq for ContractClassId {\n fn eq(self, other: ContractClassId) -> bool {\n other.inner == self.inner\n }\n}\n\nimpl ToField for ContractClassId {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for ContractClassId {\n fn from_field(value: Field) -> Self {\n Self { inner: value }\n }\n}\n\nimpl Serialize<1> for ContractClassId {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n}\n\nimpl Deserialize<1> for ContractClassId {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self { inner: fields[0] }\n }\n}\n\nimpl ContractClassId {\n pub fn compute(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field\n ) -> Self {\n let hash = std::hash::pedersen_hash_with_separator(\n [\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ],\n GENERATOR_INDEX__CONTRACT_LEAF\n ); // TODO(@spalladino): Update generator index\n\n ContractClassId::from_field(hash)\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"251":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n constants::{PARTIAL_STATE_REFERENCE_LENGTH, STATE_REFERENCE_LENGTH},\n partial_state_reference::PartialStateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot,\n partial: PartialStateReference,\n}\n\nimpl Eq for StateReference {\n fn eq(self, other: StateReference) -> bool {\n self.l1_to_l2_message_tree.eq(other.l1_to_l2_message_tree) &\n self.partial.eq(other.partial)\n }\n}\n\nimpl Serialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn serialize(self) -> [Field; STATE_REFERENCE_LENGTH] {\n let mut fields: BoundedVec<Field, STATE_REFERENCE_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.l1_to_l2_message_tree.serialize());\n fields.extend_from_array(self.partial.serialize());\n\n fields.storage\n }\n}\n\nimpl Deserialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn deserialize(serialized: [Field; STATE_REFERENCE_LENGTH]) -> StateReference {\n let mut offset = 0;\n\n let l1_to_l2_message_tree_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let partial_fields = arr_copy_slice(serialized, [0; PARTIAL_STATE_REFERENCE_LENGTH], offset);\n\n StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::deserialize(l1_to_l2_message_tree_fields),\n partial: PartialStateReference::deserialize(partial_fields),\n }\n }\n}\n\nimpl Empty for StateReference {\n fn empty() -> Self {\n Self {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::zero(),\n partial: PartialStateReference::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let state = StateReference::empty();\n let _serialized = state.serialize();\n let _deserialized = StateReference::deserialize(_serialized);\n}\n"},"26":{"path":"std/hash/mod.nr","source":"mod poseidon;\nmod mimc;\nmod poseidon2;\nmod keccak;\n\nuse crate::default::Default;\nuse crate::uint128::U128;\nuse crate::sha256::{digest, sha256_var};\nuse crate::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul};\n\n#[foreign(sha256)]\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:sha256\n{}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n#[no_predicates]\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n let value = pedersen_commitment_with_separator(input, 0);\n if (value.x == 0) & (value.y == 0) {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n } else {\n EmbeddedCurvePoint { x: value.x, y: value.y, is_infinite: false }\n }\n}\n\nfn pedersen_commitment_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n points[i] = EmbeddedCurveScalar::from_field(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n#[no_predicates]\npub fn pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let values = __pedersen_commitment_with_separator(input, separator);\n EmbeddedCurvePoint { x: values[0], y: values[1], is_infinite: false }\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[field(bn254)]\nfn derive_generators<let N: u32, let M: u32>(domain_separator_bytes: [u8; M], starting_index: u32) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32\n) -> [EmbeddedCurvePoint; N] {}\n\nfn pedersen_hash_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let v1 = pedersen_commitment_with_separator(input, separator);\n let length_generator : [EmbeddedCurvePoint; 1] = derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n multi_scalar_mul(\n [length_generator[0], v1],\n [EmbeddedCurveScalar { lo: N as Field, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }]\n ).x\n}\n\n#[foreign(pedersen_hash)]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {}\n\n#[foreign(pedersen_commitment)]\nfn __pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> [Field; 2] {}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes(32).as_array();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(keccak256)]\n// docs:start:keccak256\npub fn keccak256<let N: u32>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<let N: u32>(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n#[foreign(sha256_compression)]\npub fn sha256_compression(_input: [u32; 16], _state: [u32; 8]) -> [u32; 8] {}\n\n// Generic hashing support. \n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\ntrait Hash{\n fn hash<H>(self, state: &mut H) where H: Hasher;\n}\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\ntrait Hasher{\n fn finish(self) -> Field;\n \n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\ntrait BuildHasher<H> where H: Hasher{\n fn build_hasher(self) -> H;\n}\n\nstruct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher<H> for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn build_hasher(_self: Self) -> H{\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn default() -> Self{\n BuildHasherDefault{}\n } \n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H) where H: Hasher {}\n}\n\nimpl Hash for U128 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self.lo as Field);\n H::write(state, self.hi as Field);\n }\n}\n\nimpl<T, let N: u32> Hash for [T; N] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B) where A: Hash, B: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C) where A: Hash, B: Hash, C: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D) where A: Hash, B: Hash, C: Hash, D: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E) where A: Hash, B: Hash, C: Hash, D: Hash, E: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n#[test]\nfn assert_pedersen_noir() {\n // TODO: make this a fuzzer test once fuzzer supports curve-specific blackbox functions.\n let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n assert_eq(pedersen_hash_with_separator(input, 4), pedersen_hash_with_separator_noir(input, 4));\n assert_eq(pedersen_commitment_with_separator(input, 4), pedersen_commitment_with_separator_noir(input, 4));\n}\n"},"265":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr","source":"struct Reader<N> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n // TODO(#4394)\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"},"275":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr","source":"pub fn field_from_bytes<N>(bytes: [u8; N], big_endian: bool) -> Field {\n assert(bytes.len() < 32, \"field_from_bytes: N must be less than 32\");\n let mut as_field = 0;\n let mut offset = 1;\n for i in 0..N {\n let mut index = i;\n if big_endian {\n index = N - i - 1;\n }\n as_field += (bytes[index] as Field) * offset;\n offset *= 256;\n }\n\n as_field\n}\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\n#[test]\nunconstrained fn bytes_field_test() {\n // Tests correctness of field_from_bytes_32_trunc against existing methods\n // Bytes representing 0x543e0a6642ffeb8039296861765a53407bba62bd1c97ca43374de950bbe0a7\n let inputs = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167\n ];\n let field = field_from_bytes(inputs, true);\n let return_bytes = field.to_be_bytes(31);\n for i in 0..31 {\n assert_eq(inputs[i], return_bytes[i]);\n }\n // 32 bytes - we remove the final byte, and check it matches the field\n let inputs2 = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167, 158\n ];\n let field2 = field_from_bytes_32_trunc(inputs2);\n let return_bytes2 = field.to_be_bytes(31);\n\n for i in 0..31 {\n assert_eq(return_bytes2[i], return_bytes[i]);\n }\n assert_eq(field2, field);\n}\n\n#[test]\nunconstrained fn max_field_test() {\n // Tests the hardcoded value in constants.nr vs underlying modulus\n // NB: We can't use 0-1 in constants.nr as it will be transpiled incorrectly to ts and sol constants files\n let max_value = crate::constants::MAX_FIELD_VALUE;\n assert_eq(max_value, 0 - 1);\n // modulus == 0 is tested elsewhere, so below is more of a sanity check\n let max_bytes = max_value.to_be_bytes(32);\n let mod_bytes = std::field::modulus_be_bytes();\n for i in 0..31 {\n assert_eq(max_bytes[i], mod_bytes[i]);\n }\n assert_eq(max_bytes[31], mod_bytes[31] - 1);\n}\n"},"277":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/mod.nr","source":"// general util packages/modules are usually bad practice\n// because there is no criteria for what we should not put in here.\n// Reducing the size of this package would be welcome.\n\nmod arrays;\nmod field;\nmod reader;\nmod uint256;\n\n// if predicate == true then return lhs, else return rhs\npub fn conditional_assign(predicate: bool, lhs: Field, rhs: Field) -> Field {\n if predicate { lhs } else { rhs }\n}\n\npub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: u32) -> [T; M] {\n let iterator_len = if N > M { M } else { N };\n for i in 0..iterator_len {\n dst[i] = src[i + offset];\n }\n dst\n}\n"},"291":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/eth_address.nr","source":"use crate::{\n constants::ETH_ADDRESS_LENGTH, hash::pedersen_hash,\n traits::{Empty, ToField, Serialize, Deserialize}, utils\n};\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_LENGTH] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_LENGTH]) -> Self {\n EthAddress::from_field(fields[0])\n }\n}\n\nimpl EthAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n field.assert_max_bit_size(160);\n Self { inner: field }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n"},"292":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n crate::address::{eth_address::EthAddress, partial_address::PartialAddress, public_keys_hash::PublicKeysHash},\n constants::{AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1},\n contract_class_id::ContractClassId, hash::poseidon2_hash,\n traits::{Empty, FromField, ToField, Serialize, Deserialize}, utils\n};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n poseidon2_hash([pub_keys_hash.to_field(), partial_address.to_field(), GENERATOR_INDEX__CONTRACT_ADDRESS_V1])\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys_hash() {\n let pub_keys_hash = PublicKeysHash::from_field(1);\n let partial_address = PartialAddress::from_field(2);\n\n let address = AztecAddress::compute(pub_keys_hash, partial_address);\n let expected_computed_address_from_partial_and_pubkey = 0x1b6ead051e7b42665064ca6cf1ec77da0a36d86e00d1ff6e44077966c0c3a9fa;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"294":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/partial_address.nr","source":"use crate::{\n address::{\n eth_address::EthAddress, salted_initialization_hash::SaltedInitializationHash,\n aztec_address::AztecAddress\n},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, contract_class_id::ContractClassId,\n hash::pedersen_hash, traits::{ToField, FromField, Serialize, Deserialize}\n};\n\nglobal PARTIAL_ADDRESS_LENGTH = 1;\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn serialize(self: Self) -> [Field; PARTIAL_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn deserialize(fields: [Field; PARTIAL_ADDRESS_LENGTH]) -> Self {\n PartialAddress { inner: fields[0] }\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n deployer: AztecAddress\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, deployer)\n )\n }\n\n pub fn compute_from_salted_initialization_hash(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash\n ) -> Self {\n PartialAddress::from_field(\n pedersen_hash(\n [\n contract_class_id.to_field(),\n salted_initialization_hash.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.to_field() == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"295":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/salted_initialization_hash.nr","source":"use crate::{\n address::{eth_address::EthAddress, aztec_address::AztecAddress},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, hash::pedersen_hash, traits::ToField\n};\n\n// Salted initialization hash. Used in the computation of a partial address.\nstruct SaltedInitializationHash {\n inner: Field\n}\n\nimpl ToField for SaltedInitializationHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl SaltedInitializationHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(salt: Field, initialization_hash: Field, deployer: AztecAddress) -> Self {\n SaltedInitializationHash::from_field(\n pedersen_hash(\n [\n salt,\n initialization_hash,\n deployer.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"296":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr","source":"mod lib;\n\ncontract GasToken {\n use dep::aztec::{\n protocol_types::{\n contract_class_id::ContractClassId, abis::function_selector::FunctionSelector,\n address::{AztecAddress, EthAddress},\n constants::{DEPLOYER_CONTRACT_ADDRESS, REGISTERER_CONTRACT_ADDRESS}\n },\n state_vars::{SharedImmutable, PublicMutable, Map},\n oracle::get_contract_instance::get_contract_instance, deploy::deploy_contract\n };\n\n use dep::deployer::ContractInstanceDeployer;\n use dep::registerer::ContractClassRegisterer;\n\n use crate::lib::{calculate_fee, get_bridge_gas_msg_hash};\n\n #[aztec(storage)]\n struct Storage {\n // This map is accessed directly by protocol circuits to check balances for fee payment.\n // Do not change this storage layout unless you also update the base rollup circuits.\n balances: Map<AztecAddress, PublicMutable<U128>>,\n portal_address: SharedImmutable<EthAddress>,\n }\n\n // Not flagged as initializer to reduce cost of checking init nullifier in all functions.\n // This function should be called as entrypoint to initialize the contract by minting itself funds.\n #[aztec(private)]\n fn deploy(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field,\n portal_address: EthAddress\n ) {\n // Validate contract class parameters are correct\n let self = context.this_address();\n let instance = get_contract_instance(self);\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n assert(\n instance.contract_class_id == contract_class_id, \"Invalid contract class id computed for gas token\"\n );\n\n // Increase self balance and set as fee payer, and end setup\n let deploy_fees = 20000000000;\n GasToken::at(self)._increase_public_balance(self, deploy_fees).enqueue(&mut context);\n context.set_as_fee_payer();\n context.end_setup();\n\n // Register class and publicly deploy contract\n let _register = ContractClassRegisterer::at(AztecAddress::from_field(REGISTERER_CONTRACT_ADDRESS)).register(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ).call(&mut context);\n let _deploy = ContractInstanceDeployer::at(AztecAddress::from_field(DEPLOYER_CONTRACT_ADDRESS)).deploy(\n instance.salt,\n instance.contract_class_id,\n instance.initialization_hash,\n instance.public_keys_hash,\n true\n ).call(&mut context);\n\n // Enqueue call to set the portal address\n GasToken::at(self).set_portal(portal_address).enqueue(&mut context);\n }\n\n // We purposefully not set this function as an initializer so we do not bind\n // the contract to a specific L1 portal address, since the gas token address\n // is a hardcoded constant in the rollup circuits.\n #[aztec(public)]\n fn set_portal(portal_address: EthAddress) {\n assert(storage.portal_address.read_public().is_zero());\n storage.portal_address.initialize(portal_address);\n }\n\n #[aztec(private)]\n fn claim(to: AztecAddress, amount: Field, secret: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_private();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address);\n\n // TODO(palla/gas) Emit an unencrypted log to announce which L1 to L2 message has been claimed\n // Otherwise, we cannot trace L1 deposits to their corresponding claims on L2\n\n GasToken::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context);\n }\n\n #[aztec(public)]\n #[aztec(internal)]\n fn _increase_public_balance(to: AztecAddress, amount: Field) {\n let new_balance = storage.balances.at(to).read().add(U128::from_integer(amount));\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(palla/gas) Remove this function and use the private claim flow only\n #[aztec(public)]\n fn claim_public(to: AztecAddress, amount: Field, secret: Field, leaf_index: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_public();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address, leaf_index);\n\n let new_balance = storage.balances.at(to).read() + U128::from_integer(amount);\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(@just-mitch): remove this function before mainnet deployment\n // convenience function for testing\n // the true canonical gas token contract will not have this function\n #[aztec(public)]\n fn mint_public(to: AztecAddress, amount: Field) {\n let amount = U128::from_integer(amount);\n let new_balance = storage.balances.at(to).read().add(amount);\n\n storage.balances.at(to).write(new_balance);\n }\n\n #[aztec(public)]\n #[aztec(view)]\n fn check_balance(fee_limit: Field) {\n let fee_limit = U128::from_integer(fee_limit);\n assert(storage.balances.at(context.msg_sender()).read() >= fee_limit, \"Balance too low\");\n }\n\n // utility function for testing\n #[aztec(public)]\n #[aztec(view)]\n fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n"},"297":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/lib.nr","source":"use dep::aztec::prelude::{AztecAddress, EthAddress};\nuse dep::aztec::context::PublicContext;\nuse dep::aztec::protocol_types::hash::sha256_to_field;\n\npub fn calculate_fee<TPublicContext>(context: PublicContext) -> Field {\n context.transaction_fee()\n}\n\npub fn get_bridge_gas_msg_hash(owner: AztecAddress, amount: Field) -> Field {\n let mut hash_bytes = [0; 68];\n let recipient_bytes = owner.to_field().to_be_bytes(32);\n let amount_bytes = amount.to_be_bytes(32);\n\n for i in 0..32 {\n hash_bytes[i + 4] = recipient_bytes[i];\n hash_bytes[i + 36] = amount_bytes[i];\n }\n\n // Function selector: 0x3e87b9be keccak256('mint_public(bytes32,uint256)')\n hash_bytes[0] = 0x3e;\n hash_bytes[1] = 0x87;\n hash_bytes[2] = 0xb9;\n hash_bytes[3] = 0xbe;\n\n let content_hash = sha256_to_field(hash_bytes);\n content_hash\n}\n"},"298":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr","source":"contract ContractInstanceDeployer {\n use dep::aztec::protocol_types::{\n address::{AztecAddress, EthAddress, PublicKeysHash, PartialAddress},\n contract_class_id::ContractClassId, constants::DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n traits::Serialize, abis::log_hash::LogHash\n };\n use dep::aztec::{\n context::PrivateContext, hash::compute_unencrypted_log_hash,\n oracle::logs::emit_unencrypted_log_private_internal\n };\n\n #[aztec(event)]\n struct ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field, \n contract_class_id: ContractClassId, \n initialization_hash: Field, \n public_keys_hash: PublicKeysHash, \n deployer: AztecAddress,\n }\n\n #[aztec(private)]\n fn deploy(\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys_hash: PublicKeysHash,\n universal_deploy: bool\n ) {\n // TODO(@spalladino): assert nullifier_exists silo(contract_class_id, ContractClassRegisterer)\n\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.msg_sender()\n };\n\n let partial_address = PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n let address = AztecAddress::compute(public_keys_hash, partial_address);\n\n // Emit the address as a nullifier to be able to prove that this instance has been (not) deployed\n context.push_nullifier(address.to_field(), 0);\n\n // Broadcast the event\n let event = ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys_hash,\n initialization_hash,\n salt,\n deployer,\n version: 1\n };\n\n let payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", payload);\n\n let contract_address = context.this_address();\n let counter = context.next_counter();\n\n // @todo This is very inefficient, we are doing a lot of back and forth conversions.\n let log_slice = payload.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(contract_address, payload);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + log_slice.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n\n let _void = emit_unencrypted_log_private_internal(contract_address, payload, counter);\n }\n}\n"},"303":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr","source":"mod events;\nmod capsule;\n\ncontract ContractClassRegisterer {\n use dep::aztec::prelude::{AztecAddress, EthAddress, FunctionSelector};\n use dep::aztec::protocol_types::{\n contract_class_id::ContractClassId,\n constants::{\n ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, FUNCTION_TREE_HEIGHT,\n MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS,\n MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS,\n MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE\n },\n traits::Serialize, abis::log_hash::LogHash\n };\n\n use dep::aztec::{context::PrivateContext, oracle::logs::emit_contract_class_unencrypted_log_private_internal};\n\n use crate::events::{\n class_registered::ContractClassRegistered,\n private_function_broadcasted::{ClassPrivateFunctionBroadcasted, PrivateFunction, InnerPrivateFunction},\n unconstrained_function_broadcasted::{ClassUnconstrainedFunctionBroadcasted, UnconstrainedFunction, InnerUnconstrainedFunction}\n };\n\n // docs:start:import_pop_capsule\n use crate::capsule::pop_capsule;\n // docs:end:import_pop_capsule\n\n #[aztec(private)]\n fn register(artifact_hash: Field, private_functions_root: Field, public_bytecode_commitment: Field) {\n // TODO: Validate public_bytecode_commitment is the correct commitment of packed_public_bytecode\n // TODO: Validate packed_public_bytecode is legit public bytecode\n\n // docs:start:pop_capsule\n let packed_public_bytecode: [Field; MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS] = pop_capsule();\n // docs:end:pop_capsule\n\n // Compute contract class id from preimage\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n\n // Emit the contract class id as a nullifier to be able to prove that this class has been (not) registered\n let event = ContractClassRegistered { contract_class_id, version: 1, artifact_hash, private_functions_root, packed_public_bytecode };\n context.push_nullifier(contract_class_id.to_field(), 0);\n\n // Broadcast class info including public bytecode\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ContractClassRegistered: {}\",\n [\n contract_class_id.to_field(),\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_private_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n unconstrained_functions_artifact_tree_root: Field,\n private_function_tree_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n private_function_tree_leaf_index: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerPrivateFunction\n ) {\n let private_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS] = pop_capsule();\n\n let event = ClassPrivateFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n private_function_tree_sibling_path,\n private_function_tree_leaf_index,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: PrivateFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n vk_hash: function_data.vk_hash,\n bytecode: private_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassPrivateFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.vk_hash,\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_unconstrained_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n private_functions_artifact_tree_root: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerUnconstrainedFunction\n ) {\n let unconstrained_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS] = pop_capsule();\n let event = ClassUnconstrainedFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: UnconstrainedFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n bytecode: unconstrained_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassUnconstrainedFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n // This fn exists separately from emit_unencrypted_log because sha hashing the preimage\n // is too large to compile (16,200 fields, 518,400 bytes) => the oracle hashes it\n // It is ONLY used with contract_class_registerer_contract since we already assert correctness:\n // - Contract class -> we will commit to the packed bytecode (currently a TODO)\n // - Private function -> we provide a membership proof\n // - Unconstrained function -> we provide a membership proof\n // Ordinary logs are not protected by the above so this fn shouldn't be called by anything else\n #[contract_library_method]\n pub fn emit_contract_class_unencrypted_log<N>(context: &mut PrivateContext, log: [Field; N]) {\n let contract_address = context.this_address();\n let counter = context.next_counter();\n let log_hash = emit_contract_class_unencrypted_log_private_internal(contract_address, log, counter);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + N * 32;\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n }\n}\n"},"31":{"path":"std/hash/poseidon2.nr","source":"use crate::hash::Hasher;\nuse crate::default::Default;\n\nglobal RATE: u32 = 3;\n\nstruct Poseidon2 {\n cache: [Field;3],\n state: [Field;4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n fn new(iv: Field) -> Poseidon2 {\n let mut result = Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) -> [Field; RATE] {\n // zero-pad the cache\n for i in 0..RATE {\n if i >= self.cache_size {\n self.cache[i] = 0;\n }\n }\n // add the cache into sponge state\n for i in 0..RATE {\n self.state[i] += self.cache[i];\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n // return `RATE` number of field elements from the sponge state.\n let mut result = [0; RATE];\n for i in 0..RATE {\n result[i] = self.state[i];\n }\n result\n }\n\n fn absorb(&mut self, input: Field) {\n if (!self.squeeze_mode) & (self.cache_size == RATE) {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n let _ = self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else if (!self.squeeze_mode) & (self.cache_size != RATE) {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n } else if self.squeeze_mode {\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\n // N.B. I don't think this code path can be reached?!\n self.cache[0] = input;\n self.cache_size = 1;\n self.squeeze_mode = false;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n if self.squeeze_mode & (self.cache_size == 0) {\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\n // Switch to absorb mode.\n self.squeeze_mode = false;\n self.cache_size = 0;\n }\n if !self.squeeze_mode {\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\n // matched\n let new_output_elements = self.perform_duplex();\n self.squeeze_mode = true;\n for i in 0..RATE {\n self.cache[i] = new_output_elements[i];\n }\n self.cache_size = RATE;\n }\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\n let result = self.cache[0];\n for i in 1..RATE {\n if i < self.cache_size {\n self.cache[i - 1] = self.cache[i];\n }\n }\n self.cache_size -= 1;\n self.cache[self.cache_size] = 0;\n result\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32, is_variable_length: bool) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\nstruct Poseidon2Hasher{\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv : Field = (self._state.len() as Field)*18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field){\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher {\n _state: &[],\n }\n }\n}\n"},"33":{"path":"std/merkle.nr","source":"// Regular merkle tree means a append-only merkle tree (Explain why this is the only way to have privacy and alternatives if you don't want it)\n// Currently we assume that it is a binary tree, so depth k implies a width of 2^k\n// XXX: In the future we can add an arity parameter\n// Returns the merkle root of the tree from the provided leaf, its hashpath, using a pedersen hash function.\npub fn compute_merkle_root<let N: u32>(leaf: Field, index: Field, hash_path: [Field; N]) -> Field {\n let n = hash_path.len();\n let index_bits = index.to_le_bits(n as u32);\n let mut current = leaf;\n for i in 0..n {\n let path_bit = index_bits[i] as bool;\n let (hash_left, hash_right) = if path_bit {\n (hash_path[i], current)\n } else {\n (current, hash_path[i])\n };\n current = crate::hash::pedersen_hash([hash_left, hash_right]);\n }\n current\n}\n"},"4":{"path":"std/cmp.nr","source":"// docs:start:eq-trait\ntrait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\nimpl Eq for Field { fn eq(self, other: Field) -> bool { self == other } }\n\nimpl Eq for u64 { fn eq(self, other: u64) -> bool { self == other } }\nimpl Eq for u32 { fn eq(self, other: u32) -> bool { self == other } }\nimpl Eq for u8 { fn eq(self, other: u8) -> bool { self == other } }\nimpl Eq for u1 { fn eq(self, other: u1) -> bool { self == other } }\n\nimpl Eq for i8 { fn eq(self, other: i8) -> bool { self == other } }\nimpl Eq for i32 { fn eq(self, other: i32) -> bool { self == other } }\nimpl Eq for i64 { fn eq(self, other: i64) -> bool { self == other } }\n\nimpl Eq for () { fn eq(_self: Self, _other: ()) -> bool { true } }\nimpl Eq for bool { fn eq(self, other: bool) -> bool { self == other } }\n\nimpl<T, let N: u32> Eq for [T; N] where T: Eq {\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] where T: Eq {\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0 .. self.len() {\n result &= self[i].eq(other[i]);\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) where A: Eq, B: Eq {\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) where A: Eq, B: Eq, C: Eq {\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) where A: Eq, B: Eq, C: Eq, D: Eq {\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) where A: Eq, B: Eq, C: Eq, D: Eq, E: Eq {\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3) & 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.\nstruct 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// docs:start:ord-trait\ntrait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// Note: Field deliberately does not implement Ord\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 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 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 {\n if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n }\n}\n\nimpl<T, let N: u32> Ord for [T; N] where T: Ord {\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 let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<T> Ord for [T] where T: Ord {\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 let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<A, B> Ord for (A, B) where A: Ord, B: Ord {\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) where A: Ord, B: Ord, C: Ord {\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) where A: Ord, B: Ord, C: Ord, D: Ord {\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) where A: Ord, B: Ord, C: Ord, D: Ord, E: Ord {\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 where T: Ord {\n if v1 > v2 { v1 } else { v2 }\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 where T: Ord {\n if v1 > v2 { v2 } else { v1 }\n}\n\nmod cmp_tests {\n use crate::cmp::{min, max};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n"},"48":{"path":"std/uint128.nr","source":"use crate::ops::{Add, Sub, Mul, Div, Rem, Not, BitOr, BitAnd, BitXor, Shl, Shr};\nuse crate::cmp::{Eq, Ord, Ordering};\nuse crate::println;\n\nglobal pow64 : Field = 18446744073709551616; //2^64;\nglobal pow63 : Field = 9223372036854775808; // 2^63;\nstruct U128 {\n lo: Field,\n hi: Field,\n}\n\nimpl U128 {\n\n pub fn from_u64s_le(lo: u64, hi: u64) -> U128 {\n // in order to handle multiplication, we need to represent the product of two u64 without overflow\n assert(crate::field::modulus_num_bits() as u32 > 128);\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n pub fn from_u64s_be(hi: u64, lo: u64) -> U128 {\n U128::from_u64s_le(lo, hi)\n }\n\n pub fn zero() -> U128 {\n U128 { lo: 0, hi: 0 }\n }\n\n pub fn one() -> U128 {\n U128 { lo: 1, hi: 0 }\n }\n pub fn from_le_bytes(bytes: [u8; 16]) -> U128 {\n let mut lo = 0;\n let mut base = 1;\n for i in 0..8 {\n lo += (bytes[i] as Field)*base;\n base *= 256;\n }\n let mut hi = 0;\n base = 1;\n for i in 8..16 {\n hi += (bytes[i] as Field)*base;\n base *= 256;\n }\n U128 { lo, hi }\n }\n\n pub fn to_be_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_be_bytes(8);\n let hi = self.hi.to_be_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = hi[i];\n bytes[i+8] = lo[i];\n }\n bytes\n }\n\n pub fn to_le_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_le_bytes(8);\n let hi = self.hi.to_le_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = lo[i];\n bytes[i+8] = hi[i];\n }\n bytes\n }\n\n pub fn from_hex<let N: u32>(hex: str<N>) -> U128 {\n let N = N as u32;\n let bytes = hex.as_bytes();\n // string must starts with \"0x\"\n assert((bytes[0] == 48) & (bytes[1] == 120), \"Invalid hexadecimal string\");\n assert(N < 35, \"Input does not fit into a U128\");\n\n let mut lo = 0;\n let mut hi = 0;\n let mut base = 1;\n if N <= 18 {\n for i in 0..N - 2 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n } else {\n for i in 0..16 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n base = 1;\n for i in 17..N - 1 {\n hi += U128::decode_ascii(bytes[N-i])*base;\n base = base*16;\n }\n }\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n unconstrained fn uconstrained_check_is_upper_ascii(ascii: u8) -> bool {\n ((ascii >= 65) & (ascii <= 90)) // Between 'A' and 'Z'\n }\n\n fn decode_ascii(ascii: u8) -> Field {\n if ascii < 58 {\n ascii - 48\n } else {\n let ascii = ascii + 32 * (U128::uconstrained_check_is_upper_ascii(ascii) as u8);\n assert(ascii >= 97); // enforce >= 'a'\n assert(ascii <= 102); // enforce <= 'f'\n ascii - 87\n } as Field\n }\n\n // TODO: Replace with a faster version. \n // A circuit that uses this function can be slow to compute\n // (we're doing up to 127 calls to compute the quotient)\n unconstrained fn unconstrained_div(self: Self, b: U128) -> (U128, U128) {\n if b == U128::zero() {\n // Return 0,0 to avoid eternal loop\n (U128::zero(), U128::zero())\n } else if self < b {\n (U128::zero(), self)\n } else if self == b {\n (U128::one(), U128::zero())\n } else {\n let (q,r) = if b.hi as u64 >= pow63 as u64 {\n // The result of multiplication by 2 would overflow\n (U128::zero(), self)\n } else {\n self.unconstrained_div(b * U128::from_u64s_le(2, 0))\n };\n let q_mul_2 = q * U128::from_u64s_le(2, 0);\n if r < b {\n (q_mul_2, r)\n } else {\n (q_mul_2 + U128::one(), r - b)\n }\n }\n }\n\n pub fn from_integer<T>(i: T) -> U128 {\n let f = crate::as_field(i);\n // Reject values which would overflow a u128\n f.assert_max_bit_size(128);\n let lo = f as u64 as Field;\n let hi = (f - lo) / pow64;\n U128 { lo, hi }\n }\n\n pub fn to_integer<T>(self) -> T {\n crate::from_field(self.lo + self.hi * pow64)\n }\n\n fn wrapping_mul(self: Self, b: U128) -> U128 {\n let low = self.lo * b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = self.lo * b.hi + self.hi * b.lo + carry;\n let hi = high as u64 as Field;\n U128 { lo, hi }\n }\n}\n\nimpl Add for U128 {\n fn add(self: Self, b: U128) -> U128 {\n let low = self.lo + b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64; \n let high = self.hi + b.hi + carry;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to add with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Sub for U128 {\n fn sub(self: Self, b: U128) -> U128 {\n let low = pow64 + self.lo - b.lo;\n let lo = low as u64 as Field;\n let borrow = (low == lo) as Field;\n let high = self.hi - b.hi - borrow;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to subtract with underflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Mul for U128 {\n fn mul(self: Self, b: U128) -> U128 {\n assert(self.hi*b.hi == 0, \"attempt to multiply with overflow\");\n let low = self.lo*b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = if crate::field::modulus_num_bits() as u32 > 196 {\n (self.lo+self.hi)*(b.lo+b.hi) - low + carry\n } else {\n self.lo*b.hi + self.hi*b.lo + carry\n };\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to multiply with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Div for U128 {\n fn div(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n q\n }\n}\n\nimpl Rem for U128 {\n fn rem(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n r\n }\n}\n\nimpl Eq for U128 {\n fn eq(self: Self, b: U128) -> bool {\n (self.lo == b.lo) & (self.hi == b.hi)\n }\n}\n\nimpl Ord for U128 {\n fn cmp(self, other: Self) -> Ordering {\n let hi_ordering = (self.hi as u64).cmp((other.hi as u64));\n let lo_ordering = (self.lo as u64).cmp((other.lo as u64));\n \n if hi_ordering == Ordering::equal() {\n lo_ordering\n } else {\n hi_ordering\n }\n }\n}\n\nimpl Not for U128 { \n fn not(self) -> U128 {\n U128 {\n lo: (!(self.lo as u64)) as Field,\n hi: (!(self.hi as u64)) as Field\n }\n }\n}\n\nimpl BitOr for U128 { \n fn bitor(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) | (other.lo as u64)) as Field,\n hi: ((self.hi as u64) | (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitAnd for U128 {\n fn bitand(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) & (other.lo as u64)) as Field,\n hi: ((self.hi as u64) & (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitXor for U128 {\n fn bitxor(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) ^ (other.lo as u64)) as Field,\n hi: ((self.hi as u64) ^ (other.hi as u64)) as Field\n }\n }\n}\n\nimpl Shl for U128 { \n fn shl(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift left with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self.wrapping_mul(U128::from_integer(y))\n } \n}\n\nimpl Shr for U128 { \n fn shr(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift right with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self / U128::from_integer(y)\n } \n}\n\nmod tests {\n use crate::uint128::{U128, pow64, pow63};\n\n #[test]\n fn test_not(lo: u64, hi: u64) {\n let num = U128::from_u64s_le(lo, hi);\n let not_num = num.not();\n\n assert_eq(not_num.hi, (hi.not() as Field));\n assert_eq(not_num.lo, (lo.not() as Field));\n\n let not_not_num = not_num.not();\n assert_eq(num, not_not_num);\n }\n #[test]\n fn test_construction() {\n // Check little-endian u64 is inversed with big-endian u64 construction\n let a = U128::from_u64s_le(2, 1);\n let b = U128::from_u64s_be(1, 2);\n assert_eq(a, b);\n // Check byte construction is equivalent\n let c = U128::from_le_bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);\n let d = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n assert_eq(c, d);\n }\n #[test]\n fn test_byte_decomposition() {\n let a = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n // Get big-endian and little-endian byte decompostions\n let le_bytes_a= a.to_le_bytes();\n let be_bytes_a= a.to_be_bytes();\n\n // Check equivalence\n for i in 0..16 {\n assert_eq(le_bytes_a[i], be_bytes_a[15 - i]);\n }\n // Reconstruct U128 from byte decomposition\n let b= U128::from_le_bytes(le_bytes_a);\n // Check that it's the same element\n assert_eq(a, b);\n }\n #[test]\n fn test_hex_constuction() {\n let a = U128::from_u64s_le(0x1, 0x2);\n let b = U128::from_hex(\"0x20000000000000001\");\n assert_eq(a, b);\n\n let c= U128::from_hex(\"0xffffffffffffffffffffffffffffffff\");\n let d= U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff);\n assert_eq(c, d);\n\n let e= U128::from_hex(\"0x00000000000000000000000000000000\");\n let f= U128::from_u64s_le(0, 0);\n assert_eq(e, f);\n }\n\n // Ascii decode tests\n\n #[test]\n fn test_ascii_decode_correct_range() {\n // '0'..'9' range\n for i in 0..10 {\n let decoded= U128::decode_ascii(48 + i);\n assert_eq(decoded, i as Field);\n }\n // 'A'..'F' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(65 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n // 'a'..'f' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(97 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_0() {\n crate::println(U128::decode_ascii(0));\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_1() {\n crate::println(U128::decode_ascii(47));\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_0() {\n let _ = U128::decode_ascii(58);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_1() {\n let _ = U128::decode_ascii(64);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_0() {\n let _ = U128::decode_ascii(71);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_1() {\n let _ = U128::decode_ascii(96);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_greater_than_102_fails() {\n let _ = U128::decode_ascii(103);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_regression() {\n // This code will actually fail because of ascii_decode,\n // but in the past it was possible to create a value > (1<<128)\n let a = U128::from_hex(\"0x~fffffffffffffffffffffffffffffff\");\n let b:Field= a.to_integer();\n let c= b.to_le_bytes(17);\n assert(c[16] != 0);\n }\n\n #[test]\n fn test_unconstrained_div() {\n // Test the potential overflow case\n let a= U128::from_u64s_le(0x0, 0xffffffffffffffff);\n let b= U128::from_u64s_le(0x0, 0xfffffffffffffffe);\n let c= U128::one();\n let d= U128::from_u64s_le(0x0, 0x1);\n let (q,r) = a.unconstrained_div(b);\n assert_eq(q, c);\n assert_eq(r, d);\n\n let a = U128::from_u64s_le(2, 0);\n let b = U128::one();\n // Check the case where a is a multiple of b\n let (c,d ) = a.unconstrained_div(b);\n assert_eq((c, d), (a, U128::zero()));\n\n // Check where b is a multiple of a\n let (c,d) = b.unconstrained_div(a);\n assert_eq((c, d), (U128::zero(), b));\n\n // Dividing by zero returns 0,0\n let a = U128::from_u64s_le(0x1, 0x0);\n let b = U128::zero();\n let (c,d)= a.unconstrained_div(b);\n assert_eq((c, d), (U128::zero(), U128::zero()));\n\n // Dividing 1<<127 by 1<<127 (special case)\n let a = U128::from_u64s_le(0x0, pow63 as u64);\n let b = U128::from_u64s_le(0x0, pow63 as u64);\n let (c,d )= a.unconstrained_div(b);\n assert_eq((c, d), (U128::one(), U128::zero()));\n }\n\n #[test]\n fn integer_conversions() {\n // Maximum\n let start:Field = 0xffffffffffffffffffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Minimum\n let start:Field = 0x0;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Low limb\n let start:Field = 0xffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // High limb\n let start:Field = 0xffffffffffffffff0000000000000000;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn integer_conversions_fuzz(lo: u64, hi: u64) {\n let start: Field = (lo as Field) + pow64 * (hi as Field);\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn test_wrapping_mul() {\n // 1*0==0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::one()));\n\n // 0*1==0\n assert_eq(U128::zero(), U128::one().wrapping_mul(U128::zero()));\n\n // 1*1==1\n assert_eq(U128::one(), U128::one().wrapping_mul(U128::one()));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::zero()));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::from_u64s_le(0, 1).wrapping_mul(U128::one()));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::one().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::from_u64s_le(0, 1)));\n // -1 * -1 == 1\n assert_eq(\n U128::one(), U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff).wrapping_mul(U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff))\n );\n }\n}\n"},"81":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/history/public_storage.nr","source":"use dep::protocol_types::{\n constants::GENERATOR_INDEX__PUBLIC_LEAF_INDEX, hash::pedersen_hash, address::AztecAddress,\n header::Header, utils::field::full_field_less_than\n};\nuse std::merkle::compute_merkle_root;\n\nuse crate::{context::PrivateContext, oracle::get_public_data_witness::get_public_data_witness};\n\ntrait PublicStorageHistoricalRead {\n fn public_storage_historical_read(header: Header, storage_slot: Field, contract_address: AztecAddress) -> Field;\n}\n\nimpl PublicStorageHistoricalRead for Header { \n fn public_storage_historical_read(self, storage_slot: Field, contract_address: AztecAddress) -> Field {\n // 1) Compute the leaf slot by siloing the storage slot with the contract address\n let public_value_leaf_slot = pedersen_hash(\n [contract_address.to_field(), storage_slot],\n GENERATOR_INDEX__PUBLIC_LEAF_INDEX\n );\n\n // 2) Get the membership witness of the slot\n let witness = get_public_data_witness(\n self.global_variables.block_number as u32,\n public_value_leaf_slot\n );\n\n // 3) Extract the value from the witness leaf and check that the storage slot is correct\n let preimage = witness.leaf_preimage;\n\n // Here we have two cases. Code based on same checks in `validate_public_data_reads` in `base_rollup_inputs`\n // 1. The value is the same as the one in the witness\n // 2. The value was never initialized and is zero\n let is_less_than_slot = full_field_less_than(preimage.slot, public_value_leaf_slot);\n let is_next_greater_than = full_field_less_than(public_value_leaf_slot, preimage.next_slot);\n let is_max = ((preimage.next_index == 0) & (preimage.next_slot == 0));\n let is_in_range = is_less_than_slot & (is_next_greater_than | is_max);\n\n let value = if is_in_range {\n 0\n } else {\n assert_eq(preimage.slot, public_value_leaf_slot, \"Public data slot doesn't match witness\");\n preimage.value\n };\n\n // 4) Prove that the leaf exists in the public data tree. Note that `hash` returns not just the hash of the value\n // but also the metadata (slot, next index and next slot).\n assert(\n self.state.partial.public_data_tree.root\n == compute_merkle_root(preimage.hash(), witness.index, witness.path), \"Proving public value inclusion failed\"\n );\n\n value\n }\n}\n"},"87":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/messaging.nr","source":"use crate::{\n hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier},\n oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness\n};\n\nuse std::merkle::compute_merkle_root;\nuse dep::protocol_types::{constants::L1_TO_L2_MSG_TREE_HEIGHT, address::{AztecAddress, EthAddress}, utils::arr_copy_slice};\n\npub fn process_l1_to_l2_message(\n l1_to_l2_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n chain_id: Field,\n version: Field,\n content: Field,\n secret: Field\n) -> Field {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n portal_contract_address,\n chain_id,\n storage_contract_address,\n version,\n content,\n secret_hash\n );\n\n let returned_message = get_l1_to_l2_membership_witness(storage_contract_address, message_hash, secret);\n let leaf_index = returned_message[0];\n let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1);\n\n // Check that the message is in the tree\n // This is implicitly checking that the values of the message are correct\n let root = compute_merkle_root(message_hash, leaf_index, sibling_path);\n assert(root == l1_to_l2_root, \"Message not in state\");\n\n compute_message_nullifier(message_hash, secret, leaf_index)\n}\n"},"90":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr","source":"use crate::{hash::hash_args_array, oracle::returns::unpack_returns};\nuse dep::protocol_types::traits::Deserialize;\n\nstruct PackedReturns {\n packed_returns: Field,\n}\n\nimpl PackedReturns {\n pub fn new(packed_returns: Field) -> Self {\n PackedReturns { packed_returns }\n }\n\n pub fn assert_empty(self) {\n assert_eq(self.packed_returns, 0);\n }\n\n pub fn raw(self) -> Field {\n self.packed_returns\n }\n\n pub fn unpack<N>(self) -> [Field; N] {\n let unpacked: [Field; N] = unpack_returns(self.packed_returns);\n assert_eq(self.packed_returns, hash_args_array(unpacked));\n unpacked\n }\n\n pub fn unpack_into<T, N>(self) -> T where T: Deserialize<N> {\n let unpacked: [Field; N] = self.unpack();\n Deserialize::deserialize(unpacked)\n }\n}\n"},"94":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress, traits::Deserialize\n};\n\nuse crate::context::{\n private_context::PrivateContext, public_context::PublicContext, gas::GasOpts,\n public_context::FunctionReturns, inputs::{PrivateContextInputs, PublicContextInputs}\n};\n\nuse crate::oracle::arguments::pack_arguments;\nuse crate::hash::hash_args;\n\ntrait CallInterface<N, T, P, Env> {\n fn get_original(self) -> fn[Env](T) -> P;\n\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<N> {\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\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, T, Env> PrivateCallInterface<N, T, Env> {\n pub fn call<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n );\n let unpacked: T = returns.unpack_into();\n unpacked\n }\n\n pub fn view<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n\n pub fn delegate_call<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true);\n returns.unpack_into()\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, Env> PrivateVoidCallInterface<N, Env> {\n pub fn call(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n ).assert_empty();\n }\n\n pub fn view(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n\n pub fn delegate_call(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true).assert_empty();\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, T, Env> PrivateStaticCallInterface<N, T, Env> {\n pub fn view<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, Env> PrivateStaticVoidCallInterface<N, Env> {\n pub fn view(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool\n}\n\nimpl<N, T, Env> PublicCallInterface<N, T, Env> {\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 fn call<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn view<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn delegate_call<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.deserialize_into()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<N, Env> PublicVoidCallInterface<N, Env> {\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 fn call(self, context: &mut PublicContext) {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn delegate_call(self, context: &mut PublicContext) {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.assert_empty()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicStaticCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<N, T, Env> PublicStaticCallInterface<N, T, Env> {\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 fn view<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n let unpacked: T = returns.deserialize_into();\n unpacked\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicStaticVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<N, Env> PublicStaticVoidCallInterface<N, Env> {\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 fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n"},"95":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message, hash::{hash_args_array, ArgsHasher},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n oracle::{\n key_validation_request::get_key_validation_request, arguments, returns::pack_returns,\n call_private_function::call_private_function_internal, header::get_header_at,\n logs::{emit_encrypted_note_log, emit_encrypted_event_log},\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, set_public_teardown_function_call_internal,\n parse_public_call_stack_item_from_oracle\n}\n}\n};\nuse dep::protocol_types::{\n abis::{\n caller_context::CallerContext, function_selector::FunctionSelector,\n max_block_number::MaxBlockNumber,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem, read_request::ReadRequest, note_hash::NoteHash,\n nullifier::Nullifier, log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::Empty\n};\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_function_hash: Field,\n l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n // TODO(#7112): This function is called with non-zero note hash only in 1 of 25 cases in aztec-packages repo\n // - consider creating a separate function with 1 arg for the zero note hash case.\n fn push_nullifier(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: nullified_note_hash, counter: self.next_counter() });\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self.key_validation_requests_and_generators.storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n public_teardown_function_hash: self.public_teardown_function_hash,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\"Setting {0} as fee payer\", [self.this_address().to_field()]);\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number = MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request = self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one \n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator { request, sk_app_generator: sk_generators[key_index] };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<M>(&mut self, randomness: Field, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<M>(&mut self, note_hash_counter: u32, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_private_function_no_args<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_private_function_with_packed_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n let item = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n assert_eq(item.public_inputs.start_side_effect_counter, start_side_effect_counter);\n let end_side_effect_counter = item.public_inputs.end_side_effect_counter;\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\n\n let mut caller_context = CallerContext::empty();\n caller_context.is_static_call = self.inputs.call_context.is_static_call;\n if is_delegate_call {\n caller_context.msg_sender = self.inputs.call_context.msg_sender;\n caller_context.storage_contract_address = self.inputs.call_context.storage_contract_address;\n }\n self.private_call_requests.push(\n PrivateCallRequest {\n target: item.contract_address,\n call_context: item.public_inputs.call_context,\n function_data: item.function_data,\n args_hash: item.public_inputs.args_hash,\n returns_hash: item.public_inputs.returns_hash,\n caller_context,\n start_side_effect_counter,\n end_side_effect_counter\n }\n );\n\n PackedReturns::new(item.public_inputs.returns_hash)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_call_stack_hashes.push(item.get_compressed().hash());\n }\n\n pub fn set_public_teardown_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn set_public_teardown_function_with_packed_args<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_teardown_function_hash = item.get_compressed().hash();\n }\n\n fn validate_call_stack_item_from_oracle(\n self,\n item: PublicCallStackItem,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.start_side_effect_counter, self.side_effect_counter);\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n}\n"},"96":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/public_context.nr","source":"use crate::hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier};\nuse dep::protocol_types::address::{AztecAddress, EthAddress};\nuse dep::protocol_types::constants::MAX_FIELD_VALUE;\nuse dep::protocol_types::traits::{Serialize, Deserialize, Empty};\nuse dep::protocol_types::abis::function_selector::FunctionSelector;\nuse crate::context::inputs::public_context_inputs::PublicContextInputs;\nuse crate::context::gas::GasOpts;\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs) -> Self {\n PublicContext { inputs }\n }\n\n pub fn emit_unencrypted_log<T, N>(&mut self, log: T) where T: Serialize<N> {\n emit_unencrypted_log(Serialize::serialize(log).as_slice());\n }\n\n pub fn note_hash_exists(self, note_hash: Field, leaf_index: Field) -> bool {\n note_hash_exists(note_hash, leaf_index) == 1\n }\n\n pub fn l1_to_l2_msg_exists(self, msg_hash: Field, msg_leaf_index: Field) -> bool {\n l1_to_l2_msg_exists(msg_hash, msg_leaf_index) == 1\n }\n\n fn nullifier_exists(self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n nullifier_exists(unsiloed_nullifier, address.to_field()) == 1\n }\n\n fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field\n ) {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n sender,\n self.chain_id(),\n /*recipient=*/ self.this_address(),\n self.version(),\n content,\n secret_hash\n );\n let nullifier = compute_message_nullifier(message_hash, secret, leaf_index);\n\n assert(\n !self.nullifier_exists(nullifier, self.this_address()), \"L1-to-L2 message is already nullified\"\n );\n assert(\n self.l1_to_l2_msg_exists(message_hash, leaf_index), \"Tried to consume nonexistent L1-to-L2 message\"\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0);\n }\n\n fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg(recipient, content);\n }\n\n fn call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let results = call(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n let data_to_return: [Field; RETURNS_COUNT] = results.0;\n let success: u8 = results.1;\n assert(success == 1, \"Nested call failed!\");\n\n FunctionReturns::new(data_to_return)\n }\n\n fn static_call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let (data_to_return, success): ([Field; RETURNS_COUNT], u8) = call_static(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n\n assert(success == 1, \"Nested static call failed!\");\n FunctionReturns::new(data_to_return)\n }\n\n fn delegate_call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field]\n ) -> FunctionReturns<RETURNS_COUNT> {\n assert(false, \"'delegate_call_public_function' not implemented!\");\n FunctionReturns::new([0; RETURNS_COUNT])\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n emit_note_hash(note_hash);\n }\n fn push_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n // Cannot nullify pending commitments in AVM, so `nullified_commitment` is not used\n emit_nullifier(nullifier);\n }\n\n fn this_address(self) -> AztecAddress {\n address()\n }\n pub fn storage_address(self) -> AztecAddress {\n storage_address()\n }\n fn msg_sender(self) -> AztecAddress {\n sender()\n }\n fn selector(self) -> FunctionSelector {\n FunctionSelector::from_u32(function_selector())\n }\n fn get_args_hash(self) -> Field {\n self.inputs.args_hash\n }\n fn transaction_fee(self) -> Field {\n transaction_fee()\n }\n\n fn chain_id(self) -> Field {\n chain_id()\n }\n fn version(self) -> Field {\n version()\n }\n fn block_number(self) -> Field {\n block_number()\n }\n fn timestamp(self) -> u64 {\n timestamp()\n }\n pub fn fee_per_l2_gas(self) -> Field {\n fee_per_l2_gas()\n }\n pub fn fee_per_da_gas(self) -> Field {\n fee_per_da_gas()\n }\n\n fn l2_gas_left(self) -> Field {\n l2_gas_left()\n }\n fn da_gas_left(self) -> Field {\n da_gas_left()\n }\n\n fn raw_storage_read<N>(_self: Self, storage_slot: Field) -> [Field; N] {\n storage_read(storage_slot)\n }\n\n fn storage_read<T, N>(self, storage_slot: Field) -> T where T: Deserialize<N> {\n T::deserialize(self.raw_storage_read(storage_slot))\n }\n\n fn raw_storage_write<N>(_self: Self, storage_slot: Field, values: [Field; N]) {\n storage_write(storage_slot, values);\n }\n\n fn storage_write<T, N>(self, storage_slot: Field, value: T) where T: Serialize<N> {\n self.raw_storage_write(storage_slot, value.serialize());\n }\n}\n\n// Helper functions\nfn gas_for_call(user_gas: GasOpts) -> [Field; 2] {\n // It's ok to use the max possible gas here, because the gas will be\n // capped by the gas left in the (STATIC)CALL instruction.\n [\n user_gas.l2_gas.unwrap_or(MAX_FIELD_VALUE),\n user_gas.da_gas.unwrap_or(MAX_FIELD_VALUE)\n ]\n}\n\n// Unconstrained opcode wrappers (do not use directly).\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/6420): reconsider.\nunconstrained fn address() -> AztecAddress {\n address_opcode()\n}\nunconstrained fn storage_address() -> AztecAddress {\n storage_address_opcode()\n}\nunconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\nunconstrained fn portal() -> EthAddress {\n portal_opcode()\n}\nunconstrained fn function_selector() -> u32 {\n function_selector_opcode()\n}\nunconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\nunconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\nunconstrained fn version() -> Field {\n version_opcode()\n}\nunconstrained fn block_number() -> Field {\n block_number_opcode()\n}\nunconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\nunconstrained fn fee_per_l2_gas() -> Field {\n fee_per_l2_gas_opcode()\n}\nunconstrained fn fee_per_da_gas() -> Field {\n fee_per_da_gas_opcode()\n}\nunconstrained fn l2_gas_left() -> Field {\n l2_gas_left_opcode()\n}\nunconstrained fn da_gas_left() -> Field {\n da_gas_left_opcode()\n}\nunconstrained fn note_hash_exists(note_hash: Field, leaf_index: Field) -> u8 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\nunconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\nunconstrained fn nullifier_exists(nullifier: Field, address: Field) -> u8 {\n nullifier_exists_opcode(nullifier, address)\n}\nunconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\nunconstrained fn emit_unencrypted_log(message: [Field]) {\n emit_unencrypted_log_opcode(message)\n}\nunconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: Field) -> u8 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\nunconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\nunconstrained fn call<RET_SIZE>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_opcode(gas, address, args, function_selector)\n}\nunconstrained fn call_static<RET_SIZE>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_static_opcode(gas, address, args, function_selector)\n}\n\nunconstrained fn storage_read<N>(storage_slot: Field) -> [Field; N] {\n storage_read_opcode(storage_slot, N)\n}\n\nunconstrained fn storage_write<N>(storage_slot: Field, values: [Field; N]) {\n storage_write_opcode(storage_slot, values);\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext::new(PublicContextInputs::empty())\n }\n}\n\n// AVM oracles (opcodes) follow, do not use directly.\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeStorageAddress)]\nunconstrained fn storage_address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nunconstrained fn portal_opcode() -> EthAddress {}\n\n#[oracle(avmOpcodeFunctionSelector)]\nunconstrained fn function_selector_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(nullifier: Field, address: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<RET_SIZE>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<RET_SIZE>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode<N>(storage_slot: Field, length: Field) -> [Field; N] {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode<N>(storage_slot: Field, values: [Field; N]) {}\n\nstruct FunctionReturns<N> {\n values: [Field; N]\n}\n\nimpl<N> FunctionReturns<N> {\n pub fn new(values: [Field; N]) -> FunctionReturns<N> {\n FunctionReturns { values }\n }\n\n pub fn assert_empty(returns: FunctionReturns<0>) {\n assert(returns.values.len() == 0);\n }\n\n pub fn raw(self) -> [Field; N] {\n self.values\n }\n\n pub fn deserialize_into<T>(self) -> T where T: Deserialize<N> {\n Deserialize::deserialize(self.raw())\n }\n}\n"}}}
|
|
1
|
+
{"transpiled":true,"noir_version":"0.32.0+92ff2fa2e944722e5c3fa43fb3363f093b8f1d12","name":"GasToken","functions":[{"name":"set_portal","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/72WzW7TQBSFx0nTRKR14tAkzv+fx2mpWIKQkNiz5glAIIEELBAs4FF4B16kD8GeNRLbMufOz4njNpKlqiNNM75zvnvuzLjyZKquVMt0pWbKNURUrI7NT4T+QvmRGdRMj2IV+ZDGJKiadjJVlxGER2vz58ET5S0y1VDFBlVDvGSqUVYg47FVSM9Qn0Tb2muaUrS0tvXxmta25lLjqZkF3Qk1p8cyPMHQ9HiF+RSjpxHrqFsfkcUaEzHsbGVwbe3Vfm0aVFYBcWwU13sNplYB71Pm2LFWHavooNdCOjzGe48qPJ4WuWZThi23io4s8hwjLrK8+WitOJCtBleLRJLkMUa3Jnn+86pW3Kc2d7570wl2iyfYkRNsF08Qw4THlpjek2KeYXTbsfXk2HrwsAvpuoV0bNYNUt1UUlIsqcfXKMlU9Mr8PqQTxGe6ZoPqjNiZ1SR2KOh7hj3aFxSCPtE+0b5DXzPs0YGgEAyIDogOHPqFYY8OBYVgSHRIdOjQdwx7NBUUgpRoSjR16FuGPToSFIIR0RHRkUNfMuzRsaAQjImOiY4d+olhj04EhWBCdEJ0Yn8rI8btG8MenQoKwZTolOjUoV8Z9uhMUAhmRGdEZ+VCZ+EVOIAYtzcMe3QuKARzonOic4d+ZNijC0EhWBBdEF2UC12Et+YAYtyWDHt0KSgES6JLosuy2zJsS0VkXh0ZVEeG97KW9DBiNvs7wx5dCQrBiuiK6KrstgrncwAxbh8Y9uhaUAjWRNdE1w79zLBHN4JCsCG6IbopF7oJbhWR6b249Ksj8zsvzGz2D4Y9mgkKQUY0I5qV3bLwpldE0sOIfPb/8SOeCaj45a6Hi4lp2n/OTcajnWuKFitdtMpVyJhzBqvOKTrnZeDC3kgunP6R2TsoLiMRXiKELhX/tU9+uWAutZdtaWwnajaISe+Au9sF/i//7JS1V7BchJLionTYmy73Ru/dubgmXboU/v4Frb3PZTyQrkuTSLGZfXfCXc1qtCtHn0eOiIoXwjwUp1lcXiwuyXZnfFqItmKNY91S7vYydzuYi7V2k40NRukV+n+JxmtyCw0AAA==","debug_symbols":"7ZzRahtJEEX/Rc9mmVvd1dWdX1mWRUmcRWDkECsLi8m/rxSPxxZWEDHiSEPrTSPVTPUtcehhOMzj4vPtx+///L1af7l/WHz483Fxd/9puVndr7dHj4vhDw0/v334ulzvvnjYLL9tFh+S0nCzuF1/3n0s5cfN4svq7nZ7MNiPmzfVCmmsVrhP1fJyoNq9xljtxeylehgOVec0VeeSjlTX8DJW1zpor/qvm11c6ytu7iuu9xW39BU3+opb+4rb+LhhL3GPBYj6vP5oL1e2Fk/Lt2Hey9e8l2/zXn6a9/LzvJfv815+ufDllzQtv+wt/21tS22sbaUdqQ2v03XzS20epxLXqRyYyqVvsmeZSrr0ze88U7n0Tek8U7n0ve48U7n0LfQ8U7nuzIemct2ZD02lXqdyYCrX+5UDU8nHnzXE/lSeTrP3nZbed1p+32m/2EmmJ1PJ0tF/PA3PTZRyOfqPn/GpV46+4ta+4rau4vrQV1z1Fdf4uL+zF6vl5wBqr/Z5y+PW4mnuAfLcA/jcA5S5B4i5BzjJHcR0264UdS/AU5MGNCkD0UREEyOaJKJJJpo40aQQTYJoQhBfCOKDID4I4oMgPgjigyA+COKDID4I4oMgPgjiK0F8JYivBPGVIL4SxFeC+EoQXwniK0F8JYhvBPGNIL4RxDeC+EYQ3wjiG0F8I4hvBPGNIH77IAPpIqSLIV0S0iUjXRzpUpAugXSpSBeEfSHsC2FfCPtC2BfCvhD2hbAvhH0h7Ath3xD2DWHfEPYNYd8Q9g1h3xD2DWHfEPYNYT8h7CeE/YSwnxD2E8J+QthPCPsJYT8h7CeE/YywnxH2M8J+RtjPCPsZYT8j7GeE/YywnxH2HWHfEfYdYd8R9h1h3xH2HWHfEfYRXU+IrydE2BNi7AlR9oQ4e0KkPSHWnhBtT4i3J0TcE2LuCVH3hLh7QuQ9IfaeEH1PiL8nROATYvAJUfiEOHxCJD4hFp8QjU+IxydE5BNi8glR+YS4fEJkPiE2nxCdT4jPJ0ToE2L0CVH6hDh9QqQ+IVafEK1PiNdniNdniNdniNdniNdnQ0a6ONKlIF0C6VKRLgj7iNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdniNdnJ/H6PE8vtPVXr53ddXlb7bU+V3t7de1fvDMw0vS2rihxpLrW5mN1bWm/eswbneWtneVtfeU9if85p7zqLG/qLG/uLK93lrez+w3v7H7jJH51GaZ3rhavl5239ZX3JM75nPKqs7zWWd7UWd7cWV7vLG/pLG90k3d79O/y22r58e72YXvO7sfv60+b1f16PNz89/Xpl23t/w=="},{"name":"check_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"fee_limit","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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"},{"name":"_increase_public_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(internal)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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FRM/KiZ+VEz8qJj4UTHxo2LiR8XEj4qJ94qJ94qJ94qJ94qJ94qJ94qJ94qJ94qJ94qJ94qJj4qJj4qJj4qJj4qJj4qJj4qJj4qJr9i5WxU7d6ti525V7Nytip27VbFztyp27lbFzt2q2LlbFTt3q2LnblXs3K2KnbtVsXO3KnbuVsXO3arYuVsVO3erYuduVezcrYqdu1Wxc7cqdu5Wxc7dqti5WxU7d6ti525V7Nytip27VbFztyp27lbFzt2q2LlbFTt3q2LnblXs3K2KnbtVsXO3KnbuVsXO3arYuVsVO3erYuduV+zc7Yqdu/2FnTvz69vVNtedIDkuMXI/h7iNUbW4Mr5epNPHuvW50S5vRmfM51K775unLyRDa+3F4XWpdJymUj9NpXGaSudpKl2nqXSfptI8S6Vf2M39Fiu101R6mmckO80zkp3mGclO84xkp3lGsgc8I32Vf/5i28ZmntTMe8NmbtjMOzbzgc3csZkHNvOJzRyroR2roR2roQOroQOroQOroQOroQOroQOroQOroQOroQOroQOroY7VUMdqqGM11LEa6lgNdayGOlZDHauhjtVQx2poYDU0sBoaWA0NrIYGVkMDq6GB1dDAamhgNTSwGjqxGjqxGjqxGjqxGjqxGjqxGjqxGjqxGjqxGjqxGrqwGrqwGrqwGrqwGrqwGrqwGrqwGrqwGrqwGrqwGrqxGrqxGrqxGrqxGrqxGrqxGrqxGrqxGrqxGrqxGppYDU2shiZWQxOroYnV0MRqaGI1NLEamlgNTaqGZqNqaDaqhmajamg2qoZmo2poNqqGZqNqaDaqhmajamg2rIYaVkMNq6GG1VDDaugjuElfKXOshhpWQ7GcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspSiynKLGcosRyihLLKUospyixnKLEcooSyylKLKcosZyixHKKEsspsoYFFR2pU1X0SJ0qo0fqVB09UqcK6ZE6VUmP1KlSeqRO1dIjdaqYHqlz1RSLLDpS56opFlp0pM5VUyy26Eidq6ZYcNGROldNseiiI3WummLhRUfqXDXF4ouO1LlqigUYHalz1RSLMDpS56opFmJ0pM5VUyzG6Eidq6ZYkNGROldNsSijI3WummJhRkfqXDXF4oyO1LlqigUaHalz1RSLNDpS56opFmp0pM5VUyzW6Eidq6ZYsNGROldNsWijI3WummLhRkfqXDXF4o2O1LlqigUcHalz1RSLODpS56opFnJ0BOWqKRZz9DEoN3WummJJR0dQrppiWUdHUK6aYmlH1rC4oyN1rppigUdH6lw1xSKPjtS5aoqFHh2pc9UUiz06UueqKRZ8dKTOVVMs+uhInaumWPjRkTpXTbH4oyN1rppiAUhH6vfVdM97qfe0S+rDxydhPj8daZecIseLpFq79dmel9PHnXg+3f1WJu45L3mH2fV09Eu9/wY3CVXvvlevlde7tz3XO+/UG2v0y+n1Ykhun9474+n0zvHp6UvB/WwFj7MV7GcrOM5W8DxbwetsBe+zFZznKthaO03Bx1d/efund29/8+MPPx/XfPzDP7//7Yd3P71/+vLDX//4zz85zv4d"},{"name":"balance_of_public","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"}],"return_type":{"abi_type":{"kind":"field"},"visibility":"public"}},"bytecode":"H4sIAAAAAAAC/83YW2/rRBAH8E3itA1NHCd2mmvbtLFzT3NOKYgjKI8g8cojD4i7kLiJixBfkS8FO7M7+09qHVcrHVnHUmpnPD/P7tppM01VTamzQOntUtmNIipUJ3pXodfHSo70QVW/KqGqSCijk6SqmU1TNT6ixOBW/zjPlHFntffoRI2ukKoKpZ7UVcVUpHKqnvLhB/rVyGQ4p+Y8bQ36YXKInaU4oy/4id6/Y5JPbfJ5VjVBdQ52bnIa5pDpXwgLbTKlhCZoE7Rp6S8IC20xpYQWaAu0Zek3CAsNmVJCCBqChpb+ibDQNlNKaIO2QduW/oiw0IgpJUSgEWhk6a8IC+0wpYQOaAe0Y/Z50iwmutoUYaFdppTQBe2Cdi39GmGhMVNKiEFj0NjSrxAWmjClhAQ0AU0s/QlhoT2mlNAD7YH28svTc9U8SdOftIqJntN3CAu9YEoJF6AXoBeWfomw0D5TSuiD9kH7+YH23QNWQHS17xEWOmBKCQPQAeggX23gBlhAdLXfEBY6ZEoJQ9Ah6DBfbeh+x3iSrj9J/Enbn7T8SaeUKrE/aZYyl6iUgT1z9/UT/Q/CQkdMKWEEOgId5auN3DJ4kq4/6ZUysJY/if1JUgp5ZsX0U/AtwkLHTClhDDoGHeerjd1iFxBd7Q+EhU6YUsIEdAI6yVebuC8+niQupUrbn7RKmUtSChkWkxuKX+K7/yuGCl/45Rs+ZatMugB9xUBhu+RSl8elrgyemEM5Q83FFZKm6CFuTvjwxubf2h5lVuHEGYXoxSMemXcyXYrNMkm7RmFzomqCdFIqTGmvf1Sig2E9GfD7FTvbVyaH55gdtGkycm7dMKc65nSZqro63vgucHvHlewNqdnLNHiwE/MBlQs2Ds6bfZ4ExeRoSDKZqw+Dg5yauTNPx0vbtRkvreF1nQ8b9m2Qcjl1YzrJQJbXFPmI1sWt2C1WLD1esRmGl+oLfm4etZq95ZQ850nSpeZgc5OTmkPa50noT6Jiogf4O8JCF0wpYQG6AF3kqy3cb44Coqv9gLDQJVNKWIIuQZf5akv3J8iTdPzJ2J8k/iTyJ+Ebn76+Py8QFrpiSgkr0BXoKl9t5ap5kqY/ifxJWMpcYn+SlEKeWTH9FPyNsNA1U0pYg65B1/lqa/cp9SSjYqIHeIew0A1TStiAbkA3+Wobd2s9SeZPQn8S+ZO5P4n9ycKf9Eq5L2N/kpRyX8JS5vLMiunPzc8IC90ypYQt6BZ0m6+2df9r8iRjfxL6k87bOrDYn8zf1hXrlzKXyJ9s3vj09efmJcJCd0wpYQe6A93lq+3cn6gCQi1H9TP0HY8MFZoN6S4o23SxqbniYRd7x6XujkvtDd6ZQzlDjc0eSS/Rv9ybLvbe5r9ru9gH08U+UIhePOJPzTuZLpmHTNJeoLA5UTVBOikVaInvp/pKjwfDejJg7mJpto8YL3qy4LU92XRRtX0eN3YH+MS1lkT2PBVq2fZcym41c3FO22d2JVUjdN2jvlX1/55sZEwG0eCUD6f2rSn0xXGh0DS+lBYiu+KqBLaSTT8YoNobQMPa82MwlUFWHd+bsIyIMhrunyDTTFR1RoeDf+n1P22FxfXTHQAA","debug_symbols":"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"},{"name":"claim","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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"},{"name":"claim_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"},{"name":"leaf_index","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/+1da4hs2VXedaqr+lT37aqu7np2dfWjuk4/qrurbz/vnb7PuXPHSQYjvtAfEpzB+Ew0EpOYoGiCMIoKCsEIRjQokaD+UBIIQzA+QCSDgig+UNBfSgLiDxXGCBJrvfd5dN+c4aYYJBfq9jlnr2/vtddae5291z5nnaErOheW3eRf3/G/yVnoqvinAL/7To4mB8HkV6i6glyKoBBQQcRkrohHQDiDR5MWXAmPZqB2PCpN/psdTP5bOHfCwBB4gZrdXCS8VBxehH9z8F8UMA8Vow6yqAOlLhp1INwlqYvW/uNY+8VE+16rQ/zj5gw2b6U3hopbKOPhAhBMftUJDihqBSSswSX4bQLtLp0VmSXA1LATc0QqF2/A343JfxvWxYj7FGODyuYZMq/iY5qN+OGCIasqghsmAmja3UfNUgFKYMNQdev2EnV7iWHL3O0GdbsBl+CH3X5IZ0VmEzCNSMhqVRXUYpImoItAJ43V4S905tx0XiuaOAFhDC8bww1iuMFVNpnhFjHcgkvwQ4a/jc6EGcC0IiGrRSKrujU0qabI3AFN3U4b9FfqqsfqWko2EnA3W0lEwJ3jAhFwA0Tx2NMQFVcZVzXl1+2wZvSLagdLZgc1tYMSFSTtoGlibZFYWwxrs1g7JNYOXIIfivWddFa0PrpOJGTLZAfLcXUTTcA97jhtDJTVgs68ZHawTHZQk2qM4bYx3CGGO1xllxleIYZX4BL8kOEP05kwA5iVSMiWI5FV0xpaIcU3maZppx2zqSWh0LpayUYC7uZKEhFw57hABNwBUbzb0xAVLzJu0frfRLbhYgiYV8wsiiSZkD3OHIgg/BIcQenPIrMVdbEVc44F8kFFdmTz6GILfBZY0xNyvNvMm0+tlhUGNltDsf8SHF0UxDKN2jPcaknVDsBFBP4KHAGzvxqJ278Bp7+T5e1qcYe/ZHwuE1PLTNRgE2kWRLRoOQ1s8rfNXgXTjITMG/dUEPC4bBo1qHYZmPw4cmoMLRgYxFNH8Hzc7cBd6qehaZNRvayCQV+JXH4ajrIkuuS5jpJ60bq67leFu89GLD5Xg9PXVKI1k+hSXKLZXmLpSV7i8+YlbqS8BIu69hW5hj9ETj1nZ+BA7y9F8xQB3SMLr9od/rHdORa4JbpF/DUcZUnUcwaNkg5C9O4I/Hvh7h/Uf+D97ItZnrgZl2jHJNolprriGFiiPZJoj/3KCjb5BfMXNcb0IiHzHDIVBKyNntMWQPJdYPKfkFPv/upis4A2gm+Ywy2S7yl8zgYvyKhdVsGg80Iu/wOOsiTa8fx4ScdNW73068LdlyKxwubktBCqRJsm0U5coj2T6CoxtcpEfZboGkl0jafQfWiyMEtn0nfArEVCxqJuakHA2lhz2gJIfhV4/l/k1JtIGHhRHX5Nj5qxqeCy574SHkXvIMvm4LtZc+NuXCDLJvfuZZHbadKNMsHjcryFgt5cnNF4Rlxy8X9Ij+sQmnlp/1qeerS+Fauvl10fFlF9PTXkHo0Nqa+v9a1afbgyUupVJJnj+2NhNLRxY/dHHCl4f/xzOALCMep/1SRVs2EAwm8Sui13ELSjMzgym+epPpPZHLlD3cJpks4dOwFeXOaCCq7skLOKesYOdkhmGauKXSHsqk0/pP4WCSwp3CDORSdbnS2iaMWV2MgSeiNudpUdYRel6E1XPBMv69DAlQBK8G1wlJTgqtx/I54TuwZxBq1WErx/efIPqIiiTjfY0pcT/6BRolii22bJ67f8WyQKGLiLgVYHp/XEqdPTpThudRYPK9wLnNcU3g5HvmvMsv1KVZGVkvWWxInYpZITG13Sut+RrFvnA1lqq8dpvHll3UQPRLSuLccnbTxXqPPo4IlMIz6nqd6Z8WigvioaywJO2G6gN5m3G7Z5+TljMzQ2/8j5IYQwEUKwZosspMBgfStds46ukxmus+fY4PvEJt0nNnm4b6BwX6EzcRuA2dRF+qbTiuC2sQ5e5CewFGjn1A/5bBCkLzckncH0zdF4h+uG3FARrJkIoGla6DWoILnQ27JuD6nbQ4ZF3O1t6vY2XIIfdvvX6KzIbAJmOxKyzaoKapCkCegi0EljW/AXRPMR0/lmUSWH1RjDkTG8TQxvc5U7zPAuMQyhmB34IcOfpjNhBjC7kZBtRiKrLWtol1Z2W0yzZafb9Ffq2orVNUw2EnA3d5MIthApEAFvgyh+w3OuTrXdMN3hqR0OjX5T7WDL7GCodrBABUk72Dax7pBYd4RvFuseiXWP+7mLYv288b/FmL1IyAZkBwOzFaMJuLd7ThsDAexA5z9ndjAoqpkMTPkFYksY3iOG97jKETO8TwzvwyX4IcP/TGfCDGD2IyEbRCKrbWtov6Dq2afhIKd7ZsdiFlbXTrKRgLu5n0TIkOACEfAeiOIvUqvFTdbhZirqt0FjQOgHagfbZgc7agc3qCBpB3sm1hGJdSR8s1gPSKwH3M99FOt/Gf/bjDmIhCwiO4jitk40Aff2wGljIIARdP6LZgdRUc0kMuUXiC1h+IAYPuAqD5nhMTE8hkvwA4aDOToTZgBD8zsgiyKR1Z41NC6oesY0HOT0wOxYzMLqGiUbCbib4yRChgQXiIAPQBT/nQoJD1iHA1P+DTsceQ5T7WDP7GCkdjBPBUk7ODCxHpJYD4VvFusRifWI+zlGsa4b/3uMOYqEbLeqjnk/SRNwb4+cNgYCOJx0JvAW77tFNZNdU36B2BKGj4jhI67yJjN8TAwfwyX4IcPndCbMAOY4ErLdSGR1YA0dF1Q9xzQc5PTI7FjMwuo6TDYScDePkwgZElwgAj4CUWyl4nER6zDK3BA49Bym2sGB2cGh2sEKFSTt4MjEepPEelP4ZrGekFhPuJ/HKNYXjf8DxpxEQrZfVcc8TtIE3NsTp42BAG5C5x+YHewX1Uz2TfkFYksYPiGGT7jKU2b4jBiGldkp/JDhl+hMmAHMWSRk+5HI6sgaOiuoes5oOMjpidmxmIXVdTPZSMDdPEsiZEhwgQj4BETxDV5Amop3WYe7pvwVO7zpOUy1gyOzg5tqBzUqSNrBiYn1lMR6KnyzWM9JrOfczzMU6/uM/yPGnEdCNq6qYz5O0gTc23OnjYEATqHzP2B2MC6qmYxN+QViSxg+J4bPucoLZvgWMXwLLsEPGf45OhNmAHMrErJxJLI6sYZuFVQ9t2g4yOm52bGYhdV1mmwk4G7eSiJkSHCBCPgcRPHB1NJrn3W4r7sAELwIfsFsgcNgGAoRxz37B3AEhB/RuH6o65Mg5XXkzhFEsqdc9OYjWQu2BZpaeXFtWYQtXMoGQehiW5hFa6sY5yLM2t/lJWFW2CKklXOIUFl/FT3ZaX3V1PZB1kq8RvXVnCyDcRc4a2W9mFhZK7W/sI6kuAIa+JRFl3jrucLyw82T2V90FKIPPhNxzFtW4LX4JGC+rDF20FUFDRwUXUmGU+aYrKJbQAvUwwXVMQbIKcYhy4g5p1KYQ7VLwSIiqnqEG5aBRkCqdEnqL5rsMGasslsw2S3Grac49Eskdg9Ec5FsGHlbV3O2VzZ3FaScHzJ7PYRKSnaIKsLYh9CgUtHOyvsy2Mpk6uiiKhTPCVgpZY5gzNPlsgzCoc4ElrLiIIldG3+Pf1Lh1zuN8ofO35dP7LB6e7YNhh7bZYE2db+mmdqrlD1OgB7aZYG2suLDrfhOMUDfa5cF2tZgeNvbSjBom6HvtssC7eh2iLcL0Ynv1i5lQZr5IcvXQyYMnthlgXY1zusF6LvxPR2AbthlgdKOQtfFIuTehvMKQ3/QLgu0p3saPS9Yb9AeQ7/bLgt01SLtBl2N76UA9EfsskAp3AUEXkjM24bppyX7FUEmrb1slwVK+zYYaksF4JboEKHfa5cFuo5QDOoZdN2g62lG11UsOSHd6yETBr/fLguUnitaj0/iNgy6kW5tQyWZE9LND+lfD5n06V0uFliFIgqsAsGmF+4y6CZD32OXBTrQaJsXShwYdJBmdKD6ygnpXw8ZUkR+EIduaRjIW+JtGXSLoR+0ywIdIhSjqAYdGnSYZnSoersGMmnth+yyQCMNaHrBuMigEUPfZ5cFuq0hDi+8tm3Q7TSj26ryrz5k/XrIpE/fY5cFuoNQDF0adMegO+nWdrS1nJBefsjgeggMiOInbQqB/ch6TAHjhrr5PqlxxiaQHMrejTflBXb3rARDvk8K3mFU6JrgXfETTuMpoUsG70bWcGbAzY+rFT/msZVg+KIg2j/khQFO+Mo296rYxPXQ+QGWWRPcbuayB0smPfxW08ksEy9poHgptfe/yxztZkE280PW80N6+SGD/JBufkgrP6T91BmbqPS77LJA9/Shz73U+Nh1GvFPQ9r5IcP8kNX8kCg/ZCU/pJcf0p2KxKajlyd0f2JrH7DLAh0hFLdQDDoy6Cjd2kh9QU7Ian5IKz+klx8ynApj3fyQ5fyQRn5Icyrdb0+FsTcgsc5UVLkyFUtenQqknx+y9tS7D/OXmZ+0KRXO5XRKtZvYu4xkcjWKz0X3ddvEa8rbXD6wEtxjfNIGIu5MXbOBOPPjTvd0Zl1yA/HQGs7c9PP39mbe47GVYPhC9k3HcCpBR4x0ZsXaq/FJZ9l6Vs2Oj+9TtHff6c6sPK8/ypLnyN5BGTmNmcchM9dDYizp7i4GR4Vmju5yWfH3Q+IXVwT0JNxIJFfSpxPmTal3UfiC9va9juOSumlswfbmt7jYBg4Qn2LncCvKYLyXc0yHvnIN0soPaeeHbOaH9PND1vJDevkh3fyQ1fyQjanopfXUuz8xz5suto0IRWe6jXjmbYUa9Czd2pm2lhMyzA9p54e0ptKXfn7IxlQgT5DYxAp+1MW22HHTHKG4SWzQc4Oep1s711GaEzK4HjJhcGyXBXqBUCC4MOiFQS/SrV2oanNCTvJDWvkh7fyQzfyQfn7IWn5Ibyp6Wc0P2ZiKXlpT6csbkNhKfkg0lb603qwG05rKENt8s0pseyp9aU/Fkt9A9xv5IU+4JYF0Sp+0dcU9BDpbTMjqAahpjcpPnPlrVHqk61a8qdsEvqBDKYGFy20jurT1yR1ao95h+ru8Rr1Ha9R7jL2LHH+CzqS7gLkXCdkz1jAVBHQRCqWFS/i7ManpYx5bCYYvZNF7z3sYM+uZ08Saa7wjGzTec8cILuuSESC3sSu/D0fJx5cOmOx2xJJ0o6quCsfZ73odEAVAD+iNrDGfUkOvxhuq0oLW4VOLSl3QVg64JSb33xm7TQBg6zaawTjOZOlqJo+JAp+rNSbh9Blk8k/hKMlkKc7kcUFbAeA4xkLJqRSOCTYjfTP5cA3S9MGME0nRVZFBiS4LbExdzJJbSYlGNpjAv1+qwZTMYC7jBvPM0C+RZ6zQRNWD3zHyO0RzaaachrSmAunlh6xcD5kM+h+2ywK9i9A75BUEetegd9Ot3dU+5YR0p9JKeyqM9fNDBlOBvIG+nOWHrD91VU7M8/vsskDpDnM3fqe4Z9B76dbuqRhyQtrXQyYMvt8uC/Q+QoHgvkHvG/R+urX7OsBzQjbzQ7bzQzbyQ9r5IWfXQ6Cr5XeYv+8j0MVduWNqmjxdUo3+5OkBNvUg3tRDAt+nQymBG8pDI3pk943naGrxHNM/5snT8zR5et5ReoTHyPHLdCbdBczzkZA9aw1TQUAXoVBaeAR/Jxoof7vHVoJhvIdDb/sWDX+gshmZbB4kJk9Dv0T2DB6oSvYzVfKAm86EzFwPMf7ua7T+AVdyn+7rcAqx+BmKxQPVvE1eYeA/0q49tK49inft2aFfUmRJoTA1rvOckT9HNI9M6GlIKz+knR+ymR/Szw9Zyw/p5Yd080NW80M2pqKX1lS6fzqVVob/jyTWn4rBTMfGzqYyKgf5IedTUeXXfPLXfPJXW/urU5HYSn5INJW+tN6sBtOayhDbfLNKbHsqfWlPxZLfQPcbT/2WhO+6/pStG+4h0MWXBI6pabn4iGr0l4uPsanH8aa8xdnzVgILk+eN6AVbf7yFlotvYfq38nLxRVouQq6Dt8IPOf4QnUl3AfNiJGRfZw1TQUAXoVBaeAH+bkxqer/HVoJhXC5Cb+8FGkmFYOyM03gxCMELpltgdebKwOpxKrA6w0QkRWjFy0T82Nb3IN/LXVnswd8HW8mXk+HmeINejsdXjSe/hVk8rfCleRTgR+Eoma4M7kahZemEtz4wO9wsJIStZ73OjFlONTvcfFXfll3QV5LnA30Hed5pyraaQDQdq73EPJ96HA1b9l8HD7QhrEgTwhb1nWhOzwGHYUFfYknIA1/jwR7+rsvI7AryWDZ54Ku6SP17LiPfoMjD8g16me4WTAqcrU46sBTrQDX12kNFaIztuqrxs3E1Jl5x1yQDY00y0E29GKuJSSN+5dVPXdB3ltq5XZKXYi3b6OyfuVi2UUOuK8lrcRJL0AVklpK2a7kKmlYNPMyMKXRn/xKOkhoCaj9vZkljP01V7d84Sg07+3coBdgagTTPs/+qg7Vjg3U5Pli9/AE1YkqyYkuC+gq5p4rzEtTP/ovT5zXHjLGX/uuWcpoKRPcVyy2LIxqY/EfkNPWmdofFU9c7ST31FrCknujO6ikQUiaKf4ejTHs3MHRzbOCxSvQ/44PFtIVGXxLrRTMhB/J63IEYYqgk/5PlY7a0n+JjlkzxrBGRMIoe01NUs8zEG1k1MhNJto4pG/BbCzBswtmIbcLV4bSlZlK/8tlfL1NCYHmjq+76/D1h0+l2docxlr8ntCSPVCAZNU4SCTuAyXnkNJWiuc7iCfXdKE6R+9D8S49LEprGLMshDNNWlt7AkbVKmvNfHUI4uMoh7ChJlOUQtlMOoWW6q5im0W1jNRB1DbM07aUBrljqaEy5jkB4orMIAjtRfwkOIXw2yyGEV969vcRHQHRd4qPwodOHSOsumfgoMBOwZEUc5yi6eE6i8AI59dJ8GhjEE+hknF+CfMmcRo9LEprG/KUhzK0Ws/QGc4bFkliVjenwbVeN6ZGSfGPWmN5LjelF013RNI3GjdXAdySCLE17yWqKJb3fF3WAfQccgcDeHh/T78oa04lEpqem6TNiinUFD2Kipi8K8vgKzrLPscl3On0Os8OYi0jITswEqEAfnXTaAj5WDEy+jJx66XjiY/pEP+vBaZI+ZNbQY0ksmqYXdfi996oRCrORTimWSh5vFuEH4jcLQxwqyY/FSeyJEbQyfW24Y7o7tuTlaNxYzYfhKEvTXiqo45JO5451gEGGWEhbFf6MjmlItBT+smp6bJo+iWv63DR9UdbHbTAtFGv6dkGeHsIHim5hkx91mi2qzhh7NObM7v5UIHFL74EefAwKmPx55NR7f9nAi+oQ0JqI5uNmuD1uPTRNhzqmf/2qMb2SHtNkG795lW3cVJLfyvLeRynv7Y3pU0v4jcaN1cCE+yxL095z2Kf2cYpTHWDwbBJk5Qo/FZvOhX+S5b3P4pq+ZZq+TUyxruBxF9T0JWkallvwdBY+ABT+sdMHuOSRnstIyC5ssFNBwOrl1Z0YzW1g8jPIqZfwzcChOoRFPYLrlsA4TN3fQ6YO1ZFQzi7Mq74BCck0m3rP1oedQqxRnh+GMuyxy38FR1nzw2b8gwm4Hgr/1l2Rfx3IbD3UpvUQfnJAc6i3A0243ia6sjebbGtAxrKut7PXh15u8kagDcGp5bBvaRL3tq0Pva/LJOShi4jwC+6K9WHd5FHXgfdv8YEXl8eirtm99WHXpMATMumAZSdKpBhKpKLw2O6qGl+Pq1GNg3Ly65JkTj+FEKQ+SiHvh6aS0M24WEorpDEeAjGOSjFuHOYM4H4jH4XhuWSDVYwfB6mgCrKQC0oyHyex750gVr8g0/A+g2ETdFx2YjWgum7WRzP89TJ5Ixk6+E2QCub5nwiz0tFhCh/NqOxkfTQj8Y0ILz1/v6wPawDRGktlvSDJiHDgrmGT204TJc0xZj0Ssp5994IKNB2SpTzHNE7A5Cpymsrl1WTx9DTmyM5j6PQFyJBbL5rGi6rxo6s0jp8QiGsaZ3iV0/gMzxA1JbmIk1iOlTBmnJ6mV8qqMEyxhdVAoK+XpWkvA9cKabrNwFUEPuvoUyOV5zTnIyy9Kt+smg5S39aQCrPT3gPRdWnvK9/kNDtT00naeyHr2/C0fPh9l5kPv/ICcprKbKZp71XTfft0oPqEdirHnHx9o61+qZ2avYgTyPJLle+8xi+5V3CB+Br8/g/bvBpieXEAAA==","debug_symbols":"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"},{"name":"deploy","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"artifact_hash","type":{"kind":"field"},"visibility":"private"},{"name":"private_functions_root","type":{"kind":"field"},"visibility":"private"},{"name":"public_bytecode_commitment","type":{"kind":"field"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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+eFl/qXX9s8jzXxHWviOtPIdafvskZ7fZv+Wb3PhluHfZvyeb1O+59tM3/Nt4nu+zfw932b5nm+zfs+3ATwFyhBHF3TYh8qDaRyPT4/j+uUzyr8PbPvnoXbCQ8Xw3Yfajuby9jKT8vzviq7/Bul5/PHexy/3Pv507+PHvY8/3/v4y72Pv977+Nu9j7/f+vjzvW/d+d637nzvW3e+96073/vWne996873vnXne9+6871v3fnet+5y71t3ufetu9z71l3ufesu9751F+rn/rw8/wptXofT41M/96vHX6mfPPP2/Oy8x+nxqZ889eNTP3nqx6d+8tSPT+3368en9vv141M/96u/jV6pn/v141P7/erxN2q/Xz8+9a1bPz71rVs/PvWtWz8+9a1bPz71rVs/PvWtWz/+vW/d7d637nbvW3f//lv3nUk143KsIB3Xlz8e+vqTmH28ewHl7gVMdy8g7l7AfPcClrsXsPIU8DzSxnckxF05fr1qPb5uF774m8ryJd3rbVme0k3DwHio8bsPhfwFwDSUex9/uvfx497Hn+99/OXex1/vffzt3sffb338cbj38e996473vnXHe9+6471v3fHet+5471t3vPetO9771h3vfeuWe9+65d63brn3rVvufesiplH0PP69b91y71u33PvWLfe+dcu9b92J+rlf+yvhaaJ+7tePT/3kqf2l5DRRP3nqx6d+8tSPT/3kqR4/qP1+/fjUfr9+fOrnfu0Pfqagfu7Xjx/3Pj61368fn/rWrR+f+tatH5/61q0fn/rWrR5/pr5168envnXrx7/3rTvf+9aFTAHpePzvv3Xf+fPCYfv6c7DhJe1+/TnYvNy9gPXuBWx3L2C/eQHLcPcCxrsXULgLmLevAsafCvj10+uxem19HUo7HHfGMikVG0rFcruBn/44/Py/Q2430FAAtxtoKIDbDTQUwO0G6gWs3G6goQBuN9BQALcbqL9js3Lf8A0FcN/aDQUQ3cTPIxHdrc8jQW7L/fldSplL5UjjenzptZweaeM70v7dR4L+NQlk+k3H44/3Pn659/Gnex8/7n38+d7HX+59/PXex9/uffx737r7vW/d/d637n7vW3e/960LmXrT8fj3vnX3e9+6+71v3f3et+5+61s3hlvfujHc+taN4da3bgy3vnVjuPWtG8Otb90Ybn3rxnDrWzeGW9+6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ueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau75KDX3fJSaez5KzT0fpeaej1Jzz0epueej1NzzUWru+Sg193yUmns+Ss09H6Xmno9Sc89Hqbnno9Tc81Fq7vkoNfd8lJp7PkrNPR+l5p6PUnPPR6m556PU3PNRau55kZp7XqTmnhepuedFau55GUKqWiUvVaTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepueeT1NzzSWru+SQ193ySmns+DSFVrZKXmqTmnk9Sc88nqbnnk9Tc80lq7vkkNfd8kpp7PknNPZ+k5p5PUnPPJ6m555PU3PNJau75lGo29lCW49RlPa83043bUm+m5/LjqMep5/G83kxP5pZ6Mz2bW+rN9HRuqTdT1m2oN9U05ZZ6U92/DfWmun8b6s2UeVvqDbF6xfxVqsnKLfXe1l8dFdzWMR0VUHugxznKfBxk2JbKT931137Wyz0F+QP1UnugD9RL7YE+UC+1B/pAvSFWL7UH+kC91B7oA/VSe6AP1EvtmD5Qr5i/4p6M/IF6xfwV93TkD9Qr5q+4JyR/oF4xf8U9JfkD9Yr5K+5JyR+oV8xfcU9L/kC9Yv6Ke2LyB+oV81fcU5M/UK+Yv+KenPyBesX8Fff05A/UK+avuOfOvlvvvOw/Pj2vw3m9qe6jhnpTPa/m7fnpeY/zelM9rxrqTfW8qtfLPaX0A/Wm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5q9y7QFrqFfMX+Xae9VQr5i/yrXnqaFeMX+Va69RQ71i/irXHp+GesX8Va69NQ31ivmrXHtaGuoV81e59pI01Cvmr3Lt4WioV8xf5do70VCvmL/KtWehoV4xf5Vrr0BDvWL+KteM/oZ6xfxVrln6DfWK+atcM+8b6hXzV7lm0zfUK+avcs2Qb6hXzF/lmvXeUK+YvxKb376KzW9fxea3r2Lz21ex+e2r2Pz2VWx++yo2v30Vm9++is1vX8Xmt69i89tXsfntq9j89lVsfvsqNr99FZvfvorNb9/E5rdvYvPbN7H57ZvY/PZtCLF6tfzVJja/fROb376JzW/fxOa3b2Lz2zex+e2b2Pz2TWx++yY2v30Tm9++ic1v38Tmt29i89s3sfntm9j89k1sfvsmNr99E5vfvonNb9/E5rdvYvPbN7H57ZvY/PZNbH77Jja/fROb376JzW/fxOa3b2Lz2zex+e2b2Pz2TWx++yY2v30Tm9++ic1v38Tmt29i89s3sfntm9j89k1sfvsmNr99E5vfvonNb9/E5rdvYvPbN7H57ZvY/PZNbH77Jja/fROb376JzW/fxOa3b2Lz2zex+e2b2Pz2TWx++yY2v30Tm9++ic1v38Tmt29i89s3sfntm9j89k1sfvsmNr99E5vfvonNb9/E5rdvYvPbN7H57ZvY/PZNbH77Jja/fROb376JzW/fxOa3b2Lz2zex+e2b2Pz2TWx++yY2v30Tm9++ic1v38Tmt29i89s3sfntm9j89k1sfvsmNr99E5vfvonNb9/E5rdvYvPbN7H57bvY/PZdbH77Lja/fReb374PIVavlr/axea372Lz23ex+e272Pz2XWx++y42v30Xm9++i81v38Xmt+9i89t3sfntu9j89l1sfvsuNr99F5vfvovNb9/F5rfvYvPbd7H57bvY/PZdbH77Lja/fReb376LzW/fxea372Lz23ex+e272Pz2XWx++y42v30Xm9++i81v38Xmt+9i89t3sfntu9j89l1sfvsuNr99F5vfvovNb9/F5rfvYvPbd7H57bvY/PZdbH77Lja/fReb376LzW/fxea372Lz23ex+e272Pz2XWx++y42v30Xm9++i81v38Xmt+9i89t3sfntu9j89l1sfvsuNr99F5vfvovNb9/F5rfvYvPbd7H57bvY/PZdbH77Lja/fReb376LzW/fxea372Lz23ex+e272Pz2XWx++y42v30Xm9++i81v38Xmt+9i89t3sfntu9j89l1sfvsuNr99F5vfvovNb9/F5rfvYvPbd7H57bvY/PZdbH77rjW/fR205rc/6pXyV496pfzVo14pf/WoN8TqlfJXj3ql/NWjXil/9ahXyl896hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+Yv9Ka3/6oV8xfac1vf9Qr5q+05rc/6hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+Yv9Ka3/6oV8xfac1vf9Qr5q+05rc/6hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+Yv9Ka3/6oV8xfac1vf9Qr5q+05rc/6hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+Yv9Ka3/6oV8xfac1vf9Qr5q+05rc/6hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+Yv9Ka3/6oV8xfac1vf9Qr5q+05rc/6hXzV1rz2x/1ivkrrfntj3rF/JXW/PZHvWL+Smt++6NeMX+lNb/9Ua+WvxrF5rePYvPbR7H57aPY/PbHR8Tq1fJXo9j89lFsfvsoNr99FJvfPorNbx/F5rePYvPbR7H57aPY/PZRbH77KDa/fRSb3z6KzW8fxea3j2Lz20ex+e2j2Pz2UWx++yg2v30Um98+is1vH8Xmt49i89tHsfnto9j89lFsfvsoNr99FJvfPorNbx/F5rePYvPbR7H57aPY/PZRbH77KDa/fRSb3z6KzW8fxea3j2Lz20ex+e2j2Pz2UWx++yg2v30Um98+is1vH8Xmt49i89tHsfnto9j89lFsfvsoNr99FJvfPorNbx/F5rePYvPbR7H57aPY/PZRbH77KDa/fRSb3z6KzW8fxea3j2Lz20ex+e2j2Pz2UWx++yg2v30Um98+is1vH8Xmt49i89tHsfnto9j89lFsfvsoNr99FJvfPorNbx/F5rePYvPbR7H57aPY/PZRbH77KDa/fcw133uO49TbVPna75xjmqb5x4enaXshOZS/+ZUfX+FZYRnWV3br2Vcu8/GVt8pXnpf9x2fndTjXPpUXsfZvaZ/Kl1n7t7QPay+rfSq/bu3f0j5VdrH2b2mfKsdZ+7e0T5Vprf1b2qf6/Ym1f0P7kmuXirV/S3v39XS1d18vqfbL8PzCSynn2ruvp6t9WHtZ7d3X09Xefb2sXm//0n461959PV3t3dfT1d59PVntc+3ws/Zvae++nq727utl1X57fnbe41x79/V0tQ9rL6u9+3q62ruvp6u9+3q62ruvp6u9+3qy2ufaHW3t39LefT1d7d3X09XefT1d7cPay2rvvp6u9u7r6Wrvvp6u9u7r6Wrvvp6s9pP7errau6+nq737errau6+nq31Ye1nt3dfT1d59PV3t3dfT1d59PV3t3deT1T7c19PV3n09Xe3d19PV3n09Xe3D2stq776ervbu6+lq776ervbu6+lq776erPaz+3q62jvfd9V+3GN7nnnfJ6T21b0Zc1h7We2d73W1d77X1d75Xld753td7Z3vZbVfnO91tfff7ehq77/b0dXefT1d7cPa59S+vhtxcV9PV3v39XS1d19PV3v39bJ6veqOtMV9PVntV/f1dLV3X09Xe/f1dLV3X09X+7D2SbWv/p3u6r6ervbu6+lq776ervbu6+lq776erPab+3q62ruvp6u9+3q62ruvp6t9WHtZ7d3X09XefT1d7d3X09XefT1d7d3Xk9V+d19PV3v39XS1d19PV3v39XS1D2svq737errau6+nq737errau6+nq737eqraT4P7errau6+nq737errau6+nq31Ye1nt3dfT1d59PV3t3dfT1d59PV3t3deT1X50X09Xe/f1dLV3X09Xe+d7vPbI7RbT6BTOrpCzMrtCTrTsCjl3kitUnA7ZFXKGY1fISYtdIf+dA7tCYYXIFXJPgV0h9xS6KlTdcTYV9xTYFXJPgV0h9xTIFZrcU+jrFGo7eKbJPQV2hdxTYFfIPQV2hcIKkSvkngK7Qu4p9FWo+rc+k3sK7Aq5p8CukHsK5AqFewrsCrmnwK6QewrsCrmnwK5QWCFyhdxTYFfIPQV2hdxTYFfIPQV2hdxTIFdodk+BXSH3FNgVck+BXSH3FNgVCitErpB7CuwKuafArpB7CuwKuafArpB7CuQKLe4psCvkngK7Qu4psCvkngK7QmGFyBVyT4FdIfcU2BVyT4FdIfcU2BVyT4FcodU9BXaF3FNgV8g9BXaF3FNgVyisELlCzkMt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DVzpU7pr4Eqf0l0DV8rDXQNXysNdA5d6DvcMXOo53DFw8pWwJwxcKQ93DezmtJJvhT1h4HbVgZ8jXNY7PUfI7Ya2eb2P8PW/3/1ntz7e9Doe/EeX2wvJx83thOTj5vZB6nGTL26Vj5vbA8nHze2A5OPm9j/ycZvXuLmdknxcL1eVfGOrfFwvV5V8X6t63OTrWuXjermq5Mta5eN6uaq1eY3r5aqSL+KVj+vlqlYvV5V8y7J63ORLluXjermq5CuW5eN6uarkC5bl43q5quTrleXjermq5MuV5eN6uarkq5Xl43q5quRrmOXjermq5Cub5eN6uarkC5vl43q5quTrmuXjWrmqIfmuZvm4Vq5qSL6nWT6ulav6GsZrXCtXNSTfzywf18pVDcl3M8vH9XJVyfcyy8f1clXJdzLLx/VyVcn3McvH9XJVyXcxy8f1clXJ9zDLx/VyVcl3MMvH9XJVyfcvy8f1clXJdy/Lx/VyVcn3LsvH9XJVyXcuy8f1clXJ9y3Lx/VyVcl3LcvH9XJVyfcsy8f1clWTl6uavFxV8g3a8nG9XFXzclXNy1Ul340uH9fLVSXfiy4f18tVJd+JLh/Xy1Ul34cuH9fLVSXfhS4f18tVJd+DLh/Xy1Ul34EuH9fLVXntVh+8dqsPXrvVB6/d6oPXbvXBa7f64LVbffDarT547VYfvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFrt/rgtVt98NqtPnjtVh+8dqsPXrvVB6/d6oPXbvXBa7f64LVbffDarT547VYfvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qo9du9dFrt/rotVt99NqtPt6a17hWrmr02q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrt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3HbEb2474je3HfGb2474zW1H/Oa2I35z2xG/ue2I39x2xG9uO+I3tx3xm9uO+M1tR/zmtiN+c9sRv7ntiN/cdsRvbjviN7cd8ZvbjvjNbUf87rYjfnfbEb+77Yjf3XbE77fmNrCZ09rddsTvbjvid7cd8bvbjvjdbUf87rYjfnfbEb+77Yjf3XbE72474ne3HfG724743W1H/O62I3532xG/u+2I3912xO9uO+J3tx3xu9uO+N1tR/zutiN+d9sRv7vtiN/ddsTvbjvid7cd8bvbjvjdbUf87rYjfnfbEb+77Yjf3XbE72474ne3HfG724743W1H/O62I3532xG/u+2I3912xO9uO+J3tx3xu9uO+N1tR/zutiN+d9sRv7vtiN/ddsTvbjvid7cd8bvbjvjdbUf87rYjfnfbEb+77Yjf3XbE72474ne3HfG724743W1H/O62I3532xG/u+2I3912xO9uO+J3tx3xu9uO+N1tR/zutiN+d9sRv7vtiN/ddsTvbjvid7cd8bvbjvjdbUf87rYjfnfbEb+77Yjf3XbE72474ne3HfG724743W1H/O62I3532xG/u+2I3912xO9uO+J3tx3xu9uO+N1tR/xutiN+vZntiP8a2MtpfQ3s5bS+BvZyWl8DN7eBvZzW18BeTutrYC+n9TWwl9P6GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjNaZntiP8a2M1pme2I/xrYzWmZ7Yj/GtjMaQ1uO+IHtx3xg9uO+MFtR/zXa9wGNnNag9uO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"},{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/+2b0W7aMBSGHRq6tGlTSAiBQgt0baXdpazt6N1eZnvuXU/aOwwHH/HXdZDRjmcsEQnFie3zf/6PbdIqRGJzJOtPpMpddT4VHw9q812d6387nhhj1S45o0A4O4FwngTCGTNyRgZOeY5VWa47ueY+ic16/FCJnWWiT6Be7AqkqyaqkGh1bKNd1W+nIIDwQsHHqo7Okfqkqh4BUzXYph3cowF34B5pncA92slIK1HmOBj3S7LF5o29no1yLGcqFvGnUMa6KVgYOxxr181Yn53laO2jwxw1q5zy0FWxE7imnJyDPuO3yxPqU+xzbX7EUJ5AW2pHbTrAK49LsV1L5zv6xVq/DNqcQr9E60fXlHfpV1+V5bmbbNtSfEc+1jJ26ib2uxzFmocpjC0Dfb45ulxJjQvx/oi0a/xiyYDp0gnTZk26Ge8ml1cQm+8p6eVZxutpvl1ovmXQ5gq87DnyMgJtYqLrXos+nyevKxmvb+FJ38DU9+BJv0Wf0ZM3GS+38CQ3MOUePMlb9Pk8+fZVxissPCkMTIUHT4oWfT5Pls3zw8DCk4GBaeDBk0GLPuPaaeZJaeFJaWAqPXhStugzevJTxhtaeDI0MA09eDJs0Wf05IeMV1l4UhmYKg+eVC36jHts83wysvBkZGAaefBk1KLP6MlSxhtbeDI2MI09eDJu0WdcO43+tYUn1wamaw+eoOY+3INAuatAuYsD4db1GddOs8dOLDyZGJgmHjxBzX24ywPh1vUZc/ki400tPJkamKYePEHNfbjzQLmLQLmHgXKXgXJXgXIfyvzW9Rmfv5s99sbCkxsD040HT1BzH+48UO5JoNzFgXDr+oxrp/n/4K2FJ7cGplsPnqDmPtyjQLn7B8Kt6zPOwVcZb2bhyczANPPgCWruwz0OlLsKlHsSKHcRKPcwUO4yUO7juvy/3PmBcMt79L7PH+dMy7dUYyINoXEKjTOFcgacc4jRZeOsa8zVHPQWTnzZ5EqfP3S9cK6/XMnYnx2NTca+dxO7+ZvjQcWidxrvDb49gn7EnLcHLTZpPUAuqfwb2lI7akP7BfHL99nuVPlxR7+Z1i+DNnfQ717rR9eUd+nfL1V2Odds5npPbNf5F2BytFc+4/vLAjSExknHDJjmbpieHI63xncaheBdjwvNszPNswza4F7uc289ch+5bbjxOeQM7lH9HO51tPHgb0UWEOMv7Ab1lOo2AAA=","debug_symbols":"ndpBattQGIXRvWgciu9v6T0pWymlOIlTDMYOsVMoJnuv3NIF9Mz0JN3ZNzq82/Cyf/r48f1wej1fhsevt+F4ft5dD+fTeroNmy81/3l7edud7i8u1937dXjctv4w7E8v61Ovz4fh9XDcr8+b+vz2cB8tMNpuZBQZlYy2MhplNMmoyajLSIrYShGjFDFKEaMUMUoRoxQxShGjFDFKEaMUMUoRkxQxSRGTFDFJEZMUMUkRkxQxSRGTFDFJEU2KaFJEkyKaFNGkiCZFNCmiSRFNimhSRJciuhTRpYguRXQpoksRXYroUkSXIroUMUsRsxQxSxGzFDFLEbMUMUsRsxQxSxGzFLFIEYsUsUgRixSxSBGLFLFIEYsUsUgRixSRzYZWoVXRakurkVYTrRqtOq1mWlEboTZCbYTaCLURaiPURqiNUBuhNkJtFLVR1EZRG0VtFLVR1EZRG0VtEGiGRDNEmiHTDKFmSDVDrBlyzRBshmQzRJsh2wzhZkg3Q7wZ8s0QcIaEM0ScIeMMIWdIOUPMGXLOEHSGpDNEnSHrDGFnSDtD3BnyzhB4hsQzRJ4h8wyhZ0g9Q+wZcs8QfIbkM0SfIfsM4WdIP0P8GfLPEICGBDREoCEDDSFoSEFDDBpy0BCEhiQ0RKEhCw1haEhDQxwa8tAQiIZENESiIRMNoWhIRUMsGnLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0bKLnuSiRS5a5KJFLlrkokUuWuSi9d8uup5+7t4Pu6fj/n639/7x4/T876rverz+evv7Zf33Nw=="},{"name":"mint_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/+2aWW/jNhDH5StOE6/XSRPftyXbm/jKOnZ3m6YPfS7Qh770sQV6Ar3Q8zv26/S5aDkzHP7lKPGCi1YIijWgiBr+fxxyKIkaImGQC4LDfGB+ncD+zNVhUA4OzClDx/uBlkwha45MOcioKaJKorKRlQU5LpEwzyXjISgMzZ/jTaDOuPmgYI6DMCj8fednzEVRFOkoclEvDwfUwAmVthntc5l6Le2Voc44L0XrycodR60IcOj6pleFkILDIz6KVG0qc7Z4RH9EQ+29FaIGnoKYx2PxdCxHzrqiZkpR1laU0GBJNEdSpHMSye9Hdrqkg3lyk49pqL0nyf7S76n09ykdBS6W7GU5lBCeFPhcthNSESfvmePMRewUETvbjdjb6N6ZafBjcz4X8akVV3mQ51QCVhXNmRQZ/QVmRWuMkqAGtAa0ZtEfYFa0zigJ6kDrQOsW/QlmRRuMkqABtAG0YdHPYFa0ySgJmkCbQJsW/QpmRVuMkqAFtAW0ZdEvYFa0zSgJ2kDbQNsW7cOsaIdREnSAdoB2LPozzIp2GSVBF2gXaNei38KsaI9REvSA9oD25JxEav5I1R9p70fMmFYwK9pnlAR9oH2g/aS3vvO2BzHevodZ0QGjJBgAHQAdJL0NXAQ9kao/0vZHGv5INxXkFREz8/M7zIoOGSXBEOgQ6DDpbeie4j2I8fY5zIqOGCXBCOgI6MiiC5gVDRklQQg0BBomOxq6KfZEzv2Rqj9S80fq/kjDH2n6I61U5qXjj3RTmZdqKmN5RcTMc/MdzIpGjJIgAhoBjSz6K8yKjhklwRjoGOg42dGxG5snUvVH2o+1Yw1/pP4YImbugi9hVnTCKAkmQCdAJ0lvEzcmT6Tmj4T+SHs/YsJwBbOiU0ZJMAU6BTpNepu6JWsPQktv5iPkM7cMBkhiNGshNT+MwoacjunvGbt6tuvqQuCpFLWGEqYLiGbIi+YHXJxb/cIEghTLDAuXZKKDe/yhXOlwiVlGKruEY6nIipEq1cOMzn3T0gexbt3pMKfcNNpb9Be5XvnBXK8yydr8kRPGGHzgUlZCLngon1BpG8vSc9I4yy4iG8mgVHZZaeX+bYSyKAgtyzZCxV6Ko093Hck2ArdXhjrjvBBY4UmmikOxqoOiYHlbG9vBsC2o6yK3ULQtVALXvN2pUIz0BexsxLpULDhRAfdpe2cuSg/OxUUYr8lZ5yS6dC/LS8gv8XhcPoRUU0Fa/ki4HzHP048wKzpzT8cs9lQCnSW9zdyYPJF2Kl5qqXSs4Y8MU0FeYyyD/Yi5cb6BWdE5o/weBToHOk96m7sp3YMYb1/DrOiC0bmsC4ougC6S3hYuHJ5IbT9iOvgbzIrKKkOCJdAl0GXS29I96J5I3R8Z+yNdf6Tmjwz2I1SdDfDe7zB4z/fJcuf7ZLn7fbJiV6tdV1cCL6WoNXS/XEG0xvpxLav3tdVv7PfJVr5PtmSig9fav+RKh0vMNlLZcziWiqwYqVI9rOncNy39GevWnQ6775MONrxXLjYFxGZ15/skjNfk7MK6clNyfO+UrKzre5H8fgT9W7oN+ZVtZCnrO13SdntettlJdSJPm36erd3QrjC09e7QnofxmpyNFAfTba1cQ34tmjWCnkSq/kjNH6n7Iw1/pOmPtPyRtj/S8Ue6qcxLNZXh91Lx0v8fRayRyg2Tzj02SOWpHPojo1Sm8s07+c07+b+e/U4qEQv9kSiVsVQf6w1TTeURqz/WiI1TGUstlTv5NYY/+deXJFpKcz3kDbcMBrspQWDVki6upcV4urhhV5tdV7HkbIsaSky2EL1A/vFS0sWXVv+uTRdvJF28IRMd3OO2XOlwibmJVPYOHEtFVoxUqR5e0Llvrk9j3brTYU4XabS3WfyDmaRauq1LQSjet9mdf3CDtZzYYM1bkUSRvGwg3yC/p/ieTTXZo/NqRA7rf9DxD/Dv8iGuJwAA","debug_symbols":"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"}],"outputs":{"globals":{"storage":[{"fields":[{"name":"balances","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000001"}}],"kind":"struct"}},{"name":"portal_address","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000002"}}],"kind":"struct"}}],"kind":"struct"}]},"structs":{"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}}],"kind":"struct","path":"GasToken::balance_of_public_parameters"}},{"name":"return_type","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::balance_of_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_parameters"}}],"kind":"struct","path":"GasToken::claim_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::set_portal_parameters"}}],"kind":"struct","path":"GasToken::set_portal_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::mint_public_parameters"}}],"kind":"struct","path":"GasToken::mint_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"artifact_hash","type":{"kind":"field"}},{"name":"private_functions_root","type":{"kind":"field"}},{"name":"public_bytecode_commitment","type":{"kind":"field"}},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::deploy_parameters"}}],"kind":"struct","path":"GasToken::deploy_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"fee_limit","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::check_balance_parameters"}}],"kind":"struct","path":"GasToken::check_balance_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::_increase_public_balance_parameters"}}],"kind":"struct","path":"GasToken::_increase_public_balance_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}},{"name":"leaf_index","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_public_parameters"}}],"kind":"struct","path":"GasToken::claim_public_abi"}]}},"file_map":{"100":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/public_context.nr","source":"use crate::hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier};\nuse dep::protocol_types::address::{AztecAddress, EthAddress};\nuse dep::protocol_types::constants::MAX_FIELD_VALUE;\nuse dep::protocol_types::traits::{Serialize, Deserialize, Empty};\nuse dep::protocol_types::abis::function_selector::FunctionSelector;\nuse crate::context::inputs::public_context_inputs::PublicContextInputs;\nuse crate::context::gas::GasOpts;\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs) -> Self {\n PublicContext { inputs }\n }\n\n pub fn emit_unencrypted_log<T, let N: u32>(_self: &mut Self, log: T) where T: Serialize<N> {\n emit_unencrypted_log(Serialize::serialize(log).as_slice());\n }\n\n pub fn note_hash_exists(_self: Self, note_hash: Field, leaf_index: Field) -> bool {\n note_hash_exists(note_hash, leaf_index) == 1\n }\n\n pub fn l1_to_l2_msg_exists(_self: Self, msg_hash: Field, msg_leaf_index: Field) -> bool {\n l1_to_l2_msg_exists(msg_hash, msg_leaf_index) == 1\n }\n\n fn nullifier_exists(_self: Self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n nullifier_exists(unsiloed_nullifier, address.to_field()) == 1\n }\n\n fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field\n ) {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n sender,\n self.chain_id(),\n /*recipient=*/ self.this_address(),\n self.version(),\n content,\n secret_hash\n );\n let nullifier = compute_message_nullifier(message_hash, secret, leaf_index);\n\n assert(\n !self.nullifier_exists(nullifier, self.this_address()), \"L1-to-L2 message is already nullified\"\n );\n assert(\n self.l1_to_l2_msg_exists(message_hash, leaf_index), \"Tried to consume nonexistent L1-to-L2 message\"\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0);\n }\n\n fn message_portal(_self: &mut Self, recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg(recipient, content);\n }\n\n fn call_public_function<let RETURNS_COUNT: u32>(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let results = call(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n let data_to_return: [Field; RETURNS_COUNT] = results.0;\n let success: u8 = results.1;\n assert(success == 1, \"Nested call failed!\");\n\n FunctionReturns::new(data_to_return)\n }\n\n fn static_call_public_function<let RETURNS_COUNT: u32>(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let (data_to_return, success): ([Field; RETURNS_COUNT], u8) = call_static(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n\n assert(success == 1, \"Nested static call failed!\");\n FunctionReturns::new(data_to_return)\n }\n\n fn delegate_call_public_function<let RETURNS_COUNT: u32>(\n _self: &mut Self,\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args: [Field]\n ) -> FunctionReturns<RETURNS_COUNT> {\n assert(false, \"'delegate_call_public_function' not implemented!\");\n FunctionReturns::new([0; RETURNS_COUNT])\n }\n\n fn push_note_hash(_self: &mut Self, note_hash: Field) {\n emit_note_hash(note_hash);\n }\n fn push_nullifier(_self: &mut Self, nullifier: Field, _nullified_commitment: Field) {\n // Cannot nullify pending commitments in AVM, so `nullified_commitment` is not used\n emit_nullifier(nullifier);\n }\n\n fn this_address(_self: Self) -> AztecAddress {\n address()\n }\n pub fn storage_address(_self: Self) -> AztecAddress {\n storage_address()\n }\n fn msg_sender(_self: Self) -> AztecAddress {\n sender()\n }\n fn selector(_self: Self) -> FunctionSelector {\n FunctionSelector::from_u32(function_selector())\n }\n fn get_args_hash(self) -> Field {\n self.inputs.args_hash\n }\n fn transaction_fee(_self: Self) -> Field {\n transaction_fee()\n }\n\n fn chain_id(_self: Self) -> Field {\n chain_id()\n }\n fn version(_self: Self) -> Field {\n version()\n }\n fn block_number(_self: Self) -> Field {\n block_number()\n }\n fn timestamp(_self: Self) -> u64 {\n timestamp()\n }\n pub fn fee_per_l2_gas(_self: Self) -> Field {\n fee_per_l2_gas()\n }\n pub fn fee_per_da_gas(_self: Self) -> Field {\n fee_per_da_gas()\n }\n\n fn l2_gas_left(_self: Self) -> Field {\n l2_gas_left()\n }\n fn da_gas_left(_self: Self) -> Field {\n da_gas_left()\n }\n\n fn raw_storage_read<let N: u32>(_self: Self, storage_slot: Field) -> [Field; N] {\n storage_read(storage_slot)\n }\n\n fn storage_read<T, let N: u32>(self, storage_slot: Field) -> T where T: Deserialize<N> {\n T::deserialize(self.raw_storage_read(storage_slot))\n }\n\n fn raw_storage_write<let N: u32>(_self: Self, storage_slot: Field, values: [Field; N]) {\n storage_write(storage_slot, values);\n }\n\n fn storage_write<T, let N: u32>(self, storage_slot: Field, value: T) where T: Serialize<N> {\n self.raw_storage_write(storage_slot, value.serialize());\n }\n}\n\n// Helper functions\nfn gas_for_call(user_gas: GasOpts) -> [Field; 2] {\n // It's ok to use the max possible gas here, because the gas will be\n // capped by the gas left in the (STATIC)CALL instruction.\n [\n user_gas.l2_gas.unwrap_or(MAX_FIELD_VALUE),\n user_gas.da_gas.unwrap_or(MAX_FIELD_VALUE)\n ]\n}\n\n// Unconstrained opcode wrappers (do not use directly).\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/6420): reconsider.\nunconstrained fn address() -> AztecAddress {\n address_opcode()\n}\nunconstrained fn storage_address() -> AztecAddress {\n storage_address_opcode()\n}\nunconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\nunconstrained fn portal() -> EthAddress {\n portal_opcode()\n}\nunconstrained fn function_selector() -> u32 {\n function_selector_opcode()\n}\nunconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\nunconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\nunconstrained fn version() -> Field {\n version_opcode()\n}\nunconstrained fn block_number() -> Field {\n block_number_opcode()\n}\nunconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\nunconstrained fn fee_per_l2_gas() -> Field {\n fee_per_l2_gas_opcode()\n}\nunconstrained fn fee_per_da_gas() -> Field {\n fee_per_da_gas_opcode()\n}\nunconstrained fn l2_gas_left() -> Field {\n l2_gas_left_opcode()\n}\nunconstrained fn da_gas_left() -> Field {\n da_gas_left_opcode()\n}\nunconstrained fn note_hash_exists(note_hash: Field, leaf_index: Field) -> u8 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\nunconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\nunconstrained fn nullifier_exists(nullifier: Field, address: Field) -> u8 {\n nullifier_exists_opcode(nullifier, address)\n}\nunconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\nunconstrained fn emit_unencrypted_log(message: [Field]) {\n emit_unencrypted_log_opcode(message)\n}\nunconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: Field) -> u8 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\nunconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\nunconstrained fn call<let RET_SIZE: u32>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_opcode(gas, address, args, function_selector)\n}\nunconstrained fn call_static<let RET_SIZE: u32>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_static_opcode(gas, address, args, function_selector)\n}\n\nunconstrained fn storage_read<let N: u32>(storage_slot: Field) -> [Field; N] {\n storage_read_opcode(storage_slot, N as Field)\n}\n\nunconstrained fn storage_write<let N: u32>(storage_slot: Field, values: [Field; N]) {\n storage_write_opcode(storage_slot, values);\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext::new(PublicContextInputs::empty())\n }\n}\n\n// AVM oracles (opcodes) follow, do not use directly.\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeStorageAddress)]\nunconstrained fn storage_address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nunconstrained fn portal_opcode() -> EthAddress {}\n\n#[oracle(avmOpcodeFunctionSelector)]\nunconstrained fn function_selector_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(nullifier: Field, address: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<let RET_SIZE: u32>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<let RET_SIZE: u32>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode<let N: u32>(storage_slot: Field, length: Field) -> [Field; N] {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode<let N: u32>(storage_slot: Field, values: [Field; N]) {}\n\nstruct FunctionReturns<let N: u32> {\n values: [Field; N]\n}\n\nimpl<let N: u32> FunctionReturns<N> {\n pub fn new(values: [Field; N]) -> FunctionReturns<N> {\n FunctionReturns { values }\n }\n\n pub fn assert_empty(returns: FunctionReturns<0>) {\n assert(returns.values.len() == 0);\n }\n\n pub fn raw(self) -> [Field; N] {\n self.values\n }\n\n pub fn deserialize_into<T>(self) -> T where T: Deserialize<N> {\n Deserialize::deserialize(self.raw())\n }\n}\n"},"127":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__SECRET_HASH, GENERATOR_INDEX__MESSAGE_NULLIFIER, ARGS_HASH_CHUNK_COUNT,\n GENERATOR_INDEX__FUNCTION_ARGS, ARGS_HASH_CHUNK_LENGTH, MAX_ARGS_LENGTH\n},\n traits::Hash, hash::{pedersen_hash, compute_siloed_nullifier, sha256_to_field}\n};\nuse crate::oracle::logs_traits::{LensForEncryptedLog, ToBytesForUnencryptedLog};\n\npub fn compute_secret_hash(secret: Field) -> Field {\n pedersen_hash([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<T, let N: u32, let M: u32>(\n contract_address: AztecAddress,\n log: T\n) -> Field where T: ToBytesForUnencryptedLog<N, M> {\n let message_bytes: [u8; N] = log.to_be_bytes_arr();\n // can't use N - not in scope error\n let n = message_bytes.len();\n let mut hash_bytes = [0; M];\n // Address is converted to 32 bytes in ts\n let address_bytes = contract_address.to_be_bytes_arr();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes = (n as Field).to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[36 + i] = message_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field\n) -> Field {\n let mut hash_bytes = [0 as u8; 192];\n let sender_bytes = sender.to_field().to_be_bytes(32);\n let chain_id_bytes = chain_id.to_be_bytes(32);\n let recipient_bytes = recipient.to_field().to_be_bytes(32);\n let version_bytes = version.to_be_bytes(32);\n let content_bytes = content.to_be_bytes(32);\n let secret_hash_bytes = secret_hash.to_be_bytes(32);\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret and index of the message hash\n// in the L1 to L2 message tree\npub fn compute_message_nullifier(message_hash: Field, secret: Field, leaf_index: Field) -> Field {\n pedersen_hash(\n [message_hash, secret, leaf_index],\n GENERATOR_INDEX__MESSAGE_NULLIFIER\n )\n}\n\nstruct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n hash_args(args.as_slice())\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n assert(args.len() <= MAX_ARGS_LENGTH, \"Args length exceeds maximum\");\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n let mut current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n\n let mut current_chunk_index = 0;\n let mut index_inside_current_chunk = 0;\n for i in 0..args.len() {\n current_chunk_values[index_inside_current_chunk] = args[i];\n index_inside_current_chunk+=1;\n if index_inside_current_chunk == ARGS_HASH_CHUNK_LENGTH {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n current_chunk_index+=1;\n index_inside_current_chunk = 0;\n }\n }\n if index_inside_current_chunk > 0 {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nfn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..MAX_ARGS_LENGTH {\n input.add(i as Field);\n }\n let hash = input.hash();\n assert(hash == 0x11e40f2a780822f7971803048c9a2100579de352e7dadd99981760964da65b57);\n}\n\n#[test]\nfn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nfn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nfn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nfn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"131":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr","source":"#[oracle(packArgumentsArray)]\nunconstrained fn pack_arguments_array_oracle<let N: u32>(_args: [Field; N]) -> Field {}\n\n#[oracle(packArguments)]\nunconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {}\n\n/// - Pack arguments (array version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments_array<let N: u32>(args: [Field; N]) -> Field {\n pack_arguments_array_oracle(args)\n}\n\n/// - Pack arguments (slice version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments(args: [Field]) -> Field {\n pack_arguments_oracle(args)\n}\n\n"},"134":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr","source":"use dep::protocol_types::{\n constants::PUBLIC_DATA_TREE_HEIGHT, hash::pedersen_hash,\n public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, traits::{Hash, Serialize},\n utils::arr_copy_slice\n};\n\nglobal LEAF_PREIMAGE_LENGTH: u32 = 4;\nglobal PUBLIC_DATA_WITNESS: Field = 45;\n\nstruct PublicDataWitness {\n index: Field,\n leaf_preimage: PublicDataTreeLeafPreimage,\n path: [Field; PUBLIC_DATA_TREE_HEIGHT],\n}\n\n#[oracle(getPublicDataTreeWitness)]\nunconstrained fn get_public_data_witness_oracle(\n _block_number: u32,\n _leaf_slot: Field\n) -> [Field; PUBLIC_DATA_WITNESS] {}\n\nunconstrained pub fn get_public_data_witness(block_number: u32, leaf_slot: Field) -> PublicDataWitness {\n let fields = get_public_data_witness_oracle(block_number, leaf_slot);\n PublicDataWitness {\n index: fields[0],\n leaf_preimage: PublicDataTreeLeafPreimage { slot: fields[1], value: fields[2], next_index: fields[3] as u32, next_slot: fields[4] },\n path: arr_copy_slice(fields, [0; PUBLIC_DATA_TREE_HEIGHT], 1 + LEAF_PREIMAGE_LENGTH)\n }\n}\n"},"141":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_call_stack_item::PrivateCallStackItem},\n address::AztecAddress, constants::PRIVATE_CALL_STACK_ITEM_LENGTH\n};\n\n#[oracle(callPrivateFunction)]\nunconstrained fn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> PrivateCallStackItem {\n let fields = call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n PrivateCallStackItem::deserialize(fields)\n}\n"},"145":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_contract_instance.nr","source":"use dep::protocol_types::{\n address::AztecAddress, contract_instance::ContractInstance, utils::arr_copy_slice,\n constants::CONTRACT_INSTANCE_LENGTH, utils::reader::Reader\n};\n\n#[oracle(getContractInstance)]\nunconstrained fn get_contract_instance_oracle(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {}\n\n// Returns a ContractInstance plus a boolean indicating whether the instance was found.\n#[oracle(avmOpcodeGetContractInstance)]\nunconstrained fn get_contract_instance_oracle_avm(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {}\n\nunconstrained fn get_contract_instance_internal(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n get_contract_instance_oracle(address)\n}\n\nunconstrained pub fn get_contract_instance_internal_avm(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {\n get_contract_instance_oracle_avm(address)\n}\n\npub fn get_contract_instance(address: AztecAddress) -> ContractInstance {\n let instance = ContractInstance::deserialize(get_contract_instance_internal(address));\n assert(instance.to_address().eq(address));\n instance\n}\n\npub fn get_contract_instance_avm(address: AztecAddress) -> Option<ContractInstance> {\n let mut reader = Reader::new(get_contract_instance_internal_avm(address));\n let found = reader.read();\n if found == 0 {\n Option::none()\n } else {\n Option::some(reader.read_struct(ContractInstance::deserialize))\n }\n}\n"},"146":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr","source":"use dep::protocol_types::{\n abis::{\n function_selector::FunctionSelector, public_call_stack_item::PublicCallStackItem,\n function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_context::CallContext, read_request::ReadRequest, note_hash::NoteHash, nullifier::Nullifier,\n log_hash::LogHash, global_variables::GlobalVariables, gas::Gas\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n messaging::l2_to_l1_message::L2ToL1Message, header::Header, address::AztecAddress,\n utils::reader::Reader,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH\n}\n};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\npub fn parse_public_call_stack_item_from_oracle(fields: [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH]) -> PublicCallStackItem {\n let mut reader = Reader::new(fields);\n\n // Note: Not using PublicCirclePublicInputs::deserialize here, because everything below args_hash is 0 and\n // there is no more data in fields because there is only ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE fields!\n // WARNING: if updating, see comment in public_call_stack_item.ts's PublicCallStackItem.hash()\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData { selector: FunctionSelector::from_field(reader.read()), is_private: false },\n public_inputs: PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n start_side_effect_counter: reader.read_u32(),\n args_hash: reader.read(),\n returns_hash: 0,\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n nullifier_non_existent_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter: 0,\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n global_variables: GlobalVariables::empty(),\n prover_address: AztecAddress::zero(),\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0\n },\n is_execution_request: true\n };\n reader.finish();\n\n item\n}\n"},"150":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr","source":"use dep::protocol_types::{address::AztecAddress};\n\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: u64 = 17;\n\n// Obtains membership witness (index and sibling path) for a message in the L1 to L2 message tree.\n#[oracle(getL1ToL2MembershipWitness)]\nunconstrained fn get_l1_to_l2_membership_witness_oracle(\n _contract_address: AztecAddress,\n _message_hash: Field,\n _secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {}\n\nunconstrained pub fn get_l1_to_l2_membership_witness(\n contract_address: AztecAddress,\n message_hash: Field,\n secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {\n get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret)\n}\n"},"151":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/map.nr","source":"use dep::protocol_types::{hash::pedersen_hash, storage::map::derive_storage_slot_in_map, traits::ToField};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:map\nstruct Map<K, V, Context> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, T, Context> Storage<T> for Map<K, T, Context> {}\n\nimpl<K, V, Context> Map<K, V, Context> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map { context, storage_slot, state_var_constructor }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = derive_storage_slot_in_map(self.storage_slot, key);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n"},"153":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr","source":"use crate::context::{PublicContext, UnconstrainedContext};\nuse crate::oracle::storage::storage_read;\nuse dep::protocol_types::traits::{Deserialize, Serialize};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:public_mutable_struct\nstruct PublicMutable<T, Context> {\n context: Context,\n storage_slot: Field,\n}\n// docs:end:public_mutable_struct\n\nimpl<T, Context> Storage<T> for PublicMutable<T, Context> {}\n\nimpl<T, Context> PublicMutable<T, Context> {\n // docs:start:public_mutable_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicMutable { context, storage_slot }\n }\n // docs:end:public_mutable_struct_new\n}\n\nimpl<T, T_SERIALIZED_LEN> PublicMutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // docs:start:public_mutable_struct_read\n pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write(self, value: T) {\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T, T_SERIALIZED_LEN> PublicMutable<T, UnconstrainedContext> where T: Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n"},"156":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr","source":"use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext}, oracle::storage::storage_read,\n state_vars::storage::Storage\n};\nuse dep::protocol_types::{constants::INITIALIZATION_SLOT_SEPARATOR, traits::{Deserialize, Serialize}};\n\n// Just like PublicImmutable but with the ability to read from private functions.\nstruct SharedImmutable<T, Context>{\n context: Context,\n storage_slot: Field,\n}\n\nimpl<T, Context> Storage<T> for SharedImmutable<T, Context> {}\n\nimpl<T, Context> SharedImmutable<T, Context> {\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Self { context, storage_slot }\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // Intended to be only called once. \n pub fn initialize(self, value: T) {\n // We check that the struct is not yet initialized by checking if the initialization slot is 0\n let initialization_slot = INITIALIZATION_SLOT_SEPARATOR + self.storage_slot;\n let init_field: Field = self.context.storage_read(initialization_slot);\n assert(init_field == 0, \"SharedImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n self.context.storage_write(initialization_slot, 0xdead);\n self.context.storage_write(self.storage_slot, value);\n }\n\n pub fn read_public(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, UnconstrainedContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read_public(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, &mut PrivateContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n pub fn read_private(self) -> T {\n let header = self.context.get_header();\n let mut fields = [0; T_SERIALIZED_LEN];\n\n for i in 0..fields.len() {\n fields[i] =\n header.public_storage_historical_read(\n self.storage_slot + i as Field,\n (*self.context).this_address()\n );\n }\n T::deserialize(fields)\n }\n}\n"},"175":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{GAS_LENGTH, FIXED_DA_GAS, FIXED_L2_GAS}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered, utils::reader::Reader,\n abis::gas_fees::GasFees\n};\nuse std::ops::{Add, Sub};\n\nstruct Gas {\n da_gas: u32,\n l2_gas: u32,\n}\n\nimpl Gas {\n pub fn new(da_gas: u32, l2_gas: u32) -> Self {\n Self { da_gas, l2_gas }\n }\n\n pub fn tx_overhead() -> Self {\n Self { da_gas: FIXED_DA_GAS, l2_gas: FIXED_L2_GAS }\n }\n\n pub fn compute_fee(self, fees: GasFees) -> Field {\n (self.da_gas as Field) * fees.fee_per_da_gas + (self.l2_gas as Field) * fees.fee_per_l2_gas\n }\n\n pub fn is_empty(self) -> bool {\n (self.da_gas == 0) & (self.l2_gas == 0)\n }\n\n pub fn within(self, limits: Gas) -> bool {\n (self.da_gas <= limits.da_gas) & (self.l2_gas <= limits.l2_gas)\n }\n}\n\nimpl Add for Gas {\n fn add(self, other: Gas) -> Self {\n Gas::new(self.da_gas + other.da_gas, self.l2_gas + other.l2_gas)\n }\n}\n\nimpl Sub for Gas {\n fn sub(self, other: Gas) -> Self {\n Gas::new(self.da_gas - other.da_gas, self.l2_gas - other.l2_gas)\n }\n}\n\nimpl Serialize<GAS_LENGTH> for Gas {\n fn serialize(self) -> [Field; GAS_LENGTH] {\n [self.da_gas as Field, self.l2_gas as Field]\n }\n}\n\nimpl Deserialize<GAS_LENGTH> for Gas {\n fn deserialize(serialized: [Field; GAS_LENGTH]) -> Gas {\n Gas::new(serialized[0] as u32, serialized[1] as u32)\n }\n}\n\nimpl Eq for Gas {\n fn eq(self, other : Gas) -> bool {\n (self.da_gas == other.da_gas) & (self.l2_gas == other.l2_gas)\n }\n}\n\nimpl Empty for Gas {\n fn empty() -> Self {\n Gas::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Gas::empty();\n let serialized = item.serialize();\n let deserialized = Gas::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n"},"177":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash.nr","source":"use crate::{\n abis::read_request::ScopedReadRequest, address::AztecAddress,\n abis::side_effect::{Ordered, OrderedValue, Readable, Scoped},\n constants::{NOTE_HASH_LENGTH, SCOPED_NOTE_HASH_LENGTH}, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct NoteHash {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for NoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteHash {\n fn eq(self, other: NoteHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter) \n }\n}\n\nimpl Empty for NoteHash {\n fn empty() -> Self {\n NoteHash {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_HASH_LENGTH> for NoteHash {\n fn serialize(self) -> [Field; NOTE_HASH_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_HASH_LENGTH> for NoteHash {\n fn deserialize(values: [Field; NOTE_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl NoteHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNoteHash {\n ScopedNoteHash { note_hash: self, contract_address }\n }\n}\n\nstruct ScopedNoteHash {\n note_hash: NoteHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<NoteHash> for ScopedNoteHash {\n fn inner(self) -> NoteHash {\n self.note_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNoteHash {\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNoteHash {\n fn value(self) -> Field {\n self.note_hash.value\n }\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl Eq for ScopedNoteHash {\n fn eq(self, other: ScopedNoteHash) -> bool {\n (self.note_hash == other.note_hash)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedNoteHash {\n fn empty() -> Self {\n ScopedNoteHash {\n note_hash: NoteHash::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn serialize(self) -> [Field; SCOPED_NOTE_HASH_LENGTH] {\n array_concat(self.note_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn deserialize(values: [Field; SCOPED_NOTE_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n note_hash: reader.read_struct(NoteHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNoteHash {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.note_hash.value, read_request.value(), \"Value of the note hash does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the note hash does not match read request\");\n assert(\n read_request.counter() > self.note_hash.counter, \"Read request counter must be greater than the counter of the note hash\"\n );\n }\n}\n\nimpl ScopedNoteHash {\n pub fn expose_to_public(self) -> NoteHash {\n // Hide the actual counter when exposing it to the public kernel.\n NoteHash { value: self.note_hash.value, counter: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = NoteHash::empty();\n let serialized = item.serialize();\n let deserialized = NoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNoteHash::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"178":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_fees.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::GAS_FEES_LENGTH, hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty},\n abis::side_effect::Ordered, utils::reader::Reader\n};\n\nstruct GasFees {\n fee_per_da_gas: Field,\n fee_per_l2_gas: Field,\n}\n\nimpl GasFees {\n pub fn new(fee_per_da_gas: Field, fee_per_l2_gas: Field) -> Self {\n Self { fee_per_da_gas, fee_per_l2_gas }\n }\n\n pub fn default() -> Self {\n GasFees::new(1, 1)\n }\n\n pub fn is_empty(self) -> bool {\n (self.fee_per_da_gas == 0) & (self.fee_per_l2_gas == 0)\n }\n}\n\nimpl Serialize<GAS_FEES_LENGTH> for GasFees {\n fn serialize(self) -> [Field; GAS_FEES_LENGTH] {\n [self.fee_per_da_gas, self.fee_per_l2_gas]\n }\n}\n\nimpl Deserialize<GAS_FEES_LENGTH> for GasFees {\n fn deserialize(serialized: [Field; GAS_FEES_LENGTH]) -> GasFees {\n GasFees::new(serialized[0], serialized[1])\n }\n}\n\nimpl Eq for GasFees {\n fn eq(self, other : GasFees) -> bool {\n (self.fee_per_da_gas == other.fee_per_da_gas) & (self.fee_per_l2_gas == other.fee_per_l2_gas)\n }\n}\n\nimpl Empty for GasFees {\n fn empty() -> Self {\n GasFees::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasFees::empty();\n let serialized = item.serialize();\n let deserialized = GasFees::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"180":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr","source":"use crate::{\n abis::{\n call_context::CallContext, max_block_number::MaxBlockNumber, gas_settings::GasSettings,\n validation_requests::KeyValidationRequestAndGenerator, note_hash::NoteHash, nullifier::Nullifier,\n private_call_request::PrivateCallRequest, read_request::ReadRequest,\n log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n constants::{\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_L2_TO_L1_MSGS_PER_CALL, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS, MAX_ENCRYPTED_LOGS_PER_CALL,\n MAX_UNENCRYPTED_LOGS_PER_CALL, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, hash::pedersen_hash, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n transaction::tx_context::TxContext, utils::arrays::validate_array\n};\n\nstruct PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: u32,\n nullifier_read_requests: u32,\n key_validation_requests_and_generators: u32,\n note_hashes: u32,\n nullifiers: u32,\n l2_to_l1_msgs: u32,\n private_call_requests: u32,\n public_call_stack_hashes: u32,\n note_encrypted_logs_hashes: u32,\n encrypted_logs_hashes: u32,\n unencrypted_logs_hashes: u32,\n}\n\nimpl PrivateCircuitPublicInputsArrayLengths {\n pub fn new(public_inputs: PrivateCircuitPublicInputs) -> Self {\n PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: validate_array(public_inputs.note_hash_read_requests),\n nullifier_read_requests: validate_array(public_inputs.nullifier_read_requests),\n key_validation_requests_and_generators: validate_array(public_inputs.key_validation_requests_and_generators),\n note_hashes: validate_array(public_inputs.note_hashes),\n nullifiers: validate_array(public_inputs.nullifiers),\n l2_to_l1_msgs: validate_array(public_inputs.l2_to_l1_msgs),\n private_call_requests: validate_array(public_inputs.private_call_requests),\n public_call_stack_hashes: validate_array(public_inputs.public_call_stack_hashes),\n note_encrypted_logs_hashes: validate_array(public_inputs.note_encrypted_logs_hashes),\n encrypted_logs_hashes: validate_array(public_inputs.encrypted_logs_hashes),\n unencrypted_logs_hashes: validate_array(public_inputs.unencrypted_logs_hashes)\n }\n }\n}\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: [ReadRequest; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest; MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator; MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n\n note_hashes: [NoteHash; MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier; MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: Field,\n l2_to_l1_msgs: [L2ToL1Message; MAX_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter : u32,\n end_side_effect_counter : u32,\n note_encrypted_logs_hashes: [NoteLogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash; MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n // Note: The chain_id and version here are not redundant to the values in self.historical_header.global_variables because\n // they can be different in case of a protocol upgrade. In such a situation we could be using header from a block\n // before the upgrade took place but be using the updated protocol to execute and prove the transaction.\n tx_context: TxContext,\n}\n\nimpl Eq for PrivateCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.call_context.eq(other.call_context) &\n self.args_hash.eq(other.args_hash) &\n (self.returns_hash == other.returns_hash) &\n (self.min_revertible_side_effect_counter == other.min_revertible_side_effect_counter) &\n (self.is_fee_payer == other.is_fee_payer) &\n (self.max_block_number == other.max_block_number) &\n (self.note_hash_read_requests == other.note_hash_read_requests) &\n (self.nullifier_read_requests == other.nullifier_read_requests) &\n (self.key_validation_requests_and_generators == other.key_validation_requests_and_generators) &\n (self.note_hashes == other.note_hashes) &\n (self.nullifiers == other.nullifiers) &\n (self.private_call_requests == other.private_call_requests) &\n (self.public_call_stack_hashes == other.public_call_stack_hashes) &\n (self.l2_to_l1_msgs == other.l2_to_l1_msgs) &\n (self.start_side_effect_counter == other.start_side_effect_counter) &\n (self.end_side_effect_counter == other.end_side_effect_counter) &\n (self.note_encrypted_logs_hashes == other.note_encrypted_logs_hashes) &\n (self.encrypted_logs_hashes == other.encrypted_logs_hashes) &\n (self.unencrypted_logs_hashes == other.unencrypted_logs_hashes) &\n self.historical_header.eq(other.historical_header) &\n self.tx_context.eq(other.tx_context)\n }\n}\n\nimpl Serialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new();\n fields.extend_from_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n\n fields.push(self.min_revertible_side_effect_counter as Field);\n fields.push(if self.is_fee_payer { 1 } else { 0 } as Field);\n\n fields.extend_from_array(self.max_block_number.serialize());\n\n for i in 0..self.note_hash_read_requests.len() {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..self.nullifier_read_requests.len() {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..self.key_validation_requests_and_generators.len() {\n fields.extend_from_array(self.key_validation_requests_and_generators[i].serialize());\n }\n for i in 0..self.note_hashes.len() {\n fields.extend_from_array(self.note_hashes[i].serialize());\n }\n for i in 0..self.nullifiers.len() {\n fields.extend_from_array(self.nullifiers[i].serialize());\n }\n for i in 0..self.private_call_requests.len() {\n fields.extend_from_array(self.private_call_requests[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n fields.push(self.public_teardown_function_hash);\n for i in 0..self.l2_to_l1_msgs.len() {\n fields.extend_from_array(self.l2_to_l1_msgs[i].serialize());\n }\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n for i in 0..self.note_encrypted_logs_hashes.len() {\n fields.extend_from_array(self.note_encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.encrypted_logs_hashes.len() {\n fields.extend_from_array(self.encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.unencrypted_logs_hashes.len() {\n fields.extend_from_array(self.unencrypted_logs_hashes[i].serialize());\n }\n fields.extend_from_array(self.historical_header.serialize());\n fields.extend_from_array(self.tx_context.serialize());\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn deserialize(serialized: [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n let inputs = Self {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n min_revertible_side_effect_counter: reader.read() as u32,\n is_fee_payer: reader.read() == 1,\n max_block_number: reader.read_struct(MaxBlockNumber::deserialize),\n note_hash_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL]),\n nullifier_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL]),\n key_validation_requests_and_generators: reader.read_struct_array(KeyValidationRequestAndGenerator::deserialize, [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL]),\n note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL]),\n nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL]),\n private_call_requests: reader.read_struct_array(PrivateCallRequest::deserialize, [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n public_teardown_function_hash: reader.read(),\n l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL]),\n start_side_effect_counter: reader.read() as u32,\n end_side_effect_counter: reader.read() as u32,\n note_encrypted_logs_hashes: reader.read_struct_array(NoteLogHash::deserialize, [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL]),\n encrypted_logs_hashes: reader.read_struct_array(EncryptedLogHash::deserialize, [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL]),\n unencrypted_logs_hashes: reader.read_struct_array(LogHash::deserialize, [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL]),\n historical_header: reader.read_struct(Header::deserialize),\n tx_context: reader.read_struct(TxContext::deserialize),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PrivateCircuitPublicInputs {\n fn empty() -> Self {\n PrivateCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\n returns_hash: 0,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter : 0 as u32,\n end_side_effect_counter : 0 as u32,\n note_encrypted_logs_hashes: [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n tx_context: TxContext::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PrivateCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PrivateCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PrivateCircuitPublicInputs::empty();\n let hash = inputs.hash();\n // Value from private_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x15c9b0a92b9b541598e24c9f0b0b4b04b7f2408599751c45aa12de671fd9b363;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"181":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item_compressed.nr","source":"use crate::abis::{call_context::CallContext, function_data::FunctionData, gas::Gas};\nuse crate::address::AztecAddress;\nuse crate::constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH};\nuse crate::traits::{Hash, Empty, Serialize, Deserialize};\nuse crate::utils::reader::Reader;\n\n/**\n * A compressed version of the PublicCallStackItem struct used to compute the \"hash\"\n * of a PublicCallStackItem.\n * \n * Historically, we have been zeroing most values in the PublicCallStackItem struct\n * to compute the hash involved when adding a PublicCallStackItem to the PublicCallStack.\n * \n * This struct is used to store the values that we did not zero out, and allow us to hash\n * only these, thereby skipping a lot of computation and saving us a lot of constraints\n * \n * Essentially this struct exists such that we don't have a `hash` function in the \n * PublicCallStackItem struct that practically throws away some values of the struct\n * without clearly indicating that it does so.\n */\nstruct PublicCallStackItemCompressed {\n contract_address: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n revert_code: u8,\n start_gas_left: Gas,\n end_gas_left: Gas,\n}\n\nimpl Eq for PublicCallStackItemCompressed {\n fn eq(self, other: PublicCallStackItemCompressed) -> bool {\n (self.contract_address == other.contract_address)\n & (self.call_context == other.call_context)\n & (self.function_data == other.function_data)\n & (self.args_hash == other.args_hash)\n & (self.returns_hash == other.returns_hash)\n & (self.revert_code == other.revert_code)\n & (self.start_gas_left == other.start_gas_left)\n & (self.end_gas_left == other.end_gas_left)\n }\n}\n\nimpl Hash for PublicCallStackItemCompressed {\n fn hash(self) -> Field {\n std::hash::pedersen_hash_with_separator(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PublicCallStackItemCompressed {\n fn empty() -> Self {\n PublicCallStackItemCompressed {\n contract_address: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n }\n }\n}\n\nimpl Serialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn serialize(self) -> [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n fields.push(self.revert_code as Field);\n fields.extend_from_array(self.start_gas_left.serialize());\n fields.extend_from_array(self.end_gas_left.serialize());\n\n assert_eq(fields.len(), PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn deserialize(fields: [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH]) -> PublicCallStackItemCompressed {\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItemCompressed {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n revert_code: reader.read() as u8,\n start_gas_left: reader.read_struct(Gas::deserialize),\n end_gas_left: reader.read_struct(Gas::deserialize),\n };\n reader.finish();\n item\n }\n}\n"},"183":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/global_variables.nr","source":"use crate::{\n address::{AztecAddress, EthAddress}, abis::gas_fees::GasFees,\n constants::{GENERATOR_INDEX__GLOBAL_VARIABLES, GLOBAL_VARIABLES_LENGTH},\n traits::{Deserialize, Empty, Hash, Serialize}, utils::reader::Reader\n};\n\n// docs:start:global-variables\nstruct GlobalVariables {\n chain_id : Field,\n version : Field,\n block_number : Field,\n timestamp : u64,\n coinbase : EthAddress,\n fee_recipient : AztecAddress,\n gas_fees : GasFees\n}\n// docs:end:global-variables\n\nimpl GlobalVariables {\n fn is_empty(self) -> bool {\n (self.chain_id == 0)\n & (self.version == 0)\n & (self.block_number == 0)\n & (self.timestamp == 0)\n & (self.coinbase.is_zero())\n & (self.fee_recipient.is_zero())\n & (self.gas_fees.is_empty())\n }\n}\n\nimpl Serialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn serialize(self) -> [Field; GLOBAL_VARIABLES_LENGTH] {\n let mut serialized: BoundedVec<Field, GLOBAL_VARIABLES_LENGTH> = BoundedVec::new();\n\n serialized.push(self.chain_id);\n serialized.push(self.version);\n serialized.push(self.block_number);\n serialized.push(self.timestamp as Field);\n serialized.push(self.coinbase.to_field());\n serialized.push(self.fee_recipient.to_field());\n serialized.extend_from_array(self.gas_fees.serialize());\n\n serialized.storage\n }\n}\n\nimpl Deserialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn deserialize(serialized: [Field; GLOBAL_VARIABLES_LENGTH]) -> GlobalVariables {\n let mut reader = Reader::new(serialized);\n GlobalVariables {\n chain_id: reader.read(),\n version: reader.read(),\n block_number: reader.read(),\n timestamp: reader.read() as u64,\n coinbase: EthAddress::from_field(reader.read()),\n fee_recipient: AztecAddress::from_field(reader.read()),\n gas_fees: reader.read_struct(GasFees::deserialize)\n }\n }\n}\n\nimpl Eq for GlobalVariables {\n fn eq(self, other : GlobalVariables) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.block_number == other.block_number) &\n (self.timestamp == other.timestamp) &\n (self.coinbase == other.coinbase) &\n (self.fee_recipient == other.fee_recipient) &\n (self.gas_fees == other.gas_fees) \n }\n}\n\nimpl Empty for GlobalVariables {\n fn empty() -> Self {\n Self {\n chain_id: 0,\n version: 0,\n block_number: 0,\n timestamp: 0,\n coinbase: EthAddress::empty(),\n fee_recipient: AztecAddress::empty(),\n gas_fees: GasFees::empty()\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let vars = GlobalVariables::empty();\n let _serialized = vars.serialize();\n let _deserialized = GlobalVariables::deserialize(_serialized);\n}\n"},"184":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/read_request.nr","source":"use crate::{\n abis::side_effect::{Ordered, Scoped}, traits::{Empty, Serialize, Deserialize},\n address::AztecAddress, constants::{READ_REQUEST_LENGTH, SCOPED_READ_REQUEST_LEN},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct ReadRequest {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for ReadRequest {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for ReadRequest {\n fn eq(self, read_request: ReadRequest) -> bool {\n (self.value == read_request.value)\n & (self.counter == read_request.counter)\n }\n}\n\nimpl Empty for ReadRequest {\n fn empty() -> Self {\n ReadRequest {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn serialize(self) -> [Field; READ_REQUEST_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn deserialize(values: [Field; READ_REQUEST_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl ReadRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedReadRequest {\n ScopedReadRequest { read_request: self, contract_address }\n }\n}\n\nstruct ScopedReadRequest {\n read_request: ReadRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<ReadRequest> for ScopedReadRequest {\n fn inner(self) -> ReadRequest {\n self.read_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Eq for ScopedReadRequest {\n fn eq(self, other: ScopedReadRequest) -> bool {\n (self.read_request == other.read_request)\n & (self.contract_address.eq(other.contract_address))\n }\n}\n\nimpl Empty for ScopedReadRequest {\n fn empty() -> Self {\n ScopedReadRequest {\n read_request: ReadRequest::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn serialize(self) -> [Field; SCOPED_READ_REQUEST_LEN] {\n array_concat(self.read_request.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn deserialize(values: [Field; SCOPED_READ_REQUEST_LEN]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n read_request: reader.read_struct(ReadRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedReadRequest {\n pub fn value(self) -> Field {\n self.read_request.value\n }\n pub fn counter(self) -> u32 {\n self.read_request.counter\n }\n}\n\n#[test]\nfn serialization_of_empty_read() {\n let item = ReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"187":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request_and_generator.nr","source":"use crate::{\n address::AztecAddress,\n abis::validation_requests::{\n key_validation_request::KeyValidationRequest,\n scoped_key_validation_request_and_generator::ScopedKeyValidationRequestAndGenerator\n},\n constants::KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct KeyValidationRequestAndGenerator {\n request: KeyValidationRequest,\n sk_app_generator: Field,\n}\n\nimpl Eq for KeyValidationRequestAndGenerator {\n fn eq(self, other: KeyValidationRequestAndGenerator) -> bool {\n (self.request == other.request) & (self.sk_app_generator == other.sk_app_generator)\n }\n}\n\nimpl Empty for KeyValidationRequestAndGenerator {\n fn empty() -> Self {\n KeyValidationRequestAndGenerator {\n request: KeyValidationRequest::empty(),\n sk_app_generator: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH] {\n array_concat(self.request.serialize(), [self.sk_app_generator])\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH]) -> Self {\n let mut reader = Reader::new(fields);\n let res = Self {\n request: reader.read_struct(KeyValidationRequest::deserialize),\n sk_app_generator: reader.read(),\n };\n reader.finish();\n res\n }\n}\n\nimpl KeyValidationRequestAndGenerator {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedKeyValidationRequestAndGenerator {\n ScopedKeyValidationRequestAndGenerator { request: self, contract_address }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = KeyValidationRequestAndGenerator::empty();\n let serialized = item.serialize();\n let deserialized = KeyValidationRequestAndGenerator::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"188":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr","source":"use crate::{constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize}, point::Point};\n\nstruct KeyValidationRequest {\n pk_m: Point,\n sk_app: Field, // not a grumpkin scalar because it's output of poseidon2\n}\n\nimpl Eq for KeyValidationRequest {\n fn eq(self, request: KeyValidationRequest) -> bool {\n (request.pk_m.eq(self.pk_m))\n & (request.sk_app.eq(self.sk_app))\n }\n}\n\nimpl Empty for KeyValidationRequest {\n fn empty() -> Self {\n KeyValidationRequest {\n pk_m: Point::empty(),\n sk_app: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_LENGTH] {\n [\n self.pk_m.x,\n self.pk_m.y,\n self.pk_m.is_infinite as Field,\n self.sk_app,\n ]\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_LENGTH]) -> Self {\n Self {\n pk_m: Point { x:fields[0], y: fields[1], is_infinite: fields[2] as bool},\n sk_app: fields[3],\n }\n }\n}\n\n"},"192":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/nullifier.nr","source":"use crate::{\n abis::{side_effect::{Ordered, OrderedValue, Readable, Scoped}, read_request::ScopedReadRequest},\n address::AztecAddress, constants::{NULLIFIER_LENGTH, SCOPED_NULLIFIER_LENGTH},\n hash::compute_siloed_nullifier, traits::{Empty, Hash, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct Nullifier {\n value: Field,\n counter: u32,\n note_hash: Field,\n}\n\nimpl Ordered for Nullifier {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for Nullifier {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for Nullifier {\n fn eq(self, other: Nullifier) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.note_hash == other.note_hash) \n }\n}\n\nimpl Empty for Nullifier {\n fn empty() -> Self {\n Nullifier {\n value: 0,\n counter: 0,\n note_hash: 0,\n }\n }\n}\n\nimpl Serialize<NULLIFIER_LENGTH> for Nullifier {\n fn serialize(self) -> [Field; NULLIFIER_LENGTH] {\n [self.value, self.counter as Field, self.note_hash]\n }\n}\n\nimpl Deserialize<NULLIFIER_LENGTH> for Nullifier {\n fn deserialize(values: [Field; NULLIFIER_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n note_hash: values[2],\n }\n }\n}\n\nimpl Readable for Nullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n // Public kernels output Nullifier instead of ScopedNullifier.\n // The nullifier value has been siloed.\n let siloed_request_value = compute_siloed_nullifier(read_request.contract_address, read_request.value());\n assert_eq(self.value, siloed_request_value, \"Value of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl Nullifier {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNullifier {\n ScopedNullifier { nullifier: self, contract_address }\n }\n}\n\nstruct ScopedNullifier {\n nullifier: Nullifier,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<Nullifier> for ScopedNullifier {\n fn inner(self) -> Nullifier {\n self.nullifier\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNullifier {\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNullifier {\n fn value(self) -> Field {\n self.nullifier.value\n }\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl Eq for ScopedNullifier {\n fn eq(self, other: ScopedNullifier) -> bool {\n (self.nullifier == other.nullifier)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedNullifier {\n fn empty() -> Self {\n ScopedNullifier {\n nullifier: Nullifier::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn serialize(self) -> [Field; SCOPED_NULLIFIER_LENGTH] {\n array_concat(self.nullifier.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn deserialize(values: [Field; SCOPED_NULLIFIER_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n nullifier: reader.read_struct(Nullifier::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.nullifier.value, read_request.value(), \"Value of the nullifier does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.nullifier.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl ScopedNullifier {\n pub fn nullified_note_hash(self) -> Field {\n self.nullifier.note_hash\n }\n\n pub fn expose_to_public(self) -> Nullifier {\n // Hide the actual counter and note hash when exposing it to the public kernel.\n Nullifier { value: self.nullifier.value, counter: 0, note_hash: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Nullifier::empty();\n let serialized = item.serialize();\n let deserialized = Nullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNullifier::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"201":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_selector.nr","source":"use crate::utils::field::field_from_bytes;\nuse crate::traits::{Serialize, Deserialize, FromField, ToField, Empty};\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl Serialize<1> for FunctionSelector {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n}\n\nimpl Deserialize<1> for FunctionSelector {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n\nimpl FromField for FunctionSelector {\n fn from_field(field: Field) -> Self {\n Self { inner: field as u32 }\n }\n}\n\nimpl ToField for FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n}\n\nimpl Empty for FunctionSelector {\n fn empty() -> Self {\n Self { inner: 0 as u32 }\n }\n}\n\nimpl FunctionSelector {\n pub fn from_u32(value: u32) -> Self {\n Self { inner: value }\n }\n\n pub fn from_signature<let N: u32>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n}\n"},"202":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr","source":"use crate::{\n abis::{\n private_call_stack_item::PrivateCallStackItem, call_context::CallContext,\n function_data::FunctionData, caller_context::CallerContext,\n side_effect::{Ordered, RangeOrdered, Scoped}\n},\n address::AztecAddress, constants::{PRIVATE_CALL_REQUEST_LENGTH, SCOPED_PRIVATE_CALL_REQUEST_LENGTH},\n traits::{Empty, Serialize, Deserialize}, utils::reader::Reader\n};\n\nstruct PrivateCallRequest {\n target: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n caller_context: CallerContext,\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n}\n\nimpl Ordered for PrivateCallRequest {\n fn counter(self) -> u32 {\n self.start_side_effect_counter\n }\n}\n\nimpl RangeOrdered for PrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.start_side_effect_counter\n }\n fn counter_end(self) -> u32 {\n self.end_side_effect_counter\n }\n}\n\nimpl Eq for PrivateCallRequest {\n fn eq(self, other: PrivateCallRequest) -> bool {\n (self.target == other.target) \n & (self.call_context == other.call_context) \n & (self.function_data == other.function_data) \n & (self.args_hash == other.args_hash) \n & (self.returns_hash == other.returns_hash)\n & (self.caller_context == other.caller_context)\n & (self.start_side_effect_counter == other.start_side_effect_counter)\n & (self.end_side_effect_counter == other.end_side_effect_counter)\n }\n}\n\nimpl Empty for PrivateCallRequest {\n fn empty() -> Self {\n PrivateCallRequest {\n target: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n caller_context: CallerContext::empty(),\n start_side_effect_counter: 0,\n end_side_effect_counter: 0,\n }\n }\n}\n\nimpl Serialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn serialize(self) -> [Field; PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.push(self.target.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n fields.extend_from_array(self.caller_context.serialize());\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n assert_eq(fields.len(), PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn deserialize(fields: [Field; PRIVATE_CALL_REQUEST_LENGTH]) -> PrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = PrivateCallRequest {\n target: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n caller_context: reader.read_struct(CallerContext::deserialize),\n start_side_effect_counter: reader.read_u32(),\n end_side_effect_counter: reader.read_u32(),\n };\n reader.finish();\n item\n }\n}\n\nimpl PrivateCallRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedPrivateCallRequest {\n ScopedPrivateCallRequest { call_request: self, contract_address }\n }\n\n pub fn matches_stack_item(self, stack_item: PrivateCallStackItem) -> bool {\n (self.target == stack_item.contract_address)\n & (self.call_context == stack_item.public_inputs.call_context)\n & (self.function_data == stack_item.function_data)\n & (self.args_hash == stack_item.public_inputs.args_hash)\n & (self.returns_hash == stack_item.public_inputs.returns_hash)\n & (self.start_side_effect_counter\n == stack_item.public_inputs.start_side_effect_counter)\n & (self.end_side_effect_counter\n == stack_item.public_inputs.end_side_effect_counter)\n }\n}\n\nstruct ScopedPrivateCallRequest {\n call_request: PrivateCallRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<PrivateCallRequest> for ScopedPrivateCallRequest {\n fn inner(self) -> PrivateCallRequest {\n self.call_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedPrivateCallRequest {\n fn counter(self) -> u32 {\n self.call_request.counter_start()\n }\n}\n\nimpl RangeOrdered for ScopedPrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.call_request.counter_start()\n }\n fn counter_end(self) -> u32 {\n self.call_request.counter_end()\n }\n}\n\nimpl Eq for ScopedPrivateCallRequest {\n fn eq(self, other: ScopedPrivateCallRequest) -> bool {\n (self.call_request == other.call_request)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedPrivateCallRequest {\n fn empty() -> Self {\n ScopedPrivateCallRequest {\n call_request: PrivateCallRequest::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn serialize(self) -> [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, SCOPED_PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.call_request.serialize());\n fields.extend_from_array(self.contract_address.serialize());\n\n assert_eq(fields.len(), SCOPED_PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn deserialize(fields: [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH]) -> ScopedPrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = ScopedPrivateCallRequest {\n call_request: reader.read_struct(PrivateCallRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = ScopedPrivateCallRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedPrivateCallRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"207":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress}, abis::gas::Gas,\n abis::gas_fees::GasFees,\n constants::{\n GAS_SETTINGS_LENGTH, DEFAULT_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_INCLUSION_FEE\n},\n hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n utils::reader::Reader\n};\n\nstruct GasSettings {\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field,\n}\n\nimpl GasSettings {\n pub fn new(\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field\n ) -> Self {\n Self { gas_limits, teardown_gas_limits, max_fees_per_gas, inclusion_fee }\n }\n\n pub fn default() -> Self {\n GasSettings::new(\n Gas::new(DEFAULT_GAS_LIMIT, DEFAULT_GAS_LIMIT),\n Gas::new(DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT),\n GasFees::new(DEFAULT_MAX_FEE_PER_GAS, DEFAULT_MAX_FEE_PER_GAS),\n DEFAULT_INCLUSION_FEE\n )\n }\n}\n\nimpl Eq for GasSettings {\n fn eq(self, other: Self) -> bool {\n (self.gas_limits == other.gas_limits) & (self.teardown_gas_limits == other.teardown_gas_limits) & (self.max_fees_per_gas == other.max_fees_per_gas) & (self.inclusion_fee == other.inclusion_fee)\n }\n}\n\nimpl Empty for GasSettings {\n fn empty() -> Self {\n GasSettings::new(\n Gas::empty(), Gas::empty(), GasFees::empty(), 0\n )\n }\n}\n\nimpl Serialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn serialize(self) -> [Field; GAS_SETTINGS_LENGTH] {\n let mut serialized: BoundedVec<Field, GAS_SETTINGS_LENGTH> = BoundedVec::new();\n\n serialized.extend_from_array(self.gas_limits.serialize());\n serialized.extend_from_array(self.teardown_gas_limits.serialize());\n serialized.extend_from_array(self.max_fees_per_gas.serialize());\n serialized.push(self.inclusion_fee);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn deserialize(serialized: [Field; GAS_SETTINGS_LENGTH]) -> GasSettings {\n let mut reader = Reader::new(serialized);\n GasSettings::new(reader.read_struct(Gas::deserialize), reader.read_struct(Gas::deserialize), reader.read_struct(GasFees::deserialize), reader.read())\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasSettings::empty();\n let serialized = item.serialize();\n let deserialized = GasSettings::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"216":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr","source":"use crate::{\n abis::{function_data::FunctionData, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress,\n constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PRIVATE_CALL_STACK_ITEM_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader\n};\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n function_data: FunctionData,\n public_inputs: PrivateCircuitPublicInputs,\n}\n\nimpl Eq for PrivateCallStackItem {\n fn eq(self, other: Self) -> bool {\n self.contract_address.eq(other.contract_address) &\n self.function_data.eq(other.function_data) &\n self.public_inputs.eq(other.public_inputs)\n }\n}\n\nimpl Serialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn serialize(self) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_STACK_ITEM_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.function_data.serialize());\n fields.extend_from_array(self.public_inputs.serialize());\n\n assert_eq(fields.len(), PRIVATE_CALL_STACK_ITEM_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn deserialize(serialized: [Field; PRIVATE_CALL_STACK_ITEM_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let item = Self {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n public_inputs: reader.read_struct(PrivateCircuitPublicInputs::deserialize),\n };\n\n reader.finish();\n item\n }\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PrivateCallStackItem {\n fn empty() -> Self {\n PrivateCallStackItem {\n contract_address: AztecAddress::empty(),\n function_data: FunctionData::empty(),\n public_inputs: PrivateCircuitPublicInputs::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = PrivateCallStackItem::empty();\n let serialized = item.serialize();\n let deserialized = PrivateCallStackItem::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let mut item = PrivateCallStackItem::empty();\n item.function_data.is_private = true;\n let hash = item.hash();\n\n // Value from private_call_stack_item.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x065f2831db9ac0db5e710bd3a865b5facd8cf83f1585e1af8fd1d6ce9c47f685;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"217":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/caller_context.nr","source":"use crate::address::AztecAddress;\nuse crate::traits::{Empty, Serialize, Deserialize};\nuse crate::constants::CALLER_CONTEXT_LENGTH;\nuse crate::utils::reader::Reader;\n\nstruct CallerContext {\n msg_sender: AztecAddress,\n storage_contract_address: AztecAddress,\n is_static_call: bool,\n}\n\nimpl Eq for CallerContext {\n fn eq(self, other: CallerContext) -> bool {\n other.msg_sender.eq(self.msg_sender)\n & other.storage_contract_address.eq(self.storage_contract_address)\n & other.is_static_call == self.is_static_call\n }\n}\n\nimpl Empty for CallerContext {\n fn empty() -> Self {\n CallerContext {\n msg_sender: AztecAddress::zero(),\n storage_contract_address: AztecAddress::zero(),\n is_static_call: false,\n }\n }\n}\n\nimpl CallerContext {\n pub fn is_empty(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero() & !self.is_static_call\n }\n\n // Different to an empty context, a hidden context won't reveal the caller's msg_sender and storage_contract_address,\n // but will still propagate the is_static_call flag.\n pub fn is_hidden(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero()\n }\n}\n\nimpl Serialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn serialize(self) -> [Field; CALLER_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, CALLER_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.msg_sender.serialize());\n fields.extend_from_array(self.storage_contract_address.serialize());\n fields.push(self.is_static_call as Field);\n\n assert_eq(fields.len(), CALLER_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn deserialize(fields: [Field; CALLER_CONTEXT_LENGTH]) -> CallerContext {\n let mut reader = Reader::new(fields);\n\n let item = CallerContext {\n msg_sender: reader.read_struct(AztecAddress::deserialize),\n storage_contract_address: reader.read_struct(AztecAddress::deserialize),\n is_static_call: reader.read_bool(),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = CallerContext::empty();\n let serialized = item.serialize();\n let deserialized = CallerContext::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"219":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr","source":"use crate::{\n abis::side_effect::{Ordered, OrderedValue, Scoped}, address::AztecAddress,\n constants::{\n LOG_HASH_LENGTH, NOTE_LOG_HASH_LENGTH, ENCRYPTED_LOG_HASH_LENGTH, SCOPED_LOG_HASH_LENGTH,\n SCOPED_ENCRYPTED_LOG_HASH_LENGTH\n},\n traits::{Empty, Serialize, Deserialize}, utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct LogHash {\n value: Field,\n counter: u32,\n length: Field,\n}\n\nimpl Ordered for LogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for LogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for LogHash {\n fn eq(self, other: LogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n }\n}\n\nimpl Empty for LogHash {\n fn empty() -> Self {\n LogHash {\n value: 0,\n counter: 0,\n length: 0,\n }\n }\n}\n\nimpl Serialize<LOG_HASH_LENGTH> for LogHash {\n fn serialize(self) -> [Field; LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length]\n }\n}\n\nimpl Deserialize<LOG_HASH_LENGTH> for LogHash {\n fn deserialize(values: [Field; LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n }\n }\n}\n\nimpl LogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedLogHash {\n ScopedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedLogHash {\n log_hash: LogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<LogHash> for ScopedLogHash {\n fn inner(self) -> LogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedLogHash {\n fn eq(self, other: ScopedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedLogHash {\n fn empty() -> Self {\n ScopedLogHash {\n log_hash: LogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn serialize(self) -> [Field; SCOPED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn deserialize(values: [Field; SCOPED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(LogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedLogHash {\n pub fn expose_to_public(self) -> Self {\n // Hide the counter when exposing to public.\n Self {\n log_hash: LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length },\n contract_address: self.contract_address\n }\n }\n}\n\nstruct EncryptedLogHash {\n value: Field,\n counter: u32,\n length: Field,\n randomness: Field,\n}\n\nimpl Ordered for EncryptedLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for EncryptedLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for EncryptedLogHash {\n fn eq(self, other: EncryptedLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.randomness == other.randomness) \n }\n}\n\nimpl Empty for EncryptedLogHash {\n fn empty() -> Self {\n EncryptedLogHash {\n value: 0,\n counter: 0,\n length: 0,\n randomness: 0,\n }\n }\n}\n\nimpl Serialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn serialize(self) -> [Field; ENCRYPTED_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.randomness]\n }\n}\n\nimpl Deserialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn deserialize(values: [Field; ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n randomness: values[3],\n }\n }\n}\n\nimpl EncryptedLogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedEncryptedLogHash {\n ScopedEncryptedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<EncryptedLogHash> for ScopedEncryptedLogHash {\n fn inner(self) -> EncryptedLogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl ScopedEncryptedLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the secret randomness and counter when exposing to public\n // Expose as a LogHash rather than EncryptedLogHash to avoid bringing an unnec. 0 value around\n // The log hash will already be silo'd when we call this\n LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length }\n }\n}\n\nimpl Ordered for ScopedEncryptedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedEncryptedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedEncryptedLogHash {\n fn eq(self, other: ScopedEncryptedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedEncryptedLogHash {\n fn empty() -> Self {\n ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn serialize(self) -> [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn deserialize(values: [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(EncryptedLogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nstruct NoteLogHash {\n value: Field,\n counter: u32,\n length: Field,\n note_hash_counter: u32,\n}\n\nimpl NoteLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the actual counter and note hash counter when exposing it to the public kernel.\n // The counter is usually note_hash.counter + 1, so it can be revealing.\n // Expose as a LogHash rather than NoteLogHash to avoid bringing an unnec. 0 value around\n LogHash { value: self.value, counter: 0, length: self.length }\n }\n}\n\nimpl Ordered for NoteLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for NoteLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteLogHash {\n fn eq(self, other: NoteLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.note_hash_counter == other.note_hash_counter) \n }\n}\n\nimpl Empty for NoteLogHash {\n fn empty() -> Self {\n NoteLogHash {\n value: 0,\n counter: 0,\n length: 0,\n note_hash_counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn serialize(self) -> [Field; NOTE_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.note_hash_counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn deserialize(values: [Field; NOTE_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n note_hash_counter: values[3] as u32,\n }\n }\n}\n"},"223":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/append_only_tree_snapshot.nr","source":"struct AppendOnlyTreeSnapshot {\n root : Field,\n // TODO(Alvaro) change this to a u64\n next_available_leaf_index : u32\n}\n\nglobal APPEND_ONLY_TREE_SNAPSHOT_LENGTH: u32 = 2;\n\nimpl AppendOnlyTreeSnapshot {\n pub fn serialize(self) -> [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH] {\n [self.root, self.next_available_leaf_index as Field]\n }\n\n pub fn deserialize(serialized: [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH]) -> AppendOnlyTreeSnapshot {\n AppendOnlyTreeSnapshot { root: serialized[0], next_available_leaf_index: serialized[1] as u32 }\n }\n\n pub fn zero() -> Self {\n Self { root: 0, next_available_leaf_index: 0 }\n }\n}\n\nimpl Eq for AppendOnlyTreeSnapshot {\n fn eq(self, other : AppendOnlyTreeSnapshot) -> bool {\n (self.root == other.root) & (self.next_available_leaf_index == other.next_available_leaf_index)\n }\n}\n"},"224":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::AztecAddress,\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader\n};\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, other: CallContext) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl Serialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n let mut serialized: BoundedVec<Field, CALL_CONTEXT_LENGTH> = BoundedVec::new();\n\n serialized.push(self.msg_sender.to_field());\n serialized.push(self.storage_contract_address.to_field());\n serialized.push(self.function_selector.to_field());\n serialized.push(self.is_delegate_call as Field);\n serialized.push(self.is_static_call as Field);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn deserialize(serialized: [Field; CALL_CONTEXT_LENGTH]) -> CallContext {\n let mut reader = Reader::new(serialized);\n CallContext {\n msg_sender: AztecAddress::from_field(reader.read()),\n storage_contract_address: AztecAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()),\n is_delegate_call: reader.read() as bool,\n is_static_call: reader.read() as bool,\n }\n }\n}\n\nimpl Empty for CallContext {\n fn empty() -> Self {\n CallContext {\n msg_sender: AztecAddress::empty(),\n storage_contract_address: AztecAddress::empty(),\n function_selector: FunctionSelector::empty(),\n is_delegate_call: false,\n is_static_call: false,\n }\n }\n}\n\n#[test]\nfn serialize_deserialize_of_empty() {\n let context = CallContext::empty();\n let serialized = context.serialize();\n let deserialized = CallContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = true;\n\n let address: AztecAddress = AztecAddress::from_field(69420);\n context1.msg_sender = address;\n context2.msg_sender = address;\n\n assert(context1.eq(context2));\n}\n\n#[test(should_fail)]\nfn not_eq_test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = false;\n\n let address1: AztecAddress = AztecAddress::from_field(69420);\n let address2: AztecAddress = AztecAddress::from_field(42069);\n\n context1.msg_sender = address1;\n context2.msg_sender = address2;\n\n assert(context1.eq(context2));\n}\n\n#[test]\nfn hash_smoke() {\n let context = CallContext::empty();\n let _hashed = context.hash();\n}\n"},"225":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/max_block_number.nr","source":"use crate::{constants::MAX_BLOCK_NUMBER_LENGTH, traits::{Deserialize, Serialize, Empty}};\n\nstruct MaxBlockNumber {\n _opt: Option<u32>\n}\n\nimpl Empty for MaxBlockNumber {\n fn empty() -> Self {\n Self { _opt: Option::none() }\n }\n}\n\nimpl Eq for MaxBlockNumber {\n fn eq(self, other: Self) -> bool {\n self._opt == other._opt\n }\n}\n\nimpl Serialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn serialize(self) -> [Field; MAX_BLOCK_NUMBER_LENGTH] {\n [self._opt._is_some as Field, self._opt._value as Field]\n }\n}\n\nimpl Deserialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn deserialize(serialized: [Field; MAX_BLOCK_NUMBER_LENGTH]) -> MaxBlockNumber {\n MaxBlockNumber {\n _opt: Option {\n _is_some: serialized[0] as bool,\n _value: serialized[1] as u32,\n }\n }\n }\n}\n\nimpl MaxBlockNumber {\n pub fn new(max_block_number: u32) -> Self {\n Self { _opt: Option::some(max_block_number) }\n }\n\n pub fn is_none(self) -> bool {\n self._opt.is_none()\n }\n\n pub fn is_some(self) -> bool {\n self._opt.is_some()\n }\n\n pub fn unwrap(self) -> u32 {\n self._opt.unwrap()\n }\n\n pub fn unwrap_unchecked(self) -> u32 {\n self._opt.unwrap_unchecked()\n }\n\n pub fn min(lhs: MaxBlockNumber, rhs: MaxBlockNumber) -> MaxBlockNumber {\n if rhs.is_none() {\n lhs // lhs might also be none, but in that case both would be\n } else {\n MaxBlockNumber::min_with_u32(lhs, rhs.unwrap_unchecked())\n }\n }\n\n pub fn min_with_u32(lhs: MaxBlockNumber, rhs: u32) -> MaxBlockNumber {\n if lhs._opt.is_none() {\n MaxBlockNumber::new(rhs)\n } else {\n let lhs_value = lhs._opt.unwrap_unchecked();\n\n MaxBlockNumber::new(if lhs_value < rhs { lhs_value } else { rhs })\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = MaxBlockNumber::empty();\n let serialized = item.serialize();\n let deserialized = MaxBlockNumber::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn zeroed_is_none() {\n // Large parts of the kernel rely on zeroed to initialize structs. This conveniently matches what `default` does,\n // and though we should eventually move everything to use `default`, it's good to check for now that both are\n // equivalent.\n let a = MaxBlockNumber::empty();\n assert(a.is_none());\n}\n\n#[test]\nfn serde_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert(b.is_none());\n}\n\n#[test]\nfn serde_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert_eq(b.unwrap(), 13);\n}\n\n#[test(should_fail)]\nfn default_unwrap_panics() {\n let a = MaxBlockNumber::empty();\n let _ = a.unwrap();\n}\n\n#[test]\nfn min_default_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::empty();\n\n assert(MaxBlockNumber::min(a, b).is_none());\n}\n\n#[test]\nfn min_default_some() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::new(13);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_some_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::new(42);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_with_u32_default() {\n let a = MaxBlockNumber::empty();\n let b = 42;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 42);\n}\n\n#[test]\nfn min_with_u32_some() {\n let a = MaxBlockNumber::new(13);\n let b = 42;\n let c = 8;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min_with_u32(a, c).unwrap(), 8);\n}\n"},"228":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr","source":"use crate::{\n abis::function_selector::FunctionSelector,\n constants::{GENERATOR_INDEX__FUNCTION_DATA, FUNCTION_DATA_LENGTH}, hash::pedersen_hash,\n traits::{Serialize, Hash, Deserialize, Empty}\n};\n\nstruct FunctionData {\n selector : FunctionSelector,\n is_private : bool,\n}\n\nimpl Eq for FunctionData {\n fn eq(self, other: Self) -> bool {\n self.selector.eq(other.selector) &\n (self.is_private == other.is_private)\n }\n}\n\nimpl Serialize<FUNCTION_DATA_LENGTH> for FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn serialize(self) -> [Field; FUNCTION_DATA_LENGTH] {\n [\n self.selector.to_field(),\n self.is_private as Field,\n ]\n }\n}\n\nimpl Deserialize<FUNCTION_DATA_LENGTH> for FunctionData {\n fn deserialize(serialized: [Field; FUNCTION_DATA_LENGTH]) -> Self {\n Self {\n selector: FunctionSelector::from_field(serialized[0]),\n is_private: serialized[1] as bool,\n }\n }\n}\n\nimpl Hash for FunctionData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n\nimpl Empty for FunctionData {\n fn empty() -> Self {\n FunctionData {\n selector: FunctionSelector::empty(),\n is_private: false\n }\n }\n\n}\n\n#[test]\nfn serialization_of_empty() {\n let data = FunctionData::empty();\n let serialized = data.serialize();\n let deserialized = FunctionData::deserialize(serialized);\n assert(data.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let data = FunctionData::empty();\n let hash = data.hash();\n\n // Value from function_data.test.ts \"computes empty function data hash\" test\n let test_data_empty_hash = 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"23":{"path":"std/field/bn254.nr","source":"use crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\nglobal TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n let x_bytes = x.to_le_bytes(32);\n\n let mut low: Field = 0;\n let mut high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n low += (x_bytes[i] as Field) * offset;\n high += (x_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n\n (low, high)\n}\n\nunconstrained pub(crate) fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nfn compute_lt(x: Field, y: Field, num_bytes: u32) -> bool {\n let x_bytes = x.to_le_radix(256, num_bytes);\n let y_bytes = y.to_le_radix(256, num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i];\n let y_byte = y_bytes[num_bytes - 1 - i];\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\nfn compute_lte(x: Field, y: Field, num_bytes: u32) -> bool {\n if x == y {\n true\n } else {\n compute_lt(x, y, num_bytes)\n }\n}\n\nunconstrained fn lt_32_hint(x: Field, y: Field) -> bool {\n compute_lt(x, y, 32)\n}\n\nunconstrained fn lte_16_hint(x: Field, y: Field) -> bool {\n compute_lte(x, y, 16)\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n let borrow = lte_16_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size(128);\n rhi.assert_max_bit_size(128);\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size(128);\n xhi.assert_max_bit_size(128);\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(compute_lt(b, a, 32));\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n compute_lt(b, a, 32)\n } else if a == b {\n false\n } else {\n // Take a hint of the comparison and verify it\n if lt_32_hint(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{decompose_hint, decompose, compute_lt, assert_gt, gt, lt, TWO_POW_128, compute_lte, PLO, PHI};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n fn check_compute_lt() {\n assert(compute_lt(0, 1, 16));\n assert(compute_lt(0, 0x100, 16));\n assert(compute_lt(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lt(0, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_compute_lte() {\n assert(compute_lte(0, 1, 16));\n assert(compute_lte(0, 0x100, 16));\n assert(compute_lte(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lte(0, TWO_POW_128, 16));\n\n assert(compute_lte(0, 0, 16));\n assert(compute_lte(0x100, 0x100, 16));\n assert(compute_lte(TWO_POW_128 - 1, TWO_POW_128 - 1, 16));\n assert(compute_lte(TWO_POW_128, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"},"235":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/messaging/l2_to_l1_message.nr","source":"use crate::{\n address::{AztecAddress, EthAddress},\n constants::{L2_TO_L1_MESSAGE_LENGTH, SCOPED_L2_TO_L1_MESSAGE_LENGTH},\n abis::side_effect::{Ordered, Scoped}, traits::{Deserialize, Empty, Serialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\n// Note: Not to be confused with L2ToL1Msg in Solidity\nstruct L2ToL1Message {\n recipient: EthAddress,\n content: Field,\n counter: u32,\n}\n\nimpl Ordered for L2ToL1Message {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Empty for L2ToL1Message {\n fn empty() -> Self {\n Self {\n recipient: EthAddress::empty(),\n content: 0,\n counter: 0,\n }\n }\n}\n\nimpl Eq for L2ToL1Message {\n fn eq(self, other: Self) -> bool {\n (self.recipient == other.recipient) & (self.content == other.content) & (self.counter == other.counter)\n }\n}\n\nimpl Serialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn serialize(self) -> [Field; L2_TO_L1_MESSAGE_LENGTH] {\n [self.recipient.to_field(), self.content, self.counter as Field]\n }\n}\n\nimpl Deserialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn deserialize(values: [Field; L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n Self {\n recipient: EthAddress::from_field(values[0]),\n content: values[1],\n counter: values[2] as u32,\n }\n }\n}\n\nimpl L2ToL1Message {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedL2ToL1Message {\n ScopedL2ToL1Message { message: self, contract_address }\n }\n}\n\nstruct ScopedL2ToL1Message {\n message: L2ToL1Message,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<L2ToL1Message> for ScopedL2ToL1Message {\n fn inner(self) -> L2ToL1Message {\n self.message\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedL2ToL1Message {\n fn counter(self) -> u32 {\n self.message.counter\n }\n}\n\nimpl Eq for ScopedL2ToL1Message {\n fn eq(self, other: ScopedL2ToL1Message) -> bool {\n (self.message == other.message)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedL2ToL1Message {\n fn empty() -> Self {\n ScopedL2ToL1Message {\n message: L2ToL1Message::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn serialize(self) -> [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH] {\n array_concat(self.message.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn deserialize(values: [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n message: reader.read_struct(L2ToL1Message::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\n#[test]\nfn serialization_of_empty_l2() {\n let item = L2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = L2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped_l2() {\n let item = ScopedL2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = ScopedL2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"237":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr","source":"use crate::{hash::pedersen_hash, traits::ToField};\n\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field where K: ToField {\n pedersen_hash([storage_slot, key.to_field()], 0)\n}\n"},"24":{"path":"std/field/mod.nr","source":"mod bn254;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n\n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(self, _bit_size: u32) -> [u1] {}\n\n #[builtin(to_be_bits)]\n fn __to_be_bits(self, bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n let num_bytes = (modulus_num_bits() as u32 + 7) / 8;\n let x_bytes = x.to_le_bytes(num_bytes);\n let y_bytes = y.to_le_bytes(num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i] as u8;\n let y_byte = y_bytes[num_bytes - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\n"},"242":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr","source":"use crate::traits::{Serialize, Deserialize};\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\nglobal U8_SERIALIZED_LEN: Field = 1;\nglobal U32_SERIALIZED_LEN: Field = 1;\nglobal U64_SERIALIZED_LEN: Field = 1;\nglobal U128_SERIALIZED_LEN: Field = 1;\nglobal FIELD_SERIALIZED_LEN: Field = 1;\n\nimpl Serialize<BOOL_SERIALIZED_LEN> for bool {\n fn serialize(self) -> [Field; BOOL_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<BOOL_SERIALIZED_LEN> for bool {\n fn deserialize(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n }\n}\n\nimpl Serialize<U8_SERIALIZED_LEN> for u8 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U8_SERIALIZED_LEN> for u8 {\n fn deserialize(fields: [Field; U8_SERIALIZED_LEN]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Serialize<U32_SERIALIZED_LEN> for u32 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U32_SERIALIZED_LEN> for u32 {\n fn deserialize(fields: [Field; U32_SERIALIZED_LEN]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Serialize<U64_SERIALIZED_LEN> for u64 {\n fn serialize(self) -> [Field; U64_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U64_SERIALIZED_LEN> for u64 {\n fn deserialize(fields: [Field; U64_SERIALIZED_LEN]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Serialize<U128_SERIALIZED_LEN> for U128 {\n fn serialize(self) -> [Field; 1] {\n [self.to_integer()]\n }\n\n}\n\nimpl Deserialize<U128_SERIALIZED_LEN> for U128 {\n fn deserialize(fields: [Field; U128_SERIALIZED_LEN]) -> Self {\n U128::from_integer(fields[0])\n }\n}\n\nimpl Serialize<FIELD_SERIALIZED_LEN> for Field {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self]\n }\n}\n\nimpl Deserialize<FIELD_SERIALIZED_LEN> for Field {\n fn deserialize(fields: [Field; FIELD_SERIALIZED_LEN]) -> Self {\n fields[0]\n }\n}\n"},"243":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr","source":"use crate::utils::field::field_from_bytes;\n\n// Trait: is_empty\n//\n// The general is_empty trait checks if a data type is is empty,\n// and it defines empty for the basic data types as 0.\n//\n// If a Field is equal to zero, then it is regarded as zero.\n// We will go with this definition for now, however it can be problematic \n// if a value can actually be zero. In a future refactor, we can \n// use the optional type for safety. Doing it now would lead to a worse devex\n// and would make it harder to sync up with the cpp code.\n// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty.\ntrait Empty {\n fn empty() -> Self;\n}\n\nimpl Empty for Field { fn empty() -> Self {0} }\n\nimpl Empty for u1 { fn empty() -> Self {0} }\nimpl Empty for u8 { fn empty() -> Self {0} }\nimpl Empty for u32 { fn empty() -> Self {0} }\nimpl Empty for u64 { fn empty() -> Self {0} }\nimpl Empty for U128 { fn empty() -> Self {U128::from_integer(0)} }\n\npub fn is_empty<T>(item: T) -> bool where T: Empty + Eq {\n item.eq(T::empty())\n}\n\npub fn is_empty_array<T, let N: u32>(array: [T; N]) -> bool where T: Empty + Eq {\n array.all(|elem| is_empty(elem))\n}\n\ntrait Hash {\n fn hash(self) -> Field;\n}\n\ntrait ToField {\n fn to_field(self) -> Field;\n}\n\nimpl ToField for Field {\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u1 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u8 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u32 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u64 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for U128 {\n fn to_field(self) -> Field {\n self.to_integer()\n }\n}\nimpl<let N: u32> ToField for str<N> {\n fn to_field(self) -> Field {\n assert(N < 32, \"String doesn't fit in a field, consider using Serialize instead\");\n field_from_bytes(self.as_bytes(), true)\n }\n}\n\ntrait FromField {\n fn from_field(value: Field) -> Self;\n}\n\nimpl FromField for Field {\n fn from_field(value: Field) -> Self {\n value\n }\n}\n\nimpl FromField for bool { fn from_field(value: Field) -> Self { value as bool } }\nimpl FromField for u1 { fn from_field(value: Field) -> Self { value as u1 } }\nimpl FromField for u8 { fn from_field(value: Field) -> Self { value as u8 } }\nimpl FromField for u32 { fn from_field(value: Field) -> Self { value as u32 } }\nimpl FromField for u64 { fn from_field(value: Field) -> Self { value as u64 } }\nimpl FromField for U128 {\n fn from_field(value: Field) -> Self {\n U128::from_integer(value)\n }\n}\n\n// docs:start:serialize\ntrait Serialize<let N: u32> {\n fn serialize(self) -> [Field; N];\n}\n// docs:end:serialize\n\nimpl<let N: u32> Serialize<N> for [Field; N] {\n fn serialize(self) -> [Field; N] {\n self\n }\n}\nimpl<let N: u32> Serialize<N> for str<N> {\n fn serialize(self) -> [Field; N] {\n let mut result = [0; N];\n let bytes: [u8; N] = self.as_bytes();\n for i in 0..N {\n result[i] = field_from_bytes([bytes[i];1], true);\n }\n result\n }\n}\n\n// docs:start:deserialize\ntrait Deserialize<let N: u32> {\n fn deserialize(fields: [Field; N]) -> Self;\n}\n// docs:end:deserialize\n\nimpl<let N: u32> Deserialize<N> for [Field; N] {\n fn deserialize(fields: [Field; N]) -> Self {\n fields\n }\n}\n"},"244":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr","source":"// Utility function to console.log data in the acir simulator\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<let M: u32>(_msg: str<M>, args: [Field]) {}\n\n/// NOTE: call this with a str<N> msg of form\n/// \"some string with {0} and {1} ... {N}\"\n/// and an array of N field which will be formatted\n/// into the string in the simulator.\n/// Example:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\nunconstrained pub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n/// NOTE: call this with a str<N> msg of length > 1\n/// Example:\n/// `debug_log(\"blah blah this is a debug string\");`\nunconstrained pub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n"},"245":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr","source":"use crate::{\n constants::CONTENT_COMMITMENT_LENGTH, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct ContentCommitment {\n num_txs: Field,\n txs_effects_hash: Field,\n in_hash: Field,\n out_hash: Field,\n}\n\nimpl Serialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn serialize(self) -> [Field; CONTENT_COMMITMENT_LENGTH] {\n let mut fields: BoundedVec<Field, CONTENT_COMMITMENT_LENGTH> = BoundedVec::new();\n\n fields.push(self.num_txs);\n fields.push(self.txs_effects_hash);\n fields.push(self.in_hash);\n fields.push(self.out_hash);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn deserialize(serialized: [Field; CONTENT_COMMITMENT_LENGTH]) -> Self {\n let num_txs = serialized[0];\n\n let txs_effects_hash = serialized[1];\n\n let in_hash = serialized[2];\n\n let out_hash = serialized[3];\n\n Self {\n num_txs,\n txs_effects_hash,\n in_hash,\n out_hash,\n }\n }\n}\n\nimpl Empty for ContentCommitment {\n fn empty() -> Self {\n Self {\n num_txs: 0,\n txs_effects_hash: 0,\n in_hash: 0,\n out_hash: 0,\n }\n }\n}\n\nimpl Eq for ContentCommitment {\n fn eq(self, other: Self) -> bool {\n (self.num_txs == other.num_txs)\n & (self.txs_effects_hash == other.txs_effects_hash)\n & (self.in_hash == other.in_hash)\n & (self.out_hash == other.out_hash)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let empty = ContentCommitment::empty();\n let serialized = empty.serialize();\n let deserialized = ContentCommitment::deserialize(serialized);\n\n assert(empty.eq(deserialized));\n}\n"},"246":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/public_data_tree_leaf_preimage.nr","source":"use crate::{merkle_tree::leaf_preimage::IndexedTreeLeafPreimage, traits::{Empty, Hash}};\n\nstruct PublicDataTreeLeafPreimage {\n slot : Field,\n value: Field,\n next_slot :Field,\n next_index : u32,\n}\n\nimpl Empty for PublicDataTreeLeafPreimage {\n fn empty() -> Self {\n Self {\n slot: 0,\n value: 0,\n next_slot: 0,\n next_index: 0,\n }\n }\n}\n\nimpl Hash for PublicDataTreeLeafPreimage {\n fn hash(self) -> Field {\n if self.is_empty() {\n 0\n } else {\n std::hash::pedersen_hash([self.slot, self.value, (self.next_index as Field), self.next_slot])\n }\n }\n}\n\nimpl IndexedTreeLeafPreimage for PublicDataTreeLeafPreimage {\n fn get_key(self) -> Field {\n self.slot\n }\n\n fn get_next_key(self) -> Field {\n self.next_slot\n }\n\n fn as_leaf(self) -> Field {\n self.hash()\n }\n}\n\nimpl PublicDataTreeLeafPreimage {\n pub fn is_empty(self) -> bool {\n (self.slot == 0) & (self.value == 0) & (self.next_slot == 0) & (self.next_index == 0)\n }\n}\n"},"247":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/header.nr","source":"use crate::{\n abis::{\n append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n global_variables::{GlobalVariables, GLOBAL_VARIABLES_LENGTH}\n},\n constants::{GENERATOR_INDEX__BLOCK_HASH, HEADER_LENGTH, STATE_REFERENCE_LENGTH, CONTENT_COMMITMENT_LENGTH},\n hash::pedersen_hash, state_reference::StateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice, content_commitment::ContentCommitment\n};\n\n// docs:start:header\nstruct Header {\n last_archive: AppendOnlyTreeSnapshot,\n content_commitment: ContentCommitment,\n state: StateReference,\n global_variables: GlobalVariables,\n total_fees: Field\n}\n// docs:end:header\n\nimpl Eq for Header {\n fn eq(self, other: Self) -> bool {\n self.last_archive.eq(other.last_archive) &\n self.content_commitment.eq(other.content_commitment) &\n self.state.eq(other.state) &\n self.global_variables.eq(other.global_variables) &\n self.total_fees.eq(other.total_fees)\n }\n}\n\nimpl Serialize<HEADER_LENGTH> for Header {\n fn serialize(self) -> [Field; HEADER_LENGTH] {\n let mut fields: BoundedVec<Field, HEADER_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.last_archive.serialize());\n fields.extend_from_array(self.content_commitment.serialize());\n fields.extend_from_array(self.state.serialize());\n fields.extend_from_array(self.global_variables.serialize());\n fields.push(self.total_fees);\n\n fields.storage\n }\n}\n\nimpl Deserialize<HEADER_LENGTH> for Header {\n fn deserialize(serialized: [Field; HEADER_LENGTH]) -> Self {\n let mut offset = 0;\n\n let last_archive_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let content_commitment_fields = arr_copy_slice(serialized, [0; CONTENT_COMMITMENT_LENGTH], offset);\n offset = offset + CONTENT_COMMITMENT_LENGTH;\n\n let state_fields = arr_copy_slice(serialized, [0; STATE_REFERENCE_LENGTH], offset);\n offset = offset + STATE_REFERENCE_LENGTH;\n\n let global_variables_fields = arr_copy_slice(serialized, [0; GLOBAL_VARIABLES_LENGTH], offset);\n offset = offset + GLOBAL_VARIABLES_LENGTH;\n\n let total_fees = serialized[offset];\n\n Header {\n last_archive: AppendOnlyTreeSnapshot::deserialize(last_archive_fields),\n content_commitment: ContentCommitment::deserialize(content_commitment_fields),\n state: StateReference::deserialize(state_fields),\n global_variables: GlobalVariables::deserialize(global_variables_fields),\n total_fees\n }\n }\n}\n\nimpl Empty for Header {\n fn empty() -> Self {\n Self {\n last_archive: AppendOnlyTreeSnapshot::zero(),\n content_commitment: ContentCommitment::empty(),\n state: StateReference::empty(),\n global_variables: GlobalVariables::empty(),\n total_fees: 0\n }\n }\n}\n\nimpl Hash for Header {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__BLOCK_HASH)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let header = Header::empty();\n let serialized = header.serialize();\n let deserialized = Header::deserialize(serialized);\n assert(header.eq(deserialized));\n}\n\n#[test]\nfn hash_smoke() {\n let header = Header::empty();\n let _hashed = header.hash();\n}\n\n#[test]\nfn empty_hash_is_zero() {\n let header = Header::empty();\n let hash = header.hash();\n\n // Value from new_contract_data.test.ts \"computes empty hash\" test\n let test_data_empty_hash = 0x124e8c40a6eca2e3ad10c04050b01a3fad00df3cea47b13592c7571b6914c7a7;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"248":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, log_hash::{LogHash, ScopedLogHash, ScopedEncryptedLogHash},\n note_hash::ScopedNoteHash, nullifier::ScopedNullifier\n},\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX\n},\n merkle_tree::root::root_from_sibling_path, messaging::l2_to_l1_message::ScopedL2ToL1Message,\n recursion::verification_key::VerificationKey, traits::is_empty,\n utils::field::field_from_bytes_32_trunc\n};\nuse std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path)\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n pedersen_hash(\n [\n tx_hash,\n note_index_in_tx as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, inner_note_hash: Field) -> Field {\n let inputs = [nonce, inner_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn compute_siloed_encrypted_log_hash(address: AztecAddress, randomness: Field, log_hash: Field) -> Field {\n // TODO: Using 0 GENERATOR_INDEX here as interim before we move to posiedon\n // NB: A unique separator will be needed for masked_contract_address\n let mut masked_contract_address = pedersen_hash([address.to_field(), randomness], 0);\n if randomness == 0 {\n // In some cases, we actually want to reveal the contract address we are siloing with:\n // e.g. 'handshaking' contract w/ known address\n // An app providing randomness = 0 signals to not mask the address.\n masked_contract_address = address.to_field();\n }\n accumulate_sha256([masked_contract_address, log_hash])\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedEncryptedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_encrypted_log_hash(\n log_hash.contract_address,\n log_hash.log_hash.randomness,\n log_hash.log_hash.value\n )\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(msg: ScopedL2ToL1Message, rollup_version_id: Field, chain_id: Field) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually\n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field\n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes = input[offset].to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly.\npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,\n 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,\n 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), EthAddress::from_field(3), 5, 2, 4);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n"},"249":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot, constants::PARTIAL_STATE_REFERENCE_LENGTH,\n traits::{Deserialize, Empty, Serialize}\n};\n\nstruct PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot,\n nullifier_tree: AppendOnlyTreeSnapshot,\n public_data_tree: AppendOnlyTreeSnapshot,\n}\n\nimpl Eq for PartialStateReference {\n fn eq(self, other: PartialStateReference) -> bool {\n self.note_hash_tree.eq(other.note_hash_tree) &\n self.nullifier_tree.eq(other.nullifier_tree) &\n self.public_data_tree.eq(other.public_data_tree)\n }\n}\n\nimpl Serialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn serialize(self) -> [Field; PARTIAL_STATE_REFERENCE_LENGTH] {\n let serialized_note_hash_tree = self.note_hash_tree.serialize();\n let serialized_nullifier_tree = self.nullifier_tree.serialize();\n let serialized_public_data_tree = self.public_data_tree.serialize();\n\n [\n serialized_note_hash_tree[0], \n serialized_note_hash_tree[1],\n serialized_nullifier_tree[0],\n serialized_nullifier_tree[1],\n serialized_public_data_tree[0],\n serialized_public_data_tree[1],\n ]\n }\n}\n\nimpl Deserialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn deserialize(serialized: [Field; PARTIAL_STATE_REFERENCE_LENGTH]) -> PartialStateReference {\n PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[0], serialized[1]]\n ),\n nullifier_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[2], serialized[3]]\n ),\n public_data_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[4], serialized[5]]\n ),\n }\n }\n}\n\nimpl Empty for PartialStateReference {\n fn empty() -> Self {\n Self {\n note_hash_tree: AppendOnlyTreeSnapshot::zero(),\n nullifier_tree: AppendOnlyTreeSnapshot::zero(),\n public_data_tree: AppendOnlyTreeSnapshot::zero(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let partial = PartialStateReference::empty();\n let _serialized = partial.serialize();\n let _deserialized = PartialStateReference::deserialize(_serialized);\n}\n"},"251":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr","source":"use crate::{\n constants::{GENERATOR_INDEX__TX_CONTEXT, TX_CONTEXT_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n abis::gas_settings::GasSettings\n};\n\n// docs:start:tx-context\nstruct TxContext {\n chain_id : Field,\n version : Field,\n gas_settings: GasSettings,\n}\n// docs:end:tx-context\n\nimpl TxContext {\n pub fn new(chain_id: Field, version: Field, gas_settings: GasSettings) -> Self {\n TxContext { chain_id, version, gas_settings }\n }\n}\n\nimpl Eq for TxContext {\n fn eq(self, other: Self) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.gas_settings.eq(other.gas_settings))\n }\n}\n\nimpl Empty for TxContext {\n fn empty() -> Self {\n TxContext {\n chain_id: 0,\n version: 0,\n gas_settings: GasSettings::empty(),\n }\n }\n}\n\nimpl Serialize<TX_CONTEXT_LENGTH> for TxContext {\n fn serialize(self) -> [Field; TX_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, TX_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.push(self.chain_id);\n fields.push(self.version);\n fields.extend_from_array(self.gas_settings.serialize());\n\n assert_eq(fields.len(), TX_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<TX_CONTEXT_LENGTH> for TxContext {\n fn deserialize(serialized: [Field; TX_CONTEXT_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let context = Self {\n chain_id: reader.read(),\n version: reader.read(),\n gas_settings: reader.read_struct(GasSettings::deserialize),\n };\n\n reader.finish();\n context\n }\n}\n\nimpl Hash for TxContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__TX_CONTEXT)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let context = TxContext::empty();\n let serialized = context.serialize();\n let deserialized = TxContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let context = TxContext::empty();\n let hash = context.hash();\n\n // Value from tx_context.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x17e4357684c5a4349b4587c95b0b6161dcb4a3c5b02d4eb2ecc3b02c80193261;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"255":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_instance.nr","source":"use crate::{\n address::{\n aztec_address::AztecAddress, eth_address::EthAddress, partial_address::PartialAddress,\n public_keys_hash::PublicKeysHash\n},\n contract_class_id::ContractClassId,\n constants::{GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA, CONTRACT_INSTANCE_LENGTH},\n traits::{Deserialize, Hash, Serialize}\n};\n\nstruct ContractInstance {\n salt : Field,\n deployer: AztecAddress,\n contract_class_id : ContractClassId,\n initialization_hash : Field,\n public_keys_hash : PublicKeysHash,\n}\n\nimpl Eq for ContractInstance {\n fn eq(self, other: Self) -> bool {\n self.public_keys_hash.eq(other.public_keys_hash) &\n self.initialization_hash.eq(other.initialization_hash) &\n self.contract_class_id.eq(other.contract_class_id) &\n self.salt.eq(other.salt)\n }\n}\n\nimpl Serialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn serialize(self) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n [\n self.salt,\n self.deployer.to_field(),\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys_hash.to_field()\n ]\n }\n}\n\nimpl Deserialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn deserialize(serialized: [Field; CONTRACT_INSTANCE_LENGTH]) -> Self {\n Self {\n salt: serialized[0],\n deployer: AztecAddress::from_field(serialized[1]),\n contract_class_id: ContractClassId::from_field(serialized[2]),\n initialization_hash: serialized[3],\n public_keys_hash: PublicKeysHash::from_field(serialized[4]),\n }\n }\n}\n\nimpl Hash for ContractInstance {\n fn hash(self) -> Field {\n self.to_address().to_field()\n }\n}\n\nimpl ContractInstance {\n fn to_address(self) -> AztecAddress {\n AztecAddress::compute(\n self.public_keys_hash,\n PartialAddress::compute(\n self.contract_class_id,\n self.salt,\n self.initialization_hash,\n self.deployer\n )\n )\n }\n}\n"},"256":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr","source":"use crate::constants::GENERATOR_INDEX__CONTRACT_LEAF;\nuse crate::traits::{ToField, FromField, Hash, Serialize, Deserialize};\n\nstruct ContractClassId {\n inner: Field\n}\n\nimpl Eq for ContractClassId {\n fn eq(self, other: ContractClassId) -> bool {\n other.inner == self.inner\n }\n}\n\nimpl ToField for ContractClassId {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for ContractClassId {\n fn from_field(value: Field) -> Self {\n Self { inner: value }\n }\n}\n\nimpl Serialize<1> for ContractClassId {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n}\n\nimpl Deserialize<1> for ContractClassId {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self { inner: fields[0] }\n }\n}\n\nimpl ContractClassId {\n pub fn compute(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field\n ) -> Self {\n let hash = std::hash::pedersen_hash_with_separator(\n [\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ],\n GENERATOR_INDEX__CONTRACT_LEAF\n ); // TODO(@spalladino): Update generator index\n\n ContractClassId::from_field(hash)\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"257":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n constants::{PARTIAL_STATE_REFERENCE_LENGTH, STATE_REFERENCE_LENGTH},\n partial_state_reference::PartialStateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot,\n partial: PartialStateReference,\n}\n\nimpl Eq for StateReference {\n fn eq(self, other: StateReference) -> bool {\n self.l1_to_l2_message_tree.eq(other.l1_to_l2_message_tree) &\n self.partial.eq(other.partial)\n }\n}\n\nimpl Serialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn serialize(self) -> [Field; STATE_REFERENCE_LENGTH] {\n let mut fields: BoundedVec<Field, STATE_REFERENCE_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.l1_to_l2_message_tree.serialize());\n fields.extend_from_array(self.partial.serialize());\n\n fields.storage\n }\n}\n\nimpl Deserialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn deserialize(serialized: [Field; STATE_REFERENCE_LENGTH]) -> StateReference {\n let mut offset = 0;\n\n let l1_to_l2_message_tree_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let partial_fields = arr_copy_slice(serialized, [0; PARTIAL_STATE_REFERENCE_LENGTH], offset);\n\n StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::deserialize(l1_to_l2_message_tree_fields),\n partial: PartialStateReference::deserialize(partial_fields),\n }\n }\n}\n\nimpl Empty for StateReference {\n fn empty() -> Self {\n Self {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::zero(),\n partial: PartialStateReference::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let state = StateReference::empty();\n let _serialized = state.serialize();\n let _deserialized = StateReference::deserialize(_serialized);\n}\n"},"27":{"path":"std/hash/mod.nr","source":"mod poseidon;\nmod mimc;\nmod poseidon2;\nmod keccak;\n\nuse crate::default::Default;\nuse crate::uint128::U128;\nuse crate::sha256::{digest, sha256_var};\nuse crate::collections::vec::Vec;\nuse crate::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_slice};\n\n#[foreign(sha256)]\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:sha256\n{}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n __pedersen_hash_with_separator(input, separator)\n}\n\nfn pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let value = __pedersen_commitment_with_separator(input, separator);\n if (value[0] == 0) & (value[1] == 0) {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n } else {\n EmbeddedCurvePoint { x: value[0], y: value[1], is_infinite: false }\n }\n}\n\nfn pedersen_commitment_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constraint the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\nfn pedersen_hash_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: Vec<EmbeddedCurveScalar> = Vec::from_slice([EmbeddedCurveScalar { lo: 0, hi: 0 }; N].as_slice()); //Vec::new();\n\n for i in 0..N {\n scalars.set(i, from_field_unsafe(input[i]));\n }\n scalars.push(EmbeddedCurveScalar { lo: N as Field, hi: 0 });\n let domain_generators :[EmbeddedCurvePoint; N]= derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n let mut vec_generators = Vec::from_slice(domain_generators.as_slice());\n let length_generator : [EmbeddedCurvePoint; 1] = derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n vec_generators.push(length_generator[0]);\n multi_scalar_mul_slice(vec_generators.slice, scalars.slice)[0]\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n __pedersen_hash_with_separator(input, 0)\n}\n\n#[foreign(pedersen_hash)]\nfn __pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {}\n\n#[foreign(pedersen_commitment)]\nfn __pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> [Field; 2] {}\n\n#[field(bn254)]\nfn derive_generators<let N: u32, let M: u32>(domain_separator_bytes: [u8; M], starting_index: u32) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n // Same as from_field but:\n // does not assert the limbs are 128 bits\n // does not assert the decomposition does not overflow the EmbeddedCurveScalar\n fn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n let (xlo, xhi) = crate::field::bn254::decompose_hint(scalar);\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes(32).as_array();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n// docs:start:keccak256\npub fn keccak256<let N: u32>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{\n crate::hash::keccak::keccak256(input, message_size)\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<let N: u32>(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n#[foreign(sha256_compression)]\npub fn sha256_compression(_input: [u32; 16], _state: [u32; 8]) -> [u32; 8] {}\n\n// Generic hashing support. \n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\ntrait Hash{\n fn hash<H>(self, state: &mut H) where H: Hasher;\n}\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\ntrait Hasher{\n fn finish(self) -> Field;\n \n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\ntrait BuildHasher<H> where H: Hasher{\n fn build_hasher(self) -> H;\n}\n\nstruct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher<H> for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn build_hasher(_self: Self) -> H{\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn default() -> Self{\n BuildHasherDefault{}\n } \n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H) where H: Hasher {}\n}\n\nimpl Hash for U128 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self.lo as Field);\n H::write(state, self.hi as Field);\n }\n}\n\nimpl<T, let N: u32> Hash for [T; N] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B) where A: Hash, B: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C) where A: Hash, B: Hash, C: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D) where A: Hash, B: Hash, C: Hash, D: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E) where A: Hash, B: Hash, C: Hash, D: Hash, E: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1), 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1), EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false\n }\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2), 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2), EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3), 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3), EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4), 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4), EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5), 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5), EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6), 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6), EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7), 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7), EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8), 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8), EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9), 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9), EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false\n }\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10), 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10), EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false\n }\n );\n}\n\n"},"271":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr","source":"struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n // TODO(#4394)\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"},"281":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr","source":"pub fn field_from_bytes<let N: u32>(bytes: [u8; N], big_endian: bool) -> Field {\n assert(bytes.len() < 32, \"field_from_bytes: N must be less than 32\");\n let mut as_field = 0;\n let mut offset = 1;\n for i in 0..N {\n let mut index = i;\n if big_endian {\n index = N - i - 1;\n }\n as_field += (bytes[index] as Field) * offset;\n offset *= 256;\n }\n\n as_field\n}\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\n#[test]\nunconstrained fn bytes_field_test() {\n // Tests correctness of field_from_bytes_32_trunc against existing methods\n // Bytes representing 0x543e0a6642ffeb8039296861765a53407bba62bd1c97ca43374de950bbe0a7\n let inputs = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167\n ];\n let field = field_from_bytes(inputs, true);\n let return_bytes = field.to_be_bytes(31);\n for i in 0..31 {\n assert_eq(inputs[i], return_bytes[i]);\n }\n // 32 bytes - we remove the final byte, and check it matches the field\n let inputs2 = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167, 158\n ];\n let field2 = field_from_bytes_32_trunc(inputs2);\n let return_bytes2 = field.to_be_bytes(31);\n\n for i in 0..31 {\n assert_eq(return_bytes2[i], return_bytes[i]);\n }\n assert_eq(field2, field);\n}\n\n#[test]\nunconstrained fn max_field_test() {\n // Tests the hardcoded value in constants.nr vs underlying modulus\n // NB: We can't use 0-1 in constants.nr as it will be transpiled incorrectly to ts and sol constants files\n let max_value = crate::constants::MAX_FIELD_VALUE;\n assert_eq(max_value, 0 - 1);\n // modulus == 0 is tested elsewhere, so below is more of a sanity check\n let max_bytes = max_value.to_be_bytes(32);\n let mod_bytes = std::field::modulus_be_bytes();\n for i in 0..31 {\n assert_eq(max_bytes[i], mod_bytes[i]);\n }\n assert_eq(max_bytes[31], mod_bytes[31] - 1);\n}\n"},"283":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/mod.nr","source":"// general util packages/modules are usually bad practice\n// because there is no criteria for what we should not put in here.\n// Reducing the size of this package would be welcome.\n\nmod arrays;\nmod field;\nmod reader;\nmod uint256;\n\n// if predicate == true then return lhs, else return rhs\npub fn conditional_assign(predicate: bool, lhs: Field, rhs: Field) -> Field {\n if predicate { lhs } else { rhs }\n}\n\npub fn arr_copy_slice<T, let N: u32, let M: u32>(src: [T; N], mut dst: [T; M], offset: u32) -> [T; M] {\n let iterator_len = if N > M { M } else { N };\n for i in 0..iterator_len {\n dst[i] = src[i + offset];\n }\n dst\n}\n"},"297":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/eth_address.nr","source":"use crate::{\n constants::ETH_ADDRESS_LENGTH, hash::pedersen_hash,\n traits::{Empty, ToField, Serialize, Deserialize}, utils\n};\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_LENGTH] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_LENGTH]) -> Self {\n EthAddress::from_field(fields[0])\n }\n}\n\nimpl EthAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n field.assert_max_bit_size(160);\n Self { inner: field }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n"},"298":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n crate::address::{eth_address::EthAddress, partial_address::PartialAddress, public_keys_hash::PublicKeysHash},\n constants::{AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1},\n contract_class_id::ContractClassId, hash::poseidon2_hash,\n traits::{Empty, FromField, ToField, Serialize, Deserialize}, utils\n};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n poseidon2_hash([pub_keys_hash.to_field(), partial_address.to_field(), GENERATOR_INDEX__CONTRACT_ADDRESS_V1])\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys_hash() {\n let pub_keys_hash = PublicKeysHash::from_field(1);\n let partial_address = PartialAddress::from_field(2);\n\n let address = AztecAddress::compute(pub_keys_hash, partial_address);\n let expected_computed_address_from_partial_and_pubkey = 0x1b6ead051e7b42665064ca6cf1ec77da0a36d86e00d1ff6e44077966c0c3a9fa;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"300":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/partial_address.nr","source":"use crate::{\n address::{\n eth_address::EthAddress, salted_initialization_hash::SaltedInitializationHash,\n aztec_address::AztecAddress\n},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, contract_class_id::ContractClassId,\n hash::pedersen_hash, traits::{ToField, FromField, Serialize, Deserialize}\n};\n\nglobal PARTIAL_ADDRESS_LENGTH = 1;\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn serialize(self: Self) -> [Field; PARTIAL_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn deserialize(fields: [Field; PARTIAL_ADDRESS_LENGTH]) -> Self {\n PartialAddress { inner: fields[0] }\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n deployer: AztecAddress\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, deployer)\n )\n }\n\n pub fn compute_from_salted_initialization_hash(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash\n ) -> Self {\n PartialAddress::from_field(\n pedersen_hash(\n [\n contract_class_id.to_field(),\n salted_initialization_hash.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.to_field() == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"301":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/salted_initialization_hash.nr","source":"use crate::{\n address::{eth_address::EthAddress, aztec_address::AztecAddress},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, hash::pedersen_hash, traits::ToField\n};\n\n// Salted initialization hash. Used in the computation of a partial address.\nstruct SaltedInitializationHash {\n inner: Field\n}\n\nimpl ToField for SaltedInitializationHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl SaltedInitializationHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(salt: Field, initialization_hash: Field, deployer: AztecAddress) -> Self {\n SaltedInitializationHash::from_field(\n pedersen_hash(\n [\n salt,\n initialization_hash,\n deployer.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"302":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr","source":"mod lib;\n\ncontract GasToken {\n use dep::aztec::{\n protocol_types::{\n contract_class_id::ContractClassId, abis::function_selector::FunctionSelector,\n address::{AztecAddress, EthAddress},\n constants::{DEPLOYER_CONTRACT_ADDRESS, REGISTERER_CONTRACT_ADDRESS}\n },\n state_vars::{SharedImmutable, PublicMutable, Map},\n oracle::get_contract_instance::get_contract_instance, deploy::deploy_contract\n };\n\n use dep::deployer::ContractInstanceDeployer;\n use dep::registerer::ContractClassRegisterer;\n\n use crate::lib::{calculate_fee, get_bridge_gas_msg_hash};\n\n #[aztec(storage)]\n struct Storage {\n // This map is accessed directly by protocol circuits to check balances for fee payment.\n // Do not change this storage layout unless you also update the base rollup circuits.\n balances: Map<AztecAddress, PublicMutable<U128>>,\n portal_address: SharedImmutable<EthAddress>,\n }\n\n // Not flagged as initializer to reduce cost of checking init nullifier in all functions.\n // This function should be called as entrypoint to initialize the contract by minting itself funds.\n #[aztec(private)]\n fn deploy(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field,\n portal_address: EthAddress\n ) {\n // Validate contract class parameters are correct\n let self = context.this_address();\n let instance = get_contract_instance(self);\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n assert(\n instance.contract_class_id == contract_class_id, \"Invalid contract class id computed for gas token\"\n );\n\n // Increase self balance and set as fee payer, and end setup\n let deploy_fees = 20000000000;\n GasToken::at(self)._increase_public_balance(self, deploy_fees).enqueue(&mut context);\n context.set_as_fee_payer();\n context.end_setup();\n\n // Register class and publicly deploy contract\n let _register = ContractClassRegisterer::at(AztecAddress::from_field(REGISTERER_CONTRACT_ADDRESS)).register(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ).call(&mut context);\n let _deploy = ContractInstanceDeployer::at(AztecAddress::from_field(DEPLOYER_CONTRACT_ADDRESS)).deploy(\n instance.salt,\n instance.contract_class_id,\n instance.initialization_hash,\n instance.public_keys_hash,\n true\n ).call(&mut context);\n\n // Enqueue call to set the portal address\n GasToken::at(self).set_portal(portal_address).enqueue(&mut context);\n }\n\n // We purposefully not set this function as an initializer so we do not bind\n // the contract to a specific L1 portal address, since the gas token address\n // is a hardcoded constant in the rollup circuits.\n #[aztec(public)]\n fn set_portal(portal_address: EthAddress) {\n assert(storage.portal_address.read_public().is_zero());\n storage.portal_address.initialize(portal_address);\n }\n\n #[aztec(private)]\n fn claim(to: AztecAddress, amount: Field, secret: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_private();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address);\n\n // TODO(palla/gas) Emit an unencrypted log to announce which L1 to L2 message has been claimed\n // Otherwise, we cannot trace L1 deposits to their corresponding claims on L2\n\n GasToken::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context);\n }\n\n #[aztec(public)]\n #[aztec(internal)]\n fn _increase_public_balance(to: AztecAddress, amount: Field) {\n let new_balance = storage.balances.at(to).read().add(U128::from_integer(amount));\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(palla/gas) Remove this function and use the private claim flow only\n #[aztec(public)]\n fn claim_public(to: AztecAddress, amount: Field, secret: Field, leaf_index: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_public();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address, leaf_index);\n\n let new_balance = storage.balances.at(to).read() + U128::from_integer(amount);\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(@just-mitch): remove this function before mainnet deployment\n // convenience function for testing\n // the true canonical gas token contract will not have this function\n #[aztec(public)]\n fn mint_public(to: AztecAddress, amount: Field) {\n let amount = U128::from_integer(amount);\n let new_balance = storage.balances.at(to).read().add(amount);\n\n storage.balances.at(to).write(new_balance);\n }\n\n #[aztec(public)]\n #[aztec(view)]\n fn check_balance(fee_limit: Field) {\n let fee_limit = U128::from_integer(fee_limit);\n assert(storage.balances.at(context.msg_sender()).read() >= fee_limit, \"Balance too low\");\n }\n\n // utility function for testing\n #[aztec(public)]\n #[aztec(view)]\n fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n"},"303":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/lib.nr","source":"use dep::aztec::prelude::{AztecAddress, EthAddress};\nuse dep::aztec::context::PublicContext;\nuse dep::aztec::protocol_types::hash::sha256_to_field;\n\npub fn calculate_fee<TPublicContext>(context: PublicContext) -> Field {\n context.transaction_fee()\n}\n\npub fn get_bridge_gas_msg_hash(owner: AztecAddress, amount: Field) -> Field {\n let mut hash_bytes = [0; 68];\n let recipient_bytes = owner.to_field().to_be_bytes(32);\n let amount_bytes = amount.to_be_bytes(32);\n\n for i in 0..32 {\n hash_bytes[i + 4] = recipient_bytes[i];\n hash_bytes[i + 36] = amount_bytes[i];\n }\n\n // Function selector: 0x3e87b9be keccak256('mint_public(bytes32,uint256)')\n hash_bytes[0] = 0x3e;\n hash_bytes[1] = 0x87;\n hash_bytes[2] = 0xb9;\n hash_bytes[3] = 0xbe;\n\n let content_hash = sha256_to_field(hash_bytes);\n content_hash\n}\n"},"304":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr","source":"contract ContractInstanceDeployer {\n use dep::aztec::protocol_types::{\n address::{AztecAddress, EthAddress, PublicKeysHash, PartialAddress},\n contract_class_id::ContractClassId, constants::DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n traits::Serialize, abis::log_hash::LogHash\n };\n use dep::aztec::{\n context::PrivateContext, hash::compute_unencrypted_log_hash,\n oracle::logs::emit_unencrypted_log_private_internal\n };\n\n #[aztec(event)]\n struct ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field, \n contract_class_id: ContractClassId, \n initialization_hash: Field, \n public_keys_hash: PublicKeysHash, \n deployer: AztecAddress,\n }\n\n #[aztec(private)]\n fn deploy(\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys_hash: PublicKeysHash,\n universal_deploy: bool\n ) {\n // TODO(@spalladino): assert nullifier_exists silo(contract_class_id, ContractClassRegisterer)\n\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.msg_sender()\n };\n\n let partial_address = PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n let address = AztecAddress::compute(public_keys_hash, partial_address);\n\n // Emit the address as a nullifier to be able to prove that this instance has been (not) deployed\n context.push_nullifier(address.to_field(), 0);\n\n // Broadcast the event\n let event = ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys_hash,\n initialization_hash,\n salt,\n deployer,\n version: 1\n };\n\n let payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", payload);\n\n let contract_address = context.this_address();\n let counter = context.next_counter();\n\n // @todo This is very inefficient, we are doing a lot of back and forth conversions.\n let log_slice = payload.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(contract_address, payload);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + log_slice.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n\n let _void = emit_unencrypted_log_private_internal(contract_address, payload, counter);\n }\n}\n"},"309":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr","source":"mod events;\nmod capsule;\n\ncontract ContractClassRegisterer {\n use dep::aztec::prelude::{AztecAddress, EthAddress, FunctionSelector};\n use dep::aztec::protocol_types::{\n contract_class_id::ContractClassId,\n constants::{\n ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, FUNCTION_TREE_HEIGHT,\n MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS,\n MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS,\n MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE\n },\n traits::Serialize, abis::log_hash::LogHash\n };\n\n use dep::aztec::{context::PrivateContext, oracle::logs::emit_contract_class_unencrypted_log_private_internal};\n\n use crate::events::{\n class_registered::ContractClassRegistered,\n private_function_broadcasted::{ClassPrivateFunctionBroadcasted, PrivateFunction, InnerPrivateFunction},\n unconstrained_function_broadcasted::{ClassUnconstrainedFunctionBroadcasted, UnconstrainedFunction, InnerUnconstrainedFunction}\n };\n\n // docs:start:import_pop_capsule\n use crate::capsule::pop_capsule;\n // docs:end:import_pop_capsule\n\n #[aztec(private)]\n fn register(artifact_hash: Field, private_functions_root: Field, public_bytecode_commitment: Field) {\n // TODO: Validate public_bytecode_commitment is the correct commitment of packed_public_bytecode\n // TODO: Validate packed_public_bytecode is legit public bytecode\n\n // docs:start:pop_capsule\n let packed_public_bytecode: [Field; MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS] = pop_capsule();\n // docs:end:pop_capsule\n\n // Compute contract class id from preimage\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n\n // Emit the contract class id as a nullifier to be able to prove that this class has been (not) registered\n let event = ContractClassRegistered { contract_class_id, version: 1, artifact_hash, private_functions_root, packed_public_bytecode };\n context.push_nullifier(contract_class_id.to_field(), 0);\n\n // Broadcast class info including public bytecode\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ContractClassRegistered: {}\",\n [\n contract_class_id.to_field(),\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_private_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n unconstrained_functions_artifact_tree_root: Field,\n private_function_tree_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n private_function_tree_leaf_index: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerPrivateFunction\n ) {\n let private_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS] = pop_capsule();\n\n let event = ClassPrivateFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n private_function_tree_sibling_path,\n private_function_tree_leaf_index,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: PrivateFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n vk_hash: function_data.vk_hash,\n bytecode: private_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassPrivateFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.vk_hash,\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_unconstrained_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n private_functions_artifact_tree_root: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerUnconstrainedFunction\n ) {\n let unconstrained_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS] = pop_capsule();\n let event = ClassUnconstrainedFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: UnconstrainedFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n bytecode: unconstrained_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassUnconstrainedFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n // This fn exists separately from emit_unencrypted_log because sha hashing the preimage\n // is too large to compile (16,200 fields, 518,400 bytes) => the oracle hashes it\n // It is ONLY used with contract_class_registerer_contract since we already assert correctness:\n // - Contract class -> we will commit to the packed bytecode (currently a TODO)\n // - Private function -> we provide a membership proof\n // - Unconstrained function -> we provide a membership proof\n // Ordinary logs are not protected by the above so this fn shouldn't be called by anything else\n #[contract_library_method]\n pub fn emit_contract_class_unencrypted_log<N>(context: &mut PrivateContext, log: [Field; N]) {\n let contract_address = context.this_address();\n let counter = context.next_counter();\n let log_hash = emit_contract_class_unencrypted_log_private_internal(contract_address, log, counter);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + N * 32;\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n }\n}\n"},"32":{"path":"std/hash/poseidon2.nr","source":"use crate::hash::Hasher;\nuse crate::default::Default;\n\nglobal RATE: u32 = 3;\n\nstruct Poseidon2 {\n cache: [Field;3],\n state: [Field;4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n fn new(iv: Field) -> Poseidon2 {\n let mut result = Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) -> [Field; RATE] {\n // zero-pad the cache\n for i in 0..RATE {\n if i >= self.cache_size {\n self.cache[i] = 0;\n }\n }\n // add the cache into sponge state\n for i in 0..RATE {\n self.state[i] += self.cache[i];\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n // return `RATE` number of field elements from the sponge state.\n let mut result = [0; RATE];\n for i in 0..RATE {\n result[i] = self.state[i];\n }\n result\n }\n\n fn absorb(&mut self, input: Field) {\n if (!self.squeeze_mode) & (self.cache_size == RATE) {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n let _ = self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else if (!self.squeeze_mode) & (self.cache_size != RATE) {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n } else if self.squeeze_mode {\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\n // N.B. I don't think this code path can be reached?!\n self.cache[0] = input;\n self.cache_size = 1;\n self.squeeze_mode = false;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n if self.squeeze_mode & (self.cache_size == 0) {\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\n // Switch to absorb mode.\n self.squeeze_mode = false;\n self.cache_size = 0;\n }\n if !self.squeeze_mode {\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\n // matched\n let new_output_elements = self.perform_duplex();\n self.squeeze_mode = true;\n for i in 0..RATE {\n self.cache[i] = new_output_elements[i];\n }\n self.cache_size = RATE;\n }\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\n let result = self.cache[0];\n for i in 1..RATE {\n if i < self.cache_size {\n self.cache[i - 1] = self.cache[i];\n }\n }\n self.cache_size -= 1;\n self.cache[self.cache_size] = 0;\n result\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32, is_variable_length: bool) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\nstruct Poseidon2Hasher{\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv : Field = (self._state.len() as Field)*18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field){\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher {\n _state: &[],\n }\n }\n}\n"},"34":{"path":"std/merkle.nr","source":"// Regular merkle tree means a append-only merkle tree (Explain why this is the only way to have privacy and alternatives if you don't want it)\n// Currently we assume that it is a binary tree, so depth k implies a width of 2^k\n// XXX: In the future we can add an arity parameter\n// Returns the merkle root of the tree from the provided leaf, its hashpath, using a pedersen hash function.\npub fn compute_merkle_root<let N: u32>(leaf: Field, index: Field, hash_path: [Field; N]) -> Field {\n let n = hash_path.len();\n let index_bits = index.to_le_bits(n as u32);\n let mut current = leaf;\n for i in 0..n {\n let path_bit = index_bits[i] as bool;\n let (hash_left, hash_right) = if path_bit {\n (hash_path[i], current)\n } else {\n (current, hash_path[i])\n };\n current = crate::hash::pedersen_hash([hash_left, hash_right]);\n }\n current\n}\n"},"4":{"path":"std/cmp.nr","source":"// docs:start:eq-trait\ntrait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\nimpl Eq for Field { fn eq(self, other: Field) -> bool { self == other } }\n\nimpl Eq for u64 { fn eq(self, other: u64) -> bool { self == other } }\nimpl Eq for u32 { fn eq(self, other: u32) -> bool { self == other } }\nimpl Eq for u8 { fn eq(self, other: u8) -> bool { self == other } }\nimpl Eq for u1 { fn eq(self, other: u1) -> bool { self == other } }\n\nimpl Eq for i8 { fn eq(self, other: i8) -> bool { self == other } }\nimpl Eq for i32 { fn eq(self, other: i32) -> bool { self == other } }\nimpl Eq for i64 { fn eq(self, other: i64) -> bool { self == other } }\n\nimpl Eq for () { fn eq(_self: Self, _other: ()) -> bool { true } }\nimpl Eq for bool { fn eq(self, other: bool) -> bool { self == other } }\n\nimpl<T, let N: u32> Eq for [T; N] where T: Eq {\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] where T: Eq {\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0 .. self.len() {\n result &= self[i].eq(other[i]);\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) where A: Eq, B: Eq {\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) where A: Eq, B: Eq, C: Eq {\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) where A: Eq, B: Eq, C: Eq, D: Eq {\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) where A: Eq, B: Eq, C: Eq, D: Eq, E: Eq {\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3) & 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.\nstruct 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// docs:start:ord-trait\ntrait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// Note: Field deliberately does not implement Ord\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 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 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 {\n if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n }\n}\n\nimpl<T, let N: u32> Ord for [T; N] where T: Ord {\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 let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<T> Ord for [T] where T: Ord {\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 let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<A, B> Ord for (A, B) where A: Ord, B: Ord {\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) where A: Ord, B: Ord, C: Ord {\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) where A: Ord, B: Ord, C: Ord, D: Ord {\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) where A: Ord, B: Ord, C: Ord, D: Ord, E: Ord {\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 where T: Ord {\n if v1 > v2 { v1 } else { v2 }\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 where T: Ord {\n if v1 > v2 { v2 } else { v1 }\n}\n\nmod cmp_tests {\n use crate::cmp::{min, max};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n"},"52":{"path":"std/uint128.nr","source":"use crate::ops::{Add, Sub, Mul, Div, Rem, Not, BitOr, BitAnd, BitXor, Shl, Shr};\nuse crate::cmp::{Eq, Ord, Ordering};\nuse crate::println;\n\nglobal pow64 : Field = 18446744073709551616; //2^64;\nglobal pow63 : Field = 9223372036854775808; // 2^63;\nstruct U128 {\n lo: Field,\n hi: Field,\n}\n\nimpl U128 {\n\n pub fn from_u64s_le(lo: u64, hi: u64) -> U128 {\n // in order to handle multiplication, we need to represent the product of two u64 without overflow\n assert(crate::field::modulus_num_bits() as u32 > 128);\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n pub fn from_u64s_be(hi: u64, lo: u64) -> U128 {\n U128::from_u64s_le(lo, hi)\n }\n\n pub fn zero() -> U128 {\n U128 { lo: 0, hi: 0 }\n }\n\n pub fn one() -> U128 {\n U128 { lo: 1, hi: 0 }\n }\n pub fn from_le_bytes(bytes: [u8; 16]) -> U128 {\n let mut lo = 0;\n let mut base = 1;\n for i in 0..8 {\n lo += (bytes[i] as Field)*base;\n base *= 256;\n }\n let mut hi = 0;\n base = 1;\n for i in 8..16 {\n hi += (bytes[i] as Field)*base;\n base *= 256;\n }\n U128 { lo, hi }\n }\n\n pub fn to_be_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_be_bytes(8);\n let hi = self.hi.to_be_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = hi[i];\n bytes[i+8] = lo[i];\n }\n bytes\n }\n\n pub fn to_le_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_le_bytes(8);\n let hi = self.hi.to_le_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = lo[i];\n bytes[i+8] = hi[i];\n }\n bytes\n }\n\n pub fn from_hex<let N: u32>(hex: str<N>) -> U128 {\n let N = N as u32;\n let bytes = hex.as_bytes();\n // string must starts with \"0x\"\n assert((bytes[0] == 48) & (bytes[1] == 120), \"Invalid hexadecimal string\");\n assert(N < 35, \"Input does not fit into a U128\");\n\n let mut lo = 0;\n let mut hi = 0;\n let mut base = 1;\n if N <= 18 {\n for i in 0..N - 2 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n } else {\n for i in 0..16 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n base = 1;\n for i in 17..N - 1 {\n hi += U128::decode_ascii(bytes[N-i])*base;\n base = base*16;\n }\n }\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n unconstrained fn uconstrained_check_is_upper_ascii(ascii: u8) -> bool {\n ((ascii >= 65) & (ascii <= 90)) // Between 'A' and 'Z'\n }\n\n fn decode_ascii(ascii: u8) -> Field {\n if ascii < 58 {\n ascii - 48\n } else {\n let ascii = ascii + 32 * (U128::uconstrained_check_is_upper_ascii(ascii) as u8);\n assert(ascii >= 97); // enforce >= 'a'\n assert(ascii <= 102); // enforce <= 'f'\n ascii - 87\n } as Field\n }\n\n // TODO: Replace with a faster version. \n // A circuit that uses this function can be slow to compute\n // (we're doing up to 127 calls to compute the quotient)\n unconstrained fn unconstrained_div(self: Self, b: U128) -> (U128, U128) {\n if b == U128::zero() {\n // Return 0,0 to avoid eternal loop\n (U128::zero(), U128::zero())\n } else if self < b {\n (U128::zero(), self)\n } else if self == b {\n (U128::one(), U128::zero())\n } else {\n let (q,r) = if b.hi as u64 >= pow63 as u64 {\n // The result of multiplication by 2 would overflow\n (U128::zero(), self)\n } else {\n self.unconstrained_div(b * U128::from_u64s_le(2, 0))\n };\n let q_mul_2 = q * U128::from_u64s_le(2, 0);\n if r < b {\n (q_mul_2, r)\n } else {\n (q_mul_2 + U128::one(), r - b)\n }\n }\n }\n\n pub fn from_integer<T>(i: T) -> U128 {\n let f = crate::as_field(i);\n // Reject values which would overflow a u128\n f.assert_max_bit_size(128);\n let lo = f as u64 as Field;\n let hi = (f - lo) / pow64;\n U128 { lo, hi }\n }\n\n pub fn to_integer<T>(self) -> T {\n crate::from_field(self.lo + self.hi * pow64)\n }\n\n fn wrapping_mul(self: Self, b: U128) -> U128 {\n let low = self.lo * b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = self.lo * b.hi + self.hi * b.lo + carry;\n let hi = high as u64 as Field;\n U128 { lo, hi }\n }\n}\n\nimpl Add for U128 {\n fn add(self: Self, b: U128) -> U128 {\n let low = self.lo + b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64; \n let high = self.hi + b.hi + carry;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to add with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Sub for U128 {\n fn sub(self: Self, b: U128) -> U128 {\n let low = pow64 + self.lo - b.lo;\n let lo = low as u64 as Field;\n let borrow = (low == lo) as Field;\n let high = self.hi - b.hi - borrow;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to subtract with underflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Mul for U128 {\n fn mul(self: Self, b: U128) -> U128 {\n assert(self.hi*b.hi == 0, \"attempt to multiply with overflow\");\n let low = self.lo*b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = if crate::field::modulus_num_bits() as u32 > 196 {\n (self.lo+self.hi)*(b.lo+b.hi) - low + carry\n } else {\n self.lo*b.hi + self.hi*b.lo + carry\n };\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to multiply with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Div for U128 {\n fn div(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n q\n }\n}\n\nimpl Rem for U128 {\n fn rem(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n r\n }\n}\n\nimpl Eq for U128 {\n fn eq(self: Self, b: U128) -> bool {\n (self.lo == b.lo) & (self.hi == b.hi)\n }\n}\n\nimpl Ord for U128 {\n fn cmp(self, other: Self) -> Ordering {\n let hi_ordering = (self.hi as u64).cmp((other.hi as u64));\n let lo_ordering = (self.lo as u64).cmp((other.lo as u64));\n \n if hi_ordering == Ordering::equal() {\n lo_ordering\n } else {\n hi_ordering\n }\n }\n}\n\nimpl Not for U128 { \n fn not(self) -> U128 {\n U128 {\n lo: (!(self.lo as u64)) as Field,\n hi: (!(self.hi as u64)) as Field\n }\n }\n}\n\nimpl BitOr for U128 { \n fn bitor(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) | (other.lo as u64)) as Field,\n hi: ((self.hi as u64) | (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitAnd for U128 {\n fn bitand(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) & (other.lo as u64)) as Field,\n hi: ((self.hi as u64) & (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitXor for U128 {\n fn bitxor(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) ^ (other.lo as u64)) as Field,\n hi: ((self.hi as u64) ^ (other.hi as u64)) as Field\n }\n }\n}\n\nimpl Shl for U128 { \n fn shl(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift left with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self.wrapping_mul(U128::from_integer(y))\n } \n}\n\nimpl Shr for U128 { \n fn shr(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift right with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self / U128::from_integer(y)\n } \n}\n\nmod tests {\n use crate::uint128::{U128, pow64, pow63};\n\n #[test]\n fn test_not(lo: u64, hi: u64) {\n let num = U128::from_u64s_le(lo, hi);\n let not_num = num.not();\n\n assert_eq(not_num.hi, (hi.not() as Field));\n assert_eq(not_num.lo, (lo.not() as Field));\n\n let not_not_num = not_num.not();\n assert_eq(num, not_not_num);\n }\n #[test]\n fn test_construction() {\n // Check little-endian u64 is inversed with big-endian u64 construction\n let a = U128::from_u64s_le(2, 1);\n let b = U128::from_u64s_be(1, 2);\n assert_eq(a, b);\n // Check byte construction is equivalent\n let c = U128::from_le_bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);\n let d = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n assert_eq(c, d);\n }\n #[test]\n fn test_byte_decomposition() {\n let a = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n // Get big-endian and little-endian byte decompostions\n let le_bytes_a= a.to_le_bytes();\n let be_bytes_a= a.to_be_bytes();\n\n // Check equivalence\n for i in 0..16 {\n assert_eq(le_bytes_a[i], be_bytes_a[15 - i]);\n }\n // Reconstruct U128 from byte decomposition\n let b= U128::from_le_bytes(le_bytes_a);\n // Check that it's the same element\n assert_eq(a, b);\n }\n #[test]\n fn test_hex_constuction() {\n let a = U128::from_u64s_le(0x1, 0x2);\n let b = U128::from_hex(\"0x20000000000000001\");\n assert_eq(a, b);\n\n let c= U128::from_hex(\"0xffffffffffffffffffffffffffffffff\");\n let d= U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff);\n assert_eq(c, d);\n\n let e= U128::from_hex(\"0x00000000000000000000000000000000\");\n let f= U128::from_u64s_le(0, 0);\n assert_eq(e, f);\n }\n\n // Ascii decode tests\n\n #[test]\n fn test_ascii_decode_correct_range() {\n // '0'..'9' range\n for i in 0..10 {\n let decoded= U128::decode_ascii(48 + i);\n assert_eq(decoded, i as Field);\n }\n // 'A'..'F' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(65 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n // 'a'..'f' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(97 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_0() {\n crate::println(U128::decode_ascii(0));\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_1() {\n crate::println(U128::decode_ascii(47));\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_0() {\n let _ = U128::decode_ascii(58);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_1() {\n let _ = U128::decode_ascii(64);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_0() {\n let _ = U128::decode_ascii(71);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_1() {\n let _ = U128::decode_ascii(96);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_greater_than_102_fails() {\n let _ = U128::decode_ascii(103);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_regression() {\n // This code will actually fail because of ascii_decode,\n // but in the past it was possible to create a value > (1<<128)\n let a = U128::from_hex(\"0x~fffffffffffffffffffffffffffffff\");\n let b:Field= a.to_integer();\n let c= b.to_le_bytes(17);\n assert(c[16] != 0);\n }\n\n #[test]\n fn test_unconstrained_div() {\n // Test the potential overflow case\n let a= U128::from_u64s_le(0x0, 0xffffffffffffffff);\n let b= U128::from_u64s_le(0x0, 0xfffffffffffffffe);\n let c= U128::one();\n let d= U128::from_u64s_le(0x0, 0x1);\n let (q,r) = a.unconstrained_div(b);\n assert_eq(q, c);\n assert_eq(r, d);\n\n let a = U128::from_u64s_le(2, 0);\n let b = U128::one();\n // Check the case where a is a multiple of b\n let (c,d ) = a.unconstrained_div(b);\n assert_eq((c, d), (a, U128::zero()));\n\n // Check where b is a multiple of a\n let (c,d) = b.unconstrained_div(a);\n assert_eq((c, d), (U128::zero(), b));\n\n // Dividing by zero returns 0,0\n let a = U128::from_u64s_le(0x1, 0x0);\n let b = U128::zero();\n let (c,d)= a.unconstrained_div(b);\n assert_eq((c, d), (U128::zero(), U128::zero()));\n\n // Dividing 1<<127 by 1<<127 (special case)\n let a = U128::from_u64s_le(0x0, pow63 as u64);\n let b = U128::from_u64s_le(0x0, pow63 as u64);\n let (c,d )= a.unconstrained_div(b);\n assert_eq((c, d), (U128::one(), U128::zero()));\n }\n\n #[test]\n fn integer_conversions() {\n // Maximum\n let start:Field = 0xffffffffffffffffffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Minimum\n let start:Field = 0x0;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Low limb\n let start:Field = 0xffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // High limb\n let start:Field = 0xffffffffffffffff0000000000000000;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn integer_conversions_fuzz(lo: u64, hi: u64) {\n let start: Field = (lo as Field) + pow64 * (hi as Field);\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn test_wrapping_mul() {\n // 1*0==0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::one()));\n\n // 0*1==0\n assert_eq(U128::zero(), U128::one().wrapping_mul(U128::zero()));\n\n // 1*1==1\n assert_eq(U128::one(), U128::one().wrapping_mul(U128::one()));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::zero()));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::from_u64s_le(0, 1).wrapping_mul(U128::one()));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::one().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::from_u64s_le(0, 1)));\n // -1 * -1 == 1\n assert_eq(\n U128::one(), U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff).wrapping_mul(U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff))\n );\n }\n}\n"},"85":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/history/public_storage.nr","source":"use dep::protocol_types::{\n constants::GENERATOR_INDEX__PUBLIC_LEAF_INDEX, hash::pedersen_hash, address::AztecAddress,\n header::Header, utils::field::full_field_less_than\n};\nuse std::merkle::compute_merkle_root;\n\nuse crate::{context::PrivateContext, oracle::get_public_data_witness::get_public_data_witness};\n\ntrait PublicStorageHistoricalRead {\n fn public_storage_historical_read(header: Header, storage_slot: Field, contract_address: AztecAddress) -> Field;\n}\n\nimpl PublicStorageHistoricalRead for Header { \n fn public_storage_historical_read(self, storage_slot: Field, contract_address: AztecAddress) -> Field {\n // 1) Compute the leaf slot by siloing the storage slot with the contract address\n let public_value_leaf_slot = pedersen_hash(\n [contract_address.to_field(), storage_slot],\n GENERATOR_INDEX__PUBLIC_LEAF_INDEX\n );\n\n // 2) Get the membership witness of the slot\n let witness = get_public_data_witness(\n self.global_variables.block_number as u32,\n public_value_leaf_slot\n );\n\n // 3) Extract the value from the witness leaf and check that the storage slot is correct\n let preimage = witness.leaf_preimage;\n\n // Here we have two cases. Code based on same checks in `validate_public_data_reads` in `base_rollup_inputs`\n // 1. The value is the same as the one in the witness\n // 2. The value was never initialized and is zero\n let is_less_than_slot = full_field_less_than(preimage.slot, public_value_leaf_slot);\n let is_next_greater_than = full_field_less_than(public_value_leaf_slot, preimage.next_slot);\n let is_max = ((preimage.next_index == 0) & (preimage.next_slot == 0));\n let is_in_range = is_less_than_slot & (is_next_greater_than | is_max);\n\n let value = if is_in_range {\n 0\n } else {\n assert_eq(preimage.slot, public_value_leaf_slot, \"Public data slot doesn't match witness\");\n preimage.value\n };\n\n // 4) Prove that the leaf exists in the public data tree. Note that `hash` returns not just the hash of the value\n // but also the metadata (slot, next index and next slot).\n assert(\n self.state.partial.public_data_tree.root\n == compute_merkle_root(preimage.hash(), witness.index, witness.path), \"Proving public value inclusion failed\"\n );\n\n value\n }\n}\n"},"91":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/messaging.nr","source":"use crate::{\n hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier},\n oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness\n};\n\nuse std::merkle::compute_merkle_root;\nuse dep::protocol_types::{constants::L1_TO_L2_MSG_TREE_HEIGHT, address::{AztecAddress, EthAddress}, utils::arr_copy_slice};\n\npub fn process_l1_to_l2_message(\n l1_to_l2_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n chain_id: Field,\n version: Field,\n content: Field,\n secret: Field\n) -> Field {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n portal_contract_address,\n chain_id,\n storage_contract_address,\n version,\n content,\n secret_hash\n );\n\n let returned_message = get_l1_to_l2_membership_witness(storage_contract_address, message_hash, secret);\n let leaf_index = returned_message[0];\n let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1);\n\n // Check that the message is in the tree\n // This is implicitly checking that the values of the message are correct\n let root = compute_merkle_root(message_hash, leaf_index, sibling_path);\n assert(root == l1_to_l2_root, \"Message not in state\");\n\n compute_message_nullifier(message_hash, secret, leaf_index)\n}\n"},"94":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr","source":"use crate::{hash::hash_args_array, oracle::returns::unpack_returns};\nuse dep::protocol_types::traits::Deserialize;\n\nstruct PackedReturns {\n packed_returns: Field,\n}\n\nimpl PackedReturns {\n pub fn new(packed_returns: Field) -> Self {\n PackedReturns { packed_returns }\n }\n\n pub fn assert_empty(self) {\n assert_eq(self.packed_returns, 0);\n }\n\n pub fn raw(self) -> Field {\n self.packed_returns\n }\n\n pub fn unpack<let N: u32>(self) -> [Field; N] {\n let unpacked: [Field; N] = unpack_returns(self.packed_returns);\n assert_eq(self.packed_returns, hash_args_array(unpacked));\n unpacked\n }\n\n pub fn unpack_into<T, let N: u32>(self) -> T where T: Deserialize<N> {\n let unpacked: [Field; N] = self.unpack();\n Deserialize::deserialize(unpacked)\n }\n}\n"},"98":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress, traits::Deserialize\n};\n\nuse crate::context::{\n private_context::PrivateContext, public_context::PublicContext, gas::GasOpts,\n public_context::FunctionReturns, inputs::{PrivateContextInputs, PublicContextInputs}\n};\n\nuse crate::oracle::arguments::pack_arguments;\nuse crate::hash::hash_args;\n\ntrait CallInterface<let N: u32, T, P, Env> {\n fn get_original(self) -> fn[Env](T) -> P;\n\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<N> {\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\nimpl<let N: u32, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateCallInterface<let N: u32, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<let N: u32, T, Env> PrivateCallInterface<N, T, Env> {\n pub fn call<let M: u32>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n );\n let unpacked: T = returns.unpack_into();\n unpacked\n }\n\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n\n pub fn delegate_call<let M: u32>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true);\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateVoidCallInterface<let N: u32, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<let N: u32, Env> PrivateVoidCallInterface<N, Env> {\n pub fn call(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n ).assert_empty();\n }\n\n pub fn view(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n\n pub fn delegate_call(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true).assert_empty();\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateStaticCallInterface<let N: u32, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<let N: u32, T, Env> PrivateStaticCallInterface<N, T, Env> {\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n assert(self.args_hash == pack_arguments(self.args));\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n}\n\nstruct PrivateStaticVoidCallInterface<let N: u32, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<let N: u32, Env> PrivateStaticVoidCallInterface<N, Env> {\n pub fn view(self, context: &mut PrivateContext) {\n assert(self.args_hash == pack_arguments(self.args));\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicCallInterface<let N: u32, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool\n}\n\nimpl<let N: u32, T, Env> PublicCallInterface<N, T, Env> {\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 fn call<let M: u32>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn view<let M: u32>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn delegate_call<let M: u32>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.deserialize_into()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicVoidCallInterface<let N: u32, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<let N: u32, Env> PublicVoidCallInterface<N, Env> {\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 fn call(self, context: &mut PublicContext) {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn delegate_call(self, context: &mut PublicContext) {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.assert_empty()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicStaticCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicStaticCallInterface<let N: u32, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<let N: u32, T, Env> PublicStaticCallInterface<N, T, Env> {\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 fn view<let M: u32>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n let unpacked: T = returns.deserialize_into();\n unpacked\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n\nimpl<let N: u32, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicStaticVoidCallInterface<N, Env> {\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicStaticVoidCallInterface<let N: u32, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\n}\n\nimpl<let N: u32, Env> PublicStaticVoidCallInterface<N, Env> {\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 fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n assert(args_hash == pack_arguments(self.args));\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n"},"99":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message, hash::{hash_args_array, ArgsHasher},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n oracle::{\n key_validation_request::get_key_validation_request, arguments, returns::pack_returns,\n call_private_function::call_private_function_internal, header::get_header_at,\n logs::{emit_encrypted_note_log, emit_encrypted_event_log},\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, set_public_teardown_function_call_internal,\n parse_public_call_stack_item_from_oracle\n}\n}\n};\nuse dep::protocol_types::{\n abis::{\n caller_context::CallerContext, function_selector::FunctionSelector,\n max_block_number::MaxBlockNumber,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem, read_request::ReadRequest, note_hash::NoteHash,\n nullifier::Nullifier, log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::Empty\n};\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_function_hash: Field,\n l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n // TODO(#7112): This function is called with non-zero note hash only in 1 of 25 cases in aztec-packages repo\n // - consider creating a separate function with 1 arg for the zero note hash case.\n fn push_nullifier(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: nullified_note_hash, counter: self.next_counter() });\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self.key_validation_requests_and_generators.storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n public_teardown_function_hash: self.public_teardown_function_hash,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\"Setting {0} as fee payer\", [self.this_address().to_field()]);\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number = MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request = self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one \n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator { request, sk_app_generator: sk_generators[key_index] };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(&mut self, note_hash_counter: u32, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_private_function_no_args<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_private_function_with_packed_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n let item = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n assert_eq(item.public_inputs.start_side_effect_counter, start_side_effect_counter);\n let end_side_effect_counter = item.public_inputs.end_side_effect_counter;\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\n\n let mut caller_context = CallerContext::empty();\n caller_context.is_static_call = self.inputs.call_context.is_static_call;\n if is_delegate_call {\n caller_context.msg_sender = self.inputs.call_context.msg_sender;\n caller_context.storage_contract_address = self.inputs.call_context.storage_contract_address;\n }\n self.private_call_requests.push(\n PrivateCallRequest {\n target: item.contract_address,\n call_context: item.public_inputs.call_context,\n function_data: item.function_data,\n args_hash: item.public_inputs.args_hash,\n returns_hash: item.public_inputs.returns_hash,\n caller_context,\n start_side_effect_counter,\n end_side_effect_counter\n }\n );\n\n PackedReturns::new(item.public_inputs.returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_public_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_call_stack_hashes.push(item.get_compressed().hash());\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn set_public_teardown_function_with_packed_args<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_teardown_function_hash = item.get_compressed().hash();\n }\n\n fn validate_call_stack_item_from_oracle(\n self,\n item: PublicCallStackItem,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.start_side_effect_counter, self.side_effect_counter);\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n}\n"}}}
|