@aztec/noir-protocol-circuits-types 0.24.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/README.md +1 -0
- package/dest/index.d.ts +69 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +268 -0
- package/dest/scripts/generate_ts_from_abi.d.ts +2 -0
- package/dest/scripts/generate_ts_from_abi.d.ts.map +1 -0
- package/dest/scripts/generate_ts_from_abi.js +180 -0
- package/dest/target/private_kernel_init.json +1 -0
- package/dest/target/private_kernel_init_simulated.json +1 -0
- package/dest/target/private_kernel_inner.json +1 -0
- package/dest/target/private_kernel_inner_simulated.json +1 -0
- package/dest/target/private_kernel_tail.json +1 -0
- package/dest/target/private_kernel_tail_simulated.json +1 -0
- package/dest/target/public_kernel_app_logic.json +1 -0
- package/dest/target/public_kernel_app_logic_simulated.json +1 -0
- package/dest/target/public_kernel_setup.json +1 -0
- package/dest/target/public_kernel_setup_simulated.json +1 -0
- package/dest/target/rollup_base.json +1 -0
- package/dest/target/rollup_base_simulated.json +1 -0
- package/dest/target/rollup_merge.json +1 -0
- package/dest/target/rollup_root.json +1 -0
- package/dest/type_conversion.d.ts +574 -0
- package/dest/type_conversion.d.ts.map +1 -0
- package/dest/type_conversion.js +1115 -0
- package/dest/types/private_kernel_init_types.d.ts +232 -0
- package/dest/types/private_kernel_init_types.d.ts.map +1 -0
- package/dest/types/private_kernel_init_types.js +3 -0
- package/dest/types/private_kernel_inner_types.d.ts +233 -0
- package/dest/types/private_kernel_inner_types.d.ts.map +1 -0
- package/dest/types/private_kernel_inner_types.js +3 -0
- package/dest/types/private_kernel_tail_types.d.ts +182 -0
- package/dest/types/private_kernel_tail_types.d.ts.map +1 -0
- package/dest/types/private_kernel_tail_types.js +3 -0
- package/dest/types/public_kernel_app_logic_types.d.ts +212 -0
- package/dest/types/public_kernel_app_logic_types.d.ts.map +1 -0
- package/dest/types/public_kernel_app_logic_types.js +3 -0
- package/dest/types/public_kernel_setup_types.d.ts +212 -0
- package/dest/types/public_kernel_setup_types.d.ts.map +1 -0
- package/dest/types/public_kernel_setup_types.js +3 -0
- package/dest/types/rollup_base_types.d.ts +220 -0
- package/dest/types/rollup_base_types.d.ts.map +1 -0
- package/dest/types/rollup_base_types.js +3 -0
- package/dest/types/rollup_merge_types.d.ts +71 -0
- package/dest/types/rollup_merge_types.d.ts.map +1 -0
- package/dest/types/rollup_merge_types.js +3 -0
- package/dest/types/rollup_root_types.d.ts +92 -0
- package/dest/types/rollup_root_types.d.ts.map +1 -0
- package/dest/types/rollup_root_types.js +3 -0
- package/package.json +60 -0
- package/src/fixtures/nested-call-private-kernel-init.hex +1 -0
- package/src/fixtures/nested-call-private-kernel-inner.hex +1 -0
- package/src/fixtures/nested-call-private-kernel-ordering.hex +1 -0
- package/src/index.ts +438 -0
- package/src/scripts/generate_ts_from_abi.ts +233 -0
- package/src/target/private_kernel_init.json +1 -0
- package/src/target/private_kernel_init_simulated.json +1 -0
- package/src/target/private_kernel_inner.json +1 -0
- package/src/target/private_kernel_inner_simulated.json +1 -0
- package/src/target/private_kernel_tail.json +1 -0
- package/src/target/private_kernel_tail_simulated.json +1 -0
- package/src/target/public_kernel_app_logic.json +1 -0
- package/src/target/public_kernel_app_logic_simulated.json +1 -0
- package/src/target/public_kernel_setup.json +1 -0
- package/src/target/public_kernel_setup_simulated.json +1 -0
- package/src/target/rollup_base.json +1 -0
- package/src/target/rollup_base_simulated.json +1 -0
- package/src/target/rollup_merge.json +1 -0
- package/src/target/rollup_root.json +1 -0
- package/src/type_conversion.ts +1673 -0
- package/src/types/private_kernel_init_types.ts +272 -0
- package/src/types/private_kernel_inner_types.ts +273 -0
- package/src/types/private_kernel_tail_types.ts +214 -0
- package/src/types/public_kernel_app_logic_types.ts +250 -0
- package/src/types/public_kernel_setup_types.ts +250 -0
- package/src/types/rollup_base_types.ts +259 -0
- package/src/types/rollup_merge_types.ts +85 -0
- package/src/types/rollup_root_types.ts +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "noir_version": "0.23.0+5f5843e35052b9d3599b8ab4f7633db0a225e82f", "hash": 5603501385063218836, "abi": { "parameters": [{ "name": "input", "type": { "kind": "struct", "path": "private_kernel_lib::private_kernel_tail::PrivateKernelTailCircuitPrivateInputs", "fields": [{ "name": "previous_kernel", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::kernel_data::PrivateKernelInnerData", "fields": [{ "name": "public_inputs", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::kernel_circuit_public_inputs::PrivateKernelInnerCircuitPublicInputs", "fields": [{ "name": "aggregation_object", "type": { "kind": "struct", "path": "private_kernel_lib::types::mocked::AggregationObject", "fields": [] } }, { "name": "max_non_revertible_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "end", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::combined_accumulated_data::CombinedAccumulatedData", "fields": [{ "name": "read_requests", "type": { "kind": "array", "length": 128, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffect", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "nullifier_key_validation_requests", "type": { "kind": "array", "length": 4, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::nullifier_key_validation_request::NullifierKeyValidationRequestContext", "fields": [{ "name": "public_key", "type": { "kind": "struct", "path": "private_kernel_lib::types::grumpkin_point::GrumpkinPoint", "fields": [{ "name": "x", "type": { "kind": "field" } }, { "name": "y", "type": { "kind": "field" } }] } }, { "name": "secret_key", "type": { "kind": "struct", "path": "private_kernel_lib::types::grumpkin_private_key::GrumpkinPrivateKey", "fields": [{ "name": "high", "type": { "kind": "field" } }, { "name": "low", "type": { "kind": "field" } }] } }, { "name": "contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } } }, { "name": "new_commitments", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffect", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "new_nullifiers", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "note_hash", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "private_call_stack", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallRequest", "fields": [{ "name": "hash", "type": { "kind": "field" } }, { "name": "caller_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "caller_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallerContext", "fields": [{ "name": "msg_sender", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "storage_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "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": "public_call_stack", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallRequest", "fields": [{ "name": "hash", "type": { "kind": "field" } }, { "name": "caller_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "caller_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallerContext", "fields": [{ "name": "msg_sender", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "storage_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "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": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "unencrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "new_contracts", "type": { "kind": "array", "length": 1, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::new_contract_data::NewContractData", "fields": [{ "name": "contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "contract_class_id", "type": { "kind": "struct", "path": "private_kernel_lib::types::contract_class::ContractClassId", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } } }, { "name": "public_data_update_requests", "type": { "kind": "array", "length": 16, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::public_data_update_request::PublicDataUpdateRequest", "fields": [{ "name": "leaf_slot", "type": { "kind": "field" } }, { "name": "new_value", "type": { "kind": "field" } }] } } }, { "name": "public_data_reads", "type": { "kind": "array", "length": 16, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::public_data_read::PublicDataRead", "fields": [{ "name": "leaf_slot", "type": { "kind": "field" } }, { "name": "value", "type": { "kind": "field" } }] } } }] } }, { "name": "constants", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::combined_constant_data::CombinedConstantData", "fields": [{ "name": "historical_header", "type": { "kind": "struct", "path": "private_kernel_lib::types::header::Header", "fields": [{ "name": "last_archive", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "body_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "state", "type": { "kind": "struct", "path": "private_kernel_lib::types::state_reference::StateReference", "fields": [{ "name": "l1_to_l2_message_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "partial", "type": { "kind": "struct", "path": "private_kernel_lib::types::partial_state_reference::PartialStateReference", "fields": [{ "name": "note_hash_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "nullifier_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "contract_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "public_data_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }] } }] } }, { "name": "global_variables", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::global_variables::GlobalVariables", "fields": [{ "name": "chain_id", "type": { "kind": "field" } }, { "name": "version", "type": { "kind": "field" } }, { "name": "block_number", "type": { "kind": "field" } }, { "name": "timestamp", "type": { "kind": "field" } }, { "name": "coinbase", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "fee_recipient", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }] } }, { "name": "tx_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::transaction::context::TxContext", "fields": [{ "name": "is_fee_payment_tx", "type": { "kind": "boolean" } }, { "name": "is_rebate_payment_tx", "type": { "kind": "boolean" } }, { "name": "is_contract_deployment_tx", "type": { "kind": "boolean" } }, { "name": "contract_deployment_data", "type": { "kind": "struct", "path": "private_kernel_lib::types::contrakt::deployment_data::ContractDeploymentData", "fields": [{ "name": "public_key", "type": { "kind": "struct", "path": "private_kernel_lib::types::grumpkin_point::GrumpkinPoint", "fields": [{ "name": "x", "type": { "kind": "field" } }, { "name": "y", "type": { "kind": "field" } }] } }, { "name": "initialization_hash", "type": { "kind": "field" } }, { "name": "contract_class_id", "type": { "kind": "struct", "path": "private_kernel_lib::types::contract_class::ContractClassId", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "contract_address_salt", "type": { "kind": "field" } }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "name": "chain_id", "type": { "kind": "field" } }, { "name": "version", "type": { "kind": "field" } }] } }] } }, { "name": "is_private", "type": { "kind": "boolean" } }] } }, { "name": "proof", "type": { "kind": "struct", "path": "private_kernel_lib::types::mocked::Proof", "fields": [] } }, { "name": "vk", "type": { "kind": "struct", "path": "private_kernel_lib::types::mocked::VerificationKey", "fields": [] } }, { "name": "vk_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }, { "name": "vk_path", "type": { "kind": "array", "length": 3, "type": { "kind": "field" } } }] } }, { "name": "sorted_new_commitments", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffect", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "sorted_new_commitments_indexes", "type": { "kind": "array", "length": 64, "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } }, { "name": "read_commitment_hints", "type": { "kind": "array", "length": 128, "type": { "kind": "field" } } }, { "name": "sorted_new_nullifiers", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "note_hash", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "sorted_new_nullifiers_indexes", "type": { "kind": "array", "length": 64, "type": { "kind": "integer", "sign": "unsigned", "width": 32 } } }, { "name": "nullifier_commitment_hints", "type": { "kind": "array", "length": 64, "type": { "kind": "field" } } }, { "name": "master_nullifier_secret_keys", "type": { "kind": "array", "length": 4, "type": { "kind": "struct", "path": "private_kernel_lib::types::grumpkin_private_key::GrumpkinPrivateKey", "fields": [{ "name": "high", "type": { "kind": "field" } }, { "name": "low", "type": { "kind": "field" } }] } } }] }, "visibility": "private" }], "param_witnesses": { "input": [{ "start": 0, "end": 1452 }] }, "return_type": { "abi_type": { "kind": "struct", "path": "private_kernel_lib::types::abis::kernel_circuit_public_inputs::PrivateKernelTailCircuitPublicInputs", "fields": [{ "name": "aggregation_object", "type": { "kind": "struct", "path": "private_kernel_lib::types::mocked::AggregationObject", "fields": [] } }, { "name": "end_non_revertible", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::combined_accumulated_data::AccumulatedNonRevertibleData", "fields": [{ "name": "new_commitments", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffect", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "new_nullifiers", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "note_hash", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "public_call_stack", "type": { "kind": "array", "length": 2, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallRequest", "fields": [{ "name": "hash", "type": { "kind": "field" } }, { "name": "caller_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "caller_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallerContext", "fields": [{ "name": "msg_sender", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "storage_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "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": "end", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::combined_accumulated_data::FinalAccumulatedData", "fields": [{ "name": "new_commitments", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffect", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "new_nullifiers", "type": { "kind": "array", "length": 64, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::side_effect::SideEffectLinkedToNoteHash", "fields": [{ "name": "value", "type": { "kind": "field" } }, { "name": "note_hash", "type": { "kind": "field" } }, { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } } }, { "name": "private_call_stack", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallRequest", "fields": [{ "name": "hash", "type": { "kind": "field" } }, { "name": "caller_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "caller_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallerContext", "fields": [{ "name": "msg_sender", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "storage_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "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": "public_call_stack", "type": { "kind": "array", "length": 8, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallRequest", "fields": [{ "name": "hash", "type": { "kind": "field" } }, { "name": "caller_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "caller_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::call_request::CallerContext", "fields": [{ "name": "msg_sender", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "storage_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "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": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "unencrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } }, { "name": "new_contracts", "type": { "kind": "array", "length": 1, "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::new_contract_data::NewContractData", "fields": [{ "name": "contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "contract_class_id", "type": { "kind": "struct", "path": "private_kernel_lib::types::contract_class::ContractClassId", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } } }] } }, { "name": "constants", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::combined_constant_data::CombinedConstantData", "fields": [{ "name": "historical_header", "type": { "kind": "struct", "path": "private_kernel_lib::types::header::Header", "fields": [{ "name": "last_archive", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "body_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } }, { "name": "state", "type": { "kind": "struct", "path": "private_kernel_lib::types::state_reference::StateReference", "fields": [{ "name": "l1_to_l2_message_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "partial", "type": { "kind": "struct", "path": "private_kernel_lib::types::partial_state_reference::PartialStateReference", "fields": [{ "name": "note_hash_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "nullifier_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "contract_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }, { "name": "public_data_tree", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot", "fields": [{ "name": "root", "type": { "kind": "field" } }, { "name": "next_available_leaf_index", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }] } }] } }] } }, { "name": "global_variables", "type": { "kind": "struct", "path": "private_kernel_lib::types::abis::global_variables::GlobalVariables", "fields": [{ "name": "chain_id", "type": { "kind": "field" } }, { "name": "version", "type": { "kind": "field" } }, { "name": "block_number", "type": { "kind": "field" } }, { "name": "timestamp", "type": { "kind": "field" } }, { "name": "coinbase", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "fee_recipient", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::AztecAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }] } }, { "name": "tx_context", "type": { "kind": "struct", "path": "private_kernel_lib::types::transaction::context::TxContext", "fields": [{ "name": "is_fee_payment_tx", "type": { "kind": "boolean" } }, { "name": "is_rebate_payment_tx", "type": { "kind": "boolean" } }, { "name": "is_contract_deployment_tx", "type": { "kind": "boolean" } }, { "name": "contract_deployment_data", "type": { "kind": "struct", "path": "private_kernel_lib::types::contrakt::deployment_data::ContractDeploymentData", "fields": [{ "name": "public_key", "type": { "kind": "struct", "path": "private_kernel_lib::types::grumpkin_point::GrumpkinPoint", "fields": [{ "name": "x", "type": { "kind": "field" } }, { "name": "y", "type": { "kind": "field" } }] } }, { "name": "initialization_hash", "type": { "kind": "field" } }, { "name": "contract_class_id", "type": { "kind": "struct", "path": "private_kernel_lib::types::contract_class::ContractClassId", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }, { "name": "contract_address_salt", "type": { "kind": "field" } }, { "name": "portal_contract_address", "type": { "kind": "struct", "path": "private_kernel_lib::types::address::EthAddress", "fields": [{ "name": "inner", "type": { "kind": "field" } }] } }] } }, { "name": "chain_id", "type": { "kind": "field" } }, { "name": "version", "type": { "kind": "field" } }] } }] } }, { "name": "is_private", "type": { "kind": "boolean" } }] }, "visibility": "public" }, "return_witnesses": [1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473] }, "bytecode": "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", "debug_symbols": "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", "file_map": { "2": { "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 u1 { fn eq(self, other: u1) -> bool { self == other } }\nimpl Eq for u8 { fn eq(self, other: u8) -> bool { self == other } }\nimpl Eq for u32 { fn eq(self, other: u32) -> bool { self == other } }\nimpl Eq for u64 { fn eq(self, other: u64) -> 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<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 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 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 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 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<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", "path": "std/cmp.nr" }, "3": { "source": "struct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n // TODO: change this to return a u64 as Noir now\n // uses u64 for indexing\n len: Field,\n empty_value: T,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0, empty_value: initial_value }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn len(self) -> Field {\n self.len\n }\n\n pub fn max_len(_self: BoundedVec<T, MaxLen>) -> Field {\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 as u64 <= MaxLen as u64, \"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_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 as u64 <= MaxLen as u64, \"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 as Field)] = vec.get_unchecked(i as Field);\n }\n }\n self.len = new_len;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = self.empty_value;\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}", "path": "std/collections/bounded_vec.nr" }, "19": { "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\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\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\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\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\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\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", "path": "std/field.nr" }, "21": { "source": "use crate::grumpkin_scalar::GrumpkinScalar;\nuse crate::scalar_mul::fixed_base_embedded_curve;\n\npub fn grumpkin_fixed_base(scalar: GrumpkinScalar) -> [Field; 2] {\n // TODO: this should use both the low and high limbs to do the scalar multiplication\n fixed_base_embedded_curve(scalar.low, scalar.high)\n}\n", "path": "std/grumpkin_scalar_mul.nr" }, "49": { "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::{ContractClassFunctionLeafPreimage, FunctionLeafPreimage};\nuse crate::contract_class::ContractClassId;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint256::U256;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT, ARGS_HASH_CHUNK_LENGTH, CONTRACT_TREE_HEIGHT, FUNCTION_TREE_HEIGHT,\n NOTE_HASH_TREE_HEIGHT, NUM_FIELDS_PER_SHA256, GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER, GENERATOR_INDEX__VK, GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS, GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE, GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\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 + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership<N>(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path<N>(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n contract_class_id: ContractClassId,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, contract_class_id };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\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 read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\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\nfn 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\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, 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\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\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//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\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 // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_integer(previous_log_hash[0]),\n U128::from_integer(previous_log_hash[1]),\n U128::from_integer(current_log_hash[0]),\n U128::from_integer(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments<N>(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\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", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/hash.nr" }, "65": { "source": "use dep::std::{cmp::Eq, grumpkin_scalar::GrumpkinScalar, grumpkin_scalar_mul::grumpkin_fixed_base};\nuse crate::grumpkin_point::GrumpkinPoint;\n\nglobal GRUMPKIN_PRIVATE_KEY_SERIALIZED_LEN: Field = 2;\n\nstruct GrumpkinPrivateKey {\n high: Field,\n low: Field,\n}\n\nimpl Eq for GrumpkinPrivateKey {\n fn eq(self, key: GrumpkinPrivateKey) -> bool {\n (key.high == self.high) & (key.low == self.low)\n }\n}\n\nimpl GrumpkinPrivateKey {\n pub fn new(high: Field, low: Field) -> Self {\n GrumpkinPrivateKey { high, low }\n }\n\n pub fn zero() -> Self {\n Self { high: 0, low: 0 }\n }\n\n pub fn is_zero(self) -> bool {\n (self.high == 0) & (self.low == 0)\n }\n\n pub fn serialize(self) -> [Field; GRUMPKIN_PRIVATE_KEY_SERIALIZED_LEN] {\n [self.high, self.low]\n }\n\n pub fn derive_public_key(self) -> GrumpkinPoint {\n let public_key = grumpkin_fixed_base(GrumpkinScalar { high: self.high, low: self.low });\n GrumpkinPoint { x: public_key[0], y: public_key[1] }\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_private_key.nr" }, "66": { "source": "use crate::{\n constants::{GENERATOR_INDEX__CONTRACT_ADDRESS, GENERATOR_INDEX__PARTIAL_ADDRESS, GENERATOR_INDEX__CONSTRUCTOR},\n hash::pedersen_hash, contract_class::ContractClassId, utils, grumpkin_point::GrumpkinPoint\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, ToField, Serialize, Deserialize};\nuse crate::type_serialization::{ETH_ADDRESS_SERIALIZED_LEN, AZTEC_ADDRESS_SERIALIZED_LEN};\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 Serialize<AZTEC_ADDRESS_SERIALIZED_LEN> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_SERIALIZED_LEN] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_SERIALIZED_LEN> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_SERIALIZED_LEN]) -> Self {\n AztecAddress::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute_from_public_key(\n pub_key: GrumpkinPoint,\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n portal_contract_address: EthAddress\n ) -> AztecAddress {\n AztecAddress::compute(\n PublicKeysHash::compute(pub_key),\n PartialAddress::compute(\n contract_class_id,\n salt,\n initialization_hash,\n portal_contract_address\n )\n )\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\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\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_SERIALIZED_LEN> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_SERIALIZED_LEN] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_SERIALIZED_LEN> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_SERIALIZED_LEN]) -> Self {\n Self {\n inner: fields[0]\n }\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 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\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 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 portal_contract_address: EthAddress\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, portal_contract_address)\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 assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\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, portal_contract_address: EthAddress) -> Self {\n SaltedInitializationHash::from_field(\n pedersen_hash(\n [\n salt,\n initialization_hash,\n portal_contract_address.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 assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n\n// Public keys hash. Used in the computation of an address.\nstruct PublicKeysHash {\n inner: Field\n}\n\nimpl ToField for PublicKeysHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<1> for PublicKeysHash {\n fn serialize(self: Self) -> [Field; 1] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<1> for PublicKeysHash {\n fn deserialize(fields: [Field; 1]) -> Self {\n PublicKeysHash::from_field(fields[0])\n }\n}\n\nimpl PublicKeysHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(public_key: GrumpkinPoint) -> Self {\n PublicKeysHash::from_field(\n pedersen_hash(\n [\n public_key.x,\n public_key.y\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 assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n\npub fn compute_initialization_hash(selector: Field, args_hash: Field) -> Field {\n pedersen_hash(\n [\n selector,\n args_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/address.nr" }, "75": { "source": "use crate::traits::{Serialize, Deserialize};\nuse dep::std::cmp::Eq;\n\nglobal GRUMPKIN_POINT_SERIALIZED_LEN: Field = 2;\n\nstruct GrumpkinPoint {\n x: Field,\n y: Field,\n}\n\nimpl Serialize<GRUMPKIN_POINT_SERIALIZED_LEN> for GrumpkinPoint {\n fn serialize(self) -> [Field; GRUMPKIN_POINT_SERIALIZED_LEN] {\n [self.x, self.y]\n }\n}\n\nimpl Deserialize<GRUMPKIN_POINT_SERIALIZED_LEN> for GrumpkinPoint {\n fn deserialize(serialized: [Field; GRUMPKIN_POINT_SERIALIZED_LEN]) -> Self {\n Self {\n x: serialized[0],\n y: serialized[1],\n }\n }\n}\n\nimpl Eq for GrumpkinPoint {\n fn eq(self, point: GrumpkinPoint) -> bool {\n (point.x == self.x) & (point.y == self.y)\n }\n}\n\nimpl GrumpkinPoint {\n pub fn new(x: Field, y: Field) -> Self {\n Self { x, y }\n }\n\n pub fn zero() -> Self {\n Self { x: 0, y: 0 }\n }\n\n pub fn is_zero(self) -> bool {\n (self.x == 0) & (self.y == 0)\n }\n\n // TODO(David): Would be quite careful here as (0,0) is not a point\n // on the curve. A boolean flag may be the better approach here,\n // would also cost less constraints. It seems like we don't need to \n // group arithmetic either. \n fn assert_is_zero(self) {\n assert(self.x == 0);\n assert(self.y == 0);\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/grumpkin_point.nr" }, "76": { "source": "use dep::std::cmp::Eq;\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 u16 { fn empty() -> Self {0} }\nimpl Empty for u32 { fn empty() -> Self {0} }\nimpl Empty for u64 { fn empty() -> Self {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\n// docs:start:serialize\ntrait Serialize<N> {\n fn serialize(self) -> [Field; N];\n}\n// docs:end:serialize\n\n// docs:start:deserialize\ntrait Deserialize<N> {\n fn deserialize(fields: [Field; N]) -> Self;\n}\n// docs:end:deserialize", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/traits.nr" }, "79": { "source": "use dep::std::array;\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, is_empty};\n\npub fn array_to_bounded_vec<T, N>(array: [T; N]) -> BoundedVec<T, N> where T: Empty + Eq {\n let mut len = 0;\n for elem in array {\n if !is_empty(elem) {\n len += 1;\n }\n }\n\n BoundedVec { storage: array, len, empty_value: T::empty() }\n}\n\n// Routine which validates that all zero values of an array form a contiguous region at the end, i.e.,\n// of the form: [*,*,*...,0,0,0,0] where any * is non-zero. Note that a full array of non-zero values is\n// valid.\npub fn validate_array<T, N>(array: [T; N]) where T: Empty + Eq {\n let array_length = array.len();\n\n let mut first_zero_pos = array_length;\n let mut last_non_zero_pos = 0;\n\n for i in 0..array_length {\n let is_empty = is_empty(array[i]);\n if !is_empty {\n last_non_zero_pos = i;\n } else if is_empty & (first_zero_pos == array_length) {\n first_zero_pos = i;\n }\n }\n assert((last_non_zero_pos as u64) <= (first_zero_pos as u64), \"invalid array\");\n}\n\n// Helper method to determine the number of non-zero/empty elements in a validated array (ie, validate_array(array) \n// should be true).\npub fn array_length<T, N>(array: [T; N]) -> Field where T: Empty + Eq {\n let mut length = 0;\n let mut end = false;\n for elem in array {\n end |= is_empty(elem);\n if !end {\n length += 1;\n }\n }\n length\n}\n\npub fn array_eq<T, N, S>(array: [T; N], expected: [T; S]) -> bool where T: Empty + Eq {\n let mut eq = array_length(array) == S;\n\n for i in 0..S {\n eq &= array[i].eq(expected[i]);\n }\n\n eq\n}\n\n#[test]\nfn smoke_validate_array() {\n let valid_array = [];\n validate_array(valid_array);\n\n let valid_array = [0];\n validate_array(valid_array);\n\n let valid_array = [1, 2, 3];\n validate_array(valid_array);\n\n let valid_array = [1, 2, 3, 0];\n validate_array(valid_array);\n\n let valid_array = [1, 2, 3, 0, 0];\n validate_array(valid_array);\n}\n\n#[test(should_fail_with = \"invalid array\")]\nfn smoke_validate_array_invalid() {\n let invalid_array = [0, 1];\n validate_array(invalid_array);\n}\n\n#[test(should_fail_with = \"invalid array\")]\nfn smoke_validate_array_invalid_case2() {\n let invalid_array = [0, 0, 0, 0, 1];\n validate_array(invalid_array);\n}\n\n#[test]\nfn test_empty_array_length() {\n assert_eq(array_length([]), 0);\n assert_eq(array_length([0]), 0);\n assert_eq(array_length([0, 0, 0]), 0);\n}\n\n#[test]\nfn test_array_length() {\n assert_eq(array_length([123]), 1);\n assert_eq(array_length([123, 456]), 2);\n assert_eq(array_length([123, 456, 0]), 2);\n assert_eq(array_length([123, 0, 456]), 1);\n assert_eq(array_length([0, 123, 0, 456]), 0);\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/utils/arrays.nr" }, "85": { "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash, Serialize, Deserialize};\n\ntrait Ordered {\n fn counter(self) -> u32;\n}\n\nstruct SideEffect{\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffect {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffect {\n fn eq(self, side_effect: SideEffect) -> bool {\n (self.value == side_effect.value)\n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffect {\n fn empty() -> Self {\n SideEffect {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffect {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize() , GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl Serialize<2> for SideEffect {\n fn serialize(self) -> [Field; 2] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<2> for SideEffect {\n fn deserialize(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nstruct SideEffectLinkedToNoteHash{\n value: Field,\n note_hash: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffectLinkedToNoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffectLinkedToNoteHash {\n fn eq(self, side_effect: SideEffectLinkedToNoteHash) -> bool {\n (self.value == side_effect.value)\n & (self.note_hash == side_effect.note_hash) \n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffectLinkedToNoteHash {\n fn empty() -> Self {\n SideEffectLinkedToNoteHash {\n value: 0,\n note_hash: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffectLinkedToNoteHash {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl Serialize<3> for SideEffectLinkedToNoteHash {\n fn serialize(self) -> [Field; 3] {\n [self.value, self.note_hash, self.counter as Field]\n }\n}\n\nimpl Deserialize<3> for SideEffectLinkedToNoteHash {\n fn deserialize(values: [Field; 3]) -> Self {\n Self {\n value: values[0],\n note_hash: values[1],\n counter: values[2] as u32,\n }\n }\n}\n\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr" }, "87": { "source": "use crate::{\n abis::{\n call_request::CallRequest, new_contract_data::NewContractData,\n nullifier_key_validation_request::NullifierKeyValidationRequestContext,\n public_data_read::PublicDataRead, public_data_update_request::PublicDataUpdateRequest,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash}\n}\n};\nuse crate::constants::{\n MAX_READ_REQUESTS_PER_TX, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_NEW_COMMITMENTS_PER_TX,\n MAX_NEW_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_NEW_CONTRACTS_PER_TX,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, NUM_FIELDS_PER_SHA256,\n MAX_NEW_COMMITMENTS_PER_TX_META, MAX_NEW_NULLIFIERS_PER_TX_META,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX_META\n};\n\nstruct CombinedAccumulatedData {\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_TX],\n nullifier_key_validation_requests: [NullifierKeyValidationRequestContext; MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX],\n\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_TX],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_TX],\n\n private_call_stack: [CallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX],\n public_call_stack: [CallRequest; MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_TX],\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n\n public_data_reads: [PublicDataRead; MAX_PUBLIC_DATA_READS_PER_TX],\n}\n\nstruct FinalAccumulatedData {\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_TX],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_TX],\n\n private_call_stack: [CallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX],\n public_call_stack: [CallRequest; MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_TX],\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct AccumulatedNonRevertibleData {\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_TX_META],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_TX_META],\n public_call_stack: [CallRequest; MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX_META],\n}\n\nstruct CombinedAccumulatedDataBuilder {\n read_requests: BoundedVec<SideEffect,MAX_READ_REQUESTS_PER_TX>,\n nullifier_key_validation_requests: BoundedVec<NullifierKeyValidationRequestContext, MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_TX>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_TX>,\n\n private_call_stack: BoundedVec<CallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX>,\n public_call_stack: BoundedVec<CallRequest, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX>,\n new_l2_to_l1_msgs: BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_TX>,\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n new_contracts: BoundedVec<NewContractData, MAX_NEW_CONTRACTS_PER_TX>,\n\n public_data_update_requests: BoundedVec<PublicDataUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>,\n\n public_data_reads: BoundedVec<PublicDataRead, MAX_PUBLIC_DATA_READS_PER_TX>,\n}\n\nimpl CombinedAccumulatedDataBuilder {\n pub fn finish(self) -> CombinedAccumulatedData {\n CombinedAccumulatedData {\n read_requests: self.read_requests.storage,\n nullifier_key_validation_requests: self.nullifier_key_validation_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack: self.private_call_stack.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n encrypted_logs_hash: self.encrypted_logs_hash,\n unencrypted_logs_hash: self.unencrypted_logs_hash,\n encrypted_log_preimages_length: self.encrypted_log_preimages_length,\n unencrypted_log_preimages_length: self.unencrypted_log_preimages_length,\n new_contracts: self.new_contracts.storage,\n public_data_update_requests: self.public_data_update_requests.storage,\n public_data_reads: self.public_data_reads.storage\n }\n }\n\n pub fn to_final(self) -> FinalAccumulatedData {\n assert_eq(self.read_requests.len, 0, \"Final accumulated data: read requests not empty\");\n assert_eq(\n self.nullifier_key_validation_requests.len, 0, \"Final accumulated data: nullifier key validation requests not empty\"\n );\n assert_eq(\n self.public_data_update_requests.len, 0, \"Final accumulated data: public data update requests not empty\"\n );\n assert_eq(self.public_data_reads.len, 0, \"Final accumulated data: public data reads not empty\");\n\n FinalAccumulatedData {\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack: self.private_call_stack.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n encrypted_logs_hash: self.encrypted_logs_hash,\n unencrypted_logs_hash: self.unencrypted_logs_hash,\n encrypted_log_preimages_length: self.encrypted_log_preimages_length,\n unencrypted_log_preimages_length: self.unencrypted_log_preimages_length,\n new_contracts: self.new_contracts.storage\n }\n }\n}\n\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/combined_accumulated_data.nr" }, "93": { "source": "use dep::std::cmp::Eq;\nuse crate::{\n address::AztecAddress, traits::{Empty, Serialize, Deserialize}, grumpkin_point::GrumpkinPoint,\n grumpkin_private_key::GrumpkinPrivateKey\n};\n\nglobal NULLIFIER_KEY_VALIDATION_REQUEST_SERIALIZED_LEN = 4;\nglobal NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_SERIALIZED_LEN = 5;\n\nstruct NullifierKeyValidationRequest {\n public_key: GrumpkinPoint,\n secret_key: GrumpkinPrivateKey,\n}\n\nimpl Eq for NullifierKeyValidationRequest {\n fn eq(self, request: NullifierKeyValidationRequest) -> bool {\n (request.public_key.eq(self.public_key))\n & (request.secret_key.eq(self.secret_key))\n }\n}\n\nimpl Empty for NullifierKeyValidationRequest {\n fn empty() -> Self {\n NullifierKeyValidationRequest {\n public_key: GrumpkinPoint::zero(),\n secret_key: GrumpkinPrivateKey::zero(),\n }\n }\n}\n\nimpl Serialize<NULLIFIER_KEY_VALIDATION_REQUEST_SERIALIZED_LEN> for NullifierKeyValidationRequest {\n fn serialize(self) -> [Field; NULLIFIER_KEY_VALIDATION_REQUEST_SERIALIZED_LEN] {\n [\n self.public_key.x,\n self.public_key.y,\n self.secret_key.high,\n self.secret_key.low,\n ]\n }\n}\n\nimpl Deserialize<NULLIFIER_KEY_VALIDATION_REQUEST_SERIALIZED_LEN> for NullifierKeyValidationRequest {\n fn deserialize(fields: [Field; NULLIFIER_KEY_VALIDATION_REQUEST_SERIALIZED_LEN]) -> Self {\n Self {\n public_key: GrumpkinPoint::new(fields[0], fields[1]),\n secret_key: GrumpkinPrivateKey::new(fields[2], fields[3]),\n }\n }\n}\n\nimpl NullifierKeyValidationRequest {\n pub fn to_context(self, contract_address: AztecAddress) -> NullifierKeyValidationRequestContext {\n NullifierKeyValidationRequestContext { public_key: self.public_key, secret_key: self.secret_key, contract_address }\n }\n}\n\nstruct NullifierKeyValidationRequestContext {\n public_key: GrumpkinPoint,\n secret_key: GrumpkinPrivateKey,\n contract_address: AztecAddress,\n}\n\nimpl Eq for NullifierKeyValidationRequestContext {\n fn eq(self, request: NullifierKeyValidationRequestContext) -> bool {\n (request.public_key.eq(self.public_key))\n & (request.secret_key.eq(self.secret_key))\n & (request.contract_address.eq(self.contract_address))\n }\n}\n\nimpl Empty for NullifierKeyValidationRequestContext {\n fn empty() -> Self {\n NullifierKeyValidationRequestContext {\n public_key: GrumpkinPoint::zero(),\n secret_key: GrumpkinPrivateKey::zero(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_SERIALIZED_LEN> for NullifierKeyValidationRequestContext {\n fn serialize(self) -> [Field; NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_SERIALIZED_LEN] {\n [\n self.public_key.x,\n self.public_key.y,\n self.secret_key.high,\n self.secret_key.low,\n self.contract_address.to_field(),\n ]\n }\n}\n\nimpl Deserialize<NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_SERIALIZED_LEN> for NullifierKeyValidationRequestContext {\n fn deserialize(fields: [Field; NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_SERIALIZED_LEN]) -> Self {\n Self {\n public_key: GrumpkinPoint::new(fields[0], fields[1]),\n secret_key: GrumpkinPrivateKey::new(fields[2], fields[3]),\n contract_address: AztecAddress::from_field(fields[4]),\n }\n }\n}\n\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/nullifier_key_validation_request.nr" }, "100": { "source": "use crate::address::AztecAddress;\nuse dep::std::cmp::Eq;\nuse crate::traits::Empty;\n\nstruct CallerContext {\n msg_sender: AztecAddress,\n storage_contract_address: AztecAddress,\n}\n\nimpl Eq for CallerContext {\n fn eq(self, caller_context: CallerContext) -> bool {\n caller_context.msg_sender.eq(self.msg_sender)\n & caller_context.storage_contract_address.eq(self.storage_contract_address)\n }\n}\n\nimpl Empty for CallerContext {\n fn empty() -> Self {\n CallerContext {\n msg_sender: AztecAddress::zero(),\n storage_contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl CallerContext {\n pub fn is_empty(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero()\n }\n}\n\nstruct CallRequest {\n hash: Field,\n caller_contract_address: AztecAddress,\n caller_context: CallerContext,\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n}\n\nimpl Eq for CallRequest {\n fn eq(self, call_request: CallRequest) -> bool {\n (call_request.hash == self.hash)\n & (call_request.caller_contract_address.eq(self.caller_contract_address))\n & (call_request.caller_context.eq(self.caller_context))\n & (call_request.start_side_effect_counter == self.start_side_effect_counter)\n & (call_request.end_side_effect_counter == self.end_side_effect_counter)\n }\n}\n\nimpl Empty for CallRequest {\n fn empty() -> Self {\n CallRequest {\n hash: 0,\n caller_contract_address: AztecAddress::zero(),\n caller_context: CallerContext::empty(),\n start_side_effect_counter: 0,\n end_side_effect_counter: 0,\n }\n }\n}\n\nimpl CallRequest {\n pub fn is_empty(self) -> bool {\n self.hash == 0\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/call_request.nr" }, "105": { "source": "use crate::abis::{\n combined_accumulated_data::{\n CombinedAccumulatedData, FinalAccumulatedData, AccumulatedNonRevertibleData,\n CombinedAccumulatedDataBuilder\n},\n combined_constant_data::CombinedConstantData\n};\nuse crate::mocked::AggregationObject;\n\nstruct PrivateKernelInnerCircuitPublicInputs {\n aggregation_object: AggregationObject,\n max_non_revertible_side_effect_counter: u32,\n end: CombinedAccumulatedData,\n constants: CombinedConstantData,\n is_private: bool,\n}\n\nstruct PrivateKernelTailCircuitPublicInputs {\n aggregation_object: AggregationObject,\n end_non_revertible: AccumulatedNonRevertibleData,\n end: FinalAccumulatedData,\n constants: CombinedConstantData,\n is_private: bool,\n}\n\nstruct PublicKernelCircuitPublicInputs {\n aggregation_object: AggregationObject,\n end_non_revertible: AccumulatedNonRevertibleData,\n end: CombinedAccumulatedData,\n constants: CombinedConstantData,\n is_private: bool,\n}\n\nstruct PrivateKernelCircuitPublicInputsBuilder {\n aggregation_object: AggregationObject,\n max_non_revertible_side_effect_counter: u32,\n end: CombinedAccumulatedDataBuilder,\n constants: CombinedConstantData,\n is_private: bool,\n}\n\nimpl PrivateKernelCircuitPublicInputsBuilder {\n pub fn to_inner(self) -> PrivateKernelInnerCircuitPublicInputs {\n PrivateKernelInnerCircuitPublicInputs {\n aggregation_object: self.aggregation_object,\n max_non_revertible_side_effect_counter: self.max_non_revertible_side_effect_counter,\n end: self.end.finish(),\n constants: self.constants,\n is_private: self.is_private\n }\n }\n\n pub fn to_tail(\n self,\n end_non_revertible: AccumulatedNonRevertibleData\n ) -> PrivateKernelTailCircuitPublicInputs {\n PrivateKernelTailCircuitPublicInputs {\n aggregation_object: self.aggregation_object,\n end_non_revertible,\n end: self.end.to_final(),\n constants: self.constants,\n is_private: self.is_private\n }\n }\n}\n\nstruct PublicKernelCircuitPublicInputsBuilder {\n aggregation_object: AggregationObject,\n end_non_revertible: AccumulatedNonRevertibleData,\n end: CombinedAccumulatedDataBuilder,\n constants: CombinedConstantData,\n is_private: bool,\n}\n\nimpl PublicKernelCircuitPublicInputsBuilder {\n pub fn to_inner(self) -> PublicKernelCircuitPublicInputs {\n PublicKernelCircuitPublicInputs {\n aggregation_object: self.aggregation_object,\n end_non_revertible: self.end_non_revertible,\n end: self.end.finish(),\n constants: self.constants,\n is_private: self.is_private\n }\n }\n}\n\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/kernel_circuit_public_inputs.nr" }, "108": { "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::contract_class::ContractClassId;\nuse crate::constants::GENERATOR_INDEX__CONTRACT_LEAF;\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\nstruct NewContractData {\n contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_class_id: ContractClassId,\n}\n\nimpl Eq for NewContractData {\n fn eq(self, data: NewContractData) -> bool {\n data.contract_address.eq(self.contract_address)\n & data.portal_contract_address.eq(self.portal_contract_address)\n & data.contract_class_id.eq(self.contract_class_id)\n }\n}\n\nimpl Empty for NewContractData {\n fn empty() -> Self {\n Self {\n contract_address : AztecAddress::empty(),\n portal_contract_address : EthAddress::empty(),\n contract_class_id: ContractClassId::from_field(0),\n }\n }\n}\n\nimpl Hash for NewContractData {\n fn hash(self) -> Field {\n if self.is_empty() {\n 0 // We want to return 0 here since the contract_address is zero\n } else {\n dep::std::hash::pedersen_hash_with_separator([\n self.contract_address.to_field(),\n self.portal_contract_address.to_field(),\n self.contract_class_id.to_field(),\n ], GENERATOR_INDEX__CONTRACT_LEAF)\n }\n }\n}\n\nimpl NewContractData {\n pub fn is_empty(self) -> bool {\n (self.contract_address.to_field() == 0)\n & (self.portal_contract_address.to_field() == 0)\n & (self.contract_class_id.to_field() == 0)\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/abis/new_contract_data.nr" }, "110": { "source": "use crate::abis::{\n function_data::FunctionData, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs\n};\nuse crate::address::AztecAddress;\nuse crate::constants::{GENERATOR_INDEX__CONTRACT_LEAF};\nuse crate::traits::Hash;\n\nstruct ContractClassId {\n inner: Field\n}\n\nimpl Eq for ContractClassId {\n fn eq(self, other: ContractClassId) -> bool {\n other.inner == self.inner\n }\n}\n\nimpl ContractClassId {\n pub fn compute(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field\n ) -> Self {\n let hash = dep::std::hash::pedersen_hash_with_separator(\n [\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ],\n GENERATOR_INDEX__CONTRACT_LEAF\n ); // TODO(@spalladino): Update generator index\n\n ContractClassId::from_field(hash)\n }\n\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_field(value: Field) -> Self {\n Self { inner: value }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self { inner: fields[0] }\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/types/src/contract_class.nr" }, "113": { "source": "use crate::common;\nuse dep::std::{cmp::Eq, option::Option, unsafe};\nuse dep::types::{\n abis::{\n call_request::CallRequest, combined_accumulated_data::AccumulatedNonRevertibleData,\n nullifier_key_validation_request::NullifierKeyValidationRequestContext,\n kernel_data::{PrivateKernelInnerData, PrivateKernelTailData},\n kernel_circuit_public_inputs::{PrivateKernelCircuitPublicInputsBuilder, PrivateKernelTailCircuitPublicInputs},\n side_effect::{SideEffect, SideEffectLinkedToNoteHash, Ordered}\n},\n constants::{\n MAX_NEW_COMMITMENTS_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_READ_REQUESTS_PER_TX,\n MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX\n},\n grumpkin_private_key::GrumpkinPrivateKey,\n hash::{compute_commitment_nonce, compute_unique_siloed_commitment},\n utils::{arrays::{array_length, array_eq}}, traits::{Empty, is_empty}\n};\n\nstruct PrivateKernelTailCircuitPrivateInputs {\n previous_kernel: PrivateKernelInnerData,\n sorted_new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_TX],\n sorted_new_commitments_indexes: [u32; MAX_NEW_COMMITMENTS_PER_TX],\n read_commitment_hints: [Field; MAX_READ_REQUESTS_PER_TX],\n sorted_new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_TX],\n sorted_new_nullifiers_indexes: [u32; MAX_NEW_NULLIFIERS_PER_TX],\n nullifier_commitment_hints: [Field; MAX_NEW_NULLIFIERS_PER_TX],\n master_nullifier_secret_keys: [GrumpkinPrivateKey; MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX],\n}\n\nimpl PrivateKernelTailCircuitPrivateInputs {\n fn validate_inputs(self) {\n assert_eq(\n array_length(self.previous_kernel.public_inputs.end.private_call_stack), 0, \"Private call stack must be empty when executing the ordering circuit\"\n );\n }\n\n fn validate_nullifier_keys(self, public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder) {\n let requests = self.previous_kernel.public_inputs.end.nullifier_key_validation_requests;\n for i in 0..MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX {\n let request = requests[i];\n if !is_empty(request) {\n let master_secret_key = self.master_nullifier_secret_keys[i];\n let computed_public_key = master_secret_key.derive_public_key();\n assert(\n computed_public_key.eq(request.public_key), \"Cannot derive nullifier public key from the master key.\"\n );\n\n let computed_secret_key = common::compute_siloed_nullifier_secret_key(master_secret_key, request.contract_address);\n assert(\n computed_secret_key.eq(request.secret_key), \"Cannot derive siloed secret key from the master key.\"\n );\n }\n }\n\n // Empty out nullifier key validation requests after verifying them.\n public_inputs.end.nullifier_key_validation_requests = BoundedVec::new(NullifierKeyValidationRequestContext::empty());\n }\n\n fn match_reads_to_commitments(self, public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder) {\n let new_commitments = public_inputs.end.new_commitments;\n let read_requests = public_inputs.end.read_requests;\n\n // match reads to commitments from the previous call(s)\n for rr_idx in 0..MAX_READ_REQUESTS_PER_TX {\n let read_request = read_requests.get_unchecked(rr_idx);\n let read_commitment_hint = self.read_commitment_hints[rr_idx] as u64;\n\n if (read_request.value != 0) {\n let commitment = new_commitments.get_unchecked(read_commitment_hint as Field);\n assert_eq(\n read_request.value, commitment.value, \"Hinted commitment does not match read request\"\n );\n assert(\n read_request.counter > commitment.counter, \"Read request counter must be greater than commitment counter\"\n );\n }\n }\n\n // Empty out read requests after matching them to commitments\n public_inputs.end.read_requests = BoundedVec::new(SideEffect::empty());\n }\n\n fn assert_sorted_counters<T, N>(original: [T; N], sorted: [T; N], indexes: [u32; N]) where T: Eq + Ordered + Empty {\n let mut prev_was_empty = false;\n\n for i in 0..N {\n let item = if prev_was_empty {\n sorted[i]\n } else {\n sorted[indexes[i]]\n };\n assert(item.eq(original[i]), \"Sorted item is not equal\");\n let is_empty = is_empty(item);\n\n if prev_was_empty {\n assert(is_empty, \"Empty items must be at the end\");\n } else if (i != 0) & !is_empty {\n assert(sorted[i].counter() > sorted[i - 1].counter(), \"Not sorted\");\n }\n\n prev_was_empty = is_empty;\n }\n }\n\n fn sort_arrays(self, public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder) {\n PrivateKernelTailCircuitPrivateInputs::assert_sorted_counters(\n public_inputs.end.new_commitments.storage,\n self.sorted_new_commitments,\n self.sorted_new_commitments_indexes\n );\n PrivateKernelTailCircuitPrivateInputs::assert_sorted_counters(\n public_inputs.end.new_nullifiers.storage,\n self.sorted_new_nullifiers,\n self.sorted_new_nullifiers_indexes\n );\n public_inputs.end.new_commitments.storage = self.sorted_new_commitments;\n public_inputs.end.new_nullifiers.storage = self.sorted_new_nullifiers;\n }\n\n fn match_nullifiers_to_commitments_and_squash(self, public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder) {\n // Remark: The commitments in public_inputs.end have already been siloed by contract address!\n // Match nullifiers/nullified_commitments to commitments from the previous call(s)\n let mut new_commitments = public_inputs.end.new_commitments.storage;\n let mut new_nullifiers = public_inputs.end.new_nullifiers.storage;\n\n for n_idx in 0..MAX_NEW_NULLIFIERS_PER_TX {\n let nullifier = new_nullifiers[n_idx];\n // TODO - should not be able to squash the first nullifier.\n let nullified_commitment = nullifier.note_hash;\n let hint_pos = self.nullifier_commitment_hints[n_idx] as u64;\n\n // Nullified_commitment of value `0` implies non-transient (persistable)\n // nullifier in which case no attempt will be made to match it to a commitment.\n // Non-empty nullified_commitment implies transient nullifier which MUST be matched to a commitment below!\n // 0-valued nullified_commitment is empty and will be ignored\n if nullified_commitment != 0 {\n assert(\n hint_pos < MAX_NEW_COMMITMENTS_PER_TX as u64, \"New nullifier is transient but hint is invalid\"\n );\n let commitment = new_commitments[hint_pos];\n assert_eq(nullified_commitment, commitment.value, \"Hinted commitment does not match\");\n assert(\n nullifier.counter > commitment.counter, \"Nullifier counter must be greater than commitment counter\"\n );\n // match found!\n // squash both the nullifier and the commitment\n // (set to 0 here and then rearrange array after loop)\n new_commitments[hint_pos] = SideEffect::empty();\n new_nullifiers[n_idx as u64] = SideEffectLinkedToNoteHash::empty();\n }\n // non-transient (persistable) nullifiers are just kept in new_nullifiers array and forwarded\n // to public inputs (used later by base rollup circuit)\n }\n\n // Move all zero-ed (removed) entries of these arrays to the end and preserve ordering of other entries\n\n let mut new_commitments_vec = BoundedVec::new(SideEffect::empty());\n\n for c_idx in 0..MAX_NEW_COMMITMENTS_PER_TX {\n if new_commitments[c_idx].value != 0 {\n new_commitments_vec.push(new_commitments[c_idx]);\n }\n }\n\n public_inputs.end.new_commitments = new_commitments_vec;\n\n let mut new_nullifiers_vec = BoundedVec::new(SideEffectLinkedToNoteHash::empty());\n\n for n_idx in 0..MAX_NEW_NULLIFIERS_PER_TX {\n if new_nullifiers[n_idx].value != 0 {\n new_nullifiers_vec.push(new_nullifiers[n_idx]);\n }\n }\n\n public_inputs.end.new_nullifiers = new_nullifiers_vec;\n }\n\n fn apply_commitment_nonces(public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder) {\n // Remark: The commitments in public_inputs.end have already been siloed by contract address!\n // tx hash\n let first_nullifier = public_inputs.end.new_nullifiers.get(0);\n let mut unique_commitments = public_inputs.end.new_commitments.storage;\n\n for c_idx in 0..MAX_NEW_COMMITMENTS_PER_TX {\n // Apply nonce to all non-zero/non-empty commitments\n // Nonce is the hash of the first (0th) nullifier and the commitment's index into new_commitments array\n let nonce = compute_commitment_nonce(first_nullifier.value, c_idx);\n let commitment = unique_commitments[c_idx];\n if commitment.value != 0 {\n let unique_commitment = compute_unique_siloed_commitment(nonce, commitment.value);\n unique_commitments[c_idx] = SideEffect{\n value: unique_commitment,\n counter: commitment.counter\n };\n }\n }\n\n public_inputs.end.new_commitments.storage = unique_commitments;\n }\n\n pub fn native_private_kernel_circuit_ordering(self) -> PrivateKernelTailCircuitPublicInputs {\n let mut public_inputs : PrivateKernelCircuitPublicInputsBuilder = unsafe::zeroed();\n public_inputs.is_private = true;\n\n self.validate_inputs();\n\n common::validate_previous_kernel_values(self.previous_kernel.public_inputs.end);\n\n // Do this before any functions can modify the inputs.\n common::initialize_end_values(self.previous_kernel, &mut public_inputs);\n\n self.validate_nullifier_keys(&mut public_inputs);\n\n self.sort_arrays(&mut public_inputs);\n\n self.match_reads_to_commitments(&mut public_inputs);\n\n self.match_nullifiers_to_commitments_and_squash(&mut public_inputs);\n\n PrivateKernelTailCircuitPrivateInputs::apply_commitment_nonces(&mut public_inputs);\n\n // TODO(fees) populate this\n let end_non_revertible : AccumulatedNonRevertibleData = unsafe::zeroed();\n\n public_inputs.to_tail(end_non_revertible)\n }\n}\n\nmod tests {\n use dep::std::cmp::Eq;\n use crate::private_kernel_tail::PrivateKernelTailCircuitPrivateInputs;\n use dep::types::constants::{MAX_READ_REQUESTS_PER_TX, MAX_NEW_COMMITMENTS_PER_TX, MAX_NEW_NULLIFIERS_PER_TX};\n use dep::types::{\n abis::{\n kernel_circuit_public_inputs::PrivateKernelTailCircuitPublicInputs,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash, Ordered}\n },\n hash::compute_unique_siloed_commitments, tests::kernel_data_builder::PreviousKernelDataBuilder,\n utils::{arrays::{array_eq, array_length}}, traits::{Empty, is_empty, is_empty_array}\n };\n\n struct PrivateKernelOrderingInputsBuilder {\n previous_kernel: PreviousKernelDataBuilder,\n read_commitment_hints: [Field; MAX_READ_REQUESTS_PER_TX],\n nullifier_commitment_hints: [Field; MAX_NEW_NULLIFIERS_PER_TX],\n }\n\n impl PrivateKernelOrderingInputsBuilder {\n pub fn new() -> Self {\n PrivateKernelOrderingInputsBuilder {\n previous_kernel: PreviousKernelDataBuilder::new(),\n read_commitment_hints: [0; MAX_READ_REQUESTS_PER_TX],\n nullifier_commitment_hints: [0; MAX_NEW_NULLIFIERS_PER_TX]\n }\n }\n\n pub fn get_new_commitments(self) -> [SideEffect; MAX_NEW_COMMITMENTS_PER_TX] {\n self.previous_kernel.end.new_commitments.storage\n }\n\n pub fn get_new_nullifiers(self) -> [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_TX] {\n self.previous_kernel.end.new_nullifiers.storage\n }\n\n pub fn get_unique_siloed_commitments(self) -> [SideEffect; MAX_NEW_COMMITMENTS_PER_TX] {\n self.compute_unique_siloed_commitments(self.previous_kernel.end.new_commitments.storage)\n }\n\n // A helper function that uses the first nullifer in the previous kernel to compute the unique siloed\n // commitments for the given commitments.\n pub fn compute_unique_siloed_commitments<N>(self, commitments: [SideEffect; N]) -> [SideEffect; N] {\n let first_nullifier = self.previous_kernel.end.new_nullifiers.get_unchecked(0);\n compute_unique_siloed_commitments(first_nullifier.value, commitments)\n }\n\n pub fn append_transient_commitments(&mut self, num_commitments: Field) {\n // All new commitments aggregated in the previous kernel are transient commitments.\n self.previous_kernel.append_new_commitments(num_commitments);\n }\n\n pub fn add_transient_read(&mut self, commitment_index: Field) {\n let read_request_index = self.previous_kernel.add_read_request_for_transient_commitment(commitment_index);\n self.read_commitment_hints[read_request_index] = commitment_index;\n }\n\n pub fn append_nullifiers(&mut self, num_nullifiers: Field) {\n self.previous_kernel.append_new_nullifiers(num_nullifiers);\n }\n\n pub fn nullify_transient_commitment(&mut self, nullifier_index: Field, commitment_index: Field) {\n self.previous_kernel.end.new_nullifiers.storage[nullifier_index].note_hash = self.previous_kernel.end.new_commitments.get(commitment_index).value;\n self.nullifier_commitment_hints[nullifier_index] = commitment_index;\n }\n\n fn sort_sideffects<T, N>(original: [T; N]) -> ([T; N], [u32; N]) where T: Ordered + Eq + Empty {\n let mut indexes = [0; N];\n for i in 0..N {\n indexes[i] = i as u32;\n }\n let sorted_indexes = indexes.sort_via(\n |a_index: u32, b_index: u32| {\n let a = original[a_index];\n let b = original[b_index];\n if is_empty(b) {\n true\n } else if is_empty(a) {\n false\n } else {\n a.counter() < b.counter()\n }\n }\n );\n let sorted_sideffects = sorted_indexes.map(|i: u32| original[i]);\n let mut reverse_map = [0; N];\n for i in 0..N {\n reverse_map[sorted_indexes[i]] = i;\n }\n\n (sorted_sideffects, reverse_map)\n }\n\n pub fn execute(self) -> PrivateKernelTailCircuitPublicInputs {\n let (sorted_new_commitments, sorted_new_commitments_indexes) = PrivateKernelOrderingInputsBuilder::sort_sideffects(self.get_new_commitments());\n let mut sorted_read_commitment_hints = [0; MAX_READ_REQUESTS_PER_TX];\n for i in 0..sorted_read_commitment_hints.len() {\n sorted_read_commitment_hints[i] = sorted_new_commitments_indexes[self.read_commitment_hints[i]] as Field;\n }\n let (sorted_new_nullifiers, sorted_new_nullifiers_indexes) = PrivateKernelOrderingInputsBuilder::sort_sideffects(self.get_new_nullifiers());\n let mut sorted_nullifier_commitment_hints = [0; MAX_NEW_NULLIFIERS_PER_TX];\n for i in 0..sorted_nullifier_commitment_hints.len() {\n sorted_nullifier_commitment_hints[i] = sorted_new_nullifiers_indexes[self.nullifier_commitment_hints[i]] as Field;\n }\n let kernel = PrivateKernelTailCircuitPrivateInputs {\n previous_kernel: self.previous_kernel.to_private_kernel_inner_data(),\n sorted_new_commitments,\n sorted_new_commitments_indexes,\n read_commitment_hints: sorted_read_commitment_hints,\n sorted_new_nullifiers,\n sorted_new_nullifiers_indexes,\n nullifier_commitment_hints: sorted_nullifier_commitment_hints,\n master_nullifier_secret_keys: dep::std::unsafe::zeroed()\n };\n kernel.native_private_kernel_circuit_ordering()\n }\n\n pub fn failed(self) {\n let _ = self.execute();\n }\n }\n\n #[test]\n unconstrained fn native_matching_one_read_request_to_commitment_works() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n\n builder.append_transient_commitments(1);\n builder.add_transient_read(0);\n\n let unique_siloed_commitments = builder.get_unique_siloed_commitments();\n\n let public_inputs = builder.execute();\n assert(array_length(public_inputs.end.new_commitments) == 1);\n assert(public_inputs.end.new_commitments[0].eq(unique_siloed_commitments[0]));\n }\n\n #[test]\n unconstrained fn native_matching_some_read_requests_to_commitments_works() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(MAX_NEW_COMMITMENTS_PER_TX);\n // Read the commitment at index 1;\n builder.add_transient_read(1);\n // Read the commitment at index 3;\n builder.add_transient_read(3);\n let unique_siloed_commitments = builder.get_unique_siloed_commitments();\n let public_inputs = builder.execute();\n assert_eq(array_length(public_inputs.end.new_commitments), MAX_NEW_COMMITMENTS_PER_TX);\n for i in 0..MAX_NEW_COMMITMENTS_PER_TX {\n assert(public_inputs.end.new_commitments[i].eq(unique_siloed_commitments[i]));\n }\n }\n\n #[test(should_fail_with=\"Hinted commitment does not match read request\")]\n unconstrained fn native_read_request_unknown_fails() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(1);\n builder.add_transient_read(0);\n // Tweak the read request so that it does not match the commitment at index 0;\n let read_request = builder.previous_kernel.end.read_requests.pop();\n builder.previous_kernel.end.read_requests.push(SideEffect { value: read_request.value + 1, counter: 0 });\n builder.failed();\n }\n\n #[test]\n unconstrained fn native_squash_one_of_one_transient_matches_works() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(1);\n builder.append_nullifiers(2);\n // The nullifier at index 1 is nullifying the commitment at index 0;\n builder.nullify_transient_commitment(1, 0);\n let new_nullifiers = builder.get_new_nullifiers();\n let public_inputs = builder.execute();\n assert(is_empty_array(public_inputs.end.new_commitments));\n\n // The nullifier at index 1 is chopped.\n let expected_new_nullifiers = [new_nullifiers[0], new_nullifiers[2]];\n assert(array_eq(public_inputs.end.new_nullifiers, expected_new_nullifiers));\n }\n\n #[test]\n unconstrained fn native_squash_one_of_two_transient_matches_works() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(2);\n builder.append_nullifiers(2);\n // The nullifier at index 1 is nullifying the commitment at index 0;\n builder.nullify_transient_commitment(1, 0);\n let new_commitments = builder.get_new_commitments();\n // The 0th commitment will be chopped.\n let unique_siloed_commitments = builder.compute_unique_siloed_commitments([new_commitments[1]]);\n let new_nullifiers = builder.get_new_nullifiers();\n let public_inputs = builder.execute();\n assert(\n array_eq(\n public_inputs.end.new_commitments,\n [unique_siloed_commitments[0]]\n )\n );\n // The nullifier at index 1 is chopped.\n let expected_new_nullifiers = [new_nullifiers[0], new_nullifiers[2]];\n assert(array_eq(public_inputs.end.new_nullifiers, expected_new_nullifiers));\n }\n\n #[test]\n unconstrained fn native_squash_two_of_two_transient_matches_works() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(2);\n builder.append_nullifiers(2);\n // The nullifier at index 1 is nullifying the commitment at index 1;\n builder.nullify_transient_commitment(1, 1);\n // The nullifier at index 2 is nullifying the commitment at index 0;\n builder.nullify_transient_commitment(2, 0);\n let new_nullifiers = builder.get_new_nullifiers();\n let public_inputs = builder.execute();\n assert(is_empty_array(public_inputs.end.new_commitments));\n assert(array_eq(public_inputs.end.new_nullifiers, [new_nullifiers[0]]));\n }\n\n #[test]\n unconstrained fn ordering_of_commitments_and_nullifiers() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n\n let mut sorted_new_commitments = [SideEffect::empty(); 10];\n let mut sorted_new_nullifiers = [SideEffectLinkedToNoteHash::empty(); 10];\n\n for i in 0..10 {\n sorted_new_commitments[i] = SideEffect { value: (i + 1) as Field, counter: i + 1 };\n sorted_new_nullifiers[i] = SideEffectLinkedToNoteHash { value: (i + 11) as Field, counter: i + 11, note_hash: 0 };\n }\n\n for i in 0..10 {\n builder.previous_kernel.end.new_commitments.push(sorted_new_commitments[9 - i]);\n builder.previous_kernel.end.new_nullifiers.push(sorted_new_nullifiers[9 - i]);\n }\n\n let public_inputs = builder.execute();\n\n let sorted_unique_commitments = compute_unique_siloed_commitments(\n public_inputs.end.new_nullifiers[0].value,\n sorted_new_commitments\n );\n\n for i in 0..10 {\n assert(public_inputs.end.new_commitments[i].eq(sorted_unique_commitments[i]));\n // +1 due to the 0th nullifier being the tx hash\n assert(public_inputs.end.new_nullifiers[i + 1].eq(sorted_new_nullifiers[i]));\n }\n }\n\n #[test]\n unconstrained fn native_empty_nullified_commitment_means_persistent_nullifier_0() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(2);\n builder.append_nullifiers(2);\n let public_inputs = builder.execute();\n assert_eq(array_length(public_inputs.end.new_commitments), 2);\n assert_eq(array_length(public_inputs.end.new_nullifiers), 3);\n }\n // same as previous test, but this time there are 0 commitments!\n // (Do we really need this test?)\n\n #[test]\n unconstrained fn native_empty_nullified_commitment_means_persistent_nullifier_1() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_nullifiers(2);\n let public_inputs = builder.execute();\n assert(array_length(public_inputs.end.new_commitments) == 0);\n assert(array_length(public_inputs.end.new_nullifiers) == 3);\n }\n\n #[test(should_fail)]\n unconstrained fn invalid_nullifier_commitment_hint_fails() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(1);\n builder.append_nullifiers(1);\n // The nullifier at index 1 is nullifying the commitment at index 0;\n builder.nullify_transient_commitment(1, 0);\n // Change the hint to be out of bounds.\n builder.nullifier_commitment_hints[1] = MAX_NEW_COMMITMENTS_PER_TX;\n builder.failed();\n }\n\n #[test(should_fail_with=\"Hinted commitment does not match\")]\n unconstrained fn wrong_nullifier_commitment_hint_fails() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.append_transient_commitments(2);\n builder.append_nullifiers(2);\n // The nullifier at index 1 is nullifying the commitment at index 1;\n builder.nullify_transient_commitment(1, 1);\n // The nullifier at index 2 is nullifying the commitment at index 0;\n builder.nullify_transient_commitment(2, 0);\n // Tweak the hint to be for the commitment at index 1.\n builder.nullifier_commitment_hints[2] = 1;\n builder.failed();\n }\n\n #[test(should_fail_with=\"Private call stack must be empty when executing the ordering circuit\")]\n unconstrained fn non_empty_private_call_stack_should_fail() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.previous_kernel.push_private_call_request(1, false);\n builder.failed();\n }\n\n #[test(should_fail_with=\"The 0th nullifier in the accumulated nullifier array is zero\")]\n unconstrained fn zero_0th_nullifier_fails() {\n let mut builder = PrivateKernelOrderingInputsBuilder::new();\n builder.previous_kernel.end.new_nullifiers = BoundedVec::new(SideEffectLinkedToNoteHash::empty());\n builder.failed();\n }\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/private_kernel_tail.nr" }, "114": { "source": "use dep::std;\nuse dep::types::{\n abis::{\n call_request::CallRequest, combined_accumulated_data::CombinedAccumulatedData,\n function_data::FunctionData, kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputsBuilder,\n membership_witness::ReadRequestMembershipWitness, new_contract_data::NewContractData,\n nullifier_key_validation_request::NullifierKeyValidationRequestContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_kernel::private_call_data::PrivateCallData,\n kernel_data::{PrivateKernelInnerData, PrivateKernelTailData},\n side_effect::{SideEffect, SideEffectLinkedToNoteHash}\n},\n address::{AztecAddress, EthAddress, PartialAddress, compute_initialization_hash},\n contract_class::ContractClassId, contrakt::deployment_data::ContractDeploymentData,\n constants::{\n MAX_NEW_NULLIFIERS_PER_CALL, MAX_NEW_L2_TO_L1_MSGS_PER_CALL, MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_CALL\n},\n grumpkin_private_key::GrumpkinPrivateKey,\n hash::{\n compute_constructor_hash, compute_l2_to_l1_hash, compute_logs_hash,\n compute_new_contract_address_hash, contract_tree_root_from_siblings,\n function_tree_root_from_siblings, pedersen_hash, private_functions_root_from_siblings,\n read_request_root_from_siblings, silo_commitment, silo_nullifier,\n stdlib_recursion_verification_key_compress_native_vk\n},\n utils::{arrays::{array_length, array_to_bounded_vec, validate_array}},\n traits::{is_empty, is_empty_array}\n};\n\npub fn validate_arrays(app_public_inputs: PrivateCircuitPublicInputs) {\n // Each of the following arrays is expected to be zero-padded.\n // In addition, some of the following arrays (new_commitments, etc...) are passed\n // to extend_from_array_to_array() routines which rely on the passed arrays to be well-formed.\n\n validate_array(app_public_inputs.return_values);\n validate_array(app_public_inputs.read_requests);\n validate_array(app_public_inputs.nullifier_key_validation_requests);\n validate_array(app_public_inputs.new_commitments);\n validate_array(app_public_inputs.new_nullifiers);\n validate_array(app_public_inputs.private_call_stack_hashes);\n validate_array(app_public_inputs.public_call_stack_hashes);\n validate_array(app_public_inputs.new_l2_to_l1_msgs);\n // encrypted_logs_hash and unencrypted_logs_hash have their own integrity checks.\n}\n\n// Validate all read requests against the historical note hash tree root.\n// Use their membership witnesses to do so. If the historical root is not yet\n// initialized, initialize it using the first read request here (if present).\n//\n// More info here:\n// - https://discourse.aztec.network/t/to-read-or-not-to-read/178\n// - https://discourse.aztec.network/t/spending-notes-which-havent-yet-been-inserted/180\npub fn validate_read_requests(\n historical_note_hash_tree_root: Field,\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_CALL],\n read_request_membership_witnesses: [ReadRequestMembershipWitness; MAX_READ_REQUESTS_PER_CALL]\n) {\n // membership witnesses must resolve to the same note hash tree root\n // for every request in all kernel iterations\n for rr_idx in 0..MAX_READ_REQUESTS_PER_CALL {\n let read_request = read_requests[rr_idx].value;\n let witness = read_request_membership_witnesses[rr_idx];\n\n // A pending commitment is the one that is not yet added to note hash tree\n // A \"transient read\" is when we try to \"read\" a pending commitment within a transaction\n // between function calls, as opposed to reading the outputs of a previous transaction\n // which is a \"pending read\".\n // A transient read is when we try to \"read\" a pending commitment\n // We determine if it is a transient read depending on the leaf index from the membership witness\n // Note that the Merkle membership proof would be null and void in case of an transient read\n // but we use the leaf index as a placeholder to detect a 'pending note read'.\n\n if (read_request != 0) & (witness.is_transient == false) {\n let root_for_read_request = read_request_root_from_siblings(read_request, witness.leaf_index, witness.sibling_path);\n assert(root_for_read_request == historical_note_hash_tree_root, \"note hash tree root mismatch\");\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1354): do we need to enforce\n // that a non-transient read_request was derived from the proper/current contract address?\n }\n }\n}\n\npub fn initialize_end_values(\n previous_kernel: PrivateKernelInnerData,\n public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder\n) {\n public_inputs.constants = previous_kernel.public_inputs.constants;\n\n // Ensure the arrays are the same as previously, before we start pushing more data onto them in other\n // functions within this circuit:\n let start = previous_kernel.public_inputs.end;\n\n public_inputs.end.read_requests = array_to_bounded_vec(start.read_requests);\n public_inputs.end.nullifier_key_validation_requests = array_to_bounded_vec(start.nullifier_key_validation_requests);\n\n public_inputs.end.new_commitments = array_to_bounded_vec(start.new_commitments);\n public_inputs.end.new_nullifiers = array_to_bounded_vec(start.new_nullifiers);\n\n public_inputs.end.private_call_stack = array_to_bounded_vec(start.private_call_stack);\n public_inputs.end.public_call_stack = array_to_bounded_vec(start.public_call_stack);\n public_inputs.end.new_l2_to_l1_msgs = array_to_bounded_vec(start.new_l2_to_l1_msgs);\n\n public_inputs.end.encrypted_logs_hash = start.encrypted_logs_hash;\n public_inputs.end.unencrypted_logs_hash = start.unencrypted_logs_hash;\n\n public_inputs.end.encrypted_log_preimages_length = start.encrypted_log_preimages_length;\n public_inputs.end.unencrypted_log_preimages_length = start.unencrypted_log_preimages_length;\n\n public_inputs.end.new_contracts = array_to_bounded_vec(start.new_contracts);\n}\n\nfn perform_static_call_checks(private_call: PrivateCallData) {\n let public_inputs = private_call.call_stack_item.public_inputs;\n let is_static_call = public_inputs.call_context.is_static_call;\n if is_static_call {\n // No state changes are allowed for static calls:\n assert(\n is_empty_array(public_inputs.new_commitments), \"new_commitments must be empty for static calls\"\n );\n assert(\n is_empty_array(public_inputs.new_nullifiers), \"new_nullifiers must be empty for static calls\"\n );\n }\n}\n\nfn is_valid_caller(request: CallRequest, private_call: PrivateCallData) -> bool {\n let call_context = private_call.call_stack_item.public_inputs.call_context;\n let valid_caller_context = request.caller_context.msg_sender.eq(call_context.msg_sender)\n & request.caller_context.storage_contract_address.eq(call_context.storage_contract_address);\n request.caller_contract_address.eq(private_call.call_stack_item.contract_address)\n & (request.caller_context.is_empty() | valid_caller_context)\n}\n\nfn validate_call_requests<N>(\n call_requests: BoundedVec<CallRequest, N>,\n hashes: [Field; N],\n private_call: PrivateCallData\n) {\n assert_eq(\n array_length(hashes), call_requests.len(), \"call requests length does not match the expected length\"\n );\n for i in 0..N {\n let hash = hashes[i];\n if hash != 0 {\n let request = call_requests.get_unchecked(i);\n assert_eq(request.hash, hash, \"call stack hash does not match call request hash\");\n assert(is_valid_caller(request, private_call), \"invalid caller\");\n }\n }\n}\n\npub fn update_end_values(\n private_call: PrivateCallData,\n public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder\n) {\n // If this call is a static call, certain operations are disallowed, such as creating new state.\n perform_static_call_checks(private_call);\n\n let private_call_public_inputs = private_call.call_stack_item.public_inputs;\n\n let read_requests = private_call_public_inputs.read_requests;\n let read_request_membership_witnesses = private_call.read_request_membership_witnesses;\n\n let nullifier_key_validation_requests = private_call_public_inputs.nullifier_key_validation_requests;\n\n let new_commitments = private_call_public_inputs.new_commitments;\n let new_nullifiers = private_call_public_inputs.new_nullifiers;\n\n let storage_contract_address = private_call_public_inputs.call_context.storage_contract_address;\n\n // Transient read requests and witnesses are accumulated in public_inputs.end\n // We silo the read requests (domain separation per contract address)\n let mut siloed_read_requests: BoundedVec<SideEffect, MAX_READ_REQUESTS_PER_CALL> = BoundedVec::new(SideEffect::empty());\n for i in 0..MAX_READ_REQUESTS_PER_CALL {\n let read_request = read_requests[i].value;\n let witness = read_request_membership_witnesses[i];\n if witness.is_transient & (read_request != 0) { // only forward transient to public inputs\n siloed_read_requests.push(\n SideEffect { counter: read_requests[i].counter, value: silo_commitment(storage_contract_address, read_request) }\n )\n }\n }\n public_inputs.end.read_requests.extend_from_bounded_vec(siloed_read_requests);\n\n // Nullifier key validation requests.\n for i in 0..MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_CALL {\n let request = nullifier_key_validation_requests[i];\n if !is_empty(request) {\n public_inputs.end.nullifier_key_validation_requests.push(request.to_context(storage_contract_address));\n }\n }\n\n // Enhance commitments and nullifiers with domain separation whereby domain is the contract.\n //\n // nullifiers\n let mut siloed_new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL> = BoundedVec::new(SideEffectLinkedToNoteHash::empty());\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL {\n let new_nullifier = new_nullifiers[i];\n if new_nullifier.value != 0 {\n let siloed_note_hash = if new_nullifier.note_hash == 0 {\n 0\n } else {\n silo_commitment(storage_contract_address, new_nullifier.note_hash)\n };\n siloed_new_nullifiers.push(\n SideEffectLinkedToNoteHash {\n value: silo_nullifier(storage_contract_address, new_nullifier.value),\n counter: new_nullifier.counter,\n note_hash: siloed_note_hash\n }\n );\n }\n }\n public_inputs.end.new_nullifiers.extend_from_bounded_vec(siloed_new_nullifiers);\n\n // commitments\n let mut siloed_new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL> = BoundedVec::new(SideEffect::empty());\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL {\n let new_commitment = new_commitments[i].value;\n if new_commitment != 0 {\n siloed_new_commitments.push(\n SideEffect { value: silo_commitment(storage_contract_address, new_commitment), counter: new_commitments[i].counter }\n );\n }\n }\n public_inputs.end.new_commitments.extend_from_bounded_vec(siloed_new_commitments);\n\n // Call stacks\n // Private call stack.\n let private_call_stack = array_to_bounded_vec(private_call.private_call_stack);\n validate_call_requests(\n private_call_stack,\n private_call_public_inputs.private_call_stack_hashes,\n private_call\n );\n public_inputs.end.private_call_stack.extend_from_bounded_vec(private_call_stack);\n // Public call stack.\n let public_call_stack = array_to_bounded_vec(private_call.public_call_stack);\n validate_call_requests(\n public_call_stack,\n private_call_public_inputs.public_call_stack_hashes,\n private_call\n );\n public_inputs.end.public_call_stack.extend_from_bounded_vec(public_call_stack);\n\n // new l2 to l1 messages\n let portal_contract_address = private_call.portal_contract_address;\n let new_l2_to_l1_msgs = private_call_public_inputs.new_l2_to_l1_msgs;\n let mut new_l2_to_l1_msgs_to_insert : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL> = BoundedVec::new(0);\n for i in 0..MAX_NEW_L2_TO_L1_MSGS_PER_CALL {\n let msg_is_zero = new_l2_to_l1_msgs[i] == 0;\n if msg_is_zero == false {\n let new_l2_to_l1_msgs = compute_l2_to_l1_hash(\n storage_contract_address,\n private_call_public_inputs.version,\n portal_contract_address,\n private_call_public_inputs.chain_id,\n new_l2_to_l1_msgs[i]\n );\n new_l2_to_l1_msgs_to_insert.push(new_l2_to_l1_msgs)\n }\n }\n public_inputs.end.new_l2_to_l1_msgs.extend_from_bounded_vec(new_l2_to_l1_msgs_to_insert);\n\n // logs hashes\n // See the following thread if not clear:\n // https://discourse.aztec.network/t/proposal-forcing-the-sequencer-to-actually-submit-data-to-l1/426\n let previous_encrypted_logs_hash = public_inputs.end.encrypted_logs_hash;\n let current_encrypted_logs_hash = private_call_public_inputs.encrypted_logs_hash;\n public_inputs.end.encrypted_logs_hash = compute_logs_hash(previous_encrypted_logs_hash,current_encrypted_logs_hash);\n let previous_unencrypted_logs_hash = public_inputs.end.unencrypted_logs_hash;\n let current_unencrypted_logs_hash = private_call_public_inputs.unencrypted_logs_hash;\n public_inputs.end.unencrypted_logs_hash = compute_logs_hash(previous_unencrypted_logs_hash,current_unencrypted_logs_hash);\n\n // Add log preimages lengths from current iteration to accumulated lengths\n public_inputs.end.encrypted_log_preimages_length = public_inputs.end.encrypted_log_preimages_length +\n private_call_public_inputs.encrypted_log_preimages_length;\n public_inputs.end.unencrypted_log_preimages_length = public_inputs.end.unencrypted_log_preimages_length + private_call_public_inputs.unencrypted_log_preimages_length;\n}\n\npub fn contract_logic(\n private_call: PrivateCallData,\n public_inputs: &mut PrivateKernelCircuitPublicInputsBuilder,\n contract_dep_data: ContractDeploymentData,\n function_data: FunctionData\n) {\n let private_call_public_inputs = private_call.call_stack_item.public_inputs;\n let portal_contract_address = private_call.portal_contract_address;\n let contract_address = private_call.call_stack_item.contract_address;\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3062): Why is this using a hash function from the stdlib::recursion namespace\n let private_call_vk_hash = stdlib_recursion_verification_key_compress_native_vk(private_call.vk);\n\n let is_contract_deployment = public_inputs.constants.tx_context.is_contract_deployment_tx;\n\n // input storage contract address must be 0 if its a constructor call and non-zero otherwise\n if is_contract_deployment {\n let computed_initialization_hash = compute_initialization_hash(\n function_data.selector.to_field(),\n private_call_public_inputs.args_hash\n );\n\n assert(\n computed_initialization_hash == contract_dep_data.initialization_hash, \"initialization hash does not match computed one\"\n );\n\n let new_contract_address = AztecAddress::compute_from_public_key(\n contract_dep_data.public_key,\n contract_dep_data.contract_class_id,\n contract_dep_data.contract_address_salt,\n contract_dep_data.initialization_hash,\n contract_dep_data.portal_contract_address\n );\n\n let new_contract_data = NewContractData {\n contract_address: new_contract_address,\n portal_contract_address,\n contract_class_id: contract_dep_data.contract_class_id\n };\n public_inputs.end.new_contracts.push(new_contract_data);\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3062) VKs are mocked out for now\n // assert(contract_dep_data.constructor_vk_hash == private_call_vk_hash, \"constructor_vk_hash doesn't match private_call_vk_hash\");\n\n assert(\n contract_address.eq(new_contract_address), \"contract address supplied does not match derived address\"\n );\n\n let new_contract_address_nullifier = compute_new_contract_address_hash(new_contract_address);\n\n public_inputs.end.new_nullifiers.push(\n SideEffectLinkedToNoteHash { value: new_contract_address_nullifier, note_hash: 0, counter: 1 }\n );\n } else {\n // non-contract deployments must specify contract address being interacted with\n assert(!contract_address.is_zero(), \"contract address cannot be zero\");\n // std::println(f\"contract_address={contract_address}\");\n // std::println(f\"private_call_vk_hash={private_call_vk_hash}\");\n\n // Recompute the contract class id\n let computed_private_functions_root = private_functions_root_from_siblings(\n private_call.call_stack_item.function_data.selector,\n private_call_vk_hash,\n private_call.function_leaf_membership_witness.leaf_index,\n private_call.function_leaf_membership_witness.sibling_path\n );\n // std::println(f\"computed_private_functions_root={computed_private_functions_root}\");\n\n let computed_contract_class_id = ContractClassId::compute(\n private_call.contract_class_artifact_hash,\n computed_private_functions_root,\n private_call.contract_class_public_bytecode_commitment\n );\n // std::println(f\"computed_contract_class_id={computed_contract_class_id}\");\n\n // Recompute contract address using the preimage which includes the class_id\n let computed_partial_address = PartialAddress::compute_from_salted_initialization_hash(\n computed_contract_class_id,\n private_call.salted_initialization_hash\n );\n // std::println(f\"computed_partial_address={computed_partial_address}\");\n\n let computed_address = AztecAddress::compute(private_call.public_keys_hash, computed_partial_address);\n // std::println(f\"computed_address={computed_address}\");\n\n assert(\n computed_address.eq(contract_address), \"computed contract address does not match expected one\"\n );\n }\n}\n\npub fn validate_previous_kernel_values(end: CombinedAccumulatedData) {\n assert(end.new_nullifiers[0].value != 0, \"The 0th nullifier in the accumulated nullifier array is zero\");\n}\n\npub fn validate_call_against_request(private_call: PrivateCallData, request: CallRequest) {\n let call_stack_item = private_call.call_stack_item;\n assert(\n request.hash == call_stack_item.hash(), \"calculated private_call_hash does not match provided private_call_hash at the top of the call stack\"\n );\n\n let call_context = call_stack_item.public_inputs.call_context;\n\n // Ensures that if the function is internal, only the contract itself can call it.\n if call_stack_item.function_data.is_internal {\n assert(\n call_context.msg_sender.eq(call_context.storage_contract_address), \"call is internal but msg_sender is not self\"\n );\n }\n\n if call_context.is_delegate_call {\n let caller_context = request.caller_context;\n assert(!caller_context.is_empty(), \"caller context cannot be empty for delegate calls\");\n assert(\n call_context.msg_sender.eq(caller_context.msg_sender), \"call stack msg_sender does not match expected msg_sender for delegate calls\"\n );\n assert(\n call_context.storage_contract_address.eq(caller_context.storage_contract_address), \"call stack storage address does not match expected contract address for delegate calls\"\n );\n assert(\n !call_stack_item.contract_address.eq(call_context.storage_contract_address), \"curent contract address must not match storage contract address for delegate calls\"\n );\n } else {\n let caller_contract_address = request.caller_contract_address;\n assert(\n call_context.msg_sender.eq(caller_contract_address), \"call stack msg_sender does not match caller contract address\"\n );\n assert(\n call_context.storage_contract_address.eq(call_stack_item.contract_address), \"call stack storage address does not match expected contract address\"\n );\n }\n}\n\nfn field_to_grumpkin_private_key(val: Field) -> GrumpkinPrivateKey {\n let bytes = val.to_be_bytes(32);\n let mut v = 1;\n let mut high = 0;\n let mut low = 0;\n\n for i in 0..16 {\n high = high + (bytes[15 - i] as Field) * v;\n low = low + (bytes[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n GrumpkinPrivateKey { high, low }\n}\n\npub fn compute_siloed_nullifier_secret_key(secret_key: GrumpkinPrivateKey, contract_address: AztecAddress) -> GrumpkinPrivateKey {\n // TODO: Temporary hack. Should replace it with a secure way to derive the secret key.\n // Match the way keys are derived in circuits.js/src/keys/index.ts\n let hash = pedersen_hash(\n [secret_key.high, secret_key.low, contract_address.to_field()],\n 0\n );\n field_to_grumpkin_private_key(hash)\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/private-kernel-lib/src/common.nr" }, "121": { "source": "use dep::private_kernel_lib::PrivateKernelTailCircuitPrivateInputs;\nuse dep::types::PrivateKernelTailCircuitPublicInputs;\n\nunconstrained fn main(input: PrivateKernelTailCircuitPrivateInputs) -> distinct pub PrivateKernelTailCircuitPublicInputs {\n input.native_private_kernel_circuit_ordering()\n}\n", "path": "/usr/src/noir-projects/noir-protocol-circuits/src/crates/private-kernel-tail-simulated/src/main.nr" } } }
|