@aztec/pxe 0.0.1-commit.2ed92850 → 0.0.1-commit.2f68f620
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 +10 -4
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +39 -13
- package/dest/config/index.d.ts +8 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +13 -15
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +66 -31
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +216 -77
- 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 +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 +14 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +11 -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 +3 -4
- 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 +8 -9
- 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_data.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -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 -10
- 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 -98
- 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 +75 -46
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +471 -275
- 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 +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +68 -96
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +142 -111
- 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 +454 -172
- 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/{index.js → helpers.js} +16 -17
- 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 -18
- 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 +5 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -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 +40 -13
- package/dest/events/event_service.d.ts +16 -8
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +46 -14
- 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/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 +12 -10
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +134 -90
- 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 +55 -0
- package/dest/notes/note_service.d.ts +29 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +89 -65
- 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 -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/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 +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +130 -69
- 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 +167 -66
- package/dest/private_kernel/private_kernel_oracle.d.ts +15 -11
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +31 -25
- package/dest/pxe.d.ts +120 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +235 -136
- 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 +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +42 -36
- 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 -15
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +158 -90
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +13 -3
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +147 -107
- 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 +87 -61
- package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
- package/dest/storage/private_event_store/stored_private_event.js +2 -2
- 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/recipient_tagging_store.js +31 -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 +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +233 -137
- package/dest/tagging/get_all_logs_by_tags.d.ts +35 -11
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +45 -32
- package/dest/tagging/index.d.ts +6 -5
- 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/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 -10
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +32 -14
- 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 +41 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +6 -8
- 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 +37 -25
- package/package.json +29 -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 +54 -28
- package/src/config/index.ts +15 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +391 -136
- 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 +19 -18
- package/src/contract_function_simulator/index.ts +51 -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 +9 -8
- 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_data.ts +27 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -9
- 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 -176
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle.ts +564 -473
- 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 +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +174 -210
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +672 -253
- 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/{index.ts → helpers.ts} +17 -29
- package/src/debug/pxe_debug_utils.ts +55 -19
- 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 +4 -2
- package/src/entrypoints/server/utils.ts +37 -32
- package/src/events/event_service.ts +70 -24
- 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/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +170 -153
- package/src/messages/message_context_service.ts +62 -0
- package/src/notes/note_service.ts +124 -91
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -10
- 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 +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +165 -118
- package/src/private_kernel/hints/test_utils.ts +318 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +260 -92
- package/src/private_kernel/private_kernel_oracle.ts +42 -32
- package/src/pxe.ts +429 -186
- 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 +52 -34
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +194 -105
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +166 -132
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +106 -81
- package/src/storage/private_event_store/stored_private_event.ts +3 -3
- package/src/storage/tagging_store/recipient_tagging_store.ts +34 -24
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +287 -156
- package/src/tagging/get_all_logs_by_tags.ts +90 -38
- package/src/tagging/index.ts +5 -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 +54 -19
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +44 -14
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +30 -30
- package/dest/contract_sync/index.d.ts +0 -23
- package/dest/contract_sync/index.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/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -15
- 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 -15
- 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 -32
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -143
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -49
package/src/pxe.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import { KeyStore } from '@aztec/key-store';
|
|
8
8
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
9
|
-
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
10
9
|
import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
|
|
11
10
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
12
11
|
import {
|
|
@@ -18,6 +17,7 @@ import {
|
|
|
18
17
|
} from '@aztec/stdlib/abi';
|
|
19
18
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
19
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
|
+
import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
21
|
import {
|
|
22
22
|
CompleteAddress,
|
|
23
23
|
type ContractInstanceWithAddress,
|
|
@@ -33,6 +33,7 @@ import type {
|
|
|
33
33
|
PrivateKernelTailCircuitPublicInputs,
|
|
34
34
|
} from '@aztec/stdlib/kernel';
|
|
35
35
|
import {
|
|
36
|
+
BlockHeader,
|
|
36
37
|
type ContractOverrides,
|
|
37
38
|
type InTx,
|
|
38
39
|
PrivateExecutionResult,
|
|
@@ -46,7 +47,7 @@ import {
|
|
|
46
47
|
TxProfileResult,
|
|
47
48
|
TxProvingResult,
|
|
48
49
|
TxSimulationResult,
|
|
49
|
-
|
|
50
|
+
UtilityExecutionResult,
|
|
50
51
|
} from '@aztec/stdlib/tx';
|
|
51
52
|
|
|
52
53
|
import { inspect } from 'util';
|
|
@@ -59,11 +60,15 @@ import {
|
|
|
59
60
|
generateSimulatedProvingResult,
|
|
60
61
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
61
62
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
62
|
-
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';
|
|
63
66
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
64
67
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
65
68
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
66
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
67
72
|
import {
|
|
68
73
|
PrivateKernelExecutionProver,
|
|
69
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -74,16 +79,105 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
|
|
|
74
79
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
75
80
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
76
81
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
82
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
77
83
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
78
84
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
79
85
|
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
80
86
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
87
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
81
88
|
|
|
82
89
|
export type PackedPrivateEvent = InTx & {
|
|
83
90
|
packedEvent: Fr[];
|
|
84
91
|
eventSelector: EventSelector;
|
|
85
92
|
};
|
|
86
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
|
+
|
|
87
181
|
/**
|
|
88
182
|
* Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
|
|
89
183
|
* manage private state of users.
|
|
@@ -91,6 +185,7 @@ export type PackedPrivateEvent = InTx & {
|
|
|
91
185
|
export class PXE {
|
|
92
186
|
private constructor(
|
|
93
187
|
private node: AztecNode,
|
|
188
|
+
private db: AztecAsyncKVStore,
|
|
94
189
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
95
190
|
private keyStore: KeyStore,
|
|
96
191
|
private contractStore: ContractStore,
|
|
@@ -102,14 +197,20 @@ export class PXE {
|
|
|
102
197
|
private recipientTaggingStore: RecipientTaggingStore,
|
|
103
198
|
private addressStore: AddressStore,
|
|
104
199
|
private privateEventStore: PrivateEventStore,
|
|
200
|
+
private contractSyncService: ContractSyncService,
|
|
201
|
+
private messageContextService: MessageContextService,
|
|
202
|
+
private l2TipsStore: L2TipsProvider,
|
|
105
203
|
private simulator: CircuitSimulator,
|
|
106
204
|
private proverEnabled: boolean,
|
|
205
|
+
private autoSync: boolean,
|
|
107
206
|
private proofCreator: PrivateKernelProver,
|
|
108
207
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
208
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
109
209
|
private log: Logger,
|
|
110
210
|
private jobQueue: SerialQueue,
|
|
111
211
|
private jobCoordinator: JobCoordinator,
|
|
112
212
|
public debug: PXEDebugUtils,
|
|
213
|
+
private hooks: ExecutionHooks | undefined,
|
|
113
214
|
) {}
|
|
114
215
|
|
|
115
216
|
/**
|
|
@@ -119,58 +220,87 @@ export class PXE {
|
|
|
119
220
|
*
|
|
120
221
|
* @returns A promise that resolves PXE is ready to be used.
|
|
121
222
|
*/
|
|
122
|
-
public static async create(
|
|
123
|
-
node
|
|
124
|
-
store
|
|
125
|
-
proofCreator
|
|
126
|
-
simulator
|
|
127
|
-
protocolContractsProvider
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
+
|
|
131
238
|
const log =
|
|
132
239
|
!loggerOrSuffix || typeof loggerOrSuffix === 'string'
|
|
133
240
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
134
241
|
: loggerOrSuffix;
|
|
135
242
|
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
const
|
|
147
|
-
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
|
+
|
|
148
275
|
const synchronizer = new BlockSynchronizer(
|
|
149
276
|
node,
|
|
150
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);
|
|
160
288
|
jobCoordinator.registerStores([
|
|
161
289
|
capsuleStore,
|
|
162
290
|
senderTaggingStore,
|
|
163
291
|
recipientTaggingStore,
|
|
164
292
|
privateEventStore,
|
|
165
293
|
noteStore,
|
|
294
|
+
contractSyncService,
|
|
166
295
|
]);
|
|
167
296
|
|
|
168
|
-
const debugUtils = new PXEDebugUtils(
|
|
297
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
169
298
|
|
|
170
299
|
const jobQueue = new SerialQueue();
|
|
171
300
|
|
|
172
301
|
const pxe = new PXE(
|
|
173
302
|
node,
|
|
303
|
+
store,
|
|
174
304
|
synchronizer,
|
|
175
305
|
keyStore,
|
|
176
306
|
contractStore,
|
|
@@ -182,22 +312,31 @@ export class PXE {
|
|
|
182
312
|
recipientTaggingStore,
|
|
183
313
|
addressStore,
|
|
184
314
|
privateEventStore,
|
|
315
|
+
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
185
318
|
simulator,
|
|
186
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
187
321
|
proofCreator,
|
|
188
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
189
324
|
log,
|
|
190
325
|
jobQueue,
|
|
191
326
|
jobCoordinator,
|
|
192
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
193
329
|
);
|
|
194
330
|
|
|
195
|
-
debugUtils.
|
|
331
|
+
debugUtils.setPXEHelpers(
|
|
332
|
+
pxe.#putInJobQueue.bind(pxe),
|
|
333
|
+
pxe.#getSimulatorForTx.bind(pxe),
|
|
334
|
+
pxe.#executeUtility.bind(pxe),
|
|
335
|
+
);
|
|
196
336
|
|
|
197
337
|
pxe.jobQueue.start();
|
|
198
338
|
|
|
199
|
-
await pxe.#registerProtocolContracts();
|
|
200
|
-
const info = await node.getNodeInfo();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
201
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
202
341
|
return pxe;
|
|
203
342
|
}
|
|
@@ -207,20 +346,23 @@ export class PXE {
|
|
|
207
346
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
208
347
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
209
348
|
|
|
210
|
-
return new ContractFunctionSimulator(
|
|
211
|
-
proxyContractStore,
|
|
212
|
-
this.noteStore,
|
|
213
|
-
this.keyStore,
|
|
214
|
-
this.addressStore,
|
|
215
|
-
BenchmarkedNodeFactory.create(this.node),
|
|
216
|
-
this.
|
|
217
|
-
this.senderTaggingStore,
|
|
218
|
-
this.recipientTaggingStore,
|
|
219
|
-
this.senderAddressBookStore,
|
|
220
|
-
this.capsuleStore,
|
|
221
|
-
this.privateEventStore,
|
|
222
|
-
this.simulator,
|
|
223
|
-
|
|
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
|
+
});
|
|
224
366
|
}
|
|
225
367
|
|
|
226
368
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
@@ -270,51 +412,66 @@ export class PXE {
|
|
|
270
412
|
}
|
|
271
413
|
|
|
272
414
|
async #registerProtocolContracts() {
|
|
273
|
-
const registered
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
+
);
|
|
281
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
282
427
|
}
|
|
283
428
|
|
|
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
|
+
});
|
|
435
|
+
}
|
|
436
|
+
|
|
284
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
285
438
|
// functions that might arise.
|
|
286
|
-
async #executePrivate(
|
|
287
|
-
contractFunctionSimulator
|
|
288
|
-
txRequest
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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> {
|
|
292
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
293
455
|
|
|
294
456
|
try {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
await ensureContractSynced(
|
|
457
|
+
await this.contractSyncService.ensureContractSynced(
|
|
298
458
|
contractAddress,
|
|
299
459
|
functionSelector,
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.contractStore,
|
|
460
|
+
(privateSyncCall, execScopes) =>
|
|
461
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
303
462
|
anchorBlockHeader,
|
|
463
|
+
jobId,
|
|
464
|
+
scopes,
|
|
304
465
|
);
|
|
305
466
|
|
|
306
|
-
const result = await contractFunctionSimulator.run(
|
|
307
|
-
txRequest,
|
|
467
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
308
468
|
contractAddress,
|
|
309
|
-
functionSelector,
|
|
310
|
-
undefined,
|
|
469
|
+
selector: functionSelector,
|
|
311
470
|
anchorBlockHeader,
|
|
312
|
-
// The sender for tags is set by contracts, typically by an account
|
|
313
|
-
// contract entrypoint
|
|
314
|
-
undefined, // senderForTags
|
|
315
471
|
scopes,
|
|
316
472
|
jobId,
|
|
317
|
-
|
|
473
|
+
senderForTags,
|
|
474
|
+
});
|
|
318
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
319
476
|
return result;
|
|
320
477
|
} catch (err) {
|
|
@@ -326,25 +483,32 @@ export class PXE {
|
|
|
326
483
|
}
|
|
327
484
|
|
|
328
485
|
/**
|
|
329
|
-
*
|
|
486
|
+
* Execute a utility function call on the given contract.
|
|
330
487
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
331
488
|
* @param call - The function call to execute.
|
|
332
489
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
333
490
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
334
491
|
* accounts if not specified.
|
|
335
492
|
* @param jobId - The job ID for staged writes.
|
|
336
|
-
* @returns The
|
|
493
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
337
494
|
*/
|
|
338
|
-
async #
|
|
495
|
+
async #executeUtility(
|
|
339
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
340
497
|
call: FunctionCall,
|
|
341
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
342
|
-
scopes: AztecAddress[]
|
|
499
|
+
scopes: AztecAddress[],
|
|
343
500
|
jobId: string,
|
|
344
501
|
) {
|
|
345
502
|
try {
|
|
346
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
347
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
348
512
|
} catch (err) {
|
|
349
513
|
if (err instanceof SimulationError) {
|
|
350
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -359,11 +523,11 @@ export class PXE {
|
|
|
359
523
|
* It can also be used for estimating gas in the future.
|
|
360
524
|
* @param tx - The transaction to be simulated.
|
|
361
525
|
*/
|
|
362
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
363
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
364
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
365
529
|
try {
|
|
366
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
367
531
|
if (result.revertReason) {
|
|
368
532
|
throw result.revertReason;
|
|
369
533
|
}
|
|
@@ -395,18 +559,57 @@ export class PXE {
|
|
|
395
559
|
txExecutionRequest: TxExecutionRequest,
|
|
396
560
|
proofCreator: PrivateKernelProver,
|
|
397
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
398
563
|
config: PrivateKernelExecutionProverConfig,
|
|
399
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
400
|
-
const
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
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(),
|
|
571
|
+
);
|
|
404
572
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
405
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
406
574
|
}
|
|
407
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
|
+
|
|
408
587
|
// Public API
|
|
409
588
|
|
|
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());
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Returns the block header up to which the PXE has synced.
|
|
600
|
+
* @returns The synced block header
|
|
601
|
+
*/
|
|
602
|
+
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
603
|
+
return this.#putInJobQueue(() => {
|
|
604
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
|
|
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
|
+
*/
|
|
410
613
|
public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
411
614
|
return this.contractStore.getContractInstance(address);
|
|
412
615
|
}
|
|
@@ -433,7 +636,7 @@ export class PXE {
|
|
|
433
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
434
637
|
const accounts = await this.keyStore.getAccounts();
|
|
435
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
436
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
437
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
438
641
|
return accountCompleteAddress;
|
|
439
642
|
} else {
|
|
@@ -456,8 +659,14 @@ export class PXE {
|
|
|
456
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
457
660
|
*/
|
|
458
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
|
+
|
|
459
668
|
const accounts = await this.keyStore.getAccounts();
|
|
460
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
461
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
462
671
|
return sender;
|
|
463
672
|
}
|
|
@@ -466,6 +675,9 @@ export class PXE {
|
|
|
466
675
|
|
|
467
676
|
if (wasAdded) {
|
|
468
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()));
|
|
469
681
|
} else {
|
|
470
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
471
683
|
}
|
|
@@ -515,8 +727,7 @@ export class PXE {
|
|
|
515
727
|
* @param artifact - The build artifact for the contract class.
|
|
516
728
|
*/
|
|
517
729
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
518
|
-
const
|
|
519
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
730
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
520
731
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
521
732
|
}
|
|
522
733
|
|
|
@@ -535,22 +746,24 @@ export class PXE {
|
|
|
535
746
|
if (artifact) {
|
|
536
747
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
537
748
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
538
|
-
|
|
539
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
749
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
540
750
|
throw new Error(
|
|
541
|
-
`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})`,
|
|
542
752
|
);
|
|
543
753
|
}
|
|
544
754
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
545
755
|
if (!computedAddress.equals(instance.address)) {
|
|
546
756
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
547
757
|
}
|
|
548
|
-
|
|
758
|
+
|
|
759
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
549
760
|
|
|
550
761
|
const publicFunctionSignatures = artifact.functions
|
|
551
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
552
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
553
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
554
767
|
} else {
|
|
555
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
556
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -585,7 +798,7 @@ export class PXE {
|
|
|
585
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
586
799
|
}
|
|
587
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
588
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
589
802
|
|
|
590
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
591
804
|
|
|
@@ -594,15 +807,18 @@ export class PXE {
|
|
|
594
807
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
595
808
|
}
|
|
596
809
|
|
|
597
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
598
|
-
|
|
599
810
|
const publicFunctionSignatures = artifact.functions
|
|
600
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
601
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
602
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
603
816
|
|
|
604
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
605
|
-
await
|
|
818
|
+
await Promise.all([
|
|
819
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
820
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
821
|
+
]);
|
|
606
822
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
607
823
|
});
|
|
608
824
|
}
|
|
@@ -620,11 +836,12 @@ export class PXE {
|
|
|
620
836
|
* (where validators prove the public portion).
|
|
621
837
|
*
|
|
622
838
|
* @param txRequest - An authenticated tx request ready for proving
|
|
839
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
623
840
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
624
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
625
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
626
843
|
*/
|
|
627
|
-
public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
628
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
629
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
630
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -632,17 +849,25 @@ export class PXE {
|
|
|
632
849
|
const totalTimer = new Timer();
|
|
633
850
|
try {
|
|
634
851
|
const syncTimer = new Timer();
|
|
635
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
636
854
|
const syncTime = syncTimer.ms();
|
|
637
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
638
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
639
864
|
|
|
640
865
|
const {
|
|
641
866
|
publicInputs,
|
|
642
867
|
chonkProof,
|
|
643
868
|
executionSteps,
|
|
644
869
|
timings: { proving } = {},
|
|
645
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
646
871
|
simulate: false,
|
|
647
872
|
skipFeeEnforcement: false,
|
|
648
873
|
profileMode: 'none',
|
|
@@ -672,23 +897,20 @@ export class PXE {
|
|
|
672
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
673
898
|
});
|
|
674
899
|
|
|
675
|
-
//
|
|
676
|
-
//
|
|
677
|
-
//
|
|
678
|
-
//
|
|
679
|
-
//
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
} else {
|
|
690
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
691
|
-
}
|
|
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
|
+
);
|
|
692
914
|
|
|
693
915
|
return txProvingResult;
|
|
694
916
|
} catch (err: any) {
|
|
@@ -699,17 +921,13 @@ export class PXE {
|
|
|
699
921
|
|
|
700
922
|
/**
|
|
701
923
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
702
|
-
*
|
|
703
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
704
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
705
|
-
* @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.
|
|
706
925
|
* @returns A trace of the program execution with gate counts.
|
|
707
926
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
708
927
|
*/
|
|
709
928
|
public profileTx(
|
|
710
929
|
txRequest: TxExecutionRequest,
|
|
711
|
-
profileMode
|
|
712
|
-
skipProofGeneration: boolean = true,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
713
931
|
): Promise<TxProfileResult> {
|
|
714
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
715
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -728,21 +946,25 @@ export class PXE {
|
|
|
728
946
|
txInfo,
|
|
729
947
|
);
|
|
730
948
|
const syncTimer = new Timer();
|
|
731
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
732
951
|
const syncTime = syncTimer.ms();
|
|
733
952
|
|
|
734
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
735
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
736
955
|
contractFunctionSimulator,
|
|
737
956
|
txRequest,
|
|
738
|
-
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
739
959
|
jobId,
|
|
740
|
-
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
741
962
|
|
|
742
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
743
964
|
txRequest,
|
|
744
965
|
this.proofCreator,
|
|
745
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
746
968
|
{
|
|
747
969
|
simulate: skipProofGeneration,
|
|
748
970
|
skipFeeEnforcement: false,
|
|
@@ -794,12 +1016,7 @@ export class PXE {
|
|
|
794
1016
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
795
1017
|
*
|
|
796
1018
|
*
|
|
797
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
798
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
799
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
800
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
801
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
802
|
-
* @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.
|
|
803
1020
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
804
1021
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
805
1022
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
@@ -808,11 +1025,15 @@ export class PXE {
|
|
|
808
1025
|
*/
|
|
809
1026
|
public simulateTx(
|
|
810
1027
|
txRequest: TxExecutionRequest,
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
816
1037
|
): Promise<TxSimulationResult> {
|
|
817
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
818
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -833,17 +1054,26 @@ export class PXE {
|
|
|
833
1054
|
txInfo,
|
|
834
1055
|
);
|
|
835
1056
|
const syncTimer = new Timer();
|
|
836
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
837
1059
|
const syncTime = syncTimer.ms();
|
|
838
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
|
+
}
|
|
839
1066
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
840
|
-
// Temporary: in case there are overrides, we have to skip the kernels or validations
|
|
841
|
-
// will fail. Consider handing control to the user/wallet on whether they want to run them
|
|
842
|
-
// or not.
|
|
843
|
-
const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
|
|
844
1067
|
|
|
845
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
846
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
847
1077
|
|
|
848
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
849
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -851,15 +1081,22 @@ export class PXE {
|
|
|
851
1081
|
if (skipKernels) {
|
|
852
1082
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
853
1083
|
privateExecutionResult,
|
|
854
|
-
this.contractStore,
|
|
1084
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
1085
|
+
this.node,
|
|
855
1086
|
));
|
|
856
1087
|
} else {
|
|
857
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
858
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
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
|
+
));
|
|
863
1100
|
}
|
|
864
1101
|
|
|
865
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -868,8 +1105,11 @@ export class PXE {
|
|
|
868
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
869
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
870
1107
|
const publicSimulationTimer = new Timer();
|
|
871
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
872
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
1110
|
+
if (publicOutput?.debugLogs?.length) {
|
|
1111
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
1112
|
+
}
|
|
873
1113
|
}
|
|
874
1114
|
|
|
875
1115
|
let validationTime: number | undefined;
|
|
@@ -878,7 +1118,8 @@ export class PXE {
|
|
|
878
1118
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
879
1119
|
validationTime = validationTimer.ms();
|
|
880
1120
|
if (validationResult.result === 'invalid') {
|
|
881
|
-
|
|
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}`);
|
|
882
1123
|
}
|
|
883
1124
|
}
|
|
884
1125
|
|
|
@@ -929,49 +1170,44 @@ export class PXE {
|
|
|
929
1170
|
inspect(txRequest),
|
|
930
1171
|
`simulatePublic=${simulatePublic}`,
|
|
931
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
932
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
933
1174
|
);
|
|
934
1175
|
}
|
|
935
1176
|
});
|
|
936
1177
|
}
|
|
937
1178
|
|
|
938
1179
|
/**
|
|
939
|
-
*
|
|
940
|
-
*
|
|
1180
|
+
* Executes a contract utility function.
|
|
941
1181
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
942
|
-
* @param authwits - (Optional) The authentication witnesses required for the function call.
|
|
943
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
|
|
944
|
-
* default to all.
|
|
945
|
-
* @returns The result of the utility function call, structured based on the function ABI.
|
|
946
1182
|
*/
|
|
947
|
-
public
|
|
1183
|
+
public executeUtility(
|
|
948
1184
|
call: FunctionCall,
|
|
949
|
-
authwits
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
// 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.
|
|
953
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
954
|
-
// 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).
|
|
955
1190
|
return this.#putInJobQueue(async jobId => {
|
|
956
1191
|
try {
|
|
957
1192
|
const totalTimer = new Timer();
|
|
958
1193
|
const syncTimer = new Timer();
|
|
959
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
960
1195
|
const syncTime = syncTimer.ms();
|
|
961
1196
|
const functionTimer = new Timer();
|
|
962
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
963
1198
|
|
|
964
1199
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
965
|
-
await ensureContractSynced(
|
|
1200
|
+
await this.contractSyncService.ensureContractSynced(
|
|
966
1201
|
call.to,
|
|
967
1202
|
call.selector,
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
this.contractStore,
|
|
1203
|
+
(privateSyncCall, execScopes) =>
|
|
1204
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
971
1205
|
anchorBlockHeader,
|
|
1206
|
+
jobId,
|
|
1207
|
+
scopes,
|
|
972
1208
|
);
|
|
973
1209
|
|
|
974
|
-
const executionResult = await this.#
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
975
1211
|
contractFunctionSimulator,
|
|
976
1212
|
call,
|
|
977
1213
|
authwits ?? [],
|
|
@@ -992,14 +1228,19 @@ export class PXE {
|
|
|
992
1228
|
};
|
|
993
1229
|
|
|
994
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
995
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
996
1237
|
} catch (err: any) {
|
|
997
1238
|
const { to, name, args } = call;
|
|
998
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
999
1240
|
throw this.#contextualizeError(
|
|
1000
1241
|
err,
|
|
1001
|
-
`
|
|
1002
|
-
`scopes=${scopes
|
|
1242
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1003
1244
|
);
|
|
1004
1245
|
}
|
|
1005
1246
|
});
|
|
@@ -1025,21 +1266,21 @@ export class PXE {
|
|
|
1025
1266
|
let anchorBlockNumber: BlockNumber;
|
|
1026
1267
|
|
|
1027
1268
|
await this.#putInJobQueue(async jobId => {
|
|
1028
|
-
await this
|
|
1269
|
+
await this.#maybeSync();
|
|
1029
1270
|
|
|
1030
1271
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1031
1272
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1032
1273
|
|
|
1033
1274
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1034
1275
|
|
|
1035
|
-
await ensureContractSynced(
|
|
1276
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1036
1277
|
filter.contractAddress,
|
|
1037
1278
|
null,
|
|
1038
|
-
async privateSyncCall =>
|
|
1039
|
-
await this.#
|
|
1040
|
-
this.node,
|
|
1041
|
-
this.contractStore,
|
|
1279
|
+
async (privateSyncCall, execScopes) =>
|
|
1280
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1042
1281
|
anchorBlockHeader,
|
|
1282
|
+
jobId,
|
|
1283
|
+
filter.scopes,
|
|
1043
1284
|
);
|
|
1044
1285
|
});
|
|
1045
1286
|
|
|
@@ -1054,9 +1295,11 @@ export class PXE {
|
|
|
1054
1295
|
}
|
|
1055
1296
|
|
|
1056
1297
|
/**
|
|
1057
|
-
* Stops the PXE's job queue.
|
|
1298
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1058
1299
|
*/
|
|
1059
|
-
public stop(): Promise<void> {
|
|
1060
|
-
|
|
1300
|
+
public async stop(): Promise<void> {
|
|
1301
|
+
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1303
|
+
await this.db.close();
|
|
1061
1304
|
}
|
|
1062
1305
|
}
|