@aztec/pxe 0.0.1-commit.e3c1de76 → 0.0.1-commit.e57c76e
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 +9 -3
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +37 -11
- 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 -29
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +216 -75
- 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 -95
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +141 -110
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +156 -76
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +450 -166
- 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 +14 -15
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +16 -21
- 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 +21 -5
- 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 +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +21 -5
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +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 +21 -5
- package/dest/events/event_service.d.ts +15 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +44 -11
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/hooks/authorize_utility_call.d.ts +41 -0
- package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
- package/dest/hooks/authorize_utility_call.js +4 -0
- package/dest/hooks/execution_hooks.d.ts +42 -0
- package/dest/hooks/execution_hooks.d.ts.map +1 -0
- package/dest/hooks/execution_hooks.js +9 -0
- package/dest/hooks/index.d.ts +4 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +1 -0
- package/dest/logs/log_service.d.ts +9 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +131 -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 +55 -0
- package/dest/notes/note_service.d.ts +27 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +83 -58
- 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 +6 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +166 -65
- 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 +231 -134
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +42 -15
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +146 -87
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +3 -3
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +6 -4
- package/dest/storage/open_pxe_stores.d.ts +33 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +27 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +3 -0
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
- package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +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 +4 -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 +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 +5 -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 +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 +39 -11
- 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 +173 -205
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +664 -245
- 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 +47 -25
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +19 -6
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +19 -6
- package/src/entrypoints/pxe_creation_options.ts +14 -0
- package/src/entrypoints/server/index.ts +4 -2
- package/src/entrypoints/server/utils.ts +22 -13
- package/src/events/event_service.ts +69 -21
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/hooks/authorize_utility_call.ts +44 -0
- package/src/hooks/execution_hooks.ts +48 -0
- package/src/hooks/index.ts +7 -0
- package/src/logs/log_service.ts +162 -145
- package/src/messages/message_context_service.ts +62 -0
- package/src/notes/note_service.ts +120 -85
- 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 +254 -89
- package/src/private_kernel/private_kernel_oracle.ts +42 -32
- package/src/pxe.ts +416 -181
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +182 -104
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +9 -5
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +5 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/get_all_logs_by_tags.ts +87 -35
- 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 +52 -17
- 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 +27 -27
- 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
|
@@ -6,7 +6,6 @@ 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,15 +220,17 @@ 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) {
|
|
131
234
|
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
132
235
|
const bindings: LoggerBindings | undefined =
|
|
133
236
|
loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
@@ -137,25 +240,46 @@ export class PXE {
|
|
|
137
240
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
138
241
|
: loggerOrSuffix;
|
|
139
242
|
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
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
|
+
|
|
152
275
|
const synchronizer = new BlockSynchronizer(
|
|
153
276
|
node,
|
|
154
277
|
store,
|
|
155
278
|
anchorBlockStore,
|
|
156
279
|
noteStore,
|
|
157
280
|
privateEventStore,
|
|
158
|
-
|
|
281
|
+
l2TipsStore,
|
|
282
|
+
contractSyncService,
|
|
159
283
|
config,
|
|
160
284
|
bindings,
|
|
161
285
|
);
|
|
@@ -167,14 +291,16 @@ export class PXE {
|
|
|
167
291
|
recipientTaggingStore,
|
|
168
292
|
privateEventStore,
|
|
169
293
|
noteStore,
|
|
294
|
+
contractSyncService,
|
|
170
295
|
]);
|
|
171
296
|
|
|
172
|
-
const debugUtils = new PXEDebugUtils(
|
|
297
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
173
298
|
|
|
174
299
|
const jobQueue = new SerialQueue();
|
|
175
300
|
|
|
176
301
|
const pxe = new PXE(
|
|
177
302
|
node,
|
|
303
|
+
store,
|
|
178
304
|
synchronizer,
|
|
179
305
|
keyStore,
|
|
180
306
|
contractStore,
|
|
@@ -186,22 +312,31 @@ export class PXE {
|
|
|
186
312
|
recipientTaggingStore,
|
|
187
313
|
addressStore,
|
|
188
314
|
privateEventStore,
|
|
315
|
+
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
189
318
|
simulator,
|
|
190
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
191
321
|
proofCreator,
|
|
192
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
193
324
|
log,
|
|
194
325
|
jobQueue,
|
|
195
326
|
jobCoordinator,
|
|
196
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
197
329
|
);
|
|
198
330
|
|
|
199
|
-
debugUtils.
|
|
331
|
+
debugUtils.setPXEHelpers(
|
|
332
|
+
pxe.#putInJobQueue.bind(pxe),
|
|
333
|
+
pxe.#getSimulatorForTx.bind(pxe),
|
|
334
|
+
pxe.#executeUtility.bind(pxe),
|
|
335
|
+
);
|
|
200
336
|
|
|
201
337
|
pxe.jobQueue.start();
|
|
202
338
|
|
|
203
|
-
await pxe.#registerProtocolContracts();
|
|
204
|
-
const info = await node.getNodeInfo();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
205
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
206
341
|
return pxe;
|
|
207
342
|
}
|
|
@@ -211,19 +346,23 @@ export class PXE {
|
|
|
211
346
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
212
347
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
213
348
|
|
|
214
|
-
return new ContractFunctionSimulator(
|
|
215
|
-
proxyContractStore,
|
|
216
|
-
this.noteStore,
|
|
217
|
-
this.keyStore,
|
|
218
|
-
this.addressStore,
|
|
219
|
-
BenchmarkedNodeFactory.create(this.node),
|
|
220
|
-
this.
|
|
221
|
-
this.
|
|
222
|
-
this.
|
|
223
|
-
this.
|
|
224
|
-
this.
|
|
225
|
-
this.
|
|
226
|
-
|
|
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
|
+
});
|
|
227
366
|
}
|
|
228
367
|
|
|
229
368
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
@@ -273,51 +412,66 @@ export class PXE {
|
|
|
273
412
|
}
|
|
274
413
|
|
|
275
414
|
async #registerProtocolContracts() {
|
|
276
|
-
const registered
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
+
);
|
|
284
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
285
427
|
}
|
|
286
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
|
+
|
|
287
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
288
438
|
// functions that might arise.
|
|
289
|
-
async #executePrivate(
|
|
290
|
-
contractFunctionSimulator
|
|
291
|
-
txRequest
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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> {
|
|
295
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
296
455
|
|
|
297
456
|
try {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
await ensureContractSynced(
|
|
457
|
+
await this.contractSyncService.ensureContractSynced(
|
|
301
458
|
contractAddress,
|
|
302
459
|
functionSelector,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
this.contractStore,
|
|
460
|
+
(privateSyncCall, execScopes) =>
|
|
461
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
306
462
|
anchorBlockHeader,
|
|
463
|
+
jobId,
|
|
464
|
+
scopes,
|
|
307
465
|
);
|
|
308
466
|
|
|
309
|
-
const result = await contractFunctionSimulator.run(
|
|
310
|
-
txRequest,
|
|
467
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
311
468
|
contractAddress,
|
|
312
|
-
functionSelector,
|
|
313
|
-
undefined,
|
|
469
|
+
selector: functionSelector,
|
|
314
470
|
anchorBlockHeader,
|
|
315
|
-
// The sender for tags is set by contracts, typically by an account
|
|
316
|
-
// contract entrypoint
|
|
317
|
-
undefined, // senderForTags
|
|
318
471
|
scopes,
|
|
319
472
|
jobId,
|
|
320
|
-
|
|
473
|
+
senderForTags,
|
|
474
|
+
});
|
|
321
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
322
476
|
return result;
|
|
323
477
|
} catch (err) {
|
|
@@ -329,25 +483,32 @@ export class PXE {
|
|
|
329
483
|
}
|
|
330
484
|
|
|
331
485
|
/**
|
|
332
|
-
*
|
|
486
|
+
* Execute a utility function call on the given contract.
|
|
333
487
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
334
488
|
* @param call - The function call to execute.
|
|
335
489
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
336
490
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
337
491
|
* accounts if not specified.
|
|
338
492
|
* @param jobId - The job ID for staged writes.
|
|
339
|
-
* @returns The
|
|
493
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
340
494
|
*/
|
|
341
|
-
async #
|
|
495
|
+
async #executeUtility(
|
|
342
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
343
497
|
call: FunctionCall,
|
|
344
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
345
|
-
scopes: AztecAddress[]
|
|
499
|
+
scopes: AztecAddress[],
|
|
346
500
|
jobId: string,
|
|
347
501
|
) {
|
|
348
502
|
try {
|
|
349
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
350
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
351
512
|
} catch (err) {
|
|
352
513
|
if (err instanceof SimulationError) {
|
|
353
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -362,11 +523,11 @@ export class PXE {
|
|
|
362
523
|
* It can also be used for estimating gas in the future.
|
|
363
524
|
* @param tx - The transaction to be simulated.
|
|
364
525
|
*/
|
|
365
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
366
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
367
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
368
529
|
try {
|
|
369
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
370
531
|
if (result.revertReason) {
|
|
371
532
|
throw result.revertReason;
|
|
372
533
|
}
|
|
@@ -398,11 +559,10 @@ export class PXE {
|
|
|
398
559
|
txExecutionRequest: TxExecutionRequest,
|
|
399
560
|
proofCreator: PrivateKernelProver,
|
|
400
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
401
563
|
config: PrivateKernelExecutionProverConfig,
|
|
402
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
403
|
-
const
|
|
404
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
405
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
565
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
406
566
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
407
567
|
kernelOracle,
|
|
408
568
|
proofCreator,
|
|
@@ -413,8 +573,43 @@ export class PXE {
|
|
|
413
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
414
574
|
}
|
|
415
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
|
+
|
|
416
587
|
// Public API
|
|
417
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
|
+
*/
|
|
418
613
|
public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
419
614
|
return this.contractStore.getContractInstance(address);
|
|
420
615
|
}
|
|
@@ -441,7 +636,7 @@ export class PXE {
|
|
|
441
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
442
637
|
const accounts = await this.keyStore.getAccounts();
|
|
443
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
444
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
445
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
446
641
|
return accountCompleteAddress;
|
|
447
642
|
} else {
|
|
@@ -464,8 +659,14 @@ export class PXE {
|
|
|
464
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
465
660
|
*/
|
|
466
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
|
+
|
|
467
668
|
const accounts = await this.keyStore.getAccounts();
|
|
468
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
469
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
470
671
|
return sender;
|
|
471
672
|
}
|
|
@@ -474,6 +675,9 @@ export class PXE {
|
|
|
474
675
|
|
|
475
676
|
if (wasAdded) {
|
|
476
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()));
|
|
477
681
|
} else {
|
|
478
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
479
683
|
}
|
|
@@ -523,8 +727,7 @@ export class PXE {
|
|
|
523
727
|
* @param artifact - The build artifact for the contract class.
|
|
524
728
|
*/
|
|
525
729
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
526
|
-
const
|
|
527
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
730
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
528
731
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
529
732
|
}
|
|
530
733
|
|
|
@@ -543,22 +746,24 @@ export class PXE {
|
|
|
543
746
|
if (artifact) {
|
|
544
747
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
545
748
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
546
|
-
|
|
547
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
749
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
548
750
|
throw new Error(
|
|
549
|
-
`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})`,
|
|
550
752
|
);
|
|
551
753
|
}
|
|
552
754
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
553
755
|
if (!computedAddress.equals(instance.address)) {
|
|
554
756
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
555
757
|
}
|
|
556
|
-
|
|
758
|
+
|
|
759
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
557
760
|
|
|
558
761
|
const publicFunctionSignatures = artifact.functions
|
|
559
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
560
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
561
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
562
767
|
} else {
|
|
563
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
564
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -593,7 +798,7 @@ export class PXE {
|
|
|
593
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
594
799
|
}
|
|
595
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
596
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
597
802
|
|
|
598
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
599
804
|
|
|
@@ -602,15 +807,18 @@ export class PXE {
|
|
|
602
807
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
603
808
|
}
|
|
604
809
|
|
|
605
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
606
|
-
|
|
607
810
|
const publicFunctionSignatures = artifact.functions
|
|
608
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
609
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
610
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
611
816
|
|
|
612
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
613
|
-
await
|
|
818
|
+
await Promise.all([
|
|
819
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
820
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
821
|
+
]);
|
|
614
822
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
615
823
|
});
|
|
616
824
|
}
|
|
@@ -628,11 +836,12 @@ export class PXE {
|
|
|
628
836
|
* (where validators prove the public portion).
|
|
629
837
|
*
|
|
630
838
|
* @param txRequest - An authenticated tx request ready for proving
|
|
839
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
631
840
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
632
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
633
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
634
843
|
*/
|
|
635
|
-
public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
636
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
637
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
638
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -640,17 +849,25 @@ export class PXE {
|
|
|
640
849
|
const totalTimer = new Timer();
|
|
641
850
|
try {
|
|
642
851
|
const syncTimer = new Timer();
|
|
643
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
644
854
|
const syncTime = syncTimer.ms();
|
|
645
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
646
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
647
864
|
|
|
648
865
|
const {
|
|
649
866
|
publicInputs,
|
|
650
867
|
chonkProof,
|
|
651
868
|
executionSteps,
|
|
652
869
|
timings: { proving } = {},
|
|
653
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
654
871
|
simulate: false,
|
|
655
872
|
skipFeeEnforcement: false,
|
|
656
873
|
profileMode: 'none',
|
|
@@ -680,23 +897,20 @@ export class PXE {
|
|
|
680
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
681
898
|
});
|
|
682
899
|
|
|
683
|
-
//
|
|
684
|
-
//
|
|
685
|
-
//
|
|
686
|
-
//
|
|
687
|
-
//
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
} else {
|
|
698
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
699
|
-
}
|
|
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
|
+
);
|
|
700
914
|
|
|
701
915
|
return txProvingResult;
|
|
702
916
|
} catch (err: any) {
|
|
@@ -707,17 +921,13 @@ export class PXE {
|
|
|
707
921
|
|
|
708
922
|
/**
|
|
709
923
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
710
|
-
*
|
|
711
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
712
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
713
|
-
* @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.
|
|
714
925
|
* @returns A trace of the program execution with gate counts.
|
|
715
926
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
716
927
|
*/
|
|
717
928
|
public profileTx(
|
|
718
929
|
txRequest: TxExecutionRequest,
|
|
719
|
-
profileMode
|
|
720
|
-
skipProofGeneration: boolean = true,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
721
931
|
): Promise<TxProfileResult> {
|
|
722
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
723
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -736,21 +946,25 @@ export class PXE {
|
|
|
736
946
|
txInfo,
|
|
737
947
|
);
|
|
738
948
|
const syncTimer = new Timer();
|
|
739
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
740
951
|
const syncTime = syncTimer.ms();
|
|
741
952
|
|
|
742
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
743
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
744
955
|
contractFunctionSimulator,
|
|
745
956
|
txRequest,
|
|
746
|
-
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
747
959
|
jobId,
|
|
748
|
-
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
749
962
|
|
|
750
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
751
964
|
txRequest,
|
|
752
965
|
this.proofCreator,
|
|
753
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
754
968
|
{
|
|
755
969
|
simulate: skipProofGeneration,
|
|
756
970
|
skipFeeEnforcement: false,
|
|
@@ -802,12 +1016,7 @@ export class PXE {
|
|
|
802
1016
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
803
1017
|
*
|
|
804
1018
|
*
|
|
805
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
806
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
807
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
808
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
809
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
810
|
-
* @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.
|
|
811
1020
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
812
1021
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
813
1022
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
@@ -816,11 +1025,15 @@ export class PXE {
|
|
|
816
1025
|
*/
|
|
817
1026
|
public simulateTx(
|
|
818
1027
|
txRequest: TxExecutionRequest,
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
824
1037
|
): Promise<TxSimulationResult> {
|
|
825
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
826
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -841,17 +1054,26 @@ export class PXE {
|
|
|
841
1054
|
txInfo,
|
|
842
1055
|
);
|
|
843
1056
|
const syncTimer = new Timer();
|
|
844
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
845
1059
|
const syncTime = syncTimer.ms();
|
|
846
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
|
+
}
|
|
847
1066
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
848
|
-
// Temporary: in case there are overrides, we have to skip the kernels or validations
|
|
849
|
-
// will fail. Consider handing control to the user/wallet on whether they want to run them
|
|
850
|
-
// or not.
|
|
851
|
-
const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
|
|
852
1067
|
|
|
853
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
854
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
855
1077
|
|
|
856
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
857
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -859,15 +1081,22 @@ export class PXE {
|
|
|
859
1081
|
if (skipKernels) {
|
|
860
1082
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
861
1083
|
privateExecutionResult,
|
|
862
|
-
this.contractStore,
|
|
1084
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
1085
|
+
this.node,
|
|
863
1086
|
));
|
|
864
1087
|
} else {
|
|
865
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
866
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
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
|
+
));
|
|
871
1100
|
}
|
|
872
1101
|
|
|
873
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -876,8 +1105,11 @@ export class PXE {
|
|
|
876
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
877
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
878
1107
|
const publicSimulationTimer = new Timer();
|
|
879
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
880
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
1110
|
+
if (publicOutput?.debugLogs?.length) {
|
|
1111
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
1112
|
+
}
|
|
881
1113
|
}
|
|
882
1114
|
|
|
883
1115
|
let validationTime: number | undefined;
|
|
@@ -886,7 +1118,8 @@ export class PXE {
|
|
|
886
1118
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
887
1119
|
validationTime = validationTimer.ms();
|
|
888
1120
|
if (validationResult.result === 'invalid') {
|
|
889
|
-
|
|
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}`);
|
|
890
1123
|
}
|
|
891
1124
|
}
|
|
892
1125
|
|
|
@@ -937,49 +1170,44 @@ export class PXE {
|
|
|
937
1170
|
inspect(txRequest),
|
|
938
1171
|
`simulatePublic=${simulatePublic}`,
|
|
939
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
940
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
941
1174
|
);
|
|
942
1175
|
}
|
|
943
1176
|
});
|
|
944
1177
|
}
|
|
945
1178
|
|
|
946
1179
|
/**
|
|
947
|
-
*
|
|
948
|
-
*
|
|
1180
|
+
* Executes a contract utility function.
|
|
949
1181
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
950
|
-
* @param authwits - (Optional) The authentication witnesses required for the function call.
|
|
951
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
|
|
952
|
-
* default to all.
|
|
953
|
-
* @returns The result of the utility function call, structured based on the function ABI.
|
|
954
1182
|
*/
|
|
955
|
-
public
|
|
1183
|
+
public executeUtility(
|
|
956
1184
|
call: FunctionCall,
|
|
957
|
-
authwits
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
// 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.
|
|
961
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
962
|
-
// 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).
|
|
963
1190
|
return this.#putInJobQueue(async jobId => {
|
|
964
1191
|
try {
|
|
965
1192
|
const totalTimer = new Timer();
|
|
966
1193
|
const syncTimer = new Timer();
|
|
967
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
968
1195
|
const syncTime = syncTimer.ms();
|
|
969
1196
|
const functionTimer = new Timer();
|
|
970
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
971
1198
|
|
|
972
1199
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
973
|
-
await ensureContractSynced(
|
|
1200
|
+
await this.contractSyncService.ensureContractSynced(
|
|
974
1201
|
call.to,
|
|
975
1202
|
call.selector,
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
this.contractStore,
|
|
1203
|
+
(privateSyncCall, execScopes) =>
|
|
1204
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
979
1205
|
anchorBlockHeader,
|
|
1206
|
+
jobId,
|
|
1207
|
+
scopes,
|
|
980
1208
|
);
|
|
981
1209
|
|
|
982
|
-
const executionResult = await this.#
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
983
1211
|
contractFunctionSimulator,
|
|
984
1212
|
call,
|
|
985
1213
|
authwits ?? [],
|
|
@@ -1000,14 +1228,19 @@ export class PXE {
|
|
|
1000
1228
|
};
|
|
1001
1229
|
|
|
1002
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1003
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
1004
1237
|
} catch (err: any) {
|
|
1005
1238
|
const { to, name, args } = call;
|
|
1006
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1007
1240
|
throw this.#contextualizeError(
|
|
1008
1241
|
err,
|
|
1009
|
-
`
|
|
1010
|
-
`scopes=${scopes
|
|
1242
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1011
1244
|
);
|
|
1012
1245
|
}
|
|
1013
1246
|
});
|
|
@@ -1033,21 +1266,21 @@ export class PXE {
|
|
|
1033
1266
|
let anchorBlockNumber: BlockNumber;
|
|
1034
1267
|
|
|
1035
1268
|
await this.#putInJobQueue(async jobId => {
|
|
1036
|
-
await this
|
|
1269
|
+
await this.#maybeSync();
|
|
1037
1270
|
|
|
1038
1271
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1039
1272
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1040
1273
|
|
|
1041
1274
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1042
1275
|
|
|
1043
|
-
await ensureContractSynced(
|
|
1276
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1044
1277
|
filter.contractAddress,
|
|
1045
1278
|
null,
|
|
1046
|
-
async privateSyncCall =>
|
|
1047
|
-
await this.#
|
|
1048
|
-
this.node,
|
|
1049
|
-
this.contractStore,
|
|
1279
|
+
async (privateSyncCall, execScopes) =>
|
|
1280
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1050
1281
|
anchorBlockHeader,
|
|
1282
|
+
jobId,
|
|
1283
|
+
filter.scopes,
|
|
1051
1284
|
);
|
|
1052
1285
|
});
|
|
1053
1286
|
|
|
@@ -1062,9 +1295,11 @@ export class PXE {
|
|
|
1062
1295
|
}
|
|
1063
1296
|
|
|
1064
1297
|
/**
|
|
1065
|
-
* Stops the PXE's job queue.
|
|
1298
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1066
1299
|
*/
|
|
1067
|
-
public stop(): Promise<void> {
|
|
1068
|
-
|
|
1300
|
+
public async stop(): Promise<void> {
|
|
1301
|
+
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1303
|
+
await this.db.close();
|
|
1069
1304
|
}
|
|
1070
1305
|
}
|