@aztec/protocol-contracts 0.41.0 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/artifacts/ContractClassRegisterer.json +1 -1
- package/dest/artifacts/ContractInstanceDeployer.json +1 -1
- package/dest/artifacts/GasToken.json +1 -1
- package/dest/artifacts/KeyRegistry.json +1 -1
- package/dest/artifacts/MultiCallEntrypoint.json +1 -1
- package/dest/gas-token/index.d.ts +5 -3
- package/dest/gas-token/index.d.ts.map +1 -1
- package/dest/gas-token/index.js +10 -6
- package/dest/instance-deployer/index.js +2 -2
- package/package.json +4 -4
- package/src/artifacts/ContractClassRegisterer.json +1 -1
- package/src/artifacts/ContractInstanceDeployer.json +1 -1
- package/src/artifacts/GasToken.json +1 -1
- package/src/artifacts/KeyRegistry.json +1 -1
- package/src/artifacts/MultiCallEntrypoint.json +1 -1
- package/src/gas-token/index.ts +12 -6
- package/src/instance-deployer/index.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "transpiled": true, "noir_version": "0.29.0+78f13d9e0070502a980003c7ded3738fd353dd5a", "name": "GasToken", "functions": [{ "name": "check_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "fee_limit": [{ "end": 42, "start": 41 }], "inputs": [{ "end": 41, "start": 0 }] }, "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": "public_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": "start_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "aztec::context::inputs::public_context_inputs::PublicContextInputs" }, "visibility": "private" }, { "name": "fee_limit", "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": "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": "nullifier_non_existent_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": "contract_storage_update_requests", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest" } } }, { "name": "contract_storage_reads", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "current_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead" } } }, { "name": "public_call_stack_hashes", "type": { "kind": "array", "length": 16, "type": { "kind": "field" } } }, { "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": "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": "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": "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": "prover_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "revert_code", "type": { "kind": "integer", "sign": "unsigned", "width": 8 } }, { "name": "start_gas_left", "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": "end_gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs" }, "visibility": "public" }, "return_witnesses": [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395] }, "bytecode": "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", "debug_symbols": "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ishXKyJfrYh8tSLy1YrIVysiX62IfLUi8tWKyFcrIl+tiHy1IvLVishXKyJfrYh8tSLy1YrIVysiX62IfLUi8tWKyFcrIl+tiHy1IvLVishXKyJfrYh8tSLy1YrIVysiX62IfLUi8tWKyFcrIl+tiHy1IvLVishXKyJfrYh8tSLy1YrIVysiX62IfLUi8tWKyFcrIl+tiHy1IvLVishXKyJfrYh8tSLy1YrIVysiX62IfLUi8tWKyFcrIl+tiHy1IvLVishXK6iv9v5hy7p+VktDfbWv1SJEtShRLcDcLam3Wkr6g1qcqJYgqiWJaimeWpBeVvn1Xkt8sI+QXtZXa8HtI1exTx9+/Vv/oJYA1hLyXkvLB7UkUS3DUwvQs/l6LUJUixLVYkS1OFEtRPmiRPkC9Gy+XksT1UKUu0DPxs3ez2m/rr//4ZzuTx+uK/RzHVe/VS7HVq7HVm4MlX+qBXkCTL7VYvZRLUFUSxLVUkS1NFEtw1OLX0S1CFEtSlSLEdVClLtOlLtOlLtOlLtOlLtOlLtBlLtBlLtBlLtBlLtBlLtBlLtBlLtBlLtBlLtBlLtJlLtJlLtJlLtJlLtJlLtJlLtJlLtJlLtJlHVFlHVFlHVFlHVFlHVAy8Zdr/f73f7VN9NAJ+dbV57HVv7rki7G3yrPL17GV13//eN/pary1R8vz/54ffbH27M/fhEEn56I9RO5fqLWT/T6idk+sUH7Pz0h6yd0/YStn1j3fNY9n3XPZ93zWfd8tj2f61o/IesndP2ErZ/w9ROxfiLXT9T6iV4/se65rHsu657Luuey7rmsey7rnsu657Luuax7Luue67rnuu65rnuu657ruue67rmue67rnuu657ruua17buue27rntu65rXtu657buue27rmte27rnvu6577uua977uue+7rnvu65r3vu6577uue+7nmsex7rnse657Hueax7Huuex7rnse55rHse657nuue57nmue57rnue657nuea57nuue57rnue55rXte657Xuue17nmte17rnte657Xuea17Xuue97rnve55r3ve656v7+FmfQ8363u4Wd/Dzfoebtb3cLO+h5v1Pdys7+FmfQ8363u4Wd/Dzfoebtb3cLO+h5v1PZxc64u41yOyf0T3j9j+Ed8/EvtHcv9I7R/p/SP77su++7Lvvuy7L/vuy777su++7Lsv++7Lvvuy777uu6/77uu++7rvvu67r/vu6777uu++7ruv++7bvvu2777tu2/77tu++7bvvu27b/vu2777tu++77vv++77vvu+777vu+/77vu++77vvu+77/vux777se9+7Lsf++7Hvvux737sux/77se++7Hvfu67n/vu5777ue9+7ruf++7nvvu5737uu5/77te++7Xvfu27X/vu1777te9+7btf++7Xvvu1737vu9/77ve++73vfu+73/vu9777ve9+77vf++7Pvvuz7/7suz/77s+++7Pv/uy7P/vuz777+7s+2d/1yf6uT/Z3fbK/63v91rt/JPaP5P6R2j/S+0f23d/f9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/2d32yv+uT/V2f7O/6ZH/XJ/u7Ptnf9cn+rk/3d326v+vT/V2f7u/6dH/Xp/u7Pt3f9en+rk/3d326v+vT/V2f7u/6dH/Xp/u7Pt3f9en+rk/3d326v+vT/V2f7u/6dH/Xp7/ur+z4aSd8+ujrDuzzEBX5ae74zz49aW8/eLI+//1n/dGHVd+nqKjL305RuTFz5fVN9bv5pvbdfFP/br5pfDffNL+bb1rfzTft7+abzvfyTX/dX4Bz1Df9bn5Hsu/mdyT7bn5H+nV/3c9R3/S7+R3JvpvfkQz6O1K//c1ZU+pfftO3ah77PeZtgXl4Ab+eXkCeXkCfXsCeXsCfXiCeXiCfXqCeXuDpnexP7+R4eifH0zs5nt7J8fROjqd3cjy9k+PpnRxP7+R4eifH0zs5n97J+fROzqd3cj69k/PpnZxP7+R8eifn0zs5n97J+fROrqd3cj29k+vpnVxP7+R6eifX0zu5nt7J9fROrqd3cj29k/vpndxP7+R+eif30zu5n97J/fRO7qd3cj+9k/vpndxP7+R5eifP0zt5nt7J8/ROnqd38jy9k+fpnTxP7+R5eifPwzvZruvpBeTpBfTpBezpBfzpBeLpBfLpBerpBfrpBZ7eyfL0Tpand7I8vZPl6Z0sT+9keXony9M7WZ7eyfL0Tpand7I+vZP16Z2sT+9kfXon69M7WZ/eyfr0Ttand7I+vZP16Z1sT+9ke3on29M72Z7eyfb0Trand7I9vZPt6Z38NONlTzNe9jTjZR8zXpKlbw/WJV9ZxvUdtvPXP3C8f9rtgw9XvHOC85nLU30vSNkKMraCnK2gYCsov0FBr98D3guy/LKgt1UKskp/i1Uy3lf5Ige+WGW+ySr+vkpfH6zyMef2zVf5ONJK+n2VmK+s0pOfPjz+uSvyE0n8UcrGe8qGfeXTXwel7WOY7qQvYKd/AT/9C8TpXyBP/wJ1+hfo07/AHP4FPoZJT/oCp5/EefpJnKefxHn6SZynn8R5+kmc3+Ak/ulvzXv79FX9laJ+6f1M+dsPff0T7Rc/M99L73NLn2NLr+vc0uXc0vXc0u3c0v3c0uPc0vPc0s89Tevc07TOPU373NO0zz1N+9zTtM89Tfvc07TPPU373NO0zz1N+9zTtM89Tefc03TOPU3n3NN0zj1N59zTdM49Tefc03TOPU3n3NN0jj1N/Tr2NPXr2NPUr2NPU7+OPU39OvY09evY09SvY09Tv449Tf069jT169zTVM49TeXc01TOPU3l3NNUzj1N5dzTVM49TeXc01TOPU3l3NNUzz1N9dzTVM89TfXc01TPPU313NNUzz1N9dzTVM89TfXc09TOPU3t3NPUzj1N7dzT1M49Te3c09TOPU3t3NPUzj1N7dzT1M89Tf3c09TPPU393NPUzz1N/dzT1M89Tf3c09TPPU393NM0zj1N49zTNM49TePc0/RbTFb6R5V+7mka556mce5pGueepnHuaZrnnqZ57mma556mee5p+i2mI/2jSj/3NM1zT9NzZyH5ubOQ/NxZSH7uLCQ/dxaSnzsLyc+dheTnzkLyc2ch+bmzkPzcWUh+7iwkP3cWkp87C8nPnYXk585C8nNnIfm5s5D83FlIfu4sJD93FpKfOwvJz52F5OfOQvJzZyH5ubOQ/NxZSH7uLCQ/dxaSnzsLyc+dheTnzkLyc2chxbmzkOLcWUhx7iykOHcWUlzHnqZx7iykOHcWUpw7CynOnYUU585CinNnIcW5s5Di3FlIce4spDh3FlKcOwspzp2FFOfOQopzZyHFubOQ4txZSHHuLKQ4dxZSnDsLKc6dhRTnzkKKc2chxbmzkOLcWUhx7iykOHcWUpw7CynOnYUU585CinNnIcW5s5Di3FlIce4spDh3FlKcOwspzp2FFOfOQopzZyHFubOQ4txZSHHuLKQ4dxZSnDsLKc6dhRTnzkKKc2chxbmzkOLcWUhx7iykOHcWUpw7CynOnYUU585CinNnIcW5s5Di3FlIce4spDh3FlKcOwspzp2FFOfOQopzZyHFubOQ4txZSHHuLKQ4dxZSnDsLKc6dhRTnzkKKc2chxbmzkOLcWUhx7iykOHcWUpw7CynOnYUU585CinNnIcW5s5Di3FlIce4spDh3FlKcOwspzp2FFOfOQopzZyHFubOQ4txZSHHuLKQ4dxZSnDsLKc6dhRTnzkKKc2chxbmzkPLcWUh57iykPHcWUp47CymvY0/TPHcWUp47CynPnYWU585CynNnIeW5s5Dy3FlIee4spDx3FlKeOwspz52FlOfOQspzZyHlubOQ8txZSHnuLKQ8dxZSnjsLKc+dhZTnzkLKc2ch5bmzkPLcWUh57iykPHcWUp47CynPnYWU585CynNnIeW5s5Dy3FlIee4spDx3FlKeOwspz52FlOfOQspzZyHlubOQ8txZSHnuLKQ8dxZSnjsLKc+dhZTnzkLKc2ch5bmzkPIXzELK/Frpovb2aQn/m2V+/mkr/fRhF/v8WZH3kpSvJOMryflKCr6Skq+k4iup+UoaupJ+wYweeEl86Z186Z186Z186Z186Z186Z186Z186Z186V186V186V186V186V186V186V186V186V186V186d186d186d186d186d186d186d186d186d186d186T186T186T186T186T186T186T186T186T186T106V0XXXrXRZfeddGld1106V0XXXrXRZfeddGld1106V0XXXrXxZfewpfewpfewpfewpfewpfewpfewpfewpfewpfewpfeypfeypfeypfeypfeypfeypfeypfeypfeypfeypfexpfexpfexpfexpfexpfexpfexpfexpfexpfexpfezpfezpfezpfezpfezpfezpfezpfezpfezpfezpfewZfefK5l8bmWxedaFp9rWXyuZfG5lsXnWhafa1l8rmXxuZbF51oWn2tZfK5l8bmWxedaFp9rWXyuZfG5lsXnWhafa1l8rmXxuZbF51oWn2tZfK5l8bmWxedaFp9rWXyuZfG5lsXnWhafa1l8rmXxuZbF51oWn2tZfK5l8bmWxedaFp9rWXyuZfG5lsXnWhafa1l8rmXxuZbF51oWn2tZfK5l87mWzedaNp9r2XyuZV906d18rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWjafa9l8rmXzuZbN51o2n2vZfK5l87mWzedaNp9r2XyuZfO5ls3nWg6fazl8ruXwuZbD51rORZfew+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5fK7l8LmWw+daDp9rOXyu5fC5lsPnWg6fazl8ruXwuZbD51oOn2s5dK6lXnSu5asktvR+lcSW3q+S2NL7VRJber9KYkvvV0ls6f0qiS29XyWxpferJL70pnMtXyXxpTeda/kq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" }, { "name": "compute_note_hash_and_nullifier", "is_unconstrained": true, "custom_attributes": [], "abi": { "error_types": {}, "param_witnesses": { "contract_address": [{ "end": 1, "start": 0 }], "nonce": [{ "end": 2, "start": 1 }], "note_type_id": [{ "end": 4, "start": 3 }], "serialized_note": [], "storage_slot": [{ "end": 3, "start": 2 }] }, "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": "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" }, "return_witnesses": [4, 5, 6, 7] }, "bytecode": "H4sIAAAAAAAA/+2b227iMBCGE8ohNMshIYTzobQ3exdYCvSOl9l9671fad9htZ3UUwZrWjnqxIolLKFMjOP/m9+HppXre2+l9frxVdzQrrRgm7O6Zl8rW8G+sjI5fUc4a45w3gly+gwnXOsqhivM5aZ3Pc/fy1lwklBRCgUDc0fqPoK7eghKUwWBBnyWgD5lpybpnEJDCRU4BQhJIj6pw2drpA53kLvg0kVTPod9QMwT6/d1QMNL2u/cIYnxO9Cekrp6STk25HMsy7t8VaI/DdVvi9yjV20VC+6wW6rtq0+baHpqjDCekLbYDv2okTGG0vEu49/+5Lm69lyXtGky+Z892fxbGk9LY24oJigR8Gp7QEljk0G/9/L9Xo15XRuTe5JTR9zv3Qn2hNC7LvpPmTOJO4TnmzhPti0nz7ex6xJ2mX6f9+BVT/Mq1LzqkjaUoVeCfz7Rxb7xvsdoy3lxOIF238CLPsPTt+xFn9EW9OIFtCMDLyKGJ7LsRcRoy3lx/AHasYEXMcMTW/YiZrTlvNjl7xYDAy8GDM/AshcDRltwjeTzIjHwImF4EsteJIy2oBe/QHto4MWQ4Rla9mLIaAt68RO0UwMvUoYntexFymgL7p35+8XIwIsRwzOy7MWI0Rb0YgfaYwMvxgzP2LIXY0ZbcI3k2hMDLyYMz8SyF/R31CLMAweZUweZ4wowB1oso33I98+pgRdThmdq2QvUK8qcVIA50GIZ7cMzaM8MvJgxPDPLXqBeUebIQebYQeahg8yJg8ypg8xVmM+BFstoH/M9dG7gxZzhmVv2AvWKMkcOMk8dZI4rwBxosYz2Mf/b3MLAiwXDs7DsBeoVZR45yNyvAHOgxTLaxwNoLw28WDI8S8teoF5R5rGDzKmDzFMHmWMHmYcOMicOMt/WoB3mqALM9EzT31J5di+hxoOeeRqjpzGGJKbnYFbijFlGx2dFtNbyWltuvuD9ulTt3Qn63cjnlL/LP6q+8AzfhsnpScXS57keSb8+0cH6Oon/kLbYDv3AdYvsMO8eVPz0yXNL7bkuafPA5H/2ZPPfaDwbjRnG5DfhWItz7E4m87rvXdbyd8JTwj64p2dysZjsOyXtMduS8szoGb5/nuyaXmteBZpXXdKG7tHrEvwzmV835hvzR8z0fSIgdfj9itTVtFzo/zJgezgz/B/4fzqFFjUAAA==", "debug_symbols": "ndpRattAGIXRveg5FN9foxkpWymlOIlTDMEJiVMoIXuv3dIF9LxpJN237+kwH9PD4e79x/fj6fH5bbr9+jE9Pd/vz8fn0+X0Me2+VP/z9u1lf7q+eDvvX8/T7Vy5mQ6nh+tT/7yZHo9Ph+m22vj8dnMdDRmtMtpgNO9kFBmVjGYZNRktMpIiZililiJmKaJJEU2KaFJEkyKaFNGkiCZFNCmiSRFNilikiEWKWKSIRYpYpIhFilikiEWKWKSIRYroUkSXIroU0aWILkV0KaJLEV2K6FJElyKGFDGkiCFFDCliSBFDihhSxJAihhQxpIhVililiFWKWKWIVYpYpYhVililiFWKWKWITYrYpIhNitikiE2K2KSITYrYpIhNitikiOx2tAqtilYzrRqtFlp1Wg1arbSiNkJthNoItRFqI9RGqI1QG6E2Qm2E2ihqo6iNojaK2ihqo6gN4syQZ4ZAMySaIdIMmWYINUOqGWLNkGuGYDMkmyHaDNlmCDdDuhnizZBvhoAzJJwh4gwZZwg5Q8oZYs6Qc4agMySdIeoMWWcIO0PaGeLOkHeGwDMkniHyDJlnCD1D6hliz5B7huAzJJ8h+gzZZwg/Q/oZ4s+Qf4YANCSgIQINGWgIQUMKGmLQkIOGIDQkoSEKDVloCENDGhri0JCHhkA0JKIhEg2ZaAhFQyoaYtGQixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLll3ztHuedtGTXLTIRYtctMhFi1y0/ttFL6ef+9fj/u7pcL3Ze/34frr/d9H3cjz/evn75fLvbw==" }, { "name": "mint_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 43, "start": 42 }], "inputs": [{ "end": 41, "start": 0 }], "to": [{ "end": 42, "start": 41 }] }, "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": "public_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": "start_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "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": { "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": "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": "nullifier_non_existent_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": "contract_storage_update_requests", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest" } } }, { "name": "contract_storage_reads", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "current_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead" } } }, { "name": "public_call_stack_hashes", "type": { "kind": "array", "length": 16, "type": { "kind": "field" } } }, { "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": "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": "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": "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": "prover_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "revert_code", "type": { "kind": "integer", "sign": "unsigned", "width": 8 } }, { "name": "start_gas_left", "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": "end_gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs" }, "visibility": "public" }, "return_witnesses": [43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396] }, "bytecode": "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", "debug_symbols": "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yRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wpeeJMyRNnSp44U/LEmZInzpQ8cabkiTMlT5wreeJcyRPnSp44V/LE+SOkwK7kiXMlT5wreeJcyRPnSp44V/LEuZInzpU8ca7kiXMlT5yjnriI92Tm/CiZqZTMUkoGVGAb/paMjfgomS2UDGlD+zwZU0rGlZIJpWRSKJlf6OLJ/SYdNv3Hp+t5P98un++Xz4/L5+fl8w+a2tsr6/yVOn9lH79yYr54e2Wcv2Lnr/j5K3H+Sp6/cn77cX77cX77cX77eX77eX77eX77eX77eX77eX77eX77eX77eX77eX778/z25/ntz/Pbn+e3P89vf57f/jy//Xl++/P89uf57a/z21/nt7/Ob3+d3/46v/11fvvr/PbX+e2v89tf57df57df57df57df57df57df57df57df57df57df57e/z29/n9/+Pr/9fX77+/z29/nt7/Pb3+e3v89vfx/ffjzP+Svj/BU7f8XPX4nzV/L8lXn+yjp/pc5fOb/9cX774/z2x/ntj/PbH+e3P85vf5zf/ji//XF+++P89u389u389u389u389u389u389u389u389u389u389v389v389v389v389v389v389s9nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL85nfXE+64vzWV+cz/rifNYX57O+OJ/1xfmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/ryfNaX57O+PJ/15fmsL89nfXk+68vzWV+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axvns/65vmsb57P+ub5rG+ez/rm+axv/rJf0zDsWV8e/dPvwnh/ejzPB0/v148/X57er8DvT9dHD5tVfXnYYtiPiTz1wdNzvz+9nvzzp9++NL6bL83v5kvnd/Ol67v50vpuvnR/L1/6y35jSKsvHd/Nl9p386Xfzc9Iv+y3tLT60u/mZ6T6bn5Gqu/mZ6T6bn5GKvRnpHpbGLqXxddf+iWbfe3nmLcA43YAux3AbweI2wHydoB5O8C6HaBuB9h3A6znuR1g3A5gtwP47QBxO0DeDjBvB1i3A9TtALcredyu5HG7ksftSh63K3ncruRxu5LH7Uoetyt53K7kcbuS7XYl2+1KttuVbLcr2W5Xst2uZLtdyXa7ku12JdvtSvbbley3K9lvV7LfrmS/Xcl+u5L9diX77Ur225Xstys5bldy3K7kuF3JcbuS43Ylx+1KjtuVHLcrOW5Xctyu5LxdyXm7kvN2JeftSs7blZy3KzlvV3LeruS8Xcl5u5Ln7Uqetyt53q7kebuS5+1Knrcred6u5Hm7kuftSp63K3ndruR1u5LX7Upetyt53a7kdbuS1+1KXrcred2u5HW7kut2JdftSq7blVy3K7luV3LdruS6Xcl1u5LrdiXX7Uq+zXit24zXus14rY8Zrz/9bpy3FyPjkzCvh99/O7c/+/3p8A8efv1L25dn1/7qYHtPKNQSSrWEplpCSy2h+gYJ+fvT4T6/Tugtygai1Md022mUme9RvtKBr6KMbxIl3qPU81EUQ6L8FUkre4uST34Spfb88vCOH29l/Ikk/khl811l0z95+nNQup7o/gHZ/QNm9w9Y3T+gun/Abv4B4+n+AaP7B1j3D+jeiUf3Tjy6d+LRvROP7p14dO/E4xt04vHYeHv6WfVJUj91PrPi7dDXv9F+deZ8S92evqmPvqlb39S9b+rRN/Xsm/rsm/rqm3r1Tb1vN/W+3dT7dlPv2029bzf1vt3U+3ZT79tNvW839b7d1Pt20+jbTaNvN42+3TT6dtPo202jbzeNvt00+nbT6NtNo283zb7dNPt20+zbTbNvN82+3TT7dtPs202zbzfNvt00+3bT2bebzr7ddPbtprNvN519u+ns201n3246+3bT2bebzr7ddPXtpqtvN119u+nq201X3266+nbT1bebrr7ddPXtpqtvN62+3bT6dtPq202rbzetvt20+nbT6ttNq283rb7dtPp20923m+6+3XT37aa7bzfdfbvp7ttNd99uuvt20923m+623XQ/bbvpftp20/207ab7adtN99O2m+6nbTfdT9tuup+23XQ/bbvpfvp209G3m46+3XT07aajbzf9FpuS/lap9+2mo283HX276ejbTfvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbT77kLafXch7b67kHbfXUi77y6k3XcX0u67C2n33YW0++5C2n13Ie2+u5B2311Iu+8upN13F9Luuwtp992FtPvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbT77kLafXch7b67kHbfXUi77y6k3XcX0u67C2n33YW0++5C2n13Ie2+u5B2311Iu+8upN13F9Luuwtp992FtPvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbT77kLafXch7b67kHbfXUi77y6k3XcX0u67C2n33YW0++5C2n13Ie2+u5B2311Iu+8upN13F9Luuwtp992FtPvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbTb7kKyp+0upFfqXbvpK/Wu3fSVetdu+kq9azd9pd61m75S79pNX6l37aav1Lt201fqfbtp211Ir9T7dtO2u5Beqfftpm13Ib1S79tN2+5CeqXet5u23YX0Sr1vN227C+mVet9u2nYX0iv1vt207S6kV+p9u2nbXUiv1Pt207a7kF6p9+2mbXchvVLv203b7kJ6pd63m7bdhfRKvW83bbsL6ZV6327adhfSK/W+3bTtLqRX6n27adtdSK/U+3bTtruQXqn37aZtdyG9Uu/bTdvuQnql3rebtt2F9Eq9bzdtuwvplXrfbtp2F9Ir9b7dtO0upFfqfbtp211Ir9T7dtO2u5Beqfftpm13Ib1S79tN2+5CeqXet5u23YX0Sr1vN227C+mVet9u2nYX0iv1vt207S6kV+p9u2nbXUiv1Pt207a7kF6p9+2mbXchvVLv203b7kJ6pd63m7bdhfRKvW83bbsL6ZV6327adhfSK/W+3bTtLqRX6n27adtdSK/U+3bTtruQXqn37aZtdyG9Uu/bTdvuQnql3rebtt2F9Eq9bTcdfXchjb67kEbfXUjjJ+xCGvZZ6sP87emR8Wdh/vJpX29Hx/Afnx3jPaXQSyn1Upp6KS29lEovpS2X0k/Y+YOnNPRSMr2U9NR76Kn30FPvoafeQ0+9h556Dz31Nj31Nj31Nj31Nj31Nj31Nj31Nj31Nj31Nj31Nj31dj31dj31dj31dj31dj31dj31dj31dj31dj31dj31Dj31Dj31Dj31Dj31Dj31Dj31Dj31Dj31Dj31Dj31Tj31Tj31Tj31Tj31Tj31Tj31Tj31Tj31Tj31Tj31nnrqPfXUe+qp99RT76mn3lNPvaeeek899Z566j311HvpqffSU++lp95LT72XnnovPfVeeuq99NR76an30lPv0lPv0lPv0lPv0lPv0lPv0lPv0lPv0lPv0lPv0lPvrafeW0+9t556bz313nrqvfXUe+up99ZT762n3ltOve2RU2975NTbHjn1Nj2vpT1y6m16XkvT81qantfS9LyWpue1ND2vpel5LU3Pa2l6XkvT81qantfS9LyWpue1ND2vpel5LU3Pa2l6XkvT81qantfS9LyW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jr7ddPTtpqNvN7W+3dT6dlPr202tbze1vt3U+nZT69tNrW83tb7d1Pp2U+/bTb1vN/W+3dT7dlPv2029bzf1vt3U+3ZT79tNvW83jb7dNPp20+jbTaNvN42+3TT6dtPo202jbzeNvt00+nbT7NtNs283zb7dNPt202+xZelvlXrfbpp9u2n27abZt5tm3246+3bT2bebzr7ddPbtpt9iU9LfKvW+3XT27aazbzedfbtp311Iq+8upNV3F9Lquwtp9d2FtPruQlp9dyGtvruQVt9dSKvvLqTVdxfS6rsLafXdhbT67kJafXchrb67kFbfXUir7y6k1XcX0uq7C2n13YW0+u5CWn13Ia2+u5BW311Iq+8upNV3F9Lquwtp9d2FtPruQlp9dyFV311I1XcXUvXdhVR9dyHV07abVt9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YVUfXchVd9dSNV3F1L13YW0++5C2n13Ie2+u5B2311I+2nbTXffXUi77y6k3XcX0u67C2n33YW0++5C2n13Ie2+u5B2311Iu+8upN13F9Luuwtp992FtPvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbT77kLafXch7b67kHbfXUi77y6k3XcX0u67C2n33YW0++5C2n13Ie2+u5B2311Iu+8upN13F9Luuwtp992FtPvuQtp9dyHtvruQdt9dSLvvLqTddxfS7rsLaffdhbT77kLaP2EX0lqfpe473p6O4X8W5oOnY9f72SN/fHrvD56OqPXl6cjH3p8Of/8CU/+C9dkX+Df4gjB//4LpH151MGGSCTOZMIsJU0yYjYT5CdtsvkmYwYQxJgyjApNRgcmowGRUYDIqMBkVmIwKLEYFFqMCi1GBxajAYlRgMSqwGBVYjAosRgUWowLFqEAxKlCMChSjAsWoQDEqUIwKFKMCxahAMSqwGRXYjApsRgU2owKbUYHNqMBmVGAzKrAZFdiECvjzPEyYwYQxJowzYYIJk0yYyYRZTJhiwjAqMBgVGIwKDEYFBqMCg1GBwajAYFRgMCowGBUYjAoYowLGqIAxKmCMChijAsaogDEqYIwKGKMCxqiAMyrgjAo4owLOqIAzKuCMCjijAs6ogDMq4IwKBKMCwahAMCoQjAoEowLBqEAwKhCMCgSjAsGoQDIqkIwKJKMCyahAMiqQjAokowLJqEAyKpCMCkxGBSajApNRgcmowGRUYDIqMBkVmIwKTEYFJqMCi1GBxajAYlRgMSqwGBVYjAosRgUWowKLUYHFqEAxKlCMChSjAsWoQDEqUIwKFKMCxahAMSpQjApsRgU2owKbUYHNqMBmVGAzKrAZFdiMCmxGBRh2cDDs4GDYwcGwg4NhB8cTTJhkwkwmzGLCFBOGUQGGHRwMOzgYdnAw7OBg2MHBsIODYQcHww4Ohh0cDDs4GHZwMOzgYNjBwbCDg2EHB8MODoYdHAw7OBh2cDDs4GDYwcGwg4NhBwfDDg6GHRwMOzgYdnAw7OBg2MHBsIODYQcHww4Ohh0cDDs4GHZwMOzgYNjBwbCDg2EHB8MODoYdHAw7OBh2cDDs4GDYwcGwg4NhBwfDDg6GHRwMOzgYdnAw7OBg2MHBsIODYQcHww4Ohh0cDDs4GHZwMOzgYNjBwbCDg2EHB8MODoYdHAw7OBh2cDDs4GDYwcGwg4NhBwfDDg6GHRwMOzgYdnAw7OBg2MHBsIODYQcHww4Ohh0cDDs4GHZwMOzgYNjBwbCDg2EHB8MODoYdHAw7aAw7aAw7aAw7aAw7aE8wYZIJM5kwiwlTTBhGBRh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bh20Bl20Bl20Bl20Bl20J9gwiQTZjJhFhOmmDCMCjDsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsoDPsYDDsYDDsYDDsYDDsYDzBhEkmzGTCLCZMMWEYFWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWDYwWTYwWTYwWTYwWTYwXyCCZNMmMmEWUyYYsIwKsCwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mwg8mw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" }, { "name": "constructor", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(initializer)"], "abi": { "error_types": {}, "param_witnesses": { "inputs": [{ "end": 41, "start": 0 }], "portal_address": [{ "end": 42, "start": 41 }] }, "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": "public_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": "start_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "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": { "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": "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": "nullifier_non_existent_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": "contract_storage_update_requests", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest" } } }, { "name": "contract_storage_reads", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "current_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead" } } }, { "name": "public_call_stack_hashes", "type": { "kind": "array", "length": 16, "type": { "kind": "field" } } }, { "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": "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": "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": "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": "prover_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "revert_code", "type": { "kind": "integer", "sign": "unsigned", "width": 8 } }, { "name": "start_gas_left", "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": "end_gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs" }, "visibility": "public" }, "return_witnesses": [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395] }, "bytecode": "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", "debug_symbols": "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n+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZn+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9Y086xt51jfyrG/kWd/Is76RZ30jz/pGnvWNPOsbedY38qxv5FnfyLO+kWd9I8/6Rp71jTzrG3nWN/Ksb+RZ38izvpFnfSPP+kae9Y086xt51jfyrG/kWd/Is76RZ30jz/pGnvWNPOsbedY38qxv5FnfyLO+kWd9I8/6Rp71jTzrG3nWN/Ksb+RZ38izvpFnfSPP+kae9Y086xt51jfyrG/kWd/Is76RZ30jz/pGnvWNPOsbedY38qxv5FnfyLO+kWd9I8/6Rp71jTzrG3nWN/Ksb+RZ38izvpFnfSPP+kae9Y086xt51jfyrG/kWd/Is76RZ30jz/pGnvWNPOsbedY38qxv5FnfyLO+kWd9I8/6Rp71jTzrG3nWN/Ksb+RZ38izvpFnfSPP+kae9Y086xt51jfyrG/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWV/kWd/Ms76ZZ30zz/pmnvXNPOubedY386xv5lnfzLO+mWd9M8/6Zp71zTzrm3nWN/Osb+ZZ38yzvplnfTPP+mae9c0865t51jfzrG/mWd/Ms76ZZ30zz/pmnvXNPOubedY386xv5lnfzLO+mWd9M8/6Zp71zTzrm3nWN/Osb+ZZ38yzvplnfTPP+mae9c0865t51jfzrG/mWd/Ms76ZZ30zz/pmnvXNPOubedY386xv5lnfzLO+mWd9M8/6Zp71zTzrm3nWN/Osb+ZZ38yzvplnfTPP+mae9c0865t51jfzrG/mWd/Ms76ZZ30zz/pmnvXNPOubedY386xv5lnfzLO+mWd9M8/6Zp71zTzrm3nWN/Osb+ZZ38yzvplnfTPP+mae9c0865t51jfzrG/mWd/Ms76ZZ30zz/pmmvXplWZ9j69I/iua/0rLf8XyX/H8V3r+KyP/lch/Ja++5NWXvPqSV1/y6ktefcmrL3n1Ja++5NWXvPqaV1/z6mtefc2rr3n1Na++5tXXvPqaV1/z6re8+i2vfsur3/Lqt7z6La9+y6vf8uq3vPotr77l1be8+pZX3/LqW159y6tvefUtr77l1be8+p5X3/Pqe159z6vvefU9r77n1fe8+p5X3/Pq97z6Pa9+z6vf8+r3vPo9r37Pq9/z6ve8+j2v/sirP/Lqj7z6I6/+yKs/8uqPvPojr/7Iqz/y6kde/cirH3n1I69+5NWPvPqRVz/y6kde/cirP/Pqz7z6M6/+zKs/8+rPvPozr/7Mqz/z6udZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+RZn+ZZn+ZZn+ZZn+ZZ3+Mv3PmveP4rPf+Vkf9K5L+SVz/P+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+jTP+lqe9bU862t51tfyrK/lWV/Ls76WZ30tz/panvW1POtredbX8qyv5Vlfy7O+lmd9Lc/6Wp71tTzra3nW1/Ksr+VZX8uzvpZnfS3P+lqe9bU862t51tfyrK/lWV/Ls76WZ30tz/panvW1POtredbX8qyv5Vlfy7O+lmd9Lc/6Wp71tTzra3nW1/Ksr+VZX8uzvpZnfS3P+lqe9bU862t51tfyrK/lWV/Ls76WZ30tz/panvW1POtredbX8qyv5Vlfy7O+lmd9Lc/6Wp71tTzra3nW1/Ksr+VZX8uzvpZnfS3P+lqe9bU862t51tfyrK/lWV/Ls76WZ30tz/panvW1POtredbX8qyv5Vlfy7O+lmd9Lc/6Wp71tTzra3nW1/Ksr+VZX8uzvpZnfS3P+lqe9bU862t51tfyrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/yrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrM/zrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t51tfzrK/nWV/Ps76eZ309z/p6nvX1POvredbX86yv51lfz7O+nmd9Pc/6ep719Tzr63nW1/Osr+dZX8+zvp5nfT3P+nqe9fU86+t5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JVl43pIsPG9JFp63pAvPW9KF5y3pwvOWdOF5S3qt+1zVhect6cLzlnTheUu68LwlXXjeki48b0kXnrekC89b0oXnLenC85Z04XlLuvC8JV143pIuPG9JF563pAvPW9KF5y3pwvOWdOF5S7rwvCVdeN6SLjxvSReet6QLz1vShect6cLzlnTheUu68LwlXXjeki48b0kXnrekC89b0oXnLenC85Z04XlLuvC8JV143pIuPG9JF563pAvPW9KF5y3pwvOWdOF5S7rwvCVdeN6SLjxvSReet6QLz1vShect6cLzlnTheUu68LwlXXjeki48b0kXnrekC89b0oXnLenC85Z04XlLuvC8JV143pIuPG9JF563pAvPW9KF5y3pwvOWdOF5S7rwvCVdeN6SLjxvSReet6QLz1vShect6cLzlnTheUu68LwlXXjeki48b0kXnrekC89b0oXnLenC85Z04XlLuvC8JV143pIuPG9JF563pAvPW9KF5y3pwvOWdOF5S7rwvCVdeN6SLjxvSReet9QWnrfUFp631Baet9QWnrfUrnWfq23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLbeF5S23heUtt4XlLtvC8JVt43pItPG/JFp63ZNe6z1VbeN6SLTxvyRaet2QLz1uyhect2cLzlmzheUu28LwlW3jeki08b8kWnrdkC89bsoXnLdnC85Zs4XlLtvC8JVt43pItPG/JFp63ZAvPW7KF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2DKKxpZRNLaMorFlFI0to2hsGUVjyygaW0bR2DKKxpZRNLaMorFlFI0to2hsGUVjyygaW0bR2DKKxpZRNLaMorFlFI0to2hsGUVjyygaW0bR2DKKxpZRNLaMorFlFI0to2hsGUVjyygaW0bR2DKKxpZRNLaMorFlFI0to2hsGUVjyygaW0bR2DKKxpZRNLaMorFlFJ0to+hsGUVnyyg6W0bRL7JO7WwZRWfLKDpbRtHZMorOllF0toyis2UUnS2j6GwZRWfLKDpbRtHZMorOllH0ezOKz5tMwE0+kCXs19dNusrLmwjiJoq4SUPcxBA3ccRNOuIm47M36S9vEoibTMBN2oW4iSBuooibNMRNDHETR9ykI26CqPiGqPiGqHhDVLwhKt4QFW+IijdExRui4g1R8YaoeENUvCEq3hEV74iKd0TFO6LiHVHxjqh4R1S8IyreERXviIrviIrviIrviIrviIrviIrviIrviIrviIrviIrviIofiIofiIofiIofiIofiIofiIofiIofiIofiIofiIoPRMUHouIDUfGBqPhAVHwgKj4QFR+Iig9ExQei4iei4iei4iei4iei4iei4iei4iei4iei4iei4ieg4vt1IW4iiJso4iYNcRND3MQRN+mImwzETQJxE0TFC6LiBVHxgqh4QVS8ICpeEBUviIoXRMULouIFUfGKqHhFVLwiKl4RFa+IildExSui4hGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu4Hw3A2E524gPHcD4bkblyFu4oibdMRNBuImgbgJouIRnruB8NwNhOduIDx3A+G5GwjP3fiA527EfN4kWnt5k4G4SSBuMgE3+YDn7hs3EcRNFHGThriJIW7iiJsgKl4RFa+IildExTdExTdExTdExTdExTdExTdExTdExTdExTdExTdExRui4g1R8YaoeENUvCEq3hAVb4iKN0TFG6LiDVHxjqh4R1S8IyreERXviIp3RMU7ouIdUfGOqHhHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVHwgKj4QFR+Iig9ExQei4gNR8YGo+EBUfCAqPhAVPxEVPxEVPxEVPxEVPxEVPxEVPxEVPxEVPxEVPwEVH9eFuIkgbqKImzTETQxxE0fcpCNuMhA3CcRNEBUviIoXRMULouIFUfGCqHhBVDzCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3AXCcxcIz10gPHeB8NwFwnMXCM9dIDx3gfDcBcJzFwjPXSA8d4Hw3E2E524iPHcT4bmbCM/dvAxxE0fcpCNuMhA3CcRNEBWP8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNhOduIjx3E+G5mwjP3UR47ibCczcRnruJ8NxNgOeuXwDP3eMmgriJIm7SEDcxxE0ccZOOuMlA3CQQN0FUvCAqXhAVL4iKF0TFC6LiBVHxgqh4QVS8ICpeEBWviIpXRMUrouIVUfGKqHhFVLwiKl4RFa+IildExTdExTdExTdExTdExTdExTdExTdExTdExTdExTdExRui4g1R8YaoeENUvCEq3hAVb4iKN0TFG6LiDVHxjqh4R1S8IyreERXviIp3RMU7ouIdUfGOqHhHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVHxHVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVPxAVHwgKj4QFR+Iig9ExQei4gNR8YGo+EBUfCAqPhAVPxEVPxEVPxEVPxEVPxEVPxEVPxEVPxEVPxEVj/DcCcJzJwjPnSA8d4Lw3MlliJs44iYdcZOBuEkgboKoeITnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtBeO4E4bkThOdOEJ47QXjuBOG5E4TnThCeO0F47gThuROE504QnjtFeO4U4blThOdOEZ47vQxxE0fcpCNuMhA3CcRNEBWP8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJzpwjPnSI8d4rw3CnCc6cIz50iPHeK8NwpwnOnCM+dIjx3ivDcKcJz1xCeu4bw3DWE564hPHftMsRNHHGTjrjJQNwkEDdBVDzCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnruG8Nw1hOeuITx3DeG5awjPXUN47hrCc9cQnjtDeO4M4bkzhOfOEJ47uwxxE0fcpCNuMhA3CcRNEBWP8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJzZwjPnSE8d4bw3BnCc2cIz50hPHeG8NwZwnNnCM+dITx3hvDcGcJz5wjPnSM8d47w3DnCc+eXIW7iiJt0xE0G4iaBuAmi4hGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO4c4blzhOfOEZ47R3juHOG5c4TnzhGeO0d47hzhuXOE584RnjtHeO46wnPXEZ67jvDcdYTnrl+GuIkjbtIRNxmImwTiJoiKR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9dR3juOsJz1xGeu47w3HWE564jPHcd4bnrCM9d/4DnLqY+bzJbvLzJQNwkEDeZgJt8wHP3jZsI4iaKuElD3MQQN3HETRAVPxAVPxAVPxAVH4iKD0TFB6LiA1Hxgaj4QFR8ICo+EBUfiIoPRMVPRMVPRMVPRMVPRMVPRMVPRMVPRMVPRMVPRMVPQMWP60LcRBA3UcRNGuImhriJI27SETcZiJsE4iaIihdExQui4gVR8YKoeEFUvCAqXhAVL4iKF0TFC6LiFVHxiqh4RVS8IipeERWviIpXRMUrouIVUfGKqPiGqPiGqPiGqPiGqPiGqPiGqPiGqPiGqPiGqPiGqHhDVLwhKt4QFW+IijdExRui4g1R8YaoeENUvCEq3hEV74iKd0TFO6LiHVHxjqh4R1S8IyreERXviIrviIrviIrviIrviIrviIrviIpHeO4GwnM3EJ67gfDcDYTnbiA8dwPhuRsIz91AeO4GwnM3EJ67gfDcDYTnbiA8dwPhuRsIz91AeO4GwnM3EJ67gfDcDYTnbiA8dwPhuRsIz91AeO4GwnM3EJ67gfDcDYTnbiA8dwPhuRsIz91AeO4GwnMXCM9dIDx3gfDcBcJzF5chbuKIm3TETQbiJoG4CaLiEZ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47gLhuQuE5y4QnrtAeO4C4bkLhOcuEJ67QHjuAuG5C4TnLhCeu0B47ibCczcRnruJ8NxNhOduXoa4iSNu0hE3GYibBOImiIpHeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwnM3EZ67ifDcTYTnbiI8dxPhuZsIz91EeO4mwHM3LoDn7nETQdxEETdpiJsY4iaOuElH3GQgbhKImyAqXhAVL4iKF0TFC6LiBVHxgqh4QVS8ICpeEBUviIpXRMUrouIVUfGKqHhFVLwiKl4RFa+IildExSui4hui4hui4hui4hui4hui4hui4hui4hui4hui4hui4g1R8YaoeENUvCEq3hAVb4iKN0TFG6LiDVHxhqh4R1S8IyreERXviIp3RMU7ouIdUfGOqHhHVLwjKr4jKr4jKr4jKr4jKr4jKr4jKr4jKr4jKr4jKr4jKn4gKn4gKn4gKn4gKn4gKn4gKn4gKn4gKn4gKn4gKj4QFR+Iig9ExQei4gNR8YGo+EBUfCAqPhAVH4iKn4iKn4iKn4iKn4iKn4iKn4iKn4iKn4iKn4iKR3juBOG5E4TnThCeO0F47uQyxE0ccZOOuMlA3CQQN0FUPMJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50gPHeC8NwJwnMnCM+dIDx3gvDcCcJzJwjPnSA8d4Lw3AnCcycIz50iPHeK8NwpwnOnCM+dXoa4iSNu0hE3GYibBOImiIpHeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5U4TnThGeO0V47hThuVOE504RnjtFeO4U4blThOdOEZ47RXjuFOG5awjPXUN47hrCc9cQnrt2GeImjrhJR9xkIG4SiJsgKh7huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz11DeO4awnPXEJ67hvDcNYTnriE8dw3huWsIz50hPHeG8NwZwnNnCM+dXYa4iSNu0hE3GYibBOImiIpHeO4M4bkzhOfOEJ47Q3juDOG5M4TnzhCeO0N47gzhuTOE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" }, { "name": "balance_of_public", "is_unconstrained": true, "custom_attributes": [], "abi": { "error_types": {}, "param_witnesses": { "owner": [{ "end": 1, "start": 0 }] }, "parameters": [{ "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" }, "return_witnesses": [1] }, "bytecode": "H4sIAAAAAAAA/+2cXW/bNhSGJX/Ectwk9bedD0eJ06a7GRR7dTZgA7y/sJvtaoEbO0OArgZiF+j244OVis7ymjvIqPaIEIEQCETR1HkfvqKO7NiU7z0UP/lTpQxteqG2abKNvq5cCMaKfI3zP/xS0CpwSTOEM0ltC0y/X2Gnn2x/vrub/RXefpgvPoXLj+tweRO+W378MF/hgb/DzkGyvZ69fx+ul+FstVrcra/+nH26ene7vlrd/r34V3SdVAJv04yphCHfR6MtCK4bUgMTqE/l898WvO4n7dSvDm0+HFqWZo+ikdIvasz6GKZQLwNPSZ7nIqNxRgF4fu/JXgwVzaui5tUu9NkC/yoZ+OeDLsWmfdJLy1zIATPOi9CTnReB/JhGe59jbIOvgeYvjms7qQvOy0jFqIIm6W2D7ouk7nuyd6FaEquUxCaOF6C9J+75+Frp7nib5alctgc8u+I8D7lMfpwPc/YlsMvEfTtWXtU1r3Y0r3ahDzLUM/DPB12KTft1RlvOi8vvlHbDwIsGw9Ow7EWD0ZbzYnKjtJsGXjQZnqZlL5qMtuC8GCntloEXLYanZdmLFqMtOC9i7baBF22Gp23ZizajLejFpdLuGHjRYXg6lr3oMNqCXrxV2l0DL7oMT9eyF11GW86LUfx+qGfgRY/h6Vn2osdoC+bO+P1F38CLPsPTt+xFn9EWvEaulfa+gRf7DM++ZS9ILy1zw0HmuoPM3RwwB1pdRnsc588DAy8OGJ4Dy16QXlrmbg6YA60uoz1ZKO1DAy8OGZ5Dy16QXlrmhoPMdQeZuw4ytxxk7j8zW2HOQ94ItLqM9mX8efjIwIsjhufIshekl5a5kwPmQKvLaE/i/38ODLwYMDwDy14MGG3Bz/Dxe5hjAy+OGZ5jy16QXlrmroPMLx1krjvI3HCQuekgc8tB5raDzB0HmV3Mzz0HmfsOMruYn128D7o4n/OQNwKtLqM9mSvt0MCLkOEJLXsRMtqCn7fj71xPDLw4YXhOLHtBemmZew4y1x1k7jrI/Dw37DC3HGRuOsj8nDe+jDnQ6jLak4nSPjXw4pThObXsBemlZW46yNxwkPnYQeZuDpgDrS6jPY61hwZeDBmeoWUvSC8t8yAHzGo9CK0N+dHPkmc8r2k85JmnMXoaYw3qe+DZmThjFOH5OQOtV/Ja7Byn/VeZao+vVdxz+THFvw17k8QqJ3HPmTF9k9R9YT/fQFwfdKi9BPUf/Me+1I/8oOuW2NX+66SO7PpxQ+24Xejzmhn/1JMd/7nGc64xq3PyLVznWcwtk3mtvieka/kn8IoKrsWrijM+eOVpjFSqDI+fA56ax69lrmqe4fpmfO3Wf3ydclsBjqFzVGRin0Eb3S+4/Iw+ZZCfN3Im5Q49X+8AxzAnPBWGJ6t1u3R+KDbtV7L1IspobWU8JsobdE8hftIrQZ/fkpNPv0XAgrGIU5/jeL6ob4Hx8d7bzAdp1grf/E9B7QpoV5nxXj0xXo57mrRjXiF+3PfhGOqL94yvWBt9oTcgXxEY8FzVYEwV5nVcP6+Prcb4gHkS/Q28xxwo+VwCFZeeNTAVjKvYS95meep+gs87yOC5Dhfb4Odqvbyb/bH4ZTGb+4CmP6sEt4h+D/sFaMd6kWm7h20Nhky6qo2mQRnaCppF+CgOvBT+Ad1BdZOlRgAA", "debug_symbols": "5dzdTltHGIXhe/Exqmatb35zK1VVkYRUSMhEgVSqEPfeTettHOHUKaJ0XnEWJ2O8Jgf7JUR67jYfL95//e3Xy+2n65vNu5/vNlfXH85vL6+3y6u7Tfqp/vWbN5/Ptw+vb27Pv9xu3rlGPdtcbD8+/LL6/mzz6fLqYnmR2/3Zk9N9rIdHrvuzcj5yVk5ld1guceJ0Hb3vTrdUDnakfv/L2bK+odd39PqBXq/Eni/2fLPnB3t+Zs8v7Pns5IrdXLGjK3Z1za6u2dU1u7p+geoqWeuk1PqJSWl3NJ34qi2vX7SVw69Zd8MzdXihDq/U4Y06vFOHD+jwSNThog43dTi1nEEtZ1DLGdRyBrWcQS1nUMuZqeXM1HJmajkztZyZWs5MLWemljNTy5mp5czUchZqOQu1nIVazkItZ6GWs1DLWajlLNRyFmo5C7WclVrOSi1npZazUstZqeWs1HJWajkrtZyVWs5KLWejlrNRy9mo5WzUcjZqORu1nI1azkYtZ6OWs1HL2anl7NRydmo5O7WcnVrOTi1np5azU8vZqeXs1HIOajkHtZyDWs5BLeeglnNQyzmo5RzUcg5qOQe1nErUdCpR27l8KHY5tZ5K1HwqUfupRA3o8knY5dSEKmEbKmxDhW2osA0VtqEvARH9T8uxDRW2ocI2VNiGCttQYxtqbEONbSjWFhIWFxJWFxKWFxLWFxIWGBJWGBKWGBLWGBIWGRJWGRKWGRLWGRIWGhJWGhKWGhLWGhIWGxJWGxKWGxLWGxIWHBJWHBKWHBLWHBIWHRJWHRKWHRLWHRIWHhJWHhKWHhLWHhIWHxJWHxKWHxLWHxIWIBJWIBKWIBLWIBIWIRJWIRKWIRLWIRIWIhJWIhKWIhLWIhIWIxJWIxKWIxLWIxIWJBJWJBKWJBLWJBIWJRJWJRKWJRLWJRIWJhJWJhKWJhLWJhIWJxJWJxKWJxLWJxIWKBJWKBKWKBLWKBIWKRJWKRKWKRLWKTLWKTLWKTLWKTLWKXKiNtRYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYp8hYpyiwTlFgnaLAOkWBdYoiURsaWKcosE5RYJ2iwDpFgXWKAusUBdYpCqxTFFinKLBOUWCdovgRp2icWj7c1+WjjG8+5enpaN4dzorHs9K6qE23qE+3aMy26EccoFdepOkWebpFMd2iPN2iMt2i6Z7Znu6Z7eme2Z7umR3TPbNjumd2TPfMjume2THdMzume2bHdM/s+I+f2btP6a/yKS/ybK1j/ylDJ/52Vdv6T7DllwebxthtymnCTZpwkyfcFBNuyhNuKhNuqq+/qex/clN7+mbT09PZPdYH8/JD6f3pHMd+fFPWJ18b+XG017u2N3TX/obuOt7OXUt6Q3fV5HeN/XdaefmW9fCuuwuYfoGY/QK17C/QdOQCefoL5P0FDk4/XqDQL3D6G4x+6r9l1B6/jWm9PZ5O6dik3Ns6qSQfmdRef1L750nf4yTWd0XKR/5R+j3K4cS74lnvys96V3nWu+q/fNfy6vfzL5fn768ubpZ3PPzh1+2H28vr7e7l7R+f//6T5eyf" }, { "name": "pay_fee", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "fee_limit": [{ "end": 42, "start": 41 }], "inputs": [{ "end": 41, "start": 0 }] }, "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": "public_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": "start_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "aztec::context::inputs::public_context_inputs::PublicContextInputs" }, "visibility": "private" }, { "name": "fee_limit", "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": "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": "nullifier_non_existent_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": "contract_storage_update_requests", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest" } } }, { "name": "contract_storage_reads", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "current_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead" } } }, { "name": "public_call_stack_hashes", "type": { "kind": "array", "length": 16, "type": { "kind": "field" } } }, { "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": "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": "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": "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": "prover_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "revert_code", "type": { "kind": "integer", "sign": "unsigned", "width": 8 } }, { "name": "start_gas_left", "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": "end_gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs" }, "visibility": "public" }, "return_witnesses": [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395] }, "bytecode": "H4sIAAAAAAAA/+3dB5gcR5k38J4N0mhHGiXnuI6yLUveIO1KVhplyzlbjrJyzjlYVk5OOACOwjnKGO4wGIQBm5w54LvjDg6MgSPecXBgsviqZur1/rdUtZ6Wu4a35Xeep56pru3u+tV/qrtnd8JmotLtlkwUZUy91tyfEe1/o3UK5r7h7d0aE9xXQ0hnJiXOqpQ4q1PirEmJszYlzk4pcXZOiTObEmeXlDjrUuLMpcTZNSXObilx5lPi7J4SZ4+UOHumxNkrJc7eKXEekhLnoSlxHpYS5+EpcR6REueRKXEelRLn0SlxHpMS57EpcR6XEufxKXHWp8R5QkqcJ6bEeVJKnCenxHlKSpynpsTZJyXO01LiPD1B52Bw0mt0fc39mea+n7nvb+7Por7NfaMZY8EsN6nSrMoAVQaq0qJKqyqDVNH9na3KEFWGqjJMleGqjDDbj1RllCqjVRmjylhVxqkyXpVzVJmgyrmqnKfK+apcoMqFqlykysWqXKLKpapcpsrlqlyhypWqXKXKRFWuVuUaVa5V5TpVrlflBlUmqXKjKpNVmaLKVFWmqTJdlRmqzFRlliqzVZmjylxV5qkyX5UFqixUZZEqi60slqiyVJVlqixXZYUqK1VZpcpqVdaoslaVdarcpMp6VW5WZYMqG1XZpMpmVbaoslWVbapsV2WHKjtV2aXKLarcqsptqtyuyh2qvEuVO1W5S5W7VblHlXer8h5V3qvKvarcp8r9qjygyoOqPKTKblXep8rDqjyiyqOqPKbK46o8ocqTqjylytOqPKPKs6o8p8oeVZ5X5f2qvKDKB1T5oMmi3mTxT6r8syofUuVFVT6sykdUeUmVj6ryMVX2qvJxVV5W5ROqfFKVT6nyiiqvqvJpVT6jymdV+Zwqn1flC6p8UZUvqfJlVb6iyldV+ZoqX1flG6r8i2X5pirfUuXbqvw/Vf5VlX9T5Tuq/Lsq/6HKd1X5nir/qcr3VfmBKq+p8kNVXlflR6r8WJWfqPJfqvxUlZ+p8nNVfqHKL1X5lSr/rcr/qPJrVf5Xld8YSw9j+a0q/6fK71T5vSpvqPIHVf6oyp9U+bMqf1Hlr6r8TZV9qvw9Ku0kk2k/riq1UK1KjSq1qnRSpbMqWVW6qFKnSk6Vrqp0UyWvSndVeqjSU5VeqvRW5RBVDlXlMFUOV+UIVY5U5ShVjlblGFWOVeU4VY5XpV6VE4yFzgsnqoWTVDlZlVNUOVWVPqqcpsrpqpyhSl9VzlSlnyr9VTlLlQZV9IvkTao0qzJAlYGqtKjSqsogVQarcrYqQ1QZqsowVYarMkKVgiojVRmlymhVxqgyVpVxqoxX5RxVJqhyrirnqXK+KheocqEqF6lysSqXmLF0MmO5VC1cpsrlqlyhypWqXGVO7BPN/dVmm65mm2vUwrWqXKfK9arcoMokVW5UZbIqU1SZqso0Vaabfcww9zPN/SxzP9vczzH3c839PHM/39wvMPcLzf0ic7/Y3C8x90vN/TJzv9zcrzD3K839KnO/2tyvMfdrzf06c3+TuV9v7m829xvM/UZzv8ncbzb3W8z9VnO/zdxvN/c7zP1Oc7/L3ON7TN68Fcx9w9u7Fd+gUWP2hW9c0e36TRHV5uf6hXI9QfQLvPrFU/3CpH7RT7+gpieBfiFIv8iiX8DQB7v+w7v+o7b+g7H+Y6z+Q6f+I6L+A53+45f+w5L+o43+g4j+Y4P+RV7/kqx/Aa1X5QRV9C8l+gm/fjKtn6jqJ4H6CZZ+8nI6WKdk2vz6gq4v5vpCri/i+gKuD1J94X6nX6zf6Rfof/RF+R99IX67F99/9AU37RdZ34VVX1T1BTXuRVRfQPXFU1849UVTXzD1xVJfKPVFUl8g9cVRXxj1RVFfEPXFUF8I9UVQXwD1xU9f+PRFT1/w9MVOX+j0RU5f4PTFTV/Y9EVNX9D0xUxfyPRFTF/A9MVLX7j0RUtfsPTFSp/7zbR58za2uq1+pLkfuWTJ5NX1sxdMm76qfuHyZfULZ9RPWbh8wbSluOFS2PAYcz952bLp8xctq1+2sH7ytGn1K2cvm1W/cMX0JTPmLVyJ206ra6sfbe6nTp43r7jh0qXTlyybNH/yqklTZi+btHT2mum46YID3/Te7gc41Pd1P+A+H6k/wD5f6dtW723uJ3S8yWf7HmBfP4cN4z6Ufz3QThv7HXinw/rFDmdkvwN0Tn8bzlUH2unz/eN1+uYh/WmzYRZ2VogSelo6eNDUTrBz+/3U+mlplfkZ3deb9mqzTPcZ015jlmus9lqzXGvtp7NZ7my1dzPL3az27ma5u9Xe0yz3tNp7m+XeVvvhZpnuC6a9ntaz2k8xy6dY+znVLJ9qtfcxy32gPWd+VryZdt1GJ94MtNGvClXQRu97r4Y2+l2yBto6m7ZaaKP50wnaupi2ztBGZ+MstOVMWxdoo99H66Ctm2nLQVvetHWFNjr7doM2+rtFHtro8tYd2nqZth7QRmeMntB2iGnrBW2Hmrbe0HaYaTsE2g43bYdC2xGm7TBoozPA4dB2lGk7AtroEnMktNFJ4ChoO9a0HQ1tx5m2Y6DteNN2LLTVm7bjoO0E03Y8tJ1o2uqh7STTdgK0nWzaToS2U0zbSdB2qmk7Gdr6mLZToO0003YqtNGvln2gjc5Bp0FbX9N2Op0rotJT8De3oXMUtPWl8xO0nUnnJmjrR+claOtv2jpB21nQN7U1mLYstDWaBTq29OIYUy9ECZ23BzU36f2OTXq/DQOKQxqf+H4b9G8GxV/fKesC9DMWsppg6pko2T+9nAP7zUA/1F4D9UtgXVqP8qDzI9n1OW+cqU/oYLsx1nZ5WGecY/yFKNnxj7c84y1zreVIfs62ypwt/xZ7zk6Cde25R9fqg3HOXg6O5OfslEBztknmbFT602kUuecePW88GOfsFHAkP2enyZwt/xZ7zq6Fde25R7/DHIxzdhE4kp+zMwLN2UaZs1HpJaMocs89+n36YJyz68GR+Jwd3CDn2fJvsefse2Fde+7R33YOxjl7KziSn7NNgeZss8zZqPRSeRS55x79nfFgnLP3gyP5OTsw0JxtaJE5W3qbRhS55x79zftgnLNPm7r+m+3ELqX6UdB2tWk7GrwB5vbkQHN7qszt0luIosg9R+n1l4Nxbr9k6noezzDz+Dhom2najoe2WaatHtpmm7YToG2OaTsR2uaatpOgbZ5pOxna5pu2U6BtgWk7FdoWmrY+0LbItJ0GbYtN2+nQtsS0nQFtS01bX2hbZtrOhLblpq0ftK0wbf2hbaVpOwvaVpm2BmhbbdoaoW2NaWuCtrWmrRna1pm2AdB2k2kbCG3rTVsLtN1s2lqhbYNpGwRtG03bYGjbZNrOhrbNpm0ItG0xbUOhbatpGwZt20zbcGjbbtpGQNsO01aAtp2mbSS07TJto6DtFtM22rTp143pNUF6y6pepIwKUXLHpO6fHg+6ZazlAtTJoD2tyXuac9BHOZ7WsJ7i98EMdPQ1KEBfcR+LQeAZHMCj93t28vstXoOHWGOicVN/eVinL4xzSIBxZqBf2jctDwEPzUs8f9F6LUyM1IbnySEO49DkjU2ux5WWh4KR2gaHzawp7rlkSNB8BjTgY1GOZyh4AhyHjYHmQfFvKXQN3Rcle94YbmXlml+0zjDIb3iA/DLQL+2blqk/MYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSzmgpjFLGYxi1nMkZgb3t5NzGIWs5jFLGYxi1nMYhazmFNpxs8g4GeZaL0WJkZqOzuspylnefQtYy0XoD4cPIXEPaX39w+P4SmAZ0Tinvb/uz7B/Rbfhz/SGsdwa0x5WAePnZEBxpmJ9s+Vlqk/MYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWczvTDO+x52sOVhvKBMjtY0I7MlZHn3LWMv4c5cRH9dRgYwjYxhHhfU04Jym/WvjmVab/n9IZ1S3WQJ8jqL4fn6aIzVmv+QYDu20zoB+bbb+xtYNfj4yCu8dCfkUoB8cB63TXN227nSHF//30DCrTY8h1P/zoL5o37RM/XWL9v/8UTeoF6CN6kNhLGdbbXosIf5PTCby/2+SwWCkceHngshWn5inaWqYcQ5o6K72UQf7G2zlS+OqgrHiY6Vdyf/foAHF44H+NxEdD9Q/9VcD64wzxwD9v2+8ZaMQ/0dpQEOYsZfm3kAYo97vcMfYaZ3z4FxwganjcT8CcrzO8XO6dXTtwP8TFeLaofseDc4C9IN9jwFrQn03Yt8ZU6gfaq+B+rXVbevSepQHZU12fY6gczba7e2GWdvlYZ2RjvEXomTHP8ryjLLM+jG5GObZdXD9LgQyjfRkhP8bitbB/7FF1zlan/P/tCpAvngdH2h59RgGOcYQ6to3KGo/BlrGax8dl/g/28hWn5gn/LVvoDW2FmtcOvt+Vpt+vBZWhxx3++sA7buPZcTrZCdrHbyG0DrL3uI6Gep/ALZafXV0rSFDHrarAmOIOY/HVznGwWCk7arBGOJ/m+Wg33KMeE6k7WrAGOL8h+facoyuc2ItGIcGMh7I/6zLw3adwDgskDHO9wAMAyNt1xmMIb47Ie5zSPw+BfzbCN2H+L6AuN9fMAKMtF0XMBYCGUfEMBbASNvVgZHr38NyYOT09zB8HtkVjKMDGUfFMI4GI/5OQcYQvw/koN9yjGPAiF4yjg1kHBPDOBZctF13MI4LZBwbwzgOjLRdDzCOD2QcF8M4Hoy0XU8wnhPIOD6G8Rww0na9wDghkPGcGMYJYKTteoPx3EDGCTGM54KRtjsEjOcFMp4bw3geGGm7Q8F4fiDjeTGM54ORtjsMjBcEMp4fw3gBGGm7w8F4YSDjBTGMF4KRtjsCjBcFMl4Yw3gRGGm7I8F4cSDjRTGMF4ORtjsKjJcEMl4cw3gJGGm7o8F4aSDjJTGMl4KRtjsGjJcFMl4aw3gZGGm7Y8F4eSDjZTGMl4ORtjsOjFcEMl4ew3gFGGm748F4ZSDjFTGMV4KRtqsH41WBjFfGMF4FRtruBDBODGS8KoZxIhhpuxPBeHUg48QYxqvBSNudBMZrAhmvjmG8Boy03clgvDaQ8ZoYxmvBSNudAsbrAhmvjWG8Doy03algvD6Q8boYxuvBSNv1AeMNgYzXxzDeAEba7jQwTgpkvCGGcRIYabvTwXhjIOOkGMYbwUjbnQHGyYGMN8YwTgYjbTcQjFMCGSfHME4BI23XD4xTAxmnxDBOdXj2JecpvmdwiqOv6cmPvfjdytOi8sc+HTwzkvcUH4vpMTwzwnqKj8V0R1+zku+r+FjMjMof+yzwzE7eU3wsZsXwkCEP22Fmc5I3FjObHcM4Bzxzk/cUM5sTwzMXMpvjyGxe8sZiZnNjGOeBZ37ynmJm82J45kNm8xyZLUjeWMxsfgzjAvAsTN5TzGxBDM9CyGyBI7NFyRuLmS2MYVwEnsXJe4qZLYrhWQyZLXJktiR5YzGzxTGMS8CzNHlPMbMlMTxLIbMljsyWJW8sZrY0hnEZeJYn7ylmtiyGZzlktsyR2YrkjcXMlscwrgDPyuQ9xcxWxPCshMxWODJbFci4MoZxFRhXgo3uVwcyrophXA1G2g7f27MmkHF1DOMaMNJ2+N6etYGMa2IY14KRtsP39qwLZFwbw7gOjLQdvrfnpkDGdTGMN4GRtsP39qwPZLwphnE9GNFLxpsDGdfHMN4MLtoO39uzIZDx5hjGDWCk7fC9PRsDGTfEMG4EI22H7+3ZFMi4MYZxExhpO3xvz+ZAxk0xjJvBSNvhe3u2BDJujmHcAkbaDt/bszWQcUsM41Yw0nb43p5tgYxbYxi3gZG2w/f2bA9k3BbDuB2MtB2+t2dHIOP2GMYdYKTt8L09OwMZd8Qw7gQjbYfv7dkVyLgzhnEXGGk7fG/PLYGMu2IYbwEjbYfv7bk1kPGWGMZbwUjb4Xt7bgtkvDWG8TYw0nb43p7bAxlvi2G8HYy0Hb63545AxttjGO8AI22Hr0Xdmbyx+DeJO2IY7wTPu5L3NAYaZ/Fz3XdZY7rDGlMe1sHP0N0VYJwZ6Jf2Tct3weOQNjM+fvXJ9d2q93t38mNqos/eUq53W/nSuPQ69Lx06qzpU+deuHzevNkzZk9fMnbV7KXLluIxc4+5x7Z91vJdnnX0ON8Ny4VkxtmIfdaCkfrS/d4bJZ7vDH1+eU/U/tbR+eVe8Lw3eU9joHEWv4PjPrAns98B03VW91tZvcfKKg/roOH+APlloF/aNy3f7+g7uSxaZui+HygjiwccngcqnMUDjr6Ty6J1gO77wTKyeNDhebDCWTzo6Du5LJqK1/aHysjiIYfnoQpn8ZCj7wSPkcG6791lZLHb4dld4Sx2O/pOMIviufN9ZWTxPofnfRXOgvqLa34oheYHUmjmkHPWqifTd0ux74fLyOJhh+fhCmfxsKPvBLOYqvt+pIwsHnF4HqlwFtRfXPNDDMxZq55M362Tdd+PlpHFow7PoxXO4lFH3wnO5YG678fKyOIxh+exCmfxmKPvBLMoPl9+vIwsHnd4Hq9wFtSf/o4k+p19WG1IT2NDzvLoW0e/p5MhB3X83f2JxI2l94VTX09AX08m31eja77Q8pNh+56h9/t08vst/p70jNkXfbfl044xPWvqmYTzfAb2m4F+qL0G6mfXtq1L61EedNySXb9X5SlTR7u93ePWdnlY5ynH+AtRsuN/2vI8bZn1kM+C4zzE3CpnXuv3g9wLdfIkf0wPKJ537ona3zo67+BxH+Jv3KHOXa7c77HGhOc3fN0n1PXnCctDy487+q6Pks3i3jKyuNfhCfC32w6zoP7imqem0Cw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzz8whZ+2ZZupkzcF605gYqQ2/JyX59/eX3k+PHn3LWMsFqD8ZOJ8w4yy9h/ypyJ37k5A7rYPH11MBxpmBfmnftPwUPA5xzI+n0Cw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5H5hZe2aaOllzsN5MJkZquxc8TyfuaWrIWR59y1jLBag/HTifMONs/z8c7NyfhtxpHTy+ngkwzkzk/78G+P8exCxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcy8zdoz29TJmoP1ZjMxUttT4En+//qWXndAj7519LrDs4HzCTPO0usOz0Xu3J+F3GkdnKvPBRhnJtr//zvT8nPwOIhZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYeZu1Z66pkzUH681lYqS2Z8CzJ3FPY0PO8uhbR6877AmcT5hxll53eD5y574Hcqd1cK4+H2CcGeiX9k3Lz8PjIGYxi1nMYhazmMUsZjH/I8zaM9/UyZqD9eYzMVLbc+B5f+Ke0vu10KNvHf3e9P7A+YQZZ+n3phcid+7vh9xpHZyrLwQYZwb6pX3T8gvwOMQxP55Cs+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkvM7J2ftWWjqZM3BeguZGKntefB8IHFPc0PO8uhbR687fCBwPmHGWXrd4YORO/cPQO60Dh5fHwwwzgz0S/um5Q/C4xDH/HgKzWnMWeaG5HwwmWVuiNlnlrkhZp9Z5oaYfWaZG2L2mWVuiNlnlrkhZp9Z5oaYfWaZG2L2mWVuiNlnlrkhZp9Z5oaYfWaZG2L2mWVuiNlnlrlxYGbtWWzqZM3BeouZGKntBfD8U/Kelpzl0beO3rfzT4HzCTTO4vt2/jly5/5PkDutg3P1nwOMMwP90r5p+Z/hcTjYzY+n0CxzozJmDnNDe5aaOllzsN5SJkZq+yB4PpS8Z2rO8uhbR9eLDwXOJ9A4i9eLFyN37h+C3GkdPL5eDDDODPRL+6blF+FxiGN+PIXmNOYsc0NyPpjMMjfE7DPL3Dgws/YsN3Wy5mC95UyM1EbP5aqgra+532c598VwzniLm97Hh82+OjuMNfDz6XWl+x7R/jeXu2DaaV8fAj8uZ2AbWleP9yMHMF77cbAbcLzVYPiIYxxnQP/a89IBeMrJ/6NmX5g/9VUDP19YZv7kLph22ldH+Z9h9YsuX04fs9YrWI6PQX+4/oes9fea5Q979rPX2s9ex37weKs1bR+ztq+BdbbXta27ztQzMD7ax15rLDWwzibYx82mntC83W8e63NXf7MvNG4N22/TW/Wrf36Wae8PP98V1tWA/X7E0W8VtNOcLkTt5xWe9/FvKfTY0/a0fg2scz889nfA/LH3YR83uI93wz7uqsD8aYj2z+veCsyfjvrVP2+kvuDnD1Vg/jQ6XNjvhwI8DnZ/NIdxjtHPH4P58Qjk1WR+fhbs5wnHzxsdPw80riZ7XE3WuPB1iExy/bZ7HaIman8Ox9dWAnwmuvi3O3y9jsaGtwLU8bWnDyTvaQw0zgb8ztlsYvsd0KKzsr8f+YNWVnlYBw2hvnvY/t4EWn7e0XdyWbQM1H3vKSOLPQ5PgP+j0mEW1F8azVmrnkzfTc7/d+/K4jmHJ9T/H/Jl8Zyj7+SyaB2g+362jCyedXierXAWzzr6TvC4nqH7fqaMLJ5xeJ6pcBbU3zvBvIeBOWvVk+m7ZZDu++kysnja4Xm6wlk87eg7wSwG676fKiOLpxyepyqcxVOOvhPMolX3/WQZWTzp8DxZ4Syov7jmZxiY8Xf8v9cF9UzLWR7KLLKMkWXMQR1/L3kieWMDPj5PQF+PJ99Xo2u+0PLjYfueqvf7aPL7LT63fMTsi/6u9KhjTA+beoK/Xzdi3xlTqB9qr4H6X+FvYbQe5UHHLdm7qfKYqaPd3u5Ja7s8rPOYY/yFKNnxP2p5HrXM+jH5DRznIeZWOfNavy5Ax3I3yCXAMV38u95Hova3js47eNyHet9SiHMXnreT/Dug6zryESurfLT/tSXQ33iKnicsDy139L2SHZmrGJhxXtRHyc6LAMd5U3e1jzrI9XErXxwXnYeS/Lu43gedU2uhP+oLrwf091ZaH//eujvxbJqLf299OGp/6+icsxs870vcUzrnJD/O0tx6COzJ7Hdgs87qQSurh62s8rAOGh4MkF8G+qV90zL1F9f8XArNzzIwZ616Mn23Num+HygjiwccngcqnMUDjr4T/P272Pf9ZWRxv8Nzf4WzoP7imp9Kofn5FJr3MDBnrXoyfbcWr1P3lZHFfQ7PfRXO4j5H3wmeM4q/991bRhb3Ojz3VjgL6i+u+dkUmp9LoXkPA3PWqifTd3Pxb2TvLSOL9zo8761wFtRfXPMeBuasVU+m75bpuu/3lJHFexye91Q4C+ovrvnZFJqfS6F5TwrND6TQfJ+YK2LmcN7IWvVk+m4tvib97jKyeLfD8+4KZ0H9xTU/z8CcterJ9N1SfK/XPWVkcY/Dc0+Fs7jH0XeC7wEsPoe5u4ws7nZ47q5wFtRfXPOeFJofSqH5uRSan02h+cEUmh9IofmpFJqfT6E5jefn+1Novi+F5jSen9N4HUzjfOZw3sha9WT6bpmm+76rjCzucnjuqnAWdzn6TvD37eLnzO4sI4s7HZ47K5wF9RfXfH8Kzc+l0LwnhWaZG5UxP5BC84MpNMt548DMWaueTN8txc+0v6uMLN7l8LyrwllQf3HND6bQ/GwKzXen0LyHgTlr1ZPpu7nY9x1lZHGHw3NHhbOg/uKa72Fgxs+TndU1pKe5+PlJ9FBmkWWMLGMO6rshsxmJG0ufn6S+ZkBfU5PvyznHaXlq0L6bi5+f/FjyYyq+N4y+x83+bjgc08dNPZNwnnthvxnoB7+Xjupndm1bl9ajPB42dbLrz/i1mDra7e3usLbLwzotjvEXomTH/zHL8zHLrB+TE+A4DzG3ypnX+vOTdCwPg6zoVgVZPZa4sZRVZBnp9pjDM4KZZwszzypmnnnMPCcw89zAzHMoM8+lzDxdmHnGMfPcwsxzMzPP2cw8S5l5TmPmmcnMcwwzz9XMPP2ZeXow81zAzPMiM08/Zp4aZp6RzDzbmHnWMPMsYOY5iZnnRmaeRmaew5l5Lmfm+SgzT46Z5xxmntuYeTYy8wxl5lnOzHMGM89sZp7jmHmuZebpxcxzETNPJ2ae0cw8O5h51jHztDLzLGLmOYWZZwozzwvMPAOYeY5k5rmSmacbM8+5zDybmXmGM/OsZOaZy8xTz8xzPTPPIcw8lzDzvMTMs4uZZywzT5aZ50xmnvXMPIOZeZYw8/Rh5pnOzHM0M89EZp7uzDznM/NUM/MUmHm2MvOsZuaZz8xzIjPPJGaeBmaew5h5LmPmqWPmGc/McyszzwZmniHMPMuYeU5n5pnFzHMsM881zDxnMfP0ZOa5kJmnlplnFDPPdmaetcw8A5l5FjLznMzMM5mZ5whmniuYeboy80xg5rmdmWcTM88wZp4VzDx9mXnmMPMcz8xzHTNPMzNPb2aei5l5PszM05mZZwwzz05mnpuYeQYx8yxm5jmVmWcaM89RzDxXMfPkmXnOY+bJMPDkov2/fzQHP38B2qqsbfX19wP9235O3xVaBdvQdx5WO/Y9A9oeMXXX951iTgG+77SYE/ZViPb//tNu4LiDiec8Zp48M89VzDxHMfNMY+Y5lZlnMTPPIGaem5h5djLzjGHm6czM82FmnouZeXoz8zQz81zHzHM8M88cZp6+zDwrmHmGMfNsYua5nZlnAjNPV2aeK5h5jmDmmczMczIzz0JmnoHMPGuZebYz84xi5qll5rmQmacnM89ZzDzXMPMcy8wzi5nndGaeZcw8Q5h5NjDz3MrMM56Zp46Z5zJmnsOYeRqYeSYx85zIzDOfmWc1M89WZp4CM081M8/5zDzdmXkmMvMczcwznZmnDzPPEmaewcw865l5zmTmyTLzjGXm2cXM8xIzzyXMPIcw81zPzFPPzDOXmWclM89wZp7NzDznMvN0Y+a5kpnnSGaeAcw8LzDzTGHmOYWZZxEzTyszzzpmnh3MPKOZeTox81zEzNOLmedaZp7jmHlmM/OcwcyznJlnKDPPRmae25h5zmHmyTHzfJSZ53JmnsOZeRqZeW5k5jmJmWcBM88aZp5tzDwjmXlqmHn6MfO8yMxzATNPD2ae/sw8VzPzHMPMM5OZ5zRmnqXMPGcz89zMzHMLM884Zp4uzDyXMvMcysxzAzPPCcw885h5VjHzbGHmGcHMU+XwvBDI80jUdivA8gths2jQ+90daExTzb5qzX7JT/3VwDr3dS/d0+8seMN9kdP+zkh8fwKtW+XIcZ/J8jFYLpQ55hlvccO+O0PfjznG+3AH43W5C6ad9vUI+HE5A9vQulnoN8547cfUbkBfNRjwscJ5PdVyYR2PgZcgh93WeoWofT67YVy4XBvtnxXm59sO86O/j0fQlnGYcL/242Wvu89aroV18FjfC/spmHrD27o1NenXH1qi9reMtVyA+l7wfCxxT0NjmHGWzmkfB3sy+20pntNetrJqsbLKwzpoeDlAfhnol/ZNyy87+k4ui9YBuu9PlJHFJxyeT1Q4C+ovjeasVU+m75aBuu9PlpHFJx2eT1Y4i086+k4wi2m670+VkcWnHJ5PVTiLTzn6TvC4btB9v1JGFq84PK9UOAvqL675ZQbmrFVPpu+m4uP3ahlZvOrwvFrhLKi/uOaXGZizVj2Zvltm6L4/XUYWn3Z4Pl3hLKi/uOZXGJizVj2Zvlubdd+fKSOLzzg8n6lwFp9x9J1gFsXnGJ8tI4vPOjyfrXAWn3X0neBx3aT7/lwZWXzO4flchbOg/uKaX2Zgzlr1ZPpuLT5+ny8ji887PJ+vcBbUX1zzxxmYs1Y9mb5biuflL5SRxRccni9UOAvqL6755RSaX2Fgzlr1ZPpubdV9f7GMLL7o8Hyxwll80dF3gsffYN33l8rI4ksOz5cqnAX1F9f8MgNz1qon03fLIN33l8vI4ssOz5crnAX1F9f8SgrNn2Fgzlr1ZPpuma77/koZWXzF4flKhbP4iqPvBLMo/r39q2Vk8VWH56sVzoL6i2v+RArNn2Ngzlr1ZPpuadF9f62MLL7m8Hytwll8zdF3gllM1X1/vYwsvu7wfL3CWVB/cc2vptD8BQZm/b4Oej1/do+QnqbmnOWhzCLLGFnGHNTxdf1vJG5saMDH5xvQ178k31eja77Q8r8E7bupSe/3W8mPqfgazrfNvui9U99yjOn/mXom4Ty/DfvNQD/UXgP1GT3a1qX1KA86bsmu36P1TVNHu73d163t8rDONx3jL0TJjv9bludbllk/JtfCcR5ibpUzrzWBjuWTIJcAx3TxvUMvRO1vHZ138LgP8b+sQ5278Lz9Nt4rt5/XdR15wcoqH+1/bQn0Hqmi5xuWh5apv7jmKgZmnBf1UbLzIsD1q0m/DbQOcv0XK18cF52HEpyXxfdw0jm1Fvr7FvQb4DrT7hpXY/ZtXxt0399JPPPmqfpc9q9R+1tH57LvgOffEveUzmXJj7M0Z/8d7Mnsd2DxtZT/sLL6VyurPKyDhv8IkF8G+qV90zL1F9f8cgrNr6bQ/LkUmj/OwJy16sn03VJ8zeq7ZWTxXYfnuxXOgvqLa/5ECs2vpND86RSav5ZC86spNL+cQjOHYzBr1ZPpu7n4fPx7ZWTxPYfnexXOgvqLa34lheYvp9D8agrNL6fQnMb5/PEUmr8m5oqY03je+EIKzZ9IofkrDMxZq55M303F9zn9ZxlZ/KfD858VzoL6i2t+JYXmf0+h+eUUml9NoflzKTR/PIXm/0ih+RMpNKfx/PzpFJq/lkJzGs/PabwOpnE+p/G88ckUmj+TQnMa53Mazxty7a6MOY1zI43P+dP4u5WcNypj/moKzWmcz2l8zp/G53UcjsGsVU+m7+Zi398vI4vvOzzfr3AW1F9c8/cYmPHzOHf2DOlpnpazPJRZZBkjy5iD+ncgsx8kbix9/oz6+gH09VryfTnnOC2/FrTv5ql6v68nP6bie4F+ZPZFnz973TGmH5t6JuE8fwT7zUA/1F4D9dt7tq1L61EedNySXX/+7IemjnZ7u+9b2+VhnR86xl+Ikh3/65bndcusH5PNcJy/lrijeWo581p//oyO5WGwLn2Ooypq+25r/E7w3VB/xNpGj+fbiY+noTEHfdCto/PWt8HzSABPoHEWj90fWGP6pjWmPKyzG8YZ4Fzc7vOktG9a/gF46FYFnhDzoJzHHD0jmHm2MPPsZeZZxcwzj5nnBGaeG5h5DmXmuZSZpwszzzhmnluYeW5m5jmbmWcpM89pzDwzmXmOYea5mpmnPzNPD2aeC5h5XmTm6cfMU8PMM5KZZxszzxpmngXMPCcx89zIzNPIzHM4M8/lzDwfZebJMfOcw8xzGzPPRmaeocw8y5l5zmDmmc3Mcxwzz7XMPL2YeS5i5unEzDOamWcHM89uZp51zDytzDyLmHlOYeaZwswzgJnnSGaeK5l5ujHznMvMs5mZZzgzz0pmnrnMPPXMPNcz8xzCzHMJM89LzDy7mHnGMvNkmXnOZOZZz8wzmJlnCTNPH2ae6cw8RzPzTGTm6c7Mcz4zTzUzT4GZZyszz2pmnvnMPCcy80xi5mlg5jmMmecyZp46Zp7xzDy3MvNsYOYZwsyzjJnndGaeWcw8xzLzXMPMcxYzT09mnguZeWqZeUYx82xn5lnLzDOQmWchM8/JzDyTmXmOYOa5gpmnKzPPBGae25l5NjHzDGPmWcHM05eZZw4zz/HMPNcx8zQz8/Rm5rmYmefDzDydmXnGMPPsZOa5iZlnEDPPYmaeU5l5pjHzHMXMcxUzT56Z5zxmngwDTy7a/7soc/DzvdBG35n4TWij7+V8BNqqHH3Qe0N+AG30/Rq0D30939t//31jTqG+JxL7KkT7f4dvN3B8n4nnPGaePDPPVcw8RzHzTGPmOZWZZzEzzyBmnpuYeXYy84xh5unMzPNhZp6LmXl6M/M0M/Ncx8xzPDPPHGaevsw8K5h5hjHzbGLmuZ2ZZwIzT1dmniuYeY5g5pnMzHMyM89CZp6BzDxrmXm2M/OMYuapZea5kJmnJzPPWcw81zDzHMvMM4uZ53RmnmXMPEOYeTYw89zKzDOemaeOmecyZp7DmHkamHkmMfOcyMwzn5lnNTPPVmaeAjNPNTPP+cw83Zl5JjLzHM3MM52Zpw8zzxJmnsHMPOuZec5k5sky84xl5tnFzPMSM88lzDyHMPNcz8xTz8wzl5lnJTPPcGaezcw85zLzdGPmuZKZ50hmngHMPFOYeU5h5lnEzNPKzLOOmWc3M88OZp7RzDydmHkuYubpxcxzLTPPccw8s5l5zmDmWc7MM5SZZyMzz23MPOcw8+SYeT7KzHM5M8/hzDyNzDw3MvOcxMyzgJlnDTPPNmaekcw8Ncw8/Zh5XmTmuYCZpwczT39mnquZeY5h5pnJzHMaM89SZp6zmXluZua5hZlnHDNPF2aeS5l5DmXmuYGZ5wRmnnnMPKuYefYy82xh5hnBzFPl8Ow29X0H7mm0G/Q+aG5E0MeL0PYieGldev9fFbS9CHlVwTp7wY3LtbAN7u/Ft9hOO+j7o+jvmljPOEy4349aTnvdfdZyLaxD2+rHI/nv7WxqysHYIhgP3gpQ/zZ4QszXMONsaND7/Q7Yk9lvS/H4es3K6sNWVnlYBw2vBcgvA/3Svmn5NUffyWXROkD3/cMysvihw/PDCmdB/aXRnLXqyfTdMlD3/XoZWbzu8Lxe4Sxed/SdYBbTdN8/KiOLHzk8P6pwFj9y9J3gcd2g+/5xGVn82OH5cYWzoP7iml9jYM5a9WT6bio+fj8pI4ufODw/qXAW1F9c82sMzFmrnkzfLTN03/9VRhb/5fD8V4WzoP7imn/MwJy16sn03dqs+/5pGVn81OH5aYWz+Kmj7wSzKD7H+FkZWfzM4flZhbP4maPvBI/rJt33z8vI4ucOz88rnAX1F9f8GgNz1qon03dr8fH7RRlZ/MLh+UWFs6D+4pq/w8CcterJ9N1SPC//sowsfunw/LLCWVB/cc2vpdD8YwbmrFVPpu/WVt33r8rI4lcOz68qnMWvHH0nePwN1n3/dxlZ/LfD898VzoL6i2t+jYE5a9WT6btlkO77f8rI4n8cnv+pcBbUX1zzj1No/ikDc9aqJ9N3y3Td96/LyOLXDs+vK5zFrx19J5hF8e/t/1tGFv/r8PxvhbOg/uKaf5hC888ZmLNWPZm+W1p0378pI4vfODy/qXAWv3H0nWAWU3Xfvy0ji986PL+tcBbUX1zzT1Jo/iUDs35/Pb2e/6VDQ3qamnOWhzKLLGNkGXNQx9f1/y9xY0MDPj7/B339Lvm+Gl3zhZZ/F7Tvpia93zeSH1PxNZw/mH3Vmv2+4RjTH009k3Cef4D9ZqAfaq+B+ucPbVuX1qM86Lglu37v0e9NHe32dr+1tsvDOr93jL8QJTv+NyzPG5ZZPyYfh+M8xNwqZ17rz2XQsXwSrEvvI6qK2t5btBt+ju/JesnaJgtthSi5XHNR+/dT6VtH562XwPNi8p7iefSlGJ4Xw3oa85AP9hXg/Bz7scBzeIhrbKj3gekx/c4aE40bn0vQOnthnKGuVb7nEr8Dj31M4jX/JSZGavs/MP7OYfx98sYm1+NKy78HI7X9FjzJz7MBDXHPJfj8K8RjGPJ9lZTv23if8H431zX3JSurPKyDzwECPP/q8Bh4w9F3fZRsFn8oI4s/ODx/qHAW+Dwxjvn3KTRLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNzyFl7ppk6WfGzBNOYGKntd+D5Y+Ke0vv00aNvGWu5APU/Bs4nzDhL7yH/U+TO/Y+QO62Dx9efAowzE+3/GT9a/hM8DnHMb6TQLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDkfmFl7Zpo6WXOw3kwmRmr7A3j+nLinqSFnefQtYy0XoP7nwPmEGWfpfe9/idy5/xlyp3Xw+PpLgHFmoF/aNy3/BR4HMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFjNvs/bMNnWy5mC92UyM1PYn8Pw1cU/pdQf06FtHrzv8NXA+YcZZet3hb5E7979C7rQOztW/BRhnBvqlfdPy3+BxELOYxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjHzNmvPXFMnaw7Wm8vESG1/Ac++xD2NDTnLo28dve6wL3A+YcZZet3h75E7932QO62Dc/XvAcaZgX5p37T8d3gcxCxmMYtZzGIWs5jFLOZ/hFl75ps6WXOw3nwmRmr7G3joF5rkPKX3a6EHumlntH8YKp8w4yz93pTJuHOn/vKwDs7VTPKe4jyILA8tU39xzW+k0Cw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+QsOfvMkrPk7DNLzpKzzyw5S84+s+T8zslZexaan5M1B+stZGKktr+DpypxT3NDzvI4Ft/sKwJDqHzCjLP0ukO1J/cqyL3acXxVB5oHVZaHlqvh+IpjfiOF5jTmLHNDcj6YzDI3xOwzy9wQs88sc0PMPrPMDTH7zDI3xOwzy9wQs88sc0PMPrPMDTH7zDI3xOwzy9wQs88sc0PMPrPMDTH7zDI3xOwzy9w4MLP2LKYVTFsO1lvMxEht9N4Y7alJ3tOSszwQSzsj3WoyYfMJNM7i+3ZqPbnXQO61jrlaG2ge1FgeWq6F4+tgN78hOYs54js3tGep+XkVXC9ovaVMjDXWNUR7OiXvmZqzPPrW0fWiUyZsPoHGWbxedPbk3gly7+w4vjoHmgedLA8td4bjK475jRSa05izzA3J+WAyy9wQs88sc+PAzNqz3PycrDlYbzkTI7XRc7lQnpzl0Tdrsd3zzM7gyQbw6P12SX6/xeeZdZ7cu0DutM7eqG2cdYHmQRfLQ8t14KFbFXi6BPLgrQD1Lg7PCGaeLcw8q5h55jHznMDMcwMzz6HMPJcy83Rh5hnHzHMLM8/NzDxnM/MsZeY5jZlnJjPPMcw8VzPz9Gfm6cHMcwEzTz9mnhpmnpHMPNuYedYw8yxg5jmJmedGZp5GZp7DmXkuZ+bJMfOcw8xzGzPPRmaeocw8y5l5zmDmmc3Mcxwzz7XMPL2YeS5i5unEzDOamWcHM886Zp5WZp5FzDynMPNMYeYZwMxzJDPPlcw83Zh5zmXm2czMM5yZZyUzz1xmnnpmnuuZeQ5h5rmEmWcXM89YZp4sM8+ZzDzrmXkGM/MsYebpw8wznZnnaGaeicw83Zl5zmfmqWbmKTDzbGXmWc3MM5+Z50RmnknMPA3MPIcx81zGzFPHzDOemedWZp4NzDxDmHmWMfOczswzi5nnWGaea5h5zmLm6cnMcyEzTy0zzyhmnu3MPGuZeQYy8yxk5jmZmWcyM88RzDxXMPN0ZeaZwMxzOzPPJmaeYcw8K5h5+jLzzGHmOZ6Z5zpmnmZmnt7MPBcz8+xl5unMzDOGmWcnM89NzDyDmHkWM/OcyswzjZnnKGaeq5h58sw85zHzZBh4ctH+392Xg5+/CG30HXOdYNucqXeGtq6mnoW2Kke/9H6ROmij73DIQRv9nZX2q6/7r/Tfvz/MMxcoT+yrAMvUXzdwvJnDP9hzHjNPnpnnKmaeo5h5pjHznMrMs5iZZxAzz03MPDuZecYw83Rm5tnLzHMxM09vZp5mZp7rmHmOZ+aZw8zTl5lnBTPPMGaeTcw8tzPzTGDm6crMcwUzzxHMPJOZeU5m5lnIzDOQmWctM892Zp5RzDy1zDwXMvP0ZOY5i5nnGmaeY5l5ZjHznM7Ms4yZZwgzzwZmnluZecYz89Qx81zGzHMYM08DM88kZp4TmXnmM/OsZubZysxTYOapZuY5n5mnOzPPRGaeo5l5pjPz9GHmWcLMM5iZZz0zz5nMPFlmnrHMPLuYeS5h5jmEmed6Zp56Zp65zDwrmXmGM/NsZuY5l5mnGzPPlcw8RzLzDGDmmcLMcwozzyJmnlZmnnXMPDuYeUYz83Ri5rmImacXM8+1zDzHMfPMZuY5g5lnOTPPUGaejcw8tzHznMPMk2PmuZyZ53BmnkZmnhuZeU5i5lnAzLOGmWcbM89IZp4aZp5+zDwXMPP0YObpz8xzNTPPMcw8M5l5TmPmWcrMczYzz83MPLcw84xj5unCzHMpM8+hzDw3MPOcwMwzj5lnFTPPFmaeEcw8VQ5PXfKeJvx+PLpZi2/2FYFBe7ol7hnQgN/hV46nG3hCfD9hmHE2NOj95s1+9yW4X73L7pn2WVGeNI48rJOH/LoHmu/dLA8td4fjQMxiFrOYxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5jFLGYxi1nMYhbzO8+sPfR+dvyf7bRejomR2rqE9TTlLI++WYtv9oVG7emZuKf0/v7uMTw9wdMjwOMVZpyl9+H3suYBjbsnzINejmOnV6B52dPy0HIvON7FLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxmMb/zzNpjv+89B+t1Y2Kkth6BPTnLo2/W4pt9+Yz4uPYOZOwVw9g7rKcB53RvmEPNVv+1qmyrb7ME+BxF8f38NEdqzH7J0R3aaZ2X+rbZdtWX6t3g570y4b29IJ8C9IPjoHXuqG9b9xWHNwf55602PYaugY7hvHUM0zL11y3a//NH3aDeE9rscw/+rwk8H3UJNJY6ayy03AWMNC7X/9moT8zTNDXMOAc0dNd2yLqLlS+NqwrGmgeHdmUDuPQuO1vHw5v/WwWOB1rn0frSPf0fQ7xlYb1CgsYwYy/NvU7Wuau7Y+y0zlP1bTk9Y+p43PeAHF9y/JxuHV07OsP8rgl0/qu2Hm/qB/uugudYCfXdiH1nTKF+qiFvqn+kvm3dKusc8ea5Gs4RtXQMZfzb5a3t8rBOrWP8hSjZ8ddYnhrLrB+TPfVtdZpHgT6PVzTVvsW1JA/r1EFbzjpP4XWjEtdA33UD3XXW9c6+jtc5ruNZxxg6BxpD1hpD1joWi/8D0DonZcFWHyV77Qtx/qZrX501tpw1Lp39gKh9m368vlxfquvHs9X8vCpqaxtk6tXQNtjUa6CN/hdnLbQNMfVO0DbU1DtD2zByQdtwU+8CbfT/0uqgrRC1jY/aRpp6V2gbZerdoG001Ol+jKl3h7axpt4D2uh/WfaEtvGm3gvazjH13tA2wdQPgbZzTf1QaDvP1A+DtvNN/XBoo//DfAS0XWjqR0LbRaZ+FLRdbOpHQ9slpn4MtNH/pjwW2i4z9eOg7XJTPx7arjD1emi70tRPgLarTP1EaJto6idBG/0f45Oh7RpTPwXarjX1U6HtOlPvA23Xm/pp0Eb/a/J0aJtk6mdA242mPhDaJpt6P2ibYupvHoPQVoiS/f11utnXFOh/lqNtjqNtnqNtgaNtkaNtiaNtmaNthaNtJeRCbfT/I/EcsNrU8RywxtTxHLDW1PEcsM7U8RxwE9Tpfr2p4zmA/rcvngM2mDqeAzaaOp4DNpk6ngM2mzqeA+j/U+I5YKup4zlgm6njOWC7qeM5YIep4zlgp6njOWCXqeM5gP53MJ4DbjV1PAfcZup0DshCW5L/Y1D3dbvZ123QFzkLUXLX1Bz0RbeOfq+4BTy3Ju4pfV9E8uMs/b6yyxrT7daYcH5g7rsCjDMD/dK+aXmXo+/6KNksdpaRxU6HZ2eFs6D+4ppvS6FZcpacfWbJWXL2mSVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpwlZ5+ZQ87aM83UyZqD9aYxMVLbrUE9pffTT4va3zLWcgHqO8FzS+Ke0vvpA+RefA/5DmtM0xy50zp4fO0IME7XsUPLO+BxiGPelUKz5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5Cw5+8ySs+TsM0vOkrPPLDlLzj6z5HxgZu2ZaepkzcF6M5kYqe2WoJ6m4vveZ0btbxlruQD1HeDZmbin9L73ALkX3/e+3RrTTEfutA4eX9sDjNN17NDydngcxCxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcy8zdoz29TJmoP1ZjMxUtvOoJ7S6w6zo/a3jl532A6eHYl7Sq87BMi9+LrDNmtMsx250zo4V7cFGKfr2KHlbfA4iFnMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5h5m7VnrqmTNQfrzWVipLYdQT2Nxdcd5kbtbx297rANPCFelwmUe/F1h63WmOY6cqd1cK5uDTBO17FDy1vhcRCzmMUsZjGLWcxiFrOY/xFm7Zlv6mTNwXrzmRipbXtQT+n9WvOj9reOfm/aCp4Qv1cGyr34e9MWa0zzHbnTOjhXtwQYp+vYoeUt8DjEMe9KoVlylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9Zsn5nZOz9iw0dbLmYL2FTIzUti2op7n4usPCqP2to9cdtoAnxOsygXIvvu6w2RrTQkfutA4eX5sDjNN17NDyZngc4ph3pdCcxpxlbkjOB5NZ5oaYfWaZG2L2mWVuiNlnlrkhZp9Z5oaYfWaZG2L2mWVuiNlnlrkhZp9Z5oaYfWaZG2L2mWVuiNlnlrkhZp9Z5oaYfWaZGwdm1p7Fpk7WHKy3mImR2raG9bTkYMx06+h9O5vBsyVAPoHGWXzfziZrTIsdudM6OFc3BRin69ih5U3wOBzs5l0pNMvcqIyZw9zQnqWmTtYcrLeUiZHatoT1TM3BmOnW0fViE3hCXE8DjbN4vdhojWmpI3daB4+vjQHG6Tp2aHkjPA5xzLtSaE5jzjI3JOeDySxzQ8w+s8yNAzNrz3JTJ2sO1lvOxEhtm4N6BhQ/T7Q8an/LWMsFqG8ET4jn4YFyLz7P3GCNabkjd1rnNhjnhgDjdB07tLwBHocNMcy7UmiWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnA/MrPu+OfG+S+8fx74pn8jy0O3mwFmEGWfp/ePrI3fG1F8e1sF5uj7AODPQL+2bltfD4xDHvCuFZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9ZslZcvaZJWfJ2WeWnCVnn1lylpx9Zsn5wMy675sS77up+P5x7JvyiSwP3W4KnEWYcZbeP74ucmdM/eVhHZyn6wKMMwP90r5peR08DmIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxm3mbd99rE+y79/R77pnwiy0O3tYGzCDPO0t/v10TujKm/PKyDj/maAOPMQL+0b1peA4+DmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5jFLGYxi5m3Wfe9OvG+G4t/v8e+KZ/I8tBtdeAswoyz9Pf7VZE7Y+ovD+vgY74qwDgz0C/tm5ZXweMgZjGLWcxiFrOYxSxmMf8jzLrvlYn3XXr/EPZN+USWh24rA2cRZpyl3z9WRO6Mqb88rIOP+YoA48xAv7RvWl4Bj0Mc864UmiVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpwlZ59ZcpacfWbJWXL2mSVnydlnlpzfOTnrvpcl3ndz8e/32DflE1keui0LnEWYcZb+fr8kcmdM/eVhHZynSwKMMwP90r5peQk8DnHMu1JoTmPOMjck54PJLHNDzD6zzA0x+8wyN8TsM8vcELPPLHNDzD6zzA0x+8wyN8TsM8vcELPPLHNDzD6zzA0x+8wyN8TsM8vcELPPLHNDzD6zzI0DM+u+FyXfd0vO6pvyiSwP3RYFziLQOIvvf1kQuTOm/vKwDj7mCwKMMwP90r5peQE8Dge7eVcKzTI3KmPmMDd03/OS73tqzuqb8oksD93mBc4i0DiL5905kTtj6i8P6+A8nRNgnBnol/ZNy3PgcYhj3pVCcxpzlrkhOR9MZpkbYvaZZW4cmBmfx2ST67v4ORHqo8rc67ZZpl4NbdNNvQbaJpt6LbTdaOqdoG2SqXeGthtMvR+0XW/qA6DtOlNfDm3XmvomaLvG1DdC29WmvgHaJpr6zdB2lamvh7YrTf0maLvC1NdB2+WmvhbaLjP1NdB2qamvhrZLTH0VtF1s6iuh7SJTXwFtF5r6Mmi7wNSXQNv5pt4H2s4z9YHQdq6pL4K2Caa+ANrOMfUstI039S7QNs7U66BtLNTpfoypd4W2GabeDdqmmnoe2u4w9e7Q9i5T7wFtd5p6T2i7y9R7Qdvdpt4b2u4x9UOg7d2mfii0vcfUD4O295r64dB2r6kfAW33mfqR0Ha/qR8FbQ+Y+tHQ9qCpHwNtD5n6sdC229SPg7b3mfrx0PawqddD2yOmfgK0PWrqJ0LbY6Z+ErQ9buonQ9sTpn4KtD1p6qdC21Omfhu0PW3q86DtGVM/DdqeNfXToe05x3p7HOs9b+pnQBudH+dAG50fZ0EbnR+nQxudHydDG50fb4Q2Oj9OgjY6zm6ANjrOroc2Os6ugzY6zq6FNjrOroE2Os6uhjY6ziZCGx1nV0EbHWdXQhsdZ1dAGx1nl0MbHWeXQRsdZ5dCGx1nl0AbHWcXQxsdZxdBGx1nF0IbHWcXQBsdZ+dDGx1n50EbHWfnQhsdZxOgjY6zc6CNjrPx0FZv6uOgjY4zPF/ScTYG2ug4mwFtdJxNhTY6zu6ANjrO3gVtdI24E9roWLkL2uhYuRva6Fi5B9r6mvq7oe1MU38PtNFzgPdCW39TvxfazjL1+6CtwdTvh7ZGU38A2ppM/UFoazb1h6CNnnvshja6Tr4P2lpM/WFoazX1R6BtkKk/Cm2DTf0xaDvb1B+HtiGm/gS0DTX1J6FtmKk/BW3DTf1paBth6s9AW8HUn4W2kab+HLSNMvU90Dba1Ol8qc9L+lzSw/zRr1umbd281abPa11NvRAl+3w6D390LMAy9aeN3U09D21U7wXGuuSNxb8fkqXG7JfmYh200zqvmgOJzrV408Zs4sYBRWNns99aK8csGGmdz72FsXMAY5ixl+ZQJ+vx6e4YO63z5b5tOX3V1IvXWvPzHpDj9xw/p5u1+OZ4IshPj7km0Jysth5v6gf7rsq0WRPquxH7zphC/VRD3lT/bt+2dausY52yroHjutbU0W5v19XaLg/r1DrGX4iSHX+N5amxzPox+QbMM5pH2tQlkKnWk1EeMqJ19kZtbd2s823xuaPj/N8jkLu75e5uHYd5aOviuCbg+T8fyNjDY8zDHKXjrpNnHHj+/UUH5988jKkHjC3EORnzp3NnD+s8UgPr/BrmdD/zRBCfQ+QczyFyYa/PHT6HqCvzOURPh7E+MWPT1FCPn/4dT/8u2dV6zOqs65/+fbiLNf6CGW+nQPOq1ro+Uf94raZ1/vYWz0dqAz0f6RRoPtZ4no/g2N+8ZpzZllONqePxg89Hejt+Tjdrsd3zkcDXxOLjnbEeb9f1OAr0fCRjPR95sx/Im+q9zmxbN/I8H6mCcwQ9j0F75DnfVME1K7KeE+H4C1Gy47efH1VZZv2YdIZ5RvMo5O911Z6MukBG1dZ5SrflrPNUDrbBa0mo3yW6WO4uDmMX6zlTmOd1Axri/t7RJfBzoUDPX9v9brgvSva8ZD+/7OqYh/bvi1loSzK/juZXdzi/iFnMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFrOYxSxmMYtZzGJ+55l9n++j9boxMb6ZH7mgrScY6fMZCb5HvBEtEfSLnz/saZkD5dWAn/2j/eNn7UI+TvZnHOkz7jj/6fHpZK2Dn3GkdZqM2fWZrpxjWz3ObfWlun786fsPhsI2w6w2nceQKEwew6L2edAy9aeN9L0Nw6CN6iPBeHbyxuJnG8hCnzOj7+s4G9ppneEdPB7aOChxY+lzgPQ9G7VWjoPASOuMegtjawBjmLGX5tBAGKPe73DH2Gmd8f3acppg6vi9IiMgx4mOn9MtYy0XoN4KWY5OfszFx3sMOAvQD/Y9FqwJ9d2IfWdMoX6ovQbqV/VrW5fWozwoa7Lr43qUqaPd3m6ItV0e1hnlGH8hSnb8oy3PaMusH5PzYZ5NhOvK4ECmUZ6MhkFGtE5faKNzPK2P35OD5/8RgdzDLTctjwAjtVF2eE3A8/+wQMYRHiP1h+ffTp5x4Pl3Rgfn3zyMaQSMLcQ5GfOncyf12QrttM5cmNPP9C/V8TkEff8TPodogTEEuD53+ByC+nur5xAFh7E+MWPpewlCPH70vQR07LZa46brX1XUduzgmLVrYAAXno/o+kT947Wa1ln9Fs9HRgUwhhl7++uD/XwEx07rrIdjagM836DHCZ+P3OH4Od06ej4S+JpYfLzHgbMQua/H48GaUN+N2Dc9H6F+qL0G6rfD8xFaj/KgrMmuzxH0PAbt9nbDrO3ysM4Yx/gLUbLjt58fjbXM+jHZDPPsDng+Eur3ujGejAZDRrTOIGij6wWtj98NiNeSUL9LDLbcgx1GahsCnuSf15W+lyDO7x2DwRPiuVCg56/tfjdM+nsJ7OeXQ6ys8PnlIMhveID8Oppf1J+YxSxmMYtZzGIWs5jFLGYxi1nMYhazmMUsZjGLWcxiFnNBzGIWs5jFLOZIzA1v7yZmMYtZzGIWs5jFLGYxi1nMqTT7Pt9H6w1lYqQ2/GzWYNiGjPT5jH0JGtESQb/4+cOCZQ6UVwN+9o/2j5+1C/k42Z9xPNNy6HXo8elkrYOfcaR13m/Mvu8lsLfV4zyjum2cpproY5019qTzy5mx4y1jLRegToasGXfSnjqTsb4tXbZwyeSZ0y+dPnlaBmg1FhPvkb4PlqugHevVjrZ9cJ+DIVO/uq2zqddCW5UVUQ72T+t3iUrR0XIhSvahJA/dOnooyRBqahX/7bTZl3kor1oye9l0fLxqLeeBPpb6Z9XWPqoc2/v2qR8XnHqLJk+de+n0ZcuXLFiKm3SyuqDduEhVQKqxfqZvBbNs70tT/j9H5oK6xnMIAA==", "debug_symbols": "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fub2+Jnb42duj5+5P37m/viZ++Nn7o+fuT9+5v74mfvjZ+6Pn7k/fub++JnH42cej595PH7m8fiZx+NnHo+feTx+5vH4mcfjZx6Pn3k+fub5+Jnn42eej595Pn7m+fiZ5+Nnno+feT5+5vn4mdfjZ16Pn3k9fub1+Jk/fg93H7+Hu4/fw93H7+Hu4/dw9/F7uPv4Pdx9/B7uPn4Pdx+/h7uP38Pdx+/h7uP3cPfxe7j7+D3cffweTl6PX8S9fUSef+Q8/4g+/4g9/4g//0g8/0g+/0g9/8jzpy/Pn748f/ry/OnL86cvz5++PH/68vzpy/OnL8+fvjx/+uf50z/Pn/55/vTP86d/nj/98/zpn+dP/zx/+uf50z/Pn74+f/r6/Onr86evz5++Pn/6+vzp6/Onr8+fvj5/+vr86dvzp2/Pn749f/r2/Onb86dvz5++PX/69vzp2/Onb8+fvj9/+v786fvzp+/Pn74/f/r+/On786fvz5++P3/6/vzpx/OnH8+ffjx/+vH86cfzpx/Pn348f/rx/OnH86cfz59+Pn/6+fzp5/Onn8+ffj5/+vn86efzp5/Pn34+f/r5/OnX86dfz59+PX/69fzp1/OnX8+ffj1/+vX86dfzp1/Pn/59/vTv86d/nz/9+/zp3+dP/z5/+vf507/Pn/59/vSfv+uT5+/65Pm7Pnn+rk+ev+t7+6fe5x/x5x+J5x/J5x+p5x95/vSfv+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/65Pm7Pnn+rk+ev+uT5+/6zvN3fef5u77z/F3fef6u7zx/13eev+s7z9/1nefv+s7zd33n+bu+8/xd33n+ru88f9d3nr/rO8/f9Z3n7/rO83d95/m7vvP8Xd95/q7vPH/Xd37f/8mOf62EX/707R3Yr0tU5F/3jv/ZX9/QHxe+kb/+3z+rj/74nPctKsfk325R+cbOlbdvev4w31T/MN/U/jDf1P8w3zT+MN80/zDftP4w3/T+Ub7p7/s/gLPqm/5h/hlJ/zD/jKR/mH9G+n3/535WfdM/zD8j6R/mn5G09Z+R6sf/5aybx377TX+cBvvnmB83uPAN7EXfQOgbHPoGSt/A6Bs4fYOgb5D0DehKNrqSna5kpyvZ6Up2upKdrmSnK9npSna6kp2uZKcrOehKDrqSg67koCs56EoOupKDruSgKznoSg66kpOu5KQrOelKTrqSk67kpCs56UpOupKTruSkK7noSi66kouu5KIruehKLrqSi67koiu56EouupIvXcmXruRLV/KlK/nSlXzpSr50JV+6ki9dyReuZH296BsIfYND30DpGxh9A6dvEPQNkr5B0TegK1noSha6koWuZKErWehKFrqSha5koStZ6EoWupIPXcmHruRDV/KhK/nQlXzoSj50JR+6kg9dyYeuZKUrWelKVrqSla5kpStZ6UpWupKVrmTaeCltvJQ2XkobL6WNl9LGS2njpbTxUtp4KW28lDZeShsvpY2X0sZLaeOltPFS2ngpbbyUNl5KGy+ljZfSxktp46W08VLaeCltvJQ2XkobL6WNl9LGS2njpbTxUtp4KW28lDZeShsvpY2X0sZLaeOltPFS2ngpbbyUNl5KGy+ljZfSxktp46W08VLaeCltvJQ2XkobL6WNl9LGS2njpbTxUtp4KW28lDZeShsvpY2X0sbLaONltPEy2ngZbbzsZfQNnL5B0DdI+gZF34CuZNp4GW28jDZeRhsvo42X0cbLaONltPEy2ngZbbyMNl5GGy+jjZfRxsto42W08TLaeBltvIw2XkYbL6ONl9HGy2jjZbTxMtp4GW28jDZeRhsvo42X0cbLaONltPEy2ngZbbyMNl5GGy+jjZfRxsto42W08TLaeBltvIw2XkYbL6ONl9HGy2jjZbTxMtp4GW28jDZeRhsvo42X0cbLaONltPEy2ngZbbyMNl5GGy+jjZfRxsto42W08TLaeBltvIw2XkYbL6ONl9HGy2jjZbTxMtp4GW28jDZeRhsvo42X0cbLaONltPEy2ngZbbyMNl5GGy+jjZfRxsto42W08TLaeBltvJw2Xk4bL6eNl9PGy19G38DpGwR9g6RvUPQN6EqmjZfTxstp4+W08XLaeDltvJw2Xk4bL6eNl9PGy2nj5bTxctp4OW28nDZeThsvp42X08bLaePltPFy2ng5bbycNl5OGy+njZfTxstp4+W08XLaeDltvJw2Xk4bL6eNl9PGy2nj5bTxctp4OW28nDZeThsvp42X08bLaePltPFy2ng5bbycNl5OGy+njZfTxstp4+W08XLaeDltvJw2Xk4bL6eNl9PGy2nj5bTxctp4OW28nDZeThsvp42X08bLaePltPFy2ng5bbycNl5OGy+njZfTxstp4+W08XLaeDltvJw2Xk4bL6eNl9PGy2nj5bTxctp4OW28nDZeThsvp42X08YraOMVtPEK2ngFbbziZfQNnL5B0DdI+gZF34CuZNp4BW28gjZeQRuvoI1X0MYraOMVtPEK2ngFbbyCNl5BG6+gjVfQxito4xW08QraeAVtvII2XkEbr6CNV9DGK2jjFbTxCtp4BW28gjZeQRuvoI1X0MYraOMVtPEK2ngFbbyCNl5BG6+gjVfQxito4xW08QraeAVtvII2XkEbr6CNV9DGK2jjFbTxCtp4BW28gjZeQRuvoI1X0MYraOMVtPEK2ngFbbyCNl5BG6+gjVfQxito4xW08QraeAVtvII2XkEbr6CNV9DGK2jjFbTxCtp4BW28gjZeQRuvoI1X0MYraOMVtPEK2ngFbbyCNl5BG6+gjVfQxito4xW08QraeAVtvJI2Xkkbr6SNV9LGK19G38DpGwR9g6RvUPQN6EqmjVfSxitp45W08UraeCVtvJI2Xkkbr6SNV9LGK2njlbTxStp4JW28kjZeSRuvpI1X0sYraeOVtPFK2nglbbySNl5JG6+kjVfSxitp45W08UraeCVtvJI2Xkkbr6SNV9LGK2njlbTxStp4JW28kjZeSRuvpI1X0sYraeOVtPFK2nglbbySNl5JG6+kjVfSxitp45W08UraeCVtvJI2Xkkbr6SNV9LGK2njlbTxStp4JW28kjZeSRuvpI1X0sYraeOVtPFK2nglbbySNl5JG6+kjVfSxitp45W08UraeCVtvJI2Xkkbr6SNV9LGK2njlbTxStp4JW28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9nnd2+d175jXvWNe94553Tvmde+Y171jXveOed075nXvmNe9Y173znndO+d175zXvXNe98553Tvnde+c171zXvfOed0753Xvmte9a173rnndu+Z175rXvWte96553bvmde+a171rXve+87r3nde977zufed17zuve9953fvO6953Xve+87r3Hde9z2tc9z6vcd37vMZ17/Ma173Pa1z3Pq9x3fu8xnXv8xrXvc9rXPc+r3ndW+Z1b5nXvWVe95Z53VvmdW+Z171lXveWed1b5nXveVnLMy9reeZlLc+8rOWZl7U887KWZ17W8szLWp55WcszL2t55mUtz7ys5ZmXtTzzspZnXtbyzMtannlZyzMva3nmZS3PvKzlmZe1PPOylmde1vLMy1qeeVnLMy9reeZlLc+8rOWZl7U887KWZ17W8szLWp55WcszL2t55mUtz7ys5ZmXtTzzspZnXtbyzMtannlZyzMva3nmZS3PvKzlmZe1PPOylmde1vLMy1qeeVnLMy9reeZlLc+8rOWZl7U887KWZ17W8szLWp55WcszL2t55mUtz7ys5ZmXtTzzspZnXtbyzMtannlZyzMva3nmZS3PvKzlmZe1PPOylmde1vLMy1qeeVnLMy9reeZlLc+8rOWZl7U887KWZ17W8szLWp55WUudl7XUeVlLnZe11HlZS32N6946L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova6nzspY6L2up87KWOi9rqfOyljova2nzspY2L2tp87KWNi9raa9x3dvmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLW1e1tLmZS1tXtbS5mUtbV7W0uZlLX1e1tLnZS19XtbS52Ut/TWue/u8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+ryspc/LWvq8rKXPy1r6vKylz8ta+rysZczLWsa8rGXMy1rGvKxlvMZ175iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1jHlZy5iXtYx5WcuYl7WMeVnLmJe1zHlZy5yXtcx5Wcucl7XM17junfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWOS9rmfOyljkva5nzspY5L2uZ87KWNS9rWfOyljUva1nzspb1Gte9a17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtay5mUta17WsuZlLWte1rLmZS1rXtbyzsta3nlZyzsva3nnZS3va1z3vvOylnde1vLOy1reeVnLOy9reedlLe+8rOWdl7W887KWd17W8s7LWt55Wcs7L2t552Ut77ys5Z2XtbzzspZ3Xtbyzsta3nlZyzsv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MHrsYPTYweixg9FjB6PHDkaPHYweOxg9djB67GD02MHosYPRYwejxw5Gjx2MHjsYPXYweuxg9NjB6LGD0WMHo8cORo8djB47GD12MHrsYPTYweixg9FjB6PHDkaPHYweOxg9djB67GD02MHosYPRYwejxw5Gjx2MHjsYPXYweuxg9NjB6LGD0WMHo8cORo8djB47GD12MHrsYPTYweixg9FjB6PHDkaPHYweOxg9djB67GD02MHssYPZYwezxw5mjx3Ml/XcxntuEz23yZ7bVM9terpAjx3MHjuYPXYwe+xg9tjB7LGD2WMHs8cOZo8dzB47mD12MHvsYPbYweyxg9ljB7PHDmaPHcweO5g9djB77GD22MHssYPZYwezxw5mjx3MHjuYPXYwe+xg9tjB7LGD2WMHs8cOZo8dzB47mD12MHvsYPbYweyxg9ljB7PHDmaPHcweO5g9djB77GD22MHssYPZYwezxw5mjx3MHjuYPXYwe+xg9tjB7LGD2WMHs8cOZo8dzB47mD12MHvsYPbYweyxg9ljB7PHDmaPHcweO5g9djB77GD22MHssYPZYwezxw5mjx3MHjuYPXYwe+xg9tjB7LGD2WMHs8cOZo8dzB47mD12MHvsYPbYweyxg9ljB7PHDmaPHcweO1g9drB67GD12MHqsYP1sp7beM9touc22XOb6rlNTxfosYPVYwerxw5Wjx2sHjtYPXaweuxg9djB6rGD1WMHq8cOVo8drB47WD12sHrsYPXYweqxg9VjB6vHDlaPHaweO1g9drB67GD12MHqsYPVYwerxw5Wjx2sHjtYPXaweuxg9djB6rGD1WMHq8cOVo8drB47WD12sHrsYPXYweqxg9VjB6vHDlaPHaweO1g9drB67GD12MHqsYPVYwerxw5Wjx2sHjtYPXaweuxg9djB6rGD1WMHq8cOVo8drB47WD12sHrsYPXYweqxg9VjB6vHDlaPHaweO1g9drB67GD12MHqsYPVYwerxw5Wjx2sHjtYPXaweuxg9djB6rGD1WMHq8cOVo8drB47WD12sHrsYPXYweqxg9VjB2+PHbw9dvD22MHbYwfvy3pu4z23iZ7bZM9tquc2PV2gxw7eHjt4e+zg7bGDt8cO3h47eHvs4O2xg7fHDt4eO3h77ODtsYO3xw7eHjt4e+zg7bGDt8cO3h47eHvs4O2x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X13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13YX13WX90X66/eri/w9Q98fYWvb/D1Hb5+wNdP+PoFXx+uX4HrV+D6Fbh+Ba5fgetX4PoVuH4Frl+B61fg+j1w/R64fg9cvweu3wPX74Hr98D1e+D6PXD9Hrh+Fa5fhetX4fpVuH4Vrl+F61fh+lW4fhWuX4Xr1+D6Nbh+Da5fg+vX4Po1uH4Nrl+D69fg+jW4fh2uX4fr1+H6dbh+Ha5fh+vX4fp1uH4drl+H6zfg+g24fgOu34DrN+D6Dbh+A67fgOs34PoNuH4Trt+E6zfh+k24fhOu34TrN+H6Tbh+E67fhOu34PotuH4Lrt+C67fg+i24fguu34Lrt+D6Lbh+L1y/F67fC9fvhev3wvV74fq9cP1euH4vXL+wvxLYXwnsrwT2VwL7K3kZfH2Hrx/w9RO+fsHXh+sX9lcC+yuB/ZXA/kpgfyWwvxLYXwnsrwT2VwL7K4H9lcD+SmB/JbC/EthfCeyvBPZXAvsrgf2VwP5KYH8lsL8S2F8J7K8E9lcC+yuB/ZXA/kpgfyWwvxLYXwnsrwT2VwL7K4H9lcD+SmB/JbC/EthfCeyvBPZXAvsrgf2VwP5KYH8lsL8S2F8J7K8E9lcC+yuB/ZXA/kpgfyWwvxLYXwnsrwT2VwL7K4H9lcD+SmB/JbC/EthfCeyvBPZXAvsrgf2VwP5KYH8lsL8S2F8J7K8E9lcC+yuB/ZXA/kpgfyWwvxLYXwnsrwT2VwL7K4H9lcD+SmB/JbC/EthfCeyvBPZXAvurA/urA/urA/urA/ur8zL4+g5fP+DrJ3z9gq8P1y/srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7srw7s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0fdO07N3mp690/TsnaZn7zTVvdNU905T3TtNde80xeI0DUffO0117zTVqdO0NN+PHvHh0cf+e9PPjz7235t+enQb++9NPz/62H9v+vnRp07TLxx96jSt0h9Hv+ofHn3qNP3C0cf29c+PPravf370sX3906P72L7++dHH9vXPjz62r39+9Kl9/V755Y/t5fXv/3Hcql/+OF9+fj30q379olOnwE//olP/E9hP/6JT//PaX/6i70efOtev23vDqI+PPnWuf+HoU+f650ePqXP9C0efOte/cPSpc/0LRx871z8/+thJ/fnRx87ez48+dpp+fvS90zT2TtPYO01z7zTNvdM0907T3DtNsdUEDUffO01z7zTNvdM0907T3DtNa+80rb3TtPZO09o7TbFFIQ1H3ztNa+80rb3TtPZO09o7Te/eaXqHTlOT148rv/2X8uHRh07Trxx96DT9ytGHTtOvHH3oNP3K0YdO068cfeg0/crRh07Trxx96DT9/Og6dT/QV46+dprq1P1AXzn62mmqr7XTVKfuB/rK0ddOU526H+grR187TXXqfqAvHH3qfqCvHH3vNJ26H+grR987TafuB/rK0fdO06n7gb5y9L3TdOp+oK8cfe80nbof6CtH3ztNp+4H+srR907TqfuBvnL0vdN06n6grxx97zSduh/oK0ffO02n7gf6ytH3TtOp+4G+cvS903TqfqCvHH3vNJ26H+grR987TafuB/rK0fdO06n7gb5y9L3TdOp+oK8cfe80nbof6CtH3ztNbe80nbqV6StH3ztNp25l+sLRp25l+srR907TqVuZvnL0vdN06p6lrxx97zSdugvpK0ffO02n7kL6ytH3TtOpu5C+cvS903TqLqSvHH3vNJ26C+krR987TafuQvrK0fdO06m7kL5y9L3TdOoupK8cfe80nboL6StH3ztNp+5C+srR907TqbuQvnL0vdN06i6krxx97zSdugvpK0ffO02n7kL6ytH3TtOpu5C+cvS903TqLqSvHH3vNJ26C+krR987TafuQvrK0fdO0727kHTvLiTduwtJ9+5C0r27kHTvLiTduwtJ9+5Csr27kGzvLiTbuwvJ9u5CstfaaWp7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku3dhWR7dyHZ3l1ItncXku/dheR7dyH53l1IvncXkr/WTlPfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8r27kHzvLiTfuwvJ9+5C8rm7kMzejx7x0dHn7kL6/Ohjp+nnR586TY/oj6MfsQ+PPnWafuHoU0fSF44+dSR94ehTR9IXjj51JH3h6FNH0udH/32rbR6dRtN+XFfTXx+eRkedxkadxkedJkadJkedpvpOUxI/TlNHPzzNnXSa37dy5aefRkadprMXh7+fRj4+jY46jY06jY86TYw6TY46TY06zZ10mvsadRoZdZpRvfiO6sV3VC++o3rxHdWL76hefEf14jupF8drUi+O16ReHK9JvThek3pxvCb14nhN6sXxmtSL4zWpF8drUi+O16heLKN6sYzqxTKqF8uoXiyjerGM6sUyqhdLYy8uzffTfPgvqENq1GnupNOc16jTyKjTnFGnaezFVT/+vaZe9Q9PY6NOk6NOU6NOcyedRl+jTiOjTnNGnaax39wrv/yxvbz+/T+OW/XLH+fLz6/neNWvZ7fFZ/fFZ48JZ38/TeNUuG7v9VQfn6ZGneZOOo29Rp1GRp3mjDqNjjqNjTqNjzpNjDrNqF5so3qxjerFPqoX+6he7KN6sY/qxT6qF/uoXuyjerGP6sU+qhf7qF4co3pxjOrFMaoXx6heHKN6cYzqxTGqF8eoXhyjenGM6sU5qhdnXy/+PDMejSm3r5xGR53GRp3GR50mRp0mR52mRp3mTjpNY8rtK6cZ1YtrVC+uUb24RvXiGtWLa1QvrlG9uEb14hrVi++oXnxH9eI7qhffUb34jurFd1QvvqN68R3Vi++oXnwn9eJ8TerF+ZrUi/M1qRfna1IvztekXpyvSb04X5N6cb4m9eJ8TerF+RrVi2VUL5ZRvVhG9WIZ1YtlVC+WUb1YRvViGdWLZVQvllG9+IzqxWdULz6jevEZ1YvPqF58RvXiM6oXn1G9+IzqxWdUL9ZRvVhH9WId1Yt1VC/WUb1YR/ViHdWLdVQv1lG9WEf1YhvVi21UL7ZRvdhG9WIb1YttVC+2Ub3YRvViG9WLbVQv9lG92Ef1Yh/Vi31UL/ZRvdhH9WIf1Yt9VC/2Ub3YR/XiGNWLY1QvjlG9OEb14hjVi2NUL45RvThG9eIY1YtjVC/OUb14VO4uR+XuclTuLkfl7nJU7i5H5e5yVO4uR+XuclTuLkfl7nJU7i5H5e5yVO4uR+XuclTuLkfl7nJU7i5H5e5yVO4uR+XuclTuLkfl7nJU7i5H5e5yVO4uR+XuclTuLkfl7nJU7q5G5e5qVO6uRuXualTurl6TenGNyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3dWo3F2Nyt3VqNxdjcrd1ajcXY3K3d1Rubs7Knd3R+Xu7qjc3X1N6sV3VO7ujsrd3VG5uzsqd3dH5e7uqNzdHZW7u6Nyd3dU7u6Oyt3dUbm7Oyp3d0fl7u6o3N0dlbu7o3J3d1Tu7o7K3d1Rubs7Knd3R+Xu7qjc3R2Vu7ujcnd3VO7ujsrd3VG5uzsqd3dH5e7uqNzdHZW7u6Nyd3dU7u6Oyt3d1tyd2ftpIj46TWvu7vPTyKjTNPbiI/rjNEfsw9PoqNP4qNPEqNPkqNPUqNPcSaf5OM11In/5nL5+/ZiI/Po5/ebn7Juf829+Lr75ufze5z7OQMSJXz4XUR9/zr75Of/m5+Kbn8tvfu7DX734j9+n1K+/ZXnFv/xfb//d//u3//3v//Y//te/+6e3T/zr//B//MN/+ue//8d/+OW//ef/77/97//J29/+/w==" }, { "name": "claim_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 43, "start": 42 }], "inputs": [{ "end": 41, "start": 0 }], "leaf_index": [{ "end": 45, "start": 44 }], "secret": [{ "end": 44, "start": 43 }], "to": [{ "end": 42, "start": 41 }] }, "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": "public_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": "start_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "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": { "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": "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": "nullifier_non_existent_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": "contract_storage_update_requests", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest" } } }, { "name": "contract_storage_reads", "type": { "kind": "array", "length": 16, "type": { "fields": [{ "name": "storage_slot", "type": { "kind": "field" } }, { "name": "current_value", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead" } } }, { "name": "public_call_stack_hashes", "type": { "kind": "array", "length": 16, "type": { "kind": "field" } } }, { "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": "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": "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": "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": "prover_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "revert_code", "type": { "kind": "integer", "sign": "unsigned", "width": 8 } }, { "name": "start_gas_left", "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": "end_gas_left", "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": "transaction_fee", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs" }, "visibility": "public" }, "return_witnesses": [45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398] }, "bytecode": "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", "debug_symbols": "7b3tjiRNkp13L/ObEMLty915K4IgrMilsACxS3CXAgRi7125VGd1DybeiYzpMqvHtvIXh2RW2knP18y8o85z6n/+6T///f/1P/7v//Mf/vG//NM//+k//u//80//9Z/+09/9yz/80z8+/m//80/H/yY6/9f/8z//t7/7x3/7f/nnf/m7//4vf/qPx3/409//439+/J//+h/+9F/+4b/+/Z/+o9j81//jP/yvn1i3f2Lf/Qk7bv/EuP0Tcvsn9PZP2O2f8Nd/4j/8xevGMeLHS8eh45dX2/P9I/n9Z/L7r+T337nv70fy+4/k95fk99fk97fk90/uX0/uX0/uX0/u3/it//51hPx46eN/6ser936+veS+vf/e2++Ptxexk7eP3LefuW+/ct9+p779PHLffuS+veS+vea+veW+fW7Xzt/qWpnrxytl7o/XPsflnInvvRLf+/ea9TB/HvkxT+bwOnLffuS+veS+vea+veW+vee+feS+/cx9+5X79rldu3O7dud27c7t2p3btTu3a3du1+7crt25Xbtzu3andq0eR+7bj9y3l9y319y3t9y399y3z7sYPwomvvfKPZbcfh25/Tpy+3Xk9uvI7deR268jt19H5L79zH373K4duV0ruV0ruV0ruV0ruV0ruV0ruV0ruV0ruV0ruV0ruV2ruV2ruV2ruV2ruV2ruV2rnnfB1MSLseb2q+b2q+b2q+X2q+X2q+X2q+X2q+X2q+VuWcvdspbbtZbbtZbbtZ7btZ7btZ7btZ7btZ7btZ7btZ7btZ7btZ7btZ7btZHbtZHbtZHbtZHbtZHbtZHbtZHbtZHbtZHbtZHbtTO3a2du187crp25Xft7NihZsZ//Llx7/Pr2J1p02VOL7n2ixUFaVp0Ws+f7Pm61Z1o2R8vvuaA+WcsAaRGQFgVpKZwvrh+zzjVOtDhIS4C0TJCWBdKyOVr2AdIyQFoEpEVBWkBzd4Pm7gbN3Q2auxs0dzdn7trBmbt2cOauHZy5awdn7trBmbt2cOauHZy5awdn7trBmbt2gObuAM3dAZq7AzR3B2juDtDcHaC5O0Bzd4Dm7gDN3QGauwKauwKauwKauwKauwKauwKauwKauwKauwKauwKauwqauwqauwqauwqauwqauwqauwqauwqauwqauwqauwaauwaauwaauwaauwaauwaauwaauwaauwaauwaauw6auw6auw6auw6auw6auw6auw6auw6auw6auw6auwGauwGauwGauwGauwGauwGauwGauwGauwGauwGauxM0dydo7k7Q3J2guTtBc3eC5u4Ezd0JmrsTNHcnaO4u0NxdoLm7QHN3geYuiFczEK9mIF7NQLyagXg1A/FqBuLVDMSrGYhXMxCvZiBezUC8moF4NQPxagbi1QzEqzmIV3MQr+YgXs1BvJofnLnrIF7NQbyag3g1B/FqDuLVHMSrOYhXcxCv5iBezUG8moN4NQfxag7i1RzEqzmIV3MQr+YgXs1BvJqDeDUH8WoO4tUcxKs5iFdzEK/mIF7NQbyag3g1B/FqDuLVHMSrOYhXcxCv5iBezUG8moN4NQfxag7i1RzEqzmIV3MQr+YgXs1BvJqDeDUH8WoO4tUcxKs5iFdzEK/mIF7NQbyag3g1B/FqDuLVHMSrOYhXcxCv5iBezUG8moN4NQfxag7i1RzEqzmIV3MQr+YgXs1BvJqDeDUH8WoO4tUcxKs5iFdzEK/mIF7NQbyag3g1B/FqDuLVHMSrOYhXcxCv5iBezUG8moN4NQfxag7i1RzEqzmIV3MQr+YgXs1BvJqDeDUH8WoO4tUcxKs5iFcLEK8WIF4tQLxagHi1ODhzN0C8WoB4tQDxagHi1QLEqwWIVwsQrxYgXi1AvFqAeLUA8WoB4tUCxKsFiFcLEK8WIF4tQLxagHi1APFqAeLVAsSrBYhXCxCvFiBeLUC8WoB4tQDxagHi1QLEqwWIVwsQrxYgXi1AvFqAeLUA8WoB4tUCxKsFiFcLEK8WIF4tQLxagHi1APFqAeLVAsSrBYhXCxCvFiBeLUC8WlTyao9fbj61PH63eKLFQVoCpGWCtCyQls3RUsmrXWoZIC0C0qIgLaC5G6C5G6C5G6C5G6C5G6C5O0Fzd4Lm7gTN3QmauxM0dydo7k7Q3J2guTtBc3eC5u4Czd0FmrsLNHcXaO4u0NxdoLm7QHN3gebuAs3dBZq7GzR3N2jubtDc3aC5u0Fzd4Pm7gbN3Q2auxs0dzdn7s6DM3fnwZm78+DM3Xlw5u48OHN3Hpy5Ow/O3J0HZ+7OgzN35wGauwM0dwdo7g7Q3B2guTtAc3eA5u4Azd0BmrsDNHcHaO4KaO4KaO4KaO4KaO4KaO4KaO4KaO4KaO4KaO4KaO4qaO4qaO4qaO4qaO4qaO4qaO4qaO4qaO4qaO4qaO4aaO4aaO4aaO4aaO4aaO4aaO4aaO4aaO4aaO4aaO46aO46aO46aO46aO6CeLUJ4tUmiFebIF5tgni1CeLVJohXmyBebYJ4tQni1SaIV5sgXm2CeLUJ4tUmiFebIF5tgni1CeLVJohXmyBebYJ4tQni1SaIV5sgXm2CeLUJ4tUmiFebIF5tgni1CeLVJohXmyBebYJ4tQni1SaIV5sgXm2CeLUJ4tUmiFebIF5tgni1CeLVJohXmyBebYJ4tQni1RaIV1sgXm2BeLUF4tXWwZm7C8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaAvFqC8SrLRCvtkC82gLxagvEqy0Qr7ZAvNoC8WoLxKstEK+2QLzaBvFqG8SrbRCvtkG82j44c3eDeLUN4tU2iFfbIF5tg3i1DeLVNohX2yBebYN4tQ3i1TaIV9sgXm2DeLUN4tU2iFfbIF5tg3i1DeLVdimv9vFijXmcaDGQFgdpCZCWwrk7x3xqmWOdaFkgLZujpZJXu9QyQFoK58u040OLn/RRIX9kMvTHix//0060rEItPj60rHGiZXO0FHI211oUpMVAWhykJUBaJkgLaL4YaL4UcjbXWgZIC2juFnI2pvqxp+04/vqLY6/148XzcPmp41hP5dZWubdVHgTlP7RUboAdTy2qZ1oWSMvmaIkDpGWAtAhIi4K0GEiLg7QESAto7gZo7gZo7k7Q3J2guTtBc3eC5u4Ezd0JmrsTNHcnaO5O0NydoLm7QHN3gebuAs3dBZq7CzR3F2juLtDcXaC5u0Bzd4Hm7gbN3Q2adRs06zZo1m3QrNugWVdI2ZjJ8fF8d/32k+lCJuezle+mysdRCbZcGE4eYpQkxkhinCQmSGImSUyh3W+N5yLQJXomZoPEVAIu12IGSYyQxChJjJHEOElMkMRMkphKw3X4h5hxKmaDxFSiLtdiBkmMkMQoSYyRxDhJTJDETJIY0gQW0gRW0gRW0gRW0gRW0gRW0gRW0gRW0gRW0gRW0gRW0gQ20gQ20gQ20gQ20gQ20gQ20gQ20gQ20gQ20gQ20gR20gR20gR20gSu/NtNSz+Y+BVxJsZIYpwkJkhiJknMIomp/E3cejJ3utVPxFT+CadrMUoSYyQxThITJDGTJGaRxBTOmb0/qPTHsP3rL37Bh1T5B44+W/roK10I0p9iCnfBdvtopXUqxkhinCQmSGImScwiidkgMZV/RulazCCJEZIY0gRepAm8SBN4kSbwIk3gRZrAizSBN2kCb9IE3qQJvEkTeJMm8CZN4E2awJs0gTdpAm/QBB4HaAKPAzSBxwGawOMATeDH725JYkATeBygCTwKGTR7zJHnY7RHF5+JWSQxGySmkEF7QcwgiRGSGCWJMZIYJ4kJkhjSBB6kCTxIE1hIE1hIE1hIE1hIE1hIE1hIE1hIE1hIE1hIE1hIE1hJE1hJE1hJE1hJE1hJE1hJE1hJE1hJE1hJE1hJE9hIE9hIE9hIE9hIE9hIE9hIE9hIE9hIE9hIE9hIE9hJE9hJE9hJE9hJE9hJE9hJE9hJE9hJE9hJE9hJEzhIEzhIEzhIEzhIEzhIEzhIEzhIEzhIEzhIEzhIE3iSJvAkTeBJmsCTNIEnaQJP0gSepAk8SRN4kibwJE3gRZrAizSBF2kCL9IEXqQJvEgTeJEm8CJN4EWawIs0gTdpAm/SBN6kCbxJE3iTJvAmTeBNmsCbNIE3aQJv0ASWAzSB5QBNYDlAE1gO0ASWAzSB5QBNYDlAE1hITJyQmDghMXFCYuKExMQJiYkTEhMnJCZOSEyckJg4ITFxQmLihMTECYmJExITJyQmTkhMnJCYOCExcUJi4oTExAmJiRMSEyckJk5ITJyQmDghMXFCYuKExMQJiYkTEhMnJCZOSEyckJg4ITFxQmLihMTECYmJExITJyQmTkhMnJCYOCExcUJi4oTExAmJiRMSEyckJk5ITJyQmDghMXFCYuKExMQJiYkTEhMnJCZOSEyckJg4ITFxQmLihMTECYmJExITJyQmTkhMnJCYOCExcUJi4oTExAmJiRMSEyckJk5ITJyQmDghMXFCYuKExMQJiYkTEhMnJCZOSEyckJg4ITFxQmLihMTECYmJExITJyQmTkhMnJCYOCExcUJi4oTExCmJiVMSE6ckJk5JTJweoAmsJCZOSUyckpg4JTFxSmLilMTEKYmJUxITpyQmTklMnJKYOCUxcUpi4pTExCmJiVMSE6ckJk5JTJySmDglMXFKYuKUxMQpiYlTEhOnJCZOSUyckpg4JTFxSmLilMTEKYmJUxITpyQmTklMnJKYOCUxcUpi4pTExCmJiVMSE6ckJk5JTJySmDglMXFKYuKUxMQpiYlTEhOnJCZOSUyckpg4JTFxSmLilMTEKYmJUxITpyQmTklMnJKYOCUxcUpi4pTExCmJiVMSE6ckJk5JTJySmDglMXFKYuKUxMRpKRNn9iEm4kxMkMRMkpjCCSxDn2Jk2JmYDRJTiaFdixGSGCWJMZIYB4n5TYrH93N0SOjPV6/j4/0l+f01+f0t+f09+f1vLLXnj8z7P7Lu/8i++yN2B754/si4/yNy/0f0/o/Y/R/x+z8S939k3v+Rdf9H7n/74/63P+5/++P+tz/uf/vj/rc/7n/74/63P+5/++P+tz/uf/ty/9uX+9++3P/25f63L/e/fbn/7cv9b1/uf/ty/9uX+9++3v/29f63r/e/fb3/7ev9b1/vf/t6/9vX+9++3v/29f63b/e/fbv/7dv9b9/uf/t2/9u3+9++3f/27f63b/e/fbv/7fv9b9/vf/t+/9v3+9++3//2/f637/e/fb//7fv9b9/vf/tx/9uP+99+3P/24/63H/e//bj/7cf9bz/uf/tx/9uP+9/+vP/tz/vf/rz/7c/73/68/+3P+9/+vP/tz/vf/rz/7c/73/66/+2v+9/+uv/tr/vf/rr/7a/73/66/+2v+9/+uv/tr/vf/r7/7e/73/6+/+3v+9/+vv/t7/vf/v1nfXb/WZ/df9Zn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1+f1nfX7/WZ/ff9bn95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1xf1nfXH/WV/cf9YX95/1zfvP+ub9Z33z/rO+ef9Z37z/rG/ef9Y37z/rm/ef9c37z/rm/Wd98/6zvnn/Wd+8/6xv3n/WN+8/65v3n/XN+8/65v1nffP+s755/1nfvP+sb95/1jfvP+ub95/1zfvP+ub9Z33z/rO+ef9Z37z/rG/ef9Y37z/rm/ef9c37z/rm7/2ZhiHH/PHSIfNnHss4jpNX78cjzx+v3o9/bHy8ep29WGStHy8WG/JTyLFOXv1Y4M9XP9bMn7/6+Unt23xS/zafNL7NJ53f5pOub/NJ93f5pL/3F0NafdLxbT6pfJtP+m3uSL/3V1pafdJvc0eyb3NHsm9zR7Jvc0ey0jvSegaG7sczjl8/6Q81nnaPeRYY2QUku4BmF7DsAp5dILILzOwCK7vATi4Q2Z0c2Z0c2Z0c2Z0c2Z0c2Z0c2Z0c2Z0c2Z0c2Z08szt5ZnfyzO7kmd3JM7uTZ3Ynz+xOntmdPLM7eWZ38sru5JXdySu7k1d2J6/sTl7ZnbyyO3lld/LK7uSV3ck7u5N3difv7E7e2Z28szt5Z3fyzu7knd3JO7uTd3Inr+PILjCyC0h2Ac0uYNkFPLtAZBeY2QVWdoHsTh7ZnTyyO3lkd/LI7uSR3ckju5NHdieP7E4e2Z08sjtZsjtZsjtZsjtZsjtZsjtZsjtZsjtZsjtZsjtZsjtZsztZsztZsztZsztZsztZsztZsztZsztZsztZszvZsjvZsjvZsjvZsjvZsjvZsjvZsjvZsjvZsjvZsjs52+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eK9vjtbI9Xivb47WyPV4r2+O1sj1eO9vjtbM9Xjvb47WzPV77sOwCnl0gsgvM7AIru0B2J2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drbHa2d7vHa2x2tne7x2tsdrZ3u8drLHS45kj9ejwMguINkFNLuAZRfw7AKRXWBmF1jZBbI7eWR38sju5JHdySO7k0d2J4/sTh7ZnTyyO3lkd/LI7mTJ7mTJ7mTJ7mTJ7mTJ7mTJ7mTJ7mTJ7mTJ7mTJ7mTN7mTN7mTN7mTN7mTN7mTN7mTN7mTN7mTN7mTN7mTL7mTL7mTL7mTL7mTL7mTL7mTL7mTL7mTL7mTL7mTP7mTP7mTP7mTP7mTP7mTP7mTP7mTP7mTP7mTP7uTI7uTI7uTI7uTI7uTI7uTI7uTI7uTI7uTI7uTI7uSZ3ckzu5NndifP7E6e2Z08szt5ZnfyzO7kmd3JM7uTV3Ynr+xOXtmdvLI7eWV38sru5JXdySu7k1d2J6/sTt7ZnbyzO3lnd/LO7uSd3ck7u5N3difv7E7e2Z2c7fEa2R6vke3xGtker5Ht8RqHZRfw7AKRXWBmF1jZBbI7OdvjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eI9vjNbI9XiPb4zWyPV4j2+M1sj1eku3xkmyPl2R7vCTb4yWHZRfw7AKRXWBmF1jZBbI7OdvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL8n2eEm2x0uyPV6S7fGSbI+XZHu8JNvjJdkeL832eGm2x0uzPV6a7fHSw7ILeHaByC4wswus7ALZnZzt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dme7w02+Ol2R4vzfZ4abbHS7M9Xprt8dJsj5dle7ws2+Nl2R4vy/Z42WHZBTy7QGQXmNkFVnaB7E7O9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsj1elu3xsmyPl2V7vCzb42XZHi/L9nhZtsfLsz1enu3x8myPl2d7vPyw7AKeXSCyC8zsAiu7QHYnZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvj5dkeL8/2eHm2x8uzPV6e7fHybI+XZ3u8PNvjFdker8j2eEW2xyuyPV5xWHYBzy4Q2QVmdoGVXSC7k7M9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8Ypsj1dke7wi2+MV2R6vyPZ4RbbHK7I9XpHt8ZrZHq+Z7fGa2R6vme3xmodlF/DsApFdYGYXWNkFsjs52+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4z2+M1sz1eM9vjNbM9XjPb4zWzPV4r2+O1sj1eK9vjtbI9Xuuw7AKeXSCyC8zsAiu7QHYnZ3u8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZXu8VrbHa2V7vFa2x2tle7xWtsdrZ3u8drbHa2d7vHa2x2sfll3AswtEdoGZXWBlF8ju5GyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XzvZ47WyP1872eO1sj9fO9njtbI/XTvZ46ZHs8XoUGNkFJLuAZhew7AKeXSCyC8zsAiu7QHYnj+xOHtmdPLI7eWR38sju5JHdySO7k0d2J4/sTh7ZnSzZnSzZnSzZnSzZnSzZnSzZnSzZnSzZnSzZnSzZnazZnazZnazZnazZnazZnazZnazZnazZnazZnazZnWzZnWzZnWzZnWzZnWzZnWzZnWzZnWzZnWzZnWzZnezZnezZnezZnezZnezZnezZnezZnezZnezZnezZnRzZnRzZnRzZnRzZnRzZnRzZnRzZnRzZnRzZnRzZnTyzO3lmd/LM7uSZ3ckzu5NndifP7E6e2Z08szt5Znfyyu7kld3JK7uTV3Ynr+xOXtmdvLI7eWV38sru5JXdyTu7k3d2J+/sTt7ZnbyzO3lnd/LO7uSd3ck7u5OzPV4j2+M1sj1eI9vjNbI9XuOw7AKeXSCyC8zsAiu7QHYnZ3u8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2tke7xGtsdrZHu8RrbHa2R7vEa2x2uce7ym6Y+fm3NdFDGxH6818V9euz5K7PQS5z6vzy0x8ktIfgnNL2H5JTy/ROSXmPkl8rt75nf3yu/uld/dK7+7V353r/zuXvndvfK7e+V398rv7pXf3Tu/u3d+d+/87t753b3zu3vnd/fO7+6d3907v7t3enfLceSXGPklJL+E5pew/BKeXyLyS8z8Eiu/RH53j/zuHvndPfK7e+R398jv7pHf3SO/u0d+d4/87h753S353S353S353S353S353S353S353S353S353S353a353a353a353a353a353a353a353a353a353a353W353W353W353W353W353W353W353W353W353W353e353e353e353e353e353e353e353e353e353e353R353R353R353R353R353R353R353R353Z3vVZN8r5rke9Uk36sm+V41yfeqSb5XTfK9apLvVZN8r5rke9Uk36sm+V41yfeqSb5XTfK9apLvVZN8r5rke9Uk36sm+V41yfeqSb5XTfK9apLvVZN8r5rke9Uk36sm+V41yfeqSb5XTfK9aprvVdN8r5rme9U036umh+WX8PwSkV9i5pdY+SXyuzvfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTfq6b5XjXN96ppvldN871qmu9V03yvmuZ71TTf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0hjFSWMUJ41RnDRGcdIYxUljFCeNUZw0RnHSGMVJYxQnjVGcNEZx0hjFSWMUJ41RnDRGcdIYxUljFCeNUZw0RnHSGMVJYxQnjVGcNEZx0hjFSWMUJ41RnDRGcdIYxUljFCeNUZw0RnHSGMVJYxQnjVGcNEZx0hjFSWMUJ41RnDRGcdIYxUljFCeNUZw0RnHSGMVJYxQnjVGcNEZx0hjFmcsoPouMiiK/P1HH8TwtGWIXRztX/Hjx3P7LO+uHIKUJMpogpwkKmqBJE7RognaxoNAPQfFngv7ytVv3h4p98drHvyo+3venBpHn5/wERLHH5xzf5HPKN/mc+k0+p32Tz+nf5HPGN/mc85t8zvVNPuc3uQ/t1PvQs8ioKCIVRbSiiFUU8YoiUVFkVhRZFUV2fpF1HBVFRkURqSiiFUWsoohXFImKIrOiyGnHL/VnkT0vivzxnn6W2OklzqHEzy0x8ktIfgnNL2H5JTy/ROSXmPkl8rt75He35He35He35He35He35He35He35He35He35He35He35ne35ne35ne35ne35ne35ne35ne35ne35ne35ne35Xe35Xe35Xe35Xe35Xe35Xe35Xe35Xe35Xe35Xe353e353e353e353e353e353e353e353e353e353d35Hd35Hd35Hd35Hd35Hd35Hd35Hd35Hd35Hd35Hf3zO/umd/d87e7exwmT7v443/bz1+qrOOjipZUsd+vEsM+qoTssyr+CZ8l9keVeaxfq/zly+Pjl1C/Cprj5KXmTxX+y7vuMytJ7PXh+Tj8p8lfHj/4/KTxbT7p/DafdH2bT7q/yyddx7f5pOPbfFL5Np9Uv80ntW/zSb/NHWl9mzvSKr8j+fMqvuT46590+HzKH77818/6VL9aq9+d1e+jtfrRWr20Vq+t1Vtr9d5afbRW33rX7ta7dnfetfvovGv30XnX7qPzrt1H5127j867dh+dd+0+Ou/afXTetfvovGv30XrXjta7drTetaP1rh2td+3vE2pfqr71rh2td+1ovWtH6107Wu9aab1rpfWulda7Vlrv2t/nRb9UfetdK613rbTetdJ610rrXautd6223rXaetdq6137+/T2l6pvvWu19a7V1rtWW+9abb1rrfWutda71lrvWmu9a38/S+FL1bfetdZ611rrXWutd6213rXeetd6613r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D+l9t2nbLKSH9L7btG0W0kN6323aNgvpIb3vNm2bhfSQ3nebts1Cekjvu03bZiE9pPfdpm2zkB7S+27TtllID+l9t2nbLKSH9L7btG0W0kN6323aNgvpIb3vNm2bhfSQ3nebts1Cekjvu03bZiE9pPfdppQspKccyIb8IYeSWfSUA9lkTzmQ7fSUA9k4TzmQLfKUA9kMTzmQaf+UA5ngTzmsqUzJyfkhh5J985TDmsqUjJqnHNZUpmTJPOWwpnJ25suzzKwps2rK7JIy2RklzzKjpozUlNGaMlZTxmvK1EyBqJkCUTMFomYKzJopMGumwKyZArNmCryQBeBxUSb2Ws8nNo+r3M9XH+ujjNeUiZoys6bMqimzS8q8wIR/SplRU0ZqymhNmZopsGqmwKqZAqtmCqyaKbBqpsCumQK7ZgrsT5gCY4g+Xz3c/vXXX3j85at1yo8X29Cfrx3jQ5LyJBlPkvMkBU/S5ElaPEmbJmkcB0/S4EnCTe9x4Kb345+ZPEm46T0O3PQeB256jwM3vcfBm96DN70Hb3oP3vQevOk9eNN78Kb34E3vwZvegze9B296C296C296C296C296C296C296C296C296C296C296K296K296K296K296K296K296K296K296K296K296G296G296G296G296G296G296G296G296G296G296O296O296O296O296O296O296O296O296O296O296B296B296B296B296B296B296B296B296B296B296T970nrzpPXnTe/Km9+RN78mb3pM3vSdvek/e9J686b1403vxpvfiTe/Fm96LN70Xb3ov3vRevOm9eNN78ab35k3vzZvePNZy8FjLwWMtB4+1HDzWcvBYy8FjLQePtRQeayk81lJ4rKXwWEs5cNNbeKyl8FhL4bGWwmMthcdaCo+1FB5rKTzWUnispfBYS+GxlsJjLYXHWgqPtRQeayk81lJ4rKXwWEvhsZbCYy2Fx1oKj7UUHmspPNZSeKyl8FhL4bGWwmMthcdaCo+1FB5rKTzWUnispfBYS+GxlsJjLYXHWgqPtRQeayk81lJ4rKXwWEvhsZbCYy2Fx1oKj7UUHmspPNZSeKyl8FhL4bGWwmMthcdaCo+1FB5rKTzWUnispfBYS+GxlsJjLYXHWgqPtRQeayk81lJ4rKXw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D+a73nwvD+Z73nzX8A8V50/w5ve8+V4fzPqeN98XDuZ73nxfOJjvefNd6+Ng9vnwXd/z5vvCwdj7YM4P5nvefF84mO95833hYL7nzXd9ZBCt/Qdb6ZvefK8P5pvefC8PZn/Tm+/1wXzTm+/1wXzTm+/1wXzTm+/Hwew/eB5TnlBKOZj4OJjzh+H7m958PyT/4cF805vv9cF805vv9cF805vv9cF805vv1cHM45vefK8P5pvefK8PxrgHM/ZHbNDYdvx6MB/ywbeNV+SD7wSvyAdv7lfkg/frK/LBW3DsD9fM2L+wF7/IH+Bd9Yp88EZ5RT74iccr8sHPJV6Rj9661/LRW/daPnrrXstHb91r+eitey0fvXV9fMgPO5Mv6K17LR+9da/lo7futXz01r2Wj9661/LRW/daPnrrXstHb91r+eitey2/99bV3ltXe29d7b11tffWLc+Y/WT5vbeu9t662nvrau+tq723rvXeutZ761rvrWu9t255xuwny++9da331rXeW9d6b13rvXW999b13lvXe29dJ/vNj48/cPz4n/tUPnjrviKf7N1+QT7ZYf2CfLIP+gX5ZLfyMX7K11M3lZM9xdfy0Qm/L8gn+3NfkE/mx16Qj9661/LRW/daPnrrXstHb91r+eh/6275kD/O5aP/rXstH/1v3Uv55HTRV+Sj/617LR/9b91r+egnzNfywVv3FfnoJ8zX8tFPmK/l99665DTGV+T33rrkZMNX5PfeuuSUwFfk99665MS9V+T33rrk9LpX5PfeuuQkuFfk99665FS1V+T33rrkhLJX5PfeuuS0r1fk99666OSs48PT8Pif81Q++ve61/LRv9e9lo/+ve6V/IVOdHpBPvr3uvFT/tyn8tG/172Wj/697rV88NZ9RT7697rX8tFb91o+eutey0dv3Wv56K17KZ+cTSWHHT+37jqVj9661/LRW/daPnrrXstHb91r+eitey0fvXWv5aO37rV89Na9lo/eupfyydlUr8jvvXXJ2VSvyO+9dcnZVK/I7711ydlUr8jvvXXJ2VSvyO+9dcnZVK/I7711ydlUr8jvvXXJ2VSvyO+9dcnZVK/I7711ydlUr8gnb91xfMgfR5zJJ2dTvSKfvHVfkE/eui/IJ2/dF+STt+4YP+XLuXzy1n1BPnnrviCfvHVfkE/eui/IR2/dS/nkbKpX5KO37rV89Na9lo/+t+7aP7fuqRWPnU11LR/9b91r+eh/617LR/9b91o++t+61/LRT5gv5bOzqa7lo58wX8tHP2G+lt9767Kzqa7l99667Gyqa/m9ty45m+oV+b23Ljmb6hX5vbcuOZvqFfm9ty45m+oV+b23Ljmb6hX5vbcuOZvqFfm9ty45m+oV+b23LjmbSobND/lup/LRv9e9lk/eui/IR/9e91o++ve61/LRv9f19SF/nstH/173Wj7697qX8snZVK/IR/9e91o+eutey0dv3Wv56K17LR+9da/lo7euxs+t66fy0Vv3Wj56617LR2/dK/kbnU31gnz01r2Wj9661/LRW/daPnrrXstHb91r+a237kZnU70gv/XW3ehsqmv56GyqF+T33rrobKoX5Pfeuuhsqhfk99666GyqF+T33rrobKoX5Pfeuuhsqhfk99666GyqF+T33rrobKoX5KO37n7KEDnkVD56617LR2/da/norXstH711L+Wjs6nk+Jg8ckqMbnQ21QvyyVv3BfnkrfuCfPLWfUE+eeu+IJ+8dV+QT966L8gnb90X5KO37rKfW1fP5LOzqa7lo/+tey0f/W/da/nof+teyydv3Rfko/+tey0f/W/da/nof+tey0f/W/dafu+ty86mupbfe+uys6mu5ffeuuhsqhfk99666GyqF+T33rrobKoX5Pfeuuhsqhfk99666GyqF+T33rrobKoX5Pfeuuhsqhfk99666GyqF+T33rrobKoX5Pfeuuhsqhfkn879afrj5+ZcF/LXh/i145fXrtOP6vrxSfdPQXKcvTrWM0U61k9Hg8gv6oOrfs7nfwJzxbn62Vr9aq1+d1Z/HozURv0Aq4/5oX6eq5fW6rW1emutHrxrX1BP3rXX6sm79qf6/QcTk7xrr9WTd208/UfrGKfqN3nXxnGlHr1rL9Wjd+2levCuXcM//hV5/m+rDd61L6gH79oX1IN37Qvqwbt2rQ/1+w+6FrxrX1AP3rVX6sdxgHftC+rBu/YF9eBdu+b8eGc5V0/etdfqybv2Wj15116rJ+/aa/XkXXutnrxrP9Tv4w8mJnnXzvhQH6fqB3nXfrzzH6on79pr9eRde62evGuv1ZN37bV68q69Vk/etdfqf3veuz+nsvv6M/XPGnIU1BgFNaSghhbU+O1p4R8uBl9+XsMLakRBjVlQYxXU+P0+//jjOnHM0xp6FNQYBTWkoIYW1LCCGl5QIwpqzIIaq6DG7/f5x53BV5zWsKOgxiioIQU1tKCGFdTwghpRUGMW1FgFNQr63Av63Av63Av63Av63Av63Av63Av63Av63Av63Av6PAr6PAr6PAr6PAr6PAr6PAr6PAr6PAr6PH67z0OefyYs1M5r7Pwa8yioMQpqSEGN3+7z0I8aruc1rKCGF9SIghqzoMYqqLHza/w+SfNCjVFQ4/f7fMyPPj9/Lvr77MgLNayghhfUiIIas6DGKqix82v8vov/hRqjoEZBn++CPt8Ffb4L+nwX9Pku6PNd0Oc7v8/HcRTUGAU1pKCGFtSwghpeUCMKasyCGqugRkGfj4I+HwV9Pgr6fBT0+Sjo81HQ56Ogz0dBn4+CPh8FfS4FfX7uI3u6hI6L99cR8uOlj/95ErLzKGDZBTy7QGQXmNkFVnaBnVzg3DL2mQVGdgHJLvB7nSzjGZelIucFLLuAZxeI7AIzu8DKLrCTC9iRXWBkF5DsAtmdbNmdbNmdbNmdbNmdbL+5k7f8LGCnBXZyAT+yC4zsApJdQLMLWHYBzy4Q2QVmdoHsTvbsTo7sTo7sTo7sTo7sTo7sTo7sTo7sTo7sTo7sTo7sTp7ZnTyzO3lmd/LM7uSZ3ckzu5NndifP7E6e2Z08szt5ZXfyyu7kld3JK7uTV3Ynr+xOXtmdvLI7+dy8JB/Bq3r8/LHHy3/+3Pgbf07+xp/Tv/Hn7G/8Of+bfk7ODRwxxo+fi7V//pz88nPyN/6c/o0/Z3/jz/nf9nPnv/AOeYYkRKzT8zz/JfYLP6d/48/Z3/hzfvPnHv+3/+fv/vs//N3/9V///p8fP/Fv/5//4x//07/8wz/944//67/8v//t////ebz2/wM=" }], "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": "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": "fee_limit", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::pay_fee_parameters" } }, { "name": "return_type", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::pay_fee_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": "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": "portal_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::eth_address::EthAddress" } }], "kind": "struct", "path": "GasToken::constructor_parameters" } }], "kind": "struct", "path": "GasToken::constructor_abi" }] } }, "file_map": { "100": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/initializer.nr", "source": "use dep::protocol_types::{\n address::AztecAddress, hash::{silo_nullifier, pedersen_hash},\n constants::GENERATOR_INDEX__CONSTRUCTOR, abis::function_selector::FunctionSelector\n};\n\nuse crate::{\n context::{PrivateContext, PublicContext, AvmContext, ContextInterface},\n oracle::get_contract_instance::get_contract_instance,\n oracle::get_contract_instance::get_contract_instance_avm,\n history::nullifier_inclusion::prove_nullifier_inclusion\n};\n\npub fn mark_as_initialized_public(context: &mut PublicContext) {\n mark_as_initialized(context);\n}\n\npub fn mark_as_initialized_avm(context: &mut AvmContext) {\n mark_as_initialized(context);\n}\n\npub fn mark_as_initialized_private(context: &mut PrivateContext) {\n mark_as_initialized(context);\n}\n\nfn mark_as_initialized<TContext>(context: &mut TContext) where TContext: ContextInterface {\n let init_nullifier = compute_unsiloed_contract_initialization_nullifier((*context).this_address());\n ContextInterface::push_new_nullifier(context, init_nullifier, 0);\n}\n\npub fn assert_is_initialized_public(context: &mut PublicContext) {\n let init_nullifier = compute_unsiloed_contract_initialization_nullifier(context.this_address());\n assert(context.nullifier_exists(init_nullifier, context.this_address()), \"Not initialized\");\n}\n\npub fn assert_is_initialized_avm(context: &mut AvmContext) {\n let init_nullifier = compute_unsiloed_contract_initialization_nullifier(context.this_address());\n assert(context.nullifier_exists(init_nullifier, context.this_address()), \"Not initialized\");\n}\n\npub fn assert_is_initialized_private(context: &mut PrivateContext) {\n let init_nullifier = compute_contract_initialization_nullifier(context.this_address());\n prove_nullifier_inclusion(init_nullifier, *context);\n}\n\nfn compute_contract_initialization_nullifier(address: AztecAddress) -> Field {\n silo_nullifier(\n address,\n compute_unsiloed_contract_initialization_nullifier(address)\n )\n}\n\nfn compute_unsiloed_contract_initialization_nullifier(address: AztecAddress) -> Field {\n address.to_field()\n}\n\npub fn assert_initialization_matches_address_preimage_public(context: PublicContext) {\n assert_initialization_matches_address_preimage(context);\n}\n\npub fn assert_initialization_matches_address_preimage_avm(context: AvmContext) {\n let address = context.this_address();\n let instance = get_contract_instance_avm(address).unwrap();\n let expected_init = compute_initialization_hash(context.selector(), context.get_args_hash());\n assert(instance.initialization_hash == expected_init, \"Initialization hash does not match\");\n assert(\n (instance.deployer.is_zero()) | (instance.deployer == context.msg_sender()), \"Initializer address is not the contract deployer\"\n );\n}\n\npub fn assert_initialization_matches_address_preimage_private(context: PrivateContext) {\n assert_initialization_matches_address_preimage(context);\n}\n\nfn assert_initialization_matches_address_preimage<TContext>(context: TContext) where TContext: ContextInterface {\n let address = context.this_address();\n let instance = get_contract_instance(address);\n let expected_init = compute_initialization_hash(context.selector(), context.get_args_hash());\n assert(instance.initialization_hash == expected_init, \"Initialization hash does not match\");\n assert(\n (instance.deployer.is_zero()) | (instance.deployer == context.msg_sender()), \"Initializer address is not the contract deployer\"\n );\n}\n\npub fn compute_initialization_hash(init_selector: FunctionSelector, init_args_hash: Field) -> Field {\n pedersen_hash(\n [init_selector.to_field(), init_args_hash],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n" }, "106": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/returns.nr", "source": "#[oracle(packReturns)]\nfn pack_returns_oracle<N>(_returns: [Field]) -> Field {}\n\nunconstrained pub fn pack_returns(returns: [Field]) {\n let _unused = pack_returns_oracle(returns);\n}\n\n#[oracle(unpackReturns)]\nfn unpack_returns_oracle<N>(_return_hash: Field) -> [Field; N] {}\n\nunconstrained pub fn unpack_returns<N>(return_hash: Field) -> [Field; N] {\n unpack_returns_oracle(return_hash)\n}\n" }, "111": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/storage.nr", "source": "use dep::protocol_types::traits::{Deserialize, Serialize};\n\n#[oracle(storageRead)]\nfn 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)]\nfn 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" }, "118": { "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)]\nfn 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)]\nfn 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" }, "121": { "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)]\nfn 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" }, "124": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/map.nr", "source": "use dep::protocol_types::{hash::pedersen_hash, 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\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" }, "126": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr", "source": "use crate::context::{AvmContext, PublicContext};\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, ()> {\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n // Note that this is the exact same implementation as for public execution, though it might change in the future\n // since unconstrained execution might not rely on the same oracles as used for public execution (which \n // transpile to AVM opcodes).\n let fields = storage_read(self.storage_slot);\n T::deserialize(fields)\n }\n}\n\n// TODO (https://github.com/AztecProtocol/aztec-packages/issues/5818): remove this impl and leave the PublicContext impl\n// once AvmContext becomes PublicContext.\nimpl<T> PublicMutable<T, &mut AvmContext> {\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" }, "129": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr", "source": "use crate::{\n context::{PrivateContext, PublicContext}, history::public_storage::public_storage_historical_read,\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, ()> {\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 mut fields = [0; T_SERIALIZED_LEN];\n\n for i in 0..fields.len() {\n fields[i] =\n public_storage_historical_read(\n (*self.context),\n self.storage_slot + i as Field,\n (*self.context).this_address()\n );\n }\n T::deserialize(fields)\n }\n}\n" }, "161": { "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" }, "191": { "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: u64) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n" }, "199": { "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" }, "200": { "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 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" }, "208": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr", "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::recursion::verification_key::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage;\nuse crate::contract_class_id::ContractClassId;\nuse crate::abis::log_hash::{LogHash, NoteLogHash};\nuse crate::traits::is_empty;\nuse crate::utils::{uint256::U256, field::field_from_bytes_32_trunc};\nuse crate::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};\nuse crate::traits::Hash;\nuse crate::messaging::l2_to_l1_message::L2ToL1Message;\nuse crate::merkle_tree::root::root_from_sibling_path;\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: u64) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n note_hash_index as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn 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 silo_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_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 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 rollup_version_id: Field,\n chain_id: Field,\n message: L2ToL1Message\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, message.recipient.to_field(), chain_id, message.content\n ];\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\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: [NoteLogHash; 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), 0, 0, L2ToL1Message::empty());\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let message = L2ToL1Message { recipient: EthAddress::from_field(3), content: 5, counter: 1234 };\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), 2, 4, message);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n" }, "213": { "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" }, "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" }, "229": { "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" }, "243": { "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" }, "244": { "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" }, "245": { "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" }, "246": { "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" }, "247": { "path": "/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr", "source": "mod lib;\n\ncontract GasToken {\n use dep::aztec::protocol_types::{abis::function_selector::FunctionSelector, address::{AztecAddress, EthAddress}};\n use dep::aztec::state_vars::{SharedImmutable, PublicMutable, Map};\n\n use crate::lib::{calculate_fee, get_bridge_gas_msg_hash};\n\n #[aztec(storage)]\n struct Storage {\n balances: Map<AztecAddress, PublicMutable<U128>>,\n portal_address: SharedImmutable<EthAddress>,\n }\n\n #[aztec(public)]\n #[aztec(initializer)]\n fn constructor(portal_address: EthAddress) {\n storage.portal_address.initialize(portal_address);\n }\n\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\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(\n content_hash,\n secret,\n storage.portal_address.read_public(),\n leaf_index\n );\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 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 #[aztec(public)]\n fn pay_fee(fee_limit: Field) -> Field {\n let fee_limit_u128 = U128::from_integer(fee_limit);\n let fee = U128::from_integer(calculate_fee(context));\n // TODO(6252): implement debug logging in AVM\n //dep::aztec::oracle::debug_log::debug_log_format(\n // \"Gas token: paying fee {0} (limit {1})\",\n // [fee.to_field(), fee_limit]\n //);\n assert(fee <= fee_limit_u128, \"Fee too high\");\n\n let sender_new_balance = storage.balances.at(context.msg_sender()).read() - fee;\n storage.balances.at(context.msg_sender()).write(sender_new_balance);\n\n let rebate = fee_limit_u128 - fee;\n rebate.to_field()\n }\n\n // utility function for testing\n unconstrained fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n" }, "248": { "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::interface::PublicContextInterface;\nuse dep::aztec::protocol_types::hash::sha256_to_field;\n\npub fn calculate_fee<TPublicContext>(context: TPublicContext) -> Field where TPublicContext: PublicContextInterface {\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: u64) -> 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: u64, 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" }, "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};\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\nstruct PedersenPoint {\n x : Field,\n y : Field,\n}\n\npub fn pedersen_commitment<N>(input: [Field; N]) -> PedersenPoint {\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) -> PedersenPoint {\n let values = __pedersen_commitment_with_separator(input, separator);\n PedersenPoint { x: values[0], y: values[1] }\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" }, "4": { "path": "std/collections/bounded_vec.nr", "source": "use crate::{cmp::Eq, convert::From};\n\nstruct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: u64,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new() -> Self {\n let zeroed = crate::unsafe::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: u64) -> T {\n assert(index < self.len);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: u64) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn len(self) -> u64 {\n self.len\n }\n\n pub fn max_len(_self: BoundedVec<T, MaxLen>) -> u64 {\n MaxLen\n }\n\n // This is a intermediate method, while we don't have an\n // .extend method\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n pub fn extend_from_array<Len>(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n pub fn extend_from_bounded_vec<Len>(&mut self, vec: BoundedVec<T, Len>) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n self.len = new_len;\n }\n\n pub fn from_array<Len>(array: [T; Len]) -> Self {\n assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec<T, MaxLen> = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::unsafe::zeroed();\n elem\n }\n\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\nimpl<T, MaxLen> Eq for BoundedVec<T, MaxLen> where T: Eq {\n fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n \n (self.len == other.len) & (self.storage == other.storage)\n }\n}\n\nimpl<T, MaxLen, Len> From<[T; Len]> for BoundedVec<T, MaxLen> {\n fn from(array: [T; Len]) -> BoundedVec<T, MaxLen> {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n // TODO: Allow imports from \"super\"\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n assert_eq(bounded_vec.storage()[2], 3);\n }\n\n #[test(should_fail_with=\"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec<Field, 2> = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.storage()[0], 1);\n assert_eq(bounded_vec.storage()[1], 2);\n }\n }\n}\n" }, "43": { "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\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\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\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\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\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_1() {\n let _ = U128::decode_ascii(64);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_0() {\n let _ = U128::decode_ascii(71);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_1() {\n let _ = U128::decode_ascii(96);\n }\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" }, "71": { "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" }, "80": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/public_context.nr", "source": "use crate::{\n context::{\n inputs::PublicContextInputs, interface::ContextInterface, interface::PublicContextInterface,\n gas::GasOpts\n},\n messaging::process_l1_to_l2_message,\n oracle::{arguments, public_call::call_public_function_internal, returns, logs_traits::ToBytesForUnencryptedLog},\n hash::{hash_args, ArgsHasher, compute_unencrypted_log_hash}\n};\nuse dep::protocol_types::{\n abis::{\n function_selector::FunctionSelector, public_circuit_public_inputs::PublicCircuitPublicInputs,\n read_request::ReadRequest, note_hash::NoteHash, nullifier::Nullifier, log_hash::LogHash\n},\n hash::silo_nullifier, 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_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},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest}, header::Header,\n messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::{Deserialize, Empty}\n};\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_hash : Field,\n\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n nullifier_non_existent_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL>,\n contract_storage_update_requests: BoundedVec<StorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_reads: BoundedVec<StorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack_hashes: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_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 new_l2_to_l1_msgs: BoundedVec<L2ToL1Message, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hashes: BoundedVec<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 prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n PublicContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n args_hash,\n return_hash: 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifier_non_existent_read_requests: BoundedVec::new(),\n contract_storage_update_requests: BoundedVec::new(),\n contract_storage_reads: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n new_note_hashes: BoundedVec::new(),\n new_nullifiers: BoundedVec::new(),\n new_l2_to_l1_msgs: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n historical_header: inputs.historical_header,\n prover_address: AztecAddress::zero()\n }\n }\n\n pub fn call_public_function_no_args<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> FunctionReturns<RETURNS_COUNT> {\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<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> FunctionReturns<RETURNS_COUNT> {\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<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> FunctionReturns<RETURNS_COUNT> {\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<RETURNS_COUNT>(\n self: &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 ) -> FunctionReturns<RETURNS_COUNT> {\n let side_effect_counter = self.side_effect_counter;\n // TODO(6052): get next value from output of `call_public_function_internal`\n self.side_effect_counter += 1;\n\n let raw_returns = call_public_function_internal(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n FunctionReturns::new(raw_returns)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n returns::pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n // Keep private or ask the AVM team if you want to change it.\n 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 // Keep private or ask the AVM team if you want to change it.\n fn push_nullifier_non_existent_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_non_existent_read_requests.push(request);\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n nullifier_read_requests: self.nullifier_read_requests.storage,\n nullifier_non_existent_read_requests: self.nullifier_non_existent_read_requests.storage,\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n returns_hash: self.return_hash,\n new_note_hashes: self.new_note_hashes.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\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 unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.inputs.historical_header,\n global_variables: self.inputs.public_global_variables,\n prover_address: self.prover_address,\n revert_code: 0,\n start_gas_left: self.inputs.gas_left,\n end_gas_left: self.inputs.gas_left, // AVM should decrease this value\n transaction_fee: self.inputs.transaction_fee\n };\n pub_circuit_pub_inputs\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 ContextInterface for PublicContext {\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.public_global_variables.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.public_global_variables.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 {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.next_counter()\n });\n }\n}\n\nimpl PublicContextInterface for PublicContext {\n fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n fn timestamp(self) -> u64 {\n self.inputs.public_global_variables.timestamp\n }\n\n fn coinbase(self) -> EthAddress {\n assert(false, \"'coinbase' not implemented!\");\n EthAddress::zero()\n }\n\n fn fee_recipient(self) -> AztecAddress {\n assert(false, \"'fee_recipient' not implemented!\");\n AztecAddress::zero()\n }\n\n fn fee_per_da_gas(self) -> Field {\n self.inputs.public_global_variables.gas_fees.fee_per_da_gas\n }\n\n fn fee_per_l2_gas(self) -> Field {\n self.inputs.public_global_variables.gas_fees.fee_per_l2_gas\n }\n\n fn transaction_fee(self) -> Field {\n self.inputs.transaction_fee\n }\n\n fn nullifier_exists(self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n // Current public can only check for settled nullifiers, so we always silo.\n let siloed_nullifier = silo_nullifier(address, unsiloed_nullifier);\n nullifier_exists_oracle(siloed_nullifier) == 1\n }\n\n fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.new_l2_to_l1_msgs.push(message);\n }\n\n // We can consume message with a secret in public context because the message cannot be modified and therefore\n // there is no front-running risk (e.g. somebody could front run you to claim your tokens to your address).\n // Leaf index is not used in public context, but it is used in the AVMContext which will replace it.\n fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress, _leaf_index: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(\n self.historical_header.state.l1_to_l2_message_tree.root,\n this,\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\n 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 log_slice = log.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(\n contract_address,\n event_selector,\n log\n );\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: self.next_counter(), length: len };\n self.unencrypted_logs_hashes.push(side_effect);\n // Call oracle to broadcast log\n let _void = emit_unencrypted_log_oracle(contract_address, event_selector, log, side_effect.counter);\n }\n\n fn call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n _gas: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n fn static_call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n _gas: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\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 let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext {\n inputs: PublicContextInputs::empty(),\n side_effect_counter: 0 as u32,\n args_hash : 0,\n return_hash : 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifier_non_existent_read_requests: BoundedVec::new(),\n contract_storage_update_requests: BoundedVec::new(),\n contract_storage_reads: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n new_note_hashes: BoundedVec::new(),\n new_nullifiers: BoundedVec::new(),\n new_l2_to_l1_msgs: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n historical_header: Header::empty(),\n prover_address: AztecAddress::zero(),\n }\n }\n}\n\n#[oracle(checkNullifierExists)]\nfn nullifier_exists_oracle(nullifier: Field) -> Field {}\n\n#[oracle(emitUnencryptedLog)]\nfn emit_unencrypted_log_oracle<T>(\n _contract_address: AztecAddress,\n _event_selector: Field,\n _message: T,\n _counter: u32\n) -> Field {}\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" }, "99": { "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, silo_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\npub fn compute_siloed_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n silo_nullifier(address, nullifier)\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" } } }
|
|
1
|
+
{ "transpiled": true, "noir_version": "0.30.0+c363d6fb324a83b35cf5aa1bfd39f62b9198f0b6", "name": "GasToken", "functions": [{ "name": "check_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(view)"], "abi": { "error_types": {}, "param_witnesses": { "fee_limit": [{ "end": 4, "start": 3 }], "inputs": [{ "end": 3, "start": 0 }] }, "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, "return_witnesses": [] }, "bytecode": "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", "debug_symbols": "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" }, { "name": "compute_note_hash_and_nullifier", "is_unconstrained": true, "custom_attributes": [], "abi": { "error_types": {}, "param_witnesses": { "contract_address": [{ "end": 1, "start": 0 }], "nonce": [{ "end": 2, "start": 1 }], "note_type_id": [{ "end": 4, "start": 3 }], "serialized_note": [], "storage_slot": [{ "end": 3, "start": 2 }] }, "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": "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" }, "return_witnesses": [4, 5, 6, 7] }, "bytecode": "H4sIAAAAAAAA/+2b227iMBCGE8ohNMshIYTzobQ3exdYCvSOl9l9671fad9htZ3UUwZrWjnqxIolLKFMjOP/m9+HppXre2+l9frxVdzQrrRgm7O6Zl8rW8G+sjI5fUc4a45w3gly+gwnXOsqhivM5aZ3Pc/fy1lwklBRCgUDc0fqPoK7eghKUwWBBnyWgD5lpybpnEJDCRU4BQhJIj6pw2drpA53kLvg0kVTPod9QMwT6/d1QMNL2u/cIYnxO9Cekrp6STk25HMsy7t8VaI/DdVvi9yjV20VC+6wW6rtq0+baHpqjDCekLbYDv2okTGG0vEu49/+5Lm69lyXtGky+Z892fxbGk9LY24oJigR8Gp7QEljk0G/9/L9Xo15XRuTe5JTR9zv3Qn2hNC7LvpPmTOJO4TnmzhPti0nz7ex6xJ2mX6f9+BVT/Mq1LzqkjaUoVeCfz7Rxb7xvsdoy3lxOIF238CLPsPTt+xFn9EW9OIFtCMDLyKGJ7LsRcRoy3lx/AHasYEXMcMTW/YiZrTlvNjl7xYDAy8GDM/AshcDRltwjeTzIjHwImF4EsteJIy2oBe/QHto4MWQ4Rla9mLIaAt68RO0UwMvUoYntexFymgL7p35+8XIwIsRwzOy7MWI0Rb0YgfaYwMvxgzP2LIXY0ZbcI3k2hMDLyYMz8SyF/R31CLMAweZUweZ4wowB1oso33I98+pgRdThmdq2QvUK8qcVIA50GIZ7cMzaM8MvJgxPDPLXqBeUebIQebYQeahg8yJg8ypg8xVmM+BFstoH/M9dG7gxZzhmVv2AvWKMkcOMk8dZI4rwBxosYz2Mf/b3MLAiwXDs7DsBeoVZR45yNyvAHOgxTLaxwNoLw28WDI8S8teoF5R5rGDzKmDzFMHmWMHmYcOMicOMt/WoB3mqALM9EzT31J5di+hxoOeeRqjpzGGJKbnYFbijFlGx2dFtNbyWltuvuD9ulTt3Qn63cjnlL/LP6q+8AzfhsnpScXS57keSb8+0cH6Oon/kLbYDv3AdYvsMO8eVPz0yXNL7bkuafPA5H/2ZPPfaDwbjRnG5DfhWItz7E4m87rvXdbyd8JTwj64p2dysZjsOyXtMduS8szoGb5/nuyaXmteBZpXXdKG7tHrEvwzmV835hvzR8z0fSIgdfj9itTVtFzo/zJgezgz/B/4fzqFFjUAAA==", "debug_symbols": "ndpBattQGIXRvWgciu+vpycpWymlOIlTDMYOsVMoJnuv3dIF9Mz0JN3ZNzq86/Cye/r48X1/fD2dh8ev1+Fwet5e9qfj7XQdNl+q/3l7ftse7y/Ol+37ZXgcKw/D7vhyf+qfD8Pr/rAbHqu3z28P99Eso0VGK4zGjYwio5LRKKMmo0lGUsQoRYxSxChFNCmiSRFNimhSRJMimhTRpIgmRTQpokkRkxQxSRGTFDFJEZMUMUkRkxQxSRGTFDFJEV2K6FJElyK6FNGliC5FdCmiSxFdiuhSxCxFzFLELEXMUsQsRcxSxCxFzFLELEXMUsQiRSxSxCJFLFLEIkUsUsQiRSxSxCJFLFLEKkWsUsQqRaxSxCpFrFLEKkWsUsQqRaxSRDYbWoVWRauRVo1WE606rWZaLbSiNkJthNoItRFqI9RGqI1QG6E2Qm2E2ihqo6iNojaK2ihqo6gN4syQZ4ZAMySaIdIMmWYINUOqGWLNkGuGYDMkmyHaDNlmCDdDuhnizZBvhoAzJJwh4gwZZwg5Q8oZYs6Qc4agMySdIeoMWWcIO0PaGeLOkHeGwDMkniHyDJlnCD1D6hliz5B7huAzJJ8h+gzZZwg/Q/oZ4s+Qf4YANCSgIQINGWgIQUMKGmLQkIOGIDQkoSEKDVloCENDGhri0JCHhkA0JKIhEg2ZaAhFQyoaYtGQixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLFrlokYsWuWiRixa5aJGLll3ztHuedtGTXLTIRYtctMhFi1y0/ttFb6ef2/f99umwu9/svX/8OD7/u+h7O15+vf39cvv3Nw==" }, { "name": "set_portal", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "inputs": [{ "end": 3, "start": 0 }], "portal_address": [{ "end": 4, "start": 3 }] }, "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, "return_witnesses": [] }, "bytecode": "H4sIAAAAAAAC/92YzY4bRRDHu+fDY3vtSezEH7vrb8/484YEl4DEFXFB4glAIIEEHBAc4MRz8AKcOOWUV8hD5FWSruqurq0ZO25ZSQ4ZaTzVNf9fV3d19e7MFCpReDTxOlXuMK2mylXDXCI4P1dkGQNOnStNrhJuAmUt41dx6QCVoBWbn3Rlfm4+9cEKlSp5gL6BUe1ZUjSjdeOEqCpTvpnBD+qSQF0cqEsDdTpARxPUaMHcspLuRiYt+r+S5t9CCwbZRqvlxW3IXEkx2jJkS2Oz7Yh2qV1LB+rSQF0cqEsCdVFFZ1PXdLom34XjRoo7DWzegGnO7hJuPAPrM81Q4hINsi7G7ULvts5cEFGJr80BKqsAcdcoXlcOCGoVELvDfTwIrXKryOGMfHfQ7Faayjc7kssyNJtuFjlO8muweJL1rYR7OvdkM+XZQkfYyTdgne3k2b8vI5mn1ke6H1tv248dvx+7aHW8GJfO78dupTRtvdN6ct3pQF0aqIsDdUmgrrIfOzZ1OdWl3I+PpPix3Y+PwDRnD6vsH7BO7UeQ9TBuT26gh0dmyw/0Wep3WyaHsjZn3y9qj1e7X6+Fx3IG/ULpb831iYV6DnqKpfQELIk/tbq+NRH/id2EDxAHwUDiA8YHDv+O3YQPEQfBUOJDxocO/53dhI8QB8FI4iPGRw7/kd2EjxEHwVjiY8bHDv+B3YTfIg6CW4nfMn7r8K/YTfgd4iC4k/gd43cO/5XdhN8jDoJ7id8zfm+vV2Em6p/sJnyCOAgmEp8wPnH4H+wmfIo4CKYSnzI+rQ966svkAmaifs9uwmeIg2Am8RnjM4f/wm7C54iDYC7xOePz+qDnvrouYCbqgt2ELxAHwULiC8YX9agLn6orsNl12PA6bPRB5za+jJmF+IvdhC8RB8FS4kvGl/WoS79+FzAT9Wd2E75CHAQria8YXzn8N3YTvkYcBGuJrxlf1we99lGvwCYfNNrgOmz23gZpFuJvdhNeIA6CQuIF40U9auF3yBXY+DIG89FfyoeLAjvwzwtK3LCPkn3ZM/oxZFkPubEdFNZ8eBeysZG97OwD1c6J9yaZ0MdBY1cHcMGJw/7CtmjewBxKkm05qr0RWac6yNEdlA8I2G5h3J9UhliZAD7auQyceoGQL0ki+z6reSWrUlfKpBS1J8VX/8MQbJw+L1JOw8TZ9mV6T63FufeborroZ95vTuriQF0aqNMBOkqM9q8sNtc5ZoMk25II/HCDOcAPN1gZCbwHPffvN9tK6uz7w9ZhW6w0aOlAXRqoiwN1SaAuOv3ZaWOrZ1Mvkr3P5oM07+uLsJNVuufa2vsdl57dcXvaz+dqcF8Jfq4GT+riQF0aqNMBOlmDG5/JArOh3F+ZY0mErcGDr8Ej1eALX4PHSursGh8ddsQ1PtZr8KwuDdTFgbokUBet60WIX01tEcb1kA2fzoTz3KivQrpNXPlAC7+94n3LQ8zMf4KM/CePuPI/PPPR0sqXk8qodtoNV7tZvYteABu/hPMNRxLFaZ4WAAA=", "debug_symbols": "5Z3tSqNnEIbPJb+lvHPPPB/jqZRS3F23CKLL6haKeO6NNVGWBkLfxouB/DP6TO55DNcdAhfkafPl+tOPP36/uft6/7C5/PVpc3v/+erx5v5u++hps/xi9s9vH75d3b384uHx6vvj5jK9X2yu775sfxp6vth8vbm93lyqx/PFv85q0f6wljbeTpu3A6d9aHc4zN/P2nj+7eJlHa+1TtRap9Vap9daZ9RaZ9ZaJ0uto6XWOrVqUKq1Tq1WVq1WVq1WVq1WVq1WVq1WVq1W9lqt7LVa2Wu1stdqZa/Vyl6rlb1WK3utVvZarey1WjlqtXLUauWo1cpRq5WjVitHrVaOWq0ctVo5arVy1GrlVquVW61Wbh/ayq8R/vERJ2jPPt4iZh75p465f+aR7f2ZW+7WabXW6bXWGbXWmbXWyVLr9KXWOgav0/1tnf7TOhcHtsj9Fj2PnB1tvj1vvJ/V7pY6i1vGWdyyn8Ut51ncMs/hlmM5i1uexTvJOIt3kuFnccuzeL8cxz47zZ9v+To01gzNNUO5YmgebtTc/39tiWMvnTXtP8dba+3/feifKraPF9sniu3Tiu3Ti+0ziu0zi+2TtfbJYn2YVmyfYv2cxfo5i/VzFuvnLNbPWayfs1g/Z7F+tqVYQdtSrKFtKVbRthTr6G1etYWKtbQtxWralmI9bUuxoralWlNbtaa2ak1t1ZraqjW1VWtqq9bUVq2prVpTW7WmtmpNrWpNrY9t6l2IiJBTNOp4D5n9UEgQIY0I6UTIIEImEZJAiC+nDUk7FCIixImQIEIaEdKJkEGETCIkgZAgYAwjQgjigyA+COKDID4I4oMgPgjigyC+EcQ3gvhGEN8I4htBfCOIbwTxjSC+EcQ3gvhOEN8J4jtBfCeI7wTxnSC+E8R3gvhOEN8J4gdB/CCIHwTxgyB+EMQPgvhBED8I4gdB/CCInwTxkyB+EsRPgvhJED8J4idB/CSInwTxkyA+CeKTID4J4pMgPgnikyA+CeKTID4J4hMgXstChBgRIiLEiZAgQhoR0omQQYRMIoQg3gjijSDeCOKNIN4I4o0g3gjijSDeCOKNIF4E8SKIF0G8COJFEC+CeBHEiyBeBPEiiCd0ODlBPOHciXDuRDh3Ipw7Ec6dCOdOhHMnwrkT4dyJcO5EOHcinDsRzp0I506EcyfCuRPh3Ilw7kQ4dyKcOxHOnQjnToRzJ8K5E+HciXDuRDh3Ipw7Ec6dCOdOhHMnwrkT4dyJcO5EOHcinDsRzp0I506EcyfCuRPh3Ilw7kQ4dyKcOxHOnQjnToRzJ8K5E+HciXDuRDh3Ipw7Ec6dCOdOhHMnwrkT4dyJcO5EOHcinDsRzp0I506EcyfCuRPh3Ilw7kQ4dyKcOyecOyecOyecOyecO1+CCGlESCdCBhEyiRCCeMK5c8K5c8K5c8K5c8K5c8K5c8K5c8K5c8K5c8K581M4d6PF/vTIeShERIgTIUGENCKkEyGDCEkgxAlOTmGqHQ8hYHQCRidgdAJGJ2B0AsZTmGrHQwjigyA+COKDID4I4oMgPgjigyA+COKDID4I4htBfCOIbwTxjSC+EcQ3gvhGEN8I4htBfCOI7wTxnSC+E8R3gvhOEN8J4jtBfCeI7wTxnSB+EMQPgvhTmGqz7b8o2nLxQyFBhDQipBMhgwiZREgCIaeQyI6HGBFCwHgKiex4CEH8JIifBPGTIH4SxE+C+CSIT4L4JIhPgvgkiE+C+CSIT4L4JIhPgPhYFiLEiBARIU6EBBHSiJBOhAwiZBIhBPFGEG8E8UYQbwTxRhBvBPFGEG8E8UYQbwTxIogXQfxhiUx9P+ZLvE/tv2I1DgtbR6f6qqmxamqumso1U4eNma6+m+p9Hprqq6bGqqm5airXTB02PI5OadWUr5qKVVP/9VXePvrz6vvN1afb64ftxMsff9x9fry5v9s9fPzr2+tftmf/Bg==" }, { "name": "claim_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 5, "start": 4 }], "inputs": [{ "end": 3, "start": 0 }], "leaf_index": [{ "end": 7, "start": 6 }], "secret": [{ "end": 6, "start": 5 }], "to": [{ "end": 4, "start": 3 }] }, "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, "return_witnesses": [] }, "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": {}, "param_witnesses": { "inputs": [{ "end": 3, "start": 0 }], "owner": [{ "end": 4, "start": 3 }] }, "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" }, "return_witnesses": [4] }, "bytecode": "H4sIAAAAAAAC/9WaaW/jNhCGKdtyUjeWb8fxkVixGd/Hpm7RRZuvRYF+7A8oeqNAL/RAUfR7f9z+qV3OkMMxzQAyCKyAFSCbGr0P3+GQTkLFU1ESeFzG8DoS5lDRS5GIsnorwPmpoJZqwBklIqKQhJtA6ZaKi6I0gChhq6he4nv1ciWF7uGy9CHcAPtoKiKALmLoEzO6UGd5SsmJj9VZkZTcpbA3KvDCOsDf40tUqM4/U+/va+jSQFeyoIPiysWvtK6im4j/zWHCq4iDoOriVcarBv+Vw4QniIMgcfGE8cTg33KY8BriIKi5eI3xmsH/4jDhdcRBUHfxOuN1g//EYcIbiIOg4eINxhsG/43DhDcRB0HTxZuMN/W7j1WzMeU65jDhLcRB0HLxFuMtg3/DYcLbiIOg7eJtxtsG/5rDhHcQB0HHxTuMdwz+M4cJ7yIOgq6Ldxnv+iXrWtcArBqGJdmYGuP3HCb8GnEQXLv4NePXBv+Kw4T3EAdBz8V7jPf8pHt2MWZgyvUHDhN+gzgIblz8hvEb3/XGJpuBKdffOUx4H3EQ9F28z3jfd+3bn1kBWCsM64Rh9TAsCcOaubq1w7BqrmNr5JrkGatEfRL+5TDhA8RBMHDxAeMD33VgSxOAtcKwbq5JJmFYOwzr5IqdUUm1Wr7jMOFDxEEwdPEh40PfdWgnIgNTrn9ymPAR4iAYufiI8ZHvOrJ/pAVg7Vzd6mFYkuvYOrli/WwshfitcPY5L7EDc0E9C0MIKYh3tzi3aHnrW97pDka6eXwXNlR3bi9pGS9TI743m7JJhF1NIAQnpj3QVzRuiE0kycbsqm8UdFBM3OwmwhoClipJVD9J8WQAH0WmAi9Zh2O3NStxzaAgJ3vD8knhpiIW7oEzhRtfdDWTVjLdVXAsI/1hP+64cqTR7z4WZ2NTUeTUjgd498mxrqRn7zR3OMY6dyj3OMZmxVzGU7QU93qXHZsJTdkINvnSVnLClZR+JaduJaXq/Ev1/qChiYFmOPAHaLn4TOukbsK7j9XCsEY2ppL9g8OEzxEHwdzF54zPfde5/amUgSnXHzlM+AJxECxcfMH4wndd2F+FAVgzDBuGYZ0wrBGG1d5aSdT87TlM+BJxECxdfMn40nddWtcArBqGNcKwWq5ja4dhnVyxMyqpVss/HCZ8hTgIVi6+Ynzlu67spz0AG2RjKtkthwlfIw6CtYuvGV/7rms7/QHYQxhWC8MaYdgsDGuHYfMwrJvrvA3DsE6u81bLdWxnVFJ97n7hMOEbxEGwcfEN4xvfdWOf7wVgwzCsFoY134Uk22HY7F2oZC/XsTXCsPVbK4n63L3gMOFbxEGwdfEt41vfdWt/TWZgsNMtfCGcPdcTdmAuqGdhCL3xkm7PcOzQcudb7nUHW908vgubu73by6Pe8T8a8Qdmx3/QO/4DhODEtD/XVzRuYA6SZC/YVd8o6KA4uNkdhDUE7HGsOn46SfFkALjjhwo8SfrX88lONOaa4YYYdcUzdZUzddEZOiprZJ/TxJLuFtRWu/A//e9bzZ8wSeq531kxDDyVdgW5lrvIFgfnXppVBv9BP0tXOVNXPFNXePZxRmqGn54sWlcs9erbmdLtcZnB89M9zrk5SqaAINtLs8RFJbGPNpRJ/PrkAEYrAI0vsJmaS230n2uU2GdzacLqyLrExukofzr2GoC09ji+lJIsWHyvw5QRFsiuEj3dmNXk+QdSRW1R9Gem/NyDr/Izi3VWMksPv2EhqbRlu0IvJKH4LQ78BkZxAs3eKzjfAI43y8gqIgAA", "debug_symbols": "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" }, { "name": "claim", "is_unconstrained": false, "custom_attributes": ["aztec(private)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 41, "start": 40 }], "inputs": [{ "end": 39, "start": 0 }], "secret": [{ "end": 42, "start": 41 }], "to": [{ "end": 40, "start": 39 }] }, "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" }, "return_witnesses": [815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271] }, "bytecode": "H4sIAAAAAAAA/+1dB3gVRRfd90IJvVtQIahIUfRN6gs19A6KSFNKKqA0ISBi+bH33nvvith7770X7L13xS7+d8gMmQwvydu3Z8KOk/2+803uy+7dOXPn3pmdshvxKo6/GnveHo0q/o4Q0ghRQoYip4m/pdxAkxtq5zfW5Baa3EqT22hyO03enFCgyJ21/2dochdN3laTdxCyekREWiDSrFhudnZpXmYpy2KFscz8onhOLDunKDfO4iwnnlOSGc/KKo1nx/Pyi/LzYvksO6uUleXkZ5XFKo6eiq5YwIPnrYmirxthHaG7SHuItGd96kS6E2FHr6LOqvVix/rycb5ecKhHVKQFIo0FO9gOHi5G9gLmS8Z2rjND4S2PCLgcuuF0xTKEnp0Ju3B9BEbI5GVMyCbkEHIJeYQ4IZ/Qm9CH0JfQj9CfMEDkayBhEGEwYQhhKGEYYThhBGEkYRRhNGEMYawoJFmOPC/pXqW8iybHNJlpcqYmZ2lytibnaHKuJudpclyT8zW5tyb30eS+mtxPk/tr8gBNLtDkgZo8SJMHa/IQTR6qycM0ebgmj9DkkZo8SpNHa/IYTR4rZPVoINICkcaCHVV8Jmjs2Bmgq7SMHzG2CzBfvzfAxYWabBGEM7dFDKKrwq4suK5MUX4sE2iLP8Jsi+wN+WRZwXTFFM4sO4iuzCrlx3KAtvgznLaIaflkuSnqyi3biDPLS01XPEH5sTjQFn+FzRbxhPlk+f515VXDmfX2qyuv2vJjfYC2+Ds8tsisIZ+srx9deTVyZv2S11VcS/mx/kBb/BMGW+TVmk82IDldsSQ4s4JkdMWSKj82EGiLdZvWFjlJ5pMNqk1XdtKc2eAadWWX+Sg/NgRoi383lS3yfOWTDa1eV9wnZzasGl35Zb7Ljw0H2oIPttexLWIp5JONSKQrlhJnNnJjXSzF8mOjgLaI1KUtSlLOJxtdVVdWAM5sjKIrsyxQ+bGxQFtE68gWsWAHA44PMODzLVOfz4LaIs0SWwCfgxiwH8/+AdqigSW2APb3GLC/wtT2NqgtGlpiC2C7xoBxmaUBbdHIkC3SwLYA+i8D1j+GLD/Tc3Xdcbo2zNWNI4wn7ErYjTCBsDthImEPwiTCZMIUwlTCNMKehL0I0wkzCDMJswiFhCJCMaGEUEooI8wmzCHMJexN2IcwjzBfFJKcu+F5Uedyxmvyrpq8myZP0OTdNXmiJu+hyZM0ebImT9HkqZo8TZP31OS9NHm6Js/Q5JmaPEuTCzW5SJOLNblEk0s1uUyTZ2vyHE2eq8l7a/I+mjxPk+d75ufqVJ8JGmvHAXTJubrxwHxtVvfP0inN1e0K0VVh192C69owVzcBaIvNw2wLZa5u92C6qszVTQyiS5ur2wNoiy3CaYuN5uompagr0Vzd5NR0JZyrmwK0xZZhs0U1c3VT/euqdq5uml9dNczV7Qm0Rcfw2KLGubq9/OiqZa5uevK6ap2rmwG0xVZhsEUSc3Uzk9OV1FzdrGR0JTlXVwi0xdab1hZJz9UV1abLx1xdsYebqysB2mKbTWULn3N1pR5urq7Mw83VzQbaopMlc3VzPNxc3VwPN1e3N9AWnS2Zq9vHw83VzfNwc3XzgbbIsGQcHDg+wIDPt2wL4Dh4F0tsAXwOYsB+PNsKaIttLbEFsL/HgP0V1gloi+0ssQWwXWPAuMy6AG2xvSVzdUD/ZcD6x0yVH3rP9AKYLbJKTeZzISyf8TyT+VwEy2dRvsl87ovLZynPG4+xQ4Q+Xqf4XNlCkS4S6b4ilfve5H44uU9O7p+T++pGiFTuw5P784aKVO7nk/v8Bol0oEgLRCr3Ecr9hXLfodyPKPcpyv2Lcl+j3O8o90HK/ZFy36TcTyn3Wcr9l3JfptyvKfdxyv2dci5RzjHKuUc5JynnKueIVM5tyjlPORcq50jl3KmcU5VzrbNEKudm5ZytnMuVc7xy7lfOCcu5YjmHLOeW5ZyznIuWc9Ry7lrOacu5bjkHLufG5Zz5YsISQjlhKWEZYT/CcsL+hBWEAwgHEg4iHEz4H2El4RDCoYTDCIcTjiAcSTiKcDThGMKxhOMIxxNOIJxIOIlwMuEUr+qB9qtTPVjcz5TvGogqeeV7zk8VKX9Hx2lexbtAGnsb779OxC8W7GCbeWbaNQ+TTyb/UMvidJGeoZQH6oYbbiwXCvCbvedVLhzgN83Q7onuBKlGCTrBfLqHc4YzPDOVJQouPyTnMxPoKooVl+SwotwSGpcrzIkXF+dnMZZZmFuYW5QZLystymHxnDjpLC7MjNPtMguLWWmsMLeUO7ZchKIfaMc+E6crpub3LM+g05kqiLMM6D0bWMlM8T4bb6OEeUUEFp5XVCCQepE2OsfDOhRvNLjOLl5Fi+95ddPimwri6HyeBsxnIyWf54r0PJGeL9ILRHqh4NJdyBcRLiZcQriUcBnhcsIVhCsJVxGuJlxDuJZwHeF6wg2EVYQbCasJNxFuJtxCuJVwG+F2wh2EOwl3Ee4m3EO4l3Af4X7CA4QHCQ8RHiY8QniU8Bjhca8OekAXKjrlofd4gjoX0NjsPGC+nsDlK1aXrT8y32p+n/Qsa/2f0DKN0vuUF+7Wn/N+Cm+j9ZWY57UuWipkC2Ayn+d5ZpztaSWv8C7XUx6+pZAZbigqSF1EOmThq5X6GZE+y/NsovCfNlAYT3tYjzHFO2qQd9A8Pme4DGPBDsYr5nMGbPO8h41iPCBwnSuFTnQ5PGuoHF4wUA4vGCyH8wyVQ3bDcMcSU36Qs2l517oC3FS9z7VkhQCwXjKgrRmy/Bp6lW+Rr+5I9l611SdVp4m2ClUmamfyRa+GnnEs2MGQHQDZAKgZ9plfVts9ntP0S71BA0LvkCzf8tNhC8r5JS+cwQVpC1knOdeVXtXDr21qK2+kbV5WdLGsLPILmn8rKynLysnLzyxiuVm5uWXZZXm58eySspzswpK8UpZdmJWZX5oXK2Px0tK8nKzivNyy/JLi3DI1WLOSrKzskvyiYpaTmVtYFIuXZBXGyrLzsjJjhSVZeSUlWfHc3MKsrJLceFk8P56ZWViWFY/l5OXlx3Izs/IzTdjmZWGbunySRg63qA3XKyJ91bMkaJvK3ysePki/5uEr32ueuaeV57SKgCqH1w2Uw+sGy4E7m4lefN+QP7WZ8oN+IX9qM1Xv+1vy1Aaslwxoa9a//qlNP9grHjaWyuMNz7KnNjXDJp7a3vDwAWGQg09tb3rhDC6DDDwZcK4rvapHmJ/a1ni4p7b+wKc2E7ZZ41U+tVXXEIR5iM1kPk01Km95ljUqaoZNNCpvefhGZUjI3/JmolHJMdRjDZqvoXXU4w+az7c9XPkB6x8baiDwc64rvaoHum6/4+EavyrDnyFqlIcYsM073n9nKPVdka7fkGRiSWOixTnIlWZBdQEXOBlZbirLEB1MTZVhUF3vh9we3GHe9/Adog88fKDiOlcKnehyeM9QOXxooBw+9MwOu5sohxEhH3Y35QcjQz7sbqrej7Jk2B1YLxnQ1mxU/bC7fqxvq1BlonZyP/IMjpAAOwAbGgA1w+gRkvc1/VJv4PfzWzLs/j6Q88deOIPLOANPkZzrSq/qgR52R9rmEw/3hD8K+IRvwjafeHX/hG9q29GnIv3MsyRom8rfpx4+SH/u4Svf5565p5X3tYqAKocvDJTDF57ZLS4mevG7hvypzZQf7BbypzZT9X6CJU9twHrJgLZmE+qf2vSDfephY6k8vvQse2pTM2ziqe1LDx8QJjn41PaVF87gMsnAkwHnutKreoT5qe1rD/fUNgH41GbCNl97db9YCjnEZjKfphqVbzzLGhU1wyYalW88fKMyxZLFUsjANdJQjzVovqZasljqWw9XfsD6x6YaCPyc60qv6oGu2995uMZvVMNwNspTDNjmuwS2QT/dnga08wVAXd/jONbpu/6Q+Vbz+4Nn2bv+vtcyjdL7I7CSmeL9I95Gdfquvws8Mw11mFd2qs71k2fwXX8/AgtAthQyw/+FZbU/i/QXz8C7/n7UrIsqjJ88rMeY4h01yDtoHtcaLsNYsIPxirnWgG1+9bBRjAcErnOl0Ikuh18MlcNvBsrhN8/s8lUT5bBXyCdCTfnB9JBPhJqq9zMsmQgF1ksGtDWbUT8Rqh/r2ypUmaidyd89g2PWyA6AbADUDKPHrNdq+qXeoAGhyJKJ0LVAzn944QwuRQbG9TjXlV7VAz0RirTNnx5uzHUGcMzVhG3+9Op++SpyuEVtuP4S6d+eJUHbVP7+8vBB+h8PX/n+8cw9razVKgKqHNYZKId1BsuBO5uJXnxJyJ/aTPlBacif2kzV+zJLntqA9ZIBbc3K6p/a9IP95WFjqTz+9Sx7alMzbOKp7V8PHxD2dvCpjRciiDM0uOxt4MmAc13pVT3C/NQWieCe2sqAT20mbBOJ1P3yVeQQm8l8mmpUohHLGhU1wyYaFVW/1BvUiedZsnwVGbimG+qxBs3XfEuWr6YBG2Vg/WPzDQT+tIj55asNIrjGb0bDcDbK8wzYpkHkvzOU2lBktFHEw7/rr7rFOciVZkF1ARc4GVluKssQHUxNlWFQXY0j4bYHd5jGBjpE6RF8oEqPmBtubmSoHJoYKIcmEbPD7ibKYVHIh91N+cG+IR92N1XvF1sy7A6slwxoa7a4fthdP9a3VagyUTu5TU2OkDQ20AA0NThCwvPb1EBAWGbJsLtqr6Ccm0XCGVyWGXiKbFYHw+5I2zQHDrsvBj7hm7BN803whG9q21ELkdGWtgRtU/lrYSBItzLQWLUy+LTCy6GlgXJobaAcWkfMbnEx0YtfHvKnNlN+sH/In9pM1fsVljy1AeslA9qarah/atMP1sLQU1sb257a2hh+amtjICAc7OBTW9tIOIPLwQaeDNpa9tTWDvjUtgL41GbCNu02wWIp5BCbyXyaalTa29aotDfcqLQ30KistGSxFDJw7Wuoxxo0X4dYsliqA7BRBtY/doiBwN8hYn6x1GYRXOO3uGE4G+WVBmyzmdIo19W76i70zDR2m0cse1fdhVqmUXq3AAZ6U7y3iMBtVKcvXESu+FPzu6VtlfgCLdMovR1DXok5744GKnGivCJWE/LeXxRcBsge5VYhn6PiAaujgaeHrSPhrjv8q9P8LeHouoN88/g2IS9DXre5ndHzBkCfYVsDfblTyO3B60snA77cOWK2rQ6aPz6v2tkA78Mbhjt2n2eI9xGGRhvQsRZoH3YEeE6wrjrsyI91qvnNsK3Dfp6WaZTeLiHvsHPeXSx/6jzfM1OJt7WtEp+vZRqld7uQV2LOe7s6euqMBTvWB4TtDLS624f8SZE/JW5vgHdX8HxbE69yHJ4HR/76s/NFeqFILxApP3YQhNC8+JN1VwPl1Q3YG5c9Mnmg68y5OF2x7kJPd8pkD0JPwo6EnQi9CDsTdiHwSsA/5ZBJyCJkE3IIuYQ8QpyQT+hN6EPoS+hH6E8YwMuWMJAwiDCYMIQwlDCMMJwwgjCSMIowmjCGMJYwjjA+Url0O03kNaLIPTS5pybvqMk7aXIvTd5Zk3fR5JgmM03O1OQsTc7W5BxNztXkPE2Oa3K+JvfW5D6a3FeT+2lyf00eoMkFmjxQkwdp8mBNHqLJQzV5mCYP1+QRmjxSk0dp8mhNHqPJYzV5nCaPj2zc4fG7UMiPTweNZdw/guoqLas4ekRw+To65GsfBOeSnrjyy98Rp4vtBLTFMVbYopT1gpVfMdsZpivOdgHa4lgrbBFjMVT5lcYYQ+kqjrFMoC2Os8EW8RjLQpUftT3ZIF2lpCsHaIvjLbBFMXHOBZVfnHTlgXQRZRYH2uKE8NuilHPOx5RfMdfVG6MrznX1AdrixPDbgqtmfSHlV7peVz+IruL1uvoDbXFS6G0RX895AKT81meTFSB0lVboGgi0xclht0VxBedBiPKLV+gajNBVQZkNAdrilJDbokRwHgrgXCR0DQPoyhO6hgNtcWq4bZEpd2KOCM6ZSV0jA+uKl0ldo4C2OC3UtogXSc6jg5ffhh22YwLrytugayzQFqeH2hY5GziPC8yZbdA1PoIbszwauBfnjJBstq3lYMBxMwYc92HHAW1xpiW2AI4PMODzLTsRaIuzLLEF8DmIAfvx7BSgLc62xBbA/h4D9lfY6UBbnGOJLYDtGgPGZXYW0BbnWvLmHKD/MmD9Y6bKL6qVXxjmlaWuXYH9UK4jAq4rfP1Stwh+ndFuEayt0bwv8irX1yB5rwr5qn9eH3czwPtGS94xMAHoj0BbsxtDXm+4v+xqoN7cHHLe3Q35yy2W+MvuQH8B2pohy4/blq/7lf0IHiP4+t7dI5XrfCeKCoCuXxd7les6kXa7PeRv9eScJxrgfYclz0sTgX3MPYA+Cqw3zBZbXAysf5MiZnw4TH6hx8s9RJycpMTLyYbi5SVe5bp3D2i3u0MeLznnyQZ432OJj04G+tUUYLwE1htmiy0uAda/qREzPhwmv9Dj5RQRJ6cq8XKaoXh5qVe5L8gD2u3+kMdLznmaAd4PWOKj04B+tScwXgLrDbPFFpcC699eETM+HCa/0OPlniJO7qXEy+mG4uVlXuW+SQ9ot4dDHi855+kGeD9iiY9OB/rVDGC8BNYbZostLgPWv5kRMz4cJr/Q4+UMESdnKvFylqF4eblXua/cA9rt8ZDHS855lgHeT1jio7OAflUIjJfAesNsscXlwPpXFDHjw2HyCz1eFoo4WaTEy2JD8fIKr/K9Gx7Qbk+HPF5yzsUGeD9jiY8WA/2qBBgvgfWG2WKLK4D1rzRixofD5Bd6vCwRcbJUiZdlhuLllV7le4k8oN2eD3m85JzLDPB+wRIfLQP61WxgvATWG2aLLa4E1r85ETM+HCa/0OPlbBEn5yjxcq6heHmVV/neNg9ot5dDHi8557kGeL9iiY/OBfrV3sB4Caw3zBZbXAWsf/tEzPhwmPxCj5d7izi5jxIv5xmKl1d7le+19IB2ez3k8ZJznmeA9xuW+Og8oF/NB8ZLYL1httjiamD9WxAx48Nh8gs9Xs4XcXKBEi8XGoqX13iV7/31gHZ7K+TxknNeaID325b46EKgXy0CxktgvWG22OIaYP3bN2LGh8PkF3q8XCTi5L5KvFxsKF5ey8vCQNx4L+TxknNebID3+5b46GKgXy0BxktgvWG22OJaYP0rj5jx4TD5hR4vl4g4Wa7Ey6WG4uV1XuV3Izyg3T4KebzknJca4P2xJT66FOhXy4DxElhvmC22uA5Y//aLmPHhMPmFHi+XiTi5nxIvlxuKl9d7ld/V8YB2+yzk8ZJzXm6A9+eW+OhyoF/tD4yXwHrDbLHF9cD6tyJixofD5Bd6vNxfxMkVSrw8wFC8vMGr/O6YB7TbVyGPl5zzAQZ4f22Jjx4A9KsDgfESWG+YLba4AVj/DoqY8eEw+YUeLw8UcfIgJV4ebChervIqv8voAe32XcjjJed8sAHe31viowcD/ep/wHgJrDfMFlusAta/lREzPhwmv9Dj5f9EnFypxMtDDMXLG73K79Z6QLv9FPJ4yTkfYoD3z5b46CFAvzoUGC+B9YbZYgvugyhbHBYx48Nh8gs9Xh4q4uRhSrw83FC8XO1VftfbA9rt15DHS875cAO8f7PERw8H+tURwHgJrDfMFlusBta/IyNmfDhMfqHHyyNEnDxSiZdHGYqXN5GO3gbixp8hj5ec81EGeP9liY8eBfSro4HxElhvmC22uAlY/46JmPHhMPmFHi+PFnHyGCVeHmsoXt5MOvoYiBvrQh4vOedjDfD+1xIfPRboV8cB4yWw3jBbbHEzsP4dHzHjw2HyCz1eHifi5PFKvDzBULy8hXT0NRA3oo3CHS855xMM8E5rZIePngD0qxOB8RJYb5gttrgFWP9Oipjx4TD5hR4vTxRx8iQlXp5sKF7eSjr6GYgbjUIeLznnkw3wbmyJj54M9KtTgPESWG+YLba4FVj/To2Y8eEw+YUeL08RcfJUJV6eZihe3kY6+huIG01DHi8559MM8G5miY+eBvSr04HxElhvmC22uA1Y/86ImPHhMPmFHi9PF3HyDCVenmkoXt5OOgYYiBstQx4vOeczDfBuZYmPngn0q7OA8RJYb5gttrgdWP/Ojpjx4TD5hR4vzxJx8mwlXp5jKF7ewXUZiBttQx4vOedzDPBuZ4mPngP0q3OB8RJYb5gttrgDWP/Oi5jx4TD5hR4vzxVx8jwlXp5vKF7eSToGGogbm4U8XnLO5xvgvbklPno+0K8uAMZLYL1httjiTmD9uzBixofD5Bd6vLxAxMkLlXh5kaF4eRfpGGQgbnQMebzknC8ywHsrS3z0IqBfXQyMl8B6w2yxxV3A+ndJxIwPh8kv9Hh5sYiTlyjx8lJD8fJu0jHYQNzoFPJ4yTlfaoB3Z0t89FKgX10GjJfAesNsscXdwPp3ecSMD4fJL/R4eZmIk5cr8fIKQ/HyHtIxxEDc2Dbk8ZJzvsIA7+0s8dErgH51JTBeAusNs8UW9wDr31URMz4cJr/Q4+WVIk5epcTLqw3Fy3tJx1ADcWOHkMdLzvlqA7y7WeKjVwP96hpgvATWG2aLLe4F1r9rI2Z8OEx+ocfLa0ScvFaJl9cZipf3kY5hBuJGz5DHS875OgO8d7TER68D+tX1wHgJrDfMFlvcB6x/N0TM+HCY/EKPl9eLOHmDEi9XGYqX95OO4Qbixs4hj5ec8yoDvHexxEdXAf3qRmC8BNYbZost7gfWv9URMz4cJr/Q4+WNIk6uVuLlTYbi5QOkY4SBuJEZ8njJOd9kgHeWJT56E9CvbgbGS2C9YbbY4gFg/bslYsaHw+QXery8WcTJW5R4eauhePkg6RhpIG7khjxecs63GuCdZ8ueZaBf3QaMl8B6w2yxxYPA+nd7xIwPh8kv9Hh5m4iTtyvx8g5D8fIh0jHKQNzoHfJ4yTnfYYB3H1v2lAD96k5gvATWG2aLLR4C1r+7ImZ8OEx+ocfLO0WcvEuJl3cbipcPk47RBuJG/5DHS875bgO8B9iy5g/oV/cA4yWw3jBbbPEwsP7dGzHjw2HyCz1e3iPi5L1KvLzPULx8hHSMMRA3BoU8XnLO9xngPdiWOVmgX90PjJfAesNsscUjwPr3QMSMD4fJL/R4eb+Ikw8o8fJBQ/HyUdIx1kDcGBbyeMk5P2iA93BbxsyAfvUQMF4C6w2zxRaPAuvfwxEzPhwmv9Dj5UMiTj6sxMtHDMXLx0jHOANxY1TI4yXn/IgB3qNt6dMA/epRYLwE1htmiy0eA9a/xyJmfDhMfqHHy0dFnHxMiZePG4qXj5OO8QbixriQx0vO+XEDvMdb4qOPA/3qCWC8BNYbZo0tgPXvyYgZHw6TX+jx8gkRJ59U4uVTEa/KEQXbrC3QZk9FzMbKWLCDnU86OhuIlU9HsHUijcB1XkxpQ0K6UhbqgS4fNA95PBNJkH9Upk0VxDMRvN5ngUHNFO9nI3AbxUxW2mcj+IAs89jDqwjE7QnPRSqDrzzC7IAZQs/zpPMFwouElwgvE14hvEp4jfA64Q3Cm4Q1hLcIbxPeIbxLeI/wPuEDwoeEjwgfEz4hfEr4jPA54QvCl4SvCF8TviF8G6koJBnUeF5kMOPyC5r8oia/pMkva/IrmvyqJr+mya9r8hua/KYmr9HktzT5bU1+R5Pf1eT3NPl9Tf5Akz/U5I80+WNN/kSTP9XkzzT5c03+QpO/1OSvNPlrTf5Gk78VsnqgO51PA2Pq8wBdpWX8iLEXgPmaUEcPAEE4c1u8CCm/Cru+FFxXpig/9jLQFruH2RbZG/LJXgnGOaZwZq8G0ZVZpfzYa0BbTAynLWJaPtnrKXLOLduIM3sjNV3xBOXH3gTaYo+w2SKeMJ9sjX/OedVwZm/51ZVXbfmxt4G2mBQeW2TWkE/2jh/OeTVyZu8mr6u4lvJj7wFtMTkMtsirNZ/s/eQ4x5LgzD5IRlcsqfJjHwJtMWXT2iInyXyyj2rjnJ00Z/Zxjbqyy3yUH/sEaIupm8oWeb7yyT6tnnPcJ2f2WTW68st8lx/7HGiLaXVvi1gK+WRfJOIcS4kz+3JjXSzF8mNfAW2xZ13aoiTlfLKvq3LOCsCZfaPoyiwLVH7sW6At9rJk4g04PsCAz7dsInDibboltgA+BzFgP55NBtpihiW2APb3GLC/wqYBbTHTElsA2zUGjMtsOtAWswzZIg1sC6D/MmD9Y8jyMz1Xtw1O14a5uu8ok98TfiD8SPiJ8DPhF8Jawq+E3wi/E/4g/En4i/A34R/COsK/nCiRjxCihDRCA0JDQiNCY0I6oQmhKaEZoTmhRdSrMlf3nTaX870m/6DJP2ryT5r8syb/oslrNflXTf5Nk3/X5D80+U9N/kuT/9bkfzR5nSb/q8m8jFU5oslRTU7T5Aaa3FCTG2lyY01O1+QmmtxUk5tpcnNNbhE1P1en+kzQWPsdcK7ue+AzwyJL5up+AM7V/Qicq/sJaIt9LZmr+xk4V/cLcK5uLdAWiy2Zq/sVOFf3G3Cu7negLZZYMlf3B3Cu7k/gXN1fQFuUWzJX9zdwru4f4FzdOqAtlloyV/cvcK6O92Nr1ZXkXF0kirPFMkvm6qK1cfYxV5cWxc3VNQDaYj9L5uoaRnFzdY2iuLm6xkBbLLdkri49ipuraxLFzdU1Bdpif0vm6ppFcXN1zaO4uboWQFussGQcHDg+wIDPt2wxcBz8AEtsAXwOYsB+PFsKtMWBltgC2N9jwP4KWw60xUGW2ALYrjFgXGYHAG1xsCVzdUD/ZcD6xw62aK4ugtO1Ya6uJWW6FaE1oQ2hLaEdoT2hA2EzwuaELQhbEjoStiJsTdiG0InQmZBB6ELYlrAdYXtCV8IOhG6E7oQehJ6EHQk7EXpFvSpzdS2jVedyWmlya01uo8ltNbmdJrfX5A6avJkmb67JW2jylprcUZO30uStNXkbTe6kyZ01OUOTu2jytpq8nSZvr8ldNXkHTe6myd01uYcm99TkHTV5J03uFTU/V6f6TNBY2xLQz5dzda2AzwwnWjJX1xpSfhV2bRNc14a5urZAW5xkyVxdu2Ccq8zVtQ+iS5ur6wC0xcmWzNVtliLnRHN1m6emK+Fc3RZAW5xiyVzdlv45VztX19Gvrhrm6rYC2uJUS+bqtvbDuZa5um2S11XrXF0noC1Os2SurnNynJOaq8tIRleSc3VdgLY43ZK5um1r4+xjrm67KG6ubnugLc6wZK6uaxQ3V7dDFDdX1w1oizMtmavrHsXN1fWI4ubqegJtcZYlc3U7RnFzdTtFcXN1vYC2ONuScXDg+AADPt+yk4Hj4OdYYgvgcxAD9uPZaUBbnGuJLYD9PQbsr7AzgbY4zxJbANs1BozL7BygLc63ZK4O6L8MWP/Y+RbN1XXC6dowV7czZXoXAs88I2QSsgjZhBxCLiGPECfkE3oT+hD6EvoR+hMG8P4PYSBhEGEwYQhhKGEYYThhBGEkYRRhNGEMYWzUqzJXx/OizuXsoskxTWaanKnJWZqcrck5mpyryXmaHNfkfE3urcl9NLmvJvfT5P6aPECTCzR5oCYP0uTBmjxEk4dq8jBNHq7JIzR5pCaP0uTRmjxGk8dGzc/VqT4TNNbuDOjny7m6XYDPDNdbMlcXg5RfhV1ZcF0b5uoygba4wZK5uqxgnKvM1WUH0aXN1eUAbbHKkrm63BQ5J5qry0tNV8K5ujjQFjdaMleX759ztXN1vf3qqmGurg/QFqstmavr64dzLXN1/ZLXVetcXX+gLW6yZK5uQHKck5qrK0hGV5JzdQOBtrjZkrm6QbVx9jFXNziKm6sbArTFLZbM1Q2N4ubqhkVxc3XDgba41ZK5uhFR3FzdyChurm4U0Ba3WTJXNzqKm6sbE8XN1Y0F2uJ2S8bBgeMDDPh8y1YBx8HvsMQWwOcgBuzHs5uAtrjTElsA+3sM2F9htwJtcZcltgC2awwYl9kdQFvcbclcHdB/GbD+sbsNztV13rgMWSzAsVi3RwBtSza2bcrayr0EZZiitqVeQnukpG2ZV41tU9C2n1dtPfGtbblXQ53zqW1/r8b660vbCq8WX/Ch7QCvVr9KWtuBXhI+mqS2g5LRlaS2g5PTlZS2/yWrKwltK5PXVau2Q/zoqkXbof501ajtML+6atB2uH9d1Wo7IhVd1Wg7MjVdCbUdlaquBNqOTl3XRtqOCaJL03ZsMF1VtB0XVJei7fjgujZoOwGhS2g7EaNrvbaTULr4elucrg1rksZR52w8YVfCboQJhN0JEwl7ECYRJhOmEKYSphH2JOxFmE6YQZhJmEUoJBQRigklhFJCGWE2YQ5hLmFvwj6EeYT5BHVNEs+LumZlvCbvqsm7afIETd5dkydq8h6aPEmTJ2vyFE2eqsnTNHlPTd5Lk6dr8gxNnqnJszS5UJOLNLlYk0s0uVSTyzR5tibP0eS5mry3Ju+jyfM0eX40qTVJ//lng6DPuk/X9bjDf/gZJqgtntk0Y0D/yWetoLZ4dlOOx/3HngmD2uK5TT82+p95dg1qi+fDMk79H3jGDmqLF8I1Z2D1WEBQW7wYxvkbS8csgtripfDOpVk3thLUFi+HfV7TojGgoLZ4xZI55pOBnPm4UFBdci/Q+CguX69ashdoV0j5Vdh1t+C6NuwFmgC0xWuW7AXaPRjnKnuBJgbRpe0F2gNoi9ct2Qs0KUXOifYCTU5NV8K9QFOAtnjDkr1AU/1zrnYv0DS/umrYC7Qn0BZvWrIXaC8/nGvZCzQ9eV217gWaAbTFGkv2As1MjnNSe4FmJaMryb1AhUBbvGXJXqCi2jj72AtUXKMuf3uBSoC2eNuSvUCl1XP2vReorBpdqewFmg20xTuW7AWak4hzinuB5m6sK+W9QHsDbfGuJXuB9qnKOdBeoHmKrqB7geYDbfGeJWMgwHl5BpxXZs8C19m/b4ktgPOPDDh/xl4A2uIDS2wBnGdhwHkC9jLQFh9aYgvgeDIDjoey14C2+MgSWwDHzRhw3Ie9CbTFx5bYAjg+wIDPt+xtoC0+scQWwOcgBuzHs/eAtvjUElsA+3sM2F9hHwJt8ZkltgC2awwYl9knQFt8bsk+XqD/MmD9Y8jyi3pVD/Q7d5+L4PKaIfQsoEwvJCwi7EtYTFhCKCcsJSwj7EdYTtifsIJwAOFAwkGEgwn/I6wkHEI4lHAY4XDCEYQjCUcRjiYcQziWcBzheMIJUa/K/haeF3X/w0JNXqTJ+2ryYk1eosnlmrxUk5dp8n6avFyT99fkFZp8gCYfqMkHafLBmvw/TV6pyYdo8qGafJgmH67JR2jykZp8lCYfrcnHaPKxmnycJh+vySdEzb9zV/WZoLF2AWCMTq6zWQgc72vU2I51Nosg5Vdh132D69qwzmYx0BaNw2wLZZ3NkmCcq6yzKQ+iS1tnsxRoi/Rw2mKjdTbLUuScaJ3NfqnpSrjOZjnQFk3CZotq1tns759ztetsVvjVVcM6mwOAtmgaHlvUuM7mQD+ca1lnc1DyumpdZ3Mw0BbNwmCLJNbZ/C85zkmts1mZjK4k19kcArRF801ri6TX2RxaG2cf62wOi+LW2RwOtEWLTWULn+tsjoji1tkcGcWtszkKaIuWdW+LlNbZHB3FrbM5JopbZ3Ms0Bat6tIWAdbZHBfFrbM5PopbZ3MC0Bat68gWsWAHA44PMODzLVOfz4Laoo0ltgA+BzFgP541A9qirSW2APb3GLC/wloCbdHOElsA2zUGjMusDdAW7Q3ZAj1XB/RfBqx/DFl+EVGHHxT6vo1UzEV8I9KvRfqVSL8U6Rci/Vykn4n0U5F+ItKPRfqRSD8U6QcifV+k74n0XZG+I9K3RfqWSNeI9E2RviHS10X6mkhfFekrIn1ZpC+J9EWRviDS50XaQszFNBdpM5E2FWkTkaaLtLFIG4m0oUgbiDRNpFE55yNST6T/ivuuE+k/Iv1bpH+J9E+R/iHS30X6m0h/Felakf4i0p9F+pNIfxTpDyL9XqTfibSXyNdOIt1RpD1F2kOk3UXaTaQ7iLSrSLcX6XYi3VakXUSaIdLOIu0k0m1EurVItxJpR5FuKdItRLq5SDcTaQeRthdpO5G2FWkbkbYWaSuRthSp/P6l/C6m/F6m/I6m/L6m/O6m/B6n/E6n/H6n/K6n/N6n/A6o/D5ogUjl90Tld0bl90fld0nl90rld0zl903ld0/l91Dld1Ll91Pld1Xl91bld1jl91nld1vl91zld17lu/bkO/jku/nkO/vku/zkO/7ku//kOwHluwLlOwTluwXlOwfluwhniVS+u1C+01C+61C+A1G+G1G+M1G+S1G+Y1G+e1G+k1G+q1G+w1G+21G+81G+C1K+I1K+O1K+U1LOxco5Wjl3K+d05VyvnAOWc8NyzljOJcs5Zjn3LOek5Vy1nMOWc9tyzlvOhcs5cjl3LufU5Vy7nIOXc/Nyzl7O5cs5fjn3L9cEyLUCcg2BXFsg1xycSOlJhJMJpxBOJZxGOJ1wBuFMwlmEswnnEM4lnEc4n3AB4ULCRYSLCZcQLiVcRriccAXhSsJVhKsJ1xCuJVxHuJ5wA6GhV9EeybZcPdDrSCKemX4I+r313CZV8hlA20nRjTinrO3kaILyS1HbKdGEtkhJ26nRauyagrbTotXWEd/aTo/WUN98ajsjWmPd9aXtzGgtfuBD21nRWn0qaW1nR5PwzyS1nZOMriS1nZucrqS0nZesriS0nZ+8rlq1XeBHVy3aLvSnq0ZtF/nVVYO2i/3rqlbbJanoqkbbpanpSqjtslR1JdB2eeq6NtJ2RRBdmrYrg+mqou2qoLoUbVcH17VB2zUIXULbtRhd67Vdh9JF2q6PmumPofuNPXC6YhElj23E36uoHG4krCbcRLiZcAvhVsJthNsJdxDuJNxFuJtwD+Fewn2E+6OVnDccKPJRTS+6cFcBK0FroecB0vkg4SHCw4RHCI8SHiM8TniC8CThKcLThGcIzxKeIzwfXT9Ws2Gx7gOicKX8oCY/pMkPa/IjmvyoJj+myY9r8hOa/KQmP6XJT2vyM5r8rCY/p8nPJ6hM6EFv1eZBB5cfAOiqWJxcVvYgMF/bW7A4mY6Sh3Dll/8wThd7BGiLrlbYopQ9Ciu/YvYYTFecPQ60xQ5W2CLGnkCVX2mMPYnSVRxjTwFt0c0GW8Rj7GlU+fEXpoB0lfIXpgBt0d0CWxTzjUWg8ovzF6YAHya2B05Y97Bk8QCwXWPAuMy6AW3R05LFA0D/ZcD6x9DlF9k4ngRa5MgnO+QzlqY3UL3JNM870ELRkwzxzqoL3gEWBZ9siHd23fBOeWH1KYZ459QV7xQXp59qiHdu3fFOaSPCaYZ459Uh71Q2c5xuiHe8bnn73hBzhiHe+XXN2+fmpzMN8e5d57z9bSA7yxDvPpuCt49NeGcb4t130/BOesPlOYZ499tUvJPctHquId79Nx3vpDb+nmeI94BNyTuJTd7nG+JdsGl517pR/gJDvAduat61vGzgQkO8B2163jW+WOIiQ7wHh4F3DS/nuNgQ7yHh4F3tC04uMcR7aFh4V/Mym0sN8R4WHt4JXwh0mSHew0PEO9FLlS43xHtEuHhv9AKtKwzxHhk23tpLyK40xHtU+HhXeZHbVYZ4jw4jb+WlfVcb4j0mnLw3vPjwGkO8x4aWd8XLI681xHtciHnz9TfXGeI9PqS8Zf6uN8R7V8O8Y8EOdqMh3rvV3VqO//ymv6C2mFDX62r+w5sTg9pi902zxuk/uYkyqC0mbsr1Zv+xzZ5BbbHHpl/795/ZlBrUFpPCsg7zP7B5NqgtJodrTazVm3yD2mJKGNcnW7oZOagtpoZ3rbh1m6aD2mJa2NftW7S5O6gt9rRkDwVwEzoDrjlnWcA9FHtZYgvgGm4GXBfNcoG2mG6JLYDrjBlw7S7LB9pihiW2AK6FZcD1pawv0BYzLbEFcL0mA66BZAOAtphliS2AawoZcJ0eGwS0RaEltgCue2PAtWRsKNAWRZbYArg2iwHXO7ERQFsUW2IL4PohBlyTw0YDbVFiiS2Aa1wYcN0IGwe0RakltgCuw2DAtQ1sN6AtyiyxBXBengHnldlEoC1mW2IL4PwjA86fsclAW8yxxBbAeRYGnCdg04C2mGuJLYDjyQw4HsqmA22xtyW2AI6bMeC4D5sFtMU+ltgCOD7AgM+3rBhoi3mW2AL4HMSA/XhWBrTFfEtsAezvMWB/hc0F2mKBJbYAtmsMGJfZPKAtFtaRLYLm8wXgfDcwFjBgXWYLLfGLG4HrLTKBdRm59mCVJX6B7Mcj+8ergPm60RJbzDQ0l4mciwuqa7UltigyNGeDnHMIqusmS2xRGs6xaXYjMF83W2KLF4H9KGAsYMC6zJC24Ps6m3gV31bhB++HrqP0RZHy4yXxT/TeUv5hnQej+L2ld4Z8LzHn/JIB3ndZ0r9+Cdi/fhno78B6w2yxxWqgLV6JmvHhMPmFHi9fFnHyFSVevmooXvKPkD1kIG7cG/J4yTm/aoD3fZb46KtAv3oNGC+B9YbZYoubgLZ4PWrGh8PkF3q8fE3EydeVePmGoXjJP9j4sIG48WDI4yXn/IYB3g9Z4qNvAP3qTWC8BNYbZostbgbaYk3UjA+HyS/0ePmmiJNrlHj5lqF4yT9u+4iBuPFoyOMl5/yWAd6PWeKjbwH96m1gvATWG2aLLW4B2uKdqBkfDpNf6PHybREn31Hi5buG4iX/EPijBuLGkyGPl5zzuwZ4P2WJj74L9Kv3gPESWG+YLba4FWiL96NmfDhMfqHHy/dEnHxfiZcfGIqXt5HexwzEjWdDHi855w8M8H7OEh/9AOhXHwLjJbDeMFtscRvQFh9FzfhwmPxCj5cfijj5kRIvPzYUL28nvY8biBsvhjxecs4fG+D9kiU++jHQrz4BxktgvWG22OJ2oC0+jZrx4TD5hR4vPxFx8lMlXn5mKF7eQXqfMBA3Xg15vOScPzPA+zVLfPQzoF99DoyXwHrDbLHFHUBbfBE148Nh8gs9Xn4u4uQXSrz80lC8vJP0PmkgbrwZ8njJOX9pgPcaS3z0S6BffQWMl8B6w2yxxZ1AW3wdNePDYfILPV5+JeLk10q8/MZQvLyL9D5lIG68E/J4yTl/Y4D3u5b46DdAv/oWGC+B9YbZYou7gLb4LmrGh8PkF3q8/FbEye+UePm9oXh5N+l92kDc+CDk8ZJz/t4A7w8t8dHvgX71AzBeAusNs8UWdwNt8WPUjA+HyS/0ePmDiJM/KvHyJ0Px8h7S+4yBuPFJyOMl5/yTAd6fWuKjPwH96mdgvATWG2aLLe4B2uKXqBkfDpNf6PHyZxEnf1Hi5VpD8fJe0vusgbjxRcjjJee81gDvLy3x0bVAv/oVGC+B9YbZYot7gbb4LWrGh8PkF3q8/FXEyd+UePm7oXh5H+l9zkDc+Cbk8ZJz/t0A728t8dHfgX71BzBeAusNs8UW9wFt8WfUjA+HyS/0ePmHiJN/KvHyL0Px8n7S+7yBuPFDyOMl5/yXAd4/WuKjfwH96m9gvATWG2aLLe4H2uKfqBkfDpNf6PHybxEn/1Hi5bqoV+WIajYLyqc50P7ronbUU+T3ik199yfweJYlMWMisPxMffcnqC3WWmKLycDyM/Xdn8BjSJbYYhqw/JDf/fkFaIvfLHlP7b/A9gIYCxiwLrPfDPRr0oS+f0V/podXka4SckNPOUkcev8mFuxgvYD1IJKGy1dEUOc6M0RZNFT4JzpA986MJLgP+nm8m4f3bXQeu3vYOr+hDqdV5hVtPMYrSSMBz7ARI56ZAI0qk8zCkqycnPxsk2UQTTNTBnBbWZLPBl6465Q8Igr/JuLvNCrjBoSGhEaExoR0QhNCU0Iz045PjXTCFgJupLRQG4nJP9SyaC56Ei1MGkE22/xm72n3SDNohBS7Lpmi68Kap+G6QS0MVQ501w/JuWUCXUWx4pIcVpRbksdKC3PixcX5WYxlFuYW5hZlxstKi3JYPCdOOosLM+N0u8zCYlYaK8wt5Y6c7iWopB7ekVum4SMiP1qZdDJTBaFmGqW3NbCSmeLdOg1uIyNzWS1EXlGBQOpF2qgN2KG4abjOLl7F819dtfCNLWzh24p63K4uWvi2ooWXcjvxoK4e6Ba/MbDFbwus9O0safGRnNtb2uK3N9Tid7CtxecF0cFAi79ZyFt8znszS1r8diKv6BYfaaPNDbT4m2+CFj893C2+PDLVsthC1OMt66LF5zf7R7sHuoVPB1TM0rKKYwtgJd/SkhYeybmjoovFszIz87L4efGSGMsuKc6MZ2aWFGXHimOFxZml+dksvyw7MzuruKS4iHQWsrJYWWFxflm8Il912cJ3NNTCb2VbC88LYisDLfzWIW/hOe+tLWnhtxR5RevdxkCrvI3oidRlq9zEwla5k6h7neuiVe4kWmUpJ7opupVuAmylOwGDSWdLWmkk5wxLW+kMQ610F9taaV4QXQy00tuGvJXmvLe1pJXuLPKK1rudgVZ6u03QSje1cLR8e1H3utZFK729NlretQ5Gy5sCR8u3BwaTrpa00kjOO1g6Wr6DoVa6m22tNC+IbgZa6e4hb6U57+6WtNJdRV7Ro+VIG/Uw0OL3EKPl6oEOhhGgndIMNQDout8CYPfinMziwsLckppsE6Z197Y0zlGgTzazpD7W1SRE0PIELmFmnS3hDNwKwBo5yLmhJXEnAow7PdOw7TPvC/RM8GCJ7mftCMi33Jqi7/Hnuvnet55eRdqUsFNa5TaDaLSS0zolbadd10D+X/we1f5fn9an9Wl9Wp/Wp/VpfVqf1qf1aX1an9an9al96Y6EXso4gZyykuMDO4nn/14ibUvYWZnX4gd6rEjVFXTMZRdbxseAnGO2zEUAOTNLOKcBOWdawrkBkHOWJZwbAjlnW8J5JyDnHEs49wRyznWQc56DnOMOcs53kHNvBzn3cZBzXwc593OQc38HOQ9wkHOBg5wHOsh5kIOcBzvIeYiDnIc6yHmYg5yHO8h5hIOcRzrIeZSDnEc7yHmMg5zHOsh5nIOcxzvIeVcHOe/mIOcJDnLe3UHOEx3kvIeDnCc5yHmyg5ynOMh5qoOcpznIeU8HOe/lIOfpDnKe4SDnmQ5ynuUg50IHORc5yLnYQc4lDnIudZBzmYOcZzvIeY6DnOc6yHlvBznv4yDneQ5ynu8g5wUOcl7oIOdFDnLe10HOix3kvMRBzuUOcl7qIOdlDnLez0HOyx3kvL+DnFc4yPkABzkf6CDngxzkfLCDnP/nIOeVDnI+xEHOhzrI+TAHOR/uIOcjHOR8pIOcj3KQ89EOcj7GQc7HOsj5OAc5H+8g5xMc5Hyig5xPcpDzyQ5yPsVBzqc6yPk0Bzmf7iDnMxzkfKaDnM9ykPPZDnI+x0HO5zrI+TwHOZ/vIOcLHOR8oYOcL3KQ88UOcr7EQc6XOsj5Mgc5X+4g5ysc5Hylg5yvcpDz1Q5yvsZBztc6yPk6Bzlf7yDnGxzkvMpBzjc6yHm1g5xvcpDzzQ5yvsVBzrc6yPk2Bznf7iDnOxzkfKeDnO9ykPPdDnK+x0HO9zrI+T4HOd/vIOcHHOT8oIOcH3KQ88MOcn7EQc6POsj5MQc5P+4g5ycc5Pykg5yfcpDz0w5yfsZBzs86yPk5Bzk/7yDnFxzk/KKDnF9ykPPLDnJ+xUHOrzrI+TUHOb/uIOc3HOT8poOc1zjI+S0HOb/tIOd3HOT8roOc33OQ8/sOcv7AQc4fOsj5Iwc5f+wg508c5Pypg5w/c5Dz5w5y/sJBzl86yPkrBzl/7SDnbxzk/K2DnL9zkPP3DnL+wUHOPzrI+ScHOf/sIOdfHOS81kHOvzrI+TcHOf/uIOc/HOT8p4Oc/3KQ898Ocv7HQc7rHOT8r4OcvQbucY44yDnqIOc0Bzk3cJBzQwc5N3KQc2MHOac7yLmJg5ybOsi5mYOcmzvIuYWDnFs6yLmVg5xbO8i5jYOc2zrIuZ2DnNs7yLmDg5w3c5Dz5g5y3sJBzls6yLmjJZy9NBznrSzh3Ato560drNvbOMi5k4OcOzvIOcNBzl0c5Lytg5y3c5Dz9g5y7uog5x0c5NzNQc7dHeTcw0HOPR3kvKODnHdykHMvBznv7CDnXRzkHHOQM3OQc6aDnLMc5JztIOccBznnOsg5z0HOcQc55zvIubeDnPs4yLmvg5z7Oci5v4OcBzjIucBBzgMd5DzIQc6DHeQ8xEHOQx3kPMxBzsMd5DzCQc4jHeQ8ykHOox3kPMZBzmMd5DzOQc7jHeS8q4Ocd3OQ8wQHOe/uIOeJDnLew0HOkxzkPNlBzlMc5DzVQc7THOS8p4Oc93KQ83QHOc9wkPNMBznPcpBzoYOciyzhvDPw/STFDtq5xEHOpQ5yLnOQ82wHOc9xkPNcBznv7SDnfRzkPM9BzvMd5LzAQc4LHeS8yEHO+zrIebGDnJc4yLncQc5LHeS8zEHO+znIebmDnPe3hPMOQM4rbLEzcHz7AAfr9oEOcj7IQc4HO8j5fw5yXukg50Mc5Hyog5wPc5Dz4Q5yPsJBzkc6yPkoBzkf7SDnYxzkfKyDnI9zkPPxDnI+wUHOJzrI+SQHOZ/sIOdTHOR8qoOcT3OQ8+kOcj7DQc5nOsj5LAc5n+0g53Mc5Hyug5zPc5Dz+Q5yvsBBzhc6yPkiBzlf7CDnSxzkfKmDnC9zkPPlDnK+wkHOVzrI+SoHOV/tIOdrHOR8rYOcr3OQ8/UOcr7BQc6rHOR8o4OcVzvI+SYHOd/sIOdbHOR8q4Ocb3OQ8+0Ocr7DQc53Osj5Lgc53+0g53sc5Hyvg5zvc5Dz/Q5yfsBBzg86yPkhBzk/7CDnRxzk/KiDnB9zkPPjDnJ+wkHOTzrI+SkHOT/tIOdnHOT8rIOcn3OQ8/MOcn7BQc4vOsj5JQc5v+wg51cc5Pyqg5xfc5Dz6w5yfsMSzo2AnN+0hHNjIOc1lnBOB3J+yxLOTYCc37aEc1Mg53cs4dwMyPldSzg3B3J+zxLOLYCc37eEc0sg5w8s4dwKyPlDSzi3BnL+yBLObYCcP7aEc1sg508s4dwOyPlTSzi3B3L+zBLOHYCcP7eE82ZAzl9YwnlzIOcvLeG8BZDzV5Zw3hLI+WtLOHcEcv7GEs5bATl/awnnrYGcv7OE8zZAzt9bwrkTkPMPlnDuDOT8oyWcM4Ccf7KEcxcg558t4bwtkPMvlnDeDsh5rSWctwdy/tUSzl2BnH8Dco6QjgZCV0+Ff0SUQZr4f0MCn0/m86t8vpHPv/H5KD4/w+cr+Pg9H8/m47t8vJOP//HxMD4+xMdL+PgBf57mz5f8eYs/f/D+OO+f8v4a77/w9py3bxkEHv94POD+wesLLz/+neFuhO6EHkpen4pUpLtQZmMERsgkZBGyCTmEXEIeIU7IJ/Qm9CH0JfQj9CcM4N/0JQwkDCIMJgwhDCUMIwwnjCCMJIwijCaMIYwljCOMJ+xK2I0wgbA7YSJhD8IkwmTCFMJUwjTCnoS9CNMJMwgzCbMIhYQiQjGhhFBKKCPMJswhzCXsTdiHMI8wn7CAsJCwiLAvYTFhCaGcsJSwjLAfYTlhf8IKwgGEAwkHEQ4m/I+wknAI4VDCYYTDCUcQjiQcRTiacAzhWMJxhOMJJxBOJJxEOJlwCuFUwmmE0wlnEM4knEU4m3AO4VzCeYTzCRcQLiRcRLiYcAnhUsJlhMsJVxCuJFxFuJpwDeFawnWE6wk3EFYRbiSsJtxEuJlwC+FWwm2E2wl3EO4k3EW4m3AP4V7CfYT7CQ8QHiQ8RHiY8AjhUcJjhMcJTxCeJDxFeJrwDOFZwnOE5wkvEF4kvER4mfAK4VXCa4TXCW8Q3iSsIbxFeJvwDuFdwnuE9wkfED4kfET4mPAJ4VPCZ4TPCV8QviR8Rfia8A3hW8J3hO8JPxB+JPxE+JnwC2Et4VfCb4TfCX8Q/iT8Rfib8A9hHeHftApnjxCihDRCA0JDQiNCY0I6oQmhKaEZoTmhBaEloRWhNaENoS2hHaE9oQNhM8LmhC0IWxI6ErYibE3YhtCJ0JmQQehC2JawHWF7QlfCDoRuhO6EHoSehB0JOxF6EXYm7EKIERghk5BFyCbkEHIJeYQ4IZ/Qm9CH0JfQj9CfMIDHVcJAwiDCYMIQwlDCMMJwwgjCSMIowmjCGMJYwjjCeMKuhN0IEwi7EyYS9iBMIkwmTCFMJUwj7EnYizCdMIMwkzCLUEgoIhQTSgilhDLCbMIcwlzC3oR9CPMI8wkLCAsJiwj7EhYTlhDKCUsJywj7EZYT+Hfl+XfW+XfH+Xe4+Xep+Xea+XeL+Xd8+Xdt+Xde+XdP+XdA+Xcx+Xci+XcT+XcE+Xf1+Hfm+HfX+HfI+He5+Heq+Heb+HeM+Hd9+Hdu+Hdf+HdQ+HdB+Hcy+Hcj+HcU+HcF+Hv2+Xvn+XvY+XvJ+Xu6+Xur+Xuc+XuN+Xt++Xtv+Xtg+XtR+XtC+Xsz+Xsk+XsV+XsG+Xv3+Hvo+HvZ+HvK+Hu7+Hus+Hud+HuO+Ht/+Htw+Hth+HtS+HtD+Hs0+Hsl+HsW+HsH+D58vi+d79Pm+5b5Pl6+r5Xv8+T7Hvk+QL4vju8T4/um+D4ivq+G7zPh+y74PgS+Lp+vU+frtvk6Zr6ul69z5es++TpIvi6Qr5Pj68b4Oiq+roivs+HrTvg6DL4ugc/T83lrPo/L5zX5PB+f9+LzQHxehM8T8HFzPo7Mx1X5OCMfd+PjUHxcho9T8Od2/hzLn+v4cw7v9/N+MO8X8n4S7zfcr7Sb7ZS/txZpYXl56fxF5RnlCzMKS0oy9ptbPidj4bLSxWXzFu7H/3+qcs1WIi0unDdv/QVLlpQuLp85v3D5zKK55TOXzF1Ryv99uv9LLvB/yUX+L7nU/yWX+7/kBv+X3Oj/ktv8X3KH/0vu8X/Jff4vedz/JU/6v+QZ/5c85/+S1/1f8qb/S97zf8kH/i/5yv8l3/i/ZK3/S37zf8mf/i/52/8lDSO+L2ns/5IW/i9p5f+Sdv4v6eD/kk7+L8nwf8l2/i/p6v+Snf1fEvN/Sa7/S+L+LxmiXLKDSHddWjRvbnFGSWF5YcaSeQvLM0oWli5Z0K08Y35hefEc3ndYULpkCT9zaKCrhwW6elq08uqu8urFC5fNXTA7Y1GFlmWF85aWZsxdUDxv6ZK5CxdklBXOnVdawk/cK+q7pPhTgzzai3Qs5aVwdmnGAsro3AUZS8oLy9efO1o5N9ke2FE+r+GFd5TGnx9binTg4sWF+1OuSkqXZyxcWp6xsCyjaOHSBSVL1At3SvXCrFQv7J3qhUNSvbBjJPWCVcOWr5tun+qFg1LI7QnivHGVl64faNOuXbK0qHxxYXF59QomKgrkU8TIxPmVl0z2fBKVF073f69Zqd5rsee/UE8S5/VLPp/ykgK/+ZQXjg2Qz93853NiqvksSSGf54jzdlWu9VVJpYJJyROVl0z1S1ReONP/vYpSvVe5579QLxbn+aik8pICv/mUF6ZSSeW1PiqpvMR3JZUXplJJrxHnpVxJpQIflVRe4ruSygt9VFJ5ie9KKi9MpZKuDlqoq/0X6upUC3W1/0JdnWqhrg5QqHeK83x4vrykwG8+5YWpeL681ofny0t8e768MBXPf1icl3IllQp8VFJ5ie9KKi/0UUnlJb4rqbwwlUr6lDjPRyWVlxT4zae8MJVKKq/1UUnlJb4rqbwwlUr6sjgv5UoqFfiopPIS35VUXuijkspLfFdSeWEqlXRN0EJd479Q16RaqGv8F+qaVAt1TYBC/VScl/IjqVTg45FUXuL7kVRe6OORVF4yK9V7pfJI+rk4z0c4lZcU+M2nvDCVcCqv9RFO5SW+w6m8MJVw+qM4L2XPlwp8eL68xLfnywt9eL68xLfnywtT8fzfxXk+Kqm8pMBvPuWFqVRSea2PSiov8V1J5YWpVNKIGBBMuZJKBT4qqbzEdyWVF/qopPIS35VUXphKJU0PWqjp/gs1PdVCTfdfqOmpFmp6gEJtLa714fnykgK/+ZQXpuL58lofni8v8e358sJUPL9j0Era0X8l7ZhqJe3ov5J2TLWSdgxQSbv4r6RdUq2kXQJU0i7+K2mXVCtplwCVtGfQStrTfyXtmWol7em/kvZMtZL2DFBJWdBCZf4LlaVaqMx/obJUC5WlWqhNxEmjhIJ0RUGBB9p3Ec8sa6QoV9YYVMryxiLN8Cr2Wmw4V/zOf0sTP0XEb3yPRkev8v9R7T7rrxG/pSm/NRC/NVB+ayh+a6j81kj81kjJShN4GcXyuN6maL2xzDjX2xyut2IvTQuvsrwKlPs0Vcqqpfg7grs3U+8dEZD3kb83UP7eUjlXnifLo7H4u7lyfTPxd8sarmuiXddSOadZAv4FHpZ/cy0/aj740VD5m+9Pkn7RS8lbY3jeMkuaeZX+4ynl52n5lUdjJT+N4PmpeI/gFkLX7NLyiqVUQwrLCycuLi2dXLFyKqLkU+a9l5b3iFeVxzrlHDWmqX+nJfgtQ7k+XTmnwMPWj0bKPQsUWd4v3au67w9075ipehXxKpsJGW9k/uX9GijnyLVzrb2ND1WXzKe0u9TZQisrmeK5VbzTFN6miDJrqpWZzH8TpczkOb1qKbOm1ZRZY6XMZFmpbQCeWyyT621mqMyaa2Um899MKTN5TnYtZda8mjJropSZLKvmSpnhucWy0r3KNhGnt6LMWmpl1kzhJ8tMntOnljJrWU2ZqTr19i6q3Evt70S9jfsG68Tvug5+vpkyimVzva3geivKXpajLHuZf3m/Bso5Q0VaXdmrvxd4lWXfQklbajrMcItlNkuQz5r6Eq2U/LSF5ycz3ky5RzL5aavkpw08PxXtBp5nRRsuH1bXAfXysmqvlVUrraxaKue0U8qvvYHyiyj3lbqlLO9Xn+f6PNfnuT7P9Xmuz3N9nuvzXJ/n+jzX57k+z/V5rs9zfZ7r81yf5/o81+e5Ps/1ea7Pc32e6/NcUJ/n+jzX5zmlPPP8yPlemddmynmtQ5JH+VsbJY9yHWlUpHze/DclvwbWXax/s1kr5X4FSj7UdRfynDaRynP/Us5rpZVvM69yrYVa5gbW8awvc3kvqVvK6hqZFkreZH5aG8pPCy0/LRKUj/w7LUGZpSu/SQ5Nld9kvVHXi8o61Vz5Tfqk6gvtlTKRv0UT5E/Nl0xl3VDXM8n1HWpdlmsF2yq/yTVe7ZTfJM/2il6b65OB/OQkyo9uh4hSvo20c9Q1Z/KcrSJVy1I9zKzrrFhnJOuIvsYrquRRntO5hjyqumQ+E63xknzbmOUWV+O+HkdVbvKcrrWUf1sDeTTDvcJf2ikcC7xK31C5y3N6Km3ITuJv1b/V9qhPgv/LI6LJBcrfbZWy7IDnvH4d0mZKPguU+6j33lzJK+jeTL23XFMu7yN/b6D83TtSea48T5aHLGuZd243GYvVvOvXNdOua6mc0z4B/wIPy7+Dlp8OWp65TXZR6pmsR6bW0SXqK6txV5aRPEfds2BgrShT2wOpW+/XqX0/vc1Q18PLcwbXELPUfrfaX9DbcTOxrYJvK41vomeVDf1YJY86Z7XfvVTJt4fOdzyWVdO+Nj/71xqr12j61L07EUVdQzSfWKapvRvr9abD9caY2leVR03tiuTG61EHpYz5RVJPhlLGBtbgxxLtL2im5U+NK+i2p7miV33Wkb+rexs6Kufqz0SyvNT+mtq/9kT5yueeJgq3ZPS1VM5pmqBcCry6eWZQ9zi2VPJhqi+mx6p0pSzN3bvCR5sY0mvAj9b7vrofiR81+b7kJn0/TblI6slQytjAvs1YovGallr+1HENtO+3UvRGvI3H2tT+wi7KufqeEFle6r4aGTPkuVFv49iSnqQ+tT/SIkG5FHjYcmmp5Uff38JttZ2SD1N7NquLQeo+RBPxT+2XyKMmX2qRID/AuhprqeRHvZeJvdTym47JclfrqLpnXM9jBi6PMbWfq+6z62f0vpkb7fHPSJAPdZ/9UOXcgUrZyPZKHZPU90Y3S3CeHE9MFEfUWFYA4Vs1FsgY2UrhIfnKc0YpfBcoecPbgpWptogI3aoNPG/jZ8IML7G95DnjRZromTCagHuBV7XvJtswtU2TZdBGyVMBpAwq7NNa4aHmpY3yuzxnjxr4qbp0Ho0T6JqSpC7Pq9qfVctQn0eoKQ9R5Zy2Sn7Ua1TO8pwZ2j30fLat5n5NEugqTFKX51Vtx1XO8tq2ynVqf0NtQ9RxhnbK+QXi71iwo8r8nvRvfY5F5T9HpLys5ifIf8Nq8q+2X+qeVBMxS22HWiXIr/nYtPGcWYa3cdypKTYlmqtcopWpejRLcK3aHs5W+MqjwDMz7hNJkDfpu141YzwRbYxHHfeR9aZNgvPSFd4FHvYZrZEhvSbel+H3HTNqLNbHfaSeDKWM8e9hqnj2k/15GXubavnj91bHZ0D3rvJsIeOeOs/MjwbK3+q4T3Xvr5B5V9/5Ic/l5as+z8o0GX1qPGuSoFwKPGy56O800d/FUVfjPvp4f2OlLOW9TcyXV4lX4khmHEXND/IdAS2V/Kj3MuCTTF3DkAx3tY6mJ8hjGMa5miXID9A+6/sbTRPcy8Q75tTnRNUfexktc7Y+VjdR7lfgbbyepoFyTlw5l4m/1fULUeU31Z+lPvm32kdopF3brJprZb7k+fKZuYl2faL2J03hIvWanndooOVF7fvJc/qLtLZ3Kuk8GiXQNTBJXZ5XtT1Sx59kXtX2TW8/12nnqj7bsobrVL38aKJdo8ZDdbxJHQuRKb59qPAFfXw0Tcuras9G2jnquIM8Z5xIq7OJXk9rGueoqT7JcybUcr/qxuQbJdBV25iCPo8t65M6Vq6vlYl6G787sqb6VNN16r34oT8bqm2XmqeW2n3U51VY+8FiMTVPav7V/CV6H1pdvUdTr7c11W01pslzSkVa3XNrTe3ZQQpfD813E65XkDxlqo/zNlD+v59ynloX8c+nzNC6BBYz2VdXnxP0Mva8qn1ByS3Rc6/Uo4651fV7gtW2KwzvCd5GOTeZ9wTr85a8fPV4nZ6kvjC+P9jsutuKfDTR8qH3W83cu8JHmxrSa2Kswu8aWnUsXl/vkGgtvoH3N8Zqmt9Q/cP0XJH0/TYab3V+J1M5V1+brvfX1Lkcea7al1Hng5PR19LbeE+IWi4FHrZcqltrqa7v30HJh6n1DtXFIHW9g6k5fz/rHVomyI+p9Q7qvQz45HruLbzkuat1tIXyt57HDFweY+r4vv5sZu6+VZ915XoHPR/q/P9w5dwh4u/q1jsk2h+4QrkmUeyo63VgidYIjFHyu0jJmwG7l+nrLzK8jdcWqPmV84iJbCTPkZ8Kqm6Ng869wKvaX5P1Tr2nLAN1LrkAUwZMbS8aaHlR1wHIcybXwE/VpfNIT6BrWpK6PK9qH1Zdqyfz2iaJPKhjk+oeJPUalbM8Z5Z2Xz2f7aq5X9MEuoqT1OV5VdtulbPMq7pmQe1jqO2G2qdW92oXiL9jwY4q+7mkf7fX8qzy31ukvKwWJsh/w2ryr7ZZap0yEbPUtqd1gvzWQWzaaJ1ohrdx3KkpNqmxVZ6zVOOkHs0SXKu3gRvGZjxs/0C2VWnKfVco+dLnDapbu9dZyas8ClB5jbNsdTwrLUH5yTzVNJ5VpW1Wxrg6KJfC11zEK77FgN/Dw5ihNRfr+0bSjvq3RNR1f+qcAOjeVfZFyJimry9o4G28Hz3R+IKsE+o3S9S5s+qu0/eZtVTOMfptsFrWB6jzlPJvHqPlN8/U9gZfL5jvtTh18b0nuX5ldmn5GDZx4ZjMsaXzi0oXL5kzd1ENX3xqo+U+4lVlsk45R402UeVv9fcGCX5blyBVI5C6C159I4D8LarpViOaWiNUq8ujwINFrxojb1S9cXrlvRNFZCOjC/GKL2PgV8pVfHUIH7Wr7mRMtEpejTAmePG6o74RIy3BrE6aNqvTVLlmUWHxPgMXz146v3RB+RLVaWTGdUdSnSaqpHrXQj2vQMi6LjUEJXIW9ZNL6rCWqrdA/B0LcsRjVT51qW9NXZ93WYgizZC8pTNpv2/4TKVS+Pz3DZ+qVH4P0uVRyzBN+W3DFLjy24ZmX+kuba3c1kB3KdeQ4+XXd5c8byvlXJe6S+o2CvmZV8NLDvNTXXJoqqy4fvl51NIF+y4tXVpa8YnMYUsXFJfPXbhgcOG8eWqPSF/3WFNvSTc4P2rrLfFD7U+q1zZO8JvsSWVUI6v5U4OcuoZOr9CJGo/q1to10n7zvI3XVqi/qTwjCf6OelXHxbwEPPTfmiW4T5sEvyUqP73yqfOtyHW9XIc6nqDnrYGXuLcTweeFqXzTvI3LoE2C8vk/8OlwK1E9BgA=", "debug_symbols": "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" }, { "name": "_increase_public_balance", "is_unconstrained": true, "custom_attributes": ["aztec(public)", "aztec(internal)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 5, "start": 4 }], "inputs": [{ "end": 3, "start": 0 }], "to": [{ "end": 4, "start": 3 }] }, "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, "return_witnesses": [] }, "bytecode": "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", "debug_symbols": "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" }, { "name": "mint_public", "is_unconstrained": true, "custom_attributes": ["aztec(public)"], "abi": { "error_types": {}, "param_witnesses": { "amount": [{ "end": 5, "start": 4 }], "inputs": [{ "end": 3, "start": 0 }], "to": [{ "end": 4, "start": 3 }] }, "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, "return_witnesses": [] }, "bytecode": "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", "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": "owner", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }], "kind": "struct", "path": "GasToken::balance_of_public_parameters" } }, { "name": "return_type", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::balance_of_public_abi" }, { "fields": [{ "name": "parameters", "type": { "fields": [{ "name": "to", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "amount", "type": { "kind": "field" } }], "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": "fee_limit", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::check_balance_parameters" } }], "kind": "struct", "path": "GasToken::check_balance_abi" }, { "fields": [{ "name": "parameters", "type": { "fields": [{ "name": "portal_address", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::eth_address::EthAddress" } }], "kind": "struct", "path": "GasToken::set_portal_parameters" } }], "kind": "struct", "path": "GasToken::set_portal_abi" }, { "fields": [{ "name": "parameters", "type": { "fields": [{ "name": "to", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "amount", "type": { "kind": "field" } }, { "name": "secret", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::claim_parameters" } }], "kind": "struct", "path": "GasToken::claim_abi" }, { "fields": [{ "name": "parameters", "type": { "fields": [{ "name": "to", "type": { "fields": [{ "name": "inner", "type": { "kind": "field" } }], "kind": "struct", "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress" } }, { "name": "amount", "type": { "kind": "field" } }, { "name": "secret", "type": { "kind": "field" } }, { "name": "leaf_index", "type": { "kind": "field" } }], "kind": "struct", "path": "GasToken::claim_public_parameters" } }], "kind": "struct", "path": "GasToken::claim_public_abi" }] } }, "file_map": { "104": { "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, silo_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\npub fn compute_siloed_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n silo_nullifier(address, nullifier)\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" }, "110": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr", "source": "#[oracle(packArgumentsArray)]\nfn pack_arguments_array_oracle<N>(_args: [Field; N]) -> Field {}\n\n#[oracle(packArguments)]\nfn 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" }, "113": { "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: u64 = 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)]\nfn 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 u64, next_slot: fields[4] },\n path: arr_copy_slice(fields, [0; PUBLIC_DATA_TREE_HEIGHT], 1 + LEAF_PREIMAGE_LENGTH)\n }\n}\n" }, "117": { "path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/storage.nr", "source": "use dep::protocol_types::traits::{Deserialize, Serialize};\n\n#[oracle(storageRead)]\nfn 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)]\nfn 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" }, "125": { "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)]\nfn 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)]\nfn 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" }, "127": { "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)]\nfn 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" }, "130": { "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" }, "132": { "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" }, "135": { "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" }, "153": { "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 = 0x1f0e71146c5d4a5bdcf517f0063cda7767e51fcb9cebc877feb348a77a7a6b4a;\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 = 0x079a2b28b4853de9169d7dc40ac41c6d80b465d82c60195ede91504013f8b11b;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash);\n }\n}\n" }, "173": { "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" }, "195": { "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" }, "197": { "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 = 0x0933cf2bb384c9733d5a8311bfdc089489c2557df2265026579f9ac2b21d2ef9;\n assert_eq(hash, test_data_empty_hash);\n}\n" }, "199": { "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" }, "206": { "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: u64) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n" }, "208": { "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" }, "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" }, "215": { "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" }, "216": { "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 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" }, "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/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 : u64,\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" }, "224": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr", "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::recursion::verification_key::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage;\nuse crate::contract_class_id::ContractClassId;\nuse crate::abis::log_hash::LogHash;\nuse crate::traits::is_empty;\nuse crate::utils::{uint256::U256, field::field_from_bytes_32_trunc};\nuse crate::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};\nuse crate::traits::Hash;\nuse crate::messaging::l2_to_l1_message::L2ToL1Message;\nuse crate::merkle_tree::root::root_from_sibling_path;\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: u64) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n note_hash_index as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn 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 silo_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_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_encrypted_log(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_unencrypted_log(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\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 rollup_version_id: Field,\n chain_id: Field,\n message: L2ToL1Message\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, message.recipient.to_field(), chain_id, message.content\n ];\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\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), 0, 0, L2ToL1Message::empty());\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let message = L2ToL1Message { recipient: EthAddress::from_field(3), content: 5, counter: 1234 };\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), 2, 4, message);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n" }, "244": { "path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr", "source": "struct Reader<N> {\n data: [Field; N],\n offset: u64,\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" }, "246": { "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" }, "259": { "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" }, "264": { "path": "/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr", "source": "mod lib;\n\ncontract GasToken {\n use dep::aztec::protocol_types::{abis::function_selector::FunctionSelector, address::{AztecAddress, EthAddress}};\n use dep::aztec::state_vars::{SharedImmutable, PublicMutable, Map};\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 // 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" }, "265": { "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" }, "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};\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\nstruct PedersenPoint {\n x : Field,\n y : Field,\n}\n\npub fn pedersen_commitment<N>(input: [Field; N]) -> PedersenPoint {\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) -> PedersenPoint {\n let values = __pedersen_commitment_with_separator(input, separator);\n PedersenPoint { x: values[0], y: values[1] }\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" }, "71": { "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" }, "76": { "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/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" }, "83": { "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, 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_log, emit_encrypted_note_log, compute_encrypted_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>(&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 encrypt_and_emit_log<N, M>(\n &mut self,\n contract_address: AztecAddress,\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\n // We are currently just encrypting it EXACTLY the same way as if it was a note.\n let counter = self.next_counter();\n let encrypted_log: [u8; M] = compute_encrypted_log(\n contract_address,\n randomness,\n event_type_id,\n ovsk_app,\n ovpk_m,\n ivpk_m,\n preimage\n );\n emit_encrypted_log(contract_address, randomness, encrypted_log, counter);\n let len = 32 + 32 + 64 + 48 + 48 + 176 + 64 + (preimage.len() as Field * 32) + 16 + 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\n pub fn encrypt_and_emit_note<Note, N, NB, M>(\n &mut self,\n contract_address: AztecAddress,\n storage_slot: Field,\n note_type_id: Field,\n ovpk_m: GrumpkinPoint,\n ivpk_m: GrumpkinPoint,\n note: Note\n ) where Note: NoteInterface<N, NB>, [Field; N]: LensForEncryptedLog<N, M> {\n let note_hash_counter = note.get_header().note_hash_counter;\n let note_exists_index = find_index(\n self.new_note_hashes.storage,\n |n: NoteHash| n.counter == note_hash_counter\n );\n assert(\n note_exists_index != MAX_NEW_NOTE_HASHES_PER_CALL, \"Can only emit a note log for an existing note.\"\n );\n let preimage = note.serialize_content();\n let counter = self.next_counter();\n\n let ovsk_app = self.request_ovsk_app(ovpk_m.hash());\n\n // TODO(#1139 | #6408): perform encryption in the circuit\n let encrypted_log: [u8; M] = compute_encrypted_log(\n contract_address,\n storage_slot,\n note_type_id,\n ovsk_app,\n ovpk_m,\n ivpk_m,\n preimage\n );\n emit_encrypted_note_log(note_hash_counter, encrypted_log, counter);\n\n // Current unoptimized size of the encrypted log\n // incoming_tag (32 bytes)\n // outgoing_tag (32 bytes)\n // eph_pk (64 bytes)\n // incoming_header (48 bytes)\n // outgoing_header (48 bytes)\n // outgoing_body (176 bytes)\n // incoming_body_fixed (64 bytes)\n // incoming_body_variable (N * 32 bytes + 16 bytes padding) \n // len of processed log (4 bytes)\n let len = 32 + 32 + 64 + 48 + 48 + 176 + 64 + (preimage.len() as Field * 32) + 16 + 4;\n\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\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" }, "85": { "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::{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 * Should be automatically convertible to [Field; N]. For example str<N> works with\n * one char per field. Otherwise you can use CompressedString.\n */\n pub fn emit_unencrypted_log_with_selector<T>(&mut self, event_selector: Field, log: T) {\n emit_unencrypted_log(event_selector, 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 emit_unencrypted_log<T, N, M>(&mut self, log: T) {\n let event_selector = 5; // Matches current PublicContext.\n self.emit_unencrypted_log_with_selector(event_selector, log);\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}\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<T>(event_selector: Field, message: T) {\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)]\nfn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeStorageAddress)]\nfn storage_address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nfn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nfn portal_opcode() -> EthAddress {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nfn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nfn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeTransactionFee)]\nfn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nfn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nfn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nfn block_number_opcode() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nfn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nfn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nfn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nfn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nfn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nfn nullifier_exists_opcode(nullifier: Field, address: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nfn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(amvOpcodeEmitUnencryptedLog)]\nfn emit_unencrypted_log_opcode<T>(event_selector: Field, message: T) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nfn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nfn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCall)]\nfn 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)]\nfn 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" } } }
|