@aztec/pxe 0.0.1-commit.993d240 → 0.0.1-commit.9a89641
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.d.ts +2 -12
- package/dest/bin/check_oracle_version.d.ts.map +1 -1
- package/dest/bin/check_oracle_version.js +9 -122
- 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 +20 -0
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
- package/dest/bin/oracle_version_helpers.js +25 -0
- 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 +17 -15
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +41 -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 +24 -0
- package/dest/contract/contract_class_service.d.ts.map +1 -0
- package/dest/contract/contract_class_service.js +36 -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/skip_sync_contracts.d.ts +11 -0
- package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
- package/dest/contract/skip_sync_contracts.js +18 -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/contract_function_simulator.d.ts +19 -25
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +63 -49
- package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
- 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 +24 -6
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +9 -4
- 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/ephemeral_array.d.ts +37 -0
- package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -2
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
- 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_data.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -2
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -3
- 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 +8 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
- 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 +19 -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 +9 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -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 +15 -114
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
- 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 +92 -100
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +296 -479
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1253 -0
- 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 +32 -21
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +152 -49
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +97 -37
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +376 -138
- 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/index.d.ts +2 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/lazy/index.d.ts +2 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/store.d.ts +14 -0
- package/dest/entrypoints/client/store.d.ts.map +1 -0
- package/dest/entrypoints/client/store.js +42 -0
- 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 +6 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -2
- package/dest/entrypoints/server/store.d.ts +18 -0
- package/dest/entrypoints/server/store.d.ts.map +1 -0
- package/dest/entrypoints/server/store.js +28 -0
- 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 +16 -4
- 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/events/event_service.d.ts +13 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +13 -13
- 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 +18 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +93 -45
- package/dest/messages/tx_resolver_service.d.ts +28 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/tx_resolver_service.js +61 -0
- package/dest/node/benchmarked_node.d.ts +20 -0
- package/dest/node/benchmarked_node.d.ts.map +1 -0
- package/dest/node/benchmarked_node.js +94 -0
- package/dest/node/caching_aztec_node.d.ts +24 -0
- package/dest/node/caching_aztec_node.d.ts.map +1 -0
- package/dest/node/caching_aztec_node.js +267 -0
- package/dest/notes/note_service.d.ts +13 -7
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +10 -10
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +8 -8
- package/dest/private_kernel/batch_planner.d.ts +1 -1
- package/dest/private_kernel/batch_planner.d.ts.map +1 -1
- package/dest/private_kernel/batch_planner.js +1 -1
- 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 +61 -40
- 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 +251 -148
- 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 +66 -77
- 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 +59 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +60 -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/store_identity.d.ts +35 -0
- package/dest/storage/store_identity.d.ts.map +1 -0
- package/dest/storage/store_identity.js +44 -0
- 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/sender_tagging_store.d.ts +41 -10
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +81 -29
- 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 +11 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +38 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts +29 -8
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +29 -10
- package/dest/tagging/index.d.ts +3 -3
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -2
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +27 -9
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +104 -33
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +6 -3
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +23 -36
- package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
- package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/classify_pending_txs.js +61 -0
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +15 -5
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -35
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +41 -0
- package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
- package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
- package/dest/tagging/testing/tag_query_test_utils.js +10 -0
- package/package.json +17 -17
- package/src/bin/check_oracle_version.ts +8 -151
- package/src/bin/index.ts +1 -1
- package/src/bin/oracle_version_helpers.ts +30 -0
- package/src/block_synchronizer/block_stream_source.ts +6 -45
- package/src/block_synchronizer/block_synchronizer.ts +54 -30
- package/src/config/index.ts +1 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract/contract_class_service.ts +45 -0
- package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
- package/src/contract/helpers.ts +35 -0
- package/src/contract/skip_sync_contracts.ts +23 -0
- package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +96 -59
- package/src/contract_function_simulator/execution_note_cache.ts +8 -29
- package/src/contract_function_simulator/index.ts +87 -5
- 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/ephemeral_array.ts +66 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +3 -3
- 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_data.ts +27 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -4
- 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 +5 -0
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -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 +11 -189
- 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 +289 -483
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1067 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +190 -61
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +556 -174
- 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/index.ts +1 -0
- package/src/entrypoints/client/bundle/utils.ts +24 -5
- package/src/entrypoints/client/lazy/index.ts +1 -0
- package/src/entrypoints/client/lazy/utils.ts +24 -5
- package/src/entrypoints/client/store.ts +54 -0
- package/src/entrypoints/pxe_creation_options.ts +8 -2
- package/src/entrypoints/server/index.ts +6 -2
- package/src/entrypoints/server/store.ts +47 -0
- package/src/entrypoints/server/utils.ts +31 -9
- package/src/error_enriching.ts +27 -11
- package/src/events/event_service.ts +24 -14
- 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 +122 -61
- package/src/messages/tx_resolver_service.ts +80 -0
- package/src/node/benchmarked_node.ts +140 -0
- package/src/node/caching_aztec_node.ts +406 -0
- package/src/notes/note_service.ts +20 -14
- package/src/oracle_version.ts +8 -8
- package/src/private_kernel/batch_planner.ts +0 -1
- 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 +112 -56
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +357 -172
- 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 +88 -94
- 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 +15 -0
- package/src/storage/fact_store/origin_state.ts +84 -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/store_identity.ts +72 -0
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/sender_tagging_store.ts +113 -41
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +42 -10
- package/src/tagging/get_all_logs_by_tags.ts +47 -11
- package/src/tagging/index.ts +7 -2
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +161 -46
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +27 -57
- package/src/tagging/sender_sync/utils/classify_pending_txs.ts +91 -0
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +46 -40
- package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +64 -0
- package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
- package/src/tagging/testing/tag_query_test_utils.ts +11 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/benchmarked_node.js +0 -77
- 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/messages/message_context_service.js +0 -38
- 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/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -17
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -60
- package/src/contract_function_simulator/benchmarked_node.ts +0 -103
- 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/messages/message_context_service.ts +0 -45
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -66
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ARCHIVE_HEIGHT, type NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
1
|
+
import { ARCHIVE_HEIGHT, type NOTE_HASH_TREE_HEIGHT, PRIVATE_LOG_CIPHERTEXT_LEN } from '@aztec/constants';
|
|
2
2
|
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 { Point } from '@aztec/foundation/curves/grumpkin';
|
|
6
7
|
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
8
9
|
import type { KeyStore } from '@aztec/key-store';
|
|
@@ -14,73 +15,88 @@ import {
|
|
|
14
15
|
toACVMWitness,
|
|
15
16
|
witnessMapToFields,
|
|
16
17
|
} from '@aztec/simulator/client';
|
|
18
|
+
import { STANDARD_HANDSHAKE_REGISTRY_ADDRESS } from '@aztec/standard-contracts/handshake-registry/constants';
|
|
17
19
|
import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
|
|
18
20
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
19
21
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
22
|
import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
|
-
import type { CompleteAddress,
|
|
23
|
+
import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
|
|
22
24
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
23
25
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
24
26
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
27
|
+
import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
|
|
28
|
+
import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
29
|
+
import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
28
30
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
29
31
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
30
32
|
import {
|
|
31
33
|
type BlockHeader,
|
|
34
|
+
CallContext,
|
|
32
35
|
type Capsule,
|
|
33
|
-
type IndexedTxEffect,
|
|
34
36
|
type OffchainEffect,
|
|
35
|
-
TxEffect,
|
|
37
|
+
type TxEffect,
|
|
36
38
|
type TxHash,
|
|
39
|
+
type TxReceipt,
|
|
37
40
|
} from '@aztec/stdlib/tx';
|
|
38
41
|
|
|
42
|
+
import type { ContractSyncService } from '../../contract/contract_sync_service.js';
|
|
39
43
|
import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
|
|
40
|
-
import type
|
|
41
|
-
import { EventService } from '../../events/event_service.js';
|
|
44
|
+
import { EventService, type EventValidationTxData } from '../../events/event_service.js';
|
|
42
45
|
import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
|
|
43
46
|
import type { ExecutionHooks } from '../../hooks/index.js';
|
|
44
|
-
import { LogService } from '../../logs/log_service.js';
|
|
45
|
-
import {
|
|
46
|
-
import { NoteService } from '../../notes/note_service.js';
|
|
47
|
+
import { LogService, type RetrievedTaggedLog } from '../../logs/log_service.js';
|
|
48
|
+
import { type TxOnchainContext, TxResolverService } from '../../messages/tx_resolver_service.js';
|
|
49
|
+
import { NoteService, type NoteValidationTxData } from '../../notes/note_service.js';
|
|
47
50
|
import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
|
|
48
51
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
52
|
+
import { assertAllowedScope } from '../../storage/allowed_scopes.js';
|
|
49
53
|
import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
|
|
50
|
-
import
|
|
54
|
+
import { FactCollectionKey, FactCollectionTypeKey, anchoredTipBlockNumbers } from '../../storage/fact_store/index.js';
|
|
55
|
+
import type { FactService, OriginBlock } from '../../storage/fact_store/index.js';
|
|
51
56
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
52
57
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
53
58
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
54
|
-
import type {
|
|
59
|
+
import type { TaggingSecretSourcesStore } from '../../storage/tagging_store/tagging_secret_sources_store.js';
|
|
60
|
+
import type { AnchoredContractData } from '../anchored_contract_data.js';
|
|
55
61
|
import { EphemeralArrayService } from '../ephemeral_array_service.js';
|
|
56
62
|
import { BoundedVec } from '../noir-structs/bounded_vec.js';
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
import {
|
|
63
|
+
import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
|
|
64
|
+
import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
|
|
65
|
+
import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
66
|
+
import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
|
|
67
|
+
import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
68
|
+
import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
69
|
+
import type { NoteData } from '../noir-structs/note_data.js';
|
|
70
|
+
import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
60
71
|
import { Option } from '../noir-structs/option.js';
|
|
61
|
-
import {
|
|
72
|
+
import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
|
|
73
|
+
import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
|
|
74
|
+
import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
|
|
75
|
+
import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
|
|
76
|
+
import type { UtilityContext } from '../noir-structs/utility_context.js';
|
|
62
77
|
import { pickNotes } from '../pick_notes.js';
|
|
63
|
-
import type {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
78
|
+
import type { TransientArrayService } from '../transient_array_service.js';
|
|
79
|
+
import { buildACIRCallback } from './acir_callback.js';
|
|
80
|
+
import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
66
81
|
|
|
67
82
|
/** Args for UtilityExecutionOracle constructor. */
|
|
68
83
|
export type UtilityExecutionOracleArgs = {
|
|
69
|
-
|
|
84
|
+
callContext: CallContext;
|
|
70
85
|
/** List of transient auth witnesses to be used during this simulation */
|
|
71
86
|
authWitnesses: AuthWitness[];
|
|
72
87
|
capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
|
|
73
88
|
anchorBlockHeader: BlockHeader;
|
|
74
|
-
|
|
89
|
+
anchoredContractData: AnchoredContractData;
|
|
75
90
|
noteStore: NoteStore;
|
|
76
91
|
keyStore: KeyStore;
|
|
77
92
|
addressStore: AddressStore;
|
|
78
93
|
aztecNode: AztecNode;
|
|
79
94
|
recipientTaggingStore: RecipientTaggingStore;
|
|
80
|
-
|
|
95
|
+
taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
81
96
|
capsuleService: CapsuleService;
|
|
97
|
+
factService: FactService;
|
|
82
98
|
privateEventStore: PrivateEventStore;
|
|
83
|
-
|
|
99
|
+
txResolver: TxResolverService;
|
|
84
100
|
contractSyncService: ContractSyncService;
|
|
85
101
|
l2TipsStore: L2TipsProvider;
|
|
86
102
|
jobId: string;
|
|
@@ -90,6 +106,7 @@ export type UtilityExecutionOracleArgs = {
|
|
|
90
106
|
hooks?: ExecutionHooks;
|
|
91
107
|
/** Needed to trigger contract synchronization before nested cross-contract calls. */
|
|
92
108
|
utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
109
|
+
transientArrayService: TransientArrayService;
|
|
93
110
|
};
|
|
94
111
|
|
|
95
112
|
/**
|
|
@@ -103,24 +120,35 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
103
120
|
private aztecnrLogger: Logger | undefined;
|
|
104
121
|
private offchainEffects: OffchainEffect[] = [];
|
|
105
122
|
private readonly ephemeralArrayService = new EphemeralArrayService();
|
|
123
|
+
protected readonly transientArrayService: TransientArrayService;
|
|
124
|
+
/** Keyed by tx hash string. */
|
|
125
|
+
private readonly txReceiptsCache = new Map<string, Promise<TxReceipt<{ includeTxEffect: true }>>>();
|
|
126
|
+
/**
|
|
127
|
+
* Information that can be used to validate the existence of a note or an event, keyed by tx hash string. It is
|
|
128
|
+
* populated by the node queries that precede validation (tagged log retrieval, tx resolution), which already return
|
|
129
|
+
* everything validation needs, so validating a note or event created in one of those txs costs no node roundtrip.
|
|
130
|
+
* Notes and events reached through other paths (e.g. offchain inbox messages) still need a receipt.
|
|
131
|
+
*/
|
|
132
|
+
private readonly validationTxDataCache = new Map<string, ValidationTxData>();
|
|
106
133
|
|
|
107
134
|
// We store oracle version to be able to show a nice error message when an oracle handler is missing.
|
|
108
135
|
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
109
136
|
|
|
110
|
-
protected readonly
|
|
137
|
+
protected readonly callContext: CallContext;
|
|
111
138
|
protected readonly authWitnesses: AuthWitness[];
|
|
112
139
|
protected readonly capsules: Capsule[];
|
|
113
140
|
protected readonly anchorBlockHeader: BlockHeader;
|
|
114
|
-
protected readonly
|
|
141
|
+
protected readonly anchoredContractData: AnchoredContractData;
|
|
115
142
|
protected readonly noteStore: NoteStore;
|
|
116
143
|
protected readonly keyStore: KeyStore;
|
|
117
144
|
protected readonly addressStore: AddressStore;
|
|
118
145
|
protected readonly aztecNode: AztecNode;
|
|
119
146
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
120
|
-
protected readonly
|
|
147
|
+
protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
121
148
|
protected readonly capsuleService: CapsuleService;
|
|
149
|
+
protected readonly factService: FactService;
|
|
122
150
|
protected readonly privateEventStore: PrivateEventStore;
|
|
123
|
-
protected readonly
|
|
151
|
+
protected readonly txResolver: TxResolverService;
|
|
124
152
|
protected readonly contractSyncService: ContractSyncService;
|
|
125
153
|
protected readonly l2TipsStore: L2TipsProvider;
|
|
126
154
|
protected readonly jobId: string;
|
|
@@ -131,20 +159,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
131
159
|
protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
132
160
|
|
|
133
161
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
134
|
-
this.
|
|
162
|
+
this.callContext = args.callContext;
|
|
135
163
|
this.authWitnesses = args.authWitnesses;
|
|
136
164
|
this.capsules = args.capsules;
|
|
137
165
|
this.anchorBlockHeader = args.anchorBlockHeader;
|
|
138
|
-
this.
|
|
166
|
+
this.anchoredContractData = args.anchoredContractData;
|
|
139
167
|
this.noteStore = args.noteStore;
|
|
140
168
|
this.keyStore = args.keyStore;
|
|
141
169
|
this.addressStore = args.addressStore;
|
|
142
170
|
this.aztecNode = args.aztecNode;
|
|
143
171
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
144
|
-
this.
|
|
172
|
+
this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
|
|
145
173
|
this.capsuleService = args.capsuleService;
|
|
174
|
+
this.factService = args.factService;
|
|
146
175
|
this.privateEventStore = args.privateEventStore;
|
|
147
|
-
this.
|
|
176
|
+
this.txResolver = args.txResolver;
|
|
148
177
|
this.contractSyncService = args.contractSyncService;
|
|
149
178
|
this.l2TipsStore = args.l2TipsStore;
|
|
150
179
|
this.jobId = args.jobId;
|
|
@@ -153,6 +182,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
153
182
|
this.simulator = args.simulator;
|
|
154
183
|
this.hooks = args.hooks;
|
|
155
184
|
this.utilityExecutor = args.utilityExecutor;
|
|
185
|
+
this.transientArrayService = args.transientArrayService;
|
|
156
186
|
}
|
|
157
187
|
|
|
158
188
|
public assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
@@ -179,17 +209,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
179
209
|
}
|
|
180
210
|
|
|
181
211
|
public getUtilityContext(): UtilityContext {
|
|
182
|
-
return
|
|
212
|
+
return {
|
|
213
|
+
blockHeader: this.anchorBlockHeader,
|
|
214
|
+
contractAddress: this.callContext.contractAddress,
|
|
215
|
+
msgSender: this.callContext.msgSender,
|
|
216
|
+
};
|
|
183
217
|
}
|
|
184
218
|
|
|
185
219
|
/**
|
|
186
220
|
* Retrieve keys associated with a specific master public key and app address.
|
|
187
221
|
* @param pkMHash - The master public key hash.
|
|
222
|
+
* @param _keyIndex - Sent by the Noir oracle caller but unused here; kept to match the oracle signature.
|
|
188
223
|
* @returns A Promise that resolves to nullifier keys.
|
|
189
224
|
* @throws If the keys are not registered in the key store.
|
|
190
225
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
191
226
|
*/
|
|
192
|
-
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
227
|
+
public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
|
|
193
228
|
let hasAccess = false;
|
|
194
229
|
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
195
230
|
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
@@ -243,7 +278,23 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
243
278
|
const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
244
279
|
this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
|
|
245
280
|
);
|
|
246
|
-
return witness ? Option.some(witness) : Option.none(
|
|
281
|
+
return witness ? Option.some(witness) : Option.none();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Returns whether each block hash is present in the archive tree at the referenced block. */
|
|
285
|
+
public async areBlockHashesInArchive(
|
|
286
|
+
referenceBlockHash: BlockHash,
|
|
287
|
+
blockHashes: EphemeralArray<BlockHash>,
|
|
288
|
+
): Promise<EphemeralArray<boolean>> {
|
|
289
|
+
const hashes = blockHashes.readAll(this.ephemeralArrayService);
|
|
290
|
+
const memberships = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
291
|
+
Promise.all(
|
|
292
|
+
hashes.map(blockHash =>
|
|
293
|
+
this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash).then(Boolean),
|
|
294
|
+
),
|
|
295
|
+
),
|
|
296
|
+
);
|
|
297
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
|
|
247
298
|
}
|
|
248
299
|
|
|
249
300
|
/**
|
|
@@ -335,7 +386,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
335
386
|
): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
|
|
336
387
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
337
388
|
if (!completeAddress) {
|
|
338
|
-
return Option.none(
|
|
389
|
+
return Option.none();
|
|
339
390
|
}
|
|
340
391
|
return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
|
|
341
392
|
}
|
|
@@ -345,7 +396,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
345
396
|
if (!completeAddress) {
|
|
346
397
|
throw new Error(
|
|
347
398
|
`No public key registered for address ${account}.
|
|
348
|
-
Register it by calling
|
|
399
|
+
Register it by calling wallet.registerSender(...).\nSee docs for context: https://docs.aztec.network/errors/14`,
|
|
349
400
|
);
|
|
350
401
|
}
|
|
351
402
|
return completeAddress;
|
|
@@ -356,8 +407,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
356
407
|
* @param address - Address.
|
|
357
408
|
* @returns A contract instance.
|
|
358
409
|
*/
|
|
359
|
-
public async getContractInstance(address: AztecAddress): Promise<
|
|
360
|
-
const instance = await this.
|
|
410
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
|
|
411
|
+
const instance = await this.anchoredContractData.getContractInstance(address);
|
|
361
412
|
if (!instance) {
|
|
362
413
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
363
414
|
}
|
|
@@ -454,23 +505,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
454
505
|
}
|
|
455
506
|
|
|
456
507
|
/**
|
|
457
|
-
* Returns the membership witness of an
|
|
458
|
-
* @param contractAddress - Address of a contract by which the message was emitted.
|
|
508
|
+
* Returns the membership witness of an L1 to L2 message.
|
|
459
509
|
* @param messageHash - Hash of the message.
|
|
460
|
-
* @param
|
|
461
|
-
*
|
|
510
|
+
* @param nullifier - When present, the unsiloed nullifier of the message and the address to silo it with. The witness
|
|
511
|
+
* is only returned if the siloed nullifier is absent from the nullifier tree, i.e. the message has not been consumed.
|
|
462
512
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
463
513
|
*/
|
|
464
|
-
public async
|
|
465
|
-
const [messageIndex, siblingPath] = await
|
|
514
|
+
public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
|
|
515
|
+
const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
|
|
466
516
|
this.aztecNode,
|
|
467
|
-
contractAddress,
|
|
468
517
|
messageHash,
|
|
469
|
-
|
|
518
|
+
nullifier.value,
|
|
470
519
|
await this.anchorBlockHeader.hash(),
|
|
471
520
|
);
|
|
472
521
|
|
|
473
|
-
return
|
|
522
|
+
return { index: messageIndex, siblingPath };
|
|
474
523
|
}
|
|
475
524
|
|
|
476
525
|
/**
|
|
@@ -489,14 +538,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
489
538
|
return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
|
|
490
539
|
const slots = Array(numberOfElements)
|
|
491
540
|
.fill(0)
|
|
492
|
-
.map((_, i) => new Fr(startStorageSlot.
|
|
493
|
-
|
|
541
|
+
.map((_, i) => new Fr(startStorageSlot.toBigInt() + BigInt(i)));
|
|
494
542
|
const values = await Promise.all(
|
|
495
543
|
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
496
544
|
);
|
|
497
545
|
|
|
498
546
|
this.logger.debug(
|
|
499
|
-
`Oracle storage read:
|
|
547
|
+
`Oracle storage read: start=${startStorageSlot.toString()} count=${numberOfElements} ` +
|
|
548
|
+
`address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
500
549
|
);
|
|
501
550
|
|
|
502
551
|
return values;
|
|
@@ -512,7 +561,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
512
561
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
513
562
|
this.contractLogger = await createContractLogger(
|
|
514
563
|
this.contractAddress,
|
|
515
|
-
addr => this.
|
|
564
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
516
565
|
'user',
|
|
517
566
|
{ instanceId: this.jobId },
|
|
518
567
|
);
|
|
@@ -529,7 +578,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
529
578
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
530
579
|
this.aztecnrLogger = await createContractLogger(
|
|
531
580
|
this.contractAddress,
|
|
532
|
-
addr => this.
|
|
581
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
533
582
|
'aztecnr',
|
|
534
583
|
{ instanceId: this.jobId },
|
|
535
584
|
);
|
|
@@ -537,7 +586,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
537
586
|
return this.aztecnrLogger;
|
|
538
587
|
}
|
|
539
588
|
|
|
540
|
-
public async log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
589
|
+
public async log(level: number, message: string, _fieldsSize: number, fields: Fr[]): Promise<void> {
|
|
541
590
|
if (!LogLevels[level]) {
|
|
542
591
|
throw new Error(`Invalid log level: ${level}`);
|
|
543
592
|
}
|
|
@@ -548,11 +597,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
548
597
|
logContractMessage(logger, LogLevels[level], strippedMessage, fields);
|
|
549
598
|
}
|
|
550
599
|
|
|
551
|
-
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns
|
|
552
|
-
public async
|
|
600
|
+
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
|
|
601
|
+
public async getPendingTaggedLogsV2(
|
|
602
|
+
scope: AztecAddress,
|
|
603
|
+
providedSecrets: EphemeralArray<ProvidedSecret>,
|
|
604
|
+
): Promise<EphemeralArray<PendingTaggedLog>> {
|
|
605
|
+
const secrets = providedSecrets
|
|
606
|
+
.readAll(this.ephemeralArrayService)
|
|
607
|
+
.map(ps => new AppTaggingSecret(ps.secret, this.contractAddress, ps.mode));
|
|
608
|
+
|
|
553
609
|
const logService = this.#createLogService();
|
|
554
|
-
const
|
|
555
|
-
|
|
610
|
+
const retrievedLogs = await logService.fetchTaggedLogs(this.contractAddress, scope, secrets);
|
|
611
|
+
|
|
612
|
+
this.#cacheValidationTxData(retrievedLogs);
|
|
613
|
+
|
|
614
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, retrievedLogs.map(toPendingTaggedLog));
|
|
556
615
|
}
|
|
557
616
|
|
|
558
617
|
#createLogService(): LogService {
|
|
@@ -562,27 +621,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
562
621
|
this.l2TipsStore,
|
|
563
622
|
this.keyStore,
|
|
564
623
|
this.recipientTaggingStore,
|
|
565
|
-
this.
|
|
624
|
+
this.taggingSecretSourcesStore,
|
|
566
625
|
this.addressStore,
|
|
626
|
+
this.scopes,
|
|
567
627
|
this.jobId,
|
|
568
628
|
this.logger.getBindings(),
|
|
569
629
|
);
|
|
570
630
|
}
|
|
571
631
|
|
|
572
632
|
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
573
|
-
|
|
574
|
-
|
|
633
|
+
noteValidationRequests: EphemeralArray<NoteValidationRequest>,
|
|
634
|
+
eventValidationRequests: EphemeralArray<EventValidationRequest>,
|
|
575
635
|
scope: AztecAddress,
|
|
576
636
|
) {
|
|
577
|
-
|
|
578
|
-
.
|
|
579
|
-
.
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
.readArrayAt(eventValidationRequestsArrayBaseSlot)
|
|
583
|
-
.map(fields => EventValidationRequest.fromFields(fields));
|
|
584
|
-
|
|
585
|
-
await this.#processValidationRequests(noteValidationRequests, eventValidationRequests, scope);
|
|
637
|
+
await this.#processValidationRequests(
|
|
638
|
+
noteValidationRequests.readAll(this.ephemeralArrayService),
|
|
639
|
+
eventValidationRequests.readAll(this.ephemeralArrayService),
|
|
640
|
+
scope,
|
|
641
|
+
);
|
|
586
642
|
}
|
|
587
643
|
|
|
588
644
|
async #processValidationRequests(
|
|
@@ -590,7 +646,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
590
646
|
eventValidationRequests: EventValidationRequest[],
|
|
591
647
|
scope: AztecAddress,
|
|
592
648
|
) {
|
|
593
|
-
const
|
|
649
|
+
const validationTxData = await this.#getValidationTxData([
|
|
594
650
|
...noteValidationRequests.map(r => r.txHash),
|
|
595
651
|
...eventValidationRequests.map(r => r.txHash),
|
|
596
652
|
]);
|
|
@@ -599,70 +655,73 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
599
655
|
const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
|
|
600
656
|
|
|
601
657
|
await Promise.all([
|
|
602
|
-
noteService.validateAndStoreNotes(noteValidationRequests, scope,
|
|
603
|
-
eventService.validateAndStoreEvents(eventValidationRequests, scope,
|
|
658
|
+
noteService.validateAndStoreNotes(noteValidationRequests, scope, validationTxData),
|
|
659
|
+
eventService.validateAndStoreEvents(eventValidationRequests, scope, validationTxData),
|
|
604
660
|
]);
|
|
605
661
|
}
|
|
606
662
|
|
|
607
|
-
public async
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
663
|
+
public async getLogsByTagV2(
|
|
664
|
+
requests: EphemeralArray<LogRetrievalRequest>,
|
|
665
|
+
): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
|
|
666
|
+
const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
|
|
611
667
|
const logService = this.#createLogService();
|
|
612
668
|
|
|
613
|
-
const
|
|
669
|
+
const retrievedLogsPerRequest = await logService.fetchLogsByTag(this.contractAddress, logRetrievalRequests);
|
|
670
|
+
|
|
671
|
+
this.#cacheValidationTxData(retrievedLogsPerRequest.flat());
|
|
614
672
|
|
|
615
673
|
// Create an inner ephemeral array for each request's matching logs, then wrap all slots in an outer array.
|
|
616
|
-
const
|
|
617
|
-
this.ephemeralArrayService.
|
|
674
|
+
const innerArrays = retrievedLogsPerRequest.map(retrievedLogs =>
|
|
675
|
+
EphemeralArray.fromValues(this.ephemeralArrayService, retrievedLogs.map(toLogRetrievalResponse)),
|
|
618
676
|
);
|
|
619
677
|
|
|
620
|
-
return this.ephemeralArrayService
|
|
678
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
|
|
621
679
|
}
|
|
622
680
|
|
|
623
|
-
/**
|
|
624
|
-
public async
|
|
625
|
-
const
|
|
681
|
+
/** Given an array of tx hashes, returns an aligned array of tx info if the tx is available. */
|
|
682
|
+
public async getResolvedTxs(requests: EphemeralArray<Fr>): Promise<EphemeralArray<Option<ResolvedTx>>> {
|
|
683
|
+
const txHashes = requests.readAll(this.ephemeralArrayService);
|
|
626
684
|
|
|
627
|
-
const
|
|
628
|
-
if (fields.length !== 1) {
|
|
629
|
-
throw new Error(
|
|
630
|
-
`Malformed message context request at index ${i}: expected 1 field (tx hash), got ${fields.length}`,
|
|
631
|
-
);
|
|
632
|
-
}
|
|
633
|
-
return fields[0];
|
|
634
|
-
});
|
|
685
|
+
const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
|
|
635
686
|
|
|
636
|
-
|
|
637
|
-
txHashes,
|
|
638
|
-
this.anchorBlockHeader.getBlockNumber(),
|
|
639
|
-
);
|
|
687
|
+
this.#cacheValidationTxData(resolved.filter(tx => tx !== null));
|
|
640
688
|
|
|
641
|
-
|
|
689
|
+
const options = resolved.map(tx => (tx ? Option.some(toResolvedTx(tx)) : Option.none<ResolvedTx>()));
|
|
690
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, options);
|
|
642
691
|
}
|
|
643
692
|
|
|
644
693
|
/**
|
|
645
694
|
* Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
|
|
646
695
|
* block.
|
|
647
696
|
*/
|
|
648
|
-
public async getTxEffect(txHash: TxHash): Promise<Option<
|
|
697
|
+
public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
|
|
649
698
|
if (txHash.hash.isZero()) {
|
|
650
699
|
throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
|
|
651
700
|
}
|
|
652
701
|
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
702
|
+
return await this.#getTxEffectOption(txHash);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/** Fetches transaction effects for all hashes, preserving request order. */
|
|
706
|
+
public async getTxEffects(txHashes: EphemeralArray<TxHash>): Promise<EphemeralArray<Option<TxEffectData>>> {
|
|
707
|
+
const hashes = txHashes.readAll(this.ephemeralArrayService);
|
|
708
|
+
const invalidHash = hashes.find(txHash => txHash.hash.isZero());
|
|
709
|
+
if (invalidHash) {
|
|
710
|
+
throw new Error('Invalid tx hash passed into aztec_utl_getTxEffects oracle handler');
|
|
656
711
|
}
|
|
657
712
|
|
|
658
|
-
|
|
713
|
+
const uniqueTxHashes = uniqueBy(hashes, h => h.toString());
|
|
714
|
+
const options = await Promise.all(uniqueTxHashes.map(txHash => this.#getTxEffectOption(txHash)));
|
|
715
|
+
const optionsByHash = new Map(uniqueTxHashes.map((txHash, i) => [txHash.toString(), options[i]]));
|
|
716
|
+
|
|
717
|
+
return EphemeralArray.fromValues(
|
|
718
|
+
this.ephemeralArrayService,
|
|
719
|
+
hashes.map(txHash => optionsByHash.get(txHash.toString())!),
|
|
720
|
+
);
|
|
659
721
|
}
|
|
660
722
|
|
|
661
723
|
public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
|
|
662
|
-
|
|
663
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
664
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
665
|
-
}
|
|
724
|
+
this.#assertOwnContract(contractAddress);
|
|
666
725
|
this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
|
|
667
726
|
}
|
|
668
727
|
|
|
@@ -672,19 +731,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
672
731
|
tSize: number,
|
|
673
732
|
scope: AztecAddress,
|
|
674
733
|
): Promise<Option<Fr[]>> {
|
|
675
|
-
|
|
676
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
677
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
678
|
-
}
|
|
734
|
+
this.#assertOwnContract(contractAddress);
|
|
679
735
|
const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
|
|
680
|
-
return values ? Option.some(values) : Option.none(
|
|
736
|
+
return values ? Option.some(values) : Option.none({ length: tSize });
|
|
681
737
|
}
|
|
682
738
|
|
|
683
739
|
public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
|
|
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
|
-
}
|
|
740
|
+
this.#assertOwnContract(contractAddress);
|
|
688
741
|
this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
|
|
689
742
|
}
|
|
690
743
|
|
|
@@ -695,11 +748,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
695
748
|
numEntries: number,
|
|
696
749
|
scope: AztecAddress,
|
|
697
750
|
): Promise<void> {
|
|
751
|
+
this.#assertOwnContract(contractAddress);
|
|
752
|
+
return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Asserts the executing contract may only access its own slice of PXE DB.
|
|
757
|
+
*/
|
|
758
|
+
#assertOwnContract(contractAddress: AztecAddress): void {
|
|
698
759
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
699
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
700
760
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
701
761
|
}
|
|
702
|
-
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Records a fact into a collection. A `Some` origin block makes the fact retractable (pruned on reorg of that
|
|
766
|
+
* block), a `None` origin block makes it non-retractable, surviving reorgs.
|
|
767
|
+
*/
|
|
768
|
+
public recordFact(
|
|
769
|
+
contractAddress: AztecAddress,
|
|
770
|
+
scope: AztecAddress,
|
|
771
|
+
factCollectionTypeId: Fr,
|
|
772
|
+
factCollectionId: Fr,
|
|
773
|
+
factTypeId: Fr,
|
|
774
|
+
payload: EphemeralArray<Fr>,
|
|
775
|
+
originBlock: Option<OriginBlock>,
|
|
776
|
+
): Promise<void> {
|
|
777
|
+
this.#assertOwnContract(contractAddress);
|
|
778
|
+
return this.factService.recordFact(
|
|
779
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
780
|
+
factTypeId,
|
|
781
|
+
payload.readAll(this.ephemeralArrayService),
|
|
782
|
+
originBlock.isSome() ? originBlock.value : undefined,
|
|
783
|
+
this.jobId,
|
|
784
|
+
);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/**
|
|
788
|
+
* Deletes a fact collection, removing all its facts. A no-op if no such collection exists.
|
|
789
|
+
*/
|
|
790
|
+
public deleteFactCollection(
|
|
791
|
+
contractAddress: AztecAddress,
|
|
792
|
+
scope: AztecAddress,
|
|
793
|
+
factCollectionTypeId: Fr,
|
|
794
|
+
factCollectionId: Fr,
|
|
795
|
+
): Promise<void> {
|
|
796
|
+
this.#assertOwnContract(contractAddress);
|
|
797
|
+
return this.factService.deleteFactCollection(
|
|
798
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
799
|
+
this.jobId,
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* Returns a fact collection.
|
|
805
|
+
*/
|
|
806
|
+
public async getFactCollection(
|
|
807
|
+
contractAddress: AztecAddress,
|
|
808
|
+
scope: AztecAddress,
|
|
809
|
+
factCollectionTypeId: Fr,
|
|
810
|
+
factCollectionId: Fr,
|
|
811
|
+
): Promise<Option<FactCollection>> {
|
|
812
|
+
this.#assertOwnContract(contractAddress);
|
|
813
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
814
|
+
const collection = await this.factService.getFactCollection(
|
|
815
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
816
|
+
tips,
|
|
817
|
+
this.jobId,
|
|
818
|
+
);
|
|
819
|
+
return collection
|
|
820
|
+
? Option.some(
|
|
821
|
+
toNoirFactCollection(
|
|
822
|
+
this.ephemeralArrayService,
|
|
823
|
+
contractAddress,
|
|
824
|
+
scope,
|
|
825
|
+
factCollectionTypeId,
|
|
826
|
+
factCollectionId,
|
|
827
|
+
collection.facts,
|
|
828
|
+
),
|
|
829
|
+
)
|
|
830
|
+
: Option.none(emptyFactCollection(this.ephemeralArrayService));
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/** Returns every fact collection of `factCollectionTypeId`. */
|
|
834
|
+
public async getFactCollectionsByType(
|
|
835
|
+
contractAddress: AztecAddress,
|
|
836
|
+
scope: AztecAddress,
|
|
837
|
+
factCollectionTypeId: Fr,
|
|
838
|
+
): Promise<EphemeralArray<FactCollection>> {
|
|
839
|
+
this.#assertOwnContract(contractAddress);
|
|
840
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
841
|
+
const collections = await this.factService.getFactCollectionsByType(
|
|
842
|
+
new FactCollectionTypeKey(contractAddress, scope, factCollectionTypeId),
|
|
843
|
+
tips,
|
|
844
|
+
this.jobId,
|
|
845
|
+
);
|
|
846
|
+
return EphemeralArray.fromValues(
|
|
847
|
+
this.ephemeralArrayService,
|
|
848
|
+
collections.map(collection =>
|
|
849
|
+
toNoirFactCollection(
|
|
850
|
+
this.ephemeralArrayService,
|
|
851
|
+
collection.key.contractAddress,
|
|
852
|
+
collection.key.scope,
|
|
853
|
+
collection.key.factCollectionTypeId,
|
|
854
|
+
collection.key.factCollectionId,
|
|
855
|
+
collection.facts,
|
|
856
|
+
),
|
|
857
|
+
),
|
|
858
|
+
);
|
|
703
859
|
}
|
|
704
860
|
|
|
705
861
|
/**
|
|
@@ -716,45 +872,68 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
716
872
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
717
873
|
public async decryptAes128(
|
|
718
874
|
ciphertext: BoundedVec<number>,
|
|
719
|
-
iv:
|
|
720
|
-
symKey:
|
|
875
|
+
iv: number[],
|
|
876
|
+
symKey: number[],
|
|
721
877
|
): Promise<Option<BoundedVec<number>>> {
|
|
722
878
|
const capacity = ciphertext.maxLength;
|
|
723
879
|
try {
|
|
724
880
|
const aes128 = new Aes128();
|
|
725
|
-
const plaintext = await aes128.decryptBufferCBC(
|
|
881
|
+
const plaintext = await aes128.decryptBufferCBC(
|
|
882
|
+
Buffer.from(ciphertext.data),
|
|
883
|
+
Buffer.from(iv),
|
|
884
|
+
Buffer.from(symKey),
|
|
885
|
+
);
|
|
726
886
|
return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
|
|
727
887
|
} catch {
|
|
728
|
-
return Option.none(
|
|
888
|
+
return Option.none({ maxLength: capacity });
|
|
729
889
|
}
|
|
730
890
|
}
|
|
731
891
|
|
|
732
892
|
/**
|
|
733
893
|
* Retrieves app-siloed shared secrets for multiple ephemeral public keys stored in an ephemeral array.
|
|
734
894
|
* @param address - The recipient address.
|
|
735
|
-
* @param
|
|
895
|
+
* @param ephPks - Ephemeral array containing the serialized Points.
|
|
736
896
|
* @param contractAddress - The contract address for app-siloing (validated against execution context).
|
|
737
|
-
* @returns
|
|
897
|
+
* @returns A new ephemeral array containing the computed shared secrets, or an empty array when the PXE does not
|
|
898
|
+
* hold the keys for `address`.
|
|
899
|
+
* @throws If `address` is not in the execution's allowed scopes.
|
|
738
900
|
*/
|
|
739
|
-
public async getSharedSecrets(
|
|
901
|
+
public async getSharedSecrets(
|
|
902
|
+
address: AztecAddress,
|
|
903
|
+
ephPks: EphemeralArray<EmbeddedCurvePoint>,
|
|
904
|
+
contractAddress: AztecAddress,
|
|
905
|
+
): Promise<EphemeralArray<Fr>> {
|
|
740
906
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
741
907
|
throw new Error(
|
|
742
908
|
`getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
|
|
743
909
|
);
|
|
744
910
|
}
|
|
745
|
-
|
|
911
|
+
|
|
912
|
+
assertAllowedScope(address, this.scopes);
|
|
913
|
+
|
|
914
|
+
// An address can be in scope without the PXE holding its keys (e.g. syncing a registered but non-owned account),
|
|
915
|
+
// in which case no secrets can be derived and we return an empty array rather than failing.
|
|
916
|
+
const recipientCompleteAddress = await this.addressStore.getCompleteAddress(address);
|
|
917
|
+
if (!recipientCompleteAddress) {
|
|
918
|
+
this.logger.warn(
|
|
919
|
+
`Computing shared secrets for address ${address} whose keys are not held - returning no secrets`,
|
|
920
|
+
{
|
|
921
|
+
address,
|
|
922
|
+
contractAddress: this.contractAddress,
|
|
923
|
+
},
|
|
924
|
+
);
|
|
925
|
+
return EphemeralArray.fromValues<Fr>(this.ephemeralArrayService, []);
|
|
926
|
+
}
|
|
746
927
|
const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
|
|
747
928
|
const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
748
929
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
749
930
|
|
|
750
|
-
const
|
|
931
|
+
const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
|
|
751
932
|
const secrets = await Promise.all(
|
|
752
|
-
|
|
753
|
-
deriveAppSiloedSharedSecret(addressSecret, PublicKey.fromFields(fields), this.contractAddress),
|
|
754
|
-
),
|
|
933
|
+
ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
|
|
755
934
|
);
|
|
756
935
|
|
|
757
|
-
return this.ephemeralArrayService
|
|
936
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
|
|
758
937
|
}
|
|
759
938
|
|
|
760
939
|
public pushEphemeral(slot: Fr, elements: Fr[]): number {
|
|
@@ -785,6 +964,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
785
964
|
this.ephemeralArrayService.clear(slot);
|
|
786
965
|
}
|
|
787
966
|
|
|
967
|
+
public pushTransient(slot: Fr, elements: Fr[]): number {
|
|
968
|
+
return this.transientArrayService.push(this.contractAddress, slot, elements);
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
public popTransient(slot: Fr): Fr[] {
|
|
972
|
+
return this.transientArrayService.pop(this.contractAddress, slot);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
public getTransient(slot: Fr, index: number): Fr[] {
|
|
976
|
+
return this.transientArrayService.get(this.contractAddress, slot, index);
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
public setTransient(slot: Fr, index: number, elements: Fr[]): void {
|
|
980
|
+
this.transientArrayService.set(this.contractAddress, slot, index, elements);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
public getTransientLen(slot: Fr): number {
|
|
984
|
+
return this.transientArrayService.len(this.contractAddress, slot);
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
public removeTransient(slot: Fr, index: number): void {
|
|
988
|
+
this.transientArrayService.remove(this.contractAddress, slot, index);
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
public clearTransient(slot: Fr): void {
|
|
992
|
+
this.transientArrayService.clear(this.contractAddress, slot);
|
|
993
|
+
}
|
|
994
|
+
|
|
788
995
|
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
789
996
|
this.offchainEffects.push({ data, contractAddress: this.contractAddress });
|
|
790
997
|
return Promise.resolve();
|
|
@@ -796,38 +1003,53 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
796
1003
|
functionSelector: FunctionSelector,
|
|
797
1004
|
args: Fr[],
|
|
798
1005
|
): Promise<Fr[]> {
|
|
799
|
-
const targetArtifact = await this.
|
|
1006
|
+
const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
|
|
800
1007
|
targetContractAddress,
|
|
801
1008
|
functionSelector,
|
|
802
1009
|
);
|
|
1010
|
+
if (!targetArtifact) {
|
|
1011
|
+
throw new Error(
|
|
1012
|
+
`Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` +
|
|
1013
|
+
`Register it via wallet.registerContract(...).`,
|
|
1014
|
+
);
|
|
1015
|
+
}
|
|
803
1016
|
|
|
804
1017
|
if (!targetContractAddress.equals(this.contractAddress)) {
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
callerClassId
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
1018
|
+
// Standard handshake registry reads are authorized by default; every other cross-contract call needs the hook.
|
|
1019
|
+
if (!(await isStandardHandshakeRegistryUtilityRead(targetContractAddress, functionSelector))) {
|
|
1020
|
+
const [callerClassId, targetClassId] = await Promise.all([
|
|
1021
|
+
this.anchoredContractData.getCurrentClassId(this.contractAddress),
|
|
1022
|
+
this.anchoredContractData.getCurrentClassId(targetContractAddress),
|
|
1023
|
+
]);
|
|
1024
|
+
if (!callerClassId || !targetClassId) {
|
|
1025
|
+
throw new Error(
|
|
1026
|
+
`Cannot authorize utility call from ${this.contractAddress} to ${targetContractAddress}: ` +
|
|
1027
|
+
`${!callerClassId ? this.contractAddress : targetContractAddress} is not registered.`,
|
|
1028
|
+
);
|
|
1029
|
+
}
|
|
1030
|
+
const request: UtilityCallAuthorizationRequest = {
|
|
1031
|
+
caller: this.contractAddress,
|
|
1032
|
+
callerClassId,
|
|
1033
|
+
target: targetContractAddress,
|
|
1034
|
+
targetClassId,
|
|
1035
|
+
functionSelector,
|
|
1036
|
+
functionName: targetArtifact.name,
|
|
1037
|
+
args,
|
|
1038
|
+
callerContext: this.callerContext,
|
|
1039
|
+
};
|
|
1040
|
+
|
|
1041
|
+
const response = this.hooks?.authorizeUtilityCall
|
|
1042
|
+
? await this.hooks.authorizeUtilityCall(request)
|
|
1043
|
+
: { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
|
|
1044
|
+
|
|
1045
|
+
if (!response.authorized) {
|
|
1046
|
+
const reason = response.reason ? `: ${response.reason}` : '';
|
|
1047
|
+
throw new Error(
|
|
1048
|
+
`Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
|
|
1049
|
+
`${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
|
|
1050
|
+
`See https://docs.aztec.network/errors/11`,
|
|
1051
|
+
);
|
|
1052
|
+
}
|
|
831
1053
|
}
|
|
832
1054
|
|
|
833
1055
|
await this.contractSyncService.ensureContractSynced(
|
|
@@ -845,20 +1067,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
845
1067
|
);
|
|
846
1068
|
|
|
847
1069
|
const nestedOracle = new UtilityExecutionOracle({
|
|
848
|
-
|
|
1070
|
+
callContext: CallContext.from({
|
|
1071
|
+
msgSender: this.contractAddress,
|
|
1072
|
+
contractAddress: targetContractAddress,
|
|
1073
|
+
functionSelector,
|
|
1074
|
+
isStaticCall: true,
|
|
1075
|
+
}),
|
|
849
1076
|
authWitnesses: this.authWitnesses,
|
|
850
1077
|
capsules: this.capsules,
|
|
851
1078
|
anchorBlockHeader: this.anchorBlockHeader,
|
|
852
|
-
|
|
1079
|
+
anchoredContractData: this.anchoredContractData,
|
|
853
1080
|
noteStore: this.noteStore,
|
|
854
1081
|
keyStore: this.keyStore,
|
|
855
1082
|
addressStore: this.addressStore,
|
|
856
1083
|
aztecNode: this.aztecNode,
|
|
857
1084
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
858
|
-
|
|
1085
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
859
1086
|
capsuleService: this.capsuleService,
|
|
1087
|
+
factService: this.factService,
|
|
860
1088
|
privateEventStore: this.privateEventStore,
|
|
861
|
-
|
|
1089
|
+
txResolver: this.txResolver,
|
|
862
1090
|
contractSyncService: this.contractSyncService,
|
|
863
1091
|
l2TipsStore: this.l2TipsStore,
|
|
864
1092
|
jobId: this.jobId,
|
|
@@ -867,12 +1095,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
867
1095
|
hooks: this.hooks,
|
|
868
1096
|
utilityExecutor: this.utilityExecutor,
|
|
869
1097
|
log: this.logger,
|
|
1098
|
+
// Shared across the whole execution tree: nested utility frames inherit the caller's transient-array store.
|
|
1099
|
+
transientArrayService: this.transientArrayService,
|
|
870
1100
|
});
|
|
871
1101
|
|
|
872
1102
|
const initialWitness = toACVMWitness(0, args);
|
|
873
|
-
const acvmCallback = new Oracle(nestedOracle);
|
|
874
1103
|
const acirExecutionResult = await this.simulator
|
|
875
|
-
.executeUserCircuit(initialWitness, targetArtifact,
|
|
1104
|
+
.executeUserCircuit(initialWitness, targetArtifact, buildACIRCallback(nestedOracle))
|
|
876
1105
|
.catch((err: Error) => {
|
|
877
1106
|
err.message = resolveAssertionMessageFromError(err, targetArtifact);
|
|
878
1107
|
throw new ExecutionError(
|
|
@@ -891,18 +1120,93 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
891
1120
|
return this.offchainEffects;
|
|
892
1121
|
}
|
|
893
1122
|
|
|
1123
|
+
/** Stores the onchain context of the given txs, so that validating the notes and events they created is free. */
|
|
1124
|
+
#cacheValidationTxData(txs: TxOnchainContext[]) {
|
|
1125
|
+
txs.forEach(tx => this.validationTxDataCache.set(tx.txHash.toString(), toValidationTxData(tx)));
|
|
1126
|
+
}
|
|
1127
|
+
|
|
894
1128
|
/**
|
|
895
|
-
*
|
|
896
|
-
*
|
|
1129
|
+
* Returns the information needed to validate the notes and events created in the given txs, keyed by
|
|
1130
|
+
* `TxHash.toString()`. Txs already in {@link validationTxDataCache} cost no node request, and the rest are read from
|
|
1131
|
+
* the node. Txs with no tx effect are absent from the returned map.
|
|
897
1132
|
*/
|
|
898
|
-
async #
|
|
899
|
-
const
|
|
900
|
-
const
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
1133
|
+
async #getValidationTxData(txHashes: TxHash[]): Promise<Map<string, ValidationTxData>> {
|
|
1134
|
+
const known: [string, ValidationTxData][] = [];
|
|
1135
|
+
const misses: TxHash[] = [];
|
|
1136
|
+
for (const txHash of uniqueBy(txHashes, h => h.toString())) {
|
|
1137
|
+
const key = txHash.toString();
|
|
1138
|
+
const cached = this.validationTxDataCache.get(key);
|
|
1139
|
+
if (cached) {
|
|
1140
|
+
known.push([key, cached]);
|
|
1141
|
+
} else {
|
|
1142
|
+
misses.push(txHash);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
const fetched = await Promise.all(misses.map(h => this.#getTxReceiptWithEffect(h)));
|
|
1147
|
+
return new Map([
|
|
1148
|
+
...known,
|
|
1149
|
+
...misses
|
|
1150
|
+
.map((h, i): [string, ValidationTxData | undefined] => {
|
|
1151
|
+
const receipt = fetched[i];
|
|
1152
|
+
if (!receipt.isMined() || !receipt.txEffect) {
|
|
1153
|
+
return [h.toString(), undefined];
|
|
1154
|
+
}
|
|
1155
|
+
return [
|
|
1156
|
+
h.toString(),
|
|
1157
|
+
{
|
|
1158
|
+
noteHashes: receipt.txEffect.noteHashes,
|
|
1159
|
+
nullifiers: receipt.txEffect.nullifiers,
|
|
1160
|
+
l2BlockNumber: receipt.blockNumber,
|
|
1161
|
+
l2BlockHash: receipt.blockHash,
|
|
1162
|
+
txIndexInBlock: receipt.txIndexInBlock,
|
|
1163
|
+
},
|
|
1164
|
+
];
|
|
1165
|
+
})
|
|
1166
|
+
.filter((entry): entry is [string, ValidationTxData] => entry[1] !== undefined),
|
|
1167
|
+
]);
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
/**
|
|
1171
|
+
* Reads a receipt with its effect, at most once per tx for the lifetime of this execution.
|
|
1172
|
+
*
|
|
1173
|
+
* A receipt is not cacheable in general, since pending, mined and dropped are all correct answers to the same call
|
|
1174
|
+
* over time. Within one execution it is: the execution is anchored at a fixed block, and validation runs in several
|
|
1175
|
+
* batches that name overlapping tx hashes, so re-reading would both cost extra requests and let one execution see a
|
|
1176
|
+
* tx as included in one batch and absent in the next.
|
|
1177
|
+
*/
|
|
1178
|
+
#getTxReceiptWithEffect(txHash: TxHash) {
|
|
1179
|
+
const key = txHash.toString();
|
|
1180
|
+
let receipt = this.txReceiptsCache.get(key);
|
|
1181
|
+
if (!receipt) {
|
|
1182
|
+
receipt = this.aztecNode.getTxReceipt(txHash, { includeTxEffect: true }).catch(err => {
|
|
1183
|
+
this.txReceiptsCache.delete(key);
|
|
1184
|
+
throw err;
|
|
1185
|
+
});
|
|
1186
|
+
this.txReceiptsCache.set(key, receipt);
|
|
1187
|
+
}
|
|
1188
|
+
return receipt;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
async #getTxEffectOption(txHash: TxHash): Promise<Option<TxEffectData>> {
|
|
1192
|
+
const receipt = await this.#getTxReceiptWithEffect(txHash);
|
|
1193
|
+
if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
|
|
1194
|
+
return Option.none();
|
|
1195
|
+
}
|
|
1196
|
+
return Option.some(this.#toTxEffectData(receipt.txEffect));
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
#toTxEffectData(txEffect: TxEffect): TxEffectData {
|
|
1200
|
+
return {
|
|
1201
|
+
...txEffect,
|
|
1202
|
+
revertCode: txEffect.revertCode.getCode(),
|
|
1203
|
+
publicLogs: FlatPublicLogs.fromLogs(txEffect.publicLogs),
|
|
1204
|
+
contractClassLogs: txEffect.contractClassLogs.map(log => ({
|
|
1205
|
+
contractAddress: log.contractAddress,
|
|
1206
|
+
fields: log.fields.toFields(),
|
|
1207
|
+
emittedLength: log.emittedLength,
|
|
1208
|
+
})),
|
|
1209
|
+
};
|
|
906
1210
|
}
|
|
907
1211
|
|
|
908
1212
|
/** Runs a query concurrently with a validation that the block hash is not ahead of the anchor block. */
|
|
@@ -936,4 +1240,82 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
936
1240
|
protected get callerContext(): 'private' | 'private view' | 'utility' {
|
|
937
1241
|
return 'utility';
|
|
938
1242
|
}
|
|
1243
|
+
|
|
1244
|
+
/** The address of the contract whose function is being executed, from the call context. */
|
|
1245
|
+
protected get contractAddress(): AztecAddress {
|
|
1246
|
+
return this.callContext.contractAddress;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
// Registry reads that any contract may issue without an `authorizeUtilityCall` hook. The constrained-delivery
|
|
1251
|
+
// library calls these implicitly for the app, and they are safe to default-authorize: `get_app_siloed_secrets`
|
|
1252
|
+
// siloes every returned secret to `msg_sender`, and `get_non_interactive_handshakes` only exposes ephemeral public
|
|
1253
|
+
// keys, from which the shared secret cannot be derived without the recipient's secret keys.
|
|
1254
|
+
const STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES = [
|
|
1255
|
+
'get_non_interactive_handshakes((Field),u32)',
|
|
1256
|
+
'get_app_siloed_secrets((Field),(Field))',
|
|
1257
|
+
];
|
|
1258
|
+
|
|
1259
|
+
async function doesSelectorHaveSignature(functionSelector: FunctionSelector, signature: string): Promise<boolean> {
|
|
1260
|
+
return functionSelector.equals(await FunctionSelector.fromSignature(signature));
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
/**
|
|
1264
|
+
* Whether a cross-contract utility call targets one of the standard handshake registry's read functions.
|
|
1265
|
+
*
|
|
1266
|
+
* These reads are authorized by PXE for every wallet, without consulting the `authorizeUtilityCall` hook, so that
|
|
1267
|
+
* wallets don't need to know the handshake registry exists in order to deliver and discover messages through it.
|
|
1268
|
+
*/
|
|
1269
|
+
async function isStandardHandshakeRegistryUtilityRead(
|
|
1270
|
+
targetContractAddress: AztecAddress,
|
|
1271
|
+
functionSelector: FunctionSelector,
|
|
1272
|
+
): Promise<boolean> {
|
|
1273
|
+
if (!targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
|
|
1274
|
+
return false;
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
const matches = await Promise.all(
|
|
1278
|
+
STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES.map(signature =>
|
|
1279
|
+
doesSelectorHaveSignature(functionSelector, signature),
|
|
1280
|
+
),
|
|
1281
|
+
);
|
|
1282
|
+
return matches.some(Boolean);
|
|
939
1283
|
}
|
|
1284
|
+
|
|
1285
|
+
function toPendingTaggedLog(retrievedLog: RetrievedTaggedLog): PendingTaggedLog {
|
|
1286
|
+
return { log: retrievedLog.logData, context: toResolvedTx(retrievedLog) };
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
function toResolvedTx(tx: TxOnchainContext): ResolvedTx {
|
|
1290
|
+
const { txHash, blockNumber, blockHash, noteHashes, nullifiers } = tx;
|
|
1291
|
+
return {
|
|
1292
|
+
txHash,
|
|
1293
|
+
uniqueNoteHashesInTx: noteHashes,
|
|
1294
|
+
firstNullifierInTx: nullifiers[0],
|
|
1295
|
+
blockNumber,
|
|
1296
|
+
blockHash: blockHash.toFr(),
|
|
1297
|
+
};
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
function toLogRetrievalResponse(retrievedLog: RetrievedTaggedLog): LogRetrievalResponse {
|
|
1301
|
+
const { logData, txHash, blockNumber, blockHash, blockTimestamp, noteHashes, nullifiers } = retrievedLog;
|
|
1302
|
+
return {
|
|
1303
|
+
// Skip the tag, and clip to the wire cap: public logs can exceed PRIVATE_LOG_CIPHERTEXT_LEN, which is the fixed
|
|
1304
|
+
// size of the oracle's BoundedVec slot. A no-op for private logs, which are already within the cap.
|
|
1305
|
+
logPayload: logData.slice(1, 1 + PRIVATE_LOG_CIPHERTEXT_LEN),
|
|
1306
|
+
txHash,
|
|
1307
|
+
uniqueNoteHashesInTx: noteHashes,
|
|
1308
|
+
firstNullifierInTx: nullifiers[0],
|
|
1309
|
+
blockNumber,
|
|
1310
|
+
blockTimestamp,
|
|
1311
|
+
blockHash,
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
function toValidationTxData(tx: TxOnchainContext): ValidationTxData {
|
|
1316
|
+
const { blockNumber, blockHash, txIndexInBlock, noteHashes, nullifiers } = tx;
|
|
1317
|
+
return { noteHashes, nullifiers, l2BlockNumber: blockNumber, l2BlockHash: blockHash, txIndexInBlock };
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
/** The onchain context of a tx served to note and event validation: the union of what the two services read. */
|
|
1321
|
+
type ValidationTxData = NoteValidationTxData & EventValidationTxData;
|