@aztec/pxe 0.0.1-commit.b33fc05d0 → 0.0.1-commit.b3d3157a
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 +43 -99
- package/dest/bin/index.d.ts +2 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +1 -0
- package/dest/bin/oracle_version_helpers.d.ts +26 -0
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
- package/dest/bin/oracle_version_helpers.js +93 -0
- package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
- package/dest/block_synchronizer/block_stream_source.js +62 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +30 -10
- package/dest/config/index.d.ts +7 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +12 -14
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +13 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +47 -16
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
- package/dest/contract_function_simulator/execution_note_cache.d.ts +2 -2
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -9
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -7
- package/dest/contract_function_simulator/index.d.ts +13 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +10 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.js +45 -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 +5 -5
- 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 +6 -8
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
- 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 +35 -4
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -1
- 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 +5 -5
- 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 +6 -8
- package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/option.js +62 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +11 -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 +24 -0
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +16 -102
- 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/note_packing_utils.d.ts +2 -2
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
- package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -45
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +405 -269
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +127 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +786 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +139 -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 +560 -0
- package/dest/contract_function_simulator/oracle/private_execution.js +4 -2
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +33 -47
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +69 -65
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +108 -60
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +382 -157
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +20 -3
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
- package/dest/contract_logging.d.ts +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +7 -8
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +87 -49
- package/dest/contract_sync/helpers.d.ts +2 -4
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +12 -14
- package/dest/debug/pxe_debug_utils.d.ts +3 -8
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +0 -6
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +13 -5
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +13 -5
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +3 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -2
- package/dest/entrypoints/server/utils.d.ts +4 -3
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +13 -5
- package/dest/events/event_service.d.ts +15 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +44 -11
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/hooks/authorize_utility_call.d.ts +41 -0
- package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
- package/dest/hooks/authorize_utility_call.js +4 -0
- package/dest/hooks/execution_hooks.d.ts +42 -0
- package/dest/hooks/execution_hooks.d.ts.map +1 -0
- package/dest/hooks/execution_hooks.js +9 -0
- package/dest/hooks/index.d.ts +4 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +1 -0
- package/dest/logs/log_service.d.ts +9 -9
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +126 -72
- package/dest/messages/message_context_service.d.ts +3 -3
- package/dest/messages/message_context_service.d.ts.map +1 -1
- package/dest/messages/message_context_service.js +30 -11
- package/dest/notes/note_service.d.ts +27 -6
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +80 -56
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- package/dest/private_kernel/batch_planner.d.ts +47 -0
- package/dest/private_kernel/batch_planner.d.ts.map +1 -0
- package/dest/private_kernel/batch_planner.js +104 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +1 -1
- package/dest/private_kernel/hints/test_utils.d.ts +1 -1
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
- package/dest/private_kernel/hints/test_utils.js +2 -3
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +152 -59
- package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +24 -22
- package/dest/pxe.d.ts +58 -10
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +149 -93
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +9 -26
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/open_pxe_stores.d.ts +33 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +27 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +3 -0
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +3 -3
- package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +36 -37
- package/dest/tagging/index.d.ts +5 -4
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +4 -3
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +163 -0
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -5
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +26 -14
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +11 -6
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +21 -0
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +4 -4
- 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 +2 -2
- package/package.json +20 -17
- package/src/bin/check_oracle_version.ts +49 -122
- package/src/bin/index.ts +1 -0
- package/src/bin/oracle_version_helpers.ts +121 -0
- package/src/block_synchronizer/block_stream_source.ts +81 -0
- package/src/block_synchronizer/block_synchronizer.ts +33 -11
- package/src/config/index.ts +14 -8
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +74 -20
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_note_cache.ts +1 -1
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -9
- package/src/contract_function_simulator/index.ts +50 -1
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
- package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +4 -6
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -1
- package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -6
- package/src/contract_function_simulator/noir-structs/option.ts +69 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +27 -0
- package/src/contract_function_simulator/oracle/interfaces.ts +12 -175
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle.ts +498 -441
- package/src/contract_function_simulator/oracle/oracle_registry.ts +585 -0
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +553 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -2
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +91 -86
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +558 -265
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
- package/src/contract_logging.ts +18 -5
- package/src/contract_sync/contract_sync_service.ts +120 -83
- package/src/contract_sync/helpers.ts +13 -25
- package/src/debug/pxe_debug_utils.ts +3 -11
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +10 -5
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +10 -5
- package/src/entrypoints/pxe_creation_options.ts +14 -0
- package/src/entrypoints/server/index.ts +2 -2
- package/src/entrypoints/server/utils.ts +15 -6
- package/src/events/event_service.ts +69 -21
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/hooks/authorize_utility_call.ts +44 -0
- package/src/hooks/execution_hooks.ts +48 -0
- package/src/hooks/index.ts +7 -0
- package/src/logs/log_service.ts +158 -134
- package/src/messages/message_context_service.ts +43 -26
- package/src/notes/note_service.ts +119 -85
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +1 -1
- package/src/private_kernel/hints/test_utils.ts +2 -9
- package/src/private_kernel/private_kernel_execution_prover.ts +240 -82
- package/src/private_kernel/private_kernel_oracle.ts +35 -25
- package/src/pxe.ts +256 -98
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +14 -35
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +5 -9
- package/src/storage/tagging_store/sender_tagging_store.ts +6 -6
- package/src/tagging/get_all_logs_by_tags.ts +78 -50
- package/src/tagging/index.ts +4 -3
- package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +41 -19
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +23 -8
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +4 -5
- package/dest/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts +0 -16
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +0 -1
- package/dest/contract_function_simulator/noir-structs/message_tx_context.js +0 -57
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +0 -9
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +0 -52
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
- package/src/access_scopes.ts +0 -9
- package/src/contract_function_simulator/noir-structs/message_tx_context.ts +0 -55
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +0 -77
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -140
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
|
@@ -1,49 +1,78 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ARCHIVE_HEIGHT, type NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { uniqueBy } from '@aztec/foundation/collection';
|
|
3
4
|
import { Aes128 } from '@aztec/foundation/crypto/aes128';
|
|
4
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
-
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
6
|
+
import type { Point } from '@aztec/foundation/curves/grumpkin';
|
|
6
7
|
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
7
|
-
import
|
|
8
|
+
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
8
9
|
import type { KeyStore } from '@aztec/key-store';
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
type CircuitSimulator,
|
|
12
|
+
ExecutionError,
|
|
13
|
+
extractCallStack,
|
|
14
|
+
resolveAssertionMessageFromError,
|
|
15
|
+
toACVMWitness,
|
|
16
|
+
witnessMapToFields,
|
|
17
|
+
} from '@aztec/simulator/client';
|
|
18
|
+
import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
|
|
10
19
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
11
20
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
12
|
-
import { BlockHash } from '@aztec/stdlib/block';
|
|
21
|
+
import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
13
22
|
import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
|
|
14
23
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
15
24
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
16
25
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
26
|
+
import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
|
|
27
|
+
import {
|
|
28
|
+
AppTaggingSecret,
|
|
29
|
+
MessageContext,
|
|
30
|
+
type PendingTaggedLog,
|
|
31
|
+
deriveAppSiloedSharedSecret,
|
|
32
|
+
} from '@aztec/stdlib/logs';
|
|
19
33
|
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
20
34
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
21
35
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
22
|
-
import
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
import {
|
|
37
|
+
type BlockHeader,
|
|
38
|
+
type Capsule,
|
|
39
|
+
type IndexedTxEffect,
|
|
40
|
+
type OffchainEffect,
|
|
41
|
+
TxEffect,
|
|
42
|
+
type TxHash,
|
|
43
|
+
} from '@aztec/stdlib/tx';
|
|
44
|
+
|
|
45
|
+
import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
|
|
46
|
+
import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
|
|
26
47
|
import { EventService } from '../../events/event_service.js';
|
|
48
|
+
import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
|
|
49
|
+
import type { ExecutionHooks } from '../../hooks/index.js';
|
|
27
50
|
import { LogService } from '../../logs/log_service.js';
|
|
28
51
|
import { MessageContextService } from '../../messages/message_context_service.js';
|
|
29
52
|
import { NoteService } from '../../notes/note_service.js';
|
|
30
|
-
import {
|
|
53
|
+
import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
|
|
31
54
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
32
|
-
import type {
|
|
55
|
+
import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
|
|
33
56
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
34
57
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
35
58
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
36
59
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
37
60
|
import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
61
|
+
import { EphemeralArrayService } from '../ephemeral_array_service.js';
|
|
62
|
+
import { BoundedVec } from '../noir-structs/bounded_vec.js';
|
|
63
|
+
import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
|
|
64
|
+
import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
65
|
+
import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
66
|
+
import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
67
|
+
import type { NoteData } from '../noir-structs/note_data.js';
|
|
68
|
+
import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
69
|
+
import { Option } from '../noir-structs/option.js';
|
|
70
|
+
import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
|
|
43
71
|
import { UtilityContext } from '../noir-structs/utility_context.js';
|
|
44
72
|
import { pickNotes } from '../pick_notes.js';
|
|
45
|
-
import type { IMiscOracle, IUtilityExecutionOracle
|
|
73
|
+
import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
46
74
|
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
75
|
+
import { Oracle } from './oracle.js';
|
|
47
76
|
|
|
48
77
|
/** Args for UtilityExecutionOracle constructor. */
|
|
49
78
|
export type UtilityExecutionOracleArgs = {
|
|
@@ -59,12 +88,18 @@ export type UtilityExecutionOracleArgs = {
|
|
|
59
88
|
aztecNode: AztecNode;
|
|
60
89
|
recipientTaggingStore: RecipientTaggingStore;
|
|
61
90
|
senderAddressBookStore: SenderAddressBookStore;
|
|
62
|
-
|
|
91
|
+
capsuleService: CapsuleService;
|
|
63
92
|
privateEventStore: PrivateEventStore;
|
|
64
93
|
messageContextService: MessageContextService;
|
|
94
|
+
contractSyncService: ContractSyncService;
|
|
95
|
+
l2TipsStore: L2TipsProvider;
|
|
65
96
|
jobId: string;
|
|
66
97
|
log?: ReturnType<typeof createLogger>;
|
|
67
|
-
scopes:
|
|
98
|
+
scopes: AztecAddress[];
|
|
99
|
+
simulator: CircuitSimulator;
|
|
100
|
+
hooks?: ExecutionHooks;
|
|
101
|
+
/** Needed to trigger contract synchronization before nested cross-contract calls. */
|
|
102
|
+
utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
68
103
|
};
|
|
69
104
|
|
|
70
105
|
/**
|
|
@@ -75,6 +110,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
75
110
|
isUtility = true as const;
|
|
76
111
|
|
|
77
112
|
private contractLogger: Logger | undefined;
|
|
113
|
+
private aztecnrLogger: Logger | undefined;
|
|
114
|
+
private offchainEffects: OffchainEffect[] = [];
|
|
115
|
+
private readonly ephemeralArrayService = new EphemeralArrayService();
|
|
116
|
+
|
|
117
|
+
// We store oracle version to be able to show a nice error message when an oracle handler is missing.
|
|
118
|
+
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
78
119
|
|
|
79
120
|
protected readonly contractAddress: AztecAddress;
|
|
80
121
|
protected readonly authWitnesses: AuthWitness[];
|
|
@@ -87,12 +128,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
87
128
|
protected readonly aztecNode: AztecNode;
|
|
88
129
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
89
130
|
protected readonly senderAddressBookStore: SenderAddressBookStore;
|
|
90
|
-
protected readonly
|
|
131
|
+
protected readonly capsuleService: CapsuleService;
|
|
91
132
|
protected readonly privateEventStore: PrivateEventStore;
|
|
92
133
|
protected readonly messageContextService: MessageContextService;
|
|
134
|
+
protected readonly contractSyncService: ContractSyncService;
|
|
135
|
+
protected readonly l2TipsStore: L2TipsProvider;
|
|
93
136
|
protected readonly jobId: string;
|
|
94
137
|
protected logger: ReturnType<typeof createLogger>;
|
|
95
|
-
protected readonly scopes:
|
|
138
|
+
protected readonly scopes: AztecAddress[];
|
|
139
|
+
protected readonly simulator: CircuitSimulator;
|
|
140
|
+
protected readonly hooks: ExecutionHooks | undefined;
|
|
141
|
+
protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
96
142
|
|
|
97
143
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
98
144
|
this.contractAddress = args.contractAddress;
|
|
@@ -106,33 +152,36 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
106
152
|
this.aztecNode = args.aztecNode;
|
|
107
153
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
108
154
|
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
109
|
-
this.
|
|
155
|
+
this.capsuleService = args.capsuleService;
|
|
110
156
|
this.privateEventStore = args.privateEventStore;
|
|
111
157
|
this.messageContextService = args.messageContextService;
|
|
158
|
+
this.contractSyncService = args.contractSyncService;
|
|
159
|
+
this.l2TipsStore = args.l2TipsStore;
|
|
112
160
|
this.jobId = args.jobId;
|
|
113
161
|
this.logger = args.log ?? createLogger('simulator:client_view_context');
|
|
114
162
|
this.scopes = args.scopes;
|
|
163
|
+
this.simulator = args.simulator;
|
|
164
|
+
this.hooks = args.hooks;
|
|
165
|
+
this.utilityExecutor = args.utilityExecutor;
|
|
115
166
|
}
|
|
116
167
|
|
|
117
|
-
public assertCompatibleOracleVersion(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
throw new Error(
|
|
127
|
-
`Expected legacy oracle version ${LEGACY_ORACLE_VERSION} or current oracle version ${ORACLE_VERSION} for alpha payload contract at ${this.contractAddress}, got ${version}.`,
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
return;
|
|
168
|
+
public assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
169
|
+
if (major !== ORACLE_VERSION_MAJOR) {
|
|
170
|
+
const hint =
|
|
171
|
+
major > ORACLE_VERSION_MAJOR
|
|
172
|
+
? 'The contract was compiled with a newer version of Aztec.nr than your private environment supports. Upgrade your private environment to a compatible version.'
|
|
173
|
+
: 'The contract was compiled with an older version of Aztec.nr than your private environment supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
174
|
+
throw new Error(
|
|
175
|
+
`Incompatible private environment version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`,
|
|
176
|
+
);
|
|
131
177
|
}
|
|
132
178
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
179
|
+
this.contractOracleVersion = { major, minor };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
|
|
183
|
+
public nonOracleFunctionGetContractOracleVersion(): { major: number; minor: number } | undefined {
|
|
184
|
+
return this.contractOracleVersion;
|
|
136
185
|
}
|
|
137
186
|
|
|
138
187
|
public getRandomField(): Fr {
|
|
@@ -151,33 +200,36 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
151
200
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
152
201
|
*/
|
|
153
202
|
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
159
|
-
hasAccess = true;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
if (!hasAccess) {
|
|
163
|
-
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
203
|
+
let hasAccess = false;
|
|
204
|
+
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
205
|
+
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
206
|
+
hasAccess = true;
|
|
164
207
|
}
|
|
165
208
|
}
|
|
209
|
+
if (!hasAccess) {
|
|
210
|
+
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
211
|
+
}
|
|
166
212
|
return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
|
|
167
213
|
}
|
|
168
214
|
|
|
169
215
|
/**
|
|
170
216
|
* Fetches the index and sibling path of a leaf at a given block from the note hash tree.
|
|
171
|
-
* @param
|
|
172
|
-
* witness.
|
|
217
|
+
* @param blockHash - The hash of a block that contains the note hash tree root in which to find the
|
|
218
|
+
* membership witness.
|
|
173
219
|
* @param noteHash - The note hash to find in the note hash tree.
|
|
174
220
|
* @returns The membership witness containing the leaf index and sibling path
|
|
175
221
|
*/
|
|
176
|
-
public getNoteHashMembershipWitness(
|
|
177
|
-
|
|
222
|
+
public async getNoteHashMembershipWitness(
|
|
223
|
+
blockHash: BlockHash,
|
|
178
224
|
noteHash: Fr,
|
|
179
|
-
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT
|
|
180
|
-
|
|
225
|
+
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT>> {
|
|
226
|
+
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
227
|
+
this.aztecNode.getNoteHashMembershipWitness(blockHash, noteHash),
|
|
228
|
+
);
|
|
229
|
+
if (!witness) {
|
|
230
|
+
throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
|
|
231
|
+
}
|
|
232
|
+
return witness;
|
|
181
233
|
}
|
|
182
234
|
|
|
183
235
|
/**
|
|
@@ -186,16 +238,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
186
238
|
* Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
|
|
187
239
|
* its block hash is appended as a new leaf to the archive tree.
|
|
188
240
|
*
|
|
189
|
-
* @param
|
|
241
|
+
* @param referenceBlockHash - The hash of a block that contains the archive tree root in which to find the membership
|
|
190
242
|
* witness.
|
|
191
243
|
* @param blockHash - The block hash to find in the archive tree.
|
|
192
244
|
* @returns The membership witness containing the leaf index and sibling path
|
|
193
245
|
*/
|
|
194
|
-
public getBlockHashMembershipWitness(
|
|
195
|
-
|
|
246
|
+
public async getBlockHashMembershipWitness(
|
|
247
|
+
referenceBlockHash: BlockHash,
|
|
196
248
|
blockHash: BlockHash,
|
|
197
|
-
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT
|
|
198
|
-
|
|
249
|
+
): Promise<Option<MembershipWitness<typeof ARCHIVE_HEIGHT>>> {
|
|
250
|
+
// Note that we validate that the reference block hash is at or before the anchor block - we don't test the block
|
|
251
|
+
// hash at all. If the block hash did not exist by the reference block hash, then the node will not return the
|
|
252
|
+
// membership witness as there is none.
|
|
253
|
+
const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
254
|
+
this.aztecNode.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
|
|
255
|
+
);
|
|
256
|
+
return witness ? Option.some(witness) : Option.none(MembershipWitness.empty(ARCHIVE_HEIGHT));
|
|
199
257
|
}
|
|
200
258
|
|
|
201
259
|
/**
|
|
@@ -204,11 +262,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
204
262
|
* @param nullifier - Nullifier we try to find witness for.
|
|
205
263
|
* @returns The nullifier membership witness (if found).
|
|
206
264
|
*/
|
|
207
|
-
public getNullifierMembershipWitness(
|
|
208
|
-
blockHash
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
265
|
+
public async getNullifierMembershipWitness(blockHash: BlockHash, nullifier: Fr): Promise<NullifierMembershipWitness> {
|
|
266
|
+
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
267
|
+
this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier),
|
|
268
|
+
);
|
|
269
|
+
if (!witness) {
|
|
270
|
+
throw new Error(`Nullifier membership witness not found at block ${blockHash.toString()}.`);
|
|
271
|
+
}
|
|
272
|
+
return witness;
|
|
212
273
|
}
|
|
213
274
|
|
|
214
275
|
/**
|
|
@@ -220,11 +281,19 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
220
281
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
221
282
|
* we are trying to prove non-inclusion for.
|
|
222
283
|
*/
|
|
223
|
-
public getLowNullifierMembershipWitness(
|
|
284
|
+
public async getLowNullifierMembershipWitness(
|
|
224
285
|
blockHash: BlockHash,
|
|
225
286
|
nullifier: Fr,
|
|
226
|
-
): Promise<NullifierMembershipWitness
|
|
227
|
-
|
|
287
|
+
): Promise<NullifierMembershipWitness> {
|
|
288
|
+
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
289
|
+
this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier),
|
|
290
|
+
);
|
|
291
|
+
if (!witness) {
|
|
292
|
+
throw new Error(
|
|
293
|
+
`Low nullifier witness not found for nullifier ${nullifier} at block hash ${blockHash.toString()}.`,
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
return witness;
|
|
228
297
|
}
|
|
229
298
|
|
|
230
299
|
/**
|
|
@@ -233,8 +302,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
233
302
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
234
303
|
* @returns - The witness
|
|
235
304
|
*/
|
|
236
|
-
public getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness
|
|
237
|
-
|
|
305
|
+
public async getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness> {
|
|
306
|
+
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
307
|
+
this.aztecNode.getPublicDataWitness(blockHash, leafSlot),
|
|
308
|
+
);
|
|
309
|
+
if (!witness) {
|
|
310
|
+
throw new Error(`Public data witness not found for slot ${leafSlot} at block hash ${blockHash.toString()}.`);
|
|
311
|
+
}
|
|
312
|
+
return witness;
|
|
238
313
|
}
|
|
239
314
|
|
|
240
315
|
/**
|
|
@@ -242,14 +317,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
242
317
|
* @param blockNumber - The number of a block of which to get the block header.
|
|
243
318
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
244
319
|
*/
|
|
245
|
-
public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader
|
|
320
|
+
public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader> {
|
|
246
321
|
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
247
322
|
if (blockNumber > anchorBlockNumber) {
|
|
248
323
|
throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
|
|
249
324
|
}
|
|
250
325
|
|
|
326
|
+
// Most contracts query state at the "current" block, which is the anchor. Skip the RPC when we can.
|
|
327
|
+
if (blockNumber === anchorBlockNumber) {
|
|
328
|
+
return this.anchorBlockHeader;
|
|
329
|
+
}
|
|
330
|
+
|
|
251
331
|
const block = await this.aztecNode.getBlock(blockNumber);
|
|
252
|
-
|
|
332
|
+
if (!block?.header) {
|
|
333
|
+
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
334
|
+
}
|
|
335
|
+
return block.header;
|
|
253
336
|
}
|
|
254
337
|
|
|
255
338
|
/**
|
|
@@ -257,14 +340,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
257
340
|
* @param account - The account address.
|
|
258
341
|
* @returns The public keys and partial address, or `undefined` if the account is not registered.
|
|
259
342
|
*/
|
|
260
|
-
public async
|
|
343
|
+
public async getPublicKeysAndPartialAddress(
|
|
261
344
|
account: AztecAddress,
|
|
262
|
-
): Promise<{ publicKeys: PublicKeys; partialAddress: PartialAddress }
|
|
345
|
+
): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
|
|
263
346
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
264
347
|
if (!completeAddress) {
|
|
265
|
-
return
|
|
348
|
+
return Option.none({ publicKeys: PublicKeys.default(), partialAddress: Fr.ZERO });
|
|
266
349
|
}
|
|
267
|
-
return { publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress };
|
|
350
|
+
return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
|
|
268
351
|
}
|
|
269
352
|
|
|
270
353
|
protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
|
|
@@ -292,13 +375,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
292
375
|
}
|
|
293
376
|
|
|
294
377
|
/**
|
|
295
|
-
* Returns an auth witness for the given message hash
|
|
296
|
-
* for this transaction first, and falls back to the local database if not found.
|
|
378
|
+
* Returns an auth witness for the given message hash from the list of transient witnesses for this transaction.
|
|
297
379
|
* @param messageHash - Hash of the message to authenticate.
|
|
298
|
-
* @returns Authentication witness for the requested message hash.
|
|
380
|
+
* @returns Authentication witness for the requested message hash, or undefined if not found.
|
|
299
381
|
*/
|
|
300
|
-
public getAuthWitness(messageHash: Fr): Promise<Fr[]
|
|
301
|
-
|
|
382
|
+
public getAuthWitness(messageHash: Fr): Promise<Fr[]> {
|
|
383
|
+
const witness = this.authWitnesses.find(w => w.requestHash.equals(messageHash))?.witness;
|
|
384
|
+
if (!witness) {
|
|
385
|
+
throw new Error(`Unknown auth witness for message hash ${messageHash}`);
|
|
386
|
+
}
|
|
387
|
+
return Promise.resolve(witness);
|
|
302
388
|
}
|
|
303
389
|
|
|
304
390
|
/**
|
|
@@ -324,7 +410,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
324
410
|
* @returns Array of note data.
|
|
325
411
|
*/
|
|
326
412
|
public async getNotes(
|
|
327
|
-
owner: AztecAddress
|
|
413
|
+
owner: Option<AztecAddress>,
|
|
328
414
|
storageSlot: Fr,
|
|
329
415
|
numSelects: number,
|
|
330
416
|
selectByIndexes: number[],
|
|
@@ -339,11 +425,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
339
425
|
limit: number,
|
|
340
426
|
offset: number,
|
|
341
427
|
status: NoteStatus,
|
|
342
|
-
|
|
428
|
+
maxNotes: number,
|
|
429
|
+
packedHintedNoteLength: number,
|
|
430
|
+
): Promise<BoundedVec<NoteData>> {
|
|
343
431
|
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
344
432
|
|
|
345
|
-
const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
|
|
346
|
-
|
|
433
|
+
const dbNotes = await noteService.getNotes(this.contractAddress, owner.value, storageSlot, status, this.scopes);
|
|
434
|
+
const picked = pickNotes<NoteData>(dbNotes, {
|
|
347
435
|
selects: selectByIndexes.slice(0, numSelects).map((index, i) => ({
|
|
348
436
|
selector: { index, offset: selectByOffsets[i], length: selectByLengths[i] },
|
|
349
437
|
value: selectValues[i],
|
|
@@ -356,6 +444,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
356
444
|
limit,
|
|
357
445
|
offset,
|
|
358
446
|
});
|
|
447
|
+
return BoundedVec.from({ data: picked, maxLength: maxNotes, elementSize: packedHintedNoteLength });
|
|
359
448
|
}
|
|
360
449
|
|
|
361
450
|
/**
|
|
@@ -363,7 +452,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
363
452
|
* @param innerNullifier - The inner nullifier.
|
|
364
453
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
365
454
|
*/
|
|
366
|
-
public async
|
|
455
|
+
public async doesNullifierExist(innerNullifier: Fr) {
|
|
367
456
|
const [nullifier, anchorBlockHash] = await Promise.all([
|
|
368
457
|
siloNullifier(this.contractAddress, innerNullifier!),
|
|
369
458
|
this.anchorBlockHeader.hash(),
|
|
@@ -375,7 +464,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
375
464
|
}
|
|
376
465
|
|
|
377
466
|
/**
|
|
378
|
-
*
|
|
467
|
+
* Returns the membership witness of an un-nullified L1 to L2 message.
|
|
379
468
|
* @param contractAddress - Address of a contract by which the message was emitted.
|
|
380
469
|
* @param messageHash - Hash of the message.
|
|
381
470
|
* @param secret - Secret used to compute a nullifier.
|
|
@@ -388,6 +477,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
388
477
|
contractAddress,
|
|
389
478
|
messageHash,
|
|
390
479
|
secret,
|
|
480
|
+
await this.anchorBlockHeader.hash(),
|
|
391
481
|
);
|
|
392
482
|
|
|
393
483
|
return new MessageLoadOracleInputs(messageIndex, siblingPath);
|
|
@@ -400,29 +490,31 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
400
490
|
* @param startStorageSlot - The starting storage slot.
|
|
401
491
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
402
492
|
*/
|
|
403
|
-
public
|
|
493
|
+
public getFromPublicStorage(
|
|
404
494
|
blockHash: BlockHash,
|
|
405
495
|
contractAddress: AztecAddress,
|
|
406
496
|
startStorageSlot: Fr,
|
|
407
497
|
numberOfElements: number,
|
|
408
498
|
) {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
499
|
+
return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
|
|
500
|
+
const slots = Array(numberOfElements)
|
|
501
|
+
.fill(0)
|
|
502
|
+
.map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
|
|
412
503
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
504
|
+
const values = await Promise.all(
|
|
505
|
+
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
506
|
+
);
|
|
416
507
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
508
|
+
this.logger.debug(
|
|
509
|
+
`Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
510
|
+
);
|
|
420
511
|
|
|
421
|
-
|
|
512
|
+
return values;
|
|
513
|
+
});
|
|
422
514
|
}
|
|
423
515
|
|
|
424
516
|
/**
|
|
425
|
-
* Returns a per-contract logger whose output is prefixed with `
|
|
517
|
+
* Returns a per-contract logger whose output is prefixed with `contract:<name>(<addrAbbrev>)`.
|
|
426
518
|
*/
|
|
427
519
|
async #getContractLogger(): Promise<Logger> {
|
|
428
520
|
if (!this.contractLogger) {
|
|
@@ -431,244 +523,445 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
431
523
|
this.contractLogger = await createContractLogger(
|
|
432
524
|
this.contractAddress,
|
|
433
525
|
addr => this.contractStore.getDebugContractName(addr),
|
|
526
|
+
'user',
|
|
434
527
|
{ instanceId: this.jobId },
|
|
435
528
|
);
|
|
436
529
|
}
|
|
437
530
|
return this.contractLogger;
|
|
438
531
|
}
|
|
439
532
|
|
|
440
|
-
|
|
533
|
+
/**
|
|
534
|
+
* Returns a per-contract logger whose output is prefixed with `aztecnr:<name>(<addrAbbrev>)`.
|
|
535
|
+
*/
|
|
536
|
+
async #getAztecnrLogger(): Promise<Logger> {
|
|
537
|
+
if (!this.aztecnrLogger) {
|
|
538
|
+
// Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense
|
|
539
|
+
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
540
|
+
this.aztecnrLogger = await createContractLogger(
|
|
541
|
+
this.contractAddress,
|
|
542
|
+
addr => this.contractStore.getDebugContractName(addr),
|
|
543
|
+
'aztecnr',
|
|
544
|
+
{ instanceId: this.jobId },
|
|
545
|
+
);
|
|
546
|
+
}
|
|
547
|
+
return this.aztecnrLogger;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
public async log(level: number, message: string, _fieldsSize: number, fields: Fr[]): Promise<void> {
|
|
441
551
|
if (!LogLevels[level]) {
|
|
442
552
|
throw new Error(`Invalid log level: ${level}`);
|
|
443
553
|
}
|
|
444
|
-
|
|
445
|
-
|
|
554
|
+
|
|
555
|
+
const { kind, message: strippedMessage } = stripAztecnrLogPrefix(message);
|
|
556
|
+
|
|
557
|
+
const logger = kind == 'aztecnr' ? await this.#getAztecnrLogger() : await this.#getContractLogger();
|
|
558
|
+
logContractMessage(logger, LogLevels[level], strippedMessage, fields);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
|
|
562
|
+
public async getPendingTaggedLogs(
|
|
563
|
+
scope: AztecAddress,
|
|
564
|
+
providedSecrets: EphemeralArray<ProvidedSecret>,
|
|
565
|
+
): Promise<EphemeralArray<PendingTaggedLog>> {
|
|
566
|
+
const secrets = providedSecrets
|
|
567
|
+
.readAll(this.ephemeralArrayService)
|
|
568
|
+
.map(ps => new AppTaggingSecret(ps.secret, this.contractAddress, ps.mode));
|
|
569
|
+
|
|
570
|
+
const logService = this.#createLogService();
|
|
571
|
+
const logs = await logService.fetchTaggedLogs(this.contractAddress, scope, secrets);
|
|
572
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, logs);
|
|
446
573
|
}
|
|
447
574
|
|
|
448
|
-
|
|
449
|
-
|
|
575
|
+
#createLogService(): LogService {
|
|
576
|
+
return new LogService(
|
|
450
577
|
this.aztecNode,
|
|
451
578
|
this.anchorBlockHeader,
|
|
579
|
+
this.l2TipsStore,
|
|
452
580
|
this.keyStore,
|
|
453
|
-
this.capsuleStore,
|
|
454
581
|
this.recipientTaggingStore,
|
|
455
582
|
this.senderAddressBookStore,
|
|
456
583
|
this.addressStore,
|
|
457
584
|
this.jobId,
|
|
458
585
|
this.logger.getBindings(),
|
|
459
586
|
);
|
|
460
|
-
|
|
461
|
-
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
462
587
|
}
|
|
463
588
|
|
|
464
|
-
/**
|
|
465
|
-
* Validates all note and event validation requests enqueued via `enqueue_note_for_validation` and
|
|
466
|
-
* `enqueue_event_for_validation`, inserting them into the note database and event store respectively, making them
|
|
467
|
-
* queryable via `get_notes` and `getPrivateEvents`.
|
|
468
|
-
*
|
|
469
|
-
* This automatically clears both validation request queues, so no further work needs to be done by the caller.
|
|
470
|
-
* @param contractAddress - The address of the contract that the logs are tagged for.
|
|
471
|
-
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
472
|
-
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
473
|
-
*/
|
|
474
589
|
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
maxNotePackedLen: number,
|
|
479
|
-
maxEventSerializedLen: number,
|
|
590
|
+
noteValidationRequests: EphemeralArray<NoteValidationRequest>,
|
|
591
|
+
eventValidationRequests: EphemeralArray<EventValidationRequest>,
|
|
592
|
+
scope: AztecAddress,
|
|
480
593
|
) {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
// faster as we don't need to wait for the network round-trip.
|
|
488
|
-
const noteValidationRequests = (
|
|
489
|
-
await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, this.jobId)
|
|
490
|
-
).map(fields => NoteValidationRequest.fromFields(fields, maxNotePackedLen));
|
|
594
|
+
await this.#processValidationRequests(
|
|
595
|
+
noteValidationRequests.readAll(this.ephemeralArrayService),
|
|
596
|
+
eventValidationRequests.readAll(this.ephemeralArrayService),
|
|
597
|
+
scope,
|
|
598
|
+
);
|
|
599
|
+
}
|
|
491
600
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
601
|
+
async #processValidationRequests(
|
|
602
|
+
noteValidationRequests: NoteValidationRequest[],
|
|
603
|
+
eventValidationRequests: EventValidationRequest[],
|
|
604
|
+
scope: AztecAddress,
|
|
605
|
+
) {
|
|
606
|
+
const txEffects = await this.#fetchTxEffects([
|
|
607
|
+
...noteValidationRequests.map(r => r.txHash),
|
|
608
|
+
...eventValidationRequests.map(r => r.txHash),
|
|
609
|
+
]);
|
|
495
610
|
|
|
496
611
|
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
497
|
-
const noteStorePromises = noteValidationRequests.map(request =>
|
|
498
|
-
noteService.validateAndStoreNote(
|
|
499
|
-
request.contractAddress,
|
|
500
|
-
request.owner,
|
|
501
|
-
request.storageSlot,
|
|
502
|
-
request.randomness,
|
|
503
|
-
request.noteNonce,
|
|
504
|
-
request.content,
|
|
505
|
-
request.noteHash,
|
|
506
|
-
request.nullifier,
|
|
507
|
-
request.txHash,
|
|
508
|
-
request.recipient,
|
|
509
|
-
),
|
|
510
|
-
);
|
|
511
|
-
|
|
512
612
|
const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
|
|
513
|
-
const eventStorePromises = eventValidationRequests.map(request =>
|
|
514
|
-
eventService.validateAndStoreEvent(
|
|
515
|
-
request.contractAddress,
|
|
516
|
-
request.eventTypeId,
|
|
517
|
-
request.randomness,
|
|
518
|
-
request.serializedEvent,
|
|
519
|
-
request.eventCommitment,
|
|
520
|
-
request.txHash,
|
|
521
|
-
request.recipient,
|
|
522
|
-
),
|
|
523
|
-
);
|
|
524
613
|
|
|
525
|
-
await Promise.all([
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
614
|
+
await Promise.all([
|
|
615
|
+
noteService.validateAndStoreNotes(noteValidationRequests, scope, txEffects),
|
|
616
|
+
eventService.validateAndStoreEvents(eventValidationRequests, scope, txEffects),
|
|
617
|
+
]);
|
|
530
618
|
}
|
|
531
619
|
|
|
532
|
-
public async
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
// TODO(#10727): allow other contracts to process partial notes
|
|
538
|
-
if (!this.contractAddress.equals(contractAddress)) {
|
|
539
|
-
throw new Error(`Got a note validation request from ${contractAddress}, expected ${this.contractAddress}`);
|
|
540
|
-
}
|
|
620
|
+
public async getLogsByTag(
|
|
621
|
+
requests: EphemeralArray<LogRetrievalRequest>,
|
|
622
|
+
): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
|
|
623
|
+
const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
|
|
624
|
+
const logService = this.#createLogService();
|
|
541
625
|
|
|
542
|
-
|
|
543
|
-
// don't need to wait for the network round-trip.
|
|
544
|
-
const logRetrievalRequests = (
|
|
545
|
-
await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, this.jobId)
|
|
546
|
-
).map(LogRetrievalRequest.fromFields);
|
|
626
|
+
const logRetrievalResponses = await logService.fetchLogsByTag(this.contractAddress, logRetrievalRequests);
|
|
547
627
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
this.
|
|
551
|
-
this.keyStore,
|
|
552
|
-
this.capsuleStore,
|
|
553
|
-
this.recipientTaggingStore,
|
|
554
|
-
this.senderAddressBookStore,
|
|
555
|
-
this.addressStore,
|
|
556
|
-
this.jobId,
|
|
557
|
-
this.logger.getBindings(),
|
|
628
|
+
// Create an inner ephemeral array for each request's matching logs, then wrap all slots in an outer array.
|
|
629
|
+
const innerArrays = logRetrievalResponses.map(responses =>
|
|
630
|
+
EphemeralArray.fromValues(this.ephemeralArrayService, responses),
|
|
558
631
|
);
|
|
559
632
|
|
|
560
|
-
|
|
633
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
|
|
634
|
+
}
|
|
561
635
|
|
|
562
|
-
|
|
563
|
-
|
|
636
|
+
/** Reads tx hash requests from an ephemeral array, resolves their contexts, and returns the response array. */
|
|
637
|
+
public async getMessageContextsByTxHash(
|
|
638
|
+
requests: EphemeralArray<Fr>,
|
|
639
|
+
): Promise<EphemeralArray<Option<MessageContext>>> {
|
|
640
|
+
const txHashes = requests.readAll(this.ephemeralArrayService);
|
|
564
641
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
logRetrievalResponsesArrayBaseSlot,
|
|
569
|
-
maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption),
|
|
570
|
-
this.jobId,
|
|
642
|
+
const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
|
|
643
|
+
txHashes,
|
|
644
|
+
this.anchorBlockHeader.getBlockNumber(),
|
|
571
645
|
);
|
|
572
|
-
}
|
|
573
646
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
try {
|
|
580
|
-
if (!this.contractAddress.equals(contractAddress)) {
|
|
581
|
-
throw new Error(`Got a message context request from ${contractAddress}, expected ${this.contractAddress}`);
|
|
582
|
-
}
|
|
583
|
-
const requestCapsules = await this.capsuleStore.readCapsuleArray(
|
|
584
|
-
contractAddress,
|
|
585
|
-
messageContextRequestsArrayBaseSlot,
|
|
586
|
-
this.jobId,
|
|
587
|
-
);
|
|
588
|
-
|
|
589
|
-
const txHashes = requestCapsules.map((fields, i) => {
|
|
590
|
-
if (fields.length !== 1) {
|
|
591
|
-
throw new Error(
|
|
592
|
-
`Malformed message context request at index ${i}: expected 1 field (tx hash), got ${fields.length}`,
|
|
593
|
-
);
|
|
594
|
-
}
|
|
595
|
-
return fields[0];
|
|
596
|
-
});
|
|
647
|
+
const options = maybeMessageContexts.map(mc =>
|
|
648
|
+
mc ? Option.some(mc) : Option.none<MessageContext>(MessageContext.empty()),
|
|
649
|
+
);
|
|
650
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, options);
|
|
651
|
+
}
|
|
597
652
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
653
|
+
/**
|
|
654
|
+
* Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
|
|
655
|
+
* block.
|
|
656
|
+
*/
|
|
657
|
+
public async getTxEffect(txHash: TxHash): Promise<Option<TxEffect>> {
|
|
658
|
+
if (txHash.hash.isZero()) {
|
|
659
|
+
throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
|
|
660
|
+
}
|
|
602
661
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
messageContextResponsesArrayBaseSlot,
|
|
607
|
-
maybeMessageContexts.map(MessageTxContext.toSerializedOption),
|
|
608
|
-
this.jobId,
|
|
609
|
-
);
|
|
610
|
-
} finally {
|
|
611
|
-
await this.capsuleStore.setCapsuleArray(contractAddress, messageContextRequestsArrayBaseSlot, [], this.jobId);
|
|
662
|
+
const receipt = await this.aztecNode.getTxReceipt(txHash, { includeTxEffect: true });
|
|
663
|
+
if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
|
|
664
|
+
return Option.none(TxEffect.empty());
|
|
612
665
|
}
|
|
666
|
+
|
|
667
|
+
return Option.some(receipt.txEffect);
|
|
613
668
|
}
|
|
614
669
|
|
|
615
|
-
public
|
|
670
|
+
public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
|
|
616
671
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
617
672
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
618
673
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
619
674
|
}
|
|
620
|
-
this.
|
|
621
|
-
return Promise.resolve();
|
|
675
|
+
this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
|
|
622
676
|
}
|
|
623
677
|
|
|
624
|
-
public async
|
|
678
|
+
public async getCapsule(
|
|
679
|
+
contractAddress: AztecAddress,
|
|
680
|
+
slot: Fr,
|
|
681
|
+
tSize: number,
|
|
682
|
+
scope: AztecAddress,
|
|
683
|
+
): Promise<Option<Fr[]>> {
|
|
625
684
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
626
685
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
627
686
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
628
687
|
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
this.capsules.find(c => c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot))?.data ??
|
|
632
|
-
(await this.capsuleStore.loadCapsule(this.contractAddress, slot, this.jobId))
|
|
633
|
-
);
|
|
688
|
+
const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
|
|
689
|
+
return values ? Option.some(values) : Option.none(new Array(tSize).fill(Fr.ZERO));
|
|
634
690
|
}
|
|
635
691
|
|
|
636
|
-
public deleteCapsule(contractAddress: AztecAddress, slot: Fr):
|
|
692
|
+
public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
|
|
637
693
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
638
694
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
639
695
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
640
696
|
}
|
|
641
|
-
this.
|
|
642
|
-
return Promise.resolve();
|
|
697
|
+
this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
|
|
643
698
|
}
|
|
644
699
|
|
|
645
|
-
public copyCapsule(
|
|
700
|
+
public copyCapsule(
|
|
701
|
+
contractAddress: AztecAddress,
|
|
702
|
+
srcSlot: Fr,
|
|
703
|
+
dstSlot: Fr,
|
|
704
|
+
numEntries: number,
|
|
705
|
+
scope: AztecAddress,
|
|
706
|
+
): Promise<void> {
|
|
646
707
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
647
708
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
648
709
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
649
710
|
}
|
|
650
|
-
return this.
|
|
711
|
+
return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* Clears cached sync state for a contract for a set of scopes, forcing re-sync on the next query so that newly
|
|
716
|
+
* stored notes or events are discovered.
|
|
717
|
+
*/
|
|
718
|
+
public setContractSyncCacheInvalid(contractAddress: AztecAddress, scopes: BoundedVec<AztecAddress>): void {
|
|
719
|
+
if (!contractAddress.equals(this.contractAddress)) {
|
|
720
|
+
throw new Error(`Contract ${this.contractAddress} cannot invalidate sync cache of ${contractAddress}`);
|
|
721
|
+
}
|
|
722
|
+
this.contractSyncService.invalidateContractForScopes(contractAddress, scopes.data);
|
|
651
723
|
}
|
|
652
724
|
|
|
653
725
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
654
|
-
public
|
|
655
|
-
|
|
656
|
-
|
|
726
|
+
public async decryptAes128(
|
|
727
|
+
ciphertext: BoundedVec<number>,
|
|
728
|
+
iv: Buffer,
|
|
729
|
+
symKey: Buffer,
|
|
730
|
+
): Promise<Option<BoundedVec<number>>> {
|
|
731
|
+
const capacity = ciphertext.maxLength;
|
|
732
|
+
try {
|
|
733
|
+
const aes128 = new Aes128();
|
|
734
|
+
const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
|
|
735
|
+
return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
|
|
736
|
+
} catch {
|
|
737
|
+
return Option.none(BoundedVec.empty<number>({ maxLength: capacity }));
|
|
738
|
+
}
|
|
657
739
|
}
|
|
658
740
|
|
|
659
741
|
/**
|
|
660
|
-
* Retrieves
|
|
661
|
-
* @param address - The address
|
|
662
|
-
* @param
|
|
663
|
-
* @
|
|
742
|
+
* Retrieves app-siloed shared secrets for multiple ephemeral public keys stored in an ephemeral array.
|
|
743
|
+
* @param address - The recipient address.
|
|
744
|
+
* @param ephPks - Ephemeral array containing the serialized Points.
|
|
745
|
+
* @param contractAddress - The contract address for app-siloing (validated against execution context).
|
|
746
|
+
* @returns A new ephemeral array containing the computed shared secrets.
|
|
664
747
|
*/
|
|
665
|
-
public async
|
|
666
|
-
|
|
748
|
+
public async getSharedSecrets(
|
|
749
|
+
address: AztecAddress,
|
|
750
|
+
ephPks: EphemeralArray<Point>,
|
|
751
|
+
contractAddress: AztecAddress,
|
|
752
|
+
): Promise<EphemeralArray<Fr>> {
|
|
753
|
+
if (!contractAddress.equals(this.contractAddress)) {
|
|
754
|
+
throw new Error(
|
|
755
|
+
`getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
|
|
756
|
+
);
|
|
757
|
+
}
|
|
667
758
|
const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
|
|
668
|
-
const
|
|
669
|
-
|
|
670
|
-
);
|
|
759
|
+
const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
|
|
760
|
+
const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
671
761
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
672
|
-
|
|
762
|
+
|
|
763
|
+
const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
|
|
764
|
+
const secrets = await Promise.all(
|
|
765
|
+
ephPkPoints.map(ephPk => deriveAppSiloedSharedSecret(addressSecret, ephPk, this.contractAddress)),
|
|
766
|
+
);
|
|
767
|
+
|
|
768
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
public pushEphemeral(slot: Fr, elements: Fr[]): number {
|
|
772
|
+
return this.ephemeralArrayService.push(slot, elements);
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
public popEphemeral(slot: Fr): Fr[] {
|
|
776
|
+
return this.ephemeralArrayService.pop(slot);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
public getEphemeral(slot: Fr, index: number): Fr[] {
|
|
780
|
+
return this.ephemeralArrayService.get(slot, index);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
public setEphemeral(slot: Fr, index: number, elements: Fr[]): void {
|
|
784
|
+
this.ephemeralArrayService.set(slot, index, elements);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
public getEphemeralLen(slot: Fr): number {
|
|
788
|
+
return this.ephemeralArrayService.len(slot);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
public removeEphemeral(slot: Fr, index: number): void {
|
|
792
|
+
this.ephemeralArrayService.remove(slot, index);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
public clearEphemeral(slot: Fr): void {
|
|
796
|
+
this.ephemeralArrayService.clear(slot);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
800
|
+
this.offchainEffects.push({ data, contractAddress: this.contractAddress });
|
|
801
|
+
return Promise.resolve();
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/** Executes another utility function from within this one and returns its serialized return values. */
|
|
805
|
+
public async callUtilityFunction(
|
|
806
|
+
targetContractAddress: AztecAddress,
|
|
807
|
+
functionSelector: FunctionSelector,
|
|
808
|
+
args: Fr[],
|
|
809
|
+
): Promise<Fr[]> {
|
|
810
|
+
const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
|
|
811
|
+
targetContractAddress,
|
|
812
|
+
functionSelector,
|
|
813
|
+
);
|
|
814
|
+
|
|
815
|
+
if (!targetContractAddress.equals(this.contractAddress)) {
|
|
816
|
+
const [callerInstance, targetInstance] = await Promise.all([
|
|
817
|
+
this.getContractInstance(this.contractAddress),
|
|
818
|
+
this.getContractInstance(targetContractAddress),
|
|
819
|
+
]);
|
|
820
|
+
const request: UtilityCallAuthorizationRequest = {
|
|
821
|
+
caller: this.contractAddress,
|
|
822
|
+
callerClassId: callerInstance.currentContractClassId,
|
|
823
|
+
target: targetContractAddress,
|
|
824
|
+
targetClassId: targetInstance.currentContractClassId,
|
|
825
|
+
functionSelector,
|
|
826
|
+
functionName: targetArtifact.name,
|
|
827
|
+
args,
|
|
828
|
+
callerContext: this.callerContext,
|
|
829
|
+
};
|
|
830
|
+
|
|
831
|
+
const response = this.hooks
|
|
832
|
+
? await this.hooks.authorizeUtilityCall(request)
|
|
833
|
+
: { authorized: false, reason: 'No execution hooks configured' };
|
|
834
|
+
|
|
835
|
+
if (!response.authorized) {
|
|
836
|
+
const reason = response.reason ? `: ${response.reason}` : '';
|
|
837
|
+
throw new Error(
|
|
838
|
+
`Cross-contract utility call denied${reason}. ${this.contractAddress} attempted to call ` +
|
|
839
|
+
`${targetContractAddress}:${functionSelector} (${targetArtifact.name}). ` +
|
|
840
|
+
`See https://docs.aztec.network/errors/11`,
|
|
841
|
+
);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
await this.contractSyncService.ensureContractSynced(
|
|
845
|
+
targetContractAddress,
|
|
846
|
+
functionSelector,
|
|
847
|
+
this.utilityExecutor,
|
|
848
|
+
this.anchorBlockHeader,
|
|
849
|
+
this.jobId,
|
|
850
|
+
this.scopes,
|
|
851
|
+
);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
this.logger.debug(
|
|
855
|
+
`Calling nested utility function ${targetContractAddress}:${functionSelector} from ${this.contractAddress}`,
|
|
856
|
+
);
|
|
857
|
+
|
|
858
|
+
const nestedOracle = new UtilityExecutionOracle({
|
|
859
|
+
contractAddress: targetContractAddress,
|
|
860
|
+
authWitnesses: this.authWitnesses,
|
|
861
|
+
capsules: this.capsules,
|
|
862
|
+
anchorBlockHeader: this.anchorBlockHeader,
|
|
863
|
+
contractStore: this.contractStore,
|
|
864
|
+
noteStore: this.noteStore,
|
|
865
|
+
keyStore: this.keyStore,
|
|
866
|
+
addressStore: this.addressStore,
|
|
867
|
+
aztecNode: this.aztecNode,
|
|
868
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
869
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
870
|
+
capsuleService: this.capsuleService,
|
|
871
|
+
privateEventStore: this.privateEventStore,
|
|
872
|
+
messageContextService: this.messageContextService,
|
|
873
|
+
contractSyncService: this.contractSyncService,
|
|
874
|
+
l2TipsStore: this.l2TipsStore,
|
|
875
|
+
jobId: this.jobId,
|
|
876
|
+
scopes: this.scopes,
|
|
877
|
+
simulator: this.simulator,
|
|
878
|
+
hooks: this.hooks,
|
|
879
|
+
utilityExecutor: this.utilityExecutor,
|
|
880
|
+
log: this.logger,
|
|
881
|
+
});
|
|
882
|
+
|
|
883
|
+
const initialWitness = toACVMWitness(0, args);
|
|
884
|
+
const acvmCallback = new Oracle(nestedOracle);
|
|
885
|
+
const acirExecutionResult = await this.simulator
|
|
886
|
+
.executeUserCircuit(initialWitness, targetArtifact, acvmCallback.toACIRCallback())
|
|
887
|
+
.catch((err: Error) => {
|
|
888
|
+
err.message = resolveAssertionMessageFromError(err, targetArtifact);
|
|
889
|
+
throw new ExecutionError(
|
|
890
|
+
err.message,
|
|
891
|
+
{ contractAddress: targetContractAddress, functionSelector },
|
|
892
|
+
extractCallStack(err, targetArtifact.debug),
|
|
893
|
+
{ cause: err },
|
|
894
|
+
);
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
/** Returns offchain effects collected during execution. */
|
|
901
|
+
public getOffchainEffects(): OffchainEffect[] {
|
|
902
|
+
return this.offchainEffects;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
/**
|
|
906
|
+
* Fetches tx effects for the given hashes in parallel, deduplicating repeated hashes so each tx is only requested
|
|
907
|
+
* once. Returns a map keyed by `TxHash.toString()`; hashes for which the node has no tx effect are omitted.
|
|
908
|
+
*/
|
|
909
|
+
async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
|
|
910
|
+
const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
|
|
911
|
+
const fetched = await Promise.all(
|
|
912
|
+
uniqueTxHashes.map(h => this.aztecNode.getTxReceipt(h, { includeTxEffect: true })),
|
|
913
|
+
);
|
|
914
|
+
return new Map(
|
|
915
|
+
uniqueTxHashes
|
|
916
|
+
.map((h, i): [string, IndexedTxEffect | undefined] => {
|
|
917
|
+
const receipt = fetched[i];
|
|
918
|
+
if (!receipt.isMined() || !receipt.txEffect) {
|
|
919
|
+
return [h.toString(), undefined];
|
|
920
|
+
}
|
|
921
|
+
return [
|
|
922
|
+
h.toString(),
|
|
923
|
+
{
|
|
924
|
+
data: receipt.txEffect,
|
|
925
|
+
l2BlockNumber: receipt.blockNumber,
|
|
926
|
+
l2BlockHash: receipt.blockHash,
|
|
927
|
+
txIndexInBlock: receipt.txIndexInBlock,
|
|
928
|
+
slotNumber: receipt.slotNumber,
|
|
929
|
+
},
|
|
930
|
+
];
|
|
931
|
+
})
|
|
932
|
+
.filter((entry): entry is [string, IndexedTxEffect] => entry[1] !== undefined),
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/** Runs a query concurrently with a validation that the block hash is not ahead of the anchor block. */
|
|
937
|
+
async #queryWithBlockHashNotAfterAnchor<T>(blockHash: BlockHash, query: () => Promise<T>): Promise<T> {
|
|
938
|
+
// Most contracts query state at the "current" block, which is the anchor. Skip the validation when we can.
|
|
939
|
+
const anchorHash = await this.anchorBlockHeader.hash();
|
|
940
|
+
if (blockHash.equals(anchorHash)) {
|
|
941
|
+
return query();
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
const [response] = await Promise.all([
|
|
945
|
+
query(),
|
|
946
|
+
(async () => {
|
|
947
|
+
const block = await this.aztecNode.getBlock(blockHash);
|
|
948
|
+
const header = block?.header;
|
|
949
|
+
if (!header) {
|
|
950
|
+
throw new Error(`Could not find block header for block hash ${blockHash}`);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
if (header.getBlockNumber() > this.anchorBlockHeader.getBlockNumber()) {
|
|
954
|
+
throw new Error(
|
|
955
|
+
`Made a node query with a reference block hash ${blockHash} with block number ${header.getBlockNumber()}, which is ahead of the anchor block number ${this.anchorBlockHeader.getBlockNumber()} (from anchor block hash ${anchorHash}).`,
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
})(),
|
|
959
|
+
]);
|
|
960
|
+
return response;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
/** The execution context of the current call. */
|
|
964
|
+
protected get callerContext(): 'private' | 'private view' | 'utility' {
|
|
965
|
+
return 'utility';
|
|
673
966
|
}
|
|
674
967
|
}
|