@aztec/pxe 0.0.1-commit.2f68f620 → 0.0.1-commit.3100065
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bin/check_oracle_version.js +10 -20
- package/dest/bin/index.d.ts +2 -2
- package/dest/bin/index.d.ts.map +1 -1
- package/dest/bin/index.js +1 -1
- package/dest/bin/oracle_version_helpers.d.ts +26 -1
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
- package/dest/bin/oracle_version_helpers.js +162 -1
- package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
- package/dest/block_synchronizer/block_stream_source.js +4 -29
- package/dest/block_synchronizer/block_synchronizer.d.ts +18 -14
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +54 -18
- package/dest/config/index.d.ts +2 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract/contract_class_service.d.ts +31 -0
- package/dest/contract/contract_class_service.d.ts.map +1 -0
- package/dest/contract/contract_class_service.js +68 -0
- package/dest/contract/contract_sync_service.d.ts +48 -0
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
- package/dest/contract/helpers.d.ts +7 -0
- package/dest/contract/helpers.d.ts.map +1 -0
- package/dest/contract/helpers.js +20 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +64 -35
- package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +8 -28
- package/dest/contract_function_simulator/index.d.ts +19 -10
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +7 -9
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
- package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +6 -49
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -60
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/option.js +18 -13
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -24
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
- package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
- package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/index.js +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +2 -3
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +41 -30
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +248 -27
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +128 -17
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -33
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +220 -104
- package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
- package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/transient_array_service.js +62 -0
- package/dest/debug/pxe_debug_utils.d.ts +2 -2
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +8 -3
- package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +8 -3
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +5 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -2
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +8 -2
- package/dest/error_enriching.d.ts +5 -3
- package/dest/error_enriching.d.ts.map +1 -1
- package/dest/error_enriching.js +13 -11
- package/dest/hooks/execution_hooks.d.ts +31 -11
- package/dest/hooks/execution_hooks.d.ts.map +1 -1
- package/dest/hooks/execution_hooks.js +3 -3
- package/dest/hooks/index.d.ts +4 -3
- package/dest/hooks/index.d.ts.map +1 -1
- package/dest/hooks/index.js +1 -0
- package/dest/hooks/resolve_custom_request.d.ts +23 -0
- package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
- package/dest/hooks/resolve_custom_request.js +3 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
- package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
- package/dest/logs/log_service.d.ts +7 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +79 -28
- package/dest/messages/tx_resolver_service.d.ts +17 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +5 -5
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
- package/dest/private_kernel/hints/test_utils.js +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
- package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +17 -5
- package/dest/pxe.d.ts +114 -48
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +222 -139
- package/dest/storage/allowed_scopes.d.ts +6 -0
- package/dest/storage/allowed_scopes.d.ts.map +1 -0
- package/dest/storage/allowed_scopes.js +7 -0
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
- package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_service.js +6 -9
- package/dest/storage/contract_store/contract_store.d.ts +27 -24
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +64 -75
- package/dest/storage/fact_store/fact_service.d.ts +22 -0
- package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_service.js +45 -0
- package/dest/storage/fact_store/fact_store.d.ts +95 -0
- package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store.js +408 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store_keys.js +50 -0
- package/dest/storage/fact_store/index.d.ts +6 -0
- package/dest/storage/fact_store/index.d.ts.map +1 -0
- package/dest/storage/fact_store/index.js +4 -0
- package/dest/storage/fact_store/origin_state.d.ts +57 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +53 -0
- package/dest/storage/fact_store/stored_fact.d.ts +32 -0
- package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
- package/dest/storage/fact_store/stored_fact.js +64 -0
- package/dest/storage/index.d.ts +3 -2
- package/dest/storage/index.d.ts.map +1 -1
- package/dest/storage/index.js +2 -1
- package/dest/storage/metadata.d.ts +2 -2
- package/dest/storage/metadata.d.ts.map +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +42 -33
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +197 -168
- package/dest/storage/note_store/stored_note.d.ts +3 -8
- package/dest/storage/note_store/stored_note.d.ts.map +1 -1
- package/dest/storage/note_store/stored_note.js +4 -20
- package/dest/storage/open_pxe_stores.d.ts +5 -3
- package/dest/storage/open_pxe_stores.d.ts.map +1 -1
- package/dest/storage/open_pxe_stores.js +5 -3
- package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +40 -43
- package/dest/storage/tagging_store/index.d.ts +2 -2
- package/dest/storage/tagging_store/index.d.ts.map +1 -1
- package/dest/storage/tagging_store/index.js +1 -1
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
- package/dest/tagging/constants.d.ts +2 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +18 -9
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +21 -8
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +56 -16
- package/package.json +17 -17
- package/src/bin/check_oracle_version.ts +10 -19
- package/src/bin/index.ts +5 -1
- package/src/bin/oracle_version_helpers.ts +190 -0
- package/src/block_synchronizer/block_stream_source.ts +6 -45
- package/src/block_synchronizer/block_synchronizer.ts +70 -29
- package/src/config/index.ts +1 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract/contract_class_service.ts +83 -0
- package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
- package/src/contract/helpers.ts +35 -0
- package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
- package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +97 -45
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +26 -11
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
- package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
- package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
- package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/option.ts +17 -11
- package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
- package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -26
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
- package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
- package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
- package/src/contract_function_simulator/oracle/index.ts +1 -15
- package/src/contract_function_simulator/oracle/interfaces.ts +1 -2
- package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
- package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
- package/src/contract_function_simulator/oracle/oracle_registry.ts +162 -41
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +156 -24
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +357 -131
- package/src/contract_function_simulator/transient_array_service.ts +91 -0
- package/src/debug/pxe_debug_utils.ts +1 -1
- package/src/entrypoints/client/bundle/utils.ts +10 -3
- package/src/entrypoints/client/lazy/utils.ts +10 -3
- package/src/entrypoints/pxe_creation_options.ts +8 -2
- package/src/entrypoints/server/index.ts +5 -2
- package/src/entrypoints/server/utils.ts +10 -2
- package/src/error_enriching.ts +27 -11
- package/src/hooks/execution_hooks.ts +32 -12
- package/src/hooks/index.ts +8 -2
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
- package/src/logs/log_service.ts +91 -37
- package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
- package/src/oracle_version.ts +5 -5
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
- package/src/private_kernel/hints/test_utils.ts +1 -1
- package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +325 -159
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
- package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
- package/src/storage/capsule_store/capsule_service.ts +8 -13
- package/src/storage/contract_store/contract_store.ts +86 -93
- package/src/storage/fact_store/fact_service.ts +69 -0
- package/src/storage/fact_store/fact_store.ts +487 -0
- package/src/storage/fact_store/fact_store_keys.ts +75 -0
- package/src/storage/fact_store/index.ts +14 -0
- package/src/storage/fact_store/origin_state.ts +75 -0
- package/src/storage/fact_store/stored_fact.ts +80 -0
- package/src/storage/index.ts +2 -1
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +226 -187
- package/src/storage/note_store/stored_note.ts +5 -27
- package/src/storage/open_pxe_stores.ts +6 -3
- package/src/storage/private_event_store/private_event_store.ts +49 -55
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +19 -9
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +77 -16
- package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/oracle.js +0 -552
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
- package/dest/contract_sync/contract_sync_service.d.ts +0 -42
- package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
- package/dest/contract_sync/helpers.d.ts +0 -27
- package/dest/contract_sync/helpers.d.ts.map +0 -1
- package/dest/contract_sync/helpers.js +0 -53
- package/dest/messages/message_context_service.d.ts +0 -17
- package/dest/messages/message_context_service.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
- package/src/contract_function_simulator/oracle/oracle.ts +0 -711
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
- package/src/contract_sync/helpers.ts +0 -86
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
|
@@ -3,7 +3,7 @@ import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
|
3
3
|
import { uniqueBy } from '@aztec/foundation/collection';
|
|
4
4
|
import { Aes128 } from '@aztec/foundation/crypto/aes128';
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
|
-
import
|
|
6
|
+
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
7
7
|
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
9
9
|
import type { KeyStore } from '@aztec/key-store';
|
|
@@ -15,82 +15,87 @@ import {
|
|
|
15
15
|
toACVMWitness,
|
|
16
16
|
witnessMapToFields,
|
|
17
17
|
} from '@aztec/simulator/client';
|
|
18
|
+
import { STANDARD_HANDSHAKE_REGISTRY_ADDRESS } from '@aztec/standard-contracts/handshake-registry/constants';
|
|
18
19
|
import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
|
|
19
20
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
21
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
21
22
|
import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
22
|
-
import type { CompleteAddress,
|
|
23
|
+
import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
|
|
23
24
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
24
25
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
25
26
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
26
27
|
import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
MessageContext,
|
|
30
|
-
type PendingTaggedLog,
|
|
31
|
-
deriveAppSiloedSharedSecret,
|
|
32
|
-
} from '@aztec/stdlib/logs';
|
|
33
|
-
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
28
|
+
import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
29
|
+
import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
34
30
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
35
31
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
36
32
|
import {
|
|
37
33
|
type BlockHeader,
|
|
34
|
+
CallContext,
|
|
38
35
|
type Capsule,
|
|
39
36
|
type IndexedTxEffect,
|
|
40
37
|
type OffchainEffect,
|
|
41
|
-
TxEffect,
|
|
42
38
|
type TxHash,
|
|
43
39
|
} from '@aztec/stdlib/tx';
|
|
44
40
|
|
|
41
|
+
import type { ContractSyncService } from '../../contract/contract_sync_service.js';
|
|
45
42
|
import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
|
|
46
|
-
import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
|
|
47
43
|
import { EventService } from '../../events/event_service.js';
|
|
48
44
|
import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
|
|
49
45
|
import type { ExecutionHooks } from '../../hooks/index.js';
|
|
50
46
|
import { LogService } from '../../logs/log_service.js';
|
|
51
|
-
import {
|
|
47
|
+
import { TxResolverService } from '../../messages/tx_resolver_service.js';
|
|
52
48
|
import { NoteService } from '../../notes/note_service.js';
|
|
53
49
|
import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
|
|
54
50
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
55
51
|
import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
|
|
56
|
-
import
|
|
52
|
+
import { FactCollectionKey, FactCollectionTypeKey, anchoredTipBlockNumbers } from '../../storage/fact_store/index.js';
|
|
53
|
+
import type { FactService, OriginBlock } from '../../storage/fact_store/index.js';
|
|
57
54
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
58
55
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
59
56
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
60
|
-
import type {
|
|
57
|
+
import type { TaggingSecretSourcesStore } from '../../storage/tagging_store/tagging_secret_sources_store.js';
|
|
58
|
+
import type { AnchoredContractData } from '../anchored_contract_data.js';
|
|
59
|
+
import { AztecNodeReadCache } from '../aztec_node_read_cache.js';
|
|
61
60
|
import { EphemeralArrayService } from '../ephemeral_array_service.js';
|
|
62
61
|
import { BoundedVec } from '../noir-structs/bounded_vec.js';
|
|
62
|
+
import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
|
|
63
63
|
import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
|
|
64
64
|
import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
65
|
+
import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
|
|
65
66
|
import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
66
67
|
import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
67
68
|
import type { NoteData } from '../noir-structs/note_data.js';
|
|
68
69
|
import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
69
70
|
import { Option } from '../noir-structs/option.js';
|
|
71
|
+
import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
|
|
70
72
|
import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
|
|
71
|
-
import {
|
|
73
|
+
import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
|
|
74
|
+
import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
|
|
75
|
+
import type { UtilityContext } from '../noir-structs/utility_context.js';
|
|
72
76
|
import { pickNotes } from '../pick_notes.js';
|
|
77
|
+
import type { TransientArrayService } from '../transient_array_service.js';
|
|
78
|
+
import { buildACIRCallback } from './acir_callback.js';
|
|
73
79
|
import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
74
|
-
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
75
|
-
import { Oracle } from './oracle.js';
|
|
76
80
|
|
|
77
81
|
/** Args for UtilityExecutionOracle constructor. */
|
|
78
82
|
export type UtilityExecutionOracleArgs = {
|
|
79
|
-
|
|
83
|
+
callContext: CallContext;
|
|
80
84
|
/** List of transient auth witnesses to be used during this simulation */
|
|
81
85
|
authWitnesses: AuthWitness[];
|
|
82
86
|
capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
|
|
83
87
|
anchorBlockHeader: BlockHeader;
|
|
84
|
-
|
|
88
|
+
anchoredContractData: AnchoredContractData;
|
|
85
89
|
noteStore: NoteStore;
|
|
86
90
|
keyStore: KeyStore;
|
|
87
91
|
addressStore: AddressStore;
|
|
88
92
|
aztecNode: AztecNode;
|
|
89
93
|
recipientTaggingStore: RecipientTaggingStore;
|
|
90
|
-
|
|
94
|
+
taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
91
95
|
capsuleService: CapsuleService;
|
|
96
|
+
factService: FactService;
|
|
92
97
|
privateEventStore: PrivateEventStore;
|
|
93
|
-
|
|
98
|
+
txResolver: TxResolverService;
|
|
94
99
|
contractSyncService: ContractSyncService;
|
|
95
100
|
l2TipsStore: L2TipsProvider;
|
|
96
101
|
jobId: string;
|
|
@@ -100,6 +105,7 @@ export type UtilityExecutionOracleArgs = {
|
|
|
100
105
|
hooks?: ExecutionHooks;
|
|
101
106
|
/** Needed to trigger contract synchronization before nested cross-contract calls. */
|
|
102
107
|
utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
108
|
+
transientArrayService: TransientArrayService;
|
|
103
109
|
};
|
|
104
110
|
|
|
105
111
|
/**
|
|
@@ -113,24 +119,27 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
113
119
|
private aztecnrLogger: Logger | undefined;
|
|
114
120
|
private offchainEffects: OffchainEffect[] = [];
|
|
115
121
|
private readonly ephemeralArrayService = new EphemeralArrayService();
|
|
122
|
+
protected readonly transientArrayService: TransientArrayService;
|
|
123
|
+
private readonly aztecNodeReadCache: AztecNodeReadCache;
|
|
116
124
|
|
|
117
125
|
// We store oracle version to be able to show a nice error message when an oracle handler is missing.
|
|
118
126
|
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
119
127
|
|
|
120
|
-
protected readonly
|
|
128
|
+
protected readonly callContext: CallContext;
|
|
121
129
|
protected readonly authWitnesses: AuthWitness[];
|
|
122
130
|
protected readonly capsules: Capsule[];
|
|
123
131
|
protected readonly anchorBlockHeader: BlockHeader;
|
|
124
|
-
protected readonly
|
|
132
|
+
protected readonly anchoredContractData: AnchoredContractData;
|
|
125
133
|
protected readonly noteStore: NoteStore;
|
|
126
134
|
protected readonly keyStore: KeyStore;
|
|
127
135
|
protected readonly addressStore: AddressStore;
|
|
128
136
|
protected readonly aztecNode: AztecNode;
|
|
129
137
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
130
|
-
protected readonly
|
|
138
|
+
protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
131
139
|
protected readonly capsuleService: CapsuleService;
|
|
140
|
+
protected readonly factService: FactService;
|
|
132
141
|
protected readonly privateEventStore: PrivateEventStore;
|
|
133
|
-
protected readonly
|
|
142
|
+
protected readonly txResolver: TxResolverService;
|
|
134
143
|
protected readonly contractSyncService: ContractSyncService;
|
|
135
144
|
protected readonly l2TipsStore: L2TipsProvider;
|
|
136
145
|
protected readonly jobId: string;
|
|
@@ -141,20 +150,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
141
150
|
protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
142
151
|
|
|
143
152
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
144
|
-
this.
|
|
153
|
+
this.callContext = args.callContext;
|
|
145
154
|
this.authWitnesses = args.authWitnesses;
|
|
146
155
|
this.capsules = args.capsules;
|
|
147
156
|
this.anchorBlockHeader = args.anchorBlockHeader;
|
|
148
|
-
this.
|
|
157
|
+
this.anchoredContractData = args.anchoredContractData;
|
|
149
158
|
this.noteStore = args.noteStore;
|
|
150
159
|
this.keyStore = args.keyStore;
|
|
151
160
|
this.addressStore = args.addressStore;
|
|
152
161
|
this.aztecNode = args.aztecNode;
|
|
153
162
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
154
|
-
this.
|
|
163
|
+
this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
|
|
155
164
|
this.capsuleService = args.capsuleService;
|
|
165
|
+
this.factService = args.factService;
|
|
156
166
|
this.privateEventStore = args.privateEventStore;
|
|
157
|
-
this.
|
|
167
|
+
this.txResolver = args.txResolver;
|
|
158
168
|
this.contractSyncService = args.contractSyncService;
|
|
159
169
|
this.l2TipsStore = args.l2TipsStore;
|
|
160
170
|
this.jobId = args.jobId;
|
|
@@ -163,6 +173,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
163
173
|
this.simulator = args.simulator;
|
|
164
174
|
this.hooks = args.hooks;
|
|
165
175
|
this.utilityExecutor = args.utilityExecutor;
|
|
176
|
+
this.transientArrayService = args.transientArrayService;
|
|
177
|
+
this.aztecNodeReadCache = new AztecNodeReadCache(args.aztecNode);
|
|
166
178
|
}
|
|
167
179
|
|
|
168
180
|
public assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
@@ -189,17 +201,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
189
201
|
}
|
|
190
202
|
|
|
191
203
|
public getUtilityContext(): UtilityContext {
|
|
192
|
-
return
|
|
204
|
+
return {
|
|
205
|
+
blockHeader: this.anchorBlockHeader,
|
|
206
|
+
contractAddress: this.callContext.contractAddress,
|
|
207
|
+
msgSender: this.callContext.msgSender,
|
|
208
|
+
};
|
|
193
209
|
}
|
|
194
210
|
|
|
195
211
|
/**
|
|
196
212
|
* Retrieve keys associated with a specific master public key and app address.
|
|
197
213
|
* @param pkMHash - The master public key hash.
|
|
214
|
+
* @param _keyIndex - Sent by the Noir oracle caller but unused here; kept to match the oracle signature.
|
|
198
215
|
* @returns A Promise that resolves to nullifier keys.
|
|
199
216
|
* @throws If the keys are not registered in the key store.
|
|
200
217
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
201
218
|
*/
|
|
202
|
-
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
219
|
+
public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
|
|
203
220
|
let hasAccess = false;
|
|
204
221
|
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
205
222
|
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
@@ -251,9 +268,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
251
268
|
// hash at all. If the block hash did not exist by the reference block hash, then the node will not return the
|
|
252
269
|
// membership witness as there is none.
|
|
253
270
|
const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
254
|
-
this.
|
|
271
|
+
this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
|
|
255
272
|
);
|
|
256
|
-
return witness ? Option.some(witness) : Option.none(
|
|
273
|
+
return witness ? Option.some(witness) : Option.none();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Returns whether each block hash is present in the archive tree at the referenced block. */
|
|
277
|
+
public async areBlockHashesInArchive(
|
|
278
|
+
referenceBlockHash: BlockHash,
|
|
279
|
+
blockHashes: EphemeralArray<BlockHash>,
|
|
280
|
+
): Promise<EphemeralArray<boolean>> {
|
|
281
|
+
const hashes = blockHashes.readAll(this.ephemeralArrayService);
|
|
282
|
+
const memberships = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
283
|
+
Promise.all(
|
|
284
|
+
hashes.map(blockHash =>
|
|
285
|
+
this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash).then(Boolean),
|
|
286
|
+
),
|
|
287
|
+
),
|
|
288
|
+
);
|
|
289
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
|
|
257
290
|
}
|
|
258
291
|
|
|
259
292
|
/**
|
|
@@ -304,7 +337,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
304
337
|
*/
|
|
305
338
|
public async getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness> {
|
|
306
339
|
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
307
|
-
this.
|
|
340
|
+
this.aztecNodeReadCache.getPublicDataWitness(blockHash, leafSlot),
|
|
308
341
|
);
|
|
309
342
|
if (!witness) {
|
|
310
343
|
throw new Error(`Public data witness not found for slot ${leafSlot} at block hash ${blockHash.toString()}.`);
|
|
@@ -345,7 +378,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
345
378
|
): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
|
|
346
379
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
347
380
|
if (!completeAddress) {
|
|
348
|
-
return Option.none(
|
|
381
|
+
return Option.none();
|
|
349
382
|
}
|
|
350
383
|
return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
|
|
351
384
|
}
|
|
@@ -355,7 +388,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
355
388
|
if (!completeAddress) {
|
|
356
389
|
throw new Error(
|
|
357
390
|
`No public key registered for address ${account}.
|
|
358
|
-
Register it by calling
|
|
391
|
+
Register it by calling wallet.registerSender(...).\nSee docs for context: https://docs.aztec.network/errors/14`,
|
|
359
392
|
);
|
|
360
393
|
}
|
|
361
394
|
return completeAddress;
|
|
@@ -366,8 +399,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
366
399
|
* @param address - Address.
|
|
367
400
|
* @returns A contract instance.
|
|
368
401
|
*/
|
|
369
|
-
public async getContractInstance(address: AztecAddress): Promise<
|
|
370
|
-
const instance = await this.
|
|
402
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
|
|
403
|
+
const instance = await this.anchoredContractData.getContractInstance(address);
|
|
371
404
|
if (!instance) {
|
|
372
405
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
373
406
|
}
|
|
@@ -464,23 +497,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
464
497
|
}
|
|
465
498
|
|
|
466
499
|
/**
|
|
467
|
-
* Returns the membership witness of an
|
|
468
|
-
* @param contractAddress - Address of a contract by which the message was emitted.
|
|
500
|
+
* Returns the membership witness of an L1 to L2 message.
|
|
469
501
|
* @param messageHash - Hash of the message.
|
|
470
|
-
* @param
|
|
471
|
-
*
|
|
502
|
+
* @param nullifier - When present, the unsiloed nullifier of the message and the address to silo it with. The witness
|
|
503
|
+
* is only returned if the siloed nullifier is absent from the nullifier tree, i.e. the message has not been consumed.
|
|
472
504
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
473
505
|
*/
|
|
474
|
-
public async
|
|
475
|
-
const [messageIndex, siblingPath] = await
|
|
506
|
+
public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
|
|
507
|
+
const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
|
|
476
508
|
this.aztecNode,
|
|
477
|
-
contractAddress,
|
|
478
509
|
messageHash,
|
|
479
|
-
|
|
510
|
+
nullifier.value,
|
|
480
511
|
await this.anchorBlockHeader.hash(),
|
|
481
512
|
);
|
|
482
513
|
|
|
483
|
-
return
|
|
514
|
+
return { index: messageIndex, siblingPath };
|
|
484
515
|
}
|
|
485
516
|
|
|
486
517
|
/**
|
|
@@ -497,16 +528,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
497
528
|
numberOfElements: number,
|
|
498
529
|
) {
|
|
499
530
|
return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
|
|
500
|
-
const
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
531
|
+
const values = await this.aztecNodeReadCache.getPublicStorageRange(
|
|
532
|
+
blockHash,
|
|
533
|
+
contractAddress,
|
|
534
|
+
startStorageSlot,
|
|
535
|
+
numberOfElements,
|
|
506
536
|
);
|
|
507
537
|
|
|
508
538
|
this.logger.debug(
|
|
509
|
-
`Oracle storage read:
|
|
539
|
+
`Oracle storage read: start=${startStorageSlot.toString()} count=${numberOfElements} ` +
|
|
540
|
+
`address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
510
541
|
);
|
|
511
542
|
|
|
512
543
|
return values;
|
|
@@ -522,7 +553,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
522
553
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
523
554
|
this.contractLogger = await createContractLogger(
|
|
524
555
|
this.contractAddress,
|
|
525
|
-
addr => this.
|
|
556
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
526
557
|
'user',
|
|
527
558
|
{ instanceId: this.jobId },
|
|
528
559
|
);
|
|
@@ -539,7 +570,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
539
570
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
540
571
|
this.aztecnrLogger = await createContractLogger(
|
|
541
572
|
this.contractAddress,
|
|
542
|
-
addr => this.
|
|
573
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
543
574
|
'aztecnr',
|
|
544
575
|
{ instanceId: this.jobId },
|
|
545
576
|
);
|
|
@@ -559,7 +590,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
559
590
|
}
|
|
560
591
|
|
|
561
592
|
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
|
|
562
|
-
public async
|
|
593
|
+
public async getPendingTaggedLogsV2(
|
|
563
594
|
scope: AztecAddress,
|
|
564
595
|
providedSecrets: EphemeralArray<ProvidedSecret>,
|
|
565
596
|
): Promise<EphemeralArray<PendingTaggedLog>> {
|
|
@@ -579,7 +610,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
579
610
|
this.l2TipsStore,
|
|
580
611
|
this.keyStore,
|
|
581
612
|
this.recipientTaggingStore,
|
|
582
|
-
this.
|
|
613
|
+
this.taggingSecretSourcesStore,
|
|
583
614
|
this.addressStore,
|
|
584
615
|
this.jobId,
|
|
585
616
|
this.logger.getBindings(),
|
|
@@ -617,7 +648,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
617
648
|
]);
|
|
618
649
|
}
|
|
619
650
|
|
|
620
|
-
public async
|
|
651
|
+
public async getLogsByTagV2(
|
|
621
652
|
requests: EphemeralArray<LogRetrievalRequest>,
|
|
622
653
|
): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
|
|
623
654
|
const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
|
|
@@ -633,20 +664,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
633
664
|
return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
|
|
634
665
|
}
|
|
635
666
|
|
|
636
|
-
/**
|
|
637
|
-
public async
|
|
638
|
-
requests: EphemeralArray<Fr>,
|
|
639
|
-
): Promise<EphemeralArray<Option<MessageContext>>> {
|
|
667
|
+
/** Given an array of tx hashes, returns an aligned array of tx info if the tx is available. */
|
|
668
|
+
public async getResolvedTxs(requests: EphemeralArray<Fr>): Promise<EphemeralArray<Option<ResolvedTx>>> {
|
|
640
669
|
const txHashes = requests.readAll(this.ephemeralArrayService);
|
|
641
670
|
|
|
642
|
-
const
|
|
643
|
-
txHashes,
|
|
644
|
-
this.anchorBlockHeader.getBlockNumber(),
|
|
645
|
-
);
|
|
671
|
+
const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
|
|
646
672
|
|
|
647
|
-
const options =
|
|
648
|
-
mc ? Option.some(mc) : Option.none<MessageContext>(MessageContext.empty()),
|
|
649
|
-
);
|
|
673
|
+
const options = resolved.map(r => (r ? Option.some(r) : Option.none<ResolvedTx>()));
|
|
650
674
|
return EphemeralArray.fromValues(this.ephemeralArrayService, options);
|
|
651
675
|
}
|
|
652
676
|
|
|
@@ -654,24 +678,30 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
654
678
|
* Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
|
|
655
679
|
* block.
|
|
656
680
|
*/
|
|
657
|
-
public async getTxEffect(txHash: TxHash): Promise<Option<
|
|
681
|
+
public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
|
|
658
682
|
if (txHash.hash.isZero()) {
|
|
659
683
|
throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
|
|
660
684
|
}
|
|
661
685
|
|
|
662
|
-
const receipt = await this.
|
|
686
|
+
const receipt = await this.aztecNodeReadCache.getTxReceiptWithEffect(txHash);
|
|
663
687
|
if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
|
|
664
|
-
return Option.none(
|
|
688
|
+
return Option.none();
|
|
665
689
|
}
|
|
666
690
|
|
|
667
|
-
|
|
691
|
+
const txEffect = receipt.txEffect;
|
|
692
|
+
return Option.some({
|
|
693
|
+
...txEffect,
|
|
694
|
+
publicLogs: FlatPublicLogs.fromLogs(txEffect.publicLogs),
|
|
695
|
+
contractClassLogs: txEffect.contractClassLogs.map(log => ({
|
|
696
|
+
contractAddress: log.contractAddress,
|
|
697
|
+
fields: log.fields.toFields(),
|
|
698
|
+
emittedLength: log.emittedLength,
|
|
699
|
+
})),
|
|
700
|
+
});
|
|
668
701
|
}
|
|
669
702
|
|
|
670
703
|
public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
|
|
671
|
-
|
|
672
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
673
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
674
|
-
}
|
|
704
|
+
this.#assertOwnContract(contractAddress);
|
|
675
705
|
this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
|
|
676
706
|
}
|
|
677
707
|
|
|
@@ -681,19 +711,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
681
711
|
tSize: number,
|
|
682
712
|
scope: AztecAddress,
|
|
683
713
|
): Promise<Option<Fr[]>> {
|
|
684
|
-
|
|
685
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
686
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
687
|
-
}
|
|
714
|
+
this.#assertOwnContract(contractAddress);
|
|
688
715
|
const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
|
|
689
|
-
return values ? Option.some(values) : Option.none(
|
|
716
|
+
return values ? Option.some(values) : Option.none({ length: tSize });
|
|
690
717
|
}
|
|
691
718
|
|
|
692
719
|
public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
|
|
693
|
-
|
|
694
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
695
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
696
|
-
}
|
|
720
|
+
this.#assertOwnContract(contractAddress);
|
|
697
721
|
this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
|
|
698
722
|
}
|
|
699
723
|
|
|
@@ -704,11 +728,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
704
728
|
numEntries: number,
|
|
705
729
|
scope: AztecAddress,
|
|
706
730
|
): Promise<void> {
|
|
731
|
+
this.#assertOwnContract(contractAddress);
|
|
732
|
+
return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Asserts the executing contract may only access its own slice of PXE DB.
|
|
737
|
+
*/
|
|
738
|
+
#assertOwnContract(contractAddress: AztecAddress): void {
|
|
707
739
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
708
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
709
740
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
710
741
|
}
|
|
711
|
-
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* Records a fact into a collection. A `Some` origin block makes the fact retractable (pruned on reorg of that
|
|
746
|
+
* block), a `None` origin block makes it non-retractable, surviving reorgs.
|
|
747
|
+
*/
|
|
748
|
+
public recordFact(
|
|
749
|
+
contractAddress: AztecAddress,
|
|
750
|
+
scope: AztecAddress,
|
|
751
|
+
factCollectionTypeId: Fr,
|
|
752
|
+
factCollectionId: Fr,
|
|
753
|
+
factTypeId: Fr,
|
|
754
|
+
payload: EphemeralArray<Fr>,
|
|
755
|
+
originBlock: Option<OriginBlock>,
|
|
756
|
+
): Promise<void> {
|
|
757
|
+
this.#assertOwnContract(contractAddress);
|
|
758
|
+
return this.factService.recordFact(
|
|
759
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
760
|
+
factTypeId,
|
|
761
|
+
payload.readAll(this.ephemeralArrayService),
|
|
762
|
+
originBlock.isSome() ? originBlock.value : undefined,
|
|
763
|
+
this.jobId,
|
|
764
|
+
);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* Deletes a fact collection, removing all its facts. A no-op if no such collection exists.
|
|
769
|
+
*/
|
|
770
|
+
public deleteFactCollection(
|
|
771
|
+
contractAddress: AztecAddress,
|
|
772
|
+
scope: AztecAddress,
|
|
773
|
+
factCollectionTypeId: Fr,
|
|
774
|
+
factCollectionId: Fr,
|
|
775
|
+
): Promise<void> {
|
|
776
|
+
this.#assertOwnContract(contractAddress);
|
|
777
|
+
return this.factService.deleteFactCollection(
|
|
778
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
779
|
+
this.jobId,
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Returns a fact collection.
|
|
785
|
+
*/
|
|
786
|
+
public async getFactCollection(
|
|
787
|
+
contractAddress: AztecAddress,
|
|
788
|
+
scope: AztecAddress,
|
|
789
|
+
factCollectionTypeId: Fr,
|
|
790
|
+
factCollectionId: Fr,
|
|
791
|
+
): Promise<Option<FactCollection>> {
|
|
792
|
+
this.#assertOwnContract(contractAddress);
|
|
793
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
794
|
+
const collection = await this.factService.getFactCollection(
|
|
795
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
796
|
+
tips,
|
|
797
|
+
this.jobId,
|
|
798
|
+
);
|
|
799
|
+
return collection
|
|
800
|
+
? Option.some(
|
|
801
|
+
toNoirFactCollection(
|
|
802
|
+
this.ephemeralArrayService,
|
|
803
|
+
contractAddress,
|
|
804
|
+
scope,
|
|
805
|
+
factCollectionTypeId,
|
|
806
|
+
factCollectionId,
|
|
807
|
+
collection.facts,
|
|
808
|
+
),
|
|
809
|
+
)
|
|
810
|
+
: Option.none(emptyFactCollection(this.ephemeralArrayService));
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/** Returns every fact collection of `factCollectionTypeId`. */
|
|
814
|
+
public async getFactCollectionsByType(
|
|
815
|
+
contractAddress: AztecAddress,
|
|
816
|
+
scope: AztecAddress,
|
|
817
|
+
factCollectionTypeId: Fr,
|
|
818
|
+
): Promise<EphemeralArray<FactCollection>> {
|
|
819
|
+
this.#assertOwnContract(contractAddress);
|
|
820
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
821
|
+
const collections = await this.factService.getFactCollectionsByType(
|
|
822
|
+
new FactCollectionTypeKey(contractAddress, scope, factCollectionTypeId),
|
|
823
|
+
tips,
|
|
824
|
+
this.jobId,
|
|
825
|
+
);
|
|
826
|
+
return EphemeralArray.fromValues(
|
|
827
|
+
this.ephemeralArrayService,
|
|
828
|
+
collections.map(collection =>
|
|
829
|
+
toNoirFactCollection(
|
|
830
|
+
this.ephemeralArrayService,
|
|
831
|
+
collection.key.contractAddress,
|
|
832
|
+
collection.key.scope,
|
|
833
|
+
collection.key.factCollectionTypeId,
|
|
834
|
+
collection.key.factCollectionId,
|
|
835
|
+
collection.facts,
|
|
836
|
+
),
|
|
837
|
+
),
|
|
838
|
+
);
|
|
712
839
|
}
|
|
713
840
|
|
|
714
841
|
/**
|
|
@@ -734,7 +861,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
734
861
|
const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
|
|
735
862
|
return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
|
|
736
863
|
} catch {
|
|
737
|
-
return Option.none(
|
|
864
|
+
return Option.none({ maxLength: capacity });
|
|
738
865
|
}
|
|
739
866
|
}
|
|
740
867
|
|
|
@@ -743,11 +870,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
743
870
|
* @param address - The recipient address.
|
|
744
871
|
* @param ephPks - Ephemeral array containing the serialized Points.
|
|
745
872
|
* @param contractAddress - The contract address for app-siloing (validated against execution context).
|
|
746
|
-
* @returns A new ephemeral array containing the computed shared secrets
|
|
873
|
+
* @returns A new ephemeral array containing the computed shared secrets, or an empty array when the PXE does not
|
|
874
|
+
* hold the keys for `address`, signaling that no secrets can be derived for it.
|
|
747
875
|
*/
|
|
748
876
|
public async getSharedSecrets(
|
|
749
877
|
address: AztecAddress,
|
|
750
|
-
ephPks: EphemeralArray<
|
|
878
|
+
ephPks: EphemeralArray<EmbeddedCurvePoint>,
|
|
751
879
|
contractAddress: AztecAddress,
|
|
752
880
|
): Promise<EphemeralArray<Fr>> {
|
|
753
881
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
@@ -755,14 +883,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
755
883
|
`getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
|
|
756
884
|
);
|
|
757
885
|
}
|
|
758
|
-
const recipientCompleteAddress = await this.
|
|
886
|
+
const recipientCompleteAddress = await this.addressStore.getCompleteAddress(address);
|
|
887
|
+
if (!recipientCompleteAddress) {
|
|
888
|
+
this.logger.warn(
|
|
889
|
+
`Computing shared secrets for address ${address} whose keys are not held - returning no secrets`,
|
|
890
|
+
{
|
|
891
|
+
address,
|
|
892
|
+
contractAddress: this.contractAddress,
|
|
893
|
+
},
|
|
894
|
+
);
|
|
895
|
+
return EphemeralArray.fromValues<Fr>(this.ephemeralArrayService, []);
|
|
896
|
+
}
|
|
759
897
|
const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
|
|
760
898
|
const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
761
899
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
762
900
|
|
|
763
901
|
const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
|
|
764
902
|
const secrets = await Promise.all(
|
|
765
|
-
ephPkPoints.map(
|
|
903
|
+
ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
|
|
766
904
|
);
|
|
767
905
|
|
|
768
906
|
return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
|
|
@@ -796,6 +934,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
796
934
|
this.ephemeralArrayService.clear(slot);
|
|
797
935
|
}
|
|
798
936
|
|
|
937
|
+
public pushTransient(slot: Fr, elements: Fr[]): number {
|
|
938
|
+
return this.transientArrayService.push(this.contractAddress, slot, elements);
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
public popTransient(slot: Fr): Fr[] {
|
|
942
|
+
return this.transientArrayService.pop(this.contractAddress, slot);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
public getTransient(slot: Fr, index: number): Fr[] {
|
|
946
|
+
return this.transientArrayService.get(this.contractAddress, slot, index);
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
public setTransient(slot: Fr, index: number, elements: Fr[]): void {
|
|
950
|
+
this.transientArrayService.set(this.contractAddress, slot, index, elements);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
public getTransientLen(slot: Fr): number {
|
|
954
|
+
return this.transientArrayService.len(this.contractAddress, slot);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
public removeTransient(slot: Fr, index: number): void {
|
|
958
|
+
this.transientArrayService.remove(this.contractAddress, slot, index);
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
public clearTransient(slot: Fr): void {
|
|
962
|
+
this.transientArrayService.clear(this.contractAddress, slot);
|
|
963
|
+
}
|
|
964
|
+
|
|
799
965
|
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
800
966
|
this.offchainEffects.push({ data, contractAddress: this.contractAddress });
|
|
801
967
|
return Promise.resolve();
|
|
@@ -807,38 +973,53 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
807
973
|
functionSelector: FunctionSelector,
|
|
808
974
|
args: Fr[],
|
|
809
975
|
): Promise<Fr[]> {
|
|
810
|
-
const targetArtifact = await this.
|
|
976
|
+
const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
|
|
811
977
|
targetContractAddress,
|
|
812
978
|
functionSelector,
|
|
813
979
|
);
|
|
980
|
+
if (!targetArtifact) {
|
|
981
|
+
throw new Error(
|
|
982
|
+
`Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` +
|
|
983
|
+
`Register it via wallet.registerContract(...).`,
|
|
984
|
+
);
|
|
985
|
+
}
|
|
814
986
|
|
|
815
987
|
if (!targetContractAddress.equals(this.contractAddress)) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
callerClassId
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
988
|
+
// Standard handshake registry reads are authorized by default; every other cross-contract call needs the hook.
|
|
989
|
+
if (!(await isStandardHandshakeRegistryUtilityRead(targetContractAddress, functionSelector))) {
|
|
990
|
+
const [callerClassId, targetClassId] = await Promise.all([
|
|
991
|
+
this.anchoredContractData.getCurrentClassId(this.contractAddress),
|
|
992
|
+
this.anchoredContractData.getCurrentClassId(targetContractAddress),
|
|
993
|
+
]);
|
|
994
|
+
if (!callerClassId || !targetClassId) {
|
|
995
|
+
throw new Error(
|
|
996
|
+
`Cannot authorize utility call from ${this.contractAddress} to ${targetContractAddress}: ` +
|
|
997
|
+
`${!callerClassId ? this.contractAddress : targetContractAddress} is not registered.`,
|
|
998
|
+
);
|
|
999
|
+
}
|
|
1000
|
+
const request: UtilityCallAuthorizationRequest = {
|
|
1001
|
+
caller: this.contractAddress,
|
|
1002
|
+
callerClassId,
|
|
1003
|
+
target: targetContractAddress,
|
|
1004
|
+
targetClassId,
|
|
1005
|
+
functionSelector,
|
|
1006
|
+
functionName: targetArtifact.name,
|
|
1007
|
+
args,
|
|
1008
|
+
callerContext: this.callerContext,
|
|
1009
|
+
};
|
|
1010
|
+
|
|
1011
|
+
const response = this.hooks?.authorizeUtilityCall
|
|
1012
|
+
? await this.hooks.authorizeUtilityCall(request)
|
|
1013
|
+
: { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
|
|
1014
|
+
|
|
1015
|
+
if (!response.authorized) {
|
|
1016
|
+
const reason = response.reason ? `: ${response.reason}` : '';
|
|
1017
|
+
throw new Error(
|
|
1018
|
+
`Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
|
|
1019
|
+
`${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
|
|
1020
|
+
`See https://docs.aztec.network/errors/11`,
|
|
1021
|
+
);
|
|
1022
|
+
}
|
|
842
1023
|
}
|
|
843
1024
|
|
|
844
1025
|
await this.contractSyncService.ensureContractSynced(
|
|
@@ -856,20 +1037,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
856
1037
|
);
|
|
857
1038
|
|
|
858
1039
|
const nestedOracle = new UtilityExecutionOracle({
|
|
859
|
-
|
|
1040
|
+
callContext: CallContext.from({
|
|
1041
|
+
msgSender: this.contractAddress,
|
|
1042
|
+
contractAddress: targetContractAddress,
|
|
1043
|
+
functionSelector,
|
|
1044
|
+
isStaticCall: true,
|
|
1045
|
+
}),
|
|
860
1046
|
authWitnesses: this.authWitnesses,
|
|
861
1047
|
capsules: this.capsules,
|
|
862
1048
|
anchorBlockHeader: this.anchorBlockHeader,
|
|
863
|
-
|
|
1049
|
+
anchoredContractData: this.anchoredContractData,
|
|
864
1050
|
noteStore: this.noteStore,
|
|
865
1051
|
keyStore: this.keyStore,
|
|
866
1052
|
addressStore: this.addressStore,
|
|
867
1053
|
aztecNode: this.aztecNode,
|
|
868
1054
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
869
|
-
|
|
1055
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
870
1056
|
capsuleService: this.capsuleService,
|
|
1057
|
+
factService: this.factService,
|
|
871
1058
|
privateEventStore: this.privateEventStore,
|
|
872
|
-
|
|
1059
|
+
txResolver: this.txResolver,
|
|
873
1060
|
contractSyncService: this.contractSyncService,
|
|
874
1061
|
l2TipsStore: this.l2TipsStore,
|
|
875
1062
|
jobId: this.jobId,
|
|
@@ -878,12 +1065,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
878
1065
|
hooks: this.hooks,
|
|
879
1066
|
utilityExecutor: this.utilityExecutor,
|
|
880
1067
|
log: this.logger,
|
|
1068
|
+
// Shared across the whole execution tree: nested utility frames inherit the caller's transient-array store.
|
|
1069
|
+
transientArrayService: this.transientArrayService,
|
|
881
1070
|
});
|
|
882
1071
|
|
|
883
1072
|
const initialWitness = toACVMWitness(0, args);
|
|
884
|
-
const acvmCallback = new Oracle(nestedOracle);
|
|
885
1073
|
const acirExecutionResult = await this.simulator
|
|
886
|
-
.executeUserCircuit(initialWitness, targetArtifact,
|
|
1074
|
+
.executeUserCircuit(initialWitness, targetArtifact, buildACIRCallback(nestedOracle))
|
|
887
1075
|
.catch((err: Error) => {
|
|
888
1076
|
err.message = resolveAssertionMessageFromError(err, targetArtifact);
|
|
889
1077
|
throw new ExecutionError(
|
|
@@ -908,9 +1096,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
908
1096
|
*/
|
|
909
1097
|
async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
|
|
910
1098
|
const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
|
|
911
|
-
const fetched = await Promise.all(
|
|
912
|
-
uniqueTxHashes.map(h => this.aztecNode.getTxReceipt(h, { includeTxEffect: true })),
|
|
913
|
-
);
|
|
1099
|
+
const fetched = await Promise.all(uniqueTxHashes.map(h => this.aztecNodeReadCache.getTxReceiptWithEffect(h)));
|
|
914
1100
|
return new Map(
|
|
915
1101
|
uniqueTxHashes
|
|
916
1102
|
.map((h, i): [string, IndexedTxEffect | undefined] => {
|
|
@@ -944,7 +1130,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
944
1130
|
const [response] = await Promise.all([
|
|
945
1131
|
query(),
|
|
946
1132
|
(async () => {
|
|
947
|
-
const block = await this.
|
|
1133
|
+
const block = await this.aztecNodeReadCache.getBlock(blockHash);
|
|
948
1134
|
const header = block?.header;
|
|
949
1135
|
if (!header) {
|
|
950
1136
|
throw new Error(`Could not find block header for block hash ${blockHash}`);
|
|
@@ -964,4 +1150,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
964
1150
|
protected get callerContext(): 'private' | 'private view' | 'utility' {
|
|
965
1151
|
return 'utility';
|
|
966
1152
|
}
|
|
1153
|
+
|
|
1154
|
+
/** The address of the contract whose function is being executed, from the call context. */
|
|
1155
|
+
protected get contractAddress(): AztecAddress {
|
|
1156
|
+
return this.callContext.contractAddress;
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
// Registry reads that any contract may issue without an `authorizeUtilityCall` hook. The constrained-delivery
|
|
1161
|
+
// library calls these implicitly for the app, and they are safe to default-authorize: `get_app_siloed_secrets`
|
|
1162
|
+
// siloes every returned secret to `msg_sender`, and `get_non_interactive_handshakes` only exposes ephemeral public
|
|
1163
|
+
// keys, from which the shared secret cannot be derived without the recipient's secret keys.
|
|
1164
|
+
const STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES = [
|
|
1165
|
+
'get_non_interactive_handshakes((Field),u32)',
|
|
1166
|
+
'get_app_siloed_secrets((Field),(Field))',
|
|
1167
|
+
];
|
|
1168
|
+
|
|
1169
|
+
async function doesSelectorHaveSignature(functionSelector: FunctionSelector, signature: string): Promise<boolean> {
|
|
1170
|
+
return functionSelector.equals(await FunctionSelector.fromSignature(signature));
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
/**
|
|
1174
|
+
* Whether a cross-contract utility call targets one of the standard handshake registry's read functions.
|
|
1175
|
+
*
|
|
1176
|
+
* These reads are authorized by PXE for every wallet, without consulting the `authorizeUtilityCall` hook, so that
|
|
1177
|
+
* wallets don't need to know the handshake registry exists in order to deliver and discover messages through it.
|
|
1178
|
+
*/
|
|
1179
|
+
async function isStandardHandshakeRegistryUtilityRead(
|
|
1180
|
+
targetContractAddress: AztecAddress,
|
|
1181
|
+
functionSelector: FunctionSelector,
|
|
1182
|
+
): Promise<boolean> {
|
|
1183
|
+
if (!targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
|
|
1184
|
+
return false;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
const matches = await Promise.all(
|
|
1188
|
+
STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES.map(signature =>
|
|
1189
|
+
doesSelectorHaveSignature(functionSelector, signature),
|
|
1190
|
+
),
|
|
1191
|
+
);
|
|
1192
|
+
return matches.some(Boolean);
|
|
967
1193
|
}
|