@aztec/pxe 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240
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 +12 -2
- package/dest/bin/check_oracle_version.d.ts.map +1 -1
- package/dest/bin/check_oracle_version.js +32 -26
- 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/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 +16 -6
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +94 -23
- package/dest/config/index.d.ts +10 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -2
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
- package/dest/contract_function_simulator/benchmarked_node.js +77 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +69 -36
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +240 -91
- 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 +18 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +45 -28
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
- package/dest/contract_function_simulator/index.d.ts +5 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +4 -1
- 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/event_validation_request.d.ts +5 -7
- 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 +9 -10
- 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 +2 -2
- 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 +2 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +5 -8
- 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 +7 -11
- 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/utility_context.d.ts +4 -10
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +70 -50
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +7 -7
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +10 -10
- package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -43
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +471 -264
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -38
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +74 -91
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +164 -110
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +156 -78
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +459 -186
- 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 +27 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +38 -0
- package/dest/contract_sync/contract_sync_service.d.ts +42 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +135 -0
- package/dest/contract_sync/helpers.d.ts +27 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/helpers.js +53 -0
- package/dest/debug/pxe_debug_utils.d.ts +19 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +22 -17
- package/dest/entrypoints/client/bundle/index.d.ts +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -0
- 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 +33 -11
- package/dest/entrypoints/client/lazy/index.d.ts +3 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +2 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +3 -3
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +34 -12
- package/dest/entrypoints/pxe_creation_options.d.ts +11 -2
- 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 +6 -2
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +5 -1
- 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 +40 -13
- package/dest/events/event_service.d.ts +17 -8
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +58 -28
- package/dest/events/private_event_filter_validator.d.ts +6 -5
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +20 -6
- 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/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +13 -10
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +132 -84
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +38 -0
- package/dest/notes/note_service.d.ts +31 -9
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +97 -77
- package/dest/notes_filter.d.ts +24 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -9
- 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/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +3 -3
- package/dest/private_kernel/hints/index.d.ts.map +1 -1
- package/dest/private_kernel/hints/index.js +2 -2
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +29 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
- package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +141 -74
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +202 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +7 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +168 -67
- package/dest/private_kernel/private_kernel_oracle.d.ts +28 -29
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +96 -2
- package/dest/pxe.d.ts +126 -59
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +257 -200
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +9 -2
- 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 +25 -10
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +143 -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 +42 -16
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +158 -102
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +50 -51
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +284 -263
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- 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 +43 -8
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +229 -111
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +16 -9
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +43 -32
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +300 -122
- package/dest/tagging/get_all_logs_by_tags.d.ts +48 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +59 -0
- package/dest/tagging/index.d.ts +7 -5
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +5 -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/recipient_sync/utils/find_highest_indexes.js +2 -2
- 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 +5 -9
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +34 -18
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
- 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 +44 -16
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +8 -7
- 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 +44 -27
- package/package.json +31 -19
- package/src/bin/check_oracle_version.ts +42 -31
- package/src/bin/index.ts +1 -0
- package/src/block_synchronizer/block_stream_source.ts +81 -0
- package/src/block_synchronizer/block_synchronizer.ts +116 -36
- package/src/config/index.ts +21 -1
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/benchmarked_node.ts +103 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +417 -156
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
- package/src/contract_function_simulator/index.ts +4 -1
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +11 -10
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -11
- package/src/contract_function_simulator/noir-structs/option.ts +69 -0
- package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
- package/src/contract_function_simulator/oracle/interfaces.ts +93 -70
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +13 -13
- package/src/contract_function_simulator/oracle/oracle.ts +567 -461
- package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +5 -71
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +213 -209
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +657 -254
- 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 +52 -0
- package/src/contract_sync/contract_sync_service.ts +189 -0
- package/src/contract_sync/helpers.ts +86 -0
- package/src/debug/pxe_debug_utils.ts +55 -18
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +26 -20
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +28 -21
- package/src/entrypoints/pxe_creation_options.ts +16 -1
- package/src/entrypoints/server/index.ts +5 -1
- package/src/entrypoints/server/utils.ts +37 -32
- package/src/events/event_service.ts +79 -39
- package/src/events/private_event_filter_validator.ts +23 -5
- 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/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +171 -141
- package/src/messages/message_context_service.ts +45 -0
- package/src/notes/note_service.ts +137 -107
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -9
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +2 -2
- package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +196 -137
- package/src/private_kernel/hints/test_utils.ts +318 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +261 -93
- package/src/private_kernel/private_kernel_oracle.ts +129 -40
- package/src/pxe.ts +467 -273
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +9 -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 +183 -29
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +194 -125
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +323 -320
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +296 -124
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +107 -21
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +366 -134
- package/src/tagging/get_all_logs_by_tags.ts +120 -0
- package/src/tagging/index.ts +6 -4
- 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 +4 -4
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +59 -21
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +47 -29
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +41 -29
- package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
- package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_node.js +0 -27
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
- package/dest/public_storage/public_storage_service.d.ts +0 -24
- package/dest/public_storage/public_storage_service.d.ts.map +0 -1
- package/dest/public_storage/public_storage_service.js +0 -26
- 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 -29
- package/dest/tree_membership/tree_membership_service.d.ts +0 -52
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -84
- package/src/contract_function_simulator/proxied_node.ts +0 -33
- package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
- package/src/public_storage/public_storage_service.ts +0 -33
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -132
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -43
- package/src/tree_membership/tree_membership_service.ts +0 -112
package/src/pxe.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
4
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
5
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
6
7
|
import { KeyStore } from '@aztec/key-store';
|
|
7
8
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
8
|
-
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
9
|
import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
|
|
10
10
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
11
11
|
import {
|
|
@@ -17,16 +17,15 @@ import {
|
|
|
17
17
|
} from '@aztec/stdlib/abi';
|
|
18
18
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
19
19
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
|
+
import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
20
21
|
import {
|
|
21
22
|
CompleteAddress,
|
|
22
|
-
type ContractClassWithId,
|
|
23
23
|
type ContractInstanceWithAddress,
|
|
24
24
|
type PartialAddress,
|
|
25
25
|
computeContractAddressFromInstance,
|
|
26
26
|
getContractClassFromArtifact,
|
|
27
27
|
} from '@aztec/stdlib/contract';
|
|
28
28
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
29
|
-
import { computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
|
|
30
29
|
import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
|
|
31
30
|
import type {
|
|
32
31
|
PrivateExecutionStep,
|
|
@@ -34,6 +33,7 @@ import type {
|
|
|
34
33
|
PrivateKernelTailCircuitPublicInputs,
|
|
35
34
|
} from '@aztec/stdlib/kernel';
|
|
36
35
|
import {
|
|
36
|
+
BlockHeader,
|
|
37
37
|
type ContractOverrides,
|
|
38
38
|
type InTx,
|
|
39
39
|
PrivateExecutionResult,
|
|
@@ -47,44 +47,137 @@ import {
|
|
|
47
47
|
TxProfileResult,
|
|
48
48
|
TxProvingResult,
|
|
49
49
|
TxSimulationResult,
|
|
50
|
-
|
|
50
|
+
UtilityExecutionResult,
|
|
51
51
|
} from '@aztec/stdlib/tx';
|
|
52
52
|
|
|
53
53
|
import { inspect } from 'util';
|
|
54
54
|
|
|
55
55
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
56
56
|
import type { PXEConfig } from './config/index.js';
|
|
57
|
+
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
57
58
|
import {
|
|
58
59
|
ContractFunctionSimulator,
|
|
59
60
|
generateSimulatedProvingResult,
|
|
60
61
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
61
|
-
import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
|
|
62
62
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
63
|
-
import {
|
|
63
|
+
import { displayDebugLogs } from './contract_logging.js';
|
|
64
|
+
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
65
|
+
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
64
66
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
65
67
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
66
68
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
67
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
68
72
|
import {
|
|
69
73
|
PrivateKernelExecutionProver,
|
|
70
74
|
type PrivateKernelExecutionProverConfig,
|
|
71
75
|
} from './private_kernel/private_kernel_execution_prover.js';
|
|
72
|
-
import {
|
|
76
|
+
import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
|
|
73
77
|
import { AddressStore } from './storage/address_store/address_store.js';
|
|
74
78
|
import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
|
|
75
79
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
76
80
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
77
81
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
82
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
78
83
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
79
84
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
80
85
|
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
81
86
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
87
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
82
88
|
|
|
83
89
|
export type PackedPrivateEvent = InTx & {
|
|
84
90
|
packedEvent: Fr[];
|
|
85
91
|
eventSelector: EventSelector;
|
|
86
92
|
};
|
|
87
93
|
|
|
94
|
+
/** Options for PXE.proveTx. */
|
|
95
|
+
export type ProveTxOpts = {
|
|
96
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
97
|
+
scopes: AztecAddress[];
|
|
98
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
99
|
+
senderForTags?: AztecAddress;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/** Options for PXE.profileTx. */
|
|
103
|
+
export type ProfileTxOpts = {
|
|
104
|
+
/** The profiling mode to use. */
|
|
105
|
+
profileMode: 'full' | 'execution-steps' | 'gates';
|
|
106
|
+
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
107
|
+
skipProofGeneration?: boolean;
|
|
108
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
109
|
+
scopes: AztecAddress[];
|
|
110
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
111
|
+
senderForTags?: AztecAddress;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** Options for PXE.simulateTx. */
|
|
115
|
+
export type SimulateTxOpts = {
|
|
116
|
+
/** Whether to simulate the public part of the transaction. */
|
|
117
|
+
simulatePublic: boolean;
|
|
118
|
+
/** If false, this function throws if the transaction is unable to be included in a block at the current state. */
|
|
119
|
+
skipTxValidation?: boolean;
|
|
120
|
+
/** If false, fees are enforced. */
|
|
121
|
+
skipFeeEnforcement?: boolean;
|
|
122
|
+
/** If true, kernel logic is emulated in TS for simulation */
|
|
123
|
+
skipKernels?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Pre-simulation overrides applied to the ephemeral fork and contract DB. Bundles publicStorage
|
|
126
|
+
* writes (no skipKernels required) and per-address (instance, artifact?) overrides used by both
|
|
127
|
+
* AVM-side public dispatch and PXE-side ACIR private dispatch (requires skipKernels: true).
|
|
128
|
+
*/
|
|
129
|
+
overrides?: SimulationOverrides;
|
|
130
|
+
/** Addresses whose private state and keys are accessible during private execution */
|
|
131
|
+
scopes: AztecAddress[];
|
|
132
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
133
|
+
senderForTags?: AztecAddress;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/** Options for PXE.executeUtility. */
|
|
137
|
+
export type ExecuteUtilityOpts = {
|
|
138
|
+
/** The authentication witnesses required for the function call. */
|
|
139
|
+
authwits?: AuthWitness[];
|
|
140
|
+
/** The accounts whose notes we can access in this call */
|
|
141
|
+
scopes: AztecAddress[];
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Supplies the set of "nice to have" contracts that every PXE preloads regardless of which wallet
|
|
146
|
+
* drives it. Today this is just the standard multi-call entrypoint: the SDK's self-paid account
|
|
147
|
+
* deploy flow ({@link DeployAccountMethod} with `from = NO_FROM`) routes its payload through it, so a
|
|
148
|
+
* PXE that did not register it would fail contract sync with an opaque "no contract instance" error.
|
|
149
|
+
*
|
|
150
|
+
* Returning a list keeps this extensible: a wallet may supply its own provider that preloads
|
|
151
|
+
* additional contracts. Injected the same way as {@link ProtocolContractsProvider} so the PXE never
|
|
152
|
+
* statically imports the bundled artifacts, keeping the bundle/lazy split intact.
|
|
153
|
+
*/
|
|
154
|
+
export type PreloadedContractsProvider = {
|
|
155
|
+
/** Returns the contract instances and artifacts the PXE should preload on startup. */
|
|
156
|
+
getPreloadedContracts: () => Promise<Array<{ instance: ContractInstanceWithAddress; artifact: ContractArtifact }>>;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/** Args for PXE.create. */
|
|
160
|
+
export type PXECreateArgs = {
|
|
161
|
+
/** The Aztec node to connect to. */
|
|
162
|
+
node: AztecNode;
|
|
163
|
+
/** The key-value store for persisting PXE state. */
|
|
164
|
+
store: AztecAsyncKVStore;
|
|
165
|
+
/** The prover for generating private kernel proofs. */
|
|
166
|
+
proofCreator: PrivateKernelProver;
|
|
167
|
+
/** The circuit simulator for executing ACIR circuits. */
|
|
168
|
+
simulator: CircuitSimulator;
|
|
169
|
+
/** Provider for protocol contract artifacts and instances. */
|
|
170
|
+
protocolContractsProvider: ProtocolContractsProvider;
|
|
171
|
+
/** Provider for the "nice to have" contracts the PXE preloads. */
|
|
172
|
+
preloadedContractsProvider: PreloadedContractsProvider;
|
|
173
|
+
/** PXE configuration options. */
|
|
174
|
+
config: PXEConfig;
|
|
175
|
+
/** Optional logger instance or string suffix for the logger name. */
|
|
176
|
+
loggerOrSuffix?: string | Logger;
|
|
177
|
+
/** Optional hooks to observe and influence contract execution. */
|
|
178
|
+
hooks?: ExecutionHooks;
|
|
179
|
+
};
|
|
180
|
+
|
|
88
181
|
/**
|
|
89
182
|
* Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
|
|
90
183
|
* manage private state of users.
|
|
@@ -92,6 +185,7 @@ export type PackedPrivateEvent = InTx & {
|
|
|
92
185
|
export class PXE {
|
|
93
186
|
private constructor(
|
|
94
187
|
private node: AztecNode,
|
|
188
|
+
private db: AztecAsyncKVStore,
|
|
95
189
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
96
190
|
private keyStore: KeyStore,
|
|
97
191
|
private contractStore: ContractStore,
|
|
@@ -103,14 +197,20 @@ export class PXE {
|
|
|
103
197
|
private recipientTaggingStore: RecipientTaggingStore,
|
|
104
198
|
private addressStore: AddressStore,
|
|
105
199
|
private privateEventStore: PrivateEventStore,
|
|
200
|
+
private contractSyncService: ContractSyncService,
|
|
201
|
+
private messageContextService: MessageContextService,
|
|
202
|
+
private l2TipsStore: L2TipsProvider,
|
|
106
203
|
private simulator: CircuitSimulator,
|
|
107
204
|
private proverEnabled: boolean,
|
|
205
|
+
private autoSync: boolean,
|
|
108
206
|
private proofCreator: PrivateKernelProver,
|
|
109
207
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
208
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
110
209
|
private log: Logger,
|
|
111
210
|
private jobQueue: SerialQueue,
|
|
112
211
|
private jobCoordinator: JobCoordinator,
|
|
113
212
|
public debug: PXEDebugUtils,
|
|
213
|
+
private hooks: ExecutionHooks | undefined,
|
|
114
214
|
) {}
|
|
115
215
|
|
|
116
216
|
/**
|
|
@@ -120,50 +220,87 @@ export class PXE {
|
|
|
120
220
|
*
|
|
121
221
|
* @returns A promise that resolves PXE is ready to be used.
|
|
122
222
|
*/
|
|
123
|
-
public static async create(
|
|
124
|
-
node
|
|
125
|
-
store
|
|
126
|
-
proofCreator
|
|
127
|
-
simulator
|
|
128
|
-
protocolContractsProvider
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
223
|
+
public static async create({
|
|
224
|
+
node,
|
|
225
|
+
store,
|
|
226
|
+
proofCreator,
|
|
227
|
+
simulator,
|
|
228
|
+
protocolContractsProvider,
|
|
229
|
+
preloadedContractsProvider,
|
|
230
|
+
config,
|
|
231
|
+
loggerOrSuffix,
|
|
232
|
+
hooks,
|
|
233
|
+
}: PXECreateArgs) {
|
|
234
|
+
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
235
|
+
const bindings: LoggerBindings | undefined =
|
|
236
|
+
loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
237
|
+
|
|
132
238
|
const log =
|
|
133
239
|
!loggerOrSuffix || typeof loggerOrSuffix === 'string'
|
|
134
240
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
135
241
|
: loggerOrSuffix;
|
|
136
242
|
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const
|
|
243
|
+
const info = await node.getNodeInfo();
|
|
244
|
+
|
|
245
|
+
// Source the genesis block hash from the node so PXE's L2BlockStream agrees with the node's
|
|
246
|
+
// archiver on the dynamic initial header hash. Without this the tip store would fall back to
|
|
247
|
+
// the static `GENESIS_BLOCK_HEADER_HASH` constant, which only matches deployments with the
|
|
248
|
+
// default empty genesis (timestamp 0, no prefilled public data) and diverges otherwise — the
|
|
249
|
+
// sync at block 0 would then get stuck in `areBlockHashesEqualAt` and abort. If the node does
|
|
250
|
+
// not return a genesis block (older node or test fixture) we fall back to the static constant.
|
|
251
|
+
const initialBlockHash = (await node.getBlock(BlockNumber.ZERO))?.hash ?? GENESIS_BLOCK_HEADER_HASH;
|
|
252
|
+
|
|
253
|
+
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
254
|
+
const {
|
|
255
|
+
addressStore,
|
|
256
|
+
privateEventStore,
|
|
257
|
+
contractStore,
|
|
258
|
+
noteStore,
|
|
259
|
+
anchorBlockStore,
|
|
260
|
+
senderTaggingStore,
|
|
261
|
+
senderAddressBookStore,
|
|
262
|
+
recipientTaggingStore,
|
|
263
|
+
capsuleStore,
|
|
264
|
+
keyStore,
|
|
265
|
+
l2TipsStore,
|
|
266
|
+
} = openPxeStores(store, initialBlockHash);
|
|
267
|
+
const contractSyncService = new ContractSyncService(
|
|
268
|
+
node,
|
|
269
|
+
contractStore,
|
|
270
|
+
noteStore,
|
|
271
|
+
createLogger('pxe:contract_sync', bindings),
|
|
272
|
+
);
|
|
273
|
+
const messageContextService = new MessageContextService(node);
|
|
274
|
+
|
|
149
275
|
const synchronizer = new BlockSynchronizer(
|
|
150
276
|
node,
|
|
277
|
+
store,
|
|
151
278
|
anchorBlockStore,
|
|
152
279
|
noteStore,
|
|
153
280
|
privateEventStore,
|
|
154
|
-
|
|
281
|
+
l2TipsStore,
|
|
282
|
+
contractSyncService,
|
|
155
283
|
config,
|
|
156
|
-
|
|
284
|
+
bindings,
|
|
157
285
|
);
|
|
158
286
|
|
|
159
|
-
const jobCoordinator = new JobCoordinator(store);
|
|
287
|
+
const jobCoordinator = new JobCoordinator(store, bindings);
|
|
288
|
+
jobCoordinator.registerStores([
|
|
289
|
+
capsuleStore,
|
|
290
|
+
senderTaggingStore,
|
|
291
|
+
recipientTaggingStore,
|
|
292
|
+
privateEventStore,
|
|
293
|
+
noteStore,
|
|
294
|
+
contractSyncService,
|
|
295
|
+
]);
|
|
160
296
|
|
|
161
|
-
const debugUtils = new PXEDebugUtils(
|
|
297
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
162
298
|
|
|
163
299
|
const jobQueue = new SerialQueue();
|
|
164
300
|
|
|
165
301
|
const pxe = new PXE(
|
|
166
302
|
node,
|
|
303
|
+
store,
|
|
167
304
|
synchronizer,
|
|
168
305
|
keyStore,
|
|
169
306
|
contractStore,
|
|
@@ -175,22 +312,31 @@ export class PXE {
|
|
|
175
312
|
recipientTaggingStore,
|
|
176
313
|
addressStore,
|
|
177
314
|
privateEventStore,
|
|
315
|
+
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
178
318
|
simulator,
|
|
179
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
180
321
|
proofCreator,
|
|
181
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
182
324
|
log,
|
|
183
325
|
jobQueue,
|
|
184
326
|
jobCoordinator,
|
|
185
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
186
329
|
);
|
|
187
330
|
|
|
188
|
-
debugUtils.
|
|
331
|
+
debugUtils.setPXEHelpers(
|
|
332
|
+
pxe.#putInJobQueue.bind(pxe),
|
|
333
|
+
pxe.#getSimulatorForTx.bind(pxe),
|
|
334
|
+
pxe.#executeUtility.bind(pxe),
|
|
335
|
+
);
|
|
189
336
|
|
|
190
337
|
pxe.jobQueue.start();
|
|
191
338
|
|
|
192
|
-
await pxe.#registerProtocolContracts();
|
|
193
|
-
const info = await node.getNodeInfo();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
194
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
195
341
|
return pxe;
|
|
196
342
|
}
|
|
@@ -200,20 +346,23 @@ export class PXE {
|
|
|
200
346
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
201
347
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
202
348
|
|
|
203
|
-
return new ContractFunctionSimulator(
|
|
204
|
-
proxyContractStore,
|
|
205
|
-
this.noteStore,
|
|
206
|
-
this.keyStore,
|
|
207
|
-
this.addressStore,
|
|
208
|
-
|
|
209
|
-
this.
|
|
210
|
-
this.senderTaggingStore,
|
|
211
|
-
this.recipientTaggingStore,
|
|
212
|
-
this.senderAddressBookStore,
|
|
213
|
-
this.capsuleStore,
|
|
214
|
-
this.privateEventStore,
|
|
215
|
-
this.simulator,
|
|
216
|
-
|
|
349
|
+
return new ContractFunctionSimulator({
|
|
350
|
+
contractStore: proxyContractStore,
|
|
351
|
+
noteStore: this.noteStore,
|
|
352
|
+
keyStore: this.keyStore,
|
|
353
|
+
addressStore: this.addressStore,
|
|
354
|
+
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
355
|
+
l2TipsStore: this.l2TipsStore,
|
|
356
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
357
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
358
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
359
|
+
capsuleStore: this.capsuleStore,
|
|
360
|
+
privateEventStore: this.privateEventStore,
|
|
361
|
+
simulator: this.simulator,
|
|
362
|
+
contractSyncService: this.contractSyncService,
|
|
363
|
+
messageContextService: this.messageContextService,
|
|
364
|
+
hooks: this.hooks,
|
|
365
|
+
});
|
|
217
366
|
}
|
|
218
367
|
|
|
219
368
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
@@ -263,55 +412,66 @@ export class PXE {
|
|
|
263
412
|
}
|
|
264
413
|
|
|
265
414
|
async #registerProtocolContracts() {
|
|
266
|
-
const registered
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
415
|
+
const registered = Object.fromEntries(
|
|
416
|
+
await Promise.all(
|
|
417
|
+
protocolContractNames.map(async name => {
|
|
418
|
+
const { address, instance, artifact } =
|
|
419
|
+
await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
420
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
421
|
+
await this.contractStore.addContractInstance(instance);
|
|
422
|
+
return [name, address.toString()] as const;
|
|
423
|
+
}),
|
|
424
|
+
),
|
|
425
|
+
);
|
|
274
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
275
427
|
}
|
|
276
428
|
|
|
277
|
-
async #
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
async #isContractInitialized(address: AztecAddress): Promise<boolean> {
|
|
286
|
-
const initNullifier = await siloNullifier(address, address.toField());
|
|
287
|
-
return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
|
|
429
|
+
async #registerPreloadedContracts() {
|
|
430
|
+
const contracts = await this.preloadedContractsProvider.getPreloadedContracts();
|
|
431
|
+
await Promise.all(contracts.map(({ instance, artifact }) => this.registerContract({ instance, artifact })));
|
|
432
|
+
this.log.verbose(`Registered preloaded contracts in pxe`, {
|
|
433
|
+
contracts: contracts.map(({ instance }) => instance.address.toString()),
|
|
434
|
+
});
|
|
288
435
|
}
|
|
289
436
|
|
|
290
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
291
438
|
// functions that might arise.
|
|
292
|
-
async #executePrivate(
|
|
293
|
-
contractFunctionSimulator
|
|
294
|
-
txRequest
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
439
|
+
async #executePrivate({
|
|
440
|
+
contractFunctionSimulator,
|
|
441
|
+
txRequest,
|
|
442
|
+
anchorBlockHeader,
|
|
443
|
+
scopes,
|
|
444
|
+
jobId,
|
|
445
|
+
senderForTags,
|
|
446
|
+
}: {
|
|
447
|
+
contractFunctionSimulator: ContractFunctionSimulator;
|
|
448
|
+
txRequest: TxExecutionRequest;
|
|
449
|
+
anchorBlockHeader: BlockHeader;
|
|
450
|
+
scopes: AztecAddress[];
|
|
451
|
+
jobId: string;
|
|
452
|
+
senderForTags?: AztecAddress;
|
|
453
|
+
}): Promise<PrivateExecutionResult> {
|
|
298
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
299
455
|
|
|
300
456
|
try {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const result = await contractFunctionSimulator.run(
|
|
304
|
-
txRequest,
|
|
457
|
+
await this.contractSyncService.ensureContractSynced(
|
|
305
458
|
contractAddress,
|
|
306
459
|
functionSelector,
|
|
307
|
-
|
|
460
|
+
(privateSyncCall, execScopes) =>
|
|
461
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
308
462
|
anchorBlockHeader,
|
|
309
|
-
// The sender for tags is set by contracts, typically by an account
|
|
310
|
-
// contract entrypoint
|
|
311
|
-
undefined, // senderForTags
|
|
312
|
-
scopes,
|
|
313
463
|
jobId,
|
|
464
|
+
scopes,
|
|
314
465
|
);
|
|
466
|
+
|
|
467
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
468
|
+
contractAddress,
|
|
469
|
+
selector: functionSelector,
|
|
470
|
+
anchorBlockHeader,
|
|
471
|
+
scopes,
|
|
472
|
+
jobId,
|
|
473
|
+
senderForTags,
|
|
474
|
+
});
|
|
315
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
316
476
|
return result;
|
|
317
477
|
} catch (err) {
|
|
@@ -323,25 +483,32 @@ export class PXE {
|
|
|
323
483
|
}
|
|
324
484
|
|
|
325
485
|
/**
|
|
326
|
-
*
|
|
486
|
+
* Execute a utility function call on the given contract.
|
|
327
487
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
328
488
|
* @param call - The function call to execute.
|
|
329
489
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
330
490
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
331
491
|
* accounts if not specified.
|
|
332
492
|
* @param jobId - The job ID for staged writes.
|
|
333
|
-
* @returns The
|
|
493
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
334
494
|
*/
|
|
335
|
-
async #
|
|
495
|
+
async #executeUtility(
|
|
336
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
337
497
|
call: FunctionCall,
|
|
338
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
339
|
-
scopes: AztecAddress[]
|
|
499
|
+
scopes: AztecAddress[],
|
|
340
500
|
jobId: string,
|
|
341
501
|
) {
|
|
342
502
|
try {
|
|
343
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
344
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
345
512
|
} catch (err) {
|
|
346
513
|
if (err instanceof SimulationError) {
|
|
347
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -356,11 +523,11 @@ export class PXE {
|
|
|
356
523
|
* It can also be used for estimating gas in the future.
|
|
357
524
|
* @param tx - The transaction to be simulated.
|
|
358
525
|
*/
|
|
359
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
360
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
361
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
362
529
|
try {
|
|
363
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
364
531
|
if (result.revertReason) {
|
|
365
532
|
throw result.revertReason;
|
|
366
533
|
}
|
|
@@ -392,87 +559,68 @@ export class PXE {
|
|
|
392
559
|
txExecutionRequest: TxExecutionRequest,
|
|
393
560
|
proofCreator: PrivateKernelProver,
|
|
394
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
395
563
|
config: PrivateKernelExecutionProverConfig,
|
|
396
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
397
|
-
const
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
this.
|
|
402
|
-
|
|
565
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
566
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
567
|
+
kernelOracle,
|
|
568
|
+
proofCreator,
|
|
569
|
+
!this.proverEnabled,
|
|
570
|
+
this.log.getBindings(),
|
|
403
571
|
);
|
|
404
|
-
const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
|
|
405
572
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
406
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
407
574
|
}
|
|
408
575
|
|
|
576
|
+
/**
|
|
577
|
+
* Syncs with the node only when `autoSync` is enabled.
|
|
578
|
+
* When `autoSync` is disabled, callers (typically a wallet) are
|
|
579
|
+
* responsible for invoking `pxe.sync()` at the right granularity.
|
|
580
|
+
*/
|
|
581
|
+
async #maybeSync(): Promise<void> {
|
|
582
|
+
if (this.autoSync) {
|
|
583
|
+
await this.blockStateSynchronizer.sync();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
409
587
|
// Public API
|
|
410
588
|
|
|
411
|
-
|
|
412
|
-
|
|
589
|
+
/**
|
|
590
|
+
* Triggers a sync of PXE state with the node, regardless of the `autoSync` config flag. Use this to
|
|
591
|
+
* batch syncs across composite flows when `autoSync` is disabled (e.g. one sync per simulate+send
|
|
592
|
+
* instead of one per inner PXE call). Serialized through the job queue.
|
|
593
|
+
*/
|
|
594
|
+
public sync(): Promise<void> {
|
|
595
|
+
return this.#putInJobQueue(() => this.blockStateSynchronizer.sync());
|
|
413
596
|
}
|
|
414
597
|
|
|
415
598
|
/**
|
|
416
|
-
* Returns the
|
|
417
|
-
* The
|
|
418
|
-
* @remark - it queries the node to check whether the contract class with the given id has been publicly registered.
|
|
419
|
-
* @param id - Identifier of the class.
|
|
420
|
-
* @param includeArtifact - Identifier of the class.
|
|
421
|
-
* @returns - It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
|
|
422
|
-
* for `includeArtifact`
|
|
423
|
-
* TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
|
|
424
|
-
* should the pxe query the node for contract public info, and merge it with its own definitions?
|
|
425
|
-
* TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
|
|
426
|
-
* during a public deployment. We probably want a nicer and more general API for this, but it'll have to
|
|
427
|
-
* do for the time being.
|
|
599
|
+
* Returns the block header up to which the PXE has synced.
|
|
600
|
+
* @returns The synced block header
|
|
428
601
|
*/
|
|
429
|
-
public
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
isContractClassPubliclyRegistered: boolean;
|
|
435
|
-
artifact: ContractArtifact | undefined;
|
|
436
|
-
}> {
|
|
437
|
-
const artifact = await this.contractStore.getContractArtifact(id);
|
|
438
|
-
if (!artifact) {
|
|
439
|
-
this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
|
|
440
|
-
}
|
|
602
|
+
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
603
|
+
return this.#putInJobQueue(() => {
|
|
604
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
605
|
+
});
|
|
606
|
+
}
|
|
441
607
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
608
|
+
/**
|
|
609
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
610
|
+
* @param address - The contract address.
|
|
611
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
612
|
+
*/
|
|
613
|
+
public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
614
|
+
return this.contractStore.getContractInstance(address);
|
|
447
615
|
}
|
|
448
616
|
|
|
449
617
|
/**
|
|
450
|
-
* Returns the contract
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
* and whether the contract instance with the given address has been publicly deployed.
|
|
454
|
-
* @remark - it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
|
|
455
|
-
* This query is not dependent on the PXE.
|
|
456
|
-
* @param address - The address that the contract instance resides at.
|
|
457
|
-
* @returns - It returns the contract metadata
|
|
458
|
-
* TODO(@spalladino): Should we return the public keys in plain as well here?
|
|
618
|
+
* Returns the contract artifact for a given contract class id, if it's registered in the PXE.
|
|
619
|
+
* @param id - Identifier of the contract class.
|
|
620
|
+
* @returns The contract artifact if found, undefined otherwise.
|
|
459
621
|
*/
|
|
460
|
-
public async
|
|
461
|
-
|
|
462
|
-
isContractInitialized: boolean;
|
|
463
|
-
isContractPublished: boolean;
|
|
464
|
-
}> {
|
|
465
|
-
let instance;
|
|
466
|
-
try {
|
|
467
|
-
instance = await this.contractStore.getContractInstance(address);
|
|
468
|
-
} catch {
|
|
469
|
-
this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
|
|
470
|
-
}
|
|
471
|
-
return {
|
|
472
|
-
contractInstance: instance,
|
|
473
|
-
isContractInitialized: await this.#isContractInitialized(address),
|
|
474
|
-
isContractPublished: await this.#isContractPublished(address),
|
|
475
|
-
};
|
|
622
|
+
public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
|
|
623
|
+
return await this.contractStore.getContractArtifact(id);
|
|
476
624
|
}
|
|
477
625
|
|
|
478
626
|
/**
|
|
@@ -488,7 +636,7 @@ export class PXE {
|
|
|
488
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
489
637
|
const accounts = await this.keyStore.getAccounts();
|
|
490
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
491
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
492
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
493
641
|
return accountCompleteAddress;
|
|
494
642
|
} else {
|
|
@@ -497,7 +645,6 @@ export class PXE {
|
|
|
497
645
|
}
|
|
498
646
|
|
|
499
647
|
await this.addressStore.addCompleteAddress(accountCompleteAddress);
|
|
500
|
-
await this.noteStore.addScope(accountCompleteAddress.address);
|
|
501
648
|
return accountCompleteAddress;
|
|
502
649
|
}
|
|
503
650
|
|
|
@@ -512,8 +659,14 @@ export class PXE {
|
|
|
512
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
513
660
|
*/
|
|
514
661
|
public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
|
|
662
|
+
if (!(await sender.isValid())) {
|
|
663
|
+
throw new Error(
|
|
664
|
+
`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
|
|
515
668
|
const accounts = await this.keyStore.getAccounts();
|
|
516
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
517
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
518
671
|
return sender;
|
|
519
672
|
}
|
|
@@ -522,6 +675,9 @@ export class PXE {
|
|
|
522
675
|
|
|
523
676
|
if (wasAdded) {
|
|
524
677
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
678
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
679
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
680
|
+
await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
|
|
525
681
|
} else {
|
|
526
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
527
683
|
}
|
|
@@ -571,8 +727,7 @@ export class PXE {
|
|
|
571
727
|
* @param artifact - The build artifact for the contract class.
|
|
572
728
|
*/
|
|
573
729
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
574
|
-
const
|
|
575
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
730
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
576
731
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
577
732
|
}
|
|
578
733
|
|
|
@@ -591,22 +746,24 @@ export class PXE {
|
|
|
591
746
|
if (artifact) {
|
|
592
747
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
593
748
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
594
|
-
|
|
595
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
749
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
596
750
|
throw new Error(
|
|
597
|
-
`Artifact does not match expected class id (computed ${
|
|
751
|
+
`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
|
|
598
752
|
);
|
|
599
753
|
}
|
|
600
754
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
601
755
|
if (!computedAddress.equals(instance.address)) {
|
|
602
756
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
603
757
|
}
|
|
604
|
-
|
|
758
|
+
|
|
759
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
605
760
|
|
|
606
761
|
const publicFunctionSignatures = artifact.functions
|
|
607
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
608
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
609
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
610
767
|
} else {
|
|
611
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
612
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -641,30 +798,27 @@ export class PXE {
|
|
|
641
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
642
799
|
}
|
|
643
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
644
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
645
802
|
|
|
646
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
647
804
|
|
|
648
|
-
const currentClassId = await readCurrentClassId(
|
|
649
|
-
contractAddress,
|
|
650
|
-
currentInstance,
|
|
651
|
-
this.node,
|
|
652
|
-
header.globalVariables.blockNumber,
|
|
653
|
-
header.globalVariables.timestamp,
|
|
654
|
-
);
|
|
805
|
+
const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
|
|
655
806
|
if (!contractClass.id.equals(currentClassId)) {
|
|
656
807
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
657
808
|
}
|
|
658
809
|
|
|
659
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
660
|
-
|
|
661
810
|
const publicFunctionSignatures = artifact.functions
|
|
662
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
663
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
664
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
665
816
|
|
|
666
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
667
|
-
await
|
|
818
|
+
await Promise.all([
|
|
819
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
820
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
821
|
+
]);
|
|
668
822
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
669
823
|
});
|
|
670
824
|
}
|
|
@@ -682,11 +836,12 @@ export class PXE {
|
|
|
682
836
|
* (where validators prove the public portion).
|
|
683
837
|
*
|
|
684
838
|
* @param txRequest - An authenticated tx request ready for proving
|
|
839
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
685
840
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
686
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
687
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
688
843
|
*/
|
|
689
|
-
public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
690
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
691
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
692
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -694,17 +849,25 @@ export class PXE {
|
|
|
694
849
|
const totalTimer = new Timer();
|
|
695
850
|
try {
|
|
696
851
|
const syncTimer = new Timer();
|
|
697
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
698
854
|
const syncTime = syncTimer.ms();
|
|
699
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
700
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
701
864
|
|
|
702
865
|
const {
|
|
703
866
|
publicInputs,
|
|
704
867
|
chonkProof,
|
|
705
868
|
executionSteps,
|
|
706
869
|
timings: { proving } = {},
|
|
707
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
708
871
|
simulate: false,
|
|
709
872
|
skipFeeEnforcement: false,
|
|
710
873
|
profileMode: 'none',
|
|
@@ -734,23 +897,20 @@ export class PXE {
|
|
|
734
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
735
898
|
});
|
|
736
899
|
|
|
737
|
-
//
|
|
738
|
-
//
|
|
739
|
-
//
|
|
740
|
-
//
|
|
741
|
-
//
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
} else {
|
|
752
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
753
|
-
}
|
|
900
|
+
// We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
|
|
901
|
+
// (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
|
|
902
|
+
// onchain).
|
|
903
|
+
// Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
|
|
904
|
+
// may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
|
|
905
|
+
// actually used to being reduced.
|
|
906
|
+
await persistSenderTaggingIndexRangesForTx(
|
|
907
|
+
this.senderTaggingStore,
|
|
908
|
+
privateExecutionResult.entrypoint.taggingIndexRanges,
|
|
909
|
+
publicInputs,
|
|
910
|
+
() => txProvingResult.getTxHash(),
|
|
911
|
+
jobId,
|
|
912
|
+
this.log,
|
|
913
|
+
);
|
|
754
914
|
|
|
755
915
|
return txProvingResult;
|
|
756
916
|
} catch (err: any) {
|
|
@@ -761,17 +921,13 @@ export class PXE {
|
|
|
761
921
|
|
|
762
922
|
/**
|
|
763
923
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
764
|
-
*
|
|
765
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
766
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
767
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
924
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
768
925
|
* @returns A trace of the program execution with gate counts.
|
|
769
926
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
770
927
|
*/
|
|
771
928
|
public profileTx(
|
|
772
929
|
txRequest: TxExecutionRequest,
|
|
773
|
-
profileMode
|
|
774
|
-
skipProofGeneration: boolean = true,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
775
931
|
): Promise<TxProfileResult> {
|
|
776
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
777
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -790,21 +946,25 @@ export class PXE {
|
|
|
790
946
|
txInfo,
|
|
791
947
|
);
|
|
792
948
|
const syncTimer = new Timer();
|
|
793
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
794
951
|
const syncTime = syncTimer.ms();
|
|
795
952
|
|
|
796
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
797
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
798
955
|
contractFunctionSimulator,
|
|
799
956
|
txRequest,
|
|
800
|
-
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
801
959
|
jobId,
|
|
802
|
-
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
803
962
|
|
|
804
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
805
964
|
txRequest,
|
|
806
965
|
this.proofCreator,
|
|
807
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
808
968
|
{
|
|
809
969
|
simulate: skipProofGeneration,
|
|
810
970
|
skipFeeEnforcement: false,
|
|
@@ -856,12 +1016,7 @@ export class PXE {
|
|
|
856
1016
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
857
1017
|
*
|
|
858
1018
|
*
|
|
859
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
860
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
861
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
862
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
863
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
864
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
1019
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
865
1020
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
866
1021
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
867
1022
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
@@ -870,11 +1025,15 @@ export class PXE {
|
|
|
870
1025
|
*/
|
|
871
1026
|
public simulateTx(
|
|
872
1027
|
txRequest: TxExecutionRequest,
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
878
1037
|
): Promise<TxSimulationResult> {
|
|
879
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
880
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -895,39 +1054,49 @@ export class PXE {
|
|
|
895
1054
|
txInfo,
|
|
896
1055
|
);
|
|
897
1056
|
const syncTimer = new Timer();
|
|
898
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
899
1059
|
const syncTime = syncTimer.ms();
|
|
900
1060
|
|
|
1061
|
+
if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
|
|
1062
|
+
throw new Error(
|
|
1063
|
+
'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
901
1066
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
902
|
-
// Temporary: in case there are overrides, we have to skip the kernels or validations
|
|
903
|
-
// will fail. Consider handing control to the user/wallet on whether they want to run them
|
|
904
|
-
// or not.
|
|
905
|
-
const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
|
|
906
1067
|
|
|
907
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
908
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
909
1077
|
|
|
910
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
911
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
912
1080
|
|
|
913
1081
|
if (skipKernels) {
|
|
914
|
-
// According to the protocol rules, the nonce generator for the note hashes
|
|
915
|
-
// can either be the first nullifier in the tx or the protocol nullifier if there are none.
|
|
916
|
-
const nonceGenerator = privateExecutionResult.firstNullifier.equals(Fr.ZERO)
|
|
917
|
-
? await computeProtocolNullifier(await txRequest.toTxRequest().hash())
|
|
918
|
-
: privateExecutionResult.firstNullifier;
|
|
919
1082
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
920
1083
|
privateExecutionResult,
|
|
921
|
-
|
|
922
|
-
this.
|
|
1084
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
1085
|
+
this.node,
|
|
923
1086
|
));
|
|
924
1087
|
} else {
|
|
925
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
926
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
1089
|
+
({ publicInputs, executionSteps } = await this.#prove(
|
|
1090
|
+
txRequest,
|
|
1091
|
+
this.proofCreator,
|
|
1092
|
+
privateExecutionResult,
|
|
1093
|
+
anchorBlockHeader,
|
|
1094
|
+
{
|
|
1095
|
+
simulate: true,
|
|
1096
|
+
skipFeeEnforcement,
|
|
1097
|
+
profileMode: 'none',
|
|
1098
|
+
},
|
|
1099
|
+
));
|
|
931
1100
|
}
|
|
932
1101
|
|
|
933
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -936,8 +1105,11 @@ export class PXE {
|
|
|
936
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
937
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
938
1107
|
const publicSimulationTimer = new Timer();
|
|
939
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
940
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
1110
|
+
if (publicOutput?.debugLogs?.length) {
|
|
1111
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
1112
|
+
}
|
|
941
1113
|
}
|
|
942
1114
|
|
|
943
1115
|
let validationTime: number | undefined;
|
|
@@ -946,7 +1118,8 @@ export class PXE {
|
|
|
946
1118
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
947
1119
|
validationTime = validationTimer.ms();
|
|
948
1120
|
if (validationResult.result === 'invalid') {
|
|
949
|
-
|
|
1121
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
1122
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
950
1123
|
}
|
|
951
1124
|
}
|
|
952
1125
|
|
|
@@ -997,43 +1170,44 @@ export class PXE {
|
|
|
997
1170
|
inspect(txRequest),
|
|
998
1171
|
`simulatePublic=${simulatePublic}`,
|
|
999
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
1000
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1001
1174
|
);
|
|
1002
1175
|
}
|
|
1003
1176
|
});
|
|
1004
1177
|
}
|
|
1005
1178
|
|
|
1006
1179
|
/**
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1180
|
+
* Executes a contract utility function.
|
|
1009
1181
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
1010
|
-
* @param authwits - (Optional) The authentication witnesses required for the function call.
|
|
1011
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
|
|
1012
|
-
* default to all.
|
|
1013
|
-
* @returns The result of the utility function call, structured based on the function ABI.
|
|
1014
1182
|
*/
|
|
1015
|
-
public
|
|
1183
|
+
public executeUtility(
|
|
1016
1184
|
call: FunctionCall,
|
|
1017
|
-
authwits
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1185
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1186
|
+
): Promise<UtilityExecutionResult> {
|
|
1187
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1021
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
1022
|
-
// delete the same read value, or reading values that another
|
|
1189
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
1023
1190
|
return this.#putInJobQueue(async jobId => {
|
|
1024
1191
|
try {
|
|
1025
1192
|
const totalTimer = new Timer();
|
|
1026
1193
|
const syncTimer = new Timer();
|
|
1027
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
1028
1195
|
const syncTime = syncTimer.ms();
|
|
1029
1196
|
const functionTimer = new Timer();
|
|
1030
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1031
1198
|
|
|
1032
|
-
await this.
|
|
1033
|
-
|
|
1199
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1200
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1201
|
+
call.to,
|
|
1202
|
+
call.selector,
|
|
1203
|
+
(privateSyncCall, execScopes) =>
|
|
1204
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1205
|
+
anchorBlockHeader,
|
|
1206
|
+
jobId,
|
|
1207
|
+
scopes,
|
|
1034
1208
|
);
|
|
1035
1209
|
|
|
1036
|
-
const executionResult = await this.#
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
1037
1211
|
contractFunctionSimulator,
|
|
1038
1212
|
call,
|
|
1039
1213
|
authwits ?? [],
|
|
@@ -1054,14 +1228,19 @@ export class PXE {
|
|
|
1054
1228
|
};
|
|
1055
1229
|
|
|
1056
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1057
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
1058
1237
|
} catch (err: any) {
|
|
1059
1238
|
const { to, name, args } = call;
|
|
1060
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1061
1240
|
throw this.#contextualizeError(
|
|
1062
1241
|
err,
|
|
1063
|
-
`
|
|
1064
|
-
`scopes=${scopes
|
|
1242
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1065
1244
|
);
|
|
1066
1245
|
}
|
|
1067
1246
|
});
|
|
@@ -1080,32 +1259,47 @@ export class PXE {
|
|
|
1080
1259
|
* Defaults to the latest known block to PXE + 1.
|
|
1081
1260
|
* @returns - The packed events with block and tx metadata.
|
|
1082
1261
|
*/
|
|
1083
|
-
public getPrivateEvents(
|
|
1084
|
-
|
|
1085
|
-
|
|
1262
|
+
public async getPrivateEvents(
|
|
1263
|
+
eventSelector: EventSelector,
|
|
1264
|
+
filter: PrivateEventFilter,
|
|
1265
|
+
): Promise<PackedPrivateEvent[]> {
|
|
1266
|
+
let anchorBlockNumber: BlockNumber;
|
|
1267
|
+
|
|
1268
|
+
await this.#putInJobQueue(async jobId => {
|
|
1269
|
+
await this.#maybeSync();
|
|
1270
|
+
|
|
1271
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1272
|
+
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1273
|
+
|
|
1086
1274
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1087
1275
|
|
|
1088
|
-
await this.
|
|
1276
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1089
1277
|
filter.contractAddress,
|
|
1090
1278
|
null,
|
|
1091
|
-
async privateSyncCall =>
|
|
1092
|
-
await this.#
|
|
1279
|
+
async (privateSyncCall, execScopes) =>
|
|
1280
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1281
|
+
anchorBlockHeader,
|
|
1282
|
+
jobId,
|
|
1283
|
+
filter.scopes,
|
|
1093
1284
|
);
|
|
1285
|
+
});
|
|
1094
1286
|
|
|
1095
|
-
|
|
1287
|
+
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
1288
|
+
const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
|
|
1096
1289
|
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1290
|
+
this.log.debug(
|
|
1291
|
+
`Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,
|
|
1292
|
+
);
|
|
1100
1293
|
|
|
1101
|
-
|
|
1102
|
-
});
|
|
1294
|
+
return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
|
|
1103
1295
|
}
|
|
1104
1296
|
|
|
1105
1297
|
/**
|
|
1106
|
-
* Stops the PXE's job queue.
|
|
1298
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1107
1299
|
*/
|
|
1108
|
-
public stop(): Promise<void> {
|
|
1109
|
-
|
|
1300
|
+
public async stop(): Promise<void> {
|
|
1301
|
+
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1303
|
+
await this.db.close();
|
|
1110
1304
|
}
|
|
1111
1305
|
}
|