@aztec/protocol-contracts 0.43.0 → 0.44.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.
@@ -1 +1 @@
1
- { "transpiled": true, "noir_version": "0.30.0+a2f687687559d15fde52abce54838f6e144a0aa4", "name": "GasToken", "functions": [{ "name": "check_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(view)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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": "set_portal", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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/72WzY7TMBDH3XbbbbtJyva7Tb+Sxg0SFy7sBcGdM08AAgkk4IDgAI/CO/Ai+xC8AXckDotn7PE/aXYrRUIbye14/P/NjD2R4ky1lOqeKfOslXvMrKsi1TF/TRrPlVjGoNGIVENcmhaJspbxq5Z2gDpjy2RQ7dT8XDxRkixTbVV+SN/hrHZUFRT73CrOaWRUO3v7WjSmlJYz+zaPaHp504WmWbcAW6TnkF7mI1xAFHTYvCDTjDCh9ZisqwYqbLnDIFmoaSGkqLZmF7y0qxvzkMoqSBwaxc3RQ0mtgnIHiFFIrSKriGg0fTiahkdT5adBmeues9lzu4h4k4/IwiarbaGnF3my18ZuKRAHeUzWnUGe/rhuls+pXzj523oblHsbcW/71d4GFolkr1gJ0VA6iQGX+Yysuxo64IYOKFTbN6OHqHtu+i3FhuViB3jBTLMbL83/A2Qi8aVuWqe6BHZpNaE1GX0Ht6BDRkkwBDoEOnToK7gFHTFKghHQEdCRQz/DLeiYURKMgY6Bjh36Fm5BJ4ySYAJ0AnTi0DdwCzpllARToFOgU4e+gFvQGaMkmAGdAZ059CPcgs4ZJcEc6Bzo3P7XRky2r3ALumCUBAugC6ALh36BW9AloyRYAl0CXVYLXfpX4ARisr2GW9CYURLEQGOgsUM/wC3oilESrICugK6qha78W3MCMdl2cAu6ZpQEa6BroOtqtrU/lppIXB8Z1UfG97KXyWnEHPY3uAXdMEqCDdAN0E0128b35wRisr2HW9AtoyTYAt0C3Tr0E9yC7hglwQ7oDuiuWujOZ6uJLO4ly7A+Ev/3wsxhf4db0IRREiRAE6BJNVvi3/SayOQ0wp/9v/iIZwwqfLnlU81CLZ9zE/GscIFJOVVaTrW3cGJNWSFzjxuAttcQ7VYO5sCIzRscIicXDc7+x85kj8TkWmQZstmFpttNjopy5ZMRoqkDvwtlHRV8JRfYDCFSfzYBziY9uo1he2nluvjrJ4W2N70EDQlcmJDrTuy74+9qVpO6ctLCGftyUpSzL5cTPnQ3QXvbx4L28B6wLsNZVlyRkyLRgStt26aJ/IATpr7pwtn7ZBrJ8nKyw0P33vCsw5ubX9P4B9hf6AanDQAA", "debug_symbols": "5Z3rShtRGEXfJb+lzN7n7quUUlIvRZAoXgpFfPeamkTFlIAdF2eYf07yzex9GNYZlIXzsDg9+3H/8/vF6vzqdnH89WFxeXWyvLu4Wj0dPSyGL9LfT2+vl6v1B7d3y5u7xXFQGI4WZ6vT9Y85Px4tzi8uzxbHLuXx6N20B+fNtIdUdtOK2jMd6nY4+tWsw74rV+1q1Dez347W5cOUy6cpl89TLl+mXL5OuXybcHkPn1v+OUREiMcIyWUXUtuB21B2t6G09OrK3hQKvRWKvRVKvRXKvRUqvRWqvRVqeKEcdoXym0LvZ1tom9mW24HZkuruuvFldrPOMMxknZ7JOuNM1plnss4yk3XWmaxzJs+VOJPnStRM1jmT52c8/NtVebvO59PSx07LHzutfOy0f+yxdXtXgsOhe6hkb6aVUuL+opCGKZfXlMt7yuXDlMvHKZdPn1v+OSQTIWWMkPISUvOekEqENCAkD0SIiBATIWHkkKY9IZEISURIJkIKEVKJkAaElIEIERFiIoQgvhDEF4L4QhBfCOILQXwhiK8E8ZUgvhLEV4L4ShBfCeIrQXwliK8E8ZUgvhHEN4L4RhDfCOIbQXwjiG8E8Y0gvhHEN4J4DQOSIiTFSEpAUiKSkpCUjKQUJKUiKQj7QtgXwr4Q9oWwL4R9IewLYV8I+0LYF8K+EfaNsG+EfSPsG2HfCPtG2DfCvhH2jbAfEPYDwn5A2A8I+wFhPyDsB4T9gLAfEPYDwn5E2I8I+xFhPyLsR4T9iLAfEfYjwn5E2I8I+wlhPyHsJ4T9hLCfEPYTwn5C2E8I+wlhPyHsZ4T9jLCfEfYRZ0+ItCfE2hOi7Qnx9oSIe0LMPSHqnhB3T4i8J8TeE6LvCfH3hAh8Qgw+IQqfEIdPiMQnxOITovEJ8fiEiHxCTD4hKp8Ql0+IzCfE5hOi8wnx+YQIfUKMPiFKnxCnT4jUJ8TqE6L1CfH6jHh9Rrw+I16fEa/PQ0RSEpKSkZSCpFQkBWEf8fqMeH1GvD4jXp8Rr8+I12fE6zPi9Rnx+ox4fUa8PiNenxGvz4jXZ8TrM+L1GfH6jHh9Rrw+I16fEa/PiNdnxOsz4vUZ8fqMeH1GvD4jXp8Rr8+I12fE6zPi9Rnx+ox4fUa8PiNenxGvz4jXZ8TrM+L1GfH6PIrXV1LcppRW36S8n8674fzqv4O+vH9iFAdw3Eahu0axu0apu0a5u0a1u0att0ajGI3jNupuh8zd7ZC5ux0yd7dD5u52yNzdDjmKBVrTdlptCP/bqHbXqPXWaBQTddxG6q6Ru2sUumsUu2uUumuUu2vU3Z5dutuzS3d7du1pz346+rW8uVj+uDxbv7B3/eX96mT7/t6nw7vf18/fPM3+AQ==" }, { "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": "tx_tree_height", "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": 32, "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": 32, "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" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint" } }, { "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": "new_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": "new_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": "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": "new_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": "tx_tree_height", "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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XXm4furKw/VTVx6un7rycP3UlYfvp27y/dRNvp+6yfdTN/l+6upk8+w7vu+nbvL91E2+n7rJ91M3+X7qZt9P3ez7qZt9P3Wz76euTjbPvuP7fupm30/d7Pupm30/dbPvp27x/dQtvp+6xfdTt/h+6uokI+07vu+nbvH91C2+n7rF91O3+H7qiu+nrvh+6orvp674furq5FLtO77vp674fuqK76eu+H7qiu+nbvX91K2+n7rV91O3+n7q6uRS7Tu+76du9f3Urb6futX3U7f6fuo230/d5vup23w/dZvvp65OttS+4/t+6jbfT93m+6nbfD91m++nbvf91O2+n7rd91O3+37q6uQ97Tu+76du9/3U7b6fut33U7f7fur6zqYS39lU4jubSnxnU4nvbCrxnU0lvrOpxHc2lfjOphLf2VTiO5tKfGdTie9sKvGdTSW+s6nEdzaV+M6mEt/ZVOI7m0p8Z1NV39lU1Xc2VfWdTVV9Z1PVh+unbvWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lU1Xc2VfWdTVV9Z1NV39lUzXc2VfOdTdV8Z1M139lU7eH6qdt8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfOdTdV8Z1M139lUzXc2VfedTdV9Z1N139lU3Xc2VX+4fup239lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTdV9Z1N139lU3Xc2VfedTTV8Z1MN39lUw3c21fCdTTUerp+6w3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1MN39lUw3c21fCdTTV8Z1NN39lU03c21fSdTTV9Z1PNh+un7vSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lU03c21fSdTTV9Z1NN39lUz3O6fuz+cU7n53f94H2e0/WT93lO14/e5zldP3uf53T98H2e0/XT93lO14/f5zmdP399x1Q9z+/8+es7qOp5fufPX99RVc/zO3/++g6rep7f+fPXd1zV8/zOn7++A6ue53f+/PUdWfU8v/Pnr+/Qquf5nT9/fcdWPc/v/PnrO7jqeX7nz1/f0VXP8zt//voOr3qe3/nz13d81fP8zp+/vgOsnud3/vz1HWH1PL/z56/vEKvn4Zw/f33HWD0P5/z56zvI6nk4589f31FWz8M5f/76DrN6Hs7589d3nNXz/M6fv74DrZ7nd/789R1p9Ty/8+ev71Cr5/mdP399x1o9z+/8+es72Op5fufPX9/RVs/zO3/++g63ep7f+fPXd7zV8/zOn7++A66e53f+/PUdcfU8v/Pnr++Qq+f5nT9/fcdcPc/v/PnrO+jqeX7nz1/fUVfP8zt//voOu3qe3/nz13fc1fP8zp+/vgOvnud3/vz1HXn1PL/z56/v0Kvn+Z0/f33HXj3P7/z56zv46nl+589f39FXz/M7f/76Dr96nt/589d3/NXz/L6fv8l5/lVynn+VnOdfJef5V8/TOT+/7+dvcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznXyXn+VfJef5Vcp5/lZznX2Xn+VfZef5Vdp5/lZ3nX+WH7+dvdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfZef5Vdp5/lZ3nX2Xn+VfFef5VcZ5/VZznXxXn+Vfl4fv5W5znXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef5VcZ5/VZznXxXn+VfFef6VOM+/Euf5V+I8/0qc51/Jw/fzV5znX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX1Xn+VXWef1Wd519V5/lX9eH7+Vud519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXWef1Wd519V5/lX1Xn+VXOef9Wc51815/lXzXn+VXv4fv425/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wc51815/lXzXn+VXOef9Wd51915/lX3Xn+VXeef9Ufvp+/3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd51915/lX3Xn+VXeef9Wd518N5/lXw3n+1XCefzWc51+Nh+/n73CefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lXw3n+1XCefzWc518N5/lX03n+1XSefzWd519N5/lX8+H7+Tud519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03n+1XSefzWd519N5/lX03f+VX74zr96nt/18/d5ftfP3+f5XT9/n+d3/fx9nt/18/d5ftfP3+f5XT9/n+d3/fx9nt/589d3/tXz/M6fv77zr57nd/789Z1/9Ty/8+ev7/yr5/mdP3995189z+/8+es7/+p5fufPX9/5V8/zO3/++s6/ep7f+fPXd/7V8/zOn7++86+e53f+/PWdf/U8v/Pnr+/8q+f5nT9/fedfPc/v/PnrO//qeX7nz1/f+VfP8zt//vrOv3qe3/nz13f+1fP8zp+/vvOvnud3/vz1nX/1PL/z56/v/Kvn+Z0/f33nXz3P7/z56zv/6nl+589f3/lXz/M7f/76zr96nt/589d3/tXz/M6fv77zr57nd/789Z1/9Ty/8+ev7/yr5/mdP3995189z+/8+es7/+p5fufPX9/5V8/zO3/++s6/ep7f+fPXd/7V8/zOn7++86+e53f+/PWdf/U8v/Pnr+/8q+f5nT9/fedfPc/v/PnrO//qeX7nz1/f+VfP8zt//vrOv3qe3/nz13f+1fP8zp+/vvOvnud3/vz1nX/1PL/z56/v/Kvn+Z0/f33nXz3P7/v5m5znXyXn+VfJef5Vcp5/9Tyd8/P7fv4m5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXaef5Wd519l5/lX2Xn+VX74fv5m5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l2/lLVfKfn61ycn7T9//C+U3fP7WO1/lbf39+0/fPwvlN3z8L5zd9/yyc37T+vz6/7fyfhfObvv9ban9+tpX8/vym7/+F85vW/wvnF+fnN/38XTi/6efvwvlNP38Xzm/6+btwftPP3+vz287/WTi/8+ev7fyfhfM7f/7azv9ZOL/z56/t/J+F8zt//trO/1k4/88/f09ngn/97OjzdY4xknx85ZZ+a9q4IS1oZ7UJqtoMVW3xWu1RgbivoLqvoLmvoLuvYLivwK2GeFXQ3eqCowK3z/qjArfP76MC28/k0R+vD89LBfLHvXScY4yPr/340CAbso/21mv7ef+tenX/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VQHvvyrg/VcFvP+qgPdfFfD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgPdfFfD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgPdfFfD+qwref1XB+68qeP9VBe+/qjfs928F77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7rxp4/1UD779q4P1XDbz/qt2w378NvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv+rg/VcdvP+qg/dfdfD+q37Dfv928P6rDt5/1cH7rzp4/1UH77/q4P1XHbz/qoP3X3Xw/qsO3n/VwfuvOnj/VQfvv+rg/VcdvP+qg/dfdfD+qw7ef9XB+686eP9VB++/6uD9Vx28/6qD91918P6rDt5/1cH7rzp4/1UH77/q4P1XHbz/qoP3X3Xw/qsO3n/VwfuvOnj/VQfvv+rg/VcdvP+qg/dfdfD+qw7ef9XB+686eP9VB++/6uD9Vx28/6qD91918P6rDt5/1cH7rzp4/1UH77/q4P1XHbz/qoP3X3Xw/qsO3n/VwfuvOnj/VQfvv+rg/VcdvP+qg/dfdfD+qw7ef9XB+686eP9VB++/6uD9Vx28/6qD91918P6rDt5/1cH7rzp4/1UH77/q4P1XHbz/qoP3X3Xw/qsO3n/VwfuvOnj/VQfvv+rg/VcdvP+qg/dfdfD+qw7ef9XB+686eP9VB++/6uD9Vx28/2qA918N8P6rAd5/NcD7r8YN+/07wPuvBnj/1QDvvxrg/VcDvP9qgPdfDfD+qwHefzXA+68GeP/VAO+/GuD9VwO8/2qA918N8P6rAd5/NcD7rwZ4/9UA778a4P1XA7z/aoD3Xw3w/qsB3n81wPuvBnj/1QDvvxrg/VcDvP9qgPdfDfD+qwHefzXA+68GeP/VAO+/GuD9VwO8/2qA918N8P6rAd5/NcD7rwZ4/9UA778a4P1XA7z/aoD3Xw3w/qsB3n81wPuvBnj/1QDvvxrg/VcDvP9qgPdfDfD+qwHefzXA+68GeP/VAO+/GuD9VwO8/2qA918N8P6rAd5/NcD7rwZ4/9UA778a4P1XA7z/aoD3Xw3w/qsB3n81wPuvBnj/1QDvvxrg/VcDvP9qgPdfDfD+qwHefzXA+68GeP/VAO+/GuD9VwO8/2qA918N8P6rAd5/NcD7rwZ4/9UA778a4P1XA7z/aoD3Xw3w/qv7g2K/gP95UHQB2K/g+4Niv4PvD4r9Er4/KPZb+P6g2K/h+4Niv4fvD4r9Ir4/KPqbGLwK6y4A/U0MXoZ1F4D+Jgavw7oLQH8Tgxdi3QWgv4nBK7HuAtDfxOClWHcB6G9i8FqsuwD0NzF4MdZdAPqbGLwa6y4A/U0MXo51F4D+Jgavx7oLQH8Tgxdk3QWgv4nBK7LuAtDfxOAlWXcB6G9i8JqsuwD0NzF4Udb96dDfxOBVWfenQ38Tg5dl3Z8O/U0MXpd1fzr0NzF4Ydb96dDfxOCVWXcB6G9i8NKsuwD0NzF4bdZdAPqbGLw46y4A/U0MXp11F4D+JgYvz7oLQH8Tg9dn3QWgv4nBC7TuAtDfxOAVWncB6G9i8BKtuwD0NzF4jdZdAPqbGLxI6y4A/U0MXqV1F4D+JgYv07oLQH8Tg9dp3QWgv4nBC7XuAtDfxOCVWncB6G9i8FKtuwD0NzF4rdZdAPqbGLxY6y4A/U0MXq11F4D+JgYv17oLQH8Tg9dr3QWgv4nBC7buAtDfxOAVW3cB4G/iDb1ja0Pv2NrQO7Y29I6t++OhCwB/E2/oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWht6xtaF3bG3oHVsbesfWjt6xtaN3bO3oHVs7esfWfgN/E+/oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xtaN3bO3oHVs7esfWjt6xdaB3bB3oHVsHesfWgd6xddzA38QHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bB3oHVsHesfWgd6xdaB3bBl6x5ahd2wZeseWoXds2Q38TWzoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdW4besWXoHVuG3rFl6B1bht6xZegdWwW9Y6ugd2wV9I6tgt6xVW7gb+KC3rFV0Du2CnrHVkHv2CroHVsFvWOroHdsFfSOrYLesVXQO7YKesdWQe/YKugdWwW9Y6ugd2wV9I6tgt6xVdA7tgp6x1ZB79gq6B1bBb1jq6B3bBX0jq2C3rFV0Du2CnrHVkHv2CroHVsFvWOroHdsFfSOrYLesVXQO7YKesdWQe/YKugdWwW9Y6ugd2wV9I6tgt6xVdA7tgp6x1ZB79gq6B1bBb1jq6B3bBX0jq2C3rFV0Du2CnrHVkHv2CroHVsFvWOroHdsFfSOrYLesVXQO7YKesdWQe/YKugdWwW9Y6ugd2wV9I6tgt6xVdA7tgp6x1ZB79gq6B1bBb1jq6B3bBX0jq2C3rFV0Du2CnrHVkHv2CroHVsFvWOroHdsFfSOrYLesVXQO7YKesdWQe/YKugdWwW9Y6ugd2wV9I6tgt6xVdA7tgp6x1ZB79gq6B1bBb1jq6B3bFX0jq2K3rFV0Tu2KnrHVr2Bv4kresdWRe/YqugdWxW9Y6uid2xV9I6tit6xVdE7tip6x1ZF79iq6B1bFb1jq6J3bFX0jq2K3rFV0Tu2KnrHVkXv2KroHVsVvWOrondsVfSOrYresVXRO7YqesdWRe/YqugdWxW9Y6uid2xV9I6tit6xVdE7tip6x1ZF79iq6B1bFb1jq6J3bFX0jq2K3rFV0Tu2KnrHVkXv2KroHVsVvWOrondsVfSOrYresVXRO7YqesdWRe/YqugdWxW9Y6uid2xV9I6tit6xVdE7tip6x1ZF79iq6B1bFb1jq6J3bFX0jq2K3rFV0Tu2KnrHVkXv2KroHVsVvWOrondsVfSOrYresVXRO7YqesdWRe/YqugdWxW9Y6uid2xV9I6tit6xVdE7tip6x1ZF79iq6B1bFb1jq6J3bFX0jq2K3rFV0Tu2KnrHVkXv2KroHVsVvWOrondsVfSOrYresdXQO7YaesdWQ+/YaugdW+0G/iZu6B1bDb1jq6F3bDX0jq2G3rHV0Du2GnrHVkPv2GroHVsNvWOroXdsNfSOrYbesdXQO7YaesdWQ+/YaugdWw29Y6uhd2w19I6tht6x1dA7thp6x1ZD79hq6B1bDb1jq6F3bDX0jq2G3rHV0Du2GnrHVkPv2GroHVsNvWOroXdsNfSOrYbesdXQO7YaesdWQ+/YaugdWw29Y6uhd2w19I6tht6x1dA7thp6x1ZD79hq6B1bDb1jq6F3bDX0jq2G3rHV0Du2GnrHVkPv2GroHVsNvWOroXdsNfSOrYbesdXQO7YaesdWQ+/YaugdWw29Y6uhd2w19I6tht6x1dA7thp6x1ZD79hq6B1bDb1jq6F3bDX0jq2G3rHV0Du2GnrHVkPv2GroHVsNvWOroXdsNfSOrYbesdXQO7YaesdWQ+/YaugdWw29Y6uhd2w19I6tht6x1dA7thp6x1ZH79jq6B1bHb1jq6N3bPUb+Ju4o3dsdfSOrY7esdXRO7Y6esdWR+/Y6ugdWx29Y6ujd2x19I6tjt6x1dE7tjp6x1ZH79jq6B1bHb1jq6N3bHX0jq2O3rHV0Tu2OnrHVkfv2OroHVsdvWOro3dsdfSOrY7esdXRO7Y6esdWR+/Y6ugdWx29Y6ujd2x19I6tjt6x1dE7tjp6x1ZH79jq6B1bHb1jq6N3bHX0jq2O3rHV0Tu2OnrHVkfv2OroHVsdvWOro3dsdfSOrY7esdXRO7Y6esdWR+/Y6ugdWx29Y6ujd2x19I6tjt6x1dE7tjp6x1ZH79jq6B1bHb1jq6N3bHX0jq2O3rHV0Tu2OnrHVkfv2OroHVsdvWOro3dsdfSOrY7esdXRO7Y6esdWR+/Y6ugdWx29Y6ujd2x19I6tjt6x1dE7tjp6x1ZH79jq6B1bHb1jq6N3bHX0jq2O3rHV0Tu2OnrHVkfv2OroHVsDvWNroHdsDfSOrYHesTVu4G/igd6xNdA7tgZ6x9ZA79ga6B1bA71ja6B3bA30jq2B3rE10Du2BnrH1kDv2BroHVsDvWNroHdsDfSOrYHesTXQO7YGesfWQO/YGugdWwO9Y2ugd2wN9I6tgd6xNdA7tgZ6x9ZA79ga6B1bA71ja6B3bA30jq2B3rE10Du2BnrH1kDv2BroHVsDvWNroHdsDfSOrYHesTXQO7YGesfWQO/YGugdWwO9Y2ugd2wN9I6tgd6xNdA7tgZ6x9ZA79ga6B1bA71ja6B3bA30jq2B3rE10Du2BnrH1kDv2BroHVsDvWNroHdsDfSOrYHesTXQO7YGesfWQO/YGugdWwO9Y2ugd2wN9I6tgd6xNdA7tgZ6x9ZA79ga6B1bA71ja6B3bA30jq2B3rE10Du2BnrH1kDv2BroHVsDvWNroHdsDfSOrYHesTXQO7YGesfWQO/YGugdWwO9Y2uAd2ztN/COrbsA7DfxXQD2m/guAPtNfBeA/Sa+C8B+E98FYL+J7wKw38R3Adhv4rsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FoL+JwTu27gLQ38TgHVt3AehvYvCOrbsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FoL+JwTu27gLQ38TgHVt3AehvYvCOrbsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FoL+JwTu27gLQ38TgHVt3AehvYvCOrbsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FoL+JwTu27gLQ38TgHVt3AehvYvCOrbsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FoL+JwTu27gLQ38TgHVt3AehvYvCOrbsA9DcxeMfWXQD6mxi8Y+suAP1NDN6xdReA/iYG79i6C0B/E4N3bN0FgL+JN/SOrQ29Y2tD79ja0Du27o+HLgD8Tbyhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bG3rH1obesbWhd2xt6B1bO3rH1o7esbWjd2zt6B1b+w38Tbyjd2zt6B1bO3rH1o7esbWjd2zt6B1bO3rH1o7esbWjd2zt6B1bO3rH1o7esbWjd2zt6B1bO3rH1o7esbWjd2zt6B1bO3rH1o7esbWjd2zt6B1bO3rH1o7esbXHbngqtv/62mJnAkK/B2YEhP4UKqU/BNR2IiD0p9CMgNCfQjMCQn8KzQgInQcmBMTuF5oREPo9ULf662vrsZ8ICP0emBEQOg/MCDB0AaHfxDMCQr+JZwSEfhPPCAj9Jp4REPpNPCEgdr/QjAD0N3HsfqEZAehv4tj9QjMC0N/EsfuFZgSgv4lj9wvNCPj7b+LTdeH//trexuM5et/s9Z3r9u8WkQvaiJbK3bjk7lxyD1S5LwmGL6HgS6j4Ehq+hI4vAdZNPCU0WIfwkgD71n9JgH2TvyTEfjv3dnt88fhoRv75cHo+R++v7337YUcWdCstFhz7zf+VYOdf+GixHcVSNLGdylI0sR3QUjSxndVKND22Y1uKJrYTXIomtsNciiaRc/VGY0JzhkZu+BSN3PApGrnhUzRyw6do5IbP0Ay54VM0csOnaOSGT9HIDZ+iMaE5QyM3fIpGbvgUjdzwKRq54VM0csMnaI6b3PApGrnhUzRyw6do5IZP0ZjQnKGRGz5FIzd8ikZu+BSN3PApGrnhMzSb3PApGrnhUzRyw6do5IZP0ZjQnKGRGz5FIzd8ikZu+BSN3PApGrnhMzQ7qa/53BZ57KS+ZgYN6Rvqc7vfsZO+oWbQkL6hZtCQvqEm0Byk+5oZNKT7mhk0pL7mc9vRcZD6mhk0JjRnaEj3NTNoSN3wDBpSNzyDhtQNz6AhdcMTaIzUDc+gIXXDM2jkhk/RyA2forFEaL74zluv9lB4/1deX33701fvpTwEtu0EZCbvvBRkJqe9FGQmX74UZCYX7wTyBSeTj/eGUzI5eXc4mby8O5xMbt4dTiY/7w7HBOccjlz6GzisznvUx3feRjt+g/OvQnVhdd7uIFmd91cg9/0p0MoJSFaX7g0y+F0dIJCs7t8dJGtScAfJmircQZpA+oBkTSvfgfy8wQ1+9wkIJGmy2W/H48eu++3HM//rZBP8BhYQSNJk8x3IiZdN8HtgQCBJk40/SNJk4w+SNNn4gzSB9AFJmmz8QZImmy9Bfk42qa7VLQXJmmy27clm2/t/TzapLuGtBJnqbt5lICdeNqmu7C0FyZps3EGyJht3kCaQPiBZk407SNZk4w6SNdl8B/Jzskl1p3ApSNqf2fT6Ajk+gGzj+Z1vr6/d+u0FMtUNxKUgaX9m4w2SNtnU7Qmy2X9fWqS6xrgUpAnkZ5ATPjLVpcelIGmTjTdI2mTjDZI22XiDpP2ZjS9IS3XPcilI2p/ZfAXy49LCUt3KXApSyWbf+v4byBccE5xzOEogb+Cwpor74ur5zHv5zwsDS3WNcylI1lTxFcgZD8eaKrxBproLuhQka6pwB8maKtxBsqYKd5AmkD4gWdPKdyA/LwxS3UpdClLJ5v5/t8ef83Oq26rucJRAzuHstKmi9ucz9+2/Lwx22lThDZI2VXwDcsLDpboPvBSkCaQPSNpU4Q2SNlV4g6RNFd4gaROIN0jatPIVyM8Lg1R3uZeCVLJxAqlk4wRSycYJpAmkD0glGyeQSjZOIJVs7iB//4PvFxyllTdwlEDO4aS6b376nV9yKbz/S25shz6edYd9/PzO/1pubB/tLtfyyJ3YJAW/6u0uN7ZzdJcb29+5y43t2NzlxvZg3nKD35r+Tu7nbBb8erS73ESuakZuIlc1I9e45GZyVRNyg7uq/gqA4/jvESH49WN3ucFd1TdyZ2xGcFflLDf4vV93ucFdlbfc4K7KW25wV+Ut1xLJ/Wwzgl+LdZebyFXNyE3kqmbkZnJVE3IzuarPcmPfGh03e3zncSv1v0eE2BdB/eWGdlXfyZ2wGbGva/rLNS65oV2Vv9zQrspfbmhX5S83tKv6Uu6EzQjtqtzlxr5z6C83kauakZvJVU3IzeSqJuQajNz6ewB8ScBxSqcScNzPqYTgjmY8nmPcH+S/Z83YN9n85QZ3NN/InfCrse+b+csN7mi85QZ3NN5ygzsab7nGJTe4+/lK7me/GvuGlb/cRK5qRm4iVzUjN5Or+ii3xL6t5C83k6uakAvkqsYfM2yJfSFoToKFlrDZS8KPP9P98390fX90oPYfz7zfjh9yY7sfd7mx3c9Xclt//rb7tn/4zp83FCX29Zy1aGK7qqVoYjuwlWhi36xZiya2s1uKJrYLXIomtrtcisaE5gxNIofrjUZu+BSN3PApGrnhUzRyw2doYt9aWYtGbvgUjdzwKRq54VM0JjRnaOSGT9HIDZ+ikRs+RSM3fIpGbvgMTez7HGvRyA2fopEbPkUjN3yKxoTmDA2pryn2+E2JYmdoSH3NBJrYvfAXoimPEwGlthM0pG+oGTSkb6gZNKRvqBk0pPuaGTSk+5oZNKS+5vOF9RK7S38tGtJ9zQSa2B39a9GQuuEZNKRueAYNqRueQWNCc4aG1A3PoCF1wzNo5IZP0cgNn6KRGz5DE/u2wpdovvjOrT3+iLf9diL1xx8Yxr7DsBZNJjfsjCaTG3ZGY0JzhiaTG3ZGk8kNO6PJ5Ib/HZpRT9BkcsPOaDK5YV80wW9iXIbmR93GUU7QkLrhGTSkbngGDakbnkFjQnOGhtQNz6AhdcMzaEjd8ERXVvCbI0vRkLrhCTTBb5k4oXnJpXC4L7mxXeu+P754HMf4IHe7dXs89V3Bj6+2H4Jje9ELBBub4Ni+8QLBsd3gBYJje7wLBMd2bhcIju3H/AUHv69ygeDYPusCwWxOK/iVlQsEG5tgNqcV/NbKBYLZnFbweysXCCZzWjX4zZULBJM5rRr87soFgsmcVr0Zm2Ayp1WD33W5QDCZ06rBb7BcIJjNaQW/l3KBYDanFfy2yQWC2ZxW8DskFwhmc1rBb4ZcIJjNaQW/73GBYDanFfwWxwWC2ZxW8LsZFwhmc1rBb1xcIJjNaQW/R3GBYDanFfx2xAWC2ZxW8DsPFwhmc1rBbzJcIJjNaQW/n3CBYDandbA5reB3Ly4QzOa0DjanZWxOK/gVkgsEszmt4BdDLhBsbILZnFbwmx0XCGZzWsHva1wgmM1pBb+FcYFgNqcV/G7FBYLZnFbwGxMXCGZzWsHvQVwgmM1pBb/dcIFgNqcV/M7CBYLZnFbwmwgXCGZzWsHvF1wgmM1pBb81cIFgNqcV/C7ABYLZnFbwDv8LBLM5reB9+xcIZnNawbvxLxDM5rSC99hfIJjNaQXvnL9AMJvTCt4Pf4FgNqfF1hFf2TriK1tHfGXriK9sHfGVrSO+snXEV7aO+MrWEV/ZOuIrW0d8ZeuIr2wd8ZWtI76ydcRXto74ytYRX9k64htbR3xj64hvbB3xja0jvt2MTTCZ02psHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2DriG1tHfGPriG9sHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2DriG1tHfGPriG9sHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2DriG1tHfGPriG9sHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2DriO1tHfGfriO9sHfGdrSO+34xNMJnT6mwd8Z2tI76zdcR3to74ztYR39k64jtbR3xn64jvbB3xna0jvrN1xHe2jvjO1hHf2TriO1tHfGfriO9sHfGdrSO+s3XEd7aO+M7WEd/ZOuI7W0d8Z+uI72wd8Z2tI76zdcR3to74ztYR39k64jtbR3xn64jvbB3xna0jvrN1xHe2jvjO1hHf2TriO1tHfGfriO9sHfGdrSO+s3XEd7aO+M7WEd/ZOuI7W0d8Z+uI72wd8Z2tI76zdcR3to74ztYR3zM1iI+2P764/f6dX3ITvYVn5Cb6hB69P754tBO5iT6fZ+Qm+nSekZvos3lGbqIMPCE3U6P0jNxM790JuZneuxNyE2XfGbnGJZfLVWVqkZ6RC+uqXhJgndJLQmz3c7Tnf0c2bh5BPHjP8wWCYzugCwTH9kAXCI7tgi4QbGyCYzuhCwTH9kIXCI7thi4QHNs7XSCYzWkF73m+QDCb0wre83yBYDanFbzn+QLBbE4reM/zBYLZnFbwnucLBJM5rRG85/kCwWROawTveb5AMJnTGjdjE0zmtEbwnucLBJM5rRG85/kCwWxOK3jP8wWC2ZxW8J7nCwSzOa3gPc8XCGZzWsF7ni8QzOa0gvc8XyCYzWkF73m+QDCb0wre83yBYDanFbzn+QLBbE4reM/zBYLZnFbwnucLBLM5reA9zxcIZnNawXueLxDM5rSC9zxfIJjNaQXveb5AMJvTCt7zfIFgNqcVvOf5AsFsTit4z/MFgtmcVvCe5wsEszmt4D3PFwhmc1rBe54vEMzmtIL3PF8gmM1pBe95vkAwm9MK3vN8gWA2pxW85/kCwWxOK3jP8wWC2ZxWZXNawZu8LxDM5rQqm9OqxiaYzWkFb2y/QDCb0wre2n6BYDanFby5/QLBbE4reHv7BYLZnFbwBvcLBLM5reAt7hcIZnNawVvfLxDM5rTYOuIHW0f8YOuIH2wd8YOtI36wdcQPto74wdYRP9g64gdbR/xg64gfbB3xg60jfrB1xA+2jvjB1hE/2DriB1tH/GDriB9kHfHHjawj/i6Yy2ndBXM5rbtgLqd1F2xsgrmc1l0wl9O6C+ZyWnfBXE7rLpjNaZF1xN8Fszktso74u2A2p0XWEX8XzOa0yDri74LZnBZZR/xdMJvTIuuIvwtmc1pkHfF3wWxOi6wj/i6YzWmRdcTfBbM5LbKO+LtgNqdF1hF/F8zmtMg64u+C2ZwWWUf8XTCb0yLriL8LZnNaZB3xd8FsTousI/4umM1pkXXE3wWzOS2yjvi7YDanRdYRfxfM5rTIOuLvgtmcFllH/F0wm9Mi64i/C2ZzWmQd8XfBbE6LrCP+LpjNaZF1xN8Fszktso74u2A2p0XWEX8XzOa0yDri74LZnBZZR/xdMJvTIuuIvwtmc1pkHfF3wWxOi6wj/i6YzWmRdcTfBbM5LbKO+LtgNqdF1hF/F8zmtMg64u+C2ZwWWUf8XTCb0yLriL8LZnNaZB3xd8FsTousI/4umM1pkXXE3wWzOS2yjvi7YDanRdYRfxfM5rTIOuLvgtmcFllH/F0wmdPa2DriN7aO+I2tI35j64i/y2ETTOa0NraO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jf2DriN7aO+I2tI35j64jfMjWIj7Y/vrj9/p2fcjP1h8/ITfQJPfrzi0c7kZvo83lGbqJP5xm5iT6bZ+QmysAzchMl4Bm5md67n+VmapOekZso+87ITZR8Z+RyuapMLdIzcmFd1UsCrFN6SYjtfoo9ovWoo38K4uXxGPcN0sl/dLHdj7vc2O7HW27whmd3ubHdj7vc2O7HXW5s9+Mu17jkxnY/7nJjOyV3uVyuKnijs7tcLlcVvM3ZXS6Xqwre5Owul8tVBW9xdpfL5aqCNzi7y+VyVcHbm93lUrmqPXhzs7tcKle1B29tdpdL5ar2m3HJpXJVe/C2Zne5VK5qD97U7C6Xy1UFb2l2l8vlqoI3NLvL5XJVwduZ3eVyuargzczucrlcVfBWZne5XK4qeCOzu1wuVxW8jdldLperCt7E7C6Xy1UFb2F2l8vlqoI3MLvL5XJVwduX3eVyuargzcvucrlcVfDWZXe5XK4qeOOyu1wuVxW8bdldLperCt607C6Xy1UFb1l2l8vlqoI3LLvL5XJVwduV3eVyuargzcrucrlcVfBWZXe5XK4qeKOyu1wuVxW8TdldLperCt6k7C6Xy1UVLlcVvCXbW27wlmx3uVyuqnK5quAd6O5yjUsul6sK3oHuLpfLVQXvQHeXy+Wqgnegu8vlclXBO9Dd5XK5quAd6O5yuVxV8L50d7lcroqrW33n6lbfubrVd65u9Z2rW33n6lbfubrVd65u9Z2rW33n6lbfubrVd65u9Z2rW33n6lbfubrVd65u9Z2rW33n6lbfubrVd65u9Z2rW33n6lY/uLrVD65u9YOrW/3g6lY/bsYll8pVHVzd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt/rB1a1+cHWrH1zd6gdXt7pxdasbV7e6cXWrG1e3ut2MSy6VqzKubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVjeubnXj6lY3rm514+pWN65udePqVrdMddSj7Y8vbseJ3EQvogm5mQqLR++PLx7tRG6ij6oZuYk+qmbkGpfcRAFwRm6iADgjN9N7d0JupvfuhNxEAXBCbqbC4hm5XK4qU2HxjFxYV/WSYPgSYrufto+HhL63TzH8Nurjqbftx3OU/kNwbP9zgeDYDugCwbE90AWCY7sgf8HBK4YvEBzbCV0gOLYXukBwbDd0gWBjE8zmtILXDV8gmM1pBa8cvkAwm9MKXjt8gWA2pxW8evgCwWxOK3j98AWC2ZxW8AriCwSzOa3gNcQXCCZzWiV4FfEFgsmcVgleR3yBYDKnVW7GJpjMaZXgtcQXCCZzWiV4NfEFgtmcVvB64gsEszmt4BXFFwhmc1rBa4ovEMzmtIJXFV8gmM1pBa8rvkAwm9MKXll8gWA2pxW8tvgCwWxOK3h18QWC2ZxW8PriCwSzOa3gFcYXCGZzWsFrjC8QzOa0glcZXyCYzWkFrzO+QDCb0wpeaXyBYDanFbzW+ALBbE4reLXxBYLZnFbweuMLBLM5reAVxxcIZnNawWuOLxDM5rSCVx1fIJjNaQWvO75AMJvTCl55fIFgNqdVjE0wm9MqbE4reJP3BYLZnFZhc1qVzWkF72u/QDCb0wre2X6BYGMTzOa0gje3XyCYzWkFb2+/QDCb0wre4H6BYDanFbzF/QLBbE4reOv7BYLZnBZbR3xh64gvbB3xha0jvrB1xBe2jvjC1hFf2DriC1tHfGHriC9sHfGFrSO+sHXEF7aO+MLWEV/YOuILW0d8YeuIL2wd8YWtI76wdcQXto74wtYRX9g64itbR3xl64ivbB3xla0jvt6MTTCZ06psHfGVrSO+snXEV7aO+MrWEV/ZOuIrW0d8ZeuIr2wd8ZWtI76ydcRXto74ytYRX9k64itbR3xl64ivbB3xla0jvrJ1xNdMDeL3r358cfv9O7/kJnoLT8jN1C09en988WgnchN9Ps/ITfTpPCM30WfzjNxEGXhGbqIEPCM303t3Qm6m9+6E3ETZd0JupibpGblcripTi/SMXFhX9ZJg+BJiu59e2vO/o1I/BXHbn0HcjvL66vZTcGz/c4Hg2A7oAsGxPdAFgmO7IH/BwXueLxAc2wldIDi2F7pAcGw3dIFgYxPM5rSC9zxfIJjNaQXveb5AMJvTCt7zfIFgNqcVvOf5AsFsTit4z/MFgtmcVvCe5wsEszmt4D3PFwhmc1rBe54vEMzmtIL3PF8gmM1pBe95vkAwm9MK3vN8gWA2pxW85/kCwWxOK3jP8wWC2ZxW8J7nCwSzOa3gPc8XCGZzWsF7ni8QzOa0gvc8XyCYzWkF73m+QDCb0wre83yBYDanFbzn+QLBbE4reM/zBYLZnFbwnucLBJM5rRa85/kCwWROqwXveb5AMJnTajdjE0zmtFrwnucLBJM5rRa85/kCwWxOK3jP8wWC2ZxW8J7nCwSzOa3gPc8XCGZzWsF7ni8QzOa0gvc8XyCYzWkF73m+QDCb0wre83yBYDanFbzn+QLBbE5rZ3NawZu8LxDM5rR2Nqd1sDmt4H3tFwhmc1rBO9svEGxsgtmcVvDm9gsEszmt4O3tFwhmc1rBG9wvEMzmtIK3uF8gmM1pBW99v0Awm9Ni64hvbB3xja0jvrF1xDe2jvjG1hHf2DriG1tHfGPriG9sHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2DriG1tHfGPriG9sHfGNrSO+sXXEN7aO+MbWEd/YOuIbW0d8Y+uIb2wd8Y2tI76xdcQ3to74xtYR39g64htbR3xj64hvbB3xja0jvrF1xDe2jvjG1hHf2TriO1tHfGfriO9sHfH9ZmyCyZxWZ+uI72wd8Z2tI76zdcR3to74ztYR39k64jtbR3xn64jvbB3xna0jvrN1xHe2jvjO1hHf2TriO1tHfGfriO9sHfGdrSO+s3XEd7aO+M7WEd/ZOuI7W0d8Z+uI72wd8Z2tI76zdcR3to74ztYR39k64jtbR3xn64jvbB3xna0jvrN1xHe2jvjO1hHf2TriO1tHfGfriO9sHfGdrSO+s3XEd7aO+M7WEd/ZOuI7W0d8Z+uI72wd8Z2tI76zdcR3to74nqlBfLT98cXt9+/8kpvoLTwjN9En9Oj9+cXtRG6iz+cZuYk+nWfkJvpsnpGbKANPyM3UKD0jN9N7d0JupvfuhNxE2XdGrnHJ5XJVmVqkZ+TCuqqXBFin9JIQ2/2M53febtu+fUri5fnVxf78X13wmmd/vbH9j7/e2AbIX29sB+Sv18j0xvZA/npjmyB/vbFdkL/e2JbJXy+Zvwpe7uyvl8xfBa929tdL5q+CFzv76yXzV8Frnf31kvmr4KXO/nq5/NUIXunsr5fLX43ghc7+ern81bgZmV4ufzWClzn76+XyVyN4lbO/XjJ/FbzI2V8vmb8KXuPsr5fMXwUvcfbXS+avglc4++sl81fBC5z99ZL5q+D1zf56yfxV8PJmf71k/ip4dbO/XjJ/Fby42V8vmb8KXtvsr5fMXwUvbfbXS+avglc2++sl81fBC5v99ZL5q+B1zf56yfxV8LJmf71k/ip4VbO/XjJ/Fbyo2V8vmb8KXtPsr5fMXwUvafbXS+avglc0++sl81fBC5r99ZL5q+D1zP56yfxV8HJmf71k/ip4NbO/XjJ/FbyY2V8vmb+qZP4qeO+2v14yf1XJ/FU1Mr1k/ip4tbq/XjJ/Fbxc3V8vmb8KXq/ur5fMXwUvWPfXS+avgles++sl81fBS9b99ZL5q+CV7P56yfwVWX/7IOtvH2T97YOsv32Q9bcPsv72QdbfPsj62wdZf/sg628fZP3tg6y/fZD1tw+y/vZB1t8+yPrbB1l/++Dqb7dbqn7vj5fT73ozvX9n9Gb6fP545fOuN9Pn84zeTJ/PM3ozfT7P6M2Uf2f0Zsq/E3pT9T/P6E31/p3Qmyn/zujNlH9n9BqZXjJ/Bdz//NKA65leGkL7oPuD19eD7Pv+4T+88+/9EhzaCF0gOHZT8xWCQ1uhKwSH9kJXCA5thq4QbGyCQ9uhKwSH9kNXCA5tnq4QzOa0Ylc2XyA4dmfzFYLZnFbs1uYrBLM5rdi9zVcIZnNasZubrxDM5rRidzdfIZjNacVub75CMJvTit3ffIVgNqcVu8H5CsFsTit2h/MVgtmcVuwW5ysEszmt2D3OVwhmc1qxm5yvEMzmtGJ3OV8hmM1pxW5zvkIwm9OK3ed8hWA2pxW70fkKwWxOK3an8xWC2ZxW7FbnKwSzOa3Yvc5XCGZzWrGbna8QzOa0Ync7XyGYzWnFbne+QjCb04rd73yFYDanFbvh+QrBbE4rdsfzFYLZnFbslucrBLM5rdg9z1cIZnNasZuerxDM5rRidz1fIZjNacVue75CMJvTit33fIVgNqcVu/H5CsFsTit25/MVgtmcVuzW5ysEszmtwea0BpnT2mI3e18hmMxp3b8Lm+BUr6Vij/b2YmeCU72WJgTHrkP+WnB59IuW2k4Ep/rQmhGc6kNrRnCqeDgj2NgEp4qHM4JTvYfrVn99dT32E8Gp3sMzglPFwxnBqeLhhOBcdcszglM5rRnBqZzWjOBUTmtGsLEJTuW0ZgSzOa1cdcszgoGd1ksEsHt6iohei7zX9hLRbx/+05tYp0avRfYXHNwRfSd4358PYuVEcHBH5C/Y2AQHd0T+goM7In/BwR2Rv+DgjuhLwaU8HqRtJ4KDuyd3wdFrkf0Fp3JaM4JzOa0Jwbmc1oRgYxOcy2lNCA7utI7t+PEgxwfB9yz02MXcTfOPZcxmPyQH91pXSA7utq6QHNxvXSA5ej3yFZKDe64rJAd3XVdIDu67rpBsfJKDe68rJPO5r+hlyVdI5nNf0QuTL5AcvTL5Csl87it6bfIVkvncV/Tq5Csk87mv6PXJV0jmc1/RK5SvkMznvqLXKF8hmc99Ra9SvkIyn/uKXqd8hWQ+9xW9UvkKyXzuK3qt8hWS+dxX9GrlKyTzua/o9cpXSOZzX9Erlq+QzOe+otcsXyGZz31Fr1q+QjKf+4pet3yFZD73Fb2Q9zvJoz1q4kY7+UPO6IW8/oJTfVqP/qiYGuOkYip6Xau34D16Xau/4FSf0zOCU2XkGcGpEvKM4Fzv4QnBud7DE4JTZeMZwamS8YxgMqe139icVvSO6XeCXyKA3dNLRHBHZNVeD9Lah//0PhcQ7dG7oP0FG5vg4I7oO8Gf21r26F3Q/oKDOyJ/wcEdkb/g4I7IXXD0Lmh/wcHdk7/gVE7rc3nJHr0L2l+wsQnO5bQmBOdyWhOCczmtCcG5nNaEYCSn1e3PW4zovdFzIpAc0amI4C6n7K+lWDnqf982RO939hdsmQRPGPfo/c7+goO7HH/BwV2Ov+DgLsdfcHCX4y44er/zl4I/+9jo/c7+glM5rRnBqZzWjGBjE5zLaU0IzuW0JgQjOS07+Z2J6H3NcyKQHNGZiOidyqWX54PU8ekXp3qx2+Obl/Lj/9pG/yE5us+5QHJ0p3OB5Ohe5wLJxic5ut+5QHJ0x3OB5Oie5wLJ0R3SBZKj+yl/ydE7la+QzOe+oncqXyGZz31F71S+QjKf+4reqXyFZD73Fb1T+QrJfO4reqfyFZL53Ff0TuUrJPO5r+idyldI5nNf0TuVr5DM576idypfIZnPfUXvVL5CMp/7it6pfIVkPvcVvVP5Csl87it6p/IVkvncV/RO5Ssk87mv6J3KV0jmc1+Dz30NPvcVvTn7Csl87mvwua/B576id6RfIZnOfR3Re9KvkEznvo7oXelXSKZzX8fN+CTTua8jemf6FZLp3NcRvTf9Csl87it6d/oVkvncV/Re9isk87mv6N3sV0jmc1/R+9mvkMznvqJ3tF8hmc99Re9pv0Iyn/uK3tV+hWQ+9xW9r/0KyXzuK3pn+xWS+dxX9N72KyTzua/oPe9XSOZzX+E75C+QzOe+wvfIXyCZz32F75K/QDKf+wrfJ3+BZD73Fb5T/gLJfO4rfK/8BZL53Ff4bvkLJPO5r/D98hdI5nNf4fvoL5DM5774uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq574+u6N76ue+Pruje+rnu7GZ9kOvdlfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdV/4uu4LX9d94eu6L3xd9+VmfJLp3Ffh67ovfF33ha/rvvB13Re+rvvC13Vf+LruC1/XfeHrui98XfeFr+u+8HXdF76u+8LXdV/4uu4LX9d94eu6L3xd94Wv677wdd0Xvq77wtd1X3K1oI+2//rq0X7/3i/Bqd7KM4JTfVqP3h+CRzsRnOqzekZwqk/qGcGpPqdnBKfKyDOCUyXkCcG5+rBnBOd6D08ITpWNZwSnSsYzgo1NMJvTQu7AfokAdk8vEcEdUTtuzwfp9uk/vX+Ka399+T/FcX+O6tF7qi+QHL2n+grJwX3RFZKDO6MrJAf3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f3sh628vZP3thay/vZD1txey/vZC1t9eyPrbC1l/eyHrby9k/e2FrL+9kPW3F7L+9kLW317I+tsLWX97IetvL2T97YWsv72Q9bcXsv72QtbfXsj62wtZf3sh628vZP3thay/vZD1txey/vZC1t9eyPrbC1l/eyHrby9k/e2FrL+9kPW3F7L+9kLW317I+tsLWX97Jetvr2T97ZWsv72S9bfXm5Hp5fJXlay/vZL1t1ey/vZK1t9eyfrbK1l/eyXrb69k/e2VrL+9kvW3V7L+9krW317J+tsrWX97Jetvr2T97ZWsv72S9bdXsv72StbfXsn62ytZf3sl62+vZP3tlay/vZL1t1ey/vZK1t9eyfrbK1l/eyXrb69k/e2VrL+9kvW3V7L+9krW317J+tsrWX97Jetvr2T97TVVv/f9sW/PL9/Hh2/+zYPs+9GfEru9nqNv//U738rjmffbP8Ce8P6EuvXx/M77h+9cbP/1tcWOk+lnciOa/pfTT9X9rul/O/1MTlXT/3b6mXy7pv/t9DOlGE3/2+mbpk88/UwJV9P/dvqZfp6i6X87/Uw/XdL0v52+dn3M09euL+30++Mblx/f97fpp7pDpOl/O33t+pinr10f8/S160s7/faafj2Zvmn6xNPXro95+tr1MU9fuz7m6WvXxzx97frSTr88HrnUk9/pTXUTU9P/dvra9TFPX7s+5ulr18c8fdP0iaevXR/z9LXrY56+dn3M09euj3n62vURTz/VfXZN/9vpa9fHPH3t+pinr10f8/RN0yeevnZ9zNPXro95+tr1MU9fuz7m6WvXRzz9oV0f8/S162OevnZ9zNPXro95+qbpE09fuz7m6WvXxzx97fqYp69dH/P0tevjnX67adfHPH3t+pinr10f8/S162Oevmn6xNPXro95+tr1MU9fuz7i6W/K+2unv91n8Jz+Vj2n//E2R9uU95mnr7zPPH3lfebpm6ZPPH3lfebpK+8zT195n3n6+t0e5unrd3uIp79r18c8fe360k7/4zXGtmvXxzx97fqYp2+aPvH0tetLO/2PF9narl0f8/S162OevnZ9zNPXro94+od2fczT164v7fQ//07voV0f8/S162Oevmn6xNPXro95+tr1MU9fuz7m6WvXxzx97fqIp2/a9TFPX7s+5ulr18c8fe36mKdvmj7x9LXrY56+dn3M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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": "selector", "type": { "kind": "field" } }, { "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/+2a6W4iRxCAG2xYe+OAx4M5bE7DxAcGAwvsGtZeIkV5gfzLnyjHJhspl7I5FOUB8m55qaSrqruLYVissjYtK9qRgJ7q+rqO7jmq7Y7aUmono/RRU+bQZzsqp7L6Jw2fW2VbugGfVE6lrCiCTqCopeVqKzKA2sbWFoyJrW39lT3RX3sTZc0G8PUor0iQhRMz5G4HnFMvQD+yzj1WKIRjD75IB8y+1+Gejkp9rH/fJ+XHRjkXpUmocozlSGePmoj+ymKL5hEFhTyjeUbzBv2BxRbdRxQU9hndZ3TfoF+y2KIBoqAQMBowGhj0FxZb9ABRUDhg9IDRA4N+y2KLhoiCQshoyGho0B9ZbNECoqBQYLTAaIF+k0h+M6KtNVls0UNEQeGQ0UNGDw36GYstWkQUFIqMFhktJh0turQIkbwc2d+M6Jh+ZrFFS4iCQonREqMlg75ksUXLiIJCmdEyo2WDfs5ii1YQBYUKoxVGKwZ9zWKLHiEKCkeMHjF6lEzPkXNUiBxuRrSDP7HYoseIgsIxo8eMHietHbsbxQZEW/uCxRatIgoKVUarjFYN+h2LLVpDFBRqjNYYrSUdrbnlLET25cihHDmWI2U5UvViJe8lySU5UvDimJ+M3SOW0Itjd6wxfUH/wWKL1hEFhTqjdUbrSWt1lwYhcixHSl4c25cjZTlS9YLckTG9Cr5isUUbiIJCg9EGo42ktYZLthA5kCN5ORLIkZIcKXqJpSxHql6Q2makBfI5F1gLBG2BtccFFmirSFm2o7YVH0001YybahHcoKbtgQquxdVZO4vNtlHq6LUPbJTCISIs6vQH3XxGZzZGYKLIqp2wNepIk1BF7FGknDFA2trhVG/JrRWHpykT7YJ0YMRdl5sdzs1uvPh8xOHprGZU/ACNJlbUmLAmDbNjhmmsy6SZtF3j3O46JLMZiblkg9mbby/p7NC9Z9VfOE7IX0jnCdXlDXOqpzKF0WfsnOOEtcnIc/05dRmLOGOn8Yx9wO6d6gE/0b9npBwZ5XMM8gxajJ2Tzik14TeJBHIklCNFOVLejOg0fMNii14gCgoXjF4wepG0duFunEKkIEcqcqQqR0I5Erz18PX8DFhs0S6ioNBltMtoN2mt66wJkbwcCeVI4CWWshypekHuyJheBb+z2KKXiILCJaOXjF4mrV26q1SI1Dcj2sE+iy3aQxQUeoz2GO0lrfXc1AqRMzkSyJFQjhTlSFmOnMuRkpd5qciRqpd5CbzEckfG9HXzPYst2kcUFPqM9hntJ6313R6gEKnIkUCOFB6qY2U5UnwIGdML52sWW/QKUVC4YvSK0auktSsXkxAJ5UhPjhQ2IzoNQxZbdIAoKAwYHTA6SFobuEfVBgTKjvQrrjtuEFRcbNjqYmDqEMPGq9ghmhrGTY0IHlDT9kBhM+KiZUxV7NgoTUwVO6Uqdgoi+KCbL+nMxgjMNLJqT9gadaRJqKbs0VQ5Y4CMm3rQT5fcWnEYq1iI9oaHGLrctDg3w3hN1j5NmzoPC7tEadk2ve2lYbOu6MQsYryvnRPm2CKzqDaIzHSqRs7VlXrEzD8rBzCkAWjrETbtrgEZ+jNuKIdzi+PlWDvlrLSMJaO+5KAaEABuDXCBtONOZt/s5JA0IPwhOzl0i/QvaK06mY07OUw5KwC2Yy5klcvCkLBtGxvnx4xgTbe2lc0USW0OjL7FQD+71qVWxillec7hfWDkllKDl9IovpROO8s9do8FlJ64e/0TVjcXwcgs/bVI4AUpyZGeHDnyEkvBi5XQi2P3WDB1L8g9YunKkYO3PpX6gfWKxRYdu8fPmNExo+OktbFLgxAJNyPawd9YbNEJomN65Fp0wugkaW3iLmwhUpQjfTlSlSOhHOluRuA2j/+4Ze7zNQRV/BaujDa9TpnXnuXXKXp5mcZNPSV4Qk3bA1E/5YfENb1HXBulmXmdmtPrFPy1YgYfdPOEzmyMwMwjq/aMrVFHmoRqzh7NlTMGyHVTn5eW3FpxeGpeCu2fcTFGl5ss52a68jrVWe7ZMg/SqZuS5topsa+Oa5HMZoT9m7h9/qkZZJJxY0ECM7R7n1G0ez/it8lrF9pTDu06HtqzznLPlskUKM3cDtCM1Wec8NmbkECOhHKkKEfKcuRcjpTkSEGOVORI1cu8BF7Cv/BiJf8/yljZy4Lxs8a6Xq7Kuhy59DKV7+7J7+7J//XsV7xkrCdHcl5iCR7qggm8XGLFh5qxvpdYQi8r+R7hX731RxLUYdsfcd1wg6CKlwTKaFO5eE0jLpeLVJzN46aeEzyjpu2B5nMuOm6pXLw1PS9MubigcnGh6L+7XqCbH9KZjRGYRWTVbtgadaRNNAv2aKGcMUBum3rQ6ZJbKw5juQjR3qTdDuqASi27vwtV19L2Om+oZt64oTpMbKhmjBJlEawkS9yRye9oaSrXVfWzuLH5ma0N8a8PbUDKf8PnX9ko0HQxNgAA", "debug_symbols": "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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/+2b227aQBCG18RJTJ24YGMMgQQIyUXvDA2nO16mfe3eV+orVM2YnTJsp2hRx1tWYqWIsb2e/5t/D1jICdSuRe9/gY6v9eeN+rNhn63+LP+tzQRzlXVyBp5wNjzhvPKEMxTkDBhO+Ax1DOsO1tytOlyPv9tWqChTlELBBLoi19URwIMboUU6oBfHUuDrcnNDklNwpcFDfQ0/ASfW1yhYrIus+pBzWGiDnEOdK3IOd0bUibQpwvUuoj2yXN73CQA1NHUu5I5JTK8NiXVhTTVey9f4VsuYlLtVjGNyrXPfkmP0Cj0U/OaYUe1A/zWJptJjhPGA9MV+6EeDjDG0e7Wf180j94XGfQnpc8PUPxau/9bgMecsjEFLx204xj2BsH0g9W1l2ErIG8vnndExCHVu5I9JTYm43/M15L9Th838VhqTOCE89+I85ayeOndj95Gwy+RdvIFXLcOrO8OrhPShDK0a/AuILubG4xajLefFcg3abQsv2gxP27EXbUZb0IsNaKcWXqQMT+rYi5TRlvNi9Rm0MwsvMoYnc+xFxmjLeTGvni06Fl50GJ6OYy86jLbgGqnmRW7hRc7w5I69yBltQS++gnbXwosuw9N17EWX0Rb04gtoFxZeFAxP4diLgtEW3Dur54uehRc9hqfn2Iseoy3oxRy0+xZe9BmevmMv+oy24BqptB8svHhgeB4ce4F6pzJ3PGQuPGTOzoA5MmIZ7WW1fw4svBgwPAPHXtDfck5hzs+AOTJiGe3lArSHFl4MGZ6hYy9Q71Tm1EPmzEPmrofMuYfMhYfM5zCfIyOW0V5Ve+ijhRePDM+jYy9Q71Tm1EPmgYfM2RkwR0Yso72qfpt7svDiieF5cuwF6p3K3POQuX0GzJERy2ivlqA9svBixPCMHHuBeqcy9z1kLjxkHnjInHnI3PWQOfeQ+bIG3TCnZ8AM773gOzA/auWZb2KDBz1TBqMyGGMSJ4QR+26V3PsqiVE7ak3E/diNjzlf8HhSq/Z8DXmn8jVVz/IvOhe+wzdlanrVcSDs5wvJGxAdPB+S+Dvpi/3QD1y3yA7vXD3r+PXIfSPjvoT0eWbqHwvXPzV4pgYzjMk3wlHH3LKZ1y21X8ufCE8N++AbfScXm82+Q/cYQZ5ZTXWW9B2+n0p2TU8Mr5qGVwnpQ/fo/7VvXpgvzH9jps8TTXKO8uC5hlEL/f+GCcnxC57ToyHuNQAA", "debug_symbols": "ndpBattQGIXRvWhsiu9vSe/JWymlOIlTDMYOsVMopnuv3dIF5Mz0JN3ZNzq82/Cyf/r48f1wej1fhu3X23A8P++uh/PpfroN6y/V/769vO1OjxeX6+79Omw3rVbD/vTyeGq/V8Pr4bgftnV//rZ6jBYYbdYyioxKRhsZjTKaZDTLqMlIithIEaMUMUoRoxQxShGjFDFKEaMUMUoRoxQxShGTFDFJEZMUMUkRkxQxSRGTFDFJEZMUMUkRsxQxSxGzFDFLEbMUMUsRsxQxSxGzFDFLEU2KaFJEkyKaFNGkiCZFNCmiSRFNimhSRJciuhTRpYguRXQpoksRXYroUkSXIroUsUgRixSxSBGLFLFIEYsUsUgRixSxSBGLFJH1mlahVdFqQ6uRVhOtZlo1WnVaURuhNkJthNoItRFqI9RGqI1QG6E2Qm0UtVHURlEbRW0UtVHURlEbRW0QaIZEM0SaIdMMoWZINUOsGXLNEGyGZDNEmyHbDOFmSDdDvBnyzRBwhoQzRJwh4wwhZ0g5Q8wZcs4QdIakM0SdIesMYWdIO0PcGfLOEHiGxDNEniHzDKFnSD1D7BlyzxB8huQzRJ8h+wzhZ0g/Q/wZ8s8QgIYENESgIQMNIWhIQUMMGnLQEISGJDREoSELDWFoSENDHBry0BCIhkQ0RKIhEw2haEhFQywactEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRsoue5KJFLlrkokUuWuSiRS5a5KL1aRe9n37u3g+7p+P+cbf38fHj9Pz/qu/9eP319u/L/d8/" }, { "name": "mint_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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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" }, { "name": "claim_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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": "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": "tx_tree_height", "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": 32, "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": 32, "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" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint" } }, { "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": "new_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": "new_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": "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": "new_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": "tx_tree_height", "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": "7X3djjS5ceW7zLVgJCODf36VxWKh3bUXAgzZsOUFFobefTP4fVnd0rC7ZroymCc6QjeakTL7HAaLjFMsRpz/+uV//9P//M//8z/+9Od//tf/+OUf/9t//fIv//q//viXP/3rn49/+69fUh7/23/82x//LP/6H3/547//5Zd/3P7wyz/9+X8f//3XP/zyz3/6l3/65R+p1r/+4VfPUc37z0ePB/Lj6ZS2ydNMqf58mqnxk6d75pNGL9vb07Snv/73P/ySilXidSHxfeOT+F5eJd5eIc5cH1Ryenu6lfG3u97fpm32t/c9n3O6752eIBxPPD4A7wJT2yyMLf18Nm1pf3uYJs+mvZfzYd7/5mFhnswyJ7PMd7PM2SzzbJZ5Mcu8mmXezDLvVpnvZnPobjaH7mZz6G42h+5mc+huNofuZnPobjaH7mZz6G42h7LZHMpmcyibzaFsNoey2RzKZnMom82hbDaHstkcymZzaDabQ7PZHJrN5tBsNodmszk0m82h2WwOzWZzaDabQ7PZHFrM5tBiNocWszm0mM2hxWwOLWZzaDGbQ4vZHFrM5tByQQ5l7ifzmpYxr5tZ5sksczLLfDfLnM0yz2aZF7PMq1nmzSxzszm0mc2hzWwObWZzaDObQ5vZHNrM5tBmNoc2szm0mc2hzWwO7WZzaDebQ7vZHNrN5tBuNod2szm0m82h3WwO7WZzaDebQ9NmNoke79ulbjaNps1sHk2b2USaNrOZNG1mU2nazObStJlNpmmzm02T3Wya7GbTZDebJrvZNNnNpsluNk12s2mym03TBdm0bWfzorZvT6gfhOuD+97env7ZjSh1LD5XtBm6lE8C40NgfOZph+mE2Lk87cZV8tl4itq79ZU4TZ6u+Vy4rdXHs5Vn6/ZJK64Pev0YIZ9Xkz+OeOjxWeD9Pf1BqKARqmiEGhqhDkbogw45NxJKaIQIjdCORojRCC3fqXvJDz6t/4pPAeOzfp/O24NQftfRc5qIDw34eJiovBHJfUYkczuJ5PffLGZfFnZu5THG/i7Hz0jvqZ9fQ45/rO8fHlFsEcULotgjiq9HkbeI4gVRTBHF3xJF6vz48vuub/EZRYooXhDFPaL4W6K4U35EkbfPH6ZWtkc8Kj15eN8eD+/p13sFx/zcPD8lPebnncal+THQOb76nvGPI2LOMZXfZSpLTOV3mcr4knr3VPbz7JyY6itTGd+Uv81Uxtf1m6eS22Mq8/sR/pClOQ4CsOcnjhiw5ycOL7DnJ45Fbp6fQudPb1RK+vzh1B62b6lV/tVkckzm95nMOEWxNJm9P/7yltoL3whyHLn4nPc4n/E573GYY2jeaaNHpLdMr8x7nPy4nPcSJ0oK8/6oWaG+PdmNn/wQXeJE6e75ueonrxKHT99mKuOc6u6pvOonrxKnVN9mKuOM6uap/Px0v8RZEvb8xJkP9vzE2Qz2/MQZys3zc+EPXjUORr7RZMYpiqXJvOzXjBpHLj7nPc5nfM47x7zbmffrfsWqcfLjc97jROn6ee/1Ubm8bfU13R0nStjzEydKN8/PddInDp++y1S2OHr6NlMZB0/fZirjLOneqbzua0OL46FvM5UcU/mbpvLxy+Uxk/zsm/91jZRanMzcPT9XXXpscdjybaYyzmW+zVTGEc7dU3nV/dUWRzjfZSp7HOHcPJWfX9XrcS6DPT9x2II9P3GCgj0/HPNz7/xceHu1xxnKN5rMOEWxNJmX/XzU48jF57zH+YzPeY/DHEPzftkPkrTFyY/PeY8TJYV5v6yR0jHRMT83z89FP3nRFodP32YqOaby5qm86CevI33GVH6XqYwzqpun8tPTfdriLAl7fuLMB3t+4mwGen5SnKHcPD/X/eBFKQ5GvtFkximKpcm86tcMSnHk4nPeOebd5bzHYY6heb/uV6wUJz8+5z1OlK6f9+sa9VCKEyXs+YkTpZvn5zLpQ3H49G2mMo6evs1UxsHTt5nKOEu6dyqv+9pAHFP5XaZy/YlP2c5bZKmUbGQqUz9JH//4q1umVCKKF0SxRhQviGKLKF4QxR5R/C1RpP7IWnva/j6K+xZRvCCKKaL4m+SWmkn75zUmO8X83Dw/VxUm7HtM5XeZSo6p/C5TGV9S757Kq2pM9vim/G2mMr6u3zyVn1+n3+MgAHt+4ogBen44Di+w5yeORW6enwsrTDjOUL7RZMYpiqXJvOyKB3PMu8t5j/MZn/MehzmG5v26S0McJz8+5z1OlBTm/bpmhxwnSnfPz1U/eeU4fPo2UxnnVHdP5VU/eeU4pfo2UxlnVDdP5een+5ljfqDnJ858sOcnzmaw5yfOUG6enwt/8MpxMPKNJjNOUSxN5mW/ZpQ4cvE573E+43Pe4zDH0Lxf9ytWiZMfn/POMe+Xz/uFzfRKnChhz0+cKN08P9dJnzh8+jZTGUdP32Yq4+Dpu0xljbOke6fyuq8NNY6Hvs1UxonPb5tKNZP2z++v1jiZuXt+rrr0WDmm8rtMZZzLfJupjCOcu6fyqvurNY5wvs1UxhHOzVP5+VW9Gucy0PPT4rAFe37iBAV7fuJY5Ob5ufD2aoszlG80mRyTaWgyL/v5qMWRi895j/MZn/MehzmG5v26HyRbnPz4nPc4UVKY9+saKfU4Ubp7fq76yavH4dO3mco4p7p7Kq/6yavHKdW3mUqOqbx3Kj8/3e9xloQ9P3Hmgz0/cTaDPT9xhnLz/Fz4g1ePg5FvM5nHEUtMpqHJvOrXjH2LIxef8x7nMz7nPQ5zDM37Zb9i7RvHvLuc9zhRun7er2vUs29xooQ9P3GidPP8XCd94vDp20xlHD19l6lMcfD0baYyzpLuncrrvjakOB76NlN5w4nPY0dJNfH7qRyEGI1QRiO0/kthTf1BiOlXhCoaoYZGaL0irf3tiyv9ihBtaITWq4Na6Y3Q/itChEZo/U7dtzPZHTKw/IoQoxHKaIQKGqHlOzXt+1t5Bj8RbtxPkZe3d7KN2uTZ/jhdT1va/ubhMdLmZqTdy0j37duM9Bjf4yvKtk+GmvwMlfwMdf9GS/VtpDn/eqT8LUfaJnOaoUea86kpS96efXxpe3yJIX53BNF/jLS4GekNMim9jbQ+Gymd5PO7pbfPjxIex2at/f3Zz958DLO7GCZvPoaZfAyTfAxz9zFM9jHM7GOYxccwfagg9qGC2IcKyj5UUPahgrIPFZR9qKDMPobpQwVlHyoo+1BB2YcKyj5UUPGhgooPFVR8qKDiQwUV9jFMHyqo+FBBxYcKKj5UUPGhgqoPFVR9qKDqQwVVHypovavwPcP0oYKqDxVUfaig6kMFVR8qqPlQQc2HCmo+VFDzoYLWuwLeM0wfKqj5UEHNhwpqPlRQ86GCug8V1H2ooO5DBXUfKmi978w9w/ShgroPFdR9qKCOrYJqOivGK7X3wxzcsaXNZ9x5w9Yrjc7PzHtj1vnH69NaS96wFcuFA8XWLBcOFFu1XDhQ9jJQbOVy4UCxtcuFA8VWLxcOFFu/XDhQbLFz3UCTF2WUvCij5EUZJS/KaH0T17sG6kUZJS/KKHlRRsmLMkpelBF5UUbkRRmRF2VEXpTR+qbJdw3UizIiL8qIvCgj8qKMyIsy2r0oo92LMtq9KKPdizK6o2X0PQP1oox2L8oIvF/0hQP1oozAe0ZfN1DwrtEXDtSLMgLvHH3hQL0oI/Du0RcO1IsyAu8gfeFAvSgj8C7SFw7UizIC7yR94UC9KCPwbtIXDtSLMgLvKH3hQL0oI/Cu0hcO1IsyAu8sfeFAvSgj8O7SFw7UizIC7zB94UC9KCPwLtMXDtSLMgLvNH3hQL0oI/Bu0xcO1IsyAu84feFAvSgj8K7TFw7UizIC7zx94UC9KCPw7tMXDtSLMgLvQH3hQL0oI/Au1BcO1IsyAu9EfeFAvSgj8G7UFw7UizIC70h94UC9KCPwrtQXDtSLMgLvTH3hQL0oI/Du1BcO1IsyAu9QfeFAvSgj8C7VFw7UizIC71R94UCdKKPspQd29tIDO3vpgZ299MDOG3sZqBNllL30wM5eemBnLz2ws5ce2NlLD+zspQd29tIDO3vpgZ299MDOXnpgZy89sLOXHtjZSw/s7KUHdvbSAzt76YGdvfTAzl56YGcvPbCzlx7Y2UsP7OylB3b20gM7e+mBnb30wM5eemBnLz2ws5ce2NlLD+zspQd29tIDO3vpgZ299MDOXnpgZy89sLOXHtjZSw/s7KUHdvbSAzt76YGdvfTAzl56YGcvPbCzlx7Y2UsP7OylB3b20gM7e+mBnb30wM5eemBnLz2ws5ce2NlLD+zspQd29tIDO3vpgZ299MDOXnpgZy89sLOXHtjZSw/s7KUHdvbSAzt76YGdvfTAzl56YGcvPbCzlx7Y2UsP7OylB3b20gM7e+mBnb30wM5eemBnLz2ws5ce2NlLD+zspQd29tIDO3vpgZ299MDOXnpgZy89sLOXHtjZSw/s7KUHdvbSAzt76YGdvfTAzl56YGcvPbCzlx7Y2UsP7OylB3bx0gO7eOmBXW7ogU1vT//dQAehKxRM2/cHoZyfEKrlfLj28u4v0+TZvp/B7KU/ebbm9vi7/PYs/Rgm+xjmB+qlnu/seaMnw0xbPj/taSt/S31glAUYdQHGB+my1o8wxlvz3JPLuZvsZX/2QUqptQc1SvvbR6mVyePHpvHz4UJvn47aJ49yyT8fzam9fUDTNvvQZd4en7rt3Ufp2NdkpB+0GVYd6WOrarR9PtJUqJx/uOT+bKxvLLZ3OybNFlja++Mv877//RL7oCmx+7BQhGUWlj3CMgsLR1hmYckRlllYSoRlFpYaYZmFpUVYZmHpEZZJWChU7jQsoXKnYQmVOw1LqNxpWDjCMgtLqNxpWELlTsMSKncallC507CEyp2FZQ+VOw1LqNxpWELlTsMSKncaFo6wzMISKncallC507CEyp2GJVTuNCyhcmdh4VC507CEyp2GJVTuNCyhcqdh4QjLLCyhcqdhCZU7DUuo3GlYQuVOwxIqdxaWHCp3GpZQudOwhMqdhiVU7jQsHGGZhSVU7jQsoXKnYQmVOw1LqNxpWMBVbnuQr2lbF5YCrnLvCgu4yr0rLOAq966wgKvcu8LCEZZZWMBV7l1hAVe5d4UFXOXeFRZwlXtXWELlzsJSQ+VOwxIqdxqWULnTsITKnYaFIyyzsITKnYYlVO40LKFyp2EJlTsNS6jcWVhaqNxpWELlTsMSKncallC507BwhGUWllC507CEyp2GJVTuNCyhcqdhCZU7C0sPlTsNS6jcaVhC5U7DEip3GhaOsMzCEip3GpZQudOwhMqdhiVU7jQsoXInYalbqNxpWELlTsMSKncallC507BwhGUWllC507CEyp2GJVTuNCzYKrfu7RGWygvDgq1y7woLuPfZbWHBVrm3hQVb5d4WFmyVe1tYOMIyCwu2yr0tLNgq97awYKvc28ISKncallC5s7CAe5/dFpZQudOwhMqdhiVU7jQsHGGZhSVU7jQsoXKnYQmVOw1LqNxpWELlzsIC7n12W1hC5U7DEip3GpZQudOwcIRlFpZQudOwhMqdhiVU7jQsoXKnYQmVOwsLuPfZbWEJlTsNS6jcaVhC5U7DwhGWWVhC5U7DEip3GpZQudOwhMqdhiVU7iws4N5nt4UlVO40LKFyp2EJlTsNC0dYZmEJlTsNS6jcaViwVW7bTh6p0b4wLNgq97awYKvcu8IC7n12W1iwVe5tYcFWubeFBVvl3hYWjrDMwoKtcm8LC7bKvS0soXKnYQmVOw1LqNxZWMC9z24LS6jcaVhC5U7DEip3GhaOsMzCEip3GpZQudOwhMqdhiVU7jQsoXJnYQH3PrstLKFyp2EJlTsNS6jcaVg4wjILS6jcaVhC5U7DEip3GpZQudOwhMqdhQXc++y2sITKnYYlVO40LKFyp2HhCMssLKFyp2EJlTsNS6jcaVhC5U7DEip3EpYG7n12W1hC5U7DEip3GpZQudOwcIRlFpZQudOwgKtc7o+wVFoYFnCVe1dYwFXuXWEBV7k3hQXc++y2sICr3LvCAq5y7woLuMq9KywcYZmFBVzl3hWWULnTsITKnYYlVO40LKFyZ2EB9z67LSyhcqdhCZU7DUuo3GlYOMIyC0uo3GlYQuVOwxIqdxqWULnTsITKnYUF3PvstrCEyp2GJVTuNCyhcqdh4QjLLCyhcqdhCZU7DUuo3GlYQuVOwxIqdxYWcO+z28ISKncallC507CEyp2GhSMss7CEyp2GJVTuNCyhcqdhCZU7DUuo3FlYwL3PbgtLqNxpWELlTsMSKncaFo6wzMISKncallC507CEyp2GJVTuNCyhcmdhQfc+uyssoXKnYQmVOw1LqNxpWDjCMgtLqNxpWELlTsMSKncallC507CEyp2FBdz7rG90/uFOfWFYsFXubWHBVrm3hQVb5d4WFo6wzMKCrXJvCwu2yr0tLNgq97awYKvc28KCrXLvCgu499ltYQmVOw1LqNxpWELlTsPCEZZZWELlTsMSKncallC507CEyp2GJVTuLCzg3me3hSVU7jQsoXKnYQmVOw0LR1hmYQmVOw1LqNxpWELlTsMSKncallC5k7B0cO+z28ISKncallC507CEyp2GhSMss7CEyp2GJVTuNCyhcqdhCZU7DUuo3FlYwL3PbgtLqNxpWELlTsMSKncaFo6wzMISKncallC507CEyp2GJVTuNCzQKpfoUX1GVMuTsBzBqI+47O2N9Z7GWG8wNGv5/NvvZ/UY6+CzXjMm2vbH04U+j36mM/g5v/3dI5iTv1seJFr7+8/YDdZg94xzdzJOdjLO7GScxck4q5NxNifj7D7GeYNF1T3jdKKHdid6aHeih26webpnnE700O5ED+1O9NDuRA/tTvQQO9FD7EQPsRM9xE700A2GQPeM04keYnA91Oj8y+871M3HSdujnR1xfSP940SewRXRhSMF10QXjhRcFV030gyuiy4cKbgyunCk4NrowpGCq6MLR8puRgqukC4cqRuNlN1opOxGI2U3Gqm40UjFjUYqbjRScaORbjAiuWukbjRScaORihuNVNxopOJGI1U3Gqm60UjVjUaqbjTSDTYWd43UjUaqbjRSdaORqhuNVN1opOZGIzU3Gqm50UjNjUa6wQThrpG60UjNjUZqbjRSc6ORmhuN1N1opO5GI3U3Gqm70Ug3tNC/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" }, { "name": "balance_of_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(view)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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/rRBAH8E0apyU0ztVp7o2buLm7PSUgjqA8IiQekXgEcRcSN3ER4ivypWBndmf/SX3kaqUj60Ry44zntzO7TtpsF+pMqYtA6cdE2UdFR1SoqvqpTMdHSs70CR2lUJUklNBFUuZMx9VZYoGq8JmuoIIb/eMyUWaEi8q7dKFCYy1UidB5QGNSbXWuj+qCGlPv66OWSGO6zpk9rdEPk0PsrQWu6AE/1s9vm+QLm3yZlE1QXYJdmpyaOWX6F8JC60wpoQ5aB61b+gvCQkOmlBCChqChpd8gLLTBlBIaoA3QhqV/Iiy0yZQSmqBN0KalPyIstMWUElqgLdCWpb8iLLTNlBLaoG3QtnnOkno+0dVmCAvtMKWEDmgHtGPp1wgL7TKlhC5oF7Rr6VcIC42YUkIEGoFGlv6EsNAeU0rogfZAe9nl6blqnqTuT8J8ouf0HcJCr5hSwhXoFeiVpV8iLLTPlBL6oH3QfrbRvnuD5RBd7XuEhQ6YUsIAdAA6yFYbuAZziK72G8JCh0wpYQg6BB1mqw3d7xhP0vEnkT9p+pPQn7QLqdL1J/VC5tIqpLFn7r5+R/+DsNARU0oYgY5AR9lqI7cMnqTjT3qFNBb6k64/iQohz6yYfhd8i7DQMVNKGIOOQcfZamO32DlEV/sDYaETppQwAZ2ATrLVJu6LjyfpFlKl6U/CQuYSFUKG+SSm+BTf/V8yVPjCL9/weaOSyC5Aj1hReEy51PS01LXBE3MqV2hzcY2NQ1zl09gm3diNybzEQ8wpRAe3OTKvZI4UmyeSNkM1c6FsgmqOjubKFSMS68ul5lFbTxp+r2Rn+9Lk8ByTow2bTGJ6ui+qYnrThQrU6YPvAm/0uJK9IRU7TI37npgPqAxob8PUtjN9FQnyyUlLMpnrDypHORVzZ572S4+Z6ZeWcxbwac2+DBZcTt2YnWRgb1hsinxI7xm3YnOsWHK6Ygu0l+gBP9PPtyZ5bpOXPMlbOgNbmpzEnNJzljT8SSuf6AZ/R1joiiklrEBXoKtstZX7zZFDdLUfEBa6ZkoJa9A16Dpbbe3+BHmStj8Z+5PIn7T8SeO1T1/fn3uEhW6YUsIGdAO6yVbbuGqepO5PWv6kUchcuv4kKoQ8s2L6XfA3wkK3TClhC7oF3Warbd2n1JOM8oluMEVY6I4pJexAd6C7bLWdu7We5NafNPxJy58s/UnXn6z8Sa+Q+zL2J1Eh96VRyFyeWTH9ufkZYaF7ppSwB92D7rPV9u5/TZ5k7E8a/qT9pjbW9SfLN3XF+oXMpeVPdq99+vpz8wJhoSlTSkhBU9A0Wy11f6JyCO3oyp9i3/HIUGGzIbuL1G0+EjPi8S72jkvdnZa6Nzg1p3KFNjb32LQ8mF3sg016x+5iD2YXe6AQHdzmJ+aVzJHMIZG0F6hmLpRNUB3Q0UG5YkQeZnrQx6O2njTMu1ia7SOGuHNrE2Bt7k73ZPGybPd5vLHLbC1jezU+GrbqNp28ijzfz10T9nFmynJamtjbqWqh21fqEYP/njzImAyiwTmfxvalKfTFaaGQ7y2PFyK75KoEtpJNP2pQpQZQWym/QWJpsux4asLSEa+G+/dInIgqz+m0/y8d/wMOUhUC9x0AAA==", "debug_symbols": "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" }], "outputs": { "globals": { "storage": [{ "fields": [{ "name": "balances", "value": { "fields": [{ "name": "slot", "value": { "kind": "integer", "sign": false, "value": "1" } }, { "name": "typ", "value": { "kind": "string", "value": "Map<AztecAddress, PublicMutable<U128, Context>, Context>" } }], "kind": "struct" } }, { "name": "portal_address", "value": { "fields": [{ "name": "slot", "value": { "kind": "integer", "sign": false, "value": "2" } }, { "name": "typ", "value": { "kind": "string", "value": "SharedImmutable<EthAddress, Context>" } }], "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" } }, { "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": "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" } }], "kind": "struct", "path": "GasToken::claim_parameters" } }], "kind": "struct", "path": "GasToken::claim_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": "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": "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": "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" }] } }, "file_map": { "110": { "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\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 event_selector: Field,\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 event_bytes = event_selector.to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[32 + i] = event_bytes[i];\n }\n let len_bytes = (n as Field).to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[36 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[40 + 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() < ARGS_HASH_CHUNK_COUNT * ARGS_HASH_CHUNK_LENGTH);\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..800 {\n input.add(i as Field);\n }\n let hash = input.hash();\n assert(hash == 0x05a1023fef839ac88731f49ae983e172c1b600a3c8f3393ad0ac25d819ac0f0f);\n}\n\n#[test]\nfn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let event_selector = 5;\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00846d6969c8c2f61d39cd2762efcb0abb14f88d59c2675910251ef2bcffe9a7);\n}\n\n#[test]\nfn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let event_selector = 5;\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00880a801230ea08c98a802a11b4786cba474513875f0fc69a615e81c5f9f21c);\n}\n\n#[test]\nfn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let event_selector = 5;\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00a78b5347813624ecfd26e5b8bc6146f418b0cfcc8296b5112d09b8ebba9496);\n}\n\n#[test]\nfn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let event_selector = 5;\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x001f3390ea242afee7ce46dafdbdc4bd4f1cf20cd63850d12d60ff9956712c4f);\n}\n" }, "116": { "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" }, "119": { "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" }, "123": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/storage.nr", "source": "use dep::protocol_types::traits::{Deserialize, Serialize};\n\n#[oracle(storageRead)]\nunconstrained fn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<N>(storage_slot: Field) -> [Field; N] {\n storage_read_oracle_wrapper(storage_slot)\n}\n\n#[oracle(storageWrite)]\nunconstrained fn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n" }, "126": { "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" }, "130": { "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 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" }, "131": { "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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_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 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 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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0,\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" }, "133": { "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" }, "136": { "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" }, "138": { "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 crate::oracle::storage::storage_write;\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> PublicMutable<T, &mut PublicContext> {\n // docs:start:public_mutable_struct_read\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n let fields = T::serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T> PublicMutable<T, UnconstrainedContext> {\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n // This looks the same as the &mut PublicContext impl, but is actually very different. In public execution the\n // storage read oracle gets transpiled to SLOAD opcodes, whereas in unconstrained execution the PXE returns\n // historical data.\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n" }, "141": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr", "source": "use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext},\n oracle::{storage::{storage_read, storage_write}}, 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> SharedImmutable<T, &mut PublicContext> {\n // Intended to be only called once. \n pub fn initialize<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n // TODO(#4738): Uncomment the following assert\n // assert(\n // self.context.public.unwrap_unchecked().is_deployment(), \"SharedImmutable can only be initialized during contract deployment\"\n // );\n\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 fields_read: [Field; 1] = storage_read(initialization_slot);\n assert(fields_read[0] == 0, \"SharedImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n storage_write(initialization_slot, [0xdead]);\n\n let fields_write = T::serialize(value);\n storage_write(self.storage_slot, fields_write);\n }\n\n pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n\nimpl<T> SharedImmutable<T, UnconstrainedContext> {\n pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n\nimpl<T> SharedImmutable<T, &mut PrivateContext> {\n pub fn read_private<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\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" }, "156": { "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}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered, utils::reader::Reader,\n abis::gas_fees::GasFees\n};\nuse dep::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: 0 }\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" }, "158": { "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};\nuse dep::std::cmp::Eq;\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, nullifier_counter: u32, contract_address: AztecAddress) -> ScopedNoteHash {\n ScopedNoteHash { note_hash: self, nullifier_counter, contract_address }\n }\n}\n\nstruct ScopedNoteHash {\n note_hash: NoteHash,\n nullifier_counter: u32,\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.nullifier_counter == other.nullifier_counter)\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 nullifier_counter: 0,\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.nullifier_counter as Field, 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 nullifier_counter: reader.read_u32(),\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 assert(\n (self.nullifier_counter == 0) | (read_request.counter() < self.nullifier_counter), \"Read request counter must be less than the nullifier 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" }, "159": { "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" }, "160": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr", "source": "use crate::abis::{function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs};\nuse crate::address::AztecAddress;\nuse crate::constants::GENERATOR_INDEX__CALL_STACK_ITEM;\nuse crate::traits::Hash;\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n let public_inputs = self.public_inputs;\n let mut request_public_inputs = PublicCircuitPublicInputs::empty();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs\n };\n call_stack_item\n }\n}\n\nmod tests {\n use crate::{\n abis::{\n function_data::FunctionData, function_selector::FunctionSelector, note_hash::NoteHash,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem\n },\n address::AztecAddress, constants::GENERATOR_INDEX__CALL_STACK_ITEM, traits::Hash\n };\n\n #[test]\n fn compute_call_stack_item_request_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.new_note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: true, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item request hash\" test\n let test_data_call_stack_item_request_hash = 0x2751111aa213d9d21279da53531bf90c2da272cf3f959e2a2a1dfceb487bf102;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_request_hash);\n }\n\n #[test]\n fn compute_call_stack_item_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.new_note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: false, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item hash\" test\n let test_data_call_stack_item_hash = 0x1860d00d9602966e398c6d585216baba2ffa8c5eddda5faee041136665d8482a;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash);\n }\n}\n" }, "161": { "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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_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 new_note_hashes: u32,\n new_nullifiers: u32,\n new_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 new_note_hashes: validate_array(public_inputs.new_note_hashes),\n new_nullifiers: validate_array(public_inputs.new_nullifiers),\n new_l2_to_l1_msgs: validate_array(public_inputs.new_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 new_note_hashes: [NoteHash; MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier; MAX_NEW_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 new_l2_to_l1_msgs: [L2ToL1Message; MAX_NEW_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.new_note_hashes == other.new_note_hashes) &\n (self.new_nullifiers == other.new_nullifiers) &\n (self.private_call_requests == other.private_call_requests) &\n (self.public_call_stack_hashes == other.public_call_stack_hashes) &\n (self.new_l2_to_l1_msgs == other.new_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.new_note_hashes.len() {\n fields.extend_from_array(self.new_note_hashes[i].serialize());\n }\n for i in 0..self.new_nullifiers.len() {\n fields.extend_from_array(self.new_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.new_l2_to_l1_msgs.len() {\n fields.extend_from_array(self.new_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 new_note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL]),\n new_nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NEW_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 new_l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_NEW_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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_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 new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_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 = 0x1970bf189adc837d1769f9f44a8b55c97d45690e7744859b71b647e808ee8622;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "163": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/global_variables.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "164": { "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};\nuse dep::std::cmp::Eq;\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" }, "167": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request_and_generator.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "168": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr", "source": "use dep::std::cmp::Eq;\nuse crate::{\n constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize},\n grumpkin_point::GrumpkinPoint\n};\n\nstruct KeyValidationRequest {\n pk_m: GrumpkinPoint,\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: GrumpkinPoint::zero(),\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.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: GrumpkinPoint::new(fields[0], fields[1]),\n sk_app: fields[2],\n }\n }\n}\n\n" }, "171": { "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" }, "180": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_selector.nr", "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\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 = dep::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" }, "181": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr", "source": "use dep::std::cmp::Eq;\nuse crate::{\n abis::{caller_context::CallerContext, side_effect::{Ordered, RangeOrdered, Scoped}},\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 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.hash == other.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 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.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 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\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" }, "186": { "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" }, "195": { "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 = 0x22786e4f971661d2e49095e6b038e5170bc47b795253916d5657c4bdd1df50bf;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "196": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/caller_context.nr", "source": "use crate::address::AztecAddress;\nuse dep::std::cmp::Eq;\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" }, "198": { "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\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" }, "201": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/append_only_tree_snapshot.nr", "source": "use dep::std::cmp::Eq;\n\nstruct 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" }, "202": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr", "source": "use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n abis::{gas_settings::GasSettings, gas::Gas}, 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 side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl CallContext {\n fn assert_is_zero(self) {\n let serialized: [Field; CALL_CONTEXT_LENGTH] = self.serialize();\n\n for i in 0..CALL_CONTEXT_LENGTH {\n assert(serialized[i] == 0);\n }\n }\n}\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 serialized.push(self.side_effect_counter 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 side_effect_counter: reader.read() as u32,\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 side_effect_counter: 0,\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 assert_is_zero() {\n let context = CallContext::empty();\n context.assert_is_zero();\n}\n\n#[test(should_fail)]\nfn not_zero_assert_is_zero() {\n let mut context = CallContext::empty();\n context.is_delegate_call = true;\n context.assert_is_zero();\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" }, "203": { "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" }, "204": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr", "source": "use crate::{\n abis::{\n call_context::CallContext, note_hash::NoteHash, nullifier::Nullifier, read_request::ReadRequest,\n gas::Gas, global_variables::GlobalVariables, log_hash::LogHash\n},\n address::AztecAddress,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL, MAX_NEW_NOTE_HASHES_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, MAX_UNENCRYPTED_LOGS_PER_CALL\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n hash::pedersen_hash, header::Header, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Hash, Serialize, Deserialize, Empty}, utils::reader::Reader\n};\n\nstruct PublicCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\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 nullifier_non_existent_read_requests: [ReadRequest; MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest; MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_note_hashes: [NoteHash; MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during public execution. Set by sequencer to be a header of a block\n // previous to the one in which the tx is included.\n historical_header: Header,\n\n // Global variables injected into this circuit\n global_variables: GlobalVariables,\n\n prover_address: AztecAddress,\n\n revert_code: u8,\n \n start_gas_left: Gas,\n end_gas_left: Gas,\n transaction_fee: Field,\n}\n\nimpl Eq for PublicCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Serialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_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 for i in 0..MAX_NOTE_HASH_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_non_existent_read_requests[i].serialize());\n }\n for i in 0..MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.l1_to_l2_msg_read_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.extend_from_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.extend_from_array(self.contract_storage_reads[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_NOTE_HASHES_PER_CALL {\n fields.extend_from_array(self.new_note_hashes[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL {\n fields.extend_from_array(self.new_nullifiers[i].serialize());\n }\n for i in 0..MAX_NEW_L2_TO_L1_MSGS_PER_CALL {\n fields.extend_from_array(self.new_l2_to_l1_msgs[i].serialize());\n }\n\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n for i in 0..MAX_UNENCRYPTED_LOGS_PER_CALL{\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.global_variables.serialize());\n fields.push(self.prover_address.to_field());\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 fields.push(self.transaction_fee);\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn deserialize(serialized: [Field; PUBLIC_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 = PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\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 nullifier_non_existent_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL]),\n l1_to_l2_msg_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL]),\n contract_storage_update_requests: reader.read_struct_array(StorageUpdateRequest::deserialize, [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL]),\n contract_storage_reads: reader.read_struct_array(StorageRead::deserialize, [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL]),\n new_nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_NEW_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 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 global_variables: reader.read_struct(GlobalVariables::deserialize),\n prover_address: reader.read_struct(AztecAddress::deserialize),\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 transaction_fee: reader.read(),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PublicCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PublicCircuitPublicInputs {\n fn empty() -> Self {\n PublicCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0 as u32,\n end_side_effect_counter: 0 as u32,\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 as u8,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0,\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PublicCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PublicCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PublicCircuitPublicInputs::empty();\n let hash = inputs.hash();\n\n // Value from public_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x01681b19fb7fe21aa9c2cf9fb47520149f46edd679b2e7c2b2c4a279fd685125;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "206": { "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" }, "21": { "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" }, "213": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils.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 for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n" }, "214": { "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" }, "215": { "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" }, "22": { "path": "std/field.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" }, "222": { "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" }, "223": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "224": { "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" }, "227": { "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 tx_tree_height: 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.tx_tree_height);\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 tx_tree_height = 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 tx_tree_height,\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 tx_tree_height: 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.tx_tree_height == other.tx_tree_height)\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" }, "228": { "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 dep::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" }, "230": { "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" }, "231": { "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 contract_class_id::ContractClassId, merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n recursion::verification_key::VerificationKey, traits::{Hash, is_empty},\n utils::{uint256::U256, field::field_from_bytes_32_trunc}\n};\nuse dep::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\npub fn compute_note_hash_nonce(first_nullifier: Field, note_hash_index: u32) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n note_hash_index as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\nfn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n note_hash\n ],\n GENERATOR_INDEX__UNIQUE_NOTE_HASH\n )\n}\n\npub fn compute_siloed_note_hash(address: AztecAddress, unique_note_hash: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\npub fn silo_note_hash(note_hash: ScopedNoteHash, first_nullifier: Field, index: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(first_nullifier, index);\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(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.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\npub fn 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 dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<N>(inputs: [Field; N]) -> Field {\n dep::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" }, "232": { "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" }, "234": { "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" }, "236": { "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" }, "238": { "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 = dep::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" }, "240": { "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" }, "252": { "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" }, "259": { "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" }, "272": { "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" }, "273": { "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, grumpkin_point::GrumpkinPoint,\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" }, "274": { "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" }, "275": { "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" }, "277": { "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" }, "278": { "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" }, "28": { "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\n pub fn hash<N>(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<N>(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" }, "280": { "path": "/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr", "source": "mod events;\n\ncontract 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\n };\n\n use crate::events::{instance_deployed::ContractInstanceDeployed};\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_new_nullifier(address.to_field(), 0);\n\n // Broadcast the event\n let event = ContractInstanceDeployed { contract_class_id, address, public_keys_hash, initialization_hash, salt, deployer, version: 1 };\n let event_payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", event_payload);\n context.emit_unencrypted_log(event_payload);\n }\n}\n" }, "285": { "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_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE\n },\n traits::Serialize\n };\n\n use crate::events::{\n class_registered::ContractClassRegistered,\n private_function_broadcasted::{ClassPrivateFunctionBroadcasted, PrivateFunction},\n unconstrained_function_broadcasted::{ClassUnconstrainedFunctionBroadcasted, UnconstrainedFunction}\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_new_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 context.emit_contract_class_unencrypted_log(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: PrivateFunction\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: function_data\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 context.emit_contract_class_unencrypted_log(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: UnconstrainedFunction\n ) {\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: function_data\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 context.emit_contract_class_unencrypted_log(event.serialize());\n }\n}\n" }, "29": { "path": "std/hash.nr", "source": "mod poseidon;\nmod mimc;\nmod poseidon2;\n\nuse crate::default::Default;\nuse crate::uint128::U128;\nuse crate::sha256::{digest, sha256_var};\nuse crate::embedded_curve_ops::EmbeddedCurvePoint;\n\n#[foreign(sha256)]\n// docs:start:sha256\npub fn sha256<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:sha256\n{}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<N>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[foreign(pedersen_commitment)]\npub fn __pedersen_commitment_with_separator<N>(input: [Field; N], separator: u32) -> [Field; 2] {}\n\npub fn pedersen_commitment_with_separator<N>(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<N>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[foreign(pedersen_hash)]\npub fn pedersen_hash_with_separator<N>(input: [Field; N], separator: u32) -> Field {}\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<N>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<N>(_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, N> 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" }, "3": { "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, N> 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<N> 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, N> 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" }, "31": { "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<N>(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" }, "44": { "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<N>(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() {\n let num = U128::from_u64s_le(0, 0);\n let not_num = num.not();\n\n let max_u64: Field = pow64 - 1;\n assert_eq(not_num.hi, max_u64);\n assert_eq(not_num.lo, max_u64);\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 #[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" }, "74": { "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 dep::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" }, "79": { "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 dep::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" }, "82": { "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" }, "85": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr", "source": "use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress, traits::Deserialize};\n\nuse crate::context::private_context::PrivateContext;\nuse crate::context::public_context::PublicContext;\nuse crate::context::gas::GasOpts;\nuse crate::context::public_context::FunctionReturns;\n\nuse crate::oracle::arguments;\n\nstruct PrivateCallInterface<T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args_hash: Field,\n}\n\nimpl<T> PrivateCallInterface<T> {\n pub fn call<N>(self, context: &mut PrivateContext) -> T where T: Deserialize<N> {\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<N>(self, context: &mut PrivateContext) -> T where T: Deserialize<N> {\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<N>(self, context: &mut PrivateContext) -> T where T: Deserialize<N> {\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\nstruct PrivateVoidCallInterface {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args_hash: Field,\n}\n\nimpl PrivateVoidCallInterface {\n pub fn call(self, context: &mut PrivateContext) {\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 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 context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true).assert_empty();\n }\n}\n\nstruct PrivateStaticCallInterface<T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args_hash: Field,\n}\n\nimpl<T> PrivateStaticCallInterface<T> {\n pub fn view<N>(self, context: &mut PrivateContext) -> T where T: Deserialize<N> {\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\nstruct PrivateStaticVoidCallInterface {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args_hash: Field,\n}\n\nimpl PrivateStaticVoidCallInterface {\n pub fn view(self, context: &mut PrivateContext) {\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n}\n\nstruct PublicCallInterface<T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n}\n\nimpl<T> PublicCallInterface<T> {\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<N>(self, context: &mut PublicContext) -> T where T: Deserialize<N> {\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<N>(self, context: &mut PublicContext) -> T where T: Deserialize<N> {\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<N>(self, context: &mut PublicContext) -> T where T: Deserialize<N> {\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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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\nstruct PublicVoidCallInterface {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n}\n\nimpl PublicVoidCallInterface {\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<N>(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<N>(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<N>(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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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\nstruct PublicStaticCallInterface<T> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n}\n\nimpl<T> PublicStaticCallInterface<T> {\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<N>(self, context: &mut PublicContext) -> T where T: Deserialize<N> {\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 enqueue_view(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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\nstruct PublicStaticVoidCallInterface {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n}\n\nimpl PublicStaticVoidCallInterface {\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<N>(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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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" }, "86": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr", "source": "use crate::encrypted_logs::{payload::compute_encrypted_note_log};\n\nuse crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message,\n hash::{hash_args_array, ArgsHasher, compute_unencrypted_log_hash},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n note::{note_interface::NoteInterface, utils::compute_note_hash_for_insertion},\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::{\n emit_encrypted_note_log, emit_encrypted_event_log, compute_encrypted_event_log,\n emit_contract_class_unencrypted_log_private_internal, emit_unencrypted_log_private_internal\n},\n logs_traits::{LensForEncryptedLog, ToBytesForUnencryptedLog},\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 hash::sha256_to_field,\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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_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 contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n grumpkin_private_key::GrumpkinPrivateKey, grumpkin_point::GrumpkinPoint, header::Header,\n messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::{is_empty, Empty},\n utils::arrays::find_index\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 new_note_hashes: BoundedVec<NoteHash, MAX_NEW_NOTE_HASHES_PER_CALL>,\n new_nullifiers: BoundedVec<Nullifier, MAX_NEW_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 new_l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_NEW_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 new_note_hashes: BoundedVec::new(),\n new_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 new_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_new_note_hash(&mut self, note_hash: Field) {\n self.new_note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n fn push_new_nullifier(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.new_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 new_note_hashes: self.new_note_hashes.storage,\n new_nullifiers: self.new_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 new_l2_to_l1_msgs: self.new_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.new_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_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n // TODO: We might want to remove this since emitting unencrypted logs from private functions is violating privacy.\n // --> might be a better approach to force devs to make a public function call that emits the log if needed then\n // it would be less easy to accidentally leak information.\n // If we decide to keep this function around would make sense to wait for traits and then merge it with emit_unencrypted_log.\n pub fn emit_unencrypted_log<T, N, M>(\n &mut self,\n log: T\n ) where T: ToBytesForUnencryptedLog<N, M> {\n let event_selector = 5; // TODO: compute actual event selector.\n let contract_address = self.this_address();\n let counter = self.next_counter();\n let log_slice = log.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n // 44 = addr (32) + selector (4) + raw log len (4) + processed log len (4)\n let len = 44 + log_slice.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n self.unencrypted_logs_hashes.push(side_effect);\n // call oracle\n let _void = emit_unencrypted_log_private_internal(contract_address, event_selector, log, counter);\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 pub fn emit_contract_class_unencrypted_log<N>(&mut self, log: [Field; N]) {\n let event_selector = 5; // TODO: compute actual event selector.\n let contract_address = self.this_address();\n let counter = self.next_counter();\n let log_hash = emit_contract_class_unencrypted_log_private_internal(contract_address, event_selector, log, counter);\n // 44 = addr (32) + selector (4) + raw log len (4) + processed log len (4)\n let len = 44 + N * 32;\n let side_effect = LogHash { value: log_hash, counter, length: len };\n self.unencrypted_logs_hashes.push(side_effect);\n }\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 encrypt_and_emit_event<N, M>(\n &mut self,\n randomness: Field, // Secret random value used later for masked_contract_address\n event_type_id: Field,\n ovpk_m: GrumpkinPoint,\n ivpk_m: GrumpkinPoint,\n preimage: [Field; N]\n ) where [Field; N]: LensForEncryptedLog<N, M> {\n let ovsk_app = self.request_ovsk_app(ovpk_m.hash());\n let contract_address = self.this_address();\n\n // We are currently just encrypting it unconstrained, but otherwise the same way as if it was a note.\n let encrypted_log: [u8; M] = compute_encrypted_event_log(\n contract_address,\n randomness,\n event_type_id,\n ovsk_app,\n ovpk_m,\n ivpk_m,\n preimage\n );\n\n self.emit_raw_event_log_with_masked_address(randomness, encrypted_log);\n }\n\n pub fn emit_raw_event_log_with_masked_address<M>(\n &mut self,\n randomness: Field,\n encrypted_log: [u8; M]\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = encrypted_log.len() as Field + 4;\n let log_hash = sha256_to_field(encrypted_log);\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, encrypted_log, counter);\n }\n\n pub fn emit_raw_note_log<M>(&mut self, note_hash_counter: u32, encrypted_log: [u8; M]) {\n let counter = self.next_counter();\n let len = encrypted_log.len() as Field + 4;\n let log_hash = sha256_to_field(encrypted_log);\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, encrypted_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.call_context.side_effect_counter, start_side_effect_counter);\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 { hash: item.hash(), caller_context, start_side_effect_counter, end_side_effect_counter }\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.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.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.call_context.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 new_note_hashes: BoundedVec::new(),\n new_nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n new_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" }, "88": { "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::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 storage_address(self) -> AztecAddress {\n storage_address()\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 * Emit a log with the given event selector and message.\n *\n * @param event_selector The event selector for the log.\n * @param message The message to emit in the log.\n */\n pub fn emit_unencrypted_log_with_selector<T, N>(\n &mut self,\n event_selector: Field,\n log: T\n ) where T: Serialize<N> {\n emit_unencrypted_log(event_selector, Serialize::serialize(log).as_slice());\n }\n // For compatibility with the selector-less API. We'll probably rename the above one.\n pub fn emit_unencrypted_log<T, N>(&mut self, log: T) where T: Serialize<N> {\n self.emit_unencrypted_log_with_selector(/*event_selector=*/ 5, log);\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 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 block_number(self) -> Field {\n block_number()\n }\n\n fn timestamp(self) -> u64 {\n timestamp()\n }\n\n fn transaction_fee(self) -> Field {\n transaction_fee()\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_new_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 temporary_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 temporary_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 temporary_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 temporary_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_new_note_hash(&mut self, note_hash: Field) {\n emit_note_hash(note_hash);\n }\n fn push_new_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 fn msg_sender(self) -> AztecAddress {\n sender()\n }\n fn this_address(self) -> AztecAddress {\n address()\n }\n fn chain_id(self) -> Field {\n chain_id()\n }\n fn version(self) -> Field {\n version()\n }\n fn selector(self) -> FunctionSelector {\n FunctionSelector::from_field(self.inputs.selector)\n }\n fn get_args_hash(self) -> Field {\n self.inputs.args_hash\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\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 let MAX_POSSIBLE_FIELD: Field = 0 - 1;\n [\n user_gas.l2_gas.unwrap_or(MAX_POSSIBLE_FIELD),\n user_gas.da_gas.unwrap_or(MAX_POSSIBLE_FIELD)\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 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 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 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(event_selector: Field, message: [Field]) {\n emit_unencrypted_log_opcode(event_selector, 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\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(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\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(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(amvOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(event_selector: Field, 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\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.30.0+48d9df4ff227c08a6e66f21c0286bc6349151671", "name": "GasToken", "functions": [{ "name": "claim_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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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pnfyTe/km97JN72Lb3oX3/QuvuldfNO7+KZ38U3v4pvexTe9i296F930nhvd9J4b3fSeG930nhvd9J4b3fSeG930nhvd9J4b3fSeG930nhvf9Da+6W1809v4prfxTW/jm97GN72Nb3ob3/Q2vultfNPb+aa3801v55vezje9nW96O9/0dr7p7XzT2/mmt/NN7+Cb3sE3vYNvegff9A6+6R180zv4pnfwTe/gm97BN735vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPazn5vJaTz2s5+byWk89rOfm8lpPPa5l8Xsvk81omn9cy+byWudFN7+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rmXxey+TzWiaf1zL5vJbJ57VMPq9l8nktk89rWXxey+LzWhaf17L4vJa10U3v4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZfF7L4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZfF7L4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZfF7L4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZfF7L4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZfF7L4vNaFp/Xsvi8lsXntSw+r2XxeS2Lz2tZ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qwN99fHpdPWoG/yhDX9qw09t+CUN/ytRpgp804bv2vBDG37Thq+9daf21p3aW3dqb92pvXXzAVv3NWH0I00XuutCD13oTRd614U+dKFPXeipC71koZfuNi3dbVq627R0t2npbtPS3aalu01Ld5uW7jYt2W06N9ltOjfZbTo32W06N9ltOjfZbTo32W06N9ltOjfZbTo32W06N91tarrb1HS3qeluU9Pdpqa7TU13m5ruNjXdbWq629R0t6nrblPX3aauu01dd5u67jZ13W3qutvUdbep625T192mobtNQ3ebhu42Dd1tGrrbNHS3aehu09DdpqG7TUN3mzbdbdp0t2nT3aZNd5s23W3adLdp092mTXebNt1t2nS3adfdpl13m3bdbdp1t2nX3aZdd5t23W3adbdp192mXXebDt1tOnS36dDdpkN3mw7dbTp0t+nQ3aZDd5sO3W06dLfp1N2mU3ebTt1tOnW36SMykl4FXXebTt1tOnW36dTdplN3m+pmIU3dLKSpm4U0dbOQpm4W0tTNQpq6WUhTNwtp6mYhTd0spKmbhTR1s5CmbhbS1M1CmrpZSFM3C2nqZiFN3SykqZuFNHWzkFI3Cyl1s5BSNwspdbOQcpPdpqmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFlLpZSKmbhZS6WUipm4WUullIqZuFVLpZSKWbhVS6WUilm4VUm+w2Ld0spNLNQirdLKTSzUIq3Syk0s1CKt0spNLNQirdLKTSzUIq3Syk0s1CKt0spNLNQirdLKTSzUIq3Syk0s1CKt0spNLNQirdLKTSzUIq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" }, { "name": "mint_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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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" }, { "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": "tx_tree_height", "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": 32, "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": 32, "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" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint" } }, { "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": "new_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": "new_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": "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": "new_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": "tx_tree_height", "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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T93k+6mbfD91k++nbvL91NXJ5tl3fN9P3eT7qZt8P3WT76du8v3Uzb6futn3Uzf7fupm309dnWyefcf3/dTNvp+62fdTN/t+6mbfT93i+6lbfD91i++nbvH91NVJRtp3fN9P3eL7qVt8P3WL76du8f3UFd9PXfH91BXfT13x/dTVyaXad3zfT13x/dQV309d8f3UFd9P3er7qVt9P3Wr76du9f3U1cml2nd830/d6vupW30/davvp271/dRtvp+6zfdTt/l+6jbfT12dbKl9x/f91G2+n7rN91O3+X7qNt9P3e77qdt9P3W776du9/3U1cl72nd830/d7vup230/dbvvp273/dT1nU0lvrOpxHc2lfjOphLf2VTiO5tKfGdTie9sKvGdTSW+s6nEdzaV+M6mEt/ZVOI7m0p8Z1OJ72wq8Z1NJb6zqcR3NpX4zqaqvrOpqu9squo7m6r6zqaqD9dP3eo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpqu9squo7m6r6zqaqvrOpmu9squY7m6r5zqZqvrOp2sP1U7f5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squY7m6r5zqZqvrOpmu9squ47m6r7zqbqvrOpuu9sqv5w/dTtvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m6r7zqbqvrOpuu9squ47m2r4zqYavrOphu9squE7m2o8XD91h+9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqYavrOphu9squE7m2r4zqaavrOppu9squk7m2r6zqaaD9dP3ek7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOppu9squk7m2r6zqaavrOpnud0/dj9+zmdn9/1g/d5TtdP3uc5XT96n+d0/ex9ntP1w/d5TtdP3+c5XT9+n+d0/vz1HVP1PL/z56/voKrn+Z0/f31HVT3P7/z56zus6nl+589f33FVz/M7f/76Dqx6nt/589d3ZNXz/M6fv75Dq57nd/789R1b9Ty/8+ev7+Cq5/mdP399R1c9z+/8+es7vOp5fufPX9/xVc/zO3/++g6wep7f+fPXd4TV8/zOn7++Q6yeh3P+/PUdY/U8nPPnr+8gq+fhnD9/fUdZPQ/n/PnrO8zqeTjnz1/fcVbP8zt//voOtHqe3/nz13ek1fP8zp+/vkOtnud3/vz1HWv1PL/z56/vYKvn+Z0/f31HWz3P7/z56zvc6nl+589f3/FWz/M7f/76Drh6nt/589d3xNXz/M6fv75Drp7nd/789R1z9Ty/8+ev76Cr5/mdP399R109z+/8+es77Op5fufPX99xV8/zO3/++g68ep7f+fPXd+TV8/zOn7++Q6+e53f+/PUde/U8v/Pnr+/gq+f5nT9/fUdfPc/v/PnrO/zqeX7nz1/f8VfP8/t+/ibn+VfJef5Vcp5/lZznXz1P5/z8vp+/yXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wd519l5/lX2Xn+VXaef5Ufvp+/2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd518V5/lXxXn+VXGef1Wc51+Vh+/nb3Gef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lXxXn+VXGef1Wc518V5/lX4jz/SpznX4nz/Ctxnn8lD9/PX3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfifP8K3GefyXO86/Eef6VOM+/Euf5V+I8/0qc51+J8/wrcZ5/Jc7zr8R5/pU4z78S5/lX4jz/SpznX4nz/Ctxnn8lzvOvxHn+lTjPvxLn+VfiPP9KnOdfVef5V9V5/lV1nn9Vnedf1Yfv5291nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V9V5/lV1nn9VnedfVef5V815/lVznn/VnOdfNef5V+3h+/nbnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lVznn/VnOdfNef5V815/lV3nn/Vnedfdef5V915/lV/+H7+duf5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn/Vnedfdef5V915/lV3nn81nOdfDef5V8N5/tVwnn81Hr6fv8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfDef5V8N5/tVwnn81nOdfTef5V9N5/tV0nn81nedfzYfv5+90nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTef5V9N5/tV0nn81nedfTd/5V/nhO//qeX7Xz9/n+V0/f5/nd/38fZ7f9fP3eX7Xz9/n+V0/f5/nd/38fZ7f9fP3eX7nz1/f+VfP8zt//vrOv3qe3/nz13f+1fP8zp+/vvOvnud3/vz1nX/1PL/z56/v/Kvn+Z0/f33nXz3P7/z56zv/6nl+589f3/lXz/M7f/76zr96nt/589d3/tXzOzh//vrOv3p+B+fPX9/5V8/v4Pz56zv/6vkdnD9/fedfPb+D8+ev7/yr5/mdP3995189z+/8+es7/+p5fufPX9/5V8/zO3/++s6/ep7f+fPXd/7V8/zOn7++86+e53f+/PWdf/U8v/Pnr+/8q+f5nT9/fedfPc/v/PnrO//qeX7nz1/f+VfP8zt//vrOv3qe3/nz13f+1fP8zp+/vvOvnud3/vz1nX/1PL/z56/v/Kvn+Z0/f33nXz3P7/z56zv/6nl+589f3/lXz/M7f/76zr96nt/589d3/tXz/M6fv77zr57nd/789Z1/9Ty/8+ev7/yr5/mdP3995189z+/8+es7/+p5fufPX9/5V8/zO3/++s6/ep7f+fPXd/7V8/y+n7/Jef5Vcp5/lZznXyXn+VfP0zk/v+/nb3Kef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc518l5/lXyXn+VXKef5Wc519l5/lX2Xn+VXaef5Wd51/lh+/nb3aef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+VXaef5Wd519l5/lX2Xn+Vbadv1Ql//HZKifnN33/L5zf9P1T63idv/X35zd9/yyc3/T9s3B+0/fPwvlN6//r89vO/1k4v+n7v6X2x2dbye/Pb/r+Xzi/af2/cH5xfn7Tz9+F85t+/i6c3/Tzd+H8pp+/C+c3/fy9Pr/t/J+F8zt//trO/1k4v/Pnr+38n4XzO3/+2s7/WTi/8+ev7fyfhfP//PP3dCb458+OPl/nGCPJxzna+K1p44a0oJ3VJqhqM1S1xWu1RwXivoLqvoLmvoLuvoLhvgK3GuJVQXerC44K3D7rjwrcPr+PCmw/k0d/vD48LxXI0xi/jtHTWwWyIfloZ7W2n/Xfqlb3Lzi6bQ2xk4xtbbKTjG3Ns5OMbS21kcywrdF2krGt/XaSsa0pd5IJpFWVyQjJnJChBj4jQw18RoYa+IwMNfAZGWrgEzKTGviMDDXwGRlq4DMy1MBnZIRkTshQA5+RoQY+I0MNfEaGGviMDDXwezLlQQ18RoYa+IwMNfAZGWrgMzJCMidkqIHPyFADn5GhBj4jQw18RoYa+IRMogY+I0MNfEaGGviMDDXwGRkhmRMy1MBnZKiBz8hQA5+RoQY+I0MNfEImg+qZy0zHkkH1zAIZ0GfTZQ5fyaDPpgUyoM+mBTKgz6ZrMgV0PrNABnQ+s0AGVM9cZhSVAqpnFsgIyZyQAZ3PLJAB1cALZEA18AIZUA28QAZUA1+TEVANvEAGVAMvkKEGPiNDDXxGRgKR+cZXTqPJq8Lnd/n4dHr36cuEoyKRFPNOjpH09U6OkdT4To6RtLsSx4NNJPWuzKZG0u/abCIpeG02kTS8NptIKl6bjZDNKRtq83M2qHp7ttdXTrOXX9i8qTC3cVQ4xnuSqIpbnySq5v4myaNAqW+9i/HtNG44Gt9744cjqu7X5ojqEbQ5ovoJbY5CjiocUX3K9zhezmyN72XywxHU0TzP9voVa358PvNvOxrjW6o8kQT1NN8lefWsMb6zyw9HUE+jzhHU06hzBPU06hyFHFU4gnoadY6gnuabHC89Taitcjs5ojqalA40KQ8FRxNqZ91WkqF23N1I8upZE2oj3k6OqJ5GmyOqp9HmKOSowhHV02hzRPU02hxRPc33OF56mlA7BXdyhP0dzWgfHOcFxz6Pr/z4+Gx6epsXx1D7CndyhP0djTJHWD/T0sGxi8KkItTuxL0khSRXSF5pyFCbGXdyhPU0yhxhPY0yR1hPo8wR9rc0qhwl1P7JnRxhf0fzLY5XswoJtdtyJ0c6mpxGfudR5CFkc8qGvuOcDaqXeE6rjjPnevmsvJwSSKj9mXtJovqJb5K81G+ofkKZY6hdnjs5ovoJbY6ofkKbI6qf0OYo5KjCEdWnfI/j5Zwg1H7TnRzpaJ7/0Za3HiXUPlRtNvQdp2wyrJf47PvT5bPyekqQYd2EOklYP/E9klf6LdRW350chRxVOML6CWWOsH5CmSOsn1DmCOs9lDnC+pRvcbycE4Tapb2TIx2NDkf6GR2O9DM6HIUcVTjSz+hwpJ/R4Ug/czpTDLWPXJsNfccpm1A7yU+/8lEthOI/qrWty+eRXjjmp6/829XaVs/a1Uqcaq8nR8Y3cWtXa1svaldrW9VpV2tbp2lXa1t5KVdrfD/096q9dGPGNz5rVxtISy1UG0hLLVQrUNVG0lLX1RrXUuPD8c3yl12B8X3F2tUa11LfqXZBXRjXUrrVGt/Pq12tcS2lXK1xLaVcrXEtpVytBKr2Ul0Y3+6qXW0gLbVQbSAttVBtJC11XW0kLXVZre29oPMhr688H7X9ZVdge3unerWmtdT3qr1WF7Y3YapXK1DVmtZS6tWa1lLq1ZrWUurVmtZS36z2Wl2Y1lLa1dreR6hebSAttVBtJC11XW0kLXVdrbiptv3q+I4K/Oijswr8aJ6zCozrmPk6x3we5C97S9u709SrNa5jvlPttUa1vYdMvVrjOka5WuM6Rrla4zpGuVqBqta45vlWtZca1faeKfVqA2mphWoDaamFaiNpqatqq+39R+rVRtJS19U60lLznWettrf4LFUgpitI8lHBp7ds3//EjfyKLB2fzpxT+qjWtubRrta25vlWtX0cf7qe8sVXvpxHVNv7bbaSsa2ldpKxrbs2krG9U2YrGdt6bicZ29pvJxnbmnInGSGZEzKBdK0yGWrgMzLUwGdkqIHPyFADn5CxvQtlKxlq4DMy1MBnZKiBz8gIyZyQoQY+I0MNfEaGGviMDDXwGRlq4BMytndnbCVDDXxGhhr4jAw18BkZIZkTMqB6psrrbyGqnJAB1TPXZGzntt9Ipr4C/Gvr78mAPpsWyIA+mxbIgD6bFsiAzmcWyIDOZxbIgOqZltofn20lvycDqmcWyIDOZ67J2M7Q30oGVAMvkAHVwAtkQDXwAhkhmRMyoBp4gQyoBl4gQw18RoYa+IwMNfAJGdu7D75J5htfuffX27j9l22lH28L2t6TsJVMJA2sSyaSBtYlIyRzQiaSBtYlE0kD65KJpIF/j8xs78lE0sC6ZCJpYFUyxndW3EbmU2JGqe/JgGrgBTKgGniBDKgGXiAjJHNCBlQDL5AB1cALZEA18HXOlfGdIDvJgGrgazLGd40okTmqhdC1R7W2tWrOrw/PUuZFtekx5HXqZwUfn+6ffpZtK1D9egWsXttqUb9e2xpQv17byk6/Xtt6Tb9e2ypMvV7j+0/067WtrvTrBdNXxreg6NcrYPWC6Svju1D06wXTV8b3oejXi6WvmvGdKPr1YumrZnwvin69WPqqPQSsXix91YzvXdGvF0tfNeM7UvTrBdNXxveZ6NcLpq+M7x7RrxdMXxnfE6JfL5i+Mr7TQ79eMH1lfP+Gfr1g+sr4rgz9esH0lfG9Fvr1gukr4zso9OsF01fG90Xo1wumr4zvdtCvF0xfGd/DoF8vmL4yvjNBv14wfWV8v4F+vWD6qoDpK+NbKfTrBdNXBUxfCZi+Mr4hRL9eMH1lfJuHfr0CVi+YvjK+T0O/XjB9ZXz3hX69YPrK+J4K/XrB9JXxnRL69YLpK+P7H/TrBdNXxnc16NcLpq+M71XQrxdMXxnfgaBfL5i+Mr6vQL9eMH1lfLeAfr1g+sr4HgD9esH0lfHMfv16wfSV8Xx9/XrB9JXxLHz9esH0lfHcev16wfSV8Yx5/XrB9JXxPHj9esH0lfHsdv16wfQVWH57A8tvb2D57Q0sv72B5bc3sPz2Bpbf3sDy2xtYfnsDy29vYPntDSy/vYHltzew/PYGlt/ewPLbG1h+ewPLb+9g+e0dLL+9g+W3d7D89v4QsHqx9FUHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bd3sPz2Dpbf3sHy2ztYfnsHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bd3sPz2Dpbf3sHy2ztYfnsHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bd3sPz2Dpbf3sHy2ztYfnsHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bd3sPz2DpbfPsDy2wdYfvsAy28fYPnt4yFg9WLpqwGW3z7A8tsHWH77AMtvH2D57QMsv32A5bcPsPz2AZbfPsDy2wdYfvsAy28fYPntAyy/fYDltw+w/PYBlt8+wPLbB1h++wDLbx9g+e0DLL99gOW3D7D89gGW3z7A8tsHWH77AMtvH2D57QMsv32A5bcPsPz2AZbfPsDy2wdYfvsAy28fYPntAyy/fYDltw+w/PYBlt8+wPLbB1h++wDLbx9g+e0DLL99gOW3D7D89gGW3z7A8tsHWH77AMtvH2D57SNSvvfs+fXh/utXPqoN9PRdqDbQ3TzHeH149vfVBrqZF6oNdC8vVBvoVl6oNpDnva42UuLzQrWRnrfX1UZ63l5XG8jrLlQrUNVCaalIKc8L1brVUkcFbvXRUYFtzVP68UMk86Hgu43nMOvXa1v36NdrW/no12tb++jXK2D12tY/+vXaVkD69drWQPr12lZM+vWC6SvjOcz69YLpK+M5zPr1gukr4znM+vWC6SvjOcz69YLpK+M5zPr1YumraTyHWb9eLH01jecw69eLpa/mQ8DqxdJX03gOs369WPpqGs9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXzUwfWU8Z1u/XjB91cD0VROwesH0lfE0df16wfSV8UR1/XrB9JXxVHX9esH0lfFkdf16wfSV8XR1/XrB9JXxhHX9esH0lfFEdv16wfQVWH77BMtvn2D57RMsv32C5bdPsPz2CZbfPsHy2ydYfvsEy2+fYPntEyy/fYLlt0+w/PYJlt8+wfLbJ1h++wTLb59g+e0TK7+9PLDy25/1QumrZ71Q+upZL5S+etYrYPVC6atnvVD66lkvlL561gulr571gukrrPz2Z71g+gorv/1ZL5i+wspvf9YLpq+w8tuf9YLpK6z89me9YPoKK7/9WS+YvsLKb3/WC6avsPLbn/WC6Sus/PZnvWD6Ciu//VkvmL7Cym9/1gumr7Dy25/1gukrrPz2Z71g+gorv/1ZL5i+wspvf9YLpq+w8tuf9YLpK6z89me9YPoKK7/9WS+YvsLKb3/WC6avsPLbn/WC6Sus/PZnvWD6Ciu//VkvmL7Cym9/1gumr7Dy25/1gukrrPz2Z71g+gorv/1ZL5i+wspvf9YLpq+w8tuf9YLpK6z89me9YPoKK7/9WS+YvsLKb3/WC6avsPLbn/WC6Sus/PZnvWD6Ciu//VkvmL7Cym9/1gumr7Dy25/1gukrrPz2Z71g+gorv/1ZL5i+wspvf9YLpq+w8tuf9YLpK6z89me9YPoKK7/9WS+YvsLKb3/WC6avsPLbn/WC6Sus/PZnvVj6KoHltyew/PYElt+ewPLbn9WA1YulrxJYfnsCy29PYPntCSy/PYHltyew/PYElt+ewPLbE1h+ewLLb09g+e0JLL89geW3J7D89gSW357A8tsTWH57AstvT2D57Qksvz2B5bcnsPz2BJbfnsDy2xNYfnsCy29PYPntCSy/PYHltyew/PYElt+ewPLbE1h+ewLLb09g+e0JLL89geW3J7D89gSW357A8tsTWH57AstvT2D57Qksvz2B5bcnsPz2BJbfnsDy2xNYfnsCy29PYPntKVK+9+z59eH+61d+VRsp3Xuh2kB38xzHh2d/X22gm3mh2kD38kK1gW7lhWoDed6FagM53oVqIz1vL6uNlPa8UG0gr7tQbSCnu1AtlJaKlPK8UK1bLXVU4FYfHRXY1jxVXk56tjmufHd9HeM5Lnr/E2db82hXa1vzKFdrPIFZu1rbmke7WtuaR7ta25pHu1qBqta25tGu1rY+0q4WSksZT1zWrhZKSxlPW9auFkpLGU9a1q4WSksZT1nWrhZKSxlPWNauFkpLGU9X1q4WSUtl48nK2tUiaalsPFVZu1okLZUfAlUtkpbKxtOUtatF0lLZeJKydrVQWsp4irJ2tVBayniCsna1UFrKeHqydrVQWsp4crJ2tVBaynhqsna1UFrKeGKydrVQWsp4WrJ2tVBaynhSsna1UFrKeEqydrVQWsp4QrJ2tVBayng6sna1UFrKeDKydrVQWsp4KrJ2tVBayngisna1UFrKeBqydrVQWsp4ErJ2tVBayngKsna1UFrKeAKydrVQWsp4+rF2tVBaynjysXa1UFrKeOqxdrVQWsp44rF2tVBaynjasXa1UFrKeNKxdrVQWqpCaSnjGdbK1RrPsNauFkpLNSgtZTyfXLtagaoWSksZzyfXrhZKSxnPJ9euFkpLGc8n164WSksZzyfXrhZKSxnPJ9euFkpLGc8y164WSktB5Z5nqNzzDJV7nqFyzzNU7nmGyj3PULnnGSr3PEPlnmeo3PMMlXueoXLPM1TueYbKPc9QuecZKvc8Q+WeZ6jc8wyVe56hcs8zVO55hso9L1C55wUq97xA5Z4XqNzz8hCoapG0VIHKPS9QuecFKve8QOWeF6jc8wKVe16gcs8LVO55gco9L1C55wUq97xA5Z4XqNzzApV7XqByzwtU7nmByj0vULnnBSr3vEDlnheo3PMClXteoHLPC1TueYHKPS9QuecFKve8QOWeF6jc8wKVe16gcs8LVO55gco9L1C55wUq97xA5Z4XqNzzApV7XqByzwtU7nmByj0vULnnBSr3vEDlnheo3PMClXteoHLPC1TueYHKPS9QuecFKve8QOWeF6jc8wKVe16gcs8LVO55gco9L1C55wUq97xA5Z4XqNzzApV7XqByzwtU7nmByj0vULnnBSr3vEDlnheo3PMClXteoHLPC1TueYHKPS9QuecFKve8QOWeF6jc8wKVe16gcs8LVO55gco9L1C55wUq97xA5Z4XqNzzApV7XqByzwtU7nmByj0vULnnBSr3vEDlnheo3PMClXsuULnnApV7LlC55wKVey4PgaoWSUsJVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z4LVO65QOWeC1TuuUDlngtU7rlA5Z5LpLTo2fPrw728rzbQE+i62kiJwnOM14dnf19toFtqodpAt9RCtQJVbSDHt1BtIMe3UG2k5+11tZGet9fVBnJ819VGShReqBZKS0VKFF6o1q2WOioQ9xXY1jw9z1cFI/cr1/2Y7XXqlD6dutWPem2rHv16bese/XptKx/9em1rH/V6jWcA69drW//o12tbAenXa1sD6dcrYPWC6SvjecD69YLpK+OZwPr1gukr47nA+vWC6Svj2cD69YLpK+P5wPr1gukr4xnB+vWC6SvjOcH69WLpq2o8K1i/Xix9VY3nBevXi6Wv6kPA6sXSV9V4brB+vVj6qhrPDtavF0xfGc8P1q8XTF8ZzxDWrxdMXxnPEdavF0xfGc8S1q8XTF8ZzxPWrxdMXxnPFNavF0xfGc8V1q8XTF8ZzxbWrxdMXxnPF9avF0xfGc8Y1q8XTF8ZzxnWrxdMXxnPGtavF0xfGc8b1q8XTF8ZzxzWrxdMXxnPHdavF0xfGc8e1q8XTF8Zzx/WrxdMXxnPINavF0xfGc8h1q8XTF8ZzyLWrxdMXxnPI9avF0xfGc8k1q8XTF9VAasXTF9VMH1lPGdbv14wfVXB9FUD01fGs9T16wXTV8bz1PXrFbB6wfSV8VR1/XrB9JXxZHX9esH0lfF0df16wfSV8YR1/XrB9JXxRHb9esH0FVh+ewXLb69g+e0VLL+9guW3V7D89gqW317B8tsrWH57Bctvr2D57RUsv72C5bdXsPz2CpbfXsHy2ytYfnsFy2+vYPntFSy/vYLlt1ew/PYKlt9ewfLbG1h+ewPLb29g+e0NLL+9PQSsXix91cDy2xtYfnsDy29vYPntDSy/vYHltzew/PYGlt/ewPLbG1h+ewPLb29g+e0NLL+9geW3N7D89gaW397A8tsbWH57A8tvb5HyvZ+ffn24//qVj2oDPX2vq42U/TzHeH149vfVBrqZF6oNdC8vVBvoVl6oNpDnXag2kONdqDbS8/a62kjP2+tqA3nd62ojJT0vVAulpSKlPC9U61ZLHRWI+wpsa55R+/FDVNuV75Z8+G4p9ePTfX7Ua1v16NdrW/fo12tb+ejXa1v7qNdrPIdZv17b+ke/XtsKSL9e2xpIv14BqxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0xfGc9h1q8XTF8Zz2HWrxdMXxnPYdavF0tfdeM5zPr1YumrbjyHWb9eLH3VHwJWL5a+6sZzmPXrxdJX3XgOs369YPrKeA6zfr1g+sp4DrN+vWD6yngOs369YPrKeA6zfr1g+sp4DrN+vWD6yngOs369YPrKeA6zfr1g+sp4DrN+vWD6KoPpK+M52/r1gumrDKavCpi+Mp6lrl8vmL4ynqeuX6+A1Qumr4ynquvXC6avjCer69cLpq+Mp6vr1wumr4wnrOvXC6avjCey69cLpq/A8ts7WH57B8tv72D57R0sv72D5bd3sPz2Dpbf3sHy2ztYfnsHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bd3sPz2Dpbf3sHy2ztYfnsHy2/vYPntHSy/vYPlt3ew/PYOlt/ewfLbO1h+ewfLb+9g+e0dLL+9g+W3d7D89g6W397B8ts7WH57B8tv72D57R0sv72D5bcPsPz2AZbfPsDy2wdYfvt4CFi9WPpqgOW3D7D89gGW3z7A8tsHWH77AMtvH2D57QMsv32A5bcPsPz2AZbfPsDy2wdYfvsAy28fYPntAyy/fYDltw+w/PYBlt8+wPLbB1h++wDLbx9g+e0DLL99gOW3D7D89gGW3z7A8tsHWH77AMtvH2D57QMsv32A5bcPsPz2AZbfPsDy2wdYfvsAy28fYPntAyy/fYDltw+w/PYBlt8+wPLbB1h++wDLbx9g+e0DLL99gOW3D7D89gGW3z7A8tsHWH77iJTvPXt+fbj/+pWPagM9fReqDXQ3zzGOD/f31Qa6mReqDXQvL1Qb6FZeqDaQ572uNlLi80K1kZ6319VGet5eVxvI6y5UK1DVQmmpSCnPC9W61VJHBW710VGBbc0zj6+cHimnix+5ll6+u5X89kfOeAyzerm2VY96ubZlj3q5tnWPermCVa5t5aNerm3po16ube2jXq5toaReLpaqMh6+rF4ulqoyHr2sXi6WqjIevKxeLpaqMh67rF4ulqoyHrqsXi6UqprGI5fVy4VSVdN44LJ6uVCqaj4Eq1woVTWNhy2rlwulqqbxqGX1crFUlfGgZfVysVSV8Zhl9XKxVJXxkGX1crFUlfGIZfVysVSV8YBl9XKxVJXxeGX1crFUlfFwZfVysVSV8Whl9XKxVJXxYGX1crFUlfFYZfVysVSV8VBl9XKxVJXxSGX1crFUlfFAZfVysVSV8Thl9XKxVJXxMGX1crFUlfEoZfVysVSV8SBl9XKxVJXxGGX1crFUlfEQZfVysVSV8Qhl9XKxVJXxAGX1crFUlfH4ZPVysVSV8fBk9XKxVJXx6GT1crFUlfHgZPVysVRVw1JVxlOx1cvFUlUNS1U1wSoXS1UZjz1XLxdLVRkPPlcvF0tVGY8+Vy8XS1UZDz9XLxdLVRmPP1cvF0tVGQ9AVy8XS1UZj0tXLxdLVWFlq0+sbPWJla0+sbLVJ1a2+sTKVp9Y2eoTK1t9YmWrT6xs9YmVrT6xstUnVrb6xMpWn1jZ6hMrW31iZatPqGx1eYRK377aWf4sN9Jzd6HcSDfz1abNZ7mRbuaFciPdzAvlRrqZF8qN5HcXyo3kd6/LDZXPvFBuqOfudbmR/O5CuZH87kK5glUulqpynM98lOBXKR0lmFY/z3O3j4PknC9+6s6/9lGvafmjX6/tJOUb6jUtgG6o17QCuqFe0xLohnoFrF7TIuiGek2roBvqNS2ZbqgXTF/ZjlTWr9d2pvIN9YLpK9upyjfUC6avbOcq31AvmL6ynax8Q71g+sp2tvIN9YLpK9vpyjfUC6avbOcr31AvmL6ynbB8Q71g+sp2xvIN9YLpK9spyzfUC6avbOcs31AvmL6ynbR8Q71g+sp21vIN9YLpK9tpyzfUC6avbOct31AvmL6ynbh8Q71g+sp25vIN9YLpK9upyzfUC6avbOcu31AvmL6ynbx8Q71g+sp29vIN9YLpK9vpyzfUC6avbOcv31AvmL6yncB8Q71g+sp2BvMN9YLpK9spzDfUC6avbOcw31AvmL6yncR8Q71g+sp2FvMN9YLpK9tpzDfUC6avbOcx31AvmL6ynch8Q71g+sp2JvMN9YLpK9upzDfUC6avJpi+mlj6KtnO3b6hXix99fwiYPWGeh5VeSWrVzmpN9Tz6Lpe23nF3663vlJAa+vv6w11Xy3UG+q+Wqg3lB9cqFfA6g3lBxfqDfX8vdxbk2xHHN9Qbyg/uFBvKD94XW+sPOSFekPpq4V6Q+mrhXpD6auFegWs3lD6aqFeMH0VKw95oV7H+uqowbFmetVgPbc4t/5Rw3hc/Nxdz02t5xar12tcB32v3pyPg0h9X69xHaRer4DVa1wHqddrXAep12tcB6nXa1wHfbPeWl8H6el9vcY1k3a91nOL1esNpa8W6o2lr67rjaWvrusVsHpj6avreo3rq5LKp4OUi3qf9uc1eHkq5U8nebr/o2LjCuuGio1rrBsqNq6y9Cu2nl98Q8XGldYNFRvXWjdUbFxt3VCxwFVsXHHdUDGc5rKeZnxDxXCay3qisX7F1jONb6gYTnNZzzW+oWI4zWU92/iGiuE0l/V84xsqhtNc1jOOb6gYTnNZzzm+oWI4zWU96/iGiuE0l/W84xsqhtNc1jOPb6gYTnNZzz2+oWI4zWU9+/iGiuE0l/X84xsqhtNc1jOQb6gYTnNZz0G+oWI4zWU9C/mGiuE0l/U85BsqhtNc1jNzv1fx7K9Mt9l//dpHvaGexgv1hrqn53hlQs35PhPKeqaqcr3Zeqaqer2hbuiFekN54oV6QznihXpjPX+v6431/L2uN5QXXqg3lBNeqBdLX+UHmL6yngH9Vb1HDY4101GDcR0kTT4O0vvFz91lZlC2ntWsXq+A1WtcB32v3suMlWw9q1m9XuM6SL1e4zpIvV7jOki7XutZzer1GtdM6vWG0leXmSPZelazer0CVm8sfXVdbyx9dV1vLH11XW8sfXVdryd9NeTtzMJ6rvNSDZ500FkNxrVNzR/zr1raX54tWM9fVq9XItV7rdWt5y+r12tc26jXa1zbqNdrXNuo12tc22jXaz1/+Zv1XmpX6/nL6vWG0lcL9YbSVwv1Cli9sfTVdb2x9NV1vZ70lbz/ewjrecpLNXjSQSc1WM88rqMeB2nz6u+hRpXH64vX2j6dpH1UbF3d6FdsXd/oV2xd4ehXLHAVW1c5+hVb1zn6FVtXOvoVW9dF+hVbV1HqFVvPPL6hYjjNZT3z+IaK4TSX9czjGyqG01zWM49vqBhOc1nPPL6hYjjNZT3z+IaK4TSX9czjGyqG01zWM49vqBhOc1nPPL6hYjjNZT3z+IaK4TSX9czjGyqG01zWM49vqBhOc1nPPL6hYjjNZT3z+IaK4TSX9czjGyqG01zWM49vqBhOc004zTXhNJf1XOsbKobTXBNOc004zWU9v/yGitE0V7GeYX5DxWiaq1jPMb+hYjTNVR4CVzGa5irW88xvqBhNcxXrmeY3VAynuaznmt9QMZzmsp6ZfkPFcJrLem76DRXDaS7r2ek3VAynuaznp99QMZzmsp6hfkPFcJrLeo76DRXDaS7rWeo3VAynuaznqd9QMZzmsp6pfkPFcJrLegb7DRXDaS7z+e76FcNpLvMZ7/oVw2ku8znv+hXDaS7zWe/6FcNpLvN57/oVw2ku85nv+hXDaS7zue/6FcNpLvPZ7/oVw2ku81nx+hXDaS64HPoCl0Nf4HLoC1wOfYHLoS9wOfQFLoe+wOXQF7gc+gKXQ1/gcugLXA59gcuhL3A59AUuh77A5dAXuBz6ApdDX+By6AtcDn2By6EvcDn0BS6HvsDl0Be4HPoCl0Nf4HLoC1wOfYHLoS9wOfQFLoe+wOXQF7gc+gKXQ1/gcugLXA59gcuhL3A59AUuh77A5dAXuBz6ApdDX+By6AtcDn2By6EvcDn0BS6HvsDl0Be4HPoCl0MvcDn0ApdDL3A59AKXQy8PgasYTXMJXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0AtcDr3A5dALXA69wOXQC1wOvcDl0Fe4HPoKl0Nf4XLoK1wOfX0IXMVomqvC5dBXuBz6CpdDX+Fy6CtcDn2Fy6GvcDn0FS6HvsLl0Fe4HPoKl0Nf4XLoK1wOfYXLoa9wOfQVLoe+wuXQV7gc+gqXQ1/hcugrXA59hcuhr7EyymfPf3x69l+/9lFvqKfxQr2h7uk5xqve2d/XG+qWXqg31B29UG+oG3qh3lCeeKHeUI74ut5YedUL9cZ6/l7XG8oLL9Qbygkv1Ctg9YLpK88Z1UcNjjXTUYNxHdTL4zjIkKufu7+ny/7x8b/HvL115tZzpPUrtp4jfUPFxtXQDRUb10M3VGxcEd1QscBVbFwV3VCxcV10Q8XGVdQNFcNpLus50voVW8+RvqFiOM1lPUf6horhNJf1HOkbKobTXNZzpG+oGE5zWc+RvqFiOM1lPUf6horhNJf1HOkbKobTXNZzpG+oGE5zWc+RvqFiOM1lPUf6horhNJf1HOkbKobTXNZzpG+oGE5zWc+RvqFiOM1lPUf6horhNJf1HOkbKobTXNZzpG+oGE5zWc+RvqFiOM1lPUf6horhNJf1HOkbKobTXNZzpG+oGE1zNes50jdUjKa5mvUc6RsqRtNc7SFwFaNprmY9R/qGitE0V7OeI31DxXCay3qO9A0Vw2ku6znSN1QMp7ms50jfUDGc5rKeI31DxXCay3qO9A0Vw2ku6znSN1QMp7ms50jfUDGc5rKeI31DxXCay3qO9A0Vw2muDKe5Mpzmsp4VfkPFcJqrwGmuAqe5rGeGf6/iywz8Zj0zXLte65nS36z3KqO1Wc+UVq831B29UG+oG3qhXgGrN5QjXqg31vP3ut5Yz9/rekN54YV6Qznh63pj5VQv1AumrzxnVB81ONZMRw1iu4Yx8nGQ2efFz10q8yi5zPnWmVvPkb6hYuNa6IaKjauhGyo2roduqNi4ItKv2HqO9A0VG1dFN1RsXBfdULFxFXVDxQJXMZzmsp4jfUPFcJrLeo70DRXDaS7rOdI3VAynuaznSN9QMZzmsp4jfUPFcJrLeo70DRXDaS7rOdI3VAynuaznSN9QMZzmsp4jfUPFcJrLeo70DRXDaS7rOdI3VAynuaznSN9QMZzmsp4jfUPFcJrLeo70DRXDaS7rOdI3VAynuaznSN9QMZzmsp4jfUPFaJqrW8+RvqFiNM3VredI31AxmubqD4GrGE1zdes50jdUjKa5uvUc6RsqhtNc1nOkb6gYTnNZz5G+oWI4zWU9R/qGiuE0l/Uc6RsqhtNc1nOkb6gYTnNZz5G+oWI4zWU9R/qGiuE0l/WM4e9VfJnx160nDGvXaz179pv1XmXQdOvJs+r1hrqjF+oNdUMv1Ctg9YZyxAv1xnr+Xtcb6/l7XW8oL7xQbygnfF2v9cxo9XrB9JX1zOiv6j1qcKyZjhrEdA3pkY4a0qOmi5+7elRcx/j42jl91GtbB+nXa1sHfbPePubxtfPF1z4/x8HGtmbay8a2vtrLxrYW28rGeBb1Xja2Nd5eNrb14F42tnXmXjZCNqdsQmldZTbUxedsqIvP2VAXn7OhLj5lYzyPfC8b6uJzNtTF52yoi8/ZCNmcsqEuPmdDXXzOhrr4nA118Tkb6uJTNsYz4/eyoS4+Z0NdfM6GuvicjZDNKRvq4nM21MXnbKiLz9lQF5+zoS4+ZWM8138vG+riczbUxedsqIvP2QjZnLKhLj5nQ118zoa6+JwNdfE5G+riUzbGdy/sZUNdfM6GuvicDXXxORshm1M21MXnbKiLz9lQF5+zoS4+Z0NdfMZmGN+PsZcNdfE5G+riczbUxedshGxO2VAXn7OhLj5nQ118zoa6+JwNdfEpG+M7TPayoS4+Z0NdfM6GuvicjZDNKRvq4nM21MXnbKiLz9lQF5+zoS4+ZWN8z8xeNtTF52yoi8/ZUBefsxGyOWVDXXzOhrr4nA118Tkb6uJzNtTFp2yM7/Xay4a6+JwNdfE5G+riczZCNqdsqIvP2VAXn7OhLj5nQ118zoa6+JSN8X1se9lQF5+zoS4+Z0NdfM5GyOaUDXXxORvq4nM21MXnbKiLz9lQF5+y4b67L9hQF5+zoS4+Z0NdfM5GyOaUDXXxORvq4nM21MXnbKiLT9k02Gd4lWPvvJywgX2GL7CBvYtrHS82rb9nA3sXL7CBvYsX2MDOKK7Z4O5YWmADO6NYYAOrb1pqf3y2lfyeDay+WWAjZHPKBnZGscAGVhcvsIHVxQtsYHXxAhtYXXzNBnfH0gIbWF28wIa6+JwNdfE5GyGbUzbUxedsqIvP2VAXn7OhLj5nQ118yibYjqXvfO3WXkPR5/93fny6jA86sZSxNp1Y2libTix1rE1HSOcLOrEU8ne+dn+8Hlmp91/pvPm91jj+/mKMj8/m9EEylp7eSTKW+t5JMpZW30kylrLfR3IG2ym1kySuZ9AmiesvtEniehFtkkKSSiTpcbRI0uNokaTH0SJJj6NFkh5HiWSw/WA7SdLjaJGkx9EiSY+jRVJIUokkPY4WSXocLZLUk2sk6+vvbGpPb0kG26u1kySf3Ur/dQfbvbSTJJ/dWiT57NYiyfmkFknOJ9+QPOhQI35BJ9jeKG06wLPBefxl5ygndIDnfQt0gH3AAh0hnS/oAOv1BTrAGnyBDq6uHodUTlPGL3R+R1cH2zm1kySuBlcmGWyf1U6SuNpemySuD9AmiesZtEkKSSqRxPUi2iRxfYs2SXocLZL0OFok6XGUSAbbTbaTJD2OFkl6HC2S9DhaJIUklUjS42iRpMfRIkmPo0WSHkeLJD2OEslGj6NFkh5HiyQ9jhZJehwtkkKSSiTpcbRI0uMokQy24fE+kpdvHQbbB7mTJJ84Wv9184mjRZJPHC2SnKppkeRUTYskp2pvSL7oBNt2qE2Huu8rOrgTrdleH87Pct/TwZ1SrdAR0vmCDq62X6GDq9dX6OBq8BU6sLr6ebp00JnyC503urrJoas/ffYxP0jC6mptkribFdVJwup1dZKw2l6dJKwPUCcpJKlEEtZfqJOE9SLqJGF9izpJehwtkvQ4KiTrA3drpDpJehwtkvQ4WiTpcbRICkkqkaTH0SJJj6NFkh5HiyQ9jhZJehwlkrhbI9VJ0uNokaTH0SJJj6NFUkhSiSQ9jhZJehwtkvQ4WiTpcbRI0uMokcTdZKpOkh5HiyQ9jhZJehwtkkKSSiTpcbRI0uNokaTH0SJJj6NFkh5HiSTu1l51kvQ4WiTpcbRI0uNokaQKWiN5kYr2JEkVpEQSd+/kN0le5CY9SfKJo0WSTxwtkkKSSiQ5VdMiyanaG5IHHWrEr+hQ931FB3eildJx6iTv6eDucVyig+sDVujgavsVOrh6fYWOkM4XdHB1dRr1OLXMX+j8znQRd9ehOklcDa5NEleva5ME1va6JHF3HaqTBPYMyiSB/YUySWAvokxSSFKJJD2OFkl6HC2S9DhaJOlxtEjS4yiRxN1kqk6SHkeLJD2OFkl6HC2SQpJKJOlxtEjS42iRpMfRIkmPo0WSHkeJJO4mXnWS9DhaJOlxtEjS42iRFJJUIkmPo0WSHkeLJD2OFkl6HC2S9DhKJIE3HWuTpMfRIkmPo0WSHkeLpJCkEkl6HC2S9DhaJOlxtEjS42iRpMfRIZmANx1rkxSSXCJ5lYqWgHehapPkE2eN5FVuUgLeO6lMEnjvpDZJTtW0SHKqpkWSU7U3JA86Qjpf0KHu+4oO7kQrt/E6dXk83tPBnVKt0MH1ASt0cLX9Ah3gHYordHA1+AodXF1d8gcdae/p4GrlFTpCOl/QwdXKK3RwtfIKHVytvEIHVyuX+frSWWT8QufNLCgfs6BSP1X48Rsx4B1/yiSBd/xpk8TV69okgbW9MklgH6BMUkhSiSSwv/gWyY+/C+r9PUlgL6JMEti3KJOkx9EiSY+jRFLocbRI0uNokaTH+S7Jk7+OBt4qq01SSFKJJK7HkeMP+XItV3/1Nw4gI33eI1Y/SOJ6HG2SuB5HmySux9EmietxlEkCb8HVJonrcb5HUl4qaNT+niSux9EmietxtEkKSSqRpMfRIkmPo0WSHmeNZH/9sdqY6T1JehwtkvQ4SiSBN/xqk6TH0SJJj6NFkh5Hi6SQ5ArJmV4lztzek6TH0SJJj6NFkh5HiyQ9jhZJehwlksAbfrVJ4nqc2h6vU7dHuiCZnk+U4yDt09++yMebi8A7fvVZ4vocfZZClmoscb3O91jm9Po1RMqj/8Lyz5++zrUD3gu8lzuuj9rLHdd17eWO69G2cgfeZ7yXO/3fHu70inu401fu4S7kvoU7/eoe7vSre7jTr+7hTr+6hzv96hbuwLup93KnX93DnX51D3f61T3chdy3cKdf3cOdfnUPd+r3O7hfbWbNwHuX93Knntlxz+SHkPsW7tQze7hTz+zhzvn7Hu6cv/9l7gdLanI1lsDb5vVZcva9xrI82usgRU5Ycp6tx5KeTo+lkKUaS3ovPZb0U3os6ZEWWfbXODFJffzC8s2nuxzkh3w6iTw+yNMl7SJPT7WJfKYD20Wefm0Xebq7XeTpBXeRF5LfRJ4+cxd5utJd5Olhd5Gnh91Fnh52E/lCD7uLPD3sLvL0sLvI08PuIi8kv4k8Pewu8vSwu8jTw+4iTw+7izw97CbyQg+7izw97C7y9LC7yNPD7iIvJL+JPD3sLvL0sLvI08PuIk8Pu4s8Pewm8pUedhd5ethd5Olhd5Gnh91FXkh+E3mqyhvIX+eSVWrKLdwbn653cL/MC2p8tu7hzifrHu6cDe/hzsnwHu6cC/9l7gdLanI9ltTZayxretWYah9X90E+7oNSP/GYB/fOye0e7pzb7uFOX7mHO33lHu5C7lu401fu4U5feQf3Jse8tr/nTl+5hzs96B7u9KtbuA/61T3c6Vf3cKdf3cOdfvVe7kPecxdy38KdfnUPd/rVNe7tg0j7dI6Tv6ircmzNqfVz2v7HX9QNOtZd5OlZd5Gna91EftK37iJP57qLPL3rLeSPP55+KtD8njzd6y7yQvKbyNPB7iJPD7uLPD3sLvL0sHeQl/k4yI9fVeXvTNcm/a79LpUHvbGHLtFH39Gl1j8+/Zn8x7OmPOijd5Gnj95FXkh+E3n66F3k6aN3kaeP3kWePvoW8uNIFGpzvidPb7yJfKLf3UWeHnYXeXrYXeTpYXeRF5LfRJ4e9hby6XWQ1NOvev53JsqJftdDl+iNPXSJPvqOLo3H8Tu0X07y+VlDH72JfKaP3kWePnoXefroXeTpo3eRF5LfRJ4++hbyqR7k83hPnt54F3n63V3k6WF3kaeH3US+0MPuIk8Pu4s8Pewd5L/YIvY7E+VCv+uhS8IuOegSro9u5Tj18xf3l11Kx5uX7TOR/v4n4PWoyZ+3yLVPTxpcF72XO66H3ssd10Hv5Y7rn9W4v1gKriPWZ4nrcfVZ4rpWfZa43lKfpZClGkv6ND2W9F56LOmnFlnO4yD9UX9h+edPt/Qa8rSS3+p6oZ/aw51+6gbuOR9fWupb7pXeaw93+rQ93Onp9nCn/9vDXch9C3f6yju4X87lKz3oHu70q2vcex4Hd0l/2TdV+tU93OlXb+B+/Vxt9Kt7uNOv7uFOv7qHO/3qHu5C7lu406/ewf3SNzX61T3c6VcXubfjd9V9XP3d5LVvavSre7jTr97A/fq52ulX93CnX93DnX51D3f61T3chdy3cKdfvYP7pW/q9Kt7uNOvrnEfjyNld+THX/ZNnX51D3f61Ru4Xz9XB/3qHu70q3u406/u4U6/uoe7kPsW7vSrd3C/9E2DfnUPd/rV3+Def+F+sKQH1WNJX6nGctIrLrLscrAc/V//6mxk0ivu4U6veAP3a+086RX3cBdy38KdXnEPd3rFPdzpFfdwp6+8g/vlbGTSg+7gLg/61UXuNX1wHxfcZ3n9octsn3azj3ef7fX1Ekefn3Lz80eLaG3Nt4gu2HyLaJjNt0jYIustog033yI6dvMtork33yLOAcy3iCMD6y1KnC6YbxGnC2stmnIcZNa/HO4uiSODPdw5B7iB++UvViQJuW/hTse+hztt+B7u9NZ7uNMw7+FOF3wH98tfnGda2z3c6Vf3cKdf3cOdfnWR+3i8Pv24fFnvq08f5IXkN5GnZ72BfB/zOEe+OMf5mY8e0d/a7xG9sP0e0Tfb7xE9tvkeFfpx+z2id7ffI/p8+z3iTMB+j4Q9Mt8jzhns94hzBvs94pzBfo84Z7DfI84ZzPdIOGew3yPOGez3iHMG+z3inMF+j4Q9Mt8jzhns94hzBvs94pzBfo84Z7DfI84ZzPeocs5gv0ecM9jvEecM9nvEOYP9HtEfbe5RPV4sev6m6H2P6I/M96hR1+3u0RGJVFt/3yPqOvs9oq6z3yPqOvs9EvbIfI/4+yP7PaI/2tyj6+y/Rn9kv0f8/ZH9HvH3R+Z71DlnsN8jzhns94hzBvs94pzBfo+EPTLfI84Z7PeIcwb7PeKcwX6POGew3yPOGe7o0TfO8RFm+0uWbWtHjwbnDPZ7xDmD/R5xzmC/R5wz2O+RsEfme8Q5g/0ecc6wu0f19dnZH+97xDmD/R5xzmC/R5wzmO/R5JzBfo84Z7DfI84Z7PeIc4Yf7dHBXch9C3fOA/Zwp8ffw52+fQ93evE93Omvd3CvDxDPfNQL4j+PekG83FEviC866hWwekF8wFEviP4+6rWue49Pp+f/zIt6L/9+sT6s603teq3rvG/Vq5qfVpN1LbaTjXXdtpONdY23k411PbiTjZDNKRvrOnMnG+uadCebUPpVmU0oravMhrr4lE2mLj5nQ118zoa6+JwNdfE5GyGbUzbUxedsqIvP2VAXn7OhLj5nQ118yqZQF5+zoS4+Z0NdfM6GuvicjZDNKRvq4nM21MXnbKiLz9lQF5+zoS4+ZSPUxedsqIvP2VAXn7OhLj5nI2Rzyoa6+JwNdfE5G+riczbUxedsqItP2VTq4nM21MXnbKiLz9lQF5+zEbI5ZUNdfM6GuvicDXXxORvq4nM21MWnbBp18Tkb6uJzNtTF52yoi8/ZCNmcsqEuPmcDq2/qkUX//EXUezaw+uaajfn9tPexqePFpvX3bGCfUwtsYJ9TC2xgn1MLbGDnNwtsYOc3C2xg9c11bpL5PZcb2ZjfL7mTDez8ZoENrC5eYAOrixfYCNmcsoHVxQtsYHXxAhtYXbzAhrr4nA118Skb8/vQdrKhLj5nQ118zoa6+JyNkM0pG+riczaxdPF3vnatR3z+81cKH5+WtzXW+iqxp/ckY6nonSRjae6dJGMp9H0km/ldTVtIHnRiKXptOrE0vTadWKpem46Qzhd0Yil7bTrU9l/RoV7/ig6uBm/5ZbBT+1Tje+V46bBbsK1bG0kG29F1G8mcjxKlvieJq9e1SeJqe22SuD5Am6SQpBJJXH+hTRLXi2iTxPUt3yN5OdMNthNtJ0lgj9PqQbKPv+xxgu1b20kS2ON8h+T1EyfYLredJIE9jjJJIUklksAeR5kksMdRJgnscZRJAnucb5G89DjBtuFtJBlsd95OkvQ4WiRxPU5/vKx06vVxQTLVV4mpynuSuB5Hm6SQ5ApJ1aS3FmyboBfquN5pJ3Vcn7WTOq4n20kd179tpB5sH6QX6ri+cCd1esgd1Ok3d1AXUt9And50B3V60x3U6U13UKc33UGd3nQD9WA7Wb1QpzfdQZ3edAd1etMd1IXUN1CnN91Bnd50B3V60x3U6U13UKc33UA92F5kL9TpTXdQpzfdQZ3edAd1IfUN1OlNd1CnN91Bnd50B3V60x3U6U03UO/0pjuo05vuoE5vuoM6vekO6kLqG6jTm+6gTm+6gzq96Q7q9KY7qNObbqA+6E13UKc33UGd3nQHdep1depVXgupqpxQp17fQZ0aRp96HS/qrb+lPqlhdlCnhtlBnRpmB3XO13dQF1LfQJ16XZ369faVSb2+gzrn6zuoc76+gzq96c9T7w960x3U6U13UKc33UGd3nQHdSH1DdTpTXdQpzfdQZ3edAd1etMd1OlNN1BP9KY7qNOb7qBOb7qDOr3pGvVvfOWcy+ODx8en05RvfeWjR8Ieme8Rfa/9HtEl2+8RPfWP9ujgTle9hzt99Rbumc56D3d66z3c6a73cKe/3sNdyH0Ld/rgPdzpbfdwp1+9gfs4uJfUfuH+5hwy5HWOWj59upWPLtHdeugSvfDmLqnmCvRCjx2rn/TusfrJmUCsfnLWEKufwn6G6idnI7H6yZlLrH5ylhOrn5z6xOon50Oh+imcD8XqJ+dDsfrJ+VCsfnI+FKufwn6G6ifnQ7H6yflQrH5yPhSrn5wPxeon50Oh+lk5H4rVT86HYvWT86FY/eR8KFY/hf0M1U/Oh2L1k/OhWP3kfChUPxv9p6N+Xu5+7I3+M1Y/hf101M+rvWa9Ud/G6if1bax+Ut/G6id//xmrn/z9Z6h+dvpPR/28zlrv9J+x+snff8bqJ3//Gaufwn6G6ifnQ7H6yflQrH5yPhSrn5wPxeon50Oh+jk4H4rVT86HYvWT86FY/eR8aHc/v3NmOUin+nifOD6EHQ3WUc6IonWUU6JoHeWcKFpHOSmK1lHOioJ1dHJa5LWjnz79S0c5L4rWUU6MonWUMyNPHa2pHh3N431HhR0N1lHOjKJ1lDOjaB3lzChaRzkzitZRzoxidXQ8ODPy2tFS33eUM6NoHeXMKFpHOTMy29GjR8Ieme8R5zr6PSppHD2qctGjJEM+brv2/rbjrMZDlzh/2dwl1WzL8eD0JVY/OXsJ1c/EyUusfnLuEqufnLrE6idnLrH6KexnqH5ylhOrn5z6xOon50Ox+sn5UKx+cj4Uqp+Z86FY/eR8KFY/OR+K1U/Oh2L1U9jPUP3kfChWPzkfitVPzodi9ZPzoVj95HwoVD8L50Ox+sn5UKx+cj4Uq5+cD8Xqp7CfofrJ+VCsftJ/OupnlfzHZ6uc9JP+M1Q/hfrWUz+vdpEPob6N1U9hP0P1k/o2Vj/5+89Y/eTvP2P1k/7TUT8vd/sNof8M1c/K33/G6id//xmrn5wPxeon50Ox+insZ6h+cj4Uq5+cD8XqJ+dDsfrJ+VCsfnI+FKqfjfOhWP3kfGh3P79z5ut91aNxQhSto5wRReuosKPBOso5UbSOclIUraOcFUXrKKdFXjv66dO/dJTzomAd7ZwYResoZ0aeOrqwr7pzZhSto5wZReuosKPBOsqZUbSOcmYUraOcGUXrKGdGXjta6vuOcmYUrKODM6NoHeXMyGxHjx5xCmS/R5zr3NCj2o4ezXbRo5lff385e/pUX/vokbBH5nvE2cvmHunmWg5OXmL1k3OXWP3k1CVWPzlzCdXPyYlLrH5y3hKrn5zNxOon5zix+insZ6h+cj4Uq5+cD8XqJ+dDsfrJ+VCsfnI+FKmf88H5UKx+cj4Uq5+cD8XqJ+dDsfop7GeofnI+FKufnA/F6ifnQ7H6yflQrH5yPhSqn4nzoVj95HwoVj85H4rVT86HYvWT/tNRP6vkPz5b5aSf9J+h+pmpbz3182oP+czUt7H6SX0bq5/Ut7H6KexnqH7y95+x+kn/6aifl3v9Zqb/jNVP/v4zVj/5+89Q/SycD8XqJ+dDsfrJ+VCsfnI+FKufwn6G6ifnQ7H6yflQrH5yPhSrn5wP7e7nN77yPP7eZNbP+xLaRz85HwrVT+F8KFY/OR+K1U/Oh2L1k/OhWP0U9jNUPzkf8tTP+vrs7I/3/eR8KFY/OR+K1U/Oh2L1k/OhUP2snA/F6ifnQ7H6yfmQ2X4ePeLMx36PhD3S79E8dkxLShc9yrmVj0/nXz59dInTGQ9d4sxle5c+mlTf33eco9jvEWcj9nvEeYf5HjXOMOz3iHMJ+z3irGF3j2p9fbin9z3irMF+j4Q9Mt8jThrs94hzBvs94pzBfo84Z7DfI84ZzPeoc85gv0ecM9jvEecM9nvEOYP9Hgl79Nd6dJDkNECLJD27Fkk6ay2S9L9aJOlSlUgOekktknR8WiTpy7RI0j1pkRSSVCJJj6NFkh7nDcmDDrBv6fmgM/rFz9nzJHIcpMj7nzRg56LOEti7aLOcwO5FnSWwf1FnCexg1FkCexh1lkKWaiyBfYw6S2Ano86SvkePJX2PHkv6HiWW7fGg79FjSd+jx5K+R48lfY8eSyFLNZb0PXos6Xv0WNL36LGk79FjSd+jxjLR9+ixpO/RY0nfo8eSvkePpZClGkv6Hj2W9D16LOl79FjS9+ixpO9RY5npe/RY0vfosaTv0WNJ36PHUshSjSV9jx5L+h49lvQ9eizpe/RY0veosSz0PXos6Xv0WNL36LGk79FjKWSpxpK+R48lfY8eS/oePZb0PXos6XvUWAp9jx5L+h49lvQ9eizpe/RYClmqsaTv0WNJ36PHkr5HjyV9jx5L+h41lpW+R48lfY8eS/oePZb0PXoshSzVWNL36LGk79FjSd+jx5K+R48lfY8ay0bfo8eSvkePJX2PHkv6Hj2WQpZqLOl79FjS9+ixpO/RY0nfo8eSvkeNZafv0WNJ36PHkr5HjyV9jx5LIUs1lvQ9eizpe/RY0vfosaTv0WNJ36PGctD36LGk79FjSd+jx5K+R4+lkKUaS/oePZb0PXos6Xv0WNL36LGk71FjOel79FjS9+ixpO/RY0nfo8dSyFKNJX2PHkv6Hj2W9D16LOl79FjS92ixfEIjSzWW9D16LOl79FjS9+ixFLJUY0nfo8eSvkePJX2PHkv6Hj2W9D1qLBN9jx5L+h49lvQ9eizpe/RYClmqsaTv0WNJ36PHkr5HjyV9jx5L+h41lpm+R48lfY8eS/oePZb0PXoshSzVWNL36LGk79FjSd+jx5K+R48lfY8ay0Lfo8eSvkePJX2PHkv6Hj2WQpZqLOl79FjS9+ixpO/RY0nfo8eSvkeNpdD36LGk79FjCeJ7jnpBvMlRr4DVC6Lxj3pBdPhRL4hWPuoF0bNHvSCa81Uvyj77o14Q7XbUC6avUHa3H/WK33qPGhxrpqMGxzroqMGxtjlqcKxXjhoca5BXDZ73RR81ONYKRw2On/9HDY6f6UcNAZ7TnvfwHjUEeE573jt71BDgOe15z+qrBs/7TY8aAjynPe/zPGoI8Jz2vL/yqCHAc9rzvsajBuPP6ecvsj9qqO2XGn7vt7nWtxneULFxDaBfsfXNgDdUbFxf3FCxcTVyQ8XGtcsNFQtcxcZ10Q0VG1dRN1QMp7msb1K7oWI4zWV9K9kNFcNpLusbvm6oGE5zWd+WdUPFcJrL+uapGyqG01zWtzjdUDGa5srWNyLdUDGa5srWtwvdUDGa5soPgasYTXNl61tvbqgYTXNl6xtkbqgYTnNZ38ZyQ8Vwmsv6ZpMbKobTXNa3hNxQMZzmsr5x44aK4TSX9e0VN1QMp7msb4K4oWI4zWV9q8INFcNpLusbCm6oGE5zWU/7v6FiOM1lPTn/horhNJf1FPobKobTXNYT3W+oGE5zWU9Hv6FiOM1lPWn8horhNJf11O4bKobTXNYTsG+oGE5zWU+TvqFiOM1lPVH6horhNJf1VOkbKobTXNaTpW+oGE5zWU+XvqFiOM1lPWH6horhNJf1lOkbKobTXNYTrG+oGE5zWU/HvqFiOM1lPXn7horhNJf1VO8bKobTXNYTw2+oGE5zWU8jv6FiOM1lPen8horhNJf1FPUbKobTXNYT2m+oGE5zWU9/v6FiOM1lPVn+horhNBdcDn2Gy6HPcDn0GS6HPsPl0Ge4HPoMl0Of4XLoM1wOfYbLoc9wOfQZLoc+w+XQZ7gc+gyXQ5/hcugzXA59hsuhz3A59Bkuhz7D5dBnuBz6ApdDX+By6AtcDn2By6EvD4GrGE1zFbgc+gKXQ1/gcugLXA59gcuhL3A59AUuh77A5dAXuBz6ApdDX+By6AtcDn2By6EvcDn0BS6HvljKoT/OZEgVHWcypFuOM4nBMxl69h9nMvR0Ps5k6Pl5nMnQE+44k6Fn0OtMlpKzjzMZvMctpU8fZzJ4j1tKcD7OZPAet5SCfJzJ4D1uKUn4OJPBe9xSGu9xJoP3uKVE2+NMBu9xS6mwx5kM3uOWklWPMxm8xy2lkx5nMniPW0r4PM5k8B63lJJ5nMngPW4pafI40833+PF92g99n/5D32f80PeZP/N97k7WO75P+qHvk3/o+5Qf+j7yQ9/nh+6D9kP3Qfuh+6D90H3Qfug+6D90H/Qfug/6D90H/Yfug/5D90H/ofug/9B90H/oPug/dB/0H7oPxg/dB+OH7oPxQ/fB+KH7YPzQfTB+6D4YP3QfjB+6D8YP3Qfjh+6D+UP3wfyh+2D+0H0wf+g+mD90H8wfug/mD90H84fug/lD98H8mftAVN7kzF2O7zPmL9/nt/4KTVTettQ/VTZ5qmLyVGLyVNXkqZrJU3WTpxomTzUtniqZvNuTybs9mbzbk8m7PZm825PJuz2ZvNuTybs9mbzbk8m7PZu827PJuz2bvNuzybs9m7zbs8m7PZu827PJuz2bvNuzybu9mLzbi8m7vZi824vJu72YvNuLybu9mLzbi8m7vZi824vJu11M3u1i8m4Xk3e7mLzbxeTdLibvdjF5t4vJu11M3u1i8m6vJu/2avJurybv9mrybq8m7/Zq8m6vJu/2avJurybv9mrybm8m7/Zm8m5vJu/2ZvJubybv9mbybm8m7/Zm8m5vJu/2ZvJu7ybv9m7ybu8m7/Zu8m7vJu/2bvJu7ybv9m7ybu8m7/Zu8m4fJu/2YfJuHybv9mHybh8m7/Zh8m4fJu/2YfJuHybv9mHybp8m7/Zp8m6fJu/2afJunybv9mnybp8m7/Zp8m6fJu/2afFurybfS60m30utJt9LrSbfS60Pi3d7NfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5qNfleajX5Xmo1+V5quzvX+M+f/t4G7cfx6fT8n4+K32/Q/tbX7o/2+tK9Pj4+LfkvfuVc6usr5zI/bf2e8u4rj3l85XzxlZ8/2n989vnj9Lafd+dHs58/3E9De8nYT4V+Gtrpxn4q9NPQPjz2U6Gfwn6G6qehfbrsp0I/De0iZj8V+mlojzP7qdBPQzuw2U+FfnI+FKmf/cH5kKd+jsern7O+7yfnQ7H6yflQrH5yPhSrn8J+Oupn/+hne99Pzodi9ZPzoVj95HwoVj85H4rVT86HQvUzcT7kqZ91vPrZ+vt+cj4Uq5+cD8XqJ+dDsfop7GeofnI+FKufnA/F6ifnQ7H6yflQrH5yPhSqn5nzoVj95HwoVj85H4rVT86HYvVT2M9Q/eR8KFY/OR+K1U/Oh2L1k/OhWP3kfChUPwvnQ7H6yflQrH5yPhSrn5wPxeqnsJ+h+sn5UKx+cj4Uq5+cD8XqJ+dDsfrJ+VCofgrnQ7H6yflQrH5yPhSrn5wPxeqnsJ+h+sn5UKx+cj4Uq5+cD8XqJ+dDofpZ6T9v6GcaRz+raPbzMp+60n/G6if9Z6x+CvsZqp/0n7H6Sf8Zq5/0n7H6Sf8Zq5/8+4RQ/Wz8+4RY/eR8KFY/OR/y1M/LfTqN86FY/RT2M1Q/OR+K1U/Ohzz183JfR+N8KFY/OR+K1U/Oh0L1s3M+FKufnA/F6ifnQ576efn3fZ3zoVj9FPYzVD85H4rVT86HYvWT86FY/eR8KFY/OR8K1c/B+VCsfnI+FKufnA/F6ifnQ7H6KexnqH5yPhSrn5wPxeon50Ox+sn5UKx+cj4Uqp+T86FY/eR8KFY/OR+K1U/Oh2L1U9jPUP3kfChWPzkfitVPzodi9ZPzoVj95HwoUj/Hg/OhWP3kfChWPzkfitVPzodi9VPYz1D95HwoVj85H4rVT86HYvWT86FY/eR8KFQ/E+dDsfpJ/6nfz3zEYD5bq7qP7iqfeiRhP0P1k/4zVj/pP2P1k/4zVj/pP2P1k/4zVD8z/WesfvLvE2L1k3+fEKufnA/F6qewn476ebVPZ2TOh2L1k/OhWP3kfChWPzkf8tTPq30dI3M+FKqfhfOhWP3kfChWPzkfitVPzodi9VPYT0f9vPz7vsL5UKx+cj4Uq5+cD8XqJ+dDsfrJ+VCofgrnQ7H6yflQrH5yPhSrn5wPxeqnsJ+h+sn5UKx+cj4Uq5+cD8XqJ+dDsfrJ+VCoflbOh2L1k/OhWP3kfChWPzkfitVPYT9D9ZPzoVj95HwoVj85H4rVT86HYvWT86FQ/WycD8XqJ+dDsfrJ+VCsfnI+FKufwn6G6ifnQ7H6yflQrH5yPhSrn5wPxeon50Oh+tk5H4rVT86HYvWT86FY/aT/XOunaop0p0vcQZ1ebgd1Oq4d1OmLNlAfdC87qNNj7KBOJ7CDOn+fu4O6kPoG6vSmO6jTm+pTv9yLMehNd1CnN91Bnd50A/VJb6pP/TIPftKb7qBOb7qDOr3pDupC6huo05vuoE5vqk/98m8EJr3pDur0pjuo05v+PPX5oDfdQZ3edAd1etMd1OlNd1AXUt9And50B3V60x3U6U13UKc33UGd3nQD9URvuoM6vekO6vSmO6jTm+6gLqS+gTq96Q7q9KY7qNOb7qBOb7qDOr3pBuqZ3nQHdXrTHdTpTXdQpzfdQV1IfQN1etMd1OlNd1CnN91Bnd50B3V60w3UC73pDur0pjuo05vuoE5vuoO6kPoG6rH0umZi0SyxVLUum1jaV5WNxFKoumxi6UhdNrHUni6bWJpMl42QzSmbWLN3XTaxJuS6bKiLz9ng6uKrNLwpuLr4kk3F1cXXbHB18TUbXF18lVw1K64uvmYjZHPKBlcXX7PB1cXXbHB18TUbXF18+XuGiquLL9k0XF18zQZXF1+zwdXF12xwdfE1GyGbUza4uviaDa4uvmaDq4uv2VAXn7OhLj5l06mLz9lQF5+zoS4+Z0NdfM5GyOaUDXXxORvq4nM21MXnbKiLz9lQF5+yGdTF52yoi8/ZUBefs6EuPmcjZHPKhrr4nA118Tkb6uJzNtTF52yoi0/ZBNtErsuGuvicDXXxORvq4nM2QjanbKiLz9lQF5+zsa5vUj7YPGq6YvONr51bOU7dxqe/MC7vvnKax2sz+ZE/MkNSf/zVHl28/9cf5rfqskcP8zt42aOH+Y297NHD/H5f9ujxEPbIfI+s+wH26GF+0zB79DC/l5g9epjfYswePczvPGaPHuY3JMfv0UU2y7NHnDPY7xHnDPZ7xDmD/R4Je7S5RxcZLM8ecc5gv0ecM9jvEecM9nvEOYP9HnHOYL5H5rddx+/Rxd8FPXvEOYP9HnHOYL9HnDPY75GwR+Z7xDmD/R5xzmC/R5wz2O8R5wz2e8Q5g/kemd9czh49zO85Z48e5reis0cP8zvU2aOH+Y3r7NGjcM5gv0ecM9jvEecM9nvEOYP9HnHOYL5HwjmD/R5xzmC/R5wz2O8R5wz2eyTskfkecc5gv0ecM9jvEecM9nvEOYP9HnHOYL5HlXMG+z3inMF+jzhnsN8jzhns90jYI/M94pzBfo84Z7DfI84Z7PeIcwbzPWq4/qi2g3p7pKself7CnqR+9CjLeMv99eHaP33lnD6443qevdxxfcxe7kLuW7jj+o293HE9xJ3cZ/3jw+1R33PH9QV7ueNq/b3ccX9PuJV7x/3d363c08G9vedOv7qHO/3qHu70q3u4C7lv4U6/uoc7/eod3Mex42eM99zpV/dwp1/dw51+dQv3Qb+6hzv96h7u9Kt7uNOv7uEu5L6FO/3qHu70q3u406/u4U6/uoc7/eoW7pN+dQ93+tU93OlX93CnX93DXch9C3f61T3c6Vf3cKdf3cOdfnUPd/rVHdyfgMl9C3f61T3c6Vf3cKdf3cNdyH0Ld/rVPdzpV/dwp1/dw51+dQ93+tUt3BP96h7u9Kt7uNOv7uFOv7qHu5D7Fu7U72vcc5LXQfLoV9yv8pZSon7fw536fQv3TP2+hzv1+x7u1O93cL/KhUiZ+n0PdyH3Ldz5+6Y93Pn7pj3c6Vf3cKdfvYP75Xwm069u4V7oV/dwp1/dw51+dQ93+tU93IXct3CnX93DnX51D3f61T3c6Vf3cKdf3cJd6Ff3cKdf3cOdfnUPd/rVPdyF3Ldwp1/dw51+dQ93+tU93OlX93CnX93CvdKv7uFOv7qHO/3qHu70q3u4C7lv4U6/uoc7/eoe7vSre7jTr+7hTr+6hXujX93DnX51D3f61T3c6Vf3cBdy38KdfnUPd/rVPdxx9Xsa9Ti1zAvu1wkbHVeRa5PE1djaJHFVszZJXB2sTVJIconkfH24Pep7krhaVZskrvrUJon7+w9tkri/0fgmyausmE6Po0Ry0ONokaTH0SJJj6NFkh5Hi6SQ5BLJy/nkoMfRIkmPo0WSHkeLJD2OFkl6HCWSkx5HiyQ9jhZJehwtkvQ4WiSFJJVI0uNokaTH0SJJj6NFkh5HiyQ9jg7J/KDH0SJJj6NFkh5HiyQ9jhZJIUklkvQ4WiTpcbRI0uNokaTH0SJJj6NEMtHjaJGkx9EiSY+jRZIeR4ukkKQSSXocLZL0OFok6XG0SNLjaJGkx1EimelxtEjS42iRpMfRIomrJx/lVeNzIiZXJK8yB3LG1ZPaJHH1pDZJXD2pTRJXTyqTLLh68nskr9IbcsHVk9okcfWkNkncmbk2SSHJNZIXb8rnQo+jRZIeR4skPY4WSXocLZL0OEokhR5njeTlfFLocbRI0uNokaTH0SIpJKlEkh5HiyQ9jhZJehwtkvQ4WiTpcZRIAm+z1yZJj6NFkh5HiyQ9jhZJIUklkvQ4WiTpcbRI0uNokaTH0SJJj6NEEngDujZJehwtkvQ4WiTpcbRICkkqkaTH0SJJj6NFkh5HiyQ9jhZJehwlksA75bVJ0uNokaTH0SJJj6NFUkhSiSQ9jhZJehwtkvQ4WiTpcZRI4u7vTuOAk6aMK5KXmQO4+7vVScLqSXWSQpJKJGH1pDpJWD35TZKX6Q24+7vVScLqSXWSsDNzbZK4+7u/S/LqTXnc/d3qJOlxtEjS42iRFJJUIkmPo0WSHmeN5OV8End/tzpJehwtkvQ4OiQL7v5udZL0OFok6XG0SNLjaJEUklQiSY+jRZIeR4skPY4WSXocLZL0OEokcfd3q5Okx9EiSY+jRZIeR4ukkKQSSXocLZL0OFok6XG0SNLjaJGkx1Eiibu/W50kPY4WSXocLZL0OFokhSSVSNLjaJGkx9EiSY+jRZIeR4skPY4SSdyd8uok6XG0SNLjaJGkx9EiKSSpRBJXT/ZHe33p3ucVyavMgYK7v1udJK6eVCaJu79bnSSuntQmiasnv0fy6g3Qgru/W52kkKQSSdyZuTZJ3Jm5Nkl6HC2S9DhrJC99N+7+bm2SuPu71UnS42iRpMfRIkmPo0VSSFKJJD2OFkl6HC2S9DhaJOlxtEjS4yiRxN3frU6SHkeLJD2OFkl6HC2SQpJKJOlxtEjS42iRpMfRIkmPo0WSHkeJJO7+bnWS9DhaJOlxtEjS42iRFJJUIkmPo0WSHkeLJD2OFkl6HC2S9DhKJAc9jhZJehwtkvQ4WiTpcbRICkkqkaTH0SJJj6NFMpaeHPP42vnia1c52Miv53ixCbaRW5dNLM2nyyaWitNlE0uX6bIRsjllE0s76bKJpYZ02cSa4eqyiTWV1WVDXXzGRoJtcf4Om/F4sZn1PRtcXXzNBlcXX7PB1cXXbASWTf9g096zwdXF12xwdfE1G1xdfM0GVxdfs8HVxZdsgm3+/Q6bOl5sWn/PBlcXX7PB1cXXbHB18TUbIZtTNri6+JoNri6+ZoOri6/Z4Oriaza4uviSTbBtsbpsqIvP2VAXn7OhLj5nI2Rzyoa6+JwNdfE5G+riczbUxedsqItP2QTbMKrLhrr4nA118Tkb6uJzNkI2p2yoi8/ZUBefs6EuPmdDXXzOhrr4lE2wTam6bKiLz9lQF5+zoS4+ZyNkc8qGuvicDXXxORvq4nM21MWnbIzvPXyMI1EjPean/I33bGZ/fXr29+/SGd9OqF+vbR2iX6+A1WtbL+jXa1sDfLPe57kfx8fzvPjqc7xu8zlPbnPbKmA3Hds6YDcd2xOyzXSMb6HbTSeUilSnE0pzqtMJpVC/R+c7Xu781AdJIUklkqFU9VaSwHpdmSSwtlcmCewDlEkCewZdksY3wHkiCexFlEkC+xZlkvQ4WiSFJJVI0uNokaTH0SJJj6NFkh5HiyQ9jhJJ4xvgPJGkx9EiSY+jRZIeR4ukkKQSSXocLZL0OFok6XG0SNLjaJGkx1EiaXyHoSeS9DhaJOlxtEjS42iRFJJUIkmPo0WSKmiJ5OXGump8Y50nknzirJG8etO1PvjE0SLJJ44WSU7VtEhyqqZFklM1LZLUk0skW2p/fLaV/Jak8U1vnkhyqqZFklM1LZL0OFokhSSVSNLjaJGkx9EiSY+jRZIeR4skPY4SSeNb+zyRpMfRIonscb5zkpKPr1w+f+VH+2CJ7HK0WQpZqrFEdjraLJG9jjZLZLejzRLZ72izRHY832JZj4OUlt6yNL6R0RdLZNejzZK+R48lfY8eSyFLNZb0PXos6Xt+g+V4z5K+R48lfY8eS/qeRZbzw0PO9x7S+MZNXyzpe/RY0vfosaTv0WMpZKnGkr5HjyV9z7+cvk9bje8k3U2H3uQrOnQbX9Cp9A9f0aEj+IoONf5XdGLty73avlaD7cu9rjfWvtzrekMp1IV6Q2nOhXpDqciFekPpwut6Y+2dXag3lHZbqDeUGluoF0xfxdrJulAvmL6Ktd90oV4wfRVrV+hCvWD6KtbezYV6wfRVrB2WC/WC6atY+yAX6gXTV7F2Ky7UC6avYu0pXKgXTF/F2vm3UC+Yvoq1P2+hXjB9FWsX3UK9YPoq1l63hXrB9FWsHWkL9YLpq1j7xhbqBdNXsXZ3LdQLpq9i7cFaqBdMX00wfTXB9NUE01exdqRd1ttibTJbqBdLX7UHlr5qsfbJLdQrYPVi6asWa4PaQr1Y+qrF2ka2UC+Yvoq12WuhXjB9FWtL1kK9YPoq1saphXrB9FWs7U0L9YLpq1ibkBbqBdNXsbYKLdQLpq9ibehZqBdMX8XadLNQL5i+irUxZqFeMH0Va/PKQr1g+irWBpOFesH0VaxNIAv1gumrWBs1FuoF01exNlMs1Aumr2JteFioF0xfxdqUsFAvmL6KtXFgoV4wfRUruX+hXjB9FSsBf6FeMH0VK6V+oV4wfRUrSX6hXjB9FSvtfaFeMH0Flt/ewPLbG1h+ewPLb29g+e0NLL+9geW3N7D89gaW397A8tsbWH57i5Xv/c3tUGMeJ8kXn63yOkeV8p4k8n4/XZLIuwBVScZKO99KEnnHoC5J5H2EuiSRN47rkhSSVCKJvG1clyTyrnFdkvQ4WiTpcdZIjtcXrrO+J0mPo0Qy1saBrSTpcbRI0uOskewfJNt7kvQ4WiSFJJVI0uNokaTH0SJJj6NFkh5njWR9/W6xtve/W4y1m2MnyVhbP7aSpMfRIkmPo0WSHkeLpJCkEkl6HC2S9DhaJOlxtEjS42iRpMfRIdljbd7ZSpIeR4skPY4WSXocLZJCkkok6XG0SNLjaJGkx9EiSY+jRZIeR4lkrO1XW0nS42iRpMfRIkmPo0VSSFKJJD2OFkl6HC2S9DhaJOlxtEjS4yiRjLWBbitJehwtkvQ4WiTpcbRICkkqkaTH0SJJj6NF0rie7OUDzfj0tv9Jjlx/cZ/9bTJAt74XT71e49pMvV7jCkq9XuM6R71eiVTv927+y5TMbn2L3mY6xlXDZjrGp52b6RifYG6mE0pFatOxvitwM51QCvU+L3d+6oNkKO27lWQoVb2VpJCkEklgba9MEtgHKJME9gzKJIH9hTJJYC+iS9L6Dk5HJOlxtEjS42iRpMfRIikkqUSSHkeLJD2OFkl6HC2S9DhaJOlxlEha34PriCQ9jhZJehwtkvQ4WiSFJJVI0uNokaTH0SJJj6NFkh5HiyQ9jhJJ69u1HZGkx9EiSY+jRZIeR4ukkKQSSXocLZL0OFok6XGUSFrfv2uF5OWe8m59/64jknzirJG8TASwvuvUEUk+cbRIcqqmRZJTNSWS1nedOiJJPblEsqX2x2dbye9JUk9qkeRUTYukkKQSSXocLZL0OFok6XG0SNLjaJGkx9EhOazvOnVEkh5HiyQ9jhZJehwtkgJM8hsnkSKvYZCU+mka9GgfLJFdjjZLZJ+jzRLZ6WizRPY62iyR3Y4yS+t7T12xRHY832I5HgfLMd+zRPY82iyRXY82SyFLNZb0PXos6Xv0WNL36LGk7/k+y9nes6TvUWNpfReqK5b0PWssJR0eUvJ7D2l9H6orlvQ9eiyFLNVY0vfosaTv0WNJ36PHkr5nkWUtB8uW37Ok71FjGWsb8GaW9D16LOl79FjS9+ixFLJUY0nf8y+nGSMDeVfzAh16k6/o0G18RYf+4Qs6yLuaF+hQ439FJ5Rqv9zcPWJtSV6oV8DqDaVQF+oNpTkX6g2lIhfqDaULF+oNpfSu6421r3ah3lBqbKFeMH0Va0PrQr0CVi+Yvoq1k3ShXjB9FWu/50K9YPoq1q7MhXrB9FWsvZML9YLpq1g7HBfqBdNXsfYhLtQLpq9i7RZcqBdMX8Xa07dQL5i+irXzbqFeMH0Va3/cQr1g+irWLraFesH0VQfTVx1MXw0wfRVrT99CvWD6aoDpqyFg9YLpq1ibBxfqBdNXsbb4LdQLpq9ibcRbqBdMX8XaLrdQL5i+irWpbaFeMH0Va+vZQr1g+irWBrGFerH01Yy1jWuhXix9NWNttlqoF0tfzYeA1Yulr2asbUsL9WLpqxlra9FCvWD6Ktb2n4V6wfRVrC06C/WC6atY22gW6gXTV7G2uizUC6avYm1HWagXTF/F2jKyUC+Yvoq1rWOhXjB9FWvrxUK9YPoq1vaIhXrB9FWsLQwL9YLpq1jbDBbqBdNXsbYCLNQLpq9ipesv1Aumr2Jl2i/UC6avYuXOL9QLpq9iZcMv1Aumr8Dy2ydYfvsEy2+fYPntEyy/fYLlt0+w/PYJlt8+wfLbJ1h++wTLb59g+e0TLL99guW3T7D89gmW3z7B8tsnWH77BMtvn2D57RMsv32C5bdPsPz2CZbfPsHy2ydYfvsEy2+fYPntEyy/fYLlt0+w/PYJlt8+wfLbJ1h++wTLb59g+e0TLL99guW3T7D89gmW3z7B8tsnWH77BMtvn2D57RMsv33Gyvd+nvvj43lefPU+5nGSfPHZKvmPz1Ypb0nGSg7fSjKUZthKMpQa2UoylM7ZSlJIUolkKG22lWQo1beVZKh53VaSoSaBW0nS46iQHI9Y6f03khyvL1xnfU+SHkeLJD2OFkl6HC2SQpJLJPsHyfaeJD2OFkl6HC2S9DhaJOlxtEjS4yiRjLVB40aS9fW7xdr6e5L0OFok6XG0SNLjaJEUklQiSY+jRZIeR4skPY4WSXocLZL0OEokY22x2UqSHkeLJD2OFkl6HC2SQpJKJOlxtEjS42iRpMfRIkmPo0WSHkeJZKxNUltJ0uNokaTH0SJJj6NFUkhSiSQ9jhZJehwtkvQ4WiTpcbRI0uMokYy1zW0rSXocLZL0OFok6XG0SApJKpGkx9EiSY+jRZIeR4skPY4SSet78eqox0HavCI5+ysZYPbyvl7jqk+9XuPaTL1eAavXuM5Rr9e4Gvlevd+7+a9SMp90jCuMzXSMq4bNdIxPO/fSsb7PbzOdUCpSnU4ozalOJ5RCvc/LnZ/6ICkkqUQylKreShJYryuTBNb2yiSBfYAySWDPoEvS+j5LRySBvYgySWDfokySHkeLpJCkEkl6HC2S9DhaJOlxtEjS42iRpMdRIml9p6wjkvQ4WiTpcbRI0uNokRSSVCJJj6NFkh5HiyQ9jhZJehwtkvQ4SiStb9d2RJIeR4skPY4WSXocLZJCkkok6XG0SNLjaJGkx9EiSY+jRZIeR4dksr5/1wrJyz3lT04kqUSST5w1kleJAMn6rlNHJPnEUSJpfdepI5KcqmmR5FRNiyT15BLJltofn20lvycpJKlEklM1LZKcqmmRpMfRIkmPo0WSHkeJpPVdp45I0uNokaTH0SJJj6NFUkhSiSQ9jhZJZI/zjZMMya9h0JDyaRr0aB8skV2ONktkn6PNEtnpKLO0vvPUFUtkt6PNEtnvaLNEdjzfYtkeB8s237MUslRjiex6tFnS9+ixpO/RY0nfo8eSvkeNpfU9qCZZ9vaeJX2PHkv6Hj2W9D2LLOfhIevjvYe0vg/VFUv6Hj2W9D16LOl79FjS9+ixpO9RY1npe9ZYVjn0ZZX3HjLWxt7NLOl79FjS9+ixFLJUY0nfo8eSvkePJX3P91nW9zM35M3O6izpe9RYIm+Nvs4RQt4avUCH3uQrOnQbX9ER0vmCDh3BV3So8b+iE0q1z/Ea3c75Ppsl1q7khXpDqd/remPtHV6oN5TmXKg3lIpcqDeULlyoV8DqDaXdFuoNpcYW6gXTV7H2tC7UC6avYu08XagXTF/F2h+6UC+Yvoq1i3OhXjB9FWuv5UK9YPoq1o7IhXrB9FWsfYsL9YLpq1i7CxfqBdNXsfYALtQLpq9i7dRbqBdMX8XaT7dQL5a+yg8sfZUfWPoqP7D0VY61u3ChXgGrF0tf5QeWvsqx9jwu1Iulr3KsnYnX9cbabLhQL5i+irUlcKFeMH0Va+PeQr1g+irW9rqFesH0VaxNcAv1gumrWFvVFuoF01exNpQt1Aumr2Jt+1qoF0xfxdqctVAvmL6KtYFqoV4wfRVrk9NCvWD6KtZGpIV6wfRVrM1CC/WC6atYG3oW6gXTV7E23SzUC6avYm2MWagXTF/F2ryyUC+Yvoq1wWShXjB9FWsTyEK9YPoq1kaNhXrB9FWszRQL9YLpq1gbHhbqBdNXsTYlLNQLpq9ibRxYqBdMX8VK7l+oF0xfxUrAX6gXTF/FSqlfqBdMX8VKkl+oF0xfxUp7X6gXTF+B5bdnsPz2DJbfnsHy2zNYfnsGy2/PYPntGSy/PYPlt2ew/PYMlt+ewfLbM1h+ewbLb89g+e0ZLL89g+W3Z7D89gyW357B8tszWH57Bstvz2D57Rksvz2D5bdnsPz2DJbfnsHy2zNYfnsGy2/PYPntGSy/vYDltxew/PYClt9ewPLby0PA6sXSVwUsv72A5bcXsPz2ApbfXsDy2wtYfnuJle/9PPfj+HieF1+9j3mcJF98tkr+47NVynuSoZ7sW0mG0gxbSYZSI1tJhtI5W0mGUlA7ScbKft9KMpTq20oy1LxuK8lQk8CtJIUklUjS46yRHK8vXGd9T5IeR4skPY4WSXocLZL0OGsk+wfJ9pZkrP0LW0nS42iRpMfRIkmPo0VSSFKJJD3OGsn6+t1ibe9/txhrN8dWkvQ4WiTpcbRI0uMokYy1A2UrSXocLZL0OFok6XG0SApJKpGkx9EiSY+jRZIeR4skPY4WSXocJZKx9hBtJUmPo0WSHkeLJD2OFkkhSSWS9DhaJOlxtEjS42iRpMfRIkmPo0Qy1i6wrSTpcbRI0uNokaTH0SIpJKlEkh5HiyQ9jhZJehwtkvQ4WiTpcZRIxtrHt5UkPY4WSXocLZL0OFokjevJksqng1yRnP2VDDB7eV+vcdWnXq9xbaZer3EFpV2v9b146vUaVyPfq/d7N/91Sqb1LXqb6RhXDZvpCOl8Qcf4BHMznVAqUp1OKM2pTieUQr3Py52f+iAZSvvuJGl9G6IjksB6XZkksLZXJgnsA5RJCkkqkQT2F8okgb2IMklg36JMkh5HiyQ9jg5Jsb6R1BFJehwtkvQ4WiTpcbRICkkqkaTH0SJJj6NFkh5HiyQ9jhZJehwlkta3AjsiSY+jRZIeR4skPY4WSSFJJZL0OFok6XG0SNLjaJGkx9EiSY+jRNL6dm1HJIUkl94qvNq/K9b37zoiySfOGsmrN13F+q5TPySt7zp1RJJTNS2SnKppkeRUTYukkOQKyZbaH59tJb8nST2pRZJTNS2SnKppkaTH0SJJj6NE0vquU0ck6XG0SNLjaJGkx9EiKSSpRJIeR4skPY4WSWSP852T5H4QyePx8emcP1giuxxtlsg+R5ml9Y2nrlgiex1tlshuR5slst/RZilkucZSxgfL9AvLP396lpdune3TKcbbUxy/eetTPn3djxYhWyknLUL2aE5aRPNnvkX0lOZbRKtqvUXW9+GyRWJ90S5bJNY3+LJFYn01MFsk1ncOs0VifZmxmRaVh7y+cvn86c8sOQbQY0m/rseSxlqPJR2wGkvra41dsaSn1GNJ87fIsrSDpdT3LOnS9FgKWaqxpO/RY0nfo8eSvkePJX2PHkv6nu+z/FzjJ5ax1pxvZknfo8eSvudfzgPVkBeuL9AR0vmCDt3GV3ToH76iQ0fwFR1q/K/ohFLtc7x+mT3n+5CqWKvOF+oNpX4X6g2lUBfqDaU5F+oVsHpD6cKFekMpvYV6Q2m3hXpDqbGFerH0VY21ZnmhXix9VWOtLF6oF0tf1YeA1Yulr2qsVboL9WLpqxprLe1CvWD6KtaK14V6wfRVrHWpC/WC6atYq0cX6gXTV7HWeC7UC6avYq3EXKgXTF/FWi+5UC+Yvspg+iqD6atYS00X6gXTVxlMX2UwfRVrAexCvWD6KtYy1YV6wfRVrMWkC/WC6atYSz4X6gXTV7EWZi7UC6avYi2fXKgXTF/FWuS4UC+Yvoq1FHGhXjB9FWvB4EK9YPoq1rK+hXrB9FWstXcL9YLpq1jr4xbqBdNXsdawLdQLpq9irTNbqBdMX8VatLVQL5i+irUCaqFeMH0VaznRQr1g+irW2pyFesH0VayFLgv1gumrWBtMFuoF01exNoEs1Aumr2Jt1FioF0xfxdpMsVAvmL6KteFhoV4wfRVrU8JCvWD6KtbGgYV6wfRVrOT+hXrB9FWsBPyFesH0VayU+oV6wfRVrCT5hXrB9FWstPeFesH0FVh+ewXLb69g+e0VLL+9guW3V7D89gqW317B8tsrWH57Bctvb2D57S1Wvvc3t0ONeZwkX3y2Sv7js1XKe5KhnuxbSSLvAtQlibw3UJck8o5BXZLI+wh1SSJvHFclGStVfitJ5G3juiSRd43rkqTH0SIpJLlEcry+8HMA+p4kPY4WSXocLZL0OFok6XHWSPYPku09SXocJZKxNjtsJUmPo0WSHkeLJD2OFkkhySWS9fW7xdre/24x1m6OrSTpcbRI0uNokaTH0SJJj6NEMtZ2la0k6XG0SNLjaJGkx9EiKSSpRJIeR4skPY4WSXocLZL0OFok6XGUSMbacLSVJD2OFkl6HC2S9DhaJIUklUjS42iRpMfRIkmPo0WSHkeLJD2OEslYW8a2kqTH0SJJj6NFkh5Hi6SQpBJJehwtkvQ4WiTpcbRI0uNokaTHUSIZa9PfVpL0OFok6XG0SBrXk6l9HCTnfEHyOhnA+l489XqNazP1eo0rKPV6jesc7Xqt78VTr9e4ZlCv1/iTXb1e4zNG9XoFrF4wfWV9L943671MULG+F0+93lj66rreWPrqsl7re/G+We9lioL1vXjq9cbSV9f1xtJX1/UKWL2x9NV1vbH01eV80vpePPV6Y+mr63pj6avLeq3vxVOvN5a+uq43lr66rjeWvrquV8DqjaWvrusF01fW9+Kp1wumr6zvxVOut1vfi6deL5a+6g8sfdWt7z1Ur1fA6sXSV936pj/1erH0Vbe+NU+9XjB9ZX0DnXq9YPrK+jY39XrB9JX1zWjq9YLpK+tbxtTrBdNX1jd2qdcLpq+sb79SrxdMX1nfJKVeL5i+sr6VSb1e08/fOefHi5gpp4tyZ3/9efvs5X25ph+/+uWafvqql2t7LYt+uaafvfrlmn70frPc770zPsfrHp/z/T1ue2fJbjimH+q74ZiesOyGY3ocsxtOJO2oDieS0lSHE0mX3hf/cn7oF0jbSzo8gYykpbeCxFXpyiBxFb0ySCFIHZC4TkEZJK6rUAaJ60CUQeK6FWWQdDY6IG2v5vAEks5GCSSdjRJIOhslkEKQOiDpbJRA0tkogaSzUQJJZ6MEks5GB6TthRyeQNLZKIGks1ECSWejBFIIUgcknY0SSDobJZB0Nkog6WyUQNLZ6IC0vdzHE0g6GyWQdDZKIOlslEAKQeqApLNRAklnowSSzkYJJJ2NEkg6Gx2QttdqeQJJZ6MEks5GCSSdjRJIyp8VkJc7WLvtHVKOQNpeXmQH5GVKlO2tSJ5A8mGjBFIIUgckx2hKIDlGUwJJHbkCsqX2x2dbye9BUkcqgeQYTQXksL3dyxNIOhslkHQ2SiDpbJRACkHqgKSzUQJJZ6MEks5GCSSdjRJIOhsdkLb36nkCSWejBJLORgkknY0SSCFIHZDAzuYbB8npIJlTqR/nGPPdp2t9fbin99iBfdBO7MCuaSd2YI+1EzuwI1PC/kJpexenL5TArkwbJbAv00YJ7My0UQpRaqGkO1NDScelhpIuag3lPBR6foxfUL75dG7j+PT4+HROH4I+1MphV+DppO4Af/CQ+tbAhlrC7Ag7HdoW7HRzW7DT+W3BLsS+Azsd5RbsdJ83YL/8DQjwWvGt2OlTt2CnS92BHXlx+new5/JpziIX2FM9Tl3lPXa61C3Y6VL1saumJw3kde9eWiRskfUW0SmbbxFdtfkW0YGbbxHduvkW0dlbb1HlFMB8izgxMN8iThfMt4jTBfMtErbIeos4XTDfIk4XzLeI0wXzLeJ0wXyLOF2w3qLG6YL5FnG6YL5FnC6YbxGnC+ZbJGyR9RZxumC+RZwumG8RpwvmW8TpgvkWcbpgvUWd0wXzLeJ0wXyLOF0w3yJOF8y3SNgi6y2iL9rbost15aPTF1lv0aCi29yiq/XBY1DRmW8RFZ35FglbZL1F/H2R+Rbx90XmW0RftLdF1+uuBn2R+Rbx90XWWzT5+yLzLeJ0wXyLOF0w3yJOF8y3SNgi6y3idMF8izhdMN8iThfMt4jTBfMt4nTBeIvmg9MF8y3idMF8izhdMN8iThfMt0jYIust4nThhhZ94yun+XHmmT6d+SG/11DOIoI1lJOLYA3lnCNYQzkVsdvQV5MS5yIOmsTJiIMmcTbioEmcjjhokrBJ9pvECYmDJnHq4aBJnGQ4aBKnEw6axInD7ib1F+r8SO2XJr05x9UW9Jk5nQjWUE4yPDVUNeJnZk5IgJvPyQtw84XNx20+J0XAzecECrj5nGwBN58TM+DmcxKH2/zCqR1w8znhA24+J3zAzeeED7j5wubjNp8TPuDmc8IH3HxO+ICbzwkfcPM54cNtvnDCB9x8TviAm88JH3DzOeEDbr6w+bjN54QPuPn0+VGbf7lRdgp9Pm7zK9V+2OZfbR6clWofuPnC5uM2n2ofuPn8fT5w8/n7fODm0+dHbf51Wm+lz8dtfuPv84Gbz9/nAzefEz7g5nPCB9x8YfNxm88JH3DzOeEDbj4nfMDN54QPuPmc8OE2v3PCB9x8TvhcNf87XznN15lTfnz6vd5IH+3njA+6/ZzyQbdf2H7k9nPSB91+zvqg289pH3T7Oe+L0f6joZzhxWro4Fxub0Pzoz6Ohs560dDrDXeDs7ZgDeX0zFNDdaMPBmdnwM0XNh+3+ZybATefUzPg5nNmBtx8TsyAm8/pGm7zJydxwM3n1A64+ZzwATefEz7g5gubj9t8TviAm88JH3DzOeEDbj4nfMDN54QPtfnzSYvNx20+J3zAzeeED7j5nPABN1/YfNzmc8IH3HxO+ICbT58ftflXW+vmI9HnAzefaj9s8y822DybL2w+bvOp9oGbT7UP3Hz+Ph+4+fx9PnDz6fOjNv8q1ng+Mn0+cPP5+3zg5vP3+cDN54QPuPnC5uM2nxM+4OZzwgfcfE74gJvPCR9w8znhw21+4YQPuPmc8Llq/je+8vXuimf7OeODbj+nfNDtF7Yfuf2c9EG3n7M+6PZz2gfdfs77YrT/aChneLEaKpzLbW7o8x59feVU+kVD07MdrwpTkfct5bQtXEs5QfPUUjk+LOVx8ZU/f3a8bz7nZ8DNFzY/aPOfZ359Yanvm8/ZGXDzOTkDbj7nZsDN59QMuPmcsOE2v3IaF7b5tb6+cE/vm8+5HXDzOeEDbj4nfMDNFzYft/mc8AE3nxM+4OZzwue1+e9/U1c5tQvWUE7iYjW0cboWrKGcmAVrKKdgwRrKyVawhgobGquhnEAFayinSsEayknR7oZ+vHOV2tU7VyvvczTOisK1lNOiaC3tnBeFayknRuFayplRuJZyahSupcKWRmspJ0fhWsrZUbiWcnoUrqWcHoVrKadH0Vo6OD0K11JOj8K1lNOjcC3l9ChcS4UtjdZSTo/CtZTTo3At5fQoXEs5PQrXUk6PorV0cnoUrqWcHoVrKadH4VrK6VG4lgpbGq2lnB6FaymnR+FayulRuJZyehSupZweBWvpEwJbGq2lnB6FaymnR+FayulRuJYKWxqtpZwehWspp0fhWsrpUbiWcnoUrqWcHkVraeL0KFxLOT0K11JOj8K1lNOjcC0VtjRaSzk9CtdSTo/CtZTTo3At5fQoXEs5PYrW0szpUbiWcnoUrqWcHoVrKadH4VoqbGm0lnJ6FK6lnB6FaymnR+FayulRuJZyehStpYXTo3At5fQoXEs5PQrXUk6PwrVU2NJoLeX0KFxLOT0K11JOj8K1lNOjcC3l9ChaS4XTo3At5fQoXEs5PQrXUk6PwrVU2NJoLeX0KFxLOT0K11JOj8K1lNOjcC3l9ChaSyunR+FayulRuJZyehSupZwehWupsKXRWsrpUbiWcnoUrqWcHoVrKadH4VrK6VG0ljZOj8K1lNOjcC3l9ChcSzk9CtdSYUujtZTTo3At5fQoXEs5PQrXUk6PwrWU06NoLe2cHoVrKadH4VrK6VG4lnJ6FK6lwpZGaymnR+FayulRuJZyehSupZwehWspp0fRWjo4PQrXUk6PwrWU06NwLeX0KFxLhS2N1lJOj8K1lNOjcC3l9ChcSzk9CtdSTo+itXRyehSupZwehWspp0fhWsrpUbiWClsaraWcHoVrKadH4VrK6VG4lnJ6FK6lnB4Fa2l+cHoUrqWcHoVrKadH4VrK6VG4lgpbGq2lnB6FaymnR+FayulRuJZyehSupZweRWtp4vQoXEs5PQrXUk6PwrWU06NwLRW2NFpLOT0K11JOj8K1lNOjcC3l9ChcSzk9itbSzOlRuJZyehSupZwe/WRLD+yc8GzBLsS+AzsnJVuwc5qxBTsnDluwcyqwBTud+xL2kuurxPIZyFvsK8q90F9vAk8XrA++yOvUpcrlFdY+XWHj49PpU5Poax00iS7YQZOETdrcpIOd1PdPJPpr8y2iFzffIvp28y2ixzffIs4DrLdIODkw3yLOGDa3qB5fuKf3LeKEwXyLOF8w3yJhi6y3iNMF8y3idMF8izhduLVF7QQ7JwZbsHMKsAN7pbPfgp1ufQt2OvA17CMd2Oe4wL7yFzCVvnoTeCF4dfDafzBR6ZcdNImOeXeTrn4HUumYzbeI7tp8i+jErbeo0bWbbxEdvvkWcRqwuUWXvwNpnBuYb5GwRdZbxPmC+RZxumC+RZwumG8RpwvmW8Tpwq0tOvnNZ+fEYAt2TgG2YKez34Kdbn0LdiH2Hdjpqrdgp1Pegp3udwt2Otot2OlSl7BLmq8SpVxFA678veKgT90Enk51E3h61U3g6VY3gReC3wOejnUTeHrWTeDpWjeBp2/dBJ7OdQ/4See6CTyd6ybwdK6bwNO5bgIvBL8HPJ3rJvB0rpvA07luAk/nugk8nesW8OVB57oJPJ3rJvB0rpvA07luAi8Evwc8nesm8HSum8DTuW4CT+e6CTyd6x7wic51E3g6103g6Vw3gadz3QReCH4PeDrXTeDpXDeBp3PdBJ7OdRN4Otc94DOd6ybwdK6bwNO5bgJP57oJvBD8HvB0rpvA07luAk/nugk8nesm8HSue8AXOtdN4OlcN4Gnc90Ens51E3gh+D3g6Vw3gadz3QSeznUTeDrXTeDpXPeAFzrXTeDpXDeBp3PdBJ7OdRN4Ifg94OlcN4Gnc90Ens51E3g6103g6Vz3gK90rpvA07luAk/nugk8nesm8ELwe8DTuW4CT+e6CTyd6ybwdK6bwNO57gHf6Fw3gadz3QSeznUTeDrXTeCF4PeAp3PdBJ7OdRN4OtdN4OlcN4Gnc90DvtO5bgJP57oJPJ3rJvB0rpvAC8HvAU/nugk8nesm8HSum8DTuW4CT+e6B/ygc90Ens51E3g6103g6Vw3gReC3wOeznUTeDrXTeDpXDeBp3PdBJ7OdQ/4See6CTyd6ybwdK6bwNO5bgIvBL8HPJ3rJvB0rpvA07luAk/nugk8nesW8PKgc90Ens51E3g6103g6Vw3gReC3wOeznUTeDrXTeDpXDeBp3PdBJ7OdQ/4ROe6CTyd6ybwdK6bwNO5bgIvBL8HPJ3rJvB0rpvA07luAk/nugk8nese8JnOdRN4OtdN4OlcN4Gnc/3zQQ44QjjncOgAv4BDl/YFHDqpL+DQ7XwBh47kHE6ha/gCDpX9F3Covr+AQ4X8BRwhnHM4kRTyHOOPT8/Z35cbSfMulBtJxS6UG0mXLpQbSWlelyuRtONCuZHU4EK5kfTdQrmRFNtCuYJVLpaqEixVJViqSrBUlWCpqoqlqiqWqqpYqqpiqaoqWOViqaqKpaoqlqqqWKqqYqmqhqWqGpaqaliqqmGpqiZY5WKpqlDb4xfKxVJVoTalL5SLpapCbQVfKBdLVYXagL1QLpaqCrXteaFcLFUVarPxQrlYqirUFt+FcrFUVaiNtQvlYqmqUNtZF8rFUlWhNpEulIulqkJt3VwoF0tVhdowuVAulqoKtU1xoVwsVRVqc+BCuViqKtSWvIVysVRVqI1wC+ViqapQ288WyoVSVTXUpq+FcqFUVQ211WqhXChVVR+CVS6UqqqhthUtlAulqmqozTwL5WKpqlBbaBbKxVJVoTauLJSLpapCbRdZKBdLVYXapLFQLpaqCrU1YqFcLFUVakPCQrlYqirUNoCFcrFUVahU/YVysVRVqOT7hXKxVFWodPqFcrFUVagE+YVysVRVqJT3hXKxVFWoJPaFcrFUFVa2esXKVq9Y2eoVK1u9YmWrV6xs9YqVrV6xstUrVrZ6xcpWr1jZ6hUrW71iZatXrGz1ipWtXrGy1StWtnrFylavWNnqFStbvWJlq1esbPWKla1esbLVK1a2esXKVq9Y2eoVK1u9YmWrV6xs9YqVrV6xstUrVrZ6xcpWr1jZ6hUrW71iZatXrGz1ipWtXrGy1StWtnrFylavWNnqFStbvWJlq1esbPWKla1esbLVK1a2esXKVq9Y2eoVK1u9YmWrV6xs9YqVrV6xstUrVrZ6xcpWr1jZ6hUrW71iZatXrGz1ipWtXrGy1RtWtnrDylZvWNnqDStbvT0Eq1woVdWwstUbVrZ6w8pWb1jZ6g0rW71hZas3rGz1hpWt3rCy1RtWtnrDylZvWNnqDStbvWFlqzesbPWGla3esLLVG1a2esPKVm9Y2eoNK1u9YWWrN6xs9YaVrd6wstUbVrZ6w8pWb1jZ6g0rW71hZas3rGz1hpWt3rCy1RtWtnrDylZvWNnqDStbvWFlqzesbPWGla3eQqVvP4/9OD6e58UX/85Bci7jKHHIxznG/Ktf+VFfZ86PWT/Bk3dfeczjK+eLr1wl//HZKuV98yOpEDb/e80PlczO5n+z+ZEUKpv/zeZH0uts/jebH8m9sPnfbL6w+bjNj+Rs2fxvNj/Sb0/Y/G82P9Lvktj8bzafEz7g5nPCF7b54/WF6+ev+6n5obYEsfnfbD4nfMDN54QPuPmc8IVtfv9ofnvffGHzcZvPCR9w8znhA24+J3zAzeeED7j5nPCFbX59Hbm293+9G2pjJZv/zeZzwgfcfE74gJvPCR9w84XNx20+J3zAzeeED7j5nPABN58TPuDmc8KH2/xQ29PZ/G82nxM+4OZzwgfcfE74gJsvbD5u8znhA24+J3zAzeeED7j5nPABN58TPtzmT074gJvPCR9w8znhA24+J3zAzRc2H7f5nPABN58TPuDmc8IH3HxO+ICbzwkfbPP7gxM+4OZzwgfcfE74gJvPCR9w84XNx20+J3zAzeeED7j5nPDhNj/R5+9tfnr24Gh+aprNv9q00RN9PnDz6fOBm0+fD9x8YfNxm0+fD9x8+nzg5tPnAzeff8kD3Hz+JQ9u8zMnfMDN54QvbPOvlir2zAkfcPM54QNuvrD5uM3nhC9s869Wq/XMCR9w8znhA24+J3zAzeeED7f5hRM+4OZzwhe2+Zd/vVs44QNuPid8wM0XNh+3+ZzwATefEz7g5nPCB9x8TviAm88JH27zhRM+4OZzwgfcfE74gJvPCR9w84XNx20+J3zAzeeED7j5nPABN58TPuDmc8KH2/zKCR9w8znhA24+J3zAzeeED7j5wubjNp8TPuDmc8IH3HxO+ICbzwkfcPM54cNtfuOED7j5nPABN58TPuDmc8IH3Hxh83GbzwkfcPM54QNuPid8wM3nhA+4+Zzw4Ta/0+ff0HzVfRidbtx8i4Qtst4iOlvzLaL/NN8iukTzLaKXM98iOi7rLRr8ywfzLeLfJ5hvEacL5lvE6cLmFl0uRxvCFllvEacL5lvE6YL5FnG6sLlFl6t7BqcL5lvE6YL1Fk1OF8y3iNMF8y3idMF8izhd2Nyiy78AmsIWWW8RpwvmW8TpgvkWcbpgvkWcLphvEacLxls0HpwumG8RpwvmW8TpgvkWcbpgvkXCFllvEacL5lvE6YL5FnG6YL5FnC6YbxGnC9ZblDhdMN8iThfMt4jTBfMt4nTBfIuELbLeIk4XzLeI0wXzLeJ0wXyLOF0w3yJOF6y3KHO6YL5FnC6YbxGnC+ZbxOmC+RYJW2S9RZwumG8RpwvmW8TpgvkWcbpgvkWcLlhvUeF0wXyLOF0w3yLBbZFm9uIowO5FFySwx9AFCewEdEEC63VdkMCqWhWkAGtfXZDAClUXJPBvqXRBAv8uSRekEKQOSDqbJZBXkchD6GyUQNLZKIGks1ECSWezBPIqZHRUOhslkHQ2SiDpbJRA0tkogRSC1AFJZ6PzW8RKZ6MEks5GCSSdjRJIOhsdkI3ORgkknY0SSDobJZB0NkoghSB1QNLZKIGks1ECSWejBJLORgkknY0OyE5nowSSzkYJJJ2NEkg6GyWQQpA6IOlslEDS2SiBpLNRAklnowSSzkYH5KCzUQJJZ6MEks5GCSSdjRJIIUgdkHQ2SiDpbJRA0tkogaSzUQJJZ6MDctLZKIGks1ECSWejBJLORgmkbR056uvDc9Z2wXH212v+s79/zX/aFnva1dpWZNrV2pZNutXOh21to12tbQHyrWq/d9s/7cDxpft7NrY1xV42tmXCXjZCNqdsbI8p97IJpBjV2QTSl+psAqnR+xzb+ZkPjoF07k6OKZCC3soRVpsrc4TV8cocYTW/MkchRxWOsF5CmSOs71DmCOtRlDnSz+hwpJ9R4Wh8E7kfjvQzOhzpZ3Q40s/ocBRyVOFIP6PDkX5GhyP9jA5H+hkdjvQzKhyN7z72w5F+Rocj/YwOR/oZHY5Cjioc6Wd0ONLP6HCkn9HhSD+jw5F+RoWj8X3WfjgKOSqsvJ3GV9764cjnjMabqNP4elE3HI1vF/XDkXMzHY6cm+lw5NxMh6OQ4zXHltofn20lv+dI/ajDkXMzHY6cm+lwpJ/R4Ug/o8LR+E5RPxzpZ3Q40s/ocKSf0eEo5KjCkX5GhyP9jA5HXD/zjXOkUo+ozdI+8ejzgySuo9EmietplEka3yfqiSSur9EmietstEniehttkkKSKyRHPUhOeU8S199ok8R1ONok6XG0SNLjaJGkx1EiaXyzqCeS9DjfJCmP9J4kPY4WSXocLZJCkgskJbeDZKnvSdLjaJGkx9EiSY+jRZIeR4skPY4SSeM7Rj2RpMc5fefV+N7QvWzoQ87ZCNmcsqFXOGdD9X/Ohnr+nE2kjbOXG81CbZy9qPbvPymRVs4ulBtIj66UG0hirpQbSDWulCtY5QbSdivlBpJrK+UGUmAr5QKJqr+Xi6WqIq0hXSkXS1VFWuq5Ui6Wqoq0InOlXCxVFWnh5Eq5WKoq0vrGlXKxVFWkZYgr5WKpqkirBVfKxVJVkRb1rZSLpaoirb1bKRdLVUVaIrdSLpaqirSSbaVcLFUVacHZSrlYqirSurCVcrFUVaTlWyvlYqmqSKusVsrFUlWRFkOtlIulqgRLVQmWqoq0jGylXCxVJViqSrBUVaTFbSvlYqmqSGvQVsrFUlWRloqtlIulqiKt6FopF0tVRVp4tVIulqqKtD5qpVwsVRVpGdNKuViqKtJqo5VysVRVpEVBK+ViqapIa3dWysVSVZFW2KyUi6WqIi2DWSkXS1VFWquyUi6Wqoq0oGSlXCxVFWnVx0q5WKoq0tKMlXKxVFWk9RMr5WKpqkiLHFbKxVJVkVYirJSLpaoiLRdYKRdLVUWK6V8pF0tVRQq8XykXS1VFCppfKRdLVUWKg18pF0tVRQptXykXS1UhRav/vVwoVZWwstUTVrZ6wspWT1jZ6s9isMqFUlUJK1s9YWWrJ6xs9YSVrZ4ipW+n761qGvM4R774bJX8x2erlBOQuDv2lEEKQeqAxN3epwwSd9WfMkjcvYDKIHHXfCuDxN3yrQsyUpr8XpC4O76VQdLZKIGks1kBOV5fuM56AlIIUgcknY0SSDobJZB0Nisg+wfIdgKSzkYJJJ2NDshIGx32gqSzUQJJZ6MEks5mBWR9/RaxtpPfIkbanLEXJJ2NEkg6GyWQdDZKIOlslEDS2eiAjLRVZS9IOhslkHQ2SiDpbJRACkHqgKSzUQJJZ6MEks5GCSSdjRJIOhsdkJE2G+0FSWejBJLORgkknY0SSCFIHZB0Nkog6WyUQNLZKIGks1ECSWejAzLSdrG9IOlslEDS2SiBpLNRAikEqQOSzkYJJJ2NEkg6GyWQdDZKIOlsdEBG2vC3FySdjRJIMQ2y51e1c+R+AfL56deH+8l7/sb31qmXa1uTqZdrWzmpl2tb36iXa1uFfKvc7935CxmXxrfcbYZjWy1shmN7trkZju155WY4QjjncAIpTX04gXTpffbt/MwfIAMp3r0gA2npvSBhVboySOMbFh2BhFX/2iBhnYI2SFhXoQ1SCFIHJKxb0QZJZ6MEks5GCSSdjRJIOhsVkNn4llNHIOlslEDS2SiBpLNRAikEqQOSzkYJJJ2NEkg6GyWQdDZKIOlsdEAmOhslkHQ2SiDpbJRA0tkogRSC1AFJ+bPyDszl8sdsfEGuH5DG15FaAXn5VlY2vo7UEUg+bJRAcoymBJJjNCWQHKMpgaSOXADZUvvjs63kE5DUkTogja8jdQSSYzQlkHQ2SiDpbJRACkHqgKSzUQJJZ6MEks5GCSSdjRJIOhsdkMbXkToCietsvnGO9GhyfOVPuUqp1U8ocb2NOkpcd6OOUohSCyWuw1FHietx1FHiuhx1lLg+51so50tWpvSoJyhxnY42SuMLSl2hpNtRQ0m3o4aSbkcNpRClFkq6ne+i/DSQ+xUl3Y4aSrodNZR0O+cvhRhfQroXjvHFopvh0GN8AYeu4Qs49AFfwBHCOYcTaR3TZex9Nr4iU73cSOuYFsqNtI5podxASnOhXOOrG9XLDaQGV8oNpO9Wyg2k2FbKFaxysVRVqCWXC+ViqapQSy4XysVSVZHWVq6Ui6WqIq2WXCkXS1VFWv+4Ui6Wqoq0onGlXCxVFWnd4Uq5WKoq0urAlXKxVFWkNXwr5WKpqkgr7VbKxVJVkdbDrZSLpaoirVpbKRdKVZVIa8tWyoVSVSXSCrCVcqFUVXkIVrlQqqpEWk21Ui6UqiqR1jytlIulqiKtTFopF0tVRVo/tFIulqqKtMpnpVwsVZWwVFXCUlWRtketlIulqjKWqspYqirSnq2VcrFUVaSdVSvlYqmqSPufVsrFUlWRdimtlIulqiLtJVopF0tVRdrxs1IulqqKtC9npVwsVRVp98xKuViqKtIel5VysVRVpJ0oK+ViqapI20VWysVSVcD7EL6zhFnyH5+tUk5AcuebEkjufFMCyZ1vOiCB9yAog+Q2ayWQ3GatBJLbrJVACkHqgOQ2ayWQdDZKIOlsVkCO1xeus56ApLNRAklnowMSeJ+CMkg6mxWQ/QNkOwFJZ6MEks5GCaQQpA5IOhslkHQ2SiDpbFZA1tdvEWs7+S1ipM0Ze0HS2eiAjLTtYy9IOhslkHQ2SiDpbJRACkHqgKSzUQJJZ6MEks5GCSSdjRJIOhsdkJE27uwFSWejBJLORgkknY0SSCFIHZB0Nkog6WyUQNLZKIGks1ECSWejAzLS1qu9IOlslEDS2SiBpLNRAikEqQOSzkYJJJ2NEkg6GyWQdDZKIOlsVEBKpM1ze0HS2SiBpLNRAklnowRSCFIHJJ2NEkjbOrKKvEC2OS5APrG/PtzLSbm21Z52ucb31qmXa1s5qZdrW9+ol2tbhXyr3O/d+dcZl2J8y91mOLbVwmY4tmebm+HYnlduhhNIO+rDCaQ01eEY3/x3I5zv2LfzM3+ADKR494IMpKX3goRV6doghSB1QMKqf22QsE5BGySsq9AGCetAtEHCuhVlkMa3bzoCSWejBJLORgkknY0SSCFIHZB0Nkog6WyUQNLZKIGks1ECSWejA9L4BlxHIOlslEDS2SiBpLNRAikEqQOSzkYJJJ2NEkg6GyWQdDZKIOlsdEAa333tCCSdjRJIOhslkHQ2SiCFIHVA0tkogaSz0QFpfEGuEZDXS8TF+IJcRyD5sFkBef12v/F1pI5A8mGjBJJjNCWQHKMpgeQYTQek8XWkRkC21P74bCv5BCR1pBJIjtGUQHKMpgRSCFIHJJ2NEkg6GyWQdDZKIOlslEDS2eiANL6O1BFIOhslkHQ2SiDpbJRACkHqgKSzUQJJZ6MEks5GCSSus/nGOZIcJJOU+nGOLr+JHdcH7cRufNVpWOy4HmsrdlxHpoT9AyWuJ1NHKUSphRLXl6mjxHVm6ihxvZk6SrozNZR0XEooq/G1qq5Q0hmpoaTbWUI5XhWmWtovKN98Oslr2phS/XTqXj+BpzfaBF4IXhu87ouM1fhSWLbo2SI6P/MtoqM03yI6VfMtogO23qJIy7GjtoiO3XyLOAkw3yLODMy3SNgi6y3idMF8izhdMN8iThfMt4jTBfMt4nTBeosypwvmW8TpgvkWcbpgvkWcLphvkbBF1lvE6YL5FnG6YL5FnC6YbxGnC+ZbxOmC9RYVThfMt4jTBfMt4nTBfIs4XTDfImGLrLeI0wXzLeJ0wXyL6Iu2tuh6c1gV+iLzLaKi29uiy00+TwRskfUWUdGZbxEVnfkW8fdF5lvE3xeZbxF90dYWXaeT1kpfZL5F/H2R+Rbx90XmW8TpgvkWCVtkvUWcLphvEacL5lvE6YL5FnG6YL5FnC5Yb1HjdMF8izhd0G/Rd75yehyp2il9TtX+lDHcOF9w0CROGBw0Sdgk+03ilMFBkzhncNAkThocNImzhs1NSv1oUm4nTeK0wX6TOucNDprEiYODJnHi4KBJnDg4aJKwSfabxInD5iYtbNrrnDg4aBInDg6axImDgyZx4mC/SYMTBwdN4sTBQZM4cfjBJn1g5wxhC3Yh9gXsz9+NHdhHusD+/GWbHNdMkRPwdPqbwNO9q4PP+cAh9QQ7/fgW7HTYW7DTM+/APumCt2Cnr92CnU5VH3utLxw9nWCnU92CXYh9B3b61C3Y6VK3YKdL3YKdLnULdrrUDdjbgy51C3a61C3Y6VK3YKdL3YJdiH0B+/NWeH3llvoF9pVf67UHfeom8HSqm8DTq24CT7e6CTz96h7wiY51E3h61k3g6Vo3gadv3QReCH4PeDrXTeDpXDeBp3PdBJ7OdRN4Otc94DOd6ybwdK6bwNO5bgJP57oJvBD8HvB0rpvA07luAk/nugk8nesm8HSue8AXOtdN4OlcN4Gnc90Ens51E3gh+D3g6Vw3gadz3QSeznUTeDrXTeDpXPeAFzrXTeDpXDeBp3PdBJ7OdRN4Ifg94OlcN4Gnc90Ens51E3g6103g6Vz3gK90rpvA07luAk/nugk8nesm8ELwe8DTuW4CT+e6CTyd6ybwdK6bwNO57gHf6Fw3gadz3QSeznUTeDrXTeCF4PeAp3PdBJ7OdRN4OtdN4OlcN4Gnc90DvtO5bgJP57oJPJ3rJvB0rpvAC8HvAU/nugk8nesm8HSum8DTuW4CT+e6B/ygc90Ens51E3g6103g6Vw3gReC3wOeznUTeDrXTeDpXDeBp3PdBJ7OdQ/4See6CTyd6ybwdK6bwNO5bgIvBL8HPJ3rJvB0rpvA07luAk/nugk8nesW8P1B57oJPJ3rJvB0rpvA07luAi8Evwc8nesm8HSum8DTuW4CT+e6CTyd6x7wic51E3g6103g6Vw3gadz3QReCH4PeDrXTeDpXDeBp3PdBJ7OdRN4Otc94DOd6ybwdK6bwNO5bgJP57oJvBD8HvB0rpvA07luAk/nugk8nesm8HSue8AXOtdN4OlcN4Gnc90Ens51E3gh+D3g6Vw3gadz3QSeznUTeDrXTeDpXPeAFzrXTeDpXDeBp3PdBJ7OdRN4Ifg94OlcN4Gnc90Ens51E3g6103g6Vz3gK90rpvA07luAk/nugk8nesm8ELwe8DTuW4CT+e6CTyd6ybwdK6bwNO5/ukcB5xGd/kFHDrAL+DQpX0Bh07qCzhCOOdw6Ei+gEPX8AUcKvsv4FB9fwGHCvkcTqdC/gJOIIU8x3h9ePaTcgNp3pVyA6nYlXIFq9xASnOl3EDacaXcQGpwpdxA+m6l3ECKbaHcEUiDrZSLpaoGlqoaWKpqCFa5WKpqYKmqgaWqBpaqGliqamKpqomlqiaWqppYqmoKVrlYqmpiqaqJpaomlqqaUKpqPKBU1Yi0x36lXChVNSLtbF8pV7DKhVJVI9JW8JVyoVTViLQBe6VcLFUVadvzSrlYqirSZuOVcrFUVaQtvivlYqmqSBtrV8rFUlWRtrOulIulqiJtIl0pF0tVRdq6uVIulqqKtGFypVwsVRVpm+JKuViqKtLmwJVysVRVpC15K+ViqapIG+FWysVSVZG2n62Ui6WqIm36WikXS1VF2mq1Ui6Wqoq0wWmlXCxVFWlb0Uq5WKoq0maelXKxVFWkLTQr5WKpqkgbV1bKxVJVkbaLrJSLpaoibdJYKRdLVUXaGrFSLpaqirQhYaVcLFUVaRvASrlYqipSqv5KuViqKlLy/Uq5WKoqUjr9SrlYqipSgvxKuViqKlLK+0q5WKoqUhL7SrlYqgorW31gZasPrGz1gZWtPrCy1QdWtvrAylYfWNnqAytbfWBlqw+sbPWBla0+sLLVB1a2+sDKVh9Y2eoDK1t9YGWrD6xs9YGVrT6wstUHVrb6wMpWH1jZ6gMrW31gZasPrGz1gZWtPrGy1SdWtvrEylafWNnq8yFY5UKpqomVrT6xstUnVrb6xMpWn1jZ6hMrW31iZatPrGz1iZWtPrGy1Wek9O3nqR//P3tvl+Y4ljNp7mgekcT5209vY/Y+qq6Q5DEVlI4ywTgwmPVVX3h50F7kJ5rB3Q3Pp97Hh+/9zXNs1h8Kt3LU13M0+9N37uP5nfcP37nY/utrix0nI0rkFZKOKFPLedYRJfJkWUeUyEdmHVEi75t1RKYRRR9RooyRdUSJts1ZR5RoQ551RNouhB+RtgtrR9Qfj1xG+fOIMl37yDoibRfCj0jbhfAj0nZh7Yjaa0T1ZESmEUUfkbYL4Uek7UL4EWm7EH5E2i6EH5G2C2tHVB6/AVTqyW8AZbp6lXVE2i6EH5G2C+FHpO1C+BGZRhR9RNouhB+RtgvhR6TtQvgRabsQfkTaLkQfUabrj1lHpO1C+BFpuxB+RNouhB+RaUTRR6TtQvgRabsQfkTaLoQfkbYL4Uek7UL0EWW6gpx1RNouhB+RtgvhR6TtQvgRmUYUfUTaLoQfkbYL4Uek7UL4EWm7EH5E2i5EH1HTdiH8iLRdCD8ibRfCj0jbhfAjMo0o+oi0XQg/Im0Xwo9I24XoI+q8uci3e7HzphdnkLwZwxkkbxJwBmkC6QOS11U7g+T1vs4geR2qM0jen1I5g+T9WZIvyKFk4wRSyWYG5OdK5KFk4wRSycYJpAmkD0glmxmQn0tGh5KNE0glGyeQSjZOIJVsPED+558WSB+QSjYeP0W8/9NKNk4glWycQJpA+oBUsnECqWTjBFLJxgmkko0TSCUbH5Cbko0TSCUbJ5BKNk4glWycQJpA+oBUsnECqWTjBFLJxgmkko0TSCUbH5C7ko0TSCUbJ5BKNk4glWycQJpA+oBUsnECqWTjBFLJxgmkko0TSCUbH5CHko0TSCUbJ5BKNk4glWycQJpA+oBUsnECqWTjBFLJxgmkko0TSCUbH5AW20ce7aFg2Lh9ADna4+/8RztO5MZ2e+5yjUtubOfkLje2v3GXG9uFfCX3u8/80Z/fepx9jsd2FovhxHYLa+GU2LvNxXBi7ysXw0nkHf3hJHKa/nCMFc438e38mV8gEznetSATeem1IGldujdIWkfvDZLW/TuDDH69HggkbarwBkmbQLxB0qYVb5AmkD4glWycQCrZOIFUsnECqWTjBFLJxgdk8MvZQCCVbJxAKtk4gVSycQJpAukDUsnGCaSSjRNIJRsnkEo2TiCVbHxABr99DQRSycYJpJKNE0jZn5m/gfl0/PEOUvbHB2Twc6RRQH7+q6zg50iBQOpl4wRSazQnkCaQPiC1RnMCKR85AbJu9dfX1mM/ASkf6QRSazQnkFqjuYDcgp8jBQKpZOMEUsnGCaSSjRNIE0gfkEo2TiCVbJxAKtk4gVSycQLJm2y+eI7/dHQ8v3PdXs/RthfK4AdJoVDypht3lLz5xh0lb8JxR2lC6YWSN+W4o+TNOV+h7Pb8zuM4QcmbdNxR8mYdd5RKO14ogx8phUKptOOGUmnHDaXSzpco7//KCUoTSi+USjtuKJV2Tv8oZAt+hHQxHCWSN3CUMc7hBD8AuhiOcsAbOHL2b+BkOsf0sfZ+C34i011upnNME3IznWOakJvIac7ITeQdZ+QmcoMTci2Rv5uRm8ixzcjNdORyQi6Xq0p15HJCLperSnXkckIul6vKdLZyRi6Xq8p0WnJGLperynT+cUYul6vKdKJxRi6Xq8p07nBGLperynQ6cEYul6vKdIZvRi6Xq8p00m5GLperynQebkYul6vKdGptRi6Xq8p0tmxGLperynQCbEYul6vKdE5rRi6Xq8p0mmpGLperynTmaUYul6vKdDJpRi6Xq8p0fmhGLperynTKZ0Yul6vqxiWXy1Vluh41I5fLVXUuV9W5XFWmO1szcrlcVaabVTNyuVxVpvtPM3K5XFWmW0ozcrlcVaa7RDNyqVzVnunGz4xcKle1Z7qXMyOXylXtN+OSS+Wq9kx3XGbkUrmqPdNNlBm5XK4q03WRGblcror4HsI3R5jt0eFf7DgBqZtvTiB1880JpG6+OYHUzTcnkLpm7QOS+AaCM0hds3YCqWvWTiB1zdoJpAmkD0glmxmQ/fGNyygnIJVsnEAq2TiBVLJxAqlkMwOyvUDWP4MkvtPgDFLJxgmkko0TSCUbJ5AmkD4glWxmQJbHY5R68lPETJcz1oJUsnECqWTjBFLJxgdkpgsla0Eq2TiBVLJxAqlk4wTSBNIHpJKNE0glGyeQSjZOIJVsnEAq2fiAzHQlaC1IJRsnkEo2TiCVbJxAmkD6gFSycQKpZOMEUsnGCaSSjRNIJRsfkJkuda0FqWTjBFLJxgmkko0TSBNIH5BKNk4glWycQCrZOIFUsnECqWTjAzLTtby1IJVsnEAq2TiBVLJxAhnbR+7744vHcYwPIEd7/J3/aCd/5x/8bp273NiezF1ubOfkLTf43Tp3ubFdyFdyv/vMn+i4DH7lbjGc2G5hMRwTnHM4sfeVi+Ek8o7+cBI5TX84iXzpdfHt/JlfIBM53qUgg18rBAJJ69K9QdI6em+QtO7fG6QJpA9I2lThDZI2gXiDpE0r3iCVbJxAKtm4gDyCXwwFAqlk4wRSycYJpJKNE0gTSB+QSjZOIJVsnEAq2TiBVLJxAqlk4wMy+NVeIJBKNk4glWycQCrZOIE0gfQBqWTjBFLJxgdk8AO5QUB+Pv54BD+QCwRSLxuXv8o6gp8jBQKpl40TSK3RnEBqjeYEUms0H5DBz5EGAVm3+utr67GfgJSPdAKpNZoTSK3RnECaQPqAVLJxAqlk4wRSycYJpJKNE0glGx+Qwc+RAoFUsnECqWTjBJI32XzxHNut7M/vXLfXc7TtB0oTSi+UvOnGHSVvvnFHyZtw3FHyZhx3lLwpxxtl8OOkYVB2e37ncZyg5E067ih5s447SqUdN5QmlF4olXbcUCrtuKFU2vkS5f1fOUGptOOGUmnHC2Xwg6VLUL7gKL+8gaNE8gaOMsYbOCY453CUA97AkbN/AyfTOaaPtfdH8BOZ7nIznWP6LDf4uUl3uYmc5ozcRN5xRm4iNzgj17jkJnJsM3IzHbmckMvlqlIduZyQy+WqUh25nJDL5aoyna2ckcvlqjKdlpyRy+WqMp1/nJHL5aoynWickcvlqjKdO5yRy+WqMp0OnJHL5aoyneGbkcvlqjKdtJuRy+WqMp2Hm5FL5aos06m1GblUrsoynS2bkUvlquxmXHKpXJVlOqc1I5fKVVmm01QzcrlcVaYzTzNyuVxVppNJM3K5XFWm80MzcrlcVaZTPjNyuVzVxuWqNi5Xlel61IxcLle1c7mqnctVZbqzNSOXy1Vlulk1I5fLVWW6/zQjl8tVZbqlNCOXy1Vluks0I5fLVWW68TMjl8tVZbqXMyOXy1Vluj0zI5fLVWW64zIjl8tVZbqJMiOXy1Vlui4yI5fLVRHfQ/jmCLM9OvyLHScgdfPNByTxLQRnkLr55gRSN9+cQOqatRNIE0gfkLpm7QRS16ydQOqatRNIJRsnkEo2MyD74xuXUf4MkvjugTNIJRsnkEo2TiCVbGZAthfIegLSBNIHpJKNE0glGyeQSjZOIJVsnEAq2cyALI+fIpZ68lPETJcz1oJUsnECqWTjBFLJxgmkCaQPSCUbJ5BKNk4glWycQCrZOIFUsvEBmel6zVqQSjZOIJVsnEAq2TiBNIH0Aalk4wRSycYJpJKNE0glGyeQSjY+IDNdkFoLUsnGCaSSjRNIJRsnkCaQPiCVbJxAKtk4gVSycQKpZOMEUsnGBWTJdMVtLUglGyeQSjZOIJVsnECaQPqAVLJxAqlk4wRSycYHZPC7dZs9nmNsvX8A6dsJUILfuFuKJrbXW4omtntbisaE5gxNbIe1FE1sz7QUTWwXtBRN7I3tUjSxd7Ar0QS/N7gUDasb/liMU4LfMVyKhtUNT6AxoTlDw+qGP9Z5lOB3F5eiYXXDE2hY3fAEGlY3/BlN8DuRS9GwuuHPP1EIfn9yKRpWNzyBxoTmDA2rG55Aw+qGJ9CwuuEJNKxueAINqxv+jCb4fc+laOSGT9HIDZ+ikRs+RWNCc4ZGbvgUjdzwKRq54VM0csOnaOSGz9AEv2C7FI3c8CkaueFTNHLDp2hMaM7QyA2fopEbPkUjN3yKRm74FI3c8Bma4FdPl6KRGz5FIzd8ikZu+BSNCc0ZGrnhUzRyw6do5IZP0cgNn6KRGz5DE/suYe/PX+/td0yeaD7/FV3sS4Nr0ZjQnKEJ7WvWognta9aiCe1r1qIJ7WvWognta5aiiX0nby2a0Fu+tWjkhk/RsLrhz38CH/ve3Fo0rG54Ag2rG55Aw+qGP/8xc+y7bWvRsLrhz2hi31Zbi4bVDU+gYXXDE2hY3fDnnyjEvlG2Fg2rG55Aw+qGJ9CwuuEJNKxueAINqxv+iKbGvse1Fg2rG55Aw+qGJ9DIDZ+iMaE5QyM3fIpGbvgUjdzwKRq54VM0csNnaGJfFVuLRm74FI3c8CkaueFTNCY0Z2jkhk/RyA2fopEbPkUjN3yKRm74DE3sq2Jr0cgNn6KRGz5FIzd8isaE5gyN3PApGrnhUzRyw6do5IZP0cgNn6GJfVVsLRq54VM09tfRuP6tW11wxclZQEUX0NAFdHQBA1zAghtAzgI2dAE7uoADXQD6m9hiv4k//ilrtdhv4gkBsd/EEwJiv4knBMR+E3/8Y7laYr+JJwTEfhNPCIj9Jp4QEPtNPCEg9pt4QkDsN/HnrUSJ/SaeEBD7TTwhIPabeEJA7DfxZwE19pt4QkDsN/GEgNhv4gkBsd/EEwJiv4knBKC/iSv6m7iiv4kr+pu4or+JG/qbuKG/iRv6m7ihv4kXtMg7C0B/Ezf0N3FDfxM39DdxQ38Td/Q3cUd/E3f0N3FHfxMvaLB2FoD+Ju7ob+KO/ibu6G/ijv4mHuhv4oH+Jh7ob+KB/ib26UHdHs+0b9U8BXz+jS2fttKVAjq6gIEtoPn0c64UsKEL2NEFHOgCDF1AQRcA/iZut9hv4o+/+Npusd/EEwJiv4k/C9hiv4knBMR+E3/8tcu2xX4TTwiI/SaeEBD7TTwhIPabeEJA7DfxhIDYb+KPW4m2xX4TTwiI/Sb+LGCP/SaeEBD7TTwhIPabeEJA7DfxhIDYb+IJAbHfxBMCYr+JJwSgv4l39Dfxjv4mPtDfxAf6m/hAfxMf6G9in4anlQLQ38QH+pv4QH8TH+hv4gP9TWzob2JDfxMb+pvY0N/EPg1PKwWgv4kN/U1s6G9iQ38TG/qbuKC/iQv6m7igv4kL+pvYp+FppQD0N7FLv9DNykPAbdw8BXz+jS2XfqGVAlz6hZYK2NAF7OgCDnQBhi6goAuo6AIaugD0N3GN/Sb+/IuvLfabeEJA7DfxhIDYb+IJAbHfxJ9/7dKlX2ipgNhv4gkBsd/EEwJiv4knBMR+E08IiP0m/ryV6LHfxBMCYr+JJwTEfhNPCIj9Jp4QEPtNPCEg9pt4QkDsN/GEgNhv4gkBsd/EEwLQ38QD/U080N/EA/1NPNDfxAP9TTzQ38QD/U080N/EA/1NPMDfxP0G/ibuN/A3cb+Bv4n7DfxN3G/gb+J+A38T9xv4m7jfwN/E/Qb+Ju439Dfxhv4m3tDfxBv6m3hDfxO7NDwtFYD+Jt7Q38Qb7pt47+3/Ofs/4f74Raltu43X4+/7f/+H4//Z/9wMdXfnv/6HY9hvsp//u/HP/nd/7kGa+N9t//B/t//D/93xD/939g//dw4fAduoj39mG71++A+wbvXXF9dj/9//qP7zTDXgM7WAz9QDPtO49pke/45Hm8rUv7P9pX9n/0v/zvGX/h37S/9O+Uv/Tv1L/077S/9O/0v/zl8Puv/5LezH995v/fXVfXs+ld1CPlXoSNpae37t8cfPfgudSCeeP3QgnXh+A3/+0HF04vlDp9GJ5w8dRieeP/RWeOL5Qy+FPz9/Cb0Tnnh+8PdvAX//FvD3r0uTw8rnB3//FvD3bwF//8bu0Zh4fvD3b+wWjYnnB3//xu7QmHh+8Pdv7AaNiecHf/8Ctzf89/lxa5T+7/MHbw54/8Pk/zw/7i+E/Pf5Q3/+TDw/7q+D/Pf5cX8b5L/Pj/zLIP95/tCf/59/dh27MuDz88duDJh4/tD+f+L5Q79/J54/9Pt34vlDv38nnj/0+3fi+UO/fyeeP/T7d+L5wd+/sYsCPj9/7J6Aief/++/f053C/37tto2HAd322w8H+uM3aBb0BHgrOOAVGLyCAq+gwito8Ap6HAXPZxrhnum4/fUbINu2Px5q2+zH72Ju9nqqLeRThb7WMTHr0Mc6Jp7fwJ8/9KmOiecPfTNr4vlDn8yaeP7QF7Mmnj/0wazPz7/dwJ8/9LmsiecHf/9u4O9fl7+4X/n84O/fDfz9u4G/fzfw9+8G/v7dwd+/O/j7dwd//+7g798d/P27g79/d/D37w7+/t3B3787+Pv3AH//HqE//z/+hvFxhP78n3h+3JP1/31+3Iv1/31+3IP1//f5Dfde/X+fH/dc/X+fH/da/X+fP/Tn/8ffEDos9Of/xPOH9v8Tzx/a/088f+j378Tzh37/Tjx/6Pfv5+cvod+/E88f+v078fyh378Tzw/+/nVpGFn5/ODv3/L337/f/Fbirb9+g+z24zfzfvwGWWnwCjq8goGuoN7gFWzwCnZ4BUdsBc84f1ew/abgD995PL/zz8b73l9qjUptoVIb2xf89pvlJ/+3GNsXzCiI7QtmFMT2BRMKWmxfMKMgti+YURDbF8woiO0LJv5Ox6UJaK2C2O/vGQWB3snPZwr0ln0+k8t7czwuQex72T8801aeZyOK/fmZRrxncmnX+eqZfH/3xKVdZ+Xz7+DPf4A/v4E/fwF//gr+/A38+Tv48w/s5x/g798B/v4d4O/fAf7+denVWfn84O/fAf7+HeDv3wH+/h3Y71+7Yb9/7Yb9/rUb9vvXbtjvX7thv3/thv3+tRv2+9du2O9fu2G/f+0G/v7dwN+/G/j7dwN//27g71+f7p+Fzw/+/t3A378b+Pt3A3//buDv3x38/buDv3938PfvDv7+9en+Wfj84O/fHfz9u4O/f3fw9+8O/v49wN+/B/j79wB//x7g71+f7qWFzw/+/j3A378H+Pv3AH//HuDvXwN//xr4+9fA378G/v716b5a+Pzg718Df/8a+PvXwN+/Bv7+LeDv3wL+/i3g798C/v716b5a+Pzg798C/v4t4O/fAv7+LeDv3wr+/q3g798K/v6t4O9fn/6qhc8P/v6t4O/fCv7+reDv3wr+/m3g798G/v5t4O/fBv7+9emUWvj84O/fBv7+beDv3wb+/m3g71/w/isD778y8P4rA++/MvD+KwPvvzLw/isD778y8P4rA++/MvD+KwPvvzLw/isD778y8P4rA++/MvD+KwPvvzLw/isD778q4P1XBbz/qoD3XxXw/qtyw37/FvD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgPdfFfD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgPdfFfD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgPdfFfD+qwLef1XA+68KeP9VAe+/KuD9VwW8/6qA918V8P6rAt5/VcD7rwp4/1UB778q4P1XBbz/qoD3XxXw/qsC3n9VwPuvCnj/VQHvvyrg/VcFvP+qgvdfVfD+qwref1XB+6/qDfv9W8H7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rCt5/VcH7ryp4/1UF77+q4P1XFbz/qoL3X1Xw/qsK3n9VwfuvKnj/VQXvv6rg/VcVvP+qgvdfVfD+qwref1XB+68qeP9VBe+/quD9VxW8/6qC919V8P6rBt5/1cD7rxp4/1UD779qN+z3bwPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvGnj/VQPvv2rg/VcNvP+qgfdfNfD+qwbef9XA+68aeP9VA++/auD9Vw28/6qB91818P6rBt5/1cD7rxp4/1UD779q4P1XDbz/qoH3XzXw/qsG3n/VwPuvOnj/VQfvv+rg/Vcd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yXzuK3pn+xWS+dxX9N72KyTzua/oPe9XSOZzX+E75C+QzOe+wvfIXyCZz32F75K/QDKf+wrfJ3+BZD73Fb5T/gLJfO4rfK/8BZL53Ff4bvkLJPO5r/D98hdI5nNf4fvoL5DM5774uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq77g6/r/uDruj/4uu4Pvq574+u6N76ue+Pruje+rnu7GZ9kOvdlfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdW98XffG13VvfF33xtd1b3xd98bXdV/4uu4LX9d94eu6L3xd9+VmfJLp3Ffh67ovfF33ha/rvvB13Re+rvvC13Vf+LruC1/XfeHrui98XfeFr+u+8HXdF76u+8LXdV/4uu4LX9d94eu6L3xd94Wv677wdd0Xvq77wtd1X3K1oI+2//rq0X7/3i/Bqd7KM4JTfVqP3h+CRzsRnOqzekZwqk/qGcGpPqdnBKfKyDOCUyXkCcG5+rBnBOd6D08ITpWNZwSnSsYzgo1NMJvTQu7AfokAdk8vEcEdUTtuzwfp9uk/vf8U1/768v8Ux/05qkfvqb5AcvSe6iskB/dFV0gO7oyukBzcG10h2fgkB/dHV0gO7pCukBzcT10hmc99Re+pvkBy9J7qKyTzua/oPdVXSOZzX9F7qq+QzOe+ovdUXyGZz31F76m+QjKf+4reU32FZD73Fb2n+grJfO4rek/1FZL53Ff0nuorJPO5r+g91VdI5nNf0Xuqr5DM576i91RfIZnPfUXvqb5CMp/7it5TfYVkPvcVvaf6Csl87it6T/UVkvncV/Se6isk87mv6D3VV0jmc1/Re6qvkMznvqL3VF8hmc591eg91VdIpnNfNXpP9RWS6dxXvRmfZDr3VaP3VF8hmc591eg91VdI5nNf0Xuqr5DM576i91RfIZnPfUXvqb5CMp/7it5TfYVkPvcVvaf6Csl87it6T/UVkvncV/Se6isk87mv6D3VV0jmc1/Re6qvkMznvnY+97Xzua/obeRXSOZzXwef+zr43Ff0VvLvJH8u2q/RW8ndBUfvrP5S8Mf61xq9s9pfcKpP6hnBqT6nZwQbm+BUCXlGcK738ITgXO/hCcGpsvGM4FTJeEJwrh7sGcFsTgu5A/slAtg9vURYbBG9788HGW18+E9vO8ZT8zHGn6N69J7qKyQHd0VXSA7ui66QHNwZXSE5uDe6QHL0nuorJAf3R1dIDu6QrpAc3E9dIdn4JPO5r+g91VdI5nNf0Xuqr5DM576i91RfIZnPfUXvqb5CMp/7it5TfYVkPvcVvaf6Csl87it6T/UVkvncV/Se6isk87mv6D3VV0jmc1/Re6qvkMznvqL3VF8hmc99Re+pvkIyn/uK3lN9hWQ+9xW9p/oKyXzuK3pP9RWS+dxX9J7qKyTzua/oPdVXSKZzXy16T/UVkuncV4veU32FZDr31W7GJ5nOfbXoPdVXSKZzXy16T/UVkvncV/Se6isk87mv6D3VV0jmc1/Re6qvkMznvqL3VF8hmc99Re+pvkIyn/uK3lN9hWQ+9xW9p/oKyXzuK3qD8XeSPxcHtuj9xe6Co/fafin4Y51Ni95q6y841Sf1jOBUn9Mzgo1NcKqEPCM413t4QnCu9/CE4FTZeEZwqmQ8ITh6J7W/YDanFb2T+p3glwhg9/QSYaFFbLftKWK7le3Df3rlKbn0/vre+/ZDcGxHdIHg2I7oS8Gtj+f33j987/PneMGJ7Z4Ww4nttBbDie3K1sIJ3nW9GE5st7cYTmxnuBhObMe5GI4JzjmcVK7XG44c8hs4cshv4Mghv4Ejh3wOJ3jf+WI4cshv4Mghv4Ejh/wGjgnOORw55Ddw5JDfwJFDfgNHDvkNHDnkczjBO+kXw5FDfgNHDvkNHDnkN3BMcM7hyCG/gSOH/AaOHPIbOHLIb+DIIZ/DCX43YDEcOeQ3cOSQ38CRQ34DxwTnHI4c8hs4cshv4Mghv4Ejh/wGjhzyOZzgtx0Ww5FDfgNHDvkNHDnkN3BMcM7hyCG/gSOH/AaOHPIbOHLIb+DIIZ/C6cHvbyyGI4f8Bo4c8hs4cshv4JjgnMORQ34DRw75DRw55Ddw5JDfwJFDPocT/EbKYjhyyG/gyCG/gSOH/AaOCc45HDnkN3DkkN/AkUN+A0cO+Q0cOeRzOMHv2CyGI4f8Bo4c8hs4cshv4JjgnMORQ34DRw75DRw55Ddw5JDfwJFDPocT/HbYYjhyyG/gyCG/gSOH/AaOCc45HDnkN3DkkN/AkUN+A0cO+Q0cOeRzOMFvvi2GI4f8Bo4c8hs4cshv4JjgnMORQ34DRw75DRw55Ddw5JDfwJFDPoejm3rv4Mghv4Ejh/wGjhzyGzgmOOdw5JDfwJFDfgNHDvkNHDnkczi8x7+KPS/d2xkc2lf5DBzaD+RS+gNObSdwaD+QZ+DQfiDPwKFdWUzA4T3hNAOHdmUxA4fW59St/vraeuwncGh9zgwcE5xzOLQrixk4tA55Bg6tQ56BQ+uQZ+DQOuQJOLwnnGbg0DrkGThyyG/gyCG/gWOCcw5HDvkNHDnkN3DkkN/AkUN+A0cO+RxOshNO33zvWh970vv/d7y++ug/8OTyyO54crlkdzy5fLI7HhOed3hyeeVvvne7PV5cW2u/4/nDz7v687czen997b79QJnLWS9FmcuHL0WZy7UvRZnL4y9EOZKdrFqKkjc9uKPkTRruKHlTiTtKE0ovlEo7biiVdtxQKu24oVTacUOptOOFMtn5saUolXbcUCrtuKFU2nFDaULphVJpxw2l0o4bSvnKOZTl8Ts4pW1/RpnsaNdSlHqDe/0feLKzTktR6g3uhlJvcDeU2le6odS+8g8oX3jkFd/hSXaSyh0P8a5wPH/1sx9neIj3fzN4iBPBDB4Tnnd4iJ37DB5iNz6Dh9dh96dp3ob13/D8I4ed7JzVUpS8btwbZbJTWUtR8rp8d5S8icAdJW96cEdpQumFkjeVuKPkTTDuKJV23FAq7bihVNrxQpns7NlSlEo7biiVdtxQKu24oTSh9EKptOOGUmnHDaXSjhtKpR03lEo7Xiir0o4bSqUdN5RKO24olXbcUJpQeqFU2nFDqbTjhTLZ+cjrUH7+E8VkxyaXotRrx+3/wPXacUOp144bSi3Z3FBqyeaGUku2P6B84kl2SNEdj/zfWzy8C65RH1+83+We4OFdWk3hMeF5h4fX5U/h4XXuU3h43fgUHlqHfX+67Yln2G94/uCwqz0d9o+vvY0fKGkdtjtK3qON/ihpnbs/SlqX74+SNhH4ozSh9EJJmzT8UdKmEn+UtAnGH6XSjhtKpR0flOXGe5DSH6XSjhtKpR03lEo7bihNKL1QKu24oVTacUOptOOGUmnHDaXSjhdK3oOU/iiVdtxQKu24oVTacUNpQumFUmnHDaXSjhtKpR03lEo7biiVdrxQ8p5J9UeptOOGUmnHDaXSjhtKE0ovlEo7biiVdtxQKu24oVTacUOptOOFkvcosD9KpR03lEo7biiVdtxQygzNofxUqXZHKTPkhZL3ouWXKD81Lt1R6rXjhlKvHTeUJpReKLVkc0OpJdsfUL7wyCu+xSP/9xYP74Jr255PvdkJHt4LkXN4eBPBFB5elz+Fh9e5T+Ex4XmHh9dhb708n9rGb3j+0bqR94qiP0peN+6Okte5u6MkdvnOKHmvKPqjJE4P3iiJk4Y3SuJU4o3ShNILpdKOG0qlHTeUSjtuKJV23FAq7Xih5D2T6o9SaccNpdKOG0qlHTeUJpReKJV23FAq7bihVNpxQ6m044ZSaccLJe+hX3+USjtuKJV23FAq7bihNKH0Qqm044ZSaccNpdKOG0qlHTeUSjteKIkPKbujVNpxQ6m044ZSaccNpQmlF0qlHTeUSjtuKJV23FAq7bihVNpxQrkRH1J2R2lCOYXyY6XaRnxn1R2lXjtzKD82Lm3EFy29URJftHRHqSWbG0ot2dxQasn2B5QvPCY87/DI/73Fw7vg2mt/PPVxu53g4V1aTeHhTQRTeHhd/gwe4uuMU3h43fgUHl6HfewvPFZP8PC65ik8Jjzv8PC65ik8vK55Cg+va57Cw+uaj/H41rtZ/w3PH3ZD+3M3dJQfCn/8oIz4eqA3SuLrge4oeZ27O0pil++NkjgReKM0ofRCSZw0vkL5+q2h1k5QEqcSb5TECcYbpdKOG0qlHS+UprTjhlJpxw2l0s63KM9+hZr4aK07ShNKL5S8aceev+m3l+PTrwX2J5C+/bxOVn6g5E077ih50447St60446SN+14oyQ+suuOkjftfIfSHmaol3aCkjftuKPkTTvuKE0ovVAq7bihVNpxQ6m0M4eyPX6VrY/tBKXSjhtKpR0vlMQHhN1RKu24oVTacUOptOOG0oRyBuXYHhLHXk9QKu24oVTacUOptOOGUmnHDaXSjhdK4gPC7ih5006pt8dT19v2AeV2f6s8H6T++LUY+/FXjsQnhC+AyZt4LoBpgukHkzf1fAdz3x4/mdj23n6D+b9fPVGLR3x2eDF43kS1GDxv/loMnjetrQVPfC55MXglwUXglRoXgVfCXATeBH4NeCXXReCVXBeBV3JdBF7JdRF4Jdc14IlPXy8Gr+S6CLyS6yLwSq6LwJvArwGv5LoIvJLrIvDy8VeA/3jzdSc+6rwYvFzNko+a/WYCvwa8XM0i8HI1i8BrH78IvPbx/xr8C6a8uR9M4mv2F8DULnwO5nGrjwc57Aym9tuOMJXuHGGaYPrBVApzhKlk5QhTaWkSZntsFzcrt99g/uGrmz3Rd/vxJHb7gV55aRl6patV6HdlsWXoldyWoVfOW4ZeqXAZehP6VeiVOJehVz5dhl5pdhl6pdll6JVmV6E/lGaXoVeaXYZeaXYZeqXZZehN6FehV5pdhl5pdhl6pdll6JVml6FXml2F3pRml6FXml2GXml2GXql2WXoTehXoVeaXYZeaXYZeqXZZeiVZpehV5pdhb4ozS5DrzS7DL3S7DL0SrPL0JvQr0Ivc3kB+okysyJruQZ81Sv2CvCfG4aqXrCLwOv1ugi8VsWLwGtRvAi81sT/GvwLpry5I0z57TmYZXto3Errnz4S9udHwlF+8Bgv8E2L3EXgtcZdBF4JcxF4JcxF4E3g14BXwlwEXgnzCvDVnuvbdgJeCXMReKXRReCVXNeA70qui8AruS4Cr+S6CLyS67Xgu52AN4FfA17JdRF4Jdc58PVFpP54jpNftiv2PL5Tys+6/h+/bNeVXZehV3pdhl75dRX6oQS7DL0y7DL0SrGXoH/+bvXdiO4n6JVjl6E3oV+FXll2GXql2WXolWaXoVeavQK9jdsTff/dXP6jVdtQ8gUY03FTSoYYkxL1FWOq7fXVP9H/eN8cNyXqZeiVqJehN6FfhV6Jehl6Jepl6JWol6FXor4EfX9WENUxTtArJa9Cvyn5LkOvNLsMvdLsMvRKs8vQm9CvQq80ewn67fEgW9t+9/X/aMG8KflCjEkpGWJMStRXjKnfnj9V++1JfnvfKFGvQr8rUS9Dr0S9DL0S9TL0StTL0JvQr0KvRH0J+q080e/9BL1S8jL0Sr7L0CvNLkOvNLsK/aE0uwy90uwy9EqzV6B/c47sHy2YDyVfiDGZxoQwJt5EXY/nU99/mv9xTNvz7zPrTyLtz/8JPF43+897dPXn24Y3Ty8Gz5umF4PnzdKLwfMmaTfwT5jGm40vgMmbdi+AyZtfL4DJmzIvgGmC6QdTic0RplKYI0wlq0mY4/kg7VZ+g/m/X123x8anHvufDb4pWS0Cr2R1Afh9f35rK38GX5TCFoFXYlsEXuluEXglwUXgTeDXgFfCvAL850V9URpdBF7JdQ582/sTvG3/PkAVJddF4JVcLwA/8XKtSq6LwCu5LgKv5LoIvJLrIvAm8GvAK7leAf5zgKpKrovAK7lOgq/PH2C3/umXKicCVFVyXQReyfUC8BMv16bkugi8kusi8Equi8AruS4CbwK/BryS6xXgPweopuS6CLyS6xz4fns29Pb99u8DVFNyXQReyfUC8BMv167kugi8kusi8Equi8AruS4CbwK/BryS6xXgPweoruS6CLyS6z8A334D/4KpNOoIUwnTD+ZQapyE2ewJs7f/91/vSYZS4yLwSo0XgJ/w0EOpcRF4E/g14JUaF4FXalwEXqlxEXglzCvAf96TDKXRJeDtpuQ6Cb5sL/D9A/hxPH4BZtQfF9/7n762lcefebTxo3l//zEjhdz4M1Iejj8jRef4MzLNKPyMFMjjz0jZPf6MFPPjz0gbgfgz0vIg/Iw27Rniz0h7hrkZDXs+yCj/vhveNi0PFoHXRuAC8J9/0GKbCfwa8Mrui8ArkC8Cr5S9CLyi8yLwysNXgP/8w/RdIXcReCXXReCVXBeBV3KdBN9vj6++ffyLvndf/UJvQr8KvdLrBehbH8/n2D88x/kzv4akpAswJKVigCEpQQMMSWk7/pAOJXOAISnFAwxJiR9gSNoOAAzJNKT4Q9LGAWBI2jgADEkbB4AhaeMAMCRtHOIPybRxABiSNg4AQ9LGAWBI2jgADMk0pPhD0sYBYEjaOAAMSRsHgCFp4wAwJG0c4g+paOMAMCRtHACGpI0DwJC0cQAYknLS4iGV5x8e3X9wdDIk5aT4Q6pyd6uH9CxQKrWdDEnuDmBIcncAQ5K7AxiSaUjxh6SfJwEMSTlp8ZAm2gKrchLAkPTzJIAh6edJ8YfUtHEAGJI2DgBD0sYBYEjaOAAMyTSk+EPSxgFgSNo4AAxJGweAIWnjADAkbRyuGNIXz/FqwP2tALfW15C6Ng4AQ9LGAWBI2jgADEkbB4AhmYYUf0jaOAAMSRuH1UMqj68d7XYyJG0cAIakjQPAkLRxiD+koY0DwJC0cQAYkjYOAEPSxuGvDukF3gR+DXhtBhaBV9pfBF4JfhF4pfJF4JW0l4AvN5L0/BJMkkRfgklS3UswSUJ6CTY2wSSJ4CWYxIm/BEd3wM+v3u7/b3wQ/PmXG8stuvN0Fxzd8X0l2LdzrWzRXdlSONEd3FI40d3eUjjRneFSOCY453CiO86lcKK706VwUjlZbzipXK83HDnkczi7HPIbOHLIb+DIIb+BI4f8Bo4JzjkcOeQ3cOSQ38CRQ34DRw75DRw55HM4hxzyGzhyyG/gyCG/gSOH/AaOCc45HDnkN3DkkN/AkUN+A0cO+Q0cOeRzOCaH/AaOHPIbOHLIb+DIIb+BY4JzDkcO+Q0cOeQ3cOSQ38CRQ34DRw75HE6RQ34DRw75DRw55Ddw5JDfwDHBOYcjh/wGjhzyGzhyyG/gyCG/gSOHfA6nyiG/gSOH/AaOHPIbOHLIb+CY4JzDkUN+A4fW55Rnuf3951MncGh9zgSc8Pdvr4NT+gNObSdwaN9WM3Bo31YzcGjfVjNwaPc5M3Bo9zkzcGh9zkTzUvg7mivhhL9fuRQO7T5nBg6tQ56BQ+uQZ+CY4JzDoXXIM3BoHfIMHFqHPANHDvkNHDnkczjh760thSOH/AaOHPIbOHLIb+CY4JzDkUN+AyeXQ/7me5fyLOW//5zh9dX2R42lPCS27QRlLj+9FGUu970UZS6vvhBlDX8LagnKF55c3t4dTy53744nl793x2PC8w5PLo/vjkcu/y0eOfe3eHjdeN0faXurPzT+2UJ+jts12VWvlSiT3QC7DOW+PyVaOUHJ69zdUfK6fHeUvInAHaUJpRdK3qThjpI3lbij5E0w36H8vOVNdnNtKUritFPLE2Xr/z7tJLvnthQlcdr5BuXEayfZrbilKInTjjdKE0ovlMRpxxslcdrxRkmcdrxREqedr1B+TjvJru2tRJnsNt9SlEo7bih50067PWL11srtA8qtPCRuxU5Q8qYdd5QmlDMofaviarJrhTDYeVPUUuy8iWspdt50thQ7b5JbiT3ZvUkY7LwJcSl2pckl2JU8l2A3YV+BXSl1CXal1CXYlVKXYFdKXYJdKXUF9mQ3X2GwK6Uuwa6UugS7UuoS7CbsK7ArpS7BrpS6BLtS6hLsSqlLsCulrsCe7O4yDHal1CXYlVKXYFdKXYLdhH0FdqXUJdiVUpdgV0pdgl0pdQl2pdQV2JtS6hLsSqlLsCulLsGulLoEuwn7CuxKqUuwK6Uuwa6UugS7UuoS7EqpK7B3pdQl2JVSl2BXSl2CXb7dHXuxx3GrYmfY5duXYJeT8cde+gN7bX/GPuRklmCXk1mCXU5mCXbt25dgN2FfgV2+3R37xBGXId++BLv27Uuwa9++BLtS6gLs7aaUugS7UuoS7EqpS7ArpS7BbsK+ArtS6hLsSqlLsCulLsGulLoEu1LqCuybUuoS7EqpS7ArpS7BrpQ6h/2L77zvx+3F4/XV27CvvvNrSKYhxR+SEjDAkJSXAYakdP1Xh/QCr3y9CLwS9hrwuzL2IvBK2YvAK2cvAq+kvQi8Cfwa8ErEi8Ar5S4Cr+R6Afj+BH9s9Tfwf3gO6/Z4jnL8+Op6/BiTci7EmJSKF4/Jt4KgHUrbyQaqFJ9soNoOJBuotg7JBmoaaK6BakuSbKDaviQbqLY6yQaq/U+ygWpTlGugpk1RsoFqU5RsoNoUJRuoNkXJBmoaaK6BalOUbKDaFCUbqDZFyQaqTVGygWpTlGugRZuiZAPVpijZQLUpSjZQbYqSDdQ00FwD1aYo2UC1KUo2UG2Kcg20KocCDfTzBclWlUOTDdQ0UKCBfryM1qpcbrKByuUmG6hcbrKB6uehyQaqn4fmGmhTDgUa6ERDe1MOTTZQ/Tw02UD189BkAzUNNNdAtSlKNlBtipINVJuiZAPVpijZQLUpyjXQrk1RsoFqU5RsoNoUJRuoNkWrB/rNM9uT9FZuJyXl3TTSbCPVtijdSLUvSjdSbYzSjVQ7o3Qj1dYo20iH9kaoI/3x1b+PVJujdCPV7ijdSLU9Qhpp2cpzpHs/GalppNlGqu1RupFqe5RupNoepRuptkfpRqrtUbKR9pu2R6gjPcrJSLU9SjdSbY/SjVTbo7AjfQ3JNKT4Q9KGx39Ix9afQyr2YUibdXt94NWTDzxtbSDGpE3M4jH5NmH2m/YwyQaqLUyugW7awSQbqDYwyQaq/UuygWr7kmygpoHmGqi2OskGqv1PsoFqU5RsoNoUJRuoNkW5BrprU5RsoNoUJRuoNkXJBqpNUbKBmgaaa6DaFCUbqDZFyQaqTVGygWpTlGyg2hTlGuihTVGygWpTlGyg2hQlG6g2RckGahporoFqU5RsoMqhQAMttv/62mJnA1UOzTVQk8tFGujHg+bd5HKTDdQ00FwDlctNNlD9PDTZQPXz0GQDVQ4FGujny4DdlENzDbTo56HJBqqfhyYbqDZFyQaqTVGygZoGmmug2hQlG6g2RckGqk1RsoFqU5RsoNoU5Rpo1aYo2UC1KVo90G+eeeLmda/aFaUbqbZF6UZqGmm2kWpjlG6k2hmlG6m2RulGqr0R6kh/fPXvI9XmKNtIm3ZH6Uaq7RHSSGduXjdtj9KNVNujdCM1jTTbSLU9SjdSbY/SjVTbo3Qj1fYIdaRHORmptkfZRtq1PUo3Um2Pwo70NSTtgwCGpA3PBUMq9TmkUT8MaeyPX8scbfuhr/4YkmlI8YekLcziITm3YHbtYJINVBuYZAPV/iXZQLV9yTXQod1LsoFq85JsoNrSJBuoNjrJBmoaaK6BalOUbKDaFCUbqDZFyQaqTVGygWpTlGqg46ZNUbKBalOUbKDaFCUbqDZFyQZqGmiugWpTlGyg2hQlG6g2RckGqk1RsoFqU5RroJs2RckGqk1RsoFqU5RsoNoUJRuocijQQIvtv7622NlAlUNzDXSXy0Ua6Mdj5mOXy002ULncZAOVy002UNNAcw1UPw9NNlDlUKCBfr4KOHbl0GQD1c9Dkw1UPw/NNdBDm6JkA9WmKNlAtSlKNlBtipIN1DTQXAPVpijZQLUpSjZQbYqSDVSbotUD/eI7j+evoIzy88pC/TFQbYpyDdS0KUo2UG2Kkg1Um6JkA9WmKNlATQPNNVBtipAGWh5fO9rtZKDaFCUbqDZFyQaqTVGygWpTlGugRZuiZAPVpijZQLUpCjvQ15C0/QEYkmlI/kMazzvVtm0fhrTv9Xh99f7bV7/GpD0NxJi0fVk+pteUyslHnjYqAEPSlgRgSNp8xB9S1TYDYEjaUAAMSVuH1UMq5fHFbTsZkrYOAEMyDSn+kLRzABiSNg4AQ9LGAWBI2jgADEkbh/hDato4AAxJGweAIWnjADAkbRwAhmQa0r8b0gul9gJuKJXe3VAqY7uhVBJ2Q6m86oWyK1W6oVT2c0OphOaGUjnKDaUJpRdKpR03lEo7f0D5wkOcYNr+xNPbh//S7k9izwc57OS/NeIM4w+TOMW4wxzEOcYfJnGS8YdJnGX8YRKnGX+YJph+MIkTjT9M4kzjD1MJyBGmEpAjTCUgL5j1dlMCcoSpBOQIUwnIEaYSkCNME0w/mEpAjjCVgBxhKgE5wlQCcoSpBOQHc1MCcoSpBOQIUwnIEaYSkCNME0w/mEpAjjCVgBxhKgE5wlQCcoSpBOQHc1cCcoSpBOQIUwnIEaYSkCNME0w/mEpAjjCVgBxhKgE5wlQCcoSpBOQH81ACcoSpBOQIUwnIEaYSkCNME0w/mEpAjjCVgBxhKgE5wlQCcoSpBOQH05SAHGEqATnCVAJyhKkE5AjTBNMPphKQI0wlIEeYSkCOMJWAHGEqAfnBLEpAjjCVgBxhKgE5wlQCcoRpgukHUwnIEaYSkCNMJSBHmEpAjjCVgPxgViUgR5hKQI4wlYAcYSoBOcI0wfSDqQTkCFMJyBGmEpAjTCUgR5hKQH4wmxKQI0wlIEeYSkCOMJWAHGGaYPrBVAJyhKkE5AhTCcgRphKQI0wlID+YXQnIEaYSkCNMJSBHmEpAjjBNMP1gKgE5wlQCcoSpBOQIUwnIEaYSkB/MoQTkCFMJyBGmEpAjTCUgR5gmmH4wlYAcYSoBOcJUAnKEqQTkCFMJyA3mnZpg+sFUAnKEqQTkCFMJyBGmCaYfTCUgR5hKQI4wlYAcYSoBOcJUAvKDuSkBOcJUAnKEqQTkCFMJyBGmCaYfTCUgR5hKQI4wlYAcYSoBOcJUAvKDuSsBOcJUAnKEqQTkCFMJyBGmCaYfTCUgR5hKQI4wlYAcYSoBOcJUAvKDeSgBOcJUAnKEqQTkCFMJyBGmCaYfTCUgR5hKQI4wlYAcYSoBOcJUAvKDaUpAjjCVgBxhkiSgl2CSlPISbGyCSdz+SzCJI38JJnHNL8EkzvYlmMR9PgUXEof4Ekzi4l6C2ZwWy334l2DDFfwSAeyeXiKAHdFLBLDLeYkAdi4vEcBu5CkC+Sb1SwSwa3iJAHYCLxHAb/eXiAxvbORbvy8RGd7YyLdtXyIyvLGRb7k+RSDfUH2JyPDGRr4Z+hKR4Y2NfCPzJSLDGxv5JuRLRPA39v2H3S8Rpf4m4h/+xDf6xcQrJAd3AxdIjn598ArJwZ3GFZKD+5IrJAd3MVdINj7JwR3SFZKD+6krJPO5r+jX2q6QzOe+ol8+u0Iyn/uKfkXsCsl87iv6Ra4rJPO5r+jXra6QzOe+ol+KukIynfvao19dukIynfvao18wukIynfvab8Ynmc597dEv61whmc597dGv1Fwhmc99Rb/4coVkPvcV/XrKFZL53Ff0SyRXSOZzX9Gvelwhmc99Rb+QcYVkPvcV/drEFZL53Ff0yw1XSOZzX9GvIFwhmc99Rb8ocIVkPvcVvZ3/Csl87it60/0VkvncV/TW+Csk87mv6A3sV0jmc1/R28yvkMznvqI3g18hmc99RW/ZvkIyn/uK3lh9hWQ+9xW9tfoKyXzuK3pz9RWS+dxX9PbqKyTzua/oDdZXSOZzX9FbrK+QzOe+ojdZXyGZz31Fb8m+QjKf+4rewH2FZD73Fb3d+wrJfO4renP4FZL53Ff0VvIrJPO5r+iN51dI5nNf0dvUr5DM576iN7VfIZnPfUVvgb9CMp/7it4wf4VkPvcVvb3+Csl87ouv637n67rf+brud76u+52v637n67rf+brud76u+52v637n67rf+brud76u+52v637n67rf+brud76u+52v637n67rf+brud76u+52v637n67o/+LruD76u+4Ov6/7g67o/bsYnmc59HXxd9wdf1/3B13V/8HXdH3xd9wdf1/3B13V/8HXdH3xd9wdf1/3B13V/8HXdH3xd9wdf1/3B13V/ROq6fz1UIH/0eqhADub1UBbxoQK5gNdDBXpPvx4q0Jv09VCB3nWvhwr0Nno+VKR27tdDRfxEj9Rw/XqoiJ/okVqiXw8V8RM9UtPy66EifqJHait+PVTET/RIjb+vh4r4iR6pNff1UBE/0SM1z74eKuIneqT21tdDRfxEj9SA+nqoiJ/okVpEXw8V8RM9UhPn66EifqJHarN8PdTFn+ivf6j+rX+o/a1/qP+tf2j8pX/o6va+1z+0/a1/aP9b/9Dxt/4h+1v/0N/6ZKh/65Oh/q1Phvq3Phnq3/pkaH/rk6H9rU+G9rc+Gdrf+mRof+uTof2tT4b2tz4Z2t/6ZGh/65Oh/a1Phv63Phn63/pk6H/rk6H/rU+G/rc+Gfrf+mTof+uTof+tT4b+tz4Z+t/6ZBh/65Nh/K1PhvG3PhnG3/pkGH/rk2H8rU+G8bc+Gcbf+mQYf+uTYfylTwZz+WvRvdnzH+rjt3/on/1Wm7n8RecFj7XHfKwj5mNZzMcqMR+rxnysFvOxeszHGiEfa4v5Kb/F/JTfYn7KbzE/5beYn/JbzE/5Lean/BbzU36L+Sm/xfyU32N+yu8xP+X3mJ/ye8xP+T3mp/we81N+j/kpv8f8lN9jfsrvMT/lj5if8kfMT/kj5qf8EfNT/oj5KX/E/JQ/Yn7KHzE/5Y+Yn/JHzE95i/kpbzE/5S3mp7zF/JS3mJ/yFvNT3mJ+ylvMT3mL+SlvMT/lS8xP+RLzU77E/JQvMT/lS8xP+RLzU77E/JQvMT/lS8xP+RLzU77G/JSvMT/la8xP+RrzU77G/JSvMT/la8xP+RrzU77G/JSvMT/lW8xP+RbzU77F/JRvMT/lW8xP+RbzU77F/JRvMT/lW8xP+RbzU77H/JTvMT/le8xP+R7zU77H/JTvMT/le8xP+R7zU77H/JTvMT/lR8xP+RHzU37E/JQfMT/lR8xP+RHzU37E/JQfMT/lR8xP+RHyU77E/NvXEvNvX0vMv30tMf/2tdxCfsqXmH/7WmL+7WuJ+bevJebfvpaYf/taYv7ta4n5t68l5t++lph/+1pi/u1rifm3ryXm376WmH/7WmL+7WuJ+bevJebfvpaYf/taYv7ta4n5t68l5t++lph/+1pi/u1rifm3ryXm376WmH/7WmL+7WuJ+bevJebfvpaYf/taYv7ta4n5t68l5t++lph/+1pi/u1rifm3ryXm376WmH/7WmL+7WuJ+bev9erK5f/96u8uhN+eX73d/99L8p8vhH/1vdutPr51K7fXV9v+L7/zfpTHd96P8eOq+bA/fec+nt95//Cd7/9x//ra+39Pfx7o1dXWGujfHmig02oaqMdAA52l00A9BhropJ8G6jFQ00BzDTTQcWAN1GOggQ4ra6AeAw10lFoD9RhooIPeGqjHQLUpSjXQdtOmCGmg/fYY6CgnA9WmKNlAtSlKNlBtipIN1DRQoIG210DryUC1KUo2UG2Kkg1Um6JkA9WmKNlAtSnKNdBNmyKkgZb+GGhtJwPVpijZQLUpSjZQbYqSDdQ00FwD1aYo2UC1KUo2UG2Kkg1Um6JkA9WmKNdAd22Kkg1Um6JkA9WmKNlAtSlKNlDTQHMNVJuiZAPVpijZQLUpSjZQbYqSDVSbolwDPbQpSjZQbYqSDVSbomQD1aYo2UBNA801UG2Kkg1Um6JkA9WmKNlAtSlKNlBtinIN1LQpSjZQbYqSDVSbomQD1aYo2UBNA801UG2Kkg1Um6JkA9WmKNlAtSnKNdCiHHrBQLf+HGgxz4F+brQuyqHJBqocmmygpoHmGqhyaLKBKocmG6hyaLKBKocmG6h+YyHXQKt+YyHZQLUpSjZQbYqQBvr5EE/VpijZQE0DzTVQbYqSDVSbIqSBfj7zUbUpSjZQbYqSDVSbolwDbdoUJRuoNkXJBqpNEdJAP//WX9OmKNlATQPNNVBtipINVJuiZAPVpijZQLUpSjZQbYpyDbRrU5RsoNoUJRuoNkXJBqpNUbKBmgaaa6DaFCUbqDZFyQaqTVGygWpTlGyg2hTlGujQpijZQLUpSjZQbYqSDVSbomQDNQ0010C1KUo2UG2Kkg1Um6JkA9WmKNlAtSlKNdB+06Yo2UC1KUo2UG2Kkg1Um6JkAzUNNNdAtSlKNlBtipINVJuiZAPVpijZQLUpyjXQTZuiZANVDvUf6P4szbzP1vWY3cdG676ZBpproMqhyQaqHJpsoMqhyQaqHJpsoMqhuQa6K4cmG6h+YyHZQPUbC8kGqk1RsoGaBgo00I+HePquTVGygWpTlGyg2hQlG6g2RUgD/Xjmo+/aFOUa6KFNUbKBalOUbKDaFCUbqDZFyQZqGijQQD//1t+hTVGygWpTlGyg2hQlG6g2RckGqk1RroGaNkXJBqpNUbKBalOUbKDaFCUbqGmguQaqTVGygWpTlGyg2hQlG6g2RckGqk1RroEWbYqSDVSbomQD1aYo2UC1KUo2UNNAcw1Um6JkA9WmKNlAtSlKNlBtipINVJuiXAOt2hQlG6g2RckGqk1RsoFqU5RsoKaB5hqoNkXJBqpNUbKBalOUbKDaFCUbqDZFuQbatClKNlBtipINVJuiZANVDp0bqG/vdFNaXIJdmW4JdiWvJdiVj1Zg70oxS7ArayzBrkSwBLt+wrsEuwn7CuxKqUuwK6X6Y/98UKMrpS7BrpS6BLtS6grsQynVH/vnGvmhlLoEu1LqEuxKqUuwm7CvwK6UugS7Uqo/9s+/OTCUUpdgV0pdgl0pdQH2cVNKXYJdKXUJdqXUJdiVUpdgN2FfgV0pdQl2pdQl2JVSl2BXSl2CXSl1BfZNKXUJdqXUJdiVUpdgV0pdgt2EfQV2pdQl2JVSl2BXSl2CXSl1CXal1BXYd6XUJdiVUpdgV0pdgl0pdQl2E/YV2JVSl2BXSl2CXSl1CXal1CXYlVJXYD+UUpdgV0pdgl0pdQl2pdQl2E3YV2DP5dtdO47GkctdO8PJ5YF94Vgup+oMJ5efdIaTy/U5w8nlzZzhmOCcw8m1jXeGk2tn7gxHDvkNHF6H/LFGbxivQ/4Mp/A65Ak4vA55Ag6vQ/5YeDUKr0OegGOCcw6H1yFPwOF1yBNweB3yBBxeh/z5pw+F1yF/hlN5HfIEHF6HPAGH1yFPwOF1yBNwTHDO4fA65Ak4vA55Ag6vQ56AI4f8Bo4c8jmcJof8Bo4c8hs4cshv4Mghv4FjgnMORw75DRw55Ddw5JDfwJFDfgNHDvkcTpdDfgNHDvkNHDnkN3DkkN/AMcE5hyOH/AaOHPIbOHLIb+DIIb+BI4d8DifZrXNnOHLIb+DIIb+BI4f8Bo4JzjkcOeQ3cOSQ38CJ7nO2/QnnVrZPcL743ns9nk9d+4/fRD7+9J238fwjm/22vwpHtnb7t0P69BeD7Rb+aq+GdB9SdN+nId2HFN1/akj3IUX3wRrSfUimIcUfUvRcoCHdhxQ9n2hI9yFF/0mChnQfUvSfaGhI9yFp4xB/SOEvMOcf0qdSl/uQtHEAGJI2DgBD0sYBYEimIS0e0qfqlvuQtHEAGJI2DgBD0sYBYEjaOAAMSRuH+EMKf007/5A+/bbQfUjaOAAMSRsHgCFp4wAwJNOQ4g9JGweAIWnjADAkbRwAhqSNA8CQtHGIP6Twl9E1pPuQtHEAGJI2DgBD0sYBYEimIcUfkjYOAEPSxgFgSNo4AAxJGweAIWnjEH9Ipo0DwJC0cQAYkjYOAEPSxgFgSKYhxR+SNg4AQ9LGAWBI2jgADEkbB4AhaeMQf0hFGweAIWnjADAkbRwAhqSNA8CQTEOKPyRtHACGpI0DwJC0cQAYkjYO8YdUeXNSqU/s9bZ9GtLRHtw3K68h7db/CP7xxaX9+M779gM8b/ZZDJ43zywGbwK/Bjxv7lgMnjdLXAl+lF9fXG/lBDxvPlgMntfzLwbP+5PDteAb708DLwW/PcHXE/BKrovAK7kuAq/kugi8Cfwa8Equi8AruV4Bvj+PBPV+Al7JdRF4JddF4JVc14DvSq6LwCu5LgKv5LoIvJLrIvAm8GvAK7kuAq/kugi8kusi8Equi8Arua4BP5RcF4FXcl0EXsl1EXgl10XgTeDXgFdyXQReyXUReCXXReCVXBeBV3JdAv5OWODXgFdyXQReyXUReCXXReBN4NeAV3JdBF7JdRF4JddF4JVcF4FXcl0DflNyXQReyXUReCXXReCVXBeBN4FfA14+fg78vtnjQfbePoH/2NC0bfLxi8DLx68Bv8vHLwIvH78IvHz8FeA/lkhsu3z8IvAm8GvA6ydQi8DrJ1CLwCu5LgKv5HoF+M+7ml3JdQ34Q8l1EXgl10XglVwXgVdyXQTeBH4NeCXXReCVXBeBV3JdBF7JdRF4Jdc14E3JdRF4JddF4JVcF4FXcl0E3gR+DXgl10XglVwXgVdyXQReyXUReCXXNeCLkusi8Equi8AruS4Cr+S6CLwJ/BrwSq6LwCu5LgKv5LoIvJLrIvBKrmvAVyXXReCVXBeBV3JdBF7JdRF4E/g14JVcF4FXcl0EntfHb708n9rGB/ATfRyN15m7o+T12u4oed2zO0peP+yO0oRyCuV4fHG9lROUvJ7VHSWvC3VHyfsTEXeUvD/j+BLlx3KZprTjhbIr7bihVNpxQ6m044ZSaccNpQnlFMrP+8qutOOGUmnHDaXSjhtKpR03lEo7XiiH0o4bSqUdN5RKO24olXbcUJpQeqFU2nFDqbTjhlJpxw2l0o4bSqUdJ5T7TWnHDaXSjhtKpR03lEo7bihNKL1QKu24oVTacUOptOOGUmnHDaXSjhfKTWnHDaXSjhtKpR03lEo7bihNKL1QKu24oVTacUOptOOGUmnHDaXSjhfKXWnHDaXSjhtKpR03lLy+8nY8NN73Y/YJ5ceWgn3n9ZXuKHl9pTtKXl/pjpLXV3qjPHh95XcoPxY+7Aevr3RHyesr3VHybtHdUZpQzqH89Kf1+6G044ZSaccNpdKOG0qlHTeUSjteKE1pZw7l532lKe24oVTacUOptOOG0oTSC6XSjhtKpR03lEo7biiVdtxQKu14oSxKO24olXbcUCrtuKFU2nFDaULphVJpxw2l0o4bSqUdN5RKO24olXa8UBJfWHdHqbTjhlJpxw2l0o4bShNKL5RKO24olXbcUCrtuKFU2nFDqbTjhZL4ar07SqUdN5RKO24olXbcUJpQeqFU2nFDqbTjhlJpxw2l0o4XSt774Ft/0tmG9U8oP7cU8N4H90dJ6yv9UZpQeqGk9ZX+KGl95ZcoPxc+8N4H90dJ6yv9UdJu0d1R8t4H/xblxz+t570P7o9SaccNpdKOG0oTSi+USjtuKJV25lB+3lfy3gf3R6m044ZSaccJ5cF7H9wfpdKOG0qlHTeUSjtuKE0ovVAq7bihVNpxQ6m044ZSaccNpdKOF0re++D+KJV23FAq7bihVNpxQ2lC6YVSaccNpdKOG0qlHTeUSjtuKJV2vFDy3gf3R6m044ZSaccNpdKOG0oTSi+USjtuKJV23FAq7bihVNpxQ6m044WS92q9P0qlHTeUSjtuKJV23FCaUHqh5PWV7VYf37q18Qnlx5aCg/c+uD9KXl/pjZL3Prg/Sl5f6Y6S11d+h/Ljn4sevPfB/VGaUHqh5N2iu6Pk3aK7o1TacUOptDOH8nMG570P7o6S9z64P0qlHTeUSjtuKJV23FCaUHqhVNpxQ6m044ZSaccNpdKOG0qlHS+UvPfB/VEq7bihVNpxQ6m044bShNILpdKOG0qlHTeUSjtuKJV23FAq7Xih5L0P7o9SaccNpdKOG0qlHTeUJpReKJV23FAq7bihVNpxQ6m044ZSaccLZVfacUOptOOGUmnHDaXSjhtKE0ovlEo7biiVdtxQ5vKVfTy/9/7hexd7wrHfn+MJJ9nFb2c4ubyfM5xcbs4ZTi5/5gzHBOccTi4P5QwnlytyhpNrq+sMJ9ee1hmOHPIpHEt2JfobOP32gDPKCRxehzwBh9chT8DhdcgTcIwWTnvBqSdweB3yBBxehzwBh9chT8DhdcgTcHgd8mc4yS4LfwOn9Aec2k7g8DrkCTi8DnkCDq9DnoBjgnMOh9chT8DhdcgTcHgd8gQcXoc8AYfXIX+Gk+warTMcOeQ3cOSQ38CRQ34DxwTnHI4c8hs4cshv4Mghv4Ejh/wGjhzyOZxkF0yd4cghv4Ejh/wGjhzyGzgmOOdw5JDfwJFDfgNHDvkNHDnkN3DkkM/hJLvF6gxHDvkNHDnkN3DkkN/AMcE5hyOH/AaOHPIbOHLIb+DIIZ/DCX5X8dafdRzbbfwo7/gznNEeXz3ayV/fBb9+eIHg2H7kAsHGJji2b7hAcGwv8KXg+3Pfnl++jw/fffTHZ/oYZ5/psd3Acjyx/cByPLF3ZqvxBL9ytxxPKj/pjyeV+/THk8qrfofnm2B3/tQvlCaUXihT+eu1KImduzdKYpfvjZI4EXijJE4PziiDX5iDQkmcSrxREicYb5RKO24oTSi9UCrtuKFU2nFDqbTjhlJpxw2l0o4XyuAX5qBQKu24oVTacUOptOOG0oTSC6XSjhtKpR03lEo7biiVdtxQKu14oQx+JREKpdKOG0qlHTeUSjtuKE0ovVAq7bihlBmaQvn5IF4JfhAPCqVeO3MoP/5lbLnpteOGUq8dN5Rasrmh1JLNDaWWbG4o5SunUNat/vraeux/Rhn8jBwUSi3Z3FBqyeaGUmnHDaUJpRdKpR03lEo7biiVdtxQKu24oVTa8UIZ/CQgFEqlHTeUzGnnmyc59ud3Pn5+51v9AZM577jDNMH0g8mcedxhMqced5jMuccdJnPycYfJnH2+glmeD3LU7c8wg597BIPJnH/cYSoBOcJUAnKEaYLpB1MJyBGmEtA/gNlPYCoBOcJUAnKEqQQ0CXO84uQ4iZPBz3mCwVQCcoSpBOQIUwnIEaYJph9MJSBHmEpA/+f8r29L8IOny/EopbzFo9zxDk9RkniLR9ngLR65/bd4cp3j/XjTrSQ7xzshONc53gnBqbzqjOBU7nNGcCo/OSM4lUOcEJzrrO2M4FQubkZwKl82I5jNaeU6+TojmM1p5TqfOiOYzWnlOkU6I5jNaeU66zkjmM1p5TqROSOYzWnlOjc5I5jNaeU63TgjmM1p5TqDOCOYzWnlOik4I5jNaeU6zzcjmM1p5Tp1NyOYzWnlOhs3I5jNaeU6wTYjmM1p5TpnNiOYzWnlOg02I5jNaeU6szUjmM1pDTanNdic1mBzWrmusH0WXHPdSpsRTOa06o3MadVcN+tmBBubYDKnVXNdaZsRTOa0aq6LZzOC2ZxWruthM4LZnFauS1wzgtmcVq6rVjOC2ZxWrgtRM4LZnFaua0szgtmcVq7LRTOC2ZxWritAM4LZnFauazozgtmcVq6rNDOC2ZxWrusuM4LZnFauKykzgtmcVq5rIzOC2ZxWrqsdM4LZnFau6xczgtmcVq4rEjOC2ZxWrmsMM4LZnFauqwYzgtmcVq7rADOC2ZxWrpb9GcFsTitXE/6MYDanlautfkYwm9PK1Sg/I5jNabF1xFe2jvjK1hFf2TriK1tHfGXriK9sHfGVrSO+snXEV7aO+MrWEV9zNYh/eY6qj+eT7B++ttjjOYodJyiZrwo6o2S+QOiLMlef+lqUzJcNnVEyX0F0Rsl88dwZpQmlF0rma+fOKJlvnTujVNpxQ6m0M4eyP75xGeUEpdKOF8pcNw3WolTacUOptDOHsr1Q1hOUSjtuKE0ovVAq7bihVNpxQ6m044ZSaWcOZXn8xLHUk5845rr+sRRlrrsia1Eq7bihVNpxQ6m044bShNILpdKOG0qlHTeUSjtuKJV23FAq7TihbLlu+6xFqbTjhlJpxw2l0o4bShNKL5RKO24olXbcUCrtuKFU2nFDqbTjhTLXfa21KJV23FAq7bihVNpxQ2lC6YVSaccNpdKOG0qlHTeUSjtuKJV2vFDmunG3FqXSjhtKpR03lEo7bihNKL1QKu24oVTacUMZ3Fe248Wm/+gHOCmhaw/wo/25S6BFv7vnLzi4R/MXHNxJ+QsO7nf8BVsmwd99/n/u2WzRr/StxhPcPazGE3z/uRpP8J3majyp/KQ7nui3CFfjSeVVrwt250/9QpnKBa9Fmcpfr0VpQumFktjle6MkTgTeKInTgzdK4qThjZI4lTijjH7jEwml0o4bSqUdN5RKO24oTSi9UCrtuKFU2nFDqbTjhlJpxw2l0o4Xyuh3dpFQKu24oVTacUOptOOG0oTSC6XSjhtKpR03lEo7biiVdtxQKu14oYx+vxsJpdKOG0qlHTeUSjtuKE0ovVAq7bihVNpxQ6m044Uy+nnfKCg/n0Jv0c/7IqHUa2cO5ecWgeiHVJFQ6rXjhlJLNjeUWrJ5oYx+SBUJpXzlFMq61V9fW4/9BKV8pRtKLdncUJpQeqFU2nFDqbTjhlJpxw2l0o4bSqUdJ5Q9+iFVJJRKO24olXbcUCrtuKE0YpRfPIkd9lgN2VF+7IZu9QdM5rzjDpM58bjDZM487jCZU487TObc4w0z+lFVLJjM2ecrmP32hNnHCUzm9OMOkzn/uMM0wfSDqQTkCFMJyBGmEpAjTCWg72GOegJTCcgPZvRDq1gwlYDmYNr2jJO2n8TJ6MdWsWAqATnCNMH0g6kE5AhTCcgRphKQI0wloEmY5XjCrPsJTCUgP5i5jg2vhqkE5AhTCcgRphKQI0wTTD+YSkD/57yYpDOfgp7Bo5TyFo9yx1s8ShLv8DCfgp7BI7f/Fk8q//75NHjPdYR5RrCxCU7lVWcEp3KfM4JT+ckZwakc4ozgVJ5vQnCuc7gzglP5shnBbE4r1wHYGcHGJpjNaeU6eTojmM1p5TofOiOYzWnlOsU5I5jNaeU6azkjmM1p5ToROSOYzWnlOrc4I5jNaeU6XTgjmM1p5ToDOCOYzWnlOqk3I5jNaeU6TzcjmM1p5Tr1NiOYzWk1NqfV2JxWZ3NauS4Bzghmc1qdzWl1YxPM5rRyXTecEczmtHJdCpwRzOa0cl3dmxHM5rRyXbCbEczmtHJdg5sRzOa0cl1WmxHM5rRyXSmbEUzmtEaui18zgsmc1sh1PWtGMJnTGjdjE0zmtEaui04zgsmc1sh1GWlGMJvTynVhaEYwm9PKdalnRjCb08p18WZGMJvTynU5ZkYwm9PKdYFlRjCb08p1yWRGMJvTynURZEYwm9PKdVljRjCb08p1oWJGMJvTynXpYUYwm9PKdTFhRjCb08p1eWBGMJvTytXgPyOYzWnl6s2fEczmtHJ1288IZnNaufrnZwSzOS22jvjB1hE/2DriB1tH/GDriB9sHfGDrSN+sHXED7aO+MHWET/YOuIHW0f8YOuIH2wd8YOtI36wdcQPto74wdYRP9g64gdbR/xg64gfbB3xg60jfrB1xA+2jvjB1hE/2DriB1tH/GDriB9sHfGDrSN+sHXED7aO+MHWET/YOuIHW0f8YOuIH2wd8YOtI36wdcQPto74wdYRP9g64gdbR/xg64gfuRrE78/9+vJ9fPjurY/nk+wfvrbY/utrix1/Rpmrm3wtylTeYS3KVK5kLcpUfmctShNKL5SpPNpalKnc31qUqTZ4a1Gm2g2uRam044Oy33LdB7gQZX984zLKCUqlHTeUSjtuKJV23FCaUE6hbC+U9QSl0o4bSqUdN5RKO24olXbcUCrteKHMdaPjQpTl8RPHUtsJSqUdN5RKO24olXbcUJpQeqFU2nFDqbTjhlJpxw2l0o4bSqUdL5S57uSsRam044ZSaccNpdKOG0oTSi+USjtuKJV23FAq7bihVNpxQ6m044Uy162qtSiVdtxQKu24oVTacUNpQumFUmnHDaXSjhtKpR03lEo7biiVdrxQ5roXtxal0o4bSqUdN5RKO24oTSi9UCrtuKFU2vk/XiiVdtxQKu14oYx+d6/08nyQOj6hHO3RJTDacSI4uPvzFxzco/kLNjbBwf2Ov+DgruQ7wd99/n/s2bzjCe40VuMJ7h5W4wm+/1yMJ/q9wNV4UvlJfzyp3Kc/nlRe9bpgd/7UL5QmlF4oU/nrtSiJnbs3SmKX742SOBF4oyROD84oo9/LREJJnEq8URInGG+USjtuKE0ovVAq7bihVNpxQ6m044ZSaccNpdKOF8roN2uRUCrtuKFU2nFDqbTjhtKE0gul0o4bSqUdN5RKO24olXbcUCrteKGMfr8bCaXSjhtKpR03lEo7bihNKL1QKu24oVTacUOptOOGUmnHDaXSjhPKLfp53ygoP59Cv4MSSi+Ueu3MofzYIrBFP6SKhFKvHS+U0Q+pIqHUks0NpZZsbijlK6dQ1q3++tp67CcoTSi9UGrJ5oZSSzY3lEo7biiVdtxQKu14oYx+SBUJpdKOG0qlHTeUSjtuKE0ovVAq7bihZE47XzxJt/2xGup2/NgN3eoPmMx5xx0mc+Jxh8mcebxhRj+oigWTOfe4w2ROPu4wmbPPVzDr7QmzjhOYJph+MJnzjztMJSBHmEpAjjCVgBxhKgH5wYx+ZDUkzFZPYCoBOcJUAnKEqQQ0CXM842S5ncTJ6MdWsWAqATnCVAJyhKkE5AhTCcgRphKQH8yiBDQHs9jTZxY7iZO5DgKvhqkE5AhTCcgRpgmmH0wlIEeYSkCOMJWAvodZTlZwzIej/WEqAfnBZD5KPdE/xHyUegaPUspbPModb/GY8LzDo2zwFo/c/ls8qfz76I9l7hgnlS65TjHPCE7lgycE5zprPCM4lfucEZzKT84ITuUQZwQbm+BULm5GcCpfNiOYzWnlOgM7I5jNaeU6qTojmM1p5TpPOiOYzWnlOvU5I5jNaeU6mzkjmM1p5TpBOSOYzWnlOuc4I5jNaeU6jTgjmM1p5TozOCOYzWnlOtk3I5jNaeU6fzcjmMxp7Tcyp7XfyJzWfiNzWnuu64gzgo1NMJnT2m9kTmvPdUtyRjCZ09pz3WWcEJzreuKMYDanlesS4YxgNqeV66rfjGA2p5XrQt6MYDanleva3IxgNqeV63LbjGA2p5XrCtqMYDanleui2IxgNqeV6zrXjGA2p5XrytWMYDanleta1IxgNqeV6+rSjGA2p5XretGMYDanlesK0IxgNqeV65rOjGA2p5XrKs2MYDanleu6y4xgNqeV60rKjGA2p5Xr2siMYDanletqx4xgNqeV6/rFjGA2p5XrisSMYDanlesaw4xgNqeV66rBjGA2p5XrOsCMYDanlatlf0Ywm9PK1YQ/I5jNaeVqq58RzOa0cjXKzwhmc1psHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xO9sHfE7W0f8ztYRv7N1xB9sHfEHW0f8wdYRf7B1xB83YxNM5rQOto74g60j/mDriD/YOuIPto74g60j/sjVIH5/7tvzy/fx4bu3Pp5Psn/42mL7r68tdpygTPWGX4sylXdYizKVK1mLMpXfWYsylZNaijJXu/xalKnc31qUqTZ4a1Gm2g2uRWlC6YVSaWcOZX984zLKCUqlHTeUSjtuKJV23FAq7cyhbC+U9c8oc114WItSaccNpdKOG0qlHTeUJpReKJV25lCWx08cSz35iWOu6x9rUSrtuKFU2nFDqbTjhTLXlZW1KJV23FAq7bihVNpxQ2lC6YVSaccNpdKOG0qlHTeUSjtuKJV2vFDmunS0FqXSjhtKpR03lEo7bihNKL1QKu24oVTacUOptOOGUmnHDaXSjhfKXNfG1qJU2nFDqbTjhlJpxw2lCaUXSqUdN5RKO24olXbcUCrtuKFU2vFCmevi31qUSjtuKJV23FAq7bihDO4rj+348SCfUI726BIY7TgRHNz9+QsO7tH8BQd3Uu6Co9/d8xcc3JV8J/i7z/+Jns3oV/pW4wnuHlbjMeF5hyf4TnM1nlR+0h9PKvfpjyeVV70u2J0/9QtlKhe8FGX0a4tIKImduzdKYpfvjZI4EXijNKH0QkmcNLxREqcSb5TECcYbpdKOG0qlHSeUFv3iKRJKpR03lEo7biiVdtxQmlB6oVTacUOptOOGUmnHDaXSjhtKpR0vlNGvDiOhVNpxQ6m044ZSaccNpQmlF0qlHTeUSjtuKJV23FAq7bihVNrxQhn9fjcSShPKqb9B/Hje16Kf90VCqdfOHMqPfxlr0Q+pAqGMfkgVCaWWbG4otWRzQ6klmxtKE8oZlHWrv762HvsJSvlKN5Rasrmh1JLNDaXSjhtKpR0vlNEPqSKhVNpxQ6m044ZSaccNpQmlF0qlHTeUSjtuKJnTzjdPsrcnkb3fXl+97z9gMucdd5jMiccbZvRzqlgwmVOPO0zm3OMOkzn5uMM0wZyDaf0Fc/sN5v9+9Tge/nXUH0/R//gUzx/HtWE/vu+PGTGHKpQZMac1lBkpBsafkdJl/BkptIafUfRju5rRfUaK2PFnpOQef0ZaCMSfkWlG4WekPcPckxw3e3zn4+dX/wZTCwFHmErujjAVsR1hKgv7wYx+MxkLptKlI0zFwEmYR33CtHICU3nNEaYJph9MJSBHmEpAjjCVgBxhKgE5wlQC+h7mT40/Yea6or4aphKQI0wloP/zpomN+Z77DB4Tnnd4lDve4lGSeItH2eAtHrn9t3hS+ffRHz/lHuOk3CrXJfUZwal88IzgVF51RnAq9zkj2NgEp3KIM4JTeb4Zwalc3IzgVL5sRjCZ0yq5rjjPCCZzWiXXReQZwWROq9yMTTCZ0yq5LvXOCCZzWiXX1dsZwWxOK9cF2RnBbE4r1zXWGcFsTivXZdMZwWxOK9eV0BnBbE4r18XNGcFsTivX9coZwWxOa2dzWjub08p1NnVGMJvT2tmc1s7mtHIdmZ0RzOa0ch1snRHM5rRyHT+dEczmtHIdEp0RzOa0ch3lnBHM5rRyHbicEczmtHIdi5wRzOa0ch1enBHM5rRyHTGcEczmtHIdBJwRzOa0cp3WmxHM5rRynaibEczmtHKdepsRzOa0cp1MmxHM5rRyHfOaEczmtHKdmZoRzOa0ch1AmhHM5rRyneaZEczmtHIdjZkRzOa0cl1JmRHM5rRyXRuZEczmtHJd7ZgRzOa0cl2/mBHM5rRyXZGYEczmtHJdY5gRzOa0cl01mBHM5rRyXQeYEczmtHK17M8IZnNauZrwZwSzOa1cbfUzgtmcVq5G+RnBbE6LrSO+sHXEF7aO+MLWEV/YOuILW0d8YeuIL2wd8YWtI76wdcRXto74mqtB/MtzVH08n2T/8LXF9l9fW+w4QZnqDb8WJfMFQmeUzNcKnVEyXzZ0Rsl8BdEZJfPFc1+UuXrr16JkvnbujJL51rkzSqUdN5QmlFMo++Mb3zeiJyiVdtxQKu24oVTacUOptDOHsr1Q1hOUSjteKHPdjliLUmnHDaXSjhtKpR03lCaUUyjL4yeOpZ78xDHX9Y+1KJV23FAq7bihVNpxQ6m044Uy1/2WtSiVdtxQKu24oVTacUNpQumFUmnHDaXSjhtKpR03lEo7biiVdrxQ5rqhtBal0o4bSqUdN5RKO24oTSi9UCrtuKFU2nFDqbTjhlJpxw2l0o4Xylx3zNaiVNpxQ6m044ZSaccNpQmlF0qlHTeUSjtuKJV23FAq7bihVNrxQpnrluBalEo7biiVdtxQBveVW309yL7vH1BOdAlEv7vnLzi4R/MXHNxJ+QsO7nfcBUe/u+cvOLh38Bcc/A3vLzj41tFfsLEJZnNa0e/ufSn4c/VK9Lt7/oJzOa0Jwbmc1mfB0e/ufSn4c/lC9Lt7/oJzOa0Jwbmc1oRgYxOcy2lNCM7ltD5vLaPf3fMXnMtpTQjO5bQ+C45+d89fcC6nNSE4l9OaEJzLaU0INjbBuZzWhGA2pxX97p6/YDanFf3unrfgFv3unr9gMqfVbmROq0W/rOgv2NgEkzmtFv2WoL9gMqfVot/l8xfM5rSi37jzF8zmtKLfi/MXzOa0ot9e8xfM5rSi3zHzF8zmtKLfBPMXzOa0ot/X8hfM5rSi36ryF8zmtKLfffIXHPo9PMZ4/RXntm8f9I72+IX40Y4TvaFfwxfoDf0W9tcb++zLBXpDv4Mv0Bv6Ffyl3u/+6nz0x6f5GCef5rFvoiynE/rlvpxO6J3LcjqhFzTL6WRykf50MnlOfzqZHOp1PTLnD/0kGfsICBTJTK56LUlev+5Nktfbe5M0kXQiyZsZvEny5gtvkrxZxJskb27xJqmM40Qy9ukPKJLKOF4klXG8SCrjeJE0kXQiqYzjRVIZx4ukMo4XSWUcL5LKOE4kYx/8gCKpjONFUhnHi6QyjhdJE0knkso4XiSVcbxIKuN4kVTG8SKpjONEMvb5ICiSyjheJJVxvEgq43iRNJF0IqmM40VSGceLpDKOF0llHC+SyjhOJGMf7oIiqYzjRVIZx4ukMo4XSbmgGZKfz7222CeqkEjGvowUh+TnhqnYJ5egSOqN40XSRNKJpLZqXiS1VfMiKT85Q7Ju9dfX1mM/ISk/6UVSWzUfkj326TAokso4XiSVcbxIKuN4kTSRdCKpjONFUhnHi6QyjhdJZRwvkso4TiRjH+2DIqmM40VSGceLpDKOF0kTSSeSxBnniwfZtyfKfTvK6zn6+NNXl/L44radcCdOREu5E+enpdyJ09ZS7sTZzIn7k2XsQ59gLInzmTtL4oTmzpI4o7mzNLF0Y6mc5sdS2cuPpfLUHMvxtOr7rf/G8g9fvdf+/Or++up9++HsU100xiKvTHUF+ScPK3/OsqluPCNxV1Zbw125bg13ZcA13E3cl3BXtlzDXTn0Au6ffyZCfLV8LXcl1jXclVeXcGe+y/4N9/34sXOxD9y38nzqYifclVfXcFde9efu27nUma/Jw8zINKPwM1Jmjj8j5ev4M1IWjz8j5fb4M1LGDz+jon1A/BlpdxB/RtozxJ+R9gzxZ2SaUfgZac8Qf0baM8SfkfYM8WekPUP8GWnPEH5GVXuG+DPSniH+jLRniD8j7Rniz8g0o/Az0p4h/oy0Z4g/I+0Z4s9Ie4b4M9KeIfyMmvYM8WekPUP8GWnPEH9G2jPEn5FpRuFnpHy0dkafb6D3pnwUfkZdvm7xjD7eI+5dvi7+jOTr4s/INKPwM9LPj+LPSD8/ij8j5aO1M5q4mdWVj+LPSD8/Cj+joZ8fxZ+R9gzxZ6Q9Q/wZac8Qf0amGYWfkfYM8WekPUP8GWnPEH9G2jPEn5H2DNFnNG7aM8SfkfYM8WekPUP8GWnPEH9GphmFn5H2DBfM6IvvvI3XM4/txzPf7B9OVFuJbBPVDiPbRLXxyDZR7UfiTvQ5pU0bEoQpaUeCMCVtSRCmpD0JwpRMUwKYknYlCFPS/gNhStppIExJewqEKWn3sHpK7YF6v231tyn94Tk+XlQfu/YU2SaqnQbSRH3bgMauXQnz9LWDYZ6+afrE09fOiHn62kUxT187Lubpa3fGPH3t5Iinf2h/xzx97fqYp69dH/P0tetjnr5p+sTT166Pefra9TFPX7s+5ulr18c8fe36iKdv2vUxT1+7Pubpa9fHPH3t+pinb5o+8fS162OevvJ+1ul/vkk7THmfePpFnj/t9D/eLRxFnp95+qbpE09fnp95+vr5PvP09fN95ukr72ed/kS3b1HeJ55+1c/3maevn+8zT1+7Pubpa9fHPH3T9Imnr10f8/S162OevnZ9zNPXro95+tr1EU+/adfHPH3t+qCm/8133sbjmbf99uOnfH37MX9t+7jnr30f9/xN86eev3Z+3PPX1o97/tr7cc9fm78c839NVNu8ZBPt2tCtneh+K7fnREf5MNGJy3hdW7dsE9UeDWmizt0IXVs05umbpk88fW3QmKev/Rnz9LU9Y56+dmfM09eejXj6Qzs55ulrf8c8fe36mKevXR/z9E3TJ56+dn3M09euj3n62vUxT1+7Pubpa9dHO/1xx6XpE09fuz7m6WvXxzx97fqYp2+aPvH0tetjnr52fczTV97POv2P1+7GbVPeZ56+PH/a6X+6enOfvmn6xNOX52eevjw/8/T1833m6evn+8zTV97POv2PHcjjtivvM09fP99nnr5+vs88fe36mKdvmj7x9LXrY56+dn3M09euj3n62vUxT1+7PuLpH9r1MU9fuz6o6X/xnSeuXdznr20f9/y17+Oev2n+1PPXzo97/tr6cc9fez/u+Wvzl2P+r4lqm5dsoqYN3eKJ3j9KH995O9qHiW73cTwUboedzFR7t3wz1S4Naab2/GI7bh++88+v7SfT1yaNefqm6Sed/v2ZH9/Yysn0tUVjnr52aMzT1waNefranzFPX7s24ukX7eXSTr+Uxzdu28n0tcFjnr52fczT166Pefqm6RNPX7s+5ulr18c8fe36UKd/8nO7ov1dtolqJ5dsolV7tmwT1e4s20S1D8s2Ue24sk3UNNFkE9UuKttEtV/KNlHtjFZP9PX3WFv99PdYU3/pUbU1yjdT7Y3SzbRpc5Rvptod5Zuptkf5Zqr9Ub6ZmmaabqbaIeWbqbZI+WaqPVK+mWqPlG+m2iOlm2nXHinfTLVHyjdT7ZHyzVR7pHwzNc003Uy1R8o3U+2R8s1Ue6R8M9UeKd9MtUdKN9OhPVK+mWqPlG+m2iPlm6n2SPlmapppuplqj5Rvptoj5Zup9kj5Zqo9Ur6Zao+UbaZ3Cpppuplqj5Rvptoj5Zup9kj5ZmqaabqZao+Ub6baI+WbqfZI+WaqPVK+mWqPlG6mm/ZI+WaqPVK+mWqPlG+m2iPlm6lppulmqj1Svplqj5Rvptoj5Zup9kj5Zqo9UrqZ7toj5Zup9kj5Zqo9Ur6Zao+Ub6ammaabqfZI+WaqPVK+mWqPlG+m2iPlm6n2SOlmemiPlG+m2iPlm6n2SPlmqj1SvpmaZppuptoj5Zup9kj5Zqo9Ur6Zao+Ub6baI6WbqWmPlG+m2iPlm6n2SPlmqj1SvpmaZppuptoj5Zup9kj5Zqo9Ur6Zao+Ub6baI6WbadEeKd9MtUfKN1PtkfLNVHukfDM1zTTdTLVHyjdT7ZHyzVR7pHwz1R4p30y1R0o306o9Ur6Zao+Ub6baI+WbqfZI+WZqmmm6mWqPlG+m2iPlm6n2SPlmqj1Svplqj5Rupk17pHwz1R4p30y1R8o3U+2R8s3UNNN0M9UeKd9MtUfKN1PtkfLNVHukfDPVHindTLv2SPlmqj1Svplqj5Rvptoj5ZupaabpZqo9Ur6Zao+Ub6baI+WbqfZI+WaqPVK6mQ7tkfLNVHukfDPVHinfTLVHyjdT00zTzVR7pHwz1R4p30y1R8o3U+2R8s1Ue6RsM91v2iPlm6n2SPlmqj1Svplqj5RvpqaZppup9kj5Zqo9Ur6Zao+Ub6baI+WbqfZI6Wa6aY+Ub6baI+WbqfZI+WaqPVK+mZpmmm6m2iPlm6n2SPlmqj1Svplqj5RvptojpZvprj1Svplqj5Rvptoj/c2Zvrhr17OGu4n7Eu7amazhrr3GGu7aPazhrv3AGu7K8FPcj708JB4/gfyR+5SDP5S0V5FXHvYnf9jjqY9iHz/F6o9Psf766u3nlJRwEaakPIwwJdOUFk/pyc7KyVtJSTv+jJTK489ICT7+jJT2489Im4HwMzLtEOLPSNuGxTMqz2/ctpMZadcQf0baNMSfkWlG4WekPUP8GWnPEH9G2jNcOqN6xl27gzXctQ9Ywr0o46/hrty+hruy+Bz3vj25j/6B+9TvxRQl7FXkTeTdybv/FkVRckaYkrLz6il9/JlIUXaOPyPl7PgzUiYPP6Oq/B5/Rsr68WekvcDiGX3+mUjVBiH+jEwzCj8jbRriz0h7hvgz0p4h/oy0Z4g/I+0ZLp3R2c9Cm3YHa7hrH7CGuzL+Gu7K7Wu4m7gv4a58vYa7MvMa7srBa7gr267hrrw6xd228ZBox6c2wanfZOxKrKvIK7OuIq/Uuoq8cusq8ibyi8gru64ir/S6irzy6yrySrCryCvDLiI/lGFXkVeGXUVeGXYVeWXYVeRN5BeRV4ZdRV4ZdhV5ZdhV5JVhV5FXhl1D/rgpw64irwy7irwy7CryyrCryJvILyKvDLuKvDLsKvLKsKvIK8OuIq8Mu4j8pgy7irwy7CryyrCryCvDriJvIr+IvDLsKvLKsKvIK8OuIq8Mu4q8Muwi8rsy7CryyrCryCvDriKvDLuKvIn8IvLKsKvIK8OuIq8Mu4q8Muwq8sqwi8gfyrCryCvDriKvDLuKvDLsKvIm8ovIK8OuIq8Mu4q8Muwq8sqwq8grwy4ib8qwq8grw64irwy7irwy7CryJvKLyCvDriKvDLuKvDLsKvLKsKvIK8MuIl+UYVeRV4ZdRV4ZdhV5ZdhV5E3kF5FXhl1FXhl2FXll2FXklWFXkVeGXUS+KsOuIq8Mu4q8Muwq8sqwq8ibyC8irwy7irwy7CryyrCryCvDriKvDLuIfFOGXUVeGXYVeWXYVeSVYVeRN5FfRF4ZdhV5ZdhV5JVhV5FXhl1FXhl2EfmuDLuKvDLsKvLKsKvIK8OuIm8iv4i8Muwq8sqwq8grw64irwy7irwy7CLyQxl2FXll2FXklWFXkVeGXUXeRH4ReWXYVeSVYVeRV4ZdRV4ZdhV5Zdg15O2mDLuKvDLsKvLKsKvIK8OuIm8iv4i8Muwq8sqwq8grw64irwy7irwy7CLymzLsKvLKsKvIK8OuIq8Mu4q8ifwi8sqwq8grw64irwy7irwy7CryyrCLyO/KsKvIK8OuIq8Mu4q8Muz/PsiLjonOGzrKgu/oKK+9o6NM9Y6Ocs87Osomb+gcyg/v6Mjjv6MjH/6OjrzyOzomOm/oZPLKo/dfXz1GO9Gbyf3O6M3kZ2f0ZnKoM3ozec4JvZbJRc7ozeQLZ/RmcnozejN5txm9RqaXzF8Zmb8yMn9lZP7KyPxVIfNXhcxfFTJ/Vcj8VTEyvWT+qpD5q0LmrwqZvypk/qqS+atK5q8qmb+qZP6qGpleMn+V6kL9jF4yf5XqGvuMXjJ/lery+IxeMn+V6sr2jF4yf5XqovSMXjJ/lep68oxeMn+V6lLwjF4yf5XqKu6MXjJ/leoC7IxeMn+V6trpjF4yf5XqsueMXjJ/leqK5YxeMn+V6mLjjF4yf5XqOuGMXjJ/leoS34xeMn+V6urcjF4yf5XqwtqMXi5/VVJdE5vRy+WvSqrLWTN6ufxVuRmZXi5/VVJdRJrRy+WvSqrrPzN6yfxVqks3M3rJ/FWqqy4zesn8VaoLJjN6yfxVqmsdM3rJ/FWqyxQzesn8VaorDDN6yfxVqosDM3rJ/FWq5v4ZvWT+KlW7/oxeMn+VqgF/Ri+Zv0rVUj+jl8xfpWqSn9FL5q9Stb3P6CXzV2T97YWsv72Q9bcXsv72QtbfXsj62wtZf3sh628vZP3thay/vZD1txey/vZC1t9eyPrbC1l/eyHrby9k/e2FrL+9kPW3F7L+9kLW317I+tsLWX97IetvL2T97YWsv72Q9bcXsv72QtbfXsj62wtZf3sh628vZP3thay/vZD1txey/vZC1t9eyPrbC1l/eyHrby9k/e2FrL+9kPW3F7L+9kLW317I+tsLWX97IetvL2T97YWsv72Q9bcXsv72QtbfXsj62wtZf3sh628vZP3thay/vZD1txey/vZC1t9eyPrbC1l/eyHrb69k/e2VrL+9kvW3V7L+9nozMr1c/qqS9bdXsv72StbfXsn62ytZf3sl62+vZP3tlay/vZL1t1ey/vZK1t9eyfrbK1l/eyXrb69k/e2VrL+9kvW3V7L+9krW317J+tsrWX97Jetvr2T97ZWsv72S9bdXsv72StbfXsn62ytZf3sl62+vZP3tlay/vZL1t1ey/vZK1t9eyfrbK1l/eyXrb69k/e2VrL+9pur3vj/27fnl+/jwzb95kH0/+lNit9dz9PFvv/OtPJ55v43yA5796Tv38fzO+4fvXGz/9bXFjpPpZ3Ijmv6X00/V/a7pfzv9TE5V0/92+pl8u6b/7fQzpRhN/9vpm6ZPPP1MCVfT/3b6mX6eoul/O/1MP13S9L+dvnZ9zNPXri/t9PvjG5ef3/fn9FPdIdL0v52+dn3M09euj3n62vWlnX57Tb+eTN80feLpa9fHPH3t+pinr10f8/S162OevnZ9aadfHo9c6snv9Ka6ianpfzt97fqYp69dH/P0tetjnr5p+sTT166Pefra9TFPX7s+5ulr18c8fe36iKef6j67pv/t9LXrY56+dn3M09euj3n6pukTT1+7Pubpa9fHPH3t+pinr10f8/S16yOe/tCuj3n62vUxT1+7Pubpa9fHPH3T9Imnr10f8/S162OevnZ9zNPXro95+tr18U6/3bTrY56+dn3M09euj3n62vUxT980feLpa9fHPH3t+pinr10f8fQ35f2109/uM3hOf6ue0/94m6NtyvvM01feZ56+8j7z9E3TJ56+8j7z9JX3maevvM88ff1uD/P09bs9xNPftetjnr52fWmn//EaY9u162OevnZ9zNM3TZ94+tr1pZ3+x4tsbdeuj3n62vUxT1+7Pubpa9dHPP1Duz7m6WvXl3b6n3+n99Cuj3n62vUxT980feLpa9fHPH3t+pinr10f8/S162OevnZ9xNM37fqYp69dH/P0tetjnr52fczTN02fePra9TFPX7s+5ulr18c8fe36mKevXR/x9It2fczT166Pefra9TFP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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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": "tx_tree_height", "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" } }, { "name": "side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }], "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": 32, "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": 32, "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" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint" } }, { "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": "new_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": "new_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": "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": "new_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": "tx_tree_height", "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": "set_portal", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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/72WzY7TMBDH3XbbbbtJyva7Tb+Sxg0SFy7sBcGdM08AAgkk4IDgAI/CO/Ai+xC8AXckDotn7PE/aXYrRUIbye14/P/NjD2R4ky1lOqeKfOslXvMrKsi1TF/TRrPlVjGoNGIVENcmhaJspbxq5Z2gDpjy2RQ7dT8XDxRkixTbVV+SN/hrHZUFRT73CrOaWRUO3v7WjSmlJYz+zaPaHp504WmWbcAW6TnkF7mI1xAFHTYvCDTjDCh9ZisqwYqbLnDIFmoaSGkqLZmF7y0qxvzkMoqSBwaxc3RQ0mtgnIHiFFIrSKriGg0fTiahkdT5adBmeues9lzu4h4k4/IwiarbaGnF3my18ZuKRAHeUzWnUGe/rhuls+pXzj523oblHsbcW/71d4GFolkr1gJ0VA6iQGX+Yysuxo64IYOKFTbN6OHqHtu+i3FhuViB3jBTLMbL83/A2Qi8aVuWqe6BHZpNaE1GX0Ht6BDRkkwBDoEOnToK7gFHTFKghHQEdCRQz/DLeiYURKMgY6Bjh36Fm5BJ4ySYAJ0AnTi0DdwCzpllARToFOgU4e+gFvQGaMkmAGdAZ059CPcgs4ZJcEc6Bzo3P7XRky2r3ALumCUBAugC6ALh36BW9AloyRYAl0CXVYLXfpX4ARisr2GW9CYURLEQGOgsUM/wC3oilESrICugK6qha78W3MCMdl2cAu6ZpQEa6BroOtqtrU/lppIXB8Z1UfG97KXyWnEHPY3uAXdMEqCDdAN0E0128b35wRisr2HW9AtoyTYAt0C3Tr0E9yC7hglwQ7oDuiuWujOZ6uJLO4ly7A+Ev/3wsxhf4db0IRREiRAE6BJNVvi3/SayOQ0wp/9v/iIZwwqfLnlU81CLZ9zE/GscIFJOVVaTrW3cGJNWSFzjxuAttcQ7VYO5sCIzRscIicXDc7+x85kj8TkWmQZstmFpttNjopy5ZMRoqkDvwtlHRV8JRfYDCFSfzYBziY9uo1he2nluvjrJ4W2N70EDQlcmJDrTuy74+9qVpO6ctLCGftyUpSzL5cTPnQ3QXvbx4L28B6wLsNZVlyRkyLRgStt26aJ/IATpr7pwtn7ZBrJ8nKyw0P33vCsw5ubX9P4B9hf6AanDQAA", "debug_symbols": "5Z3rShtRGEXfJb+lzN7n7quUUlIvRZAoXgpFfPeaxkTFlIAdF2eYf07yzex9GNYZlIXzsDg9+3H/8/vF6vzqdnH89WFxeXWyvLu4Wj0dPSyGL9LfT2+vl6v1B7d3y5u7xXFQGI4WZ6vT9Y85Px4tzi8uzxbHrunx6N20B+fnaQ+p7KYVy57pULfD0a9m3fZduWpXo76Z/Xa0Lh+mXD5NuXyecvky5fJ1yuXbhMt7+NzymxARIR4jJJddSG0HbkPZ3YbS0qsrD8+FQm+FYm+FUm+Fcm+FSm+Fam+FGl4oh12h/KbQ+9kW2vNsy+3AbEl1d934MuvNOsMwk3V6JuuMM1lnnsk6y0zWWWeyzpk8V+JMnitRM1nnTJ6f8fBvV+XtOjenpY+dlj92WvnYaf/YY+v2rgSHQ/dQyX6eVkqJ+4tCGqZcXlMu7ymXD1MuH6dcPn1u+U1IJkLKGCHlJaTmPSGVCGlASB6IEBEhJkLCyCFNe0IiEZKIkEyEFCKkEiENCCkDESIixEQIQXwhiC8E8YUgvhDEF4L4QhBfCeIrQXwliK8E8ZUgvhLEV4L4ShBfCeIrQXwjiG8E8Y0gvhHEN4L4RhDfCOIbQXwjiG8E8RoGJEVIipGUgKREJCUhKRlJKUhKRVIQ9oWwL4R9IewLYV8I+0LYF8K+EPaFsC+EfSPsG2HfCPtG2DfCvhH2jbBvhH0j7BthPyDsB4T9gLAfEPYDwn5A2A8I+wFhPyDsB4T9iLAfEfYjwn5E2I8I+xFhPyLsR4T9iLAfEfYTwn5C2E8I+wlhPyHsJ4T9hLCfEPYTwn5C2M8I+xlhPyPsI86eEGlPiLUnRNsT4u0JEfeEmHtC1D0h7p4QeU+IvSdE3xPi7wkR+IQYfEIUPiEOnxCJT4jFJ0TjE+LxCRH5hJh8QlQ+IS6fEJlPiM0nROcT4vMJEfqEGH1ClD4hTp8QqU+I1SdE6xPi9Rnx+ox4fUa8PiNen4eIpCQkJSMpBUmpSArCPuL1GfH6jHh9Rrw+I16fEa/PiNdnxOsz4vUZ8fqMeH1GvD4jXp8Rr8+I12fE6zPi9Rnx+ox4fUa8PiNenxGvz4jXZ8TrM+L1GfH6jHh9Rrw+I16fEa/PiNdnxOsz4vUZ8fqMeH1GvD4jXp8Rr8+I12fE6zPi9XkUr6+kuE0prb5JeT+dd8P51X8HfXn/xCgO4LiNQneNYneNUneNcneNaneNWm+NRjEax23U3Q6Zu9shc3c7ZO5uh8zd7ZC5ux1yFAu0pu202hD+t1HtrlHrrdEoJuq4jdRdI3fXKHTXKHbXKHXXKHfXqLs9u3S3Z5fu9uza0579dPRreXOx/HF5tn5h7/rL+9XJ9v29T4d3v6833zzN/gE=" }, { "name": "check_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(view)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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": "5ZztjpTHFYTvZX+jqM/pqv7gVqIowjaOkNBiGRwpQr73LMl8LNqRlzqZrKfEL3uhe/r0VjHF1rw8n+9+evvDb//4+7v7nz98vHv918937z/8+ObTuw/3D199vmt/ifjPr3785c39l1/4+OnNr5/uXrdXd2/vf3r47++v7n5+9/7t3etc/P1vr75sSHVDVzdA3UB1w1A3THXDUjdscUM2dYOqdKpKp6p0qkqnqnSqSqeqdKpKp6p0V5XuqtJdVbqrSndV6a4q3VWlu6p0V5XuqtJQlYaqNFSloSoNVWmoSkNVGqrSUJWGqjRVpakqTVVpqkpTVZqq0lSVpqo0VaWpKj1UpYeq9FCVHqrSQ1V6qEoPVemhKj1UpYeq9FSVnqrSU1V6qkpPVempKj1Vpaeq9FSVnqrSS1V6qUovVemlKr1UpZeq9FKVXqrSS1V6qUpvVemtKr1Vpbeq9FaV3qrSW1V6q0pvVemtKh2tyTvk7qTJ5UmT25Mm1ydN7k+aXKA0uUFpcoXSZM1D1lzvy/TCTG/M9MpM78z00kxvzfTaTO7NQi7OIvWOVNZc7s5CLs9Cbs9Crs9C7s9CLtBCbtBCrtBC7tCi68W4rLlco4Xco4VcpIXcpIVcpYXcpYVcpoXcpoVcpwX0T0NkzeVGLeRKLeROLeRSLeRWLeRaLeReLeRiLeRmLeRqLeRuLeRyLeR2LeR6LeR+LeSCLeSGLeSKLeSOLeSSLYb+uaesudyzhVy0hdy0hVy1hdy1hVy2hdy2hVy3hdy3xdQ/7JY1lyu3kDu3kEu3kFu3kGu3kHu3kIu3kJu3kKu3WPoTDrLmcvsWcv0Wcv8WcgEXcgMXcgUXcgcXcgkXcgsXW3+sRX+uRX6wRe7hUu7hUu7hUu7hUu7hUu7hUu7hUu7hUu7hMvSHmWTN5R4u5R4u5R4u5R4u5R4u5R4u5R4u9efX9AfYCk+wyZrrz7DpD7HpT7Hpj7Hpz7HpD7LJPVzKPVzKPVx2/bFFWXO5h0u5h0u5h0u5h0u5h0u5h0u5h0u5h0u5h0voz6rKmss9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XMo9XA79qXRZc7mHS7mHS7mHS7mHS7mHS7mHS7mHS7mHS7mHy6n/UwRZc7mHS7mHS7mHy8s9HPs+biJif7Xv1ZPVyNUPq9HbeTVwYfHkOqydG+cXzuM8eWPz4Mbm4Y3NM25snnmFeXqu0zx9PJ7ncMh6iUP2NQ4ZPB0y4+khl0tc+RCcDlntwiH5EodcDBaC43TIHM8cwjgZkQ9t9Wn17hcWD7TjSw/kV4sPE11+63i4yXmi+cxEux9Nstc6rQ3khbUPn7Af1j50wY/+ZFwafmPv4wtz9PPqvo/T03r6YT39tJ5+WU+/jafvlz9usZk+rafv1tM7p1VvzmnVm3Na9eacVr05p1Vv1ml1+aNlm+mtszaukLXRxvHnpYhsz8x/uYa69BN+HH/CH4+/JzhODtvJaTv5sJ182k6+bCffrpNns508bCe3TaLstpPbZmjaZmjaZmjaZmjaZmjaZmi3zdBum6HdNkO7bYZ22wztthnabTO022Zot83QbpuhsM1Q2GYobDMUthkK2wyFbYbCNkNhm6GwzVDYZihtM5S2GUrbDKVthtI2Q2mbobTNUNpmKG0zlLYZOmwzdNhm6LDN0GGbocM2Q4dthg7bDB22GTpsM3TYZui0zdBpm6HTNkOnbYZO2wydthk6bTN02mbotM3QaZuhyzZDl22GLtsMXbYZumwzdNlm6LLN0GWbocs2Q5dthm7bDN22GbptM3TbZug1uDt/0uS2GbptM3TbZui2zdDtmqForhmK5pqhaK4ZiuaaoWiuGYrmmqForhmK5pqhaK4ZimaboWGboWGboba0H4RthtpyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKYItpwi2nCLYcopgyymCLacItpwi2HKKYMspgi2nCLacIthyimDLKaItp4i2nCLacopoyylic81Q2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4i2nCLacopoyymiLaeItpwi2nKKaMspoi2niLacItpyimjLKaItp4jfwClaeG7y6OfJB7465enqvo4vjTx/TyL3hbW5jtP3WF+tPUw/radf1tNv4+nHN3CLbnn6+P9OfzglX+SUfo1TJk6n7PGMEjHm8e3z4X/3+bV7O86EG5yJNzjTuMGZ5g3OtG5wpv3yM53+MhJjta9meroauY7vHOjtfIOLLz25jn/N2Y+GzsNdo31Hd83v6K79O7orvqO78sbv2nOd7trH47seLjDcLzBv/QKDpwvMuHCBdfMXwOkCj1afL/B8Pu/nOoWx8njIWH09PeQbsDlXOCRe4pC8xiHg6ZBxQZNv4MZc4RC8xCG8iib9fEj+8Tt+j9FOP9PO8+J+HGi99ECZeRwoO54MhKt8h/bxLWHsxqcyfMM/6Xv+kB15OuRRtXA+ZF7lJu18yP7ftGZ76YGe0Xpc4zu0edZ69T8eKPvJqdnZng60b2ygKRv1sG8V9+3avtWK+6K4L4v7enEfivtY3FfUfc3ivqJfVtEvu+iXXfTLLvplF/2yi37ZRb/sol920S+76Jdd88tsrbgvivuyuK8X96G4j8V9o7hvFvet4r6iX6Lolyj6JYp+iaJfouiXKPolin6Jol+i6Jco+iWLfsmiX7Lolyz6JYt+yaJfsuiXLPoli37Jol960S+96Jde9Esv+qUX/dKLfulFv/SiX3rRL73oFxT9gqJfUPQLin5B0S8o+gVFv6DoFxT9gqJfWPQLi35h0S8s+oVFv7DoFxb9wqJfWPQLi34ZRb+Mol9G0S+j6JdR9Mso+mUU/TKKfhlFv4yiX2bRL7Pol1n0yyz6ZRb9Mot+Kfa0cxb9Uux3Z7HfnYV+9+Grf7759d2bH96//fiw58tv/nb/46d3H+4PX3761y///Z2Htf8G" }, { "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/+2b227aQBCG18RJTJ24YGMMgQQIyUXvDA2nO16mfe3eV+orVM2YnTJsp2hRx1tWYqWIsb2e/5t/D1jICdSuRe9/gY6v9eeN+rNhn63+LP+tzQRzlXVyBp5wNjzhvPKEMxTkDBhO+Ax1DOsO1tytOlyPv9tWqChTlELBBLoi19URwIMboUU6oBfHUuDrcnNDklNwpcFDfQ0/ASfW1yhYrIus+pBzWGiDnEOdK3IOd0bUibQpwvUuoj2yXN73CQA1NHUu5I5JTK8NiXVhTTVey9f4VsuYlLtVjGNyrXPfkmP0Cj0U/OaYUe1A/zWJptJjhPGA9MV+6EeDjDG0e7Wf180j94XGfQnpc8PUPxau/9bgMecsjEFLx204xj2BsH0g9W1l2ErIG8vnndExCHVu5I9JTYm43/M15L9Th838VhqTOCE89+I85ayeOndj95Gwy+RdvIFXLcOrO8OrhPShDK0a/AuILubG4xajLefFcg3abQsv2gxP27EXbUZb0IsNaKcWXqQMT+rYi5TRlvNi9Rm0MwsvMoYnc+xFxmjLeTGvni06Fl50GJ6OYy86jLbgGqnmRW7hRc7w5I69yBltQS++gnbXwosuw9N17EWX0Rb04gtoFxZeFAxP4diLgtEW3Dur54uehRc9hqfn2Iseoy3oxRy0+xZe9BmevmMv+oy24BqptB8svHhgeB4ce4F6pzJ3PGQuPGTOzoA5MmIZ7WW1fw4svBgwPAPHXtDfck5hzs+AOTJiGe3lArSHFl4MGZ6hYy9Q71Tm1EPmzEPmrofMuYfMhYfM5zCfIyOW0V5Ve+ijhRePDM+jYy9Q71Tm1EPmgYfM2RkwR0Yso72qfpt7svDiieF5cuwF6p3K3POQuX0GzJERy2ivlqA9svBixPCMHHuBeqcy9z1kLjxkHnjInHnI3PWQOfeQ+bIG3TCnZ8AM773gOzA/auWZb2KDBz1TBqMyGGMSJ4QR+26V3PsqiVE7ak3E/diNjzlf8HhSq/Z8DXmn8jVVz/IvOhe+wzdlanrVcSDs5wvJGxAdPB+S+Dvpi/3QD1y3yA7vXD3r+PXIfSPjvoT0eWbqHwvXPzV4pgYzjMk3wlHH3LKZ1y21X8ufCE8N++AbfScXm82+Q/cYQZ5ZTXWW9B2+n0p2TU8Mr5qGVwnpQ/fo/7VvXpgvzH9jps8TTXKO8uC5hlEL/f+GCcnxC57ToyHuNQAA", "debug_symbols": "ndpRattAGIXRveg5FN/fGs0oWymlOIlTDMEJsVMoJnuv3dIF9LxpJN237+kwl+lp//Dx4/vh+Px6mu6/XqaX18fd+fB6vJ4u0+ZLjT9vT2+74+3F6bx7P0/321530/74dHvqn3fT8+FlP93XaJ/f7m6jFUbbjYwio5LRVkazjJqMFhl1GUkRWyliliJmKWKWImYpYpYiZililiJmKWKWImYpokkRTYpoUkSTIpoU0aSIJkU0KaJJEU2KWKSIRYpYpIhFilikiEWKWKSIRYpYpIhFiuhSRJciuhTRpYguRXQpoksRXYroUkSXIoYUMaSIIUUMKWJIEUOKGFLEkCKGFDGkiFWKWKWIVYpYpYhVililiFWKWKWIVYpYpYhsNrQKrYpWW1rNtGq0WmjVaTVoRW2E2gi1EWoj1EaojVAboTZCbYTaCLVR1EZRG0VtFLVR1EZRG0VtFLVBoBkSzRBphkwzhJoh1QyxZsg1Q7AZks0QbYZsM4SbId0M8WbIN0PAGRLOEHGGjDOEnCHlDDFnyDlD0BmSzhB1hqwzhJ0h7QxxZ8g7Q+AZEs8QeYbMM4SeIfUMsWfIPUPwGZLPEH2G7DOEnyH9DPFnyD9DABoS0BCBhgw0hKAhBQ0xaMhBQxAaktAQhYYsNIShIQ0NcWjIQ0MgGhLREImGTDSEoiEVDbFoyEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFyy56kosWuWiRixa5aJGLFrlokYvWf7vo9fRz937YPbzsb3d7bx8/jo//rvpej+dfb3+/XP/9DQ==" }, { "name": "_increase_public_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(internal)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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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" }, { "name": "balance_of_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(view)"], "abi": { "error_types": {}, "parameters": [{ "name": "inputs", "type": { "fields": [{ "name": "selector", "type": { "kind": "field" } }, { "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/rRBAH8E0apyU0ztVp7o2buLm7PSUgjqA8IiQekXgEcRcSN3ER4ivypWBndmf/SX3kaqUj60Ry44zntzO7TtpsF+pMqYtA6cdE2UdFR1SoqvqpTMdHSs70CR2lUJUklNBFUuZMx9VZYoGq8JmuoIIb/eMyUWaEi8q7dKFCYy1UidB5QGNSbXWuj+qCGlPv66OWSGO6zpk9rdEPk0PsrQWu6AE/1s9vm+QLm3yZlE1QXYJdmpyaOWX6F8JC60wpoQ5aB61b+gvCQkOmlBCChqChpd8gLLTBlBIaoA3QhqV/Iiy0yZQSmqBN0KalPyIstMWUElqgLdCWpb8iLLTNlBLaoG3QtnnOkno+0dVmCAvtMKWEDmgHtGPp1wgL7TKlhC5oF7Rr6VcIC42YUkIEGoFGlv6EsNAeU0rogfZAe9nl6blqnqTuT8J8ouf0HcJCr5hSwhXoFeiVpV8iLLTPlBL6oH3QfrbRvnuD5RBd7XuEhQ6YUsIAdAA6yFYbuAZziK72G8JCh0wpYQg6BB1mqw3d7xhP0vEnkT9p+pPQn7QLqdL1J/VC5tIqpLFn7r5+R/+DsNARU0oYgY5AR9lqI7cMnqTjT3qFNBb6k64/iQohz6yYfhd8i7DQMVNKGIOOQcfZamO32DlEV/sDYaETppQwAZ2ATrLVJu6LjyfpFlKl6U/CQuYSFUKG+SSm+BTf/V8yVPjCL9/weaOSyC5Aj1hReEy51PS01LXBE3MqV2hzcY2NQ1zl09gm3diNybzEQ8wpRAe3OTKvZI4UmyeSNkM1c6FsgmqOjubKFSMS68ul5lFbTxp+r2Rn+9Lk8ByTow2bTGJ6ui+qYnrThQrU6YPvAm/0uJK9IRU7TI37npgPqAxob8PUtjN9FQnyyUlLMpnrDypHORVzZ572S4+Z6ZeWcxbwac2+DBZcTt2YnWRgb1hsinxI7xm3YnOsWHK6Ygu0l+gBP9PPtyZ5bpOXPMlbOgNbmpzEnNJzljT8SSuf6AZ/R1joiiklrEBXoKtstZX7zZFDdLUfEBa6ZkoJa9A16Dpbbe3+BHmStj8Z+5PIn7T8SeO1T1/fn3uEhW6YUsIGdAO6yVbbuGqepO5PWv6kUchcuv4kKoQ8s2L6XfA3wkK3TClhC7oF3Warbd2n1JOM8oluMEVY6I4pJexAd6C7bLWdu7We5NafNPxJy58s/UnXn6z8Sa+Q+zL2J1Eh96VRyFyeWTH9ufkZYaF7ppSwB92D7rPV9u5/TZ5k7E8a/qT9pjbW9SfLN3XF+oXMpeVPdq99+vpz8wJhoSlTSkhBU9A0Wy11f6JyCO3oyp9i3/HIUGGzIbuL1G0+EjPi8S72jkvdnZa6Nzg1p3KFNjb32LQ8mF3sg016x+5iD2YXe6AQHdzmJ+aVzJHMIZG0F6hmLpRNUB3Q0UG5YkQeZnrQx6O2njTMu1ia7SOGuHNrE2Bt7k73ZPGybPd5vLHLbC1jezU+GrbqNp28ijzfz10T9nFmynJamtjbqWqh21fqEYP/njzImAyiwTmfxvalKfTFaaGQ7y2PFyK75KoEtpJNP2pQpQZQWym/QWJpsux4asLSEa+G+/dInIgqz+m0/y8d/wMOUhUC9x0AAA==", "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::_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" } }], "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": "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": "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": "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": "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" }] } }, "file_map": { "116": { "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\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 event_selector: Field,\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 event_bytes = event_selector.to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[32 + i] = event_bytes[i];\n }\n let len_bytes = (n as Field).to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[36 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[40 + 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() < ARGS_HASH_CHUNK_COUNT * ARGS_HASH_CHUNK_LENGTH);\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..800 {\n input.add(i as Field);\n }\n let hash = input.hash();\n assert(hash == 0x05a1023fef839ac88731f49ae983e172c1b600a3c8f3393ad0ac25d819ac0f0f);\n}\n\n#[test]\nfn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let event_selector = 5;\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00846d6969c8c2f61d39cd2762efcb0abb14f88d59c2675910251ef2bcffe9a7);\n}\n\n#[test]\nfn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let event_selector = 5;\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00880a801230ea08c98a802a11b4786cba474513875f0fc69a615e81c5f9f21c);\n}\n\n#[test]\nfn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let event_selector = 5;\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x00a78b5347813624ecfd26e5b8bc6146f418b0cfcc8296b5112d09b8ebba9496);\n}\n\n#[test]\nfn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let event_selector = 5;\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n assert(hash == 0x001f3390ea242afee7ce46dafdbdc4bd4f1cf20cd63850d12d60ff9956712c4f);\n}\n" }, "122": { "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" }, "125": { "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" }, "129": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/storage.nr", "source": "use dep::protocol_types::traits::{Deserialize, Serialize};\n\n#[oracle(storageRead)]\nunconstrained fn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<N>(storage_slot: Field) -> [Field; N] {\n storage_read_oracle_wrapper(storage_slot)\n}\n\n#[oracle(storageWrite)]\nunconstrained fn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n" }, "132": { "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" }, "136": { "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 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" }, "137": { "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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_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 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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0,\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" }, "139": { "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" }, "142": { "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" }, "144": { "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 crate::oracle::storage::storage_write;\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> PublicMutable<T, &mut PublicContext> {\n // docs:start:public_mutable_struct_read\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n let fields = T::serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T> PublicMutable<T, UnconstrainedContext> {\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n // This looks the same as the &mut PublicContext impl, but is actually very different. In public execution the\n // storage read oracle gets transpiled to SLOAD opcodes, whereas in unconstrained execution the PXE returns\n // historical data.\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n" }, "147": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr", "source": "use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext},\n oracle::{storage::{storage_read, storage_write}}, 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> SharedImmutable<T, &mut PublicContext> {\n // Intended to be only called once. \n pub fn initialize<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n // TODO(#4738): Uncomment the following assert\n // assert(\n // self.context.public.unwrap_unchecked().is_deployment(), \"SharedImmutable can only be initialized during contract deployment\"\n // );\n\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 fields_read: [Field; 1] = storage_read(initialization_slot);\n assert(fields_read[0] == 0, \"SharedImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n storage_write(initialization_slot, [0xdead]);\n\n let fields_write = T::serialize(value);\n storage_write(self.storage_slot, fields_write);\n }\n\n pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n\nimpl<T> SharedImmutable<T, UnconstrainedContext> {\n pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n\nimpl<T> SharedImmutable<T, &mut PrivateContext> {\n pub fn read_private<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\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" }, "163": { "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}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered, utils::reader::Reader,\n abis::gas_fees::GasFees\n};\nuse dep::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: 0 }\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" }, "165": { "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};\nuse dep::std::cmp::Eq;\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, nullifier_counter: u32, contract_address: AztecAddress) -> ScopedNoteHash {\n ScopedNoteHash { note_hash: self, nullifier_counter, contract_address }\n }\n}\n\nstruct ScopedNoteHash {\n note_hash: NoteHash,\n nullifier_counter: u32,\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.nullifier_counter == other.nullifier_counter)\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 nullifier_counter: 0,\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.nullifier_counter as Field, 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 nullifier_counter: reader.read_u32(),\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 assert(\n (self.nullifier_counter == 0) | (read_request.counter() < self.nullifier_counter), \"Read request counter must be less than the nullifier 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" }, "166": { "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" }, "167": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr", "source": "use crate::abis::{function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs};\nuse crate::address::AztecAddress;\nuse crate::constants::GENERATOR_INDEX__CALL_STACK_ITEM;\nuse crate::traits::Hash;\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n // WARNING: if updating, see comment in public_call_stack_item.ts's `PublicCallStackItem.hash()`\n let public_inputs = self.public_inputs;\n let mut request_public_inputs = PublicCircuitPublicInputs::empty();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs\n };\n call_stack_item\n }\n}\n\nmod tests {\n use crate::{\n abis::{\n function_data::FunctionData, function_selector::FunctionSelector, note_hash::NoteHash,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem\n },\n address::AztecAddress, constants::GENERATOR_INDEX__CALL_STACK_ITEM, traits::Hash\n };\n\n #[test]\n fn compute_call_stack_item_request_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.new_note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: true, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item request hash\" test\n let test_data_call_stack_item_request_hash = 0x2751111aa213d9d21279da53531bf90c2da272cf3f959e2a2a1dfceb487bf102;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_request_hash);\n }\n\n #[test]\n fn compute_call_stack_item_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.new_note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: false, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item hash\" test\n let test_data_call_stack_item_hash = 0x1860d00d9602966e398c6d585216baba2ffa8c5eddda5faee041136665d8482a;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash);\n }\n}\n" }, "168": { "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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_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 new_note_hashes: u32,\n new_nullifiers: u32,\n new_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 new_note_hashes: validate_array(public_inputs.new_note_hashes),\n new_nullifiers: validate_array(public_inputs.new_nullifiers),\n new_l2_to_l1_msgs: validate_array(public_inputs.new_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 new_note_hashes: [NoteHash; MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier; MAX_NEW_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 new_l2_to_l1_msgs: [L2ToL1Message; MAX_NEW_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.new_note_hashes == other.new_note_hashes) &\n (self.new_nullifiers == other.new_nullifiers) &\n (self.private_call_requests == other.private_call_requests) &\n (self.public_call_stack_hashes == other.public_call_stack_hashes) &\n (self.new_l2_to_l1_msgs == other.new_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.new_note_hashes.len() {\n fields.extend_from_array(self.new_note_hashes[i].serialize());\n }\n for i in 0..self.new_nullifiers.len() {\n fields.extend_from_array(self.new_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.new_l2_to_l1_msgs.len() {\n fields.extend_from_array(self.new_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 new_note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL]),\n new_nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NEW_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 new_l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_NEW_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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_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 new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_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 = 0x1970bf189adc837d1769f9f44a8b55c97d45690e7744859b71b647e808ee8622;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "170": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/global_variables.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "171": { "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};\nuse dep::std::cmp::Eq;\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" }, "174": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request_and_generator.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "175": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr", "source": "use dep::std::cmp::Eq;\nuse crate::{\n constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize},\n grumpkin_point::GrumpkinPoint\n};\n\nstruct KeyValidationRequest {\n pk_m: GrumpkinPoint,\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: GrumpkinPoint::zero(),\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.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: GrumpkinPoint::new(fields[0], fields[1]),\n sk_app: fields[2],\n }\n }\n}\n\n" }, "179": { "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" }, "188": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_selector.nr", "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\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 = dep::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" }, "189": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr", "source": "use dep::std::cmp::Eq;\nuse crate::{\n abis::{caller_context::CallerContext, side_effect::{Ordered, RangeOrdered, Scoped}},\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 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.hash == other.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 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.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 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\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" }, "194": { "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" }, "203": { "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 = 0x22786e4f971661d2e49095e6b038e5170bc47b795253916d5657c4bdd1df50bf;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "204": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/caller_context.nr", "source": "use crate::address::AztecAddress;\nuse dep::std::cmp::Eq;\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" }, "206": { "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\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" }, "209": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/append_only_tree_snapshot.nr", "source": "use dep::std::cmp::Eq;\n\nstruct 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" }, "21": { "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" }, "210": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr", "source": "use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n abis::{gas_settings::GasSettings, gas::Gas}, 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 side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl CallContext {\n fn assert_is_zero(self) {\n let serialized: [Field; CALL_CONTEXT_LENGTH] = self.serialize();\n\n for i in 0..CALL_CONTEXT_LENGTH {\n assert(serialized[i] == 0);\n }\n }\n}\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 serialized.push(self.side_effect_counter 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 side_effect_counter: reader.read() as u32,\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 side_effect_counter: 0,\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 assert_is_zero() {\n let context = CallContext::empty();\n context.assert_is_zero();\n}\n\n#[test(should_fail)]\nfn not_zero_assert_is_zero() {\n let mut context = CallContext::empty();\n context.is_delegate_call = true;\n context.assert_is_zero();\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" }, "211": { "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" }, "212": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr", "source": "use crate::{\n abis::{\n call_context::CallContext, note_hash::NoteHash, nullifier::Nullifier, read_request::ReadRequest,\n gas::Gas, global_variables::GlobalVariables, log_hash::LogHash\n},\n address::AztecAddress,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL, MAX_NEW_NOTE_HASHES_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, MAX_UNENCRYPTED_LOGS_PER_CALL\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n hash::pedersen_hash, header::Header, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Hash, Serialize, Deserialize, Empty}, utils::reader::Reader\n};\n\nstruct PublicCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\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 nullifier_non_existent_read_requests: [ReadRequest; MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest; MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_note_hashes: [NoteHash; MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during public execution. Set by sequencer to be a header of a block\n // previous to the one in which the tx is included.\n historical_header: Header,\n\n // Global variables injected into this circuit\n global_variables: GlobalVariables,\n\n prover_address: AztecAddress,\n\n revert_code: u8,\n \n start_gas_left: Gas,\n end_gas_left: Gas,\n transaction_fee: Field,\n}\n\nimpl Eq for PublicCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Serialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_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 for i in 0..MAX_NOTE_HASH_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_non_existent_read_requests[i].serialize());\n }\n for i in 0..MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.l1_to_l2_msg_read_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.extend_from_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.extend_from_array(self.contract_storage_reads[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_NOTE_HASHES_PER_CALL {\n fields.extend_from_array(self.new_note_hashes[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL {\n fields.extend_from_array(self.new_nullifiers[i].serialize());\n }\n for i in 0..MAX_NEW_L2_TO_L1_MSGS_PER_CALL {\n fields.extend_from_array(self.new_l2_to_l1_msgs[i].serialize());\n }\n\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n for i in 0..MAX_UNENCRYPTED_LOGS_PER_CALL{\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.global_variables.serialize());\n fields.push(self.prover_address.to_field());\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 fields.push(self.transaction_fee);\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn deserialize(serialized: [Field; PUBLIC_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 = PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\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 nullifier_non_existent_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL]),\n l1_to_l2_msg_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL]),\n contract_storage_update_requests: reader.read_struct_array(StorageUpdateRequest::deserialize, [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL]),\n contract_storage_reads: reader.read_struct_array(StorageRead::deserialize, [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL]),\n new_nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_NEW_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 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 global_variables: reader.read_struct(GlobalVariables::deserialize),\n prover_address: reader.read_struct(AztecAddress::deserialize),\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 transaction_fee: reader.read(),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PublicCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PublicCircuitPublicInputs {\n fn empty() -> Self {\n PublicCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\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 new_note_hashes: [NoteHash::empty(); MAX_NEW_NOTE_HASHES_PER_CALL],\n new_nullifiers: [Nullifier::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0 as u32,\n end_side_effect_counter: 0 as u32,\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 as u8,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0,\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PublicCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PublicCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PublicCircuitPublicInputs::empty();\n let hash = inputs.hash();\n\n // Value from public_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x01681b19fb7fe21aa9c2cf9fb47520149f46edd679b2e7c2b2c4a279fd685125;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "214": { "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" }, "22": { "path": "std/field.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" }, "221": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils.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" }, "222": { "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" }, "223": { "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" }, "230": { "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" }, "231": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr", "source": "use dep::std::cmp::Eq;\nuse 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" }, "232": { "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" }, "235": { "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 tx_tree_height: 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.tx_tree_height);\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 tx_tree_height = 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 tx_tree_height,\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 tx_tree_height: 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.tx_tree_height == other.tx_tree_height)\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" }, "236": { "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 dep::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" }, "238": { "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" }, "239": { "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 dep::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\npub fn 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 dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<N>(inputs: [Field; N]) -> Field {\n dep::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" }, "240": { "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" }, "242": { "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" }, "244": { "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" }, "246": { "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 = dep::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" }, "248": { "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" }, "260": { "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" }, "267": { "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" }, "28": { "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\n pub fn hash<N>(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<N>(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" }, "280": { "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" }, "281": { "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, grumpkin_point::GrumpkinPoint,\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" }, "282": { "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" }, "283": { "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" }, "285": { "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" }, "286": { "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" }, "288": { "path": "/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr", "source": "mod events;\n\ncontract 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\n };\n\n use crate::events::{instance_deployed::ContractInstanceDeployed};\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_new_nullifier(address.to_field(), 0);\n\n // Broadcast the event\n let event = ContractInstanceDeployed { contract_class_id, address, public_keys_hash, initialization_hash, salt, deployer, version: 1 };\n let event_payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", event_payload);\n context.emit_unencrypted_log(event_payload);\n }\n}\n" }, "29": { "path": "std/hash.nr", "source": "mod poseidon;\nmod mimc;\nmod poseidon2;\n\nuse crate::default::Default;\nuse crate::uint128::U128;\nuse crate::sha256::{digest, sha256_var};\nuse crate::embedded_curve_ops::EmbeddedCurvePoint;\n\n#[foreign(sha256)]\n// docs:start:sha256\npub fn sha256<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:sha256\n{}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<N>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<N>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[foreign(pedersen_commitment)]\npub fn __pedersen_commitment_with_separator<N>(input: [Field; N], separator: u32) -> [Field; 2] {}\n\npub fn pedersen_commitment_with_separator<N>(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<N>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[foreign(pedersen_hash)]\npub fn pedersen_hash_with_separator<N>(input: [Field; N], separator: u32) -> Field {}\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<N>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<N>(_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, N> 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" }, "293": { "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_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE\n },\n traits::Serialize\n };\n\n use crate::events::{\n class_registered::ContractClassRegistered,\n private_function_broadcasted::{ClassPrivateFunctionBroadcasted, PrivateFunction},\n unconstrained_function_broadcasted::{ClassUnconstrainedFunctionBroadcasted, UnconstrainedFunction}\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_new_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 context.emit_contract_class_unencrypted_log(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: PrivateFunction\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: function_data\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 context.emit_contract_class_unencrypted_log(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: UnconstrainedFunction\n ) {\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: function_data\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 context.emit_contract_class_unencrypted_log(event.serialize());\n }\n}\n" }, "3": { "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, N> 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<N> 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, N> 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" }, "31": { "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<N>(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" }, "44": { "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<N>(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() {\n let num = U128::from_u64s_le(0, 0);\n let not_num = num.not();\n\n let max_u64: Field = pow64 - 1;\n assert_eq(not_num.hi, max_u64);\n assert_eq(not_num.lo, max_u64);\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 #[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" }, "79": { "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 dep::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" }, "84": { "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 dep::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" }, "87": { "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" }, "90": { "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;\n\ntrait CallInterface<N, T, P, Env> {\n fn get_args(self) -> [Field];\n fn get_original(self) -> fn[Env](T) -> P;\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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\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 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 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 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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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\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 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 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 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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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\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 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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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\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 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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\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\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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\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\nstruct PublicVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool\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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\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\nstruct PublicStaticCallInterface<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> 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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\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\nstruct PublicStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool\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 // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::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" }, "91": { "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,\n hash::{hash_args_array, ArgsHasher, compute_unencrypted_log_hash},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n note::note_interface::NoteInterface,\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::{\n emit_encrypted_note_log, emit_encrypted_event_log,\n emit_contract_class_unencrypted_log_private_internal, emit_unencrypted_log_private_internal\n},\n logs_traits::{LensForEncryptedLog, ToBytesForUnencryptedLog},\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 hash::sha256_to_field,\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_NEW_NOTE_HASHES_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_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 contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n grumpkin_private_key::GrumpkinPrivateKey, grumpkin_point::GrumpkinPoint, header::Header,\n messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::{is_empty, Empty},\n utils::arrays::find_index\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 new_note_hashes: BoundedVec<NoteHash, MAX_NEW_NOTE_HASHES_PER_CALL>,\n new_nullifiers: BoundedVec<Nullifier, MAX_NEW_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 new_l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_NEW_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 new_note_hashes: BoundedVec::new(),\n new_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 new_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_new_note_hash(&mut self, note_hash: Field) {\n self.new_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_new_nullifier(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.new_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 new_note_hashes: self.new_note_hashes.storage,\n new_nullifiers: self.new_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 new_l2_to_l1_msgs: self.new_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.new_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_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n // TODO: We might want to remove this since emitting unencrypted logs from private functions is violating privacy.\n // --> might be a better approach to force devs to make a public function call that emits the log if needed then\n // it would be less easy to accidentally leak information.\n // If we decide to keep this function around would make sense to wait for traits and then merge it with emit_unencrypted_log.\n pub fn emit_unencrypted_log<T, N, M>(&mut self, log: T) where T: ToBytesForUnencryptedLog<N, M> {\n let event_selector = 5; // TODO: compute actual event selector.\n let contract_address = self.this_address();\n let counter = self.next_counter();\n let log_slice = log.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(contract_address, event_selector, log);\n // 44 = addr (32) + selector (4) + raw log len (4) + processed log len (4)\n let len = 44 + log_slice.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n self.unencrypted_logs_hashes.push(side_effect);\n // call oracle\n let _void = emit_unencrypted_log_private_internal(contract_address, event_selector, log, counter);\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 pub fn emit_contract_class_unencrypted_log<N>(&mut self, log: [Field; N]) {\n let event_selector = 5; // TODO: compute actual event selector.\n let contract_address = self.this_address();\n let counter = self.next_counter();\n let log_hash = emit_contract_class_unencrypted_log_private_internal(contract_address, event_selector, log, counter);\n // 44 = addr (32) + selector (4) + raw log len (4) + processed log len (4)\n let len = 44 + N * 32;\n let side_effect = LogHash { value: log_hash, counter, length: len };\n self.unencrypted_logs_hashes.push(side_effect);\n }\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, encrypted_log: [u8; M]) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = encrypted_log.len() as Field + 4;\n let log_hash = sha256_to_field(encrypted_log);\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, encrypted_log, counter);\n }\n\n pub fn emit_raw_note_log<M>(&mut self, note_hash_counter: u32, encrypted_log: [u8; M]) {\n let counter = self.next_counter();\n let len = encrypted_log.len() as Field + 4;\n let log_hash = sha256_to_field(encrypted_log);\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, encrypted_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.call_context.side_effect_counter, start_side_effect_counter);\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 { hash: item.hash(), caller_context, start_side_effect_counter, end_side_effect_counter }\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.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.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.call_context.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 new_note_hashes: BoundedVec::new(),\n new_nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n new_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" }, "93": { "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::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 storage_address(self) -> AztecAddress {\n storage_address()\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 * Emit a log with the given event selector and message.\n *\n * @param event_selector The event selector for the log.\n * @param message The message to emit in the log.\n */\n pub fn emit_unencrypted_log_with_selector<T, N>(\n &mut self,\n event_selector: Field,\n log: T\n ) where T: Serialize<N> {\n emit_unencrypted_log(event_selector, Serialize::serialize(log).as_slice());\n }\n // For compatibility with the selector-less API. We'll probably rename the above one.\n pub fn emit_unencrypted_log<T, N>(&mut self, log: T) where T: Serialize<N> {\n self.emit_unencrypted_log_with_selector(/*event_selector=*/ 5, log);\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 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 block_number(self) -> Field {\n block_number()\n }\n\n fn timestamp(self) -> u64 {\n timestamp()\n }\n\n fn transaction_fee(self) -> Field {\n transaction_fee()\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_new_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 temporary_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 temporary_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 temporary_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 temporary_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_new_note_hash(&mut self, note_hash: Field) {\n emit_note_hash(note_hash);\n }\n fn push_new_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 fn msg_sender(self) -> AztecAddress {\n sender()\n }\n fn this_address(self) -> AztecAddress {\n address()\n }\n fn chain_id(self) -> Field {\n chain_id()\n }\n fn version(self) -> Field {\n version()\n }\n fn selector(self) -> FunctionSelector {\n FunctionSelector::from_field(self.inputs.selector)\n }\n fn get_args_hash(self) -> Field {\n self.inputs.args_hash\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\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 let MAX_POSSIBLE_FIELD: Field = 0 - 1;\n [\n user_gas.l2_gas.unwrap_or(MAX_POSSIBLE_FIELD),\n user_gas.da_gas.unwrap_or(MAX_POSSIBLE_FIELD)\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 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 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 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(event_selector: Field, message: [Field]) {\n emit_unencrypted_log_opcode(event_selector, 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\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(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\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(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(amvOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(event_selector: Field, 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\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" } } }