@aztec/pxe 0.0.1-commit.96dac018d → 0.0.1-commit.993d240
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bin/check_oracle_version.d.ts +12 -2
- package/dest/bin/check_oracle_version.d.ts.map +1 -1
- package/dest/bin/check_oracle_version.js +31 -25
- package/dest/bin/index.d.ts +2 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +1 -0
- package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
- package/dest/block_synchronizer/block_stream_source.js +62 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +30 -10
- package/dest/config/index.d.ts +8 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +13 -15
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +16 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +53 -18
- 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_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 +4 -1
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +3 -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/event_validation_request.d.ts +4 -6
- 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_validation_request.d.ts +4 -7
- 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/oracle/interfaces.d.ts +67 -51
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
- package/dest/contract_function_simulator/oracle/oracle.d.ts +74 -45
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +471 -287
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +44 -70
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +96 -99
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +112 -67
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +395 -141
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +20 -3
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
- package/dest/contract_logging.d.ts +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +7 -8
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +87 -49
- package/dest/contract_sync/helpers.d.ts +2 -4
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +12 -14
- package/dest/debug/pxe_debug_utils.d.ts +3 -8
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +0 -6
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +13 -5
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +13 -5
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +3 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -2
- package/dest/entrypoints/server/utils.d.ts +4 -3
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +13 -5
- package/dest/events/event_service.d.ts +15 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +44 -11
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/hooks/authorize_utility_call.d.ts +41 -0
- package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
- package/dest/hooks/authorize_utility_call.js +4 -0
- package/dest/hooks/execution_hooks.d.ts +42 -0
- package/dest/hooks/execution_hooks.d.ts.map +1 -0
- package/dest/hooks/execution_hooks.js +9 -0
- package/dest/hooks/index.d.ts +4 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +1 -0
- package/dest/logs/log_service.d.ts +9 -9
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +122 -72
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +38 -0
- package/dest/notes/note_service.d.ts +27 -6
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +80 -56
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- package/dest/private_kernel/batch_planner.d.ts +47 -0
- package/dest/private_kernel/batch_planner.d.ts.map +1 -0
- package/dest/private_kernel/batch_planner.js +104 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +1 -1
- package/dest/private_kernel/hints/test_utils.d.ts +1 -1
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
- package/dest/private_kernel/hints/test_utils.js +2 -3
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +152 -59
- package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +24 -22
- package/dest/pxe.d.ts +61 -11
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +162 -97
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +591 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +9 -26
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/open_pxe_stores.d.ts +33 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +27 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +3 -0
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +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 +36 -37
- 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/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 +30 -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 +20 -17
- package/src/bin/check_oracle_version.ts +41 -31
- package/src/bin/index.ts +1 -0
- package/src/block_synchronizer/block_stream_source.ts +81 -0
- package/src/block_synchronizer/block_synchronizer.ts +33 -11
- package/src/config/index.ts +15 -9
- package/src/contract_function_simulator/contract_function_simulator.ts +82 -22
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
- package/src/contract_function_simulator/index.ts +3 -0
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +5 -10
- package/src/contract_function_simulator/noir-structs/option.ts +69 -0
- package/src/contract_function_simulator/oracle/interfaces.ts +85 -72
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle.ts +558 -484
- package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +120 -130
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +543 -221
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
- package/src/contract_logging.ts +18 -5
- package/src/contract_sync/contract_sync_service.ts +120 -83
- package/src/contract_sync/helpers.ts +13 -25
- package/src/debug/pxe_debug_utils.ts +3 -11
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +10 -5
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +10 -5
- package/src/entrypoints/pxe_creation_options.ts +14 -0
- package/src/entrypoints/server/index.ts +2 -2
- package/src/entrypoints/server/utils.ts +15 -6
- package/src/events/event_service.ts +69 -21
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/hooks/authorize_utility_call.ts +44 -0
- package/src/hooks/execution_hooks.ts +48 -0
- package/src/hooks/index.ts +7 -0
- package/src/logs/log_service.ts +153 -129
- package/src/messages/message_context_service.ts +45 -0
- package/src/notes/note_service.ts +119 -85
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +1 -1
- package/src/private_kernel/hints/test_utils.ts +2 -9
- package/src/private_kernel/private_kernel_execution_prover.ts +240 -82
- package/src/private_kernel/private_kernel_oracle.ts +35 -25
- package/src/pxe.ts +270 -102
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +14 -35
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +5 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/get_all_logs_by_tags.ts +78 -50
- 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 +2 -2
- 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/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- 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/access_scopes.ts +0 -9
- 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,
|
|
@@ -52,7 +52,6 @@ import {
|
|
|
52
52
|
|
|
53
53
|
import { inspect } from 'util';
|
|
54
54
|
|
|
55
|
-
import type { AccessScopes } from './access_scopes.js';
|
|
56
55
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
57
56
|
import type { PXEConfig } from './config/index.js';
|
|
58
57
|
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
@@ -67,7 +66,9 @@ import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
|
67
66
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
68
67
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
69
68
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
70
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
71
72
|
import {
|
|
72
73
|
PrivateKernelExecutionProver,
|
|
73
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -78,16 +79,26 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
|
|
|
78
79
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
79
80
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
80
81
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
82
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
81
83
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
82
84
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
83
85
|
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
84
86
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
87
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
85
88
|
|
|
86
89
|
export type PackedPrivateEvent = InTx & {
|
|
87
90
|
packedEvent: Fr[];
|
|
88
91
|
eventSelector: EventSelector;
|
|
89
92
|
};
|
|
90
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
|
+
|
|
91
102
|
/** Options for PXE.profileTx. */
|
|
92
103
|
export type ProfileTxOpts = {
|
|
93
104
|
/** The profiling mode to use. */
|
|
@@ -95,7 +106,9 @@ export type ProfileTxOpts = {
|
|
|
95
106
|
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
96
107
|
skipProofGeneration?: boolean;
|
|
97
108
|
/** Addresses whose private state and keys are accessible during private execution. */
|
|
98
|
-
scopes:
|
|
109
|
+
scopes: AztecAddress[];
|
|
110
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
111
|
+
senderForTags?: AztecAddress;
|
|
99
112
|
};
|
|
100
113
|
|
|
101
114
|
/** Options for PXE.simulateTx. */
|
|
@@ -106,10 +119,18 @@ export type SimulateTxOpts = {
|
|
|
106
119
|
skipTxValidation?: boolean;
|
|
107
120
|
/** If false, fees are enforced. */
|
|
108
121
|
skipFeeEnforcement?: boolean;
|
|
109
|
-
/**
|
|
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
|
+
*/
|
|
110
129
|
overrides?: SimulationOverrides;
|
|
111
130
|
/** Addresses whose private state and keys are accessible during private execution */
|
|
112
|
-
scopes:
|
|
131
|
+
scopes: AztecAddress[];
|
|
132
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
133
|
+
senderForTags?: AztecAddress;
|
|
113
134
|
};
|
|
114
135
|
|
|
115
136
|
/** Options for PXE.executeUtility. */
|
|
@@ -117,7 +138,22 @@ export type ExecuteUtilityOpts = {
|
|
|
117
138
|
/** The authentication witnesses required for the function call. */
|
|
118
139
|
authwits?: AuthWitness[];
|
|
119
140
|
/** The accounts whose notes we can access in this call */
|
|
120
|
-
scopes:
|
|
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 }>>;
|
|
121
157
|
};
|
|
122
158
|
|
|
123
159
|
/** Args for PXE.create. */
|
|
@@ -132,10 +168,14 @@ export type PXECreateArgs = {
|
|
|
132
168
|
simulator: CircuitSimulator;
|
|
133
169
|
/** Provider for protocol contract artifacts and instances. */
|
|
134
170
|
protocolContractsProvider: ProtocolContractsProvider;
|
|
171
|
+
/** Provider for the "nice to have" contracts the PXE preloads. */
|
|
172
|
+
preloadedContractsProvider: PreloadedContractsProvider;
|
|
135
173
|
/** PXE configuration options. */
|
|
136
174
|
config: PXEConfig;
|
|
137
175
|
/** Optional logger instance or string suffix for the logger name. */
|
|
138
176
|
loggerOrSuffix?: string | Logger;
|
|
177
|
+
/** Optional hooks to observe and influence contract execution. */
|
|
178
|
+
hooks?: ExecutionHooks;
|
|
139
179
|
};
|
|
140
180
|
|
|
141
181
|
/**
|
|
@@ -145,6 +185,7 @@ export type PXECreateArgs = {
|
|
|
145
185
|
export class PXE {
|
|
146
186
|
private constructor(
|
|
147
187
|
private node: AztecNode,
|
|
188
|
+
private db: AztecAsyncKVStore,
|
|
148
189
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
149
190
|
private keyStore: KeyStore,
|
|
150
191
|
private contractStore: ContractStore,
|
|
@@ -157,14 +198,19 @@ export class PXE {
|
|
|
157
198
|
private addressStore: AddressStore,
|
|
158
199
|
private privateEventStore: PrivateEventStore,
|
|
159
200
|
private contractSyncService: ContractSyncService,
|
|
201
|
+
private messageContextService: MessageContextService,
|
|
202
|
+
private l2TipsStore: L2TipsProvider,
|
|
160
203
|
private simulator: CircuitSimulator,
|
|
161
204
|
private proverEnabled: boolean,
|
|
205
|
+
private autoSync: boolean,
|
|
162
206
|
private proofCreator: PrivateKernelProver,
|
|
163
207
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
208
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
164
209
|
private log: Logger,
|
|
165
210
|
private jobQueue: SerialQueue,
|
|
166
211
|
private jobCoordinator: JobCoordinator,
|
|
167
212
|
public debug: PXEDebugUtils,
|
|
213
|
+
private hooks: ExecutionHooks | undefined,
|
|
168
214
|
) {}
|
|
169
215
|
|
|
170
216
|
/**
|
|
@@ -180,8 +226,10 @@ export class PXE {
|
|
|
180
226
|
proofCreator,
|
|
181
227
|
simulator,
|
|
182
228
|
protocolContractsProvider,
|
|
229
|
+
preloadedContractsProvider,
|
|
183
230
|
config,
|
|
184
231
|
loggerOrSuffix,
|
|
232
|
+
hooks,
|
|
185
233
|
}: PXECreateArgs) {
|
|
186
234
|
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
187
235
|
const bindings: LoggerBindings | undefined =
|
|
@@ -194,31 +242,43 @@ export class PXE {
|
|
|
194
242
|
|
|
195
243
|
const info = await node.getNodeInfo();
|
|
196
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
|
+
|
|
197
253
|
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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);
|
|
209
267
|
const contractSyncService = new ContractSyncService(
|
|
210
268
|
node,
|
|
211
269
|
contractStore,
|
|
212
270
|
noteStore,
|
|
213
271
|
createLogger('pxe:contract_sync', bindings),
|
|
214
272
|
);
|
|
273
|
+
const messageContextService = new MessageContextService(node);
|
|
274
|
+
|
|
215
275
|
const synchronizer = new BlockSynchronizer(
|
|
216
276
|
node,
|
|
217
277
|
store,
|
|
218
278
|
anchorBlockStore,
|
|
219
279
|
noteStore,
|
|
220
280
|
privateEventStore,
|
|
221
|
-
|
|
281
|
+
l2TipsStore,
|
|
222
282
|
contractSyncService,
|
|
223
283
|
config,
|
|
224
284
|
bindings,
|
|
@@ -240,6 +300,7 @@ export class PXE {
|
|
|
240
300
|
|
|
241
301
|
const pxe = new PXE(
|
|
242
302
|
node,
|
|
303
|
+
store,
|
|
243
304
|
synchronizer,
|
|
244
305
|
keyStore,
|
|
245
306
|
contractStore,
|
|
@@ -252,14 +313,19 @@ export class PXE {
|
|
|
252
313
|
addressStore,
|
|
253
314
|
privateEventStore,
|
|
254
315
|
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
255
318
|
simulator,
|
|
256
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
257
321
|
proofCreator,
|
|
258
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
259
324
|
log,
|
|
260
325
|
jobQueue,
|
|
261
326
|
jobCoordinator,
|
|
262
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
263
329
|
);
|
|
264
330
|
|
|
265
331
|
debugUtils.setPXEHelpers(
|
|
@@ -270,7 +336,7 @@ export class PXE {
|
|
|
270
336
|
|
|
271
337
|
pxe.jobQueue.start();
|
|
272
338
|
|
|
273
|
-
await pxe.#registerProtocolContracts();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
274
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
275
341
|
return pxe;
|
|
276
342
|
}
|
|
@@ -286,6 +352,7 @@ export class PXE {
|
|
|
286
352
|
keyStore: this.keyStore,
|
|
287
353
|
addressStore: this.addressStore,
|
|
288
354
|
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
355
|
+
l2TipsStore: this.l2TipsStore,
|
|
289
356
|
senderTaggingStore: this.senderTaggingStore,
|
|
290
357
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
291
358
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
@@ -293,6 +360,8 @@ export class PXE {
|
|
|
293
360
|
privateEventStore: this.privateEventStore,
|
|
294
361
|
simulator: this.simulator,
|
|
295
362
|
contractSyncService: this.contractSyncService,
|
|
363
|
+
messageContextService: this.messageContextService,
|
|
364
|
+
hooks: this.hooks,
|
|
296
365
|
});
|
|
297
366
|
}
|
|
298
367
|
|
|
@@ -343,29 +412,48 @@ export class PXE {
|
|
|
343
412
|
}
|
|
344
413
|
|
|
345
414
|
async #registerProtocolContracts() {
|
|
346
|
-
const registered
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
+
);
|
|
353
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
354
427
|
}
|
|
355
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
|
+
|
|
356
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
357
438
|
// functions that might arise.
|
|
358
|
-
async #executePrivate(
|
|
359
|
-
contractFunctionSimulator
|
|
360
|
-
txRequest
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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> {
|
|
364
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
365
455
|
|
|
366
456
|
try {
|
|
367
|
-
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
368
|
-
|
|
369
457
|
await this.contractSyncService.ensureContractSynced(
|
|
370
458
|
contractAddress,
|
|
371
459
|
functionSelector,
|
|
@@ -382,6 +470,7 @@ export class PXE {
|
|
|
382
470
|
anchorBlockHeader,
|
|
383
471
|
scopes,
|
|
384
472
|
jobId,
|
|
473
|
+
senderForTags,
|
|
385
474
|
});
|
|
386
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
387
476
|
return result;
|
|
@@ -407,12 +496,19 @@ export class PXE {
|
|
|
407
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
408
497
|
call: FunctionCall,
|
|
409
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
410
|
-
scopes:
|
|
499
|
+
scopes: AztecAddress[],
|
|
411
500
|
jobId: string,
|
|
412
501
|
) {
|
|
413
502
|
try {
|
|
414
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
415
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
416
512
|
} catch (err) {
|
|
417
513
|
if (err instanceof SimulationError) {
|
|
418
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -427,11 +523,11 @@ export class PXE {
|
|
|
427
523
|
* It can also be used for estimating gas in the future.
|
|
428
524
|
* @param tx - The transaction to be simulated.
|
|
429
525
|
*/
|
|
430
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
431
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
432
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
433
529
|
try {
|
|
434
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
435
531
|
if (result.revertReason) {
|
|
436
532
|
throw result.revertReason;
|
|
437
533
|
}
|
|
@@ -463,11 +559,10 @@ export class PXE {
|
|
|
463
559
|
txExecutionRequest: TxExecutionRequest,
|
|
464
560
|
proofCreator: PrivateKernelProver,
|
|
465
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
466
563
|
config: PrivateKernelExecutionProverConfig,
|
|
467
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
468
|
-
const
|
|
469
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
470
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
565
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
471
566
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
472
567
|
kernelOracle,
|
|
473
568
|
proofCreator,
|
|
@@ -478,14 +573,36 @@ export class PXE {
|
|
|
478
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
479
574
|
}
|
|
480
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
|
+
|
|
481
587
|
// Public API
|
|
482
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
|
+
|
|
483
598
|
/**
|
|
484
599
|
* Returns the block header up to which the PXE has synced.
|
|
485
600
|
* @returns The synced block header
|
|
486
601
|
*/
|
|
487
602
|
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
488
|
-
return this
|
|
603
|
+
return this.#putInJobQueue(() => {
|
|
604
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
605
|
+
});
|
|
489
606
|
}
|
|
490
607
|
|
|
491
608
|
/**
|
|
@@ -519,7 +636,7 @@ export class PXE {
|
|
|
519
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
520
637
|
const accounts = await this.keyStore.getAccounts();
|
|
521
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
522
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
523
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
524
641
|
return accountCompleteAddress;
|
|
525
642
|
} else {
|
|
@@ -542,8 +659,14 @@ export class PXE {
|
|
|
542
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
543
660
|
*/
|
|
544
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
|
+
|
|
545
668
|
const accounts = await this.keyStore.getAccounts();
|
|
546
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
547
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
548
671
|
return sender;
|
|
549
672
|
}
|
|
@@ -552,6 +675,9 @@ export class PXE {
|
|
|
552
675
|
|
|
553
676
|
if (wasAdded) {
|
|
554
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()));
|
|
555
681
|
} else {
|
|
556
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
557
683
|
}
|
|
@@ -635,7 +761,9 @@ export class PXE {
|
|
|
635
761
|
const publicFunctionSignatures = artifact.functions
|
|
636
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
637
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
638
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
639
767
|
} else {
|
|
640
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
641
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -670,7 +798,7 @@ export class PXE {
|
|
|
670
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
671
799
|
}
|
|
672
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
673
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
674
802
|
|
|
675
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
676
804
|
|
|
@@ -682,7 +810,9 @@ export class PXE {
|
|
|
682
810
|
const publicFunctionSignatures = artifact.functions
|
|
683
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
684
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
685
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
686
816
|
|
|
687
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
688
818
|
await Promise.all([
|
|
@@ -711,7 +841,7 @@ export class PXE {
|
|
|
711
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
712
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
713
843
|
*/
|
|
714
|
-
public proveTx(txRequest: TxExecutionRequest, scopes:
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
715
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
716
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
717
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -719,17 +849,25 @@ export class PXE {
|
|
|
719
849
|
const totalTimer = new Timer();
|
|
720
850
|
try {
|
|
721
851
|
const syncTimer = new Timer();
|
|
722
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
723
854
|
const syncTime = syncTimer.ms();
|
|
724
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
725
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
726
864
|
|
|
727
865
|
const {
|
|
728
866
|
publicInputs,
|
|
729
867
|
chonkProof,
|
|
730
868
|
executionSteps,
|
|
731
869
|
timings: { proving } = {},
|
|
732
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
733
871
|
simulate: false,
|
|
734
872
|
skipFeeEnforcement: false,
|
|
735
873
|
profileMode: 'none',
|
|
@@ -759,23 +897,20 @@ export class PXE {
|
|
|
759
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
760
898
|
});
|
|
761
899
|
|
|
762
|
-
//
|
|
763
|
-
//
|
|
764
|
-
//
|
|
765
|
-
//
|
|
766
|
-
//
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
} else {
|
|
777
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
778
|
-
}
|
|
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
|
+
);
|
|
779
914
|
|
|
780
915
|
return txProvingResult;
|
|
781
916
|
} catch (err: any) {
|
|
@@ -792,7 +927,7 @@ export class PXE {
|
|
|
792
927
|
*/
|
|
793
928
|
public profileTx(
|
|
794
929
|
txRequest: TxExecutionRequest,
|
|
795
|
-
{ profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
796
931
|
): Promise<TxProfileResult> {
|
|
797
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
798
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -811,16 +946,25 @@ export class PXE {
|
|
|
811
946
|
txInfo,
|
|
812
947
|
);
|
|
813
948
|
const syncTimer = new Timer();
|
|
814
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
815
951
|
const syncTime = syncTimer.ms();
|
|
816
952
|
|
|
817
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
818
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
955
|
+
contractFunctionSimulator,
|
|
956
|
+
txRequest,
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
959
|
+
jobId,
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
819
962
|
|
|
820
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
821
964
|
txRequest,
|
|
822
965
|
this.proofCreator,
|
|
823
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
824
968
|
{
|
|
825
969
|
simulate: skipProofGeneration,
|
|
826
970
|
skipFeeEnforcement: false,
|
|
@@ -881,7 +1025,15 @@ export class PXE {
|
|
|
881
1025
|
*/
|
|
882
1026
|
public simulateTx(
|
|
883
1027
|
txRequest: TxExecutionRequest,
|
|
884
|
-
{
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
885
1037
|
): Promise<TxSimulationResult> {
|
|
886
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
887
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -902,24 +1054,26 @@ export class PXE {
|
|
|
902
1054
|
txInfo,
|
|
903
1055
|
);
|
|
904
1056
|
const syncTimer = new Timer();
|
|
905
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
906
1059
|
const syncTime = syncTimer.ms();
|
|
907
1060
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
913
|
-
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
914
|
-
const skipKernels = hasOverriddenContracts;
|
|
915
|
-
|
|
916
|
-
// Set overridden contracts on the sync service so it knows to skip syncing them
|
|
917
|
-
if (hasOverriddenContracts) {
|
|
918
|
-
this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
|
|
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
|
+
);
|
|
919
1065
|
}
|
|
1066
|
+
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
920
1067
|
|
|
921
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
922
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
923
1077
|
|
|
924
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
925
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -932,11 +1086,17 @@ export class PXE {
|
|
|
932
1086
|
));
|
|
933
1087
|
} else {
|
|
934
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
935
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
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
|
+
));
|
|
940
1100
|
}
|
|
941
1101
|
|
|
942
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -945,7 +1105,7 @@ export class PXE {
|
|
|
945
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
946
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
947
1107
|
const publicSimulationTimer = new Timer();
|
|
948
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
949
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
950
1110
|
if (publicOutput?.debugLogs?.length) {
|
|
951
1111
|
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
@@ -958,7 +1118,8 @@ export class PXE {
|
|
|
958
1118
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
959
1119
|
validationTime = validationTimer.ms();
|
|
960
1120
|
if (validationResult.result === 'invalid') {
|
|
961
|
-
|
|
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}`);
|
|
962
1123
|
}
|
|
963
1124
|
}
|
|
964
1125
|
|
|
@@ -1009,7 +1170,7 @@ export class PXE {
|
|
|
1009
1170
|
inspect(txRequest),
|
|
1010
1171
|
`simulatePublic=${simulatePublic}`,
|
|
1011
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
1012
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1013
1174
|
);
|
|
1014
1175
|
}
|
|
1015
1176
|
});
|
|
@@ -1021,7 +1182,7 @@ export class PXE {
|
|
|
1021
1182
|
*/
|
|
1022
1183
|
public executeUtility(
|
|
1023
1184
|
call: FunctionCall,
|
|
1024
|
-
{ authwits, scopes }: ExecuteUtilityOpts = { scopes:
|
|
1185
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1025
1186
|
): Promise<UtilityExecutionResult> {
|
|
1026
1187
|
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1027
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -1030,7 +1191,7 @@ export class PXE {
|
|
|
1030
1191
|
try {
|
|
1031
1192
|
const totalTimer = new Timer();
|
|
1032
1193
|
const syncTimer = new Timer();
|
|
1033
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
1034
1195
|
const syncTime = syncTimer.ms();
|
|
1035
1196
|
const functionTimer = new Timer();
|
|
1036
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
@@ -1046,7 +1207,7 @@ export class PXE {
|
|
|
1046
1207
|
scopes,
|
|
1047
1208
|
);
|
|
1048
1209
|
|
|
1049
|
-
const executionResult = await this.#executeUtility(
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
1050
1211
|
contractFunctionSimulator,
|
|
1051
1212
|
call,
|
|
1052
1213
|
authwits ?? [],
|
|
@@ -1067,14 +1228,19 @@ export class PXE {
|
|
|
1067
1228
|
};
|
|
1068
1229
|
|
|
1069
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1070
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
1071
1237
|
} catch (err: any) {
|
|
1072
1238
|
const { to, name, args } = call;
|
|
1073
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1074
1240
|
throw this.#contextualizeError(
|
|
1075
1241
|
err,
|
|
1076
1242
|
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1077
|
-
`scopes=${scopes
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1078
1244
|
);
|
|
1079
1245
|
}
|
|
1080
1246
|
});
|
|
@@ -1100,7 +1266,7 @@ export class PXE {
|
|
|
1100
1266
|
let anchorBlockNumber: BlockNumber;
|
|
1101
1267
|
|
|
1102
1268
|
await this.#putInJobQueue(async jobId => {
|
|
1103
|
-
await this
|
|
1269
|
+
await this.#maybeSync();
|
|
1104
1270
|
|
|
1105
1271
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1106
1272
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
@@ -1129,9 +1295,11 @@ export class PXE {
|
|
|
1129
1295
|
}
|
|
1130
1296
|
|
|
1131
1297
|
/**
|
|
1132
|
-
* Stops the PXE's job queue.
|
|
1298
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1133
1299
|
*/
|
|
1134
|
-
public stop(): Promise<void> {
|
|
1135
|
-
|
|
1300
|
+
public async stop(): Promise<void> {
|
|
1301
|
+
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1303
|
+
await this.db.close();
|
|
1136
1304
|
}
|
|
1137
1305
|
}
|