@aztec/pxe 0.0.1-commit.2ed92850 → 0.0.1-commit.3100065
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 +45 -111
- 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 +51 -0
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
- package/dest/bin/oracle_version_helpers.js +254 -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 +37 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +24 -14
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +92 -30
- package/dest/config/index.d.ts +9 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +14 -15
- package/dest/config/package_info.js +1 -1
- package/dest/contract/contract_class_service.d.ts +31 -0
- package/dest/contract/contract_class_service.d.ts.map +1 -0
- package/dest/contract/contract_class_service.js +68 -0
- package/dest/contract/contract_sync_service.d.ts +48 -0
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/contract/contract_sync_service.js +116 -0
- package/dest/contract/helpers.d.ts +7 -0
- package/dest/contract/helpers.d.ts.map +1 -0
- package/dest/contract/helpers.js +20 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +72 -36
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +265 -97
- 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 +4 -10
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +8 -28
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -11
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
- package/dest/contract_function_simulator/index.d.ts +26 -5
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +12 -3
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +29 -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 +30 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -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 +9 -10
- package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
- package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +19 -10
- 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 +12 -24
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +11 -9
- 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 -63
- 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 +8 -12
- package/dest/contract_function_simulator/noir-structs/option.d.ts +59 -0
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/option.js +67 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -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 +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
- package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
- package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/index.js +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -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/legacy_oracle_registry.d.ts +39 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
- 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_registry.d.ts +138 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +1007 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +222 -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 +1243 -0
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +7 -6
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +82 -97
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +257 -115
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +206 -88
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +592 -194
- 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/transient_array_service.d.ts +31 -0
- package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/transient_array_service.js +62 -0
- 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/debug/pxe_debug_utils.d.ts +19 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +22 -18
- package/dest/entrypoints/client/bundle/index.d.ts +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +39 -12
- package/dest/entrypoints/client/lazy/index.d.ts +3 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +2 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +3 -3
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +40 -13
- package/dest/entrypoints/pxe_creation_options.d.ts +18 -3
- 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 +7 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +5 -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 +47 -14
- package/dest/error_enriching.d.ts +5 -3
- package/dest/error_enriching.d.ts.map +1 -1
- package/dest/error_enriching.js +13 -11
- package/dest/events/event_service.d.ts +16 -8
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +46 -14
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/hooks/authorize_utility_call.d.ts +41 -0
- package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
- package/dest/hooks/authorize_utility_call.js +4 -0
- package/dest/hooks/execution_hooks.d.ts +62 -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 +5 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +2 -0
- package/dest/hooks/resolve_custom_request.d.ts +23 -0
- package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
- package/dest/hooks/resolve_custom_request.js +3 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
- package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
- package/dest/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +16 -13
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +192 -97
- package/dest/messages/tx_resolver_service.d.ts +17 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/tx_resolver_service.js +55 -0
- package/dest/notes/note_service.d.ts +29 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +89 -65
- package/dest/notes_filter.d.ts +24 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- package/dest/private_kernel/batch_planner.d.ts +47 -0
- package/dest/private_kernel/batch_planner.d.ts.map +1 -0
- package/dest/private_kernel/batch_planner.js +104 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +135 -70
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +202 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +7 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +165 -83
- package/dest/private_kernel/private_kernel_oracle.d.ts +17 -11
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +47 -29
- package/dest/pxe.d.ts +228 -66
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +411 -229
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/allowed_scopes.d.ts +6 -0
- package/dest/storage/allowed_scopes.d.ts.map +1 -0
- package/dest/storage/allowed_scopes.js +7 -0
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +12 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +12 -3
- 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 +671 -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 +47 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +42 -36
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +63 -33
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +192 -135
- package/dest/storage/fact_store/fact_service.d.ts +22 -0
- package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_service.js +45 -0
- package/dest/storage/fact_store/fact_store.d.ts +95 -0
- package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store.js +408 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store_keys.js +50 -0
- package/dest/storage/fact_store/index.d.ts +6 -0
- package/dest/storage/fact_store/index.d.ts.map +1 -0
- package/dest/storage/fact_store/index.js +4 -0
- package/dest/storage/fact_store/origin_state.d.ts +57 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +53 -0
- package/dest/storage/fact_store/stored_fact.d.ts +32 -0
- package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
- package/dest/storage/fact_store/stored_fact.js +64 -0
- package/dest/storage/index.d.ts +3 -2
- package/dest/storage/index.d.ts.map +1 -1
- package/dest/storage/index.js +2 -1
- package/dest/storage/metadata.d.ts +2 -2
- package/dest/storage/metadata.d.ts.map +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +48 -29
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +261 -192
- package/dest/storage/note_store/stored_note.d.ts +3 -8
- package/dest/storage/note_store/stored_note.d.ts.map +1 -1
- package/dest/storage/note_store/stored_note.js +4 -20
- package/dest/storage/open_pxe_stores.d.ts +35 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +29 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +102 -79
- package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
- package/dest/storage/private_event_store/stored_private_event.js +2 -2
- package/dest/storage/tagging_store/index.d.ts +2 -2
- package/dest/storage/tagging_store/index.d.ts.map +1 -1
- package/dest/storage/tagging_store/index.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/recipient_tagging_store.js +31 -19
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +233 -137
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
- package/dest/tagging/constants.d.ts +2 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +18 -9
- package/dest/tagging/get_all_logs_by_tags.d.ts +35 -11
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +45 -32
- package/dest/tagging/index.d.ts +6 -5
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +4 -3
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +69 -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 +203 -0
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -10
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +32 -14
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +41 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +6 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +37 -25
- package/package.json +29 -17
- package/src/bin/check_oracle_version.ts +51 -133
- package/src/bin/index.ts +5 -0
- package/src/bin/oracle_version_helpers.ts +311 -0
- package/src/block_synchronizer/block_stream_source.ts +42 -0
- package/src/block_synchronizer/block_synchronizer.ts +117 -50
- package/src/config/index.ts +16 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract/contract_class_service.ts +83 -0
- package/src/contract/contract_sync_service.ts +176 -0
- package/src/contract/helpers.ts +35 -0
- package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
- package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +466 -159
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_note_cache.ts +8 -29
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
- package/src/contract_function_simulator/index.ts +69 -4
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +43 -0
- package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
- package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
- package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
- package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
- package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +27 -20
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +14 -64
- package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -11
- package/src/contract_function_simulator/noir-structs/option.ts +75 -0
- package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
- package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
- package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
- package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
- package/src/contract_function_simulator/oracle/index.ts +1 -15
- package/src/contract_function_simulator/oracle/interfaces.ts +11 -176
- package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
- package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle_registry.ts +706 -0
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +964 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +6 -7
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +315 -219
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +921 -276
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/transient_array_service.ts +91 -0
- package/src/contract_logging.ts +52 -0
- package/src/debug/pxe_debug_utils.ts +55 -19
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +34 -21
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +36 -22
- package/src/entrypoints/pxe_creation_options.ts +23 -2
- package/src/entrypoints/server/index.ts +7 -2
- package/src/entrypoints/server/utils.ts +46 -33
- package/src/error_enriching.ts +27 -11
- package/src/events/event_service.ts +70 -24
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/hooks/authorize_utility_call.ts +44 -0
- package/src/hooks/execution_hooks.ts +68 -0
- package/src/hooks/index.ts +13 -0
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +236 -165
- package/src/messages/tx_resolver_service.ts +69 -0
- package/src/notes/note_service.ts +124 -91
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +176 -119
- package/src/private_kernel/hints/test_utils.ts +318 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +257 -119
- package/src/private_kernel/private_kernel_oracle.ts +65 -36
- package/src/pxe.ts +712 -303
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/anchor_block_store/anchor_block_store.ts +12 -2
- 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__/FactStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +56 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +26 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +117 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +803 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +85 -0
- package/src/storage/capsule_store/capsule_store.ts +52 -34
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +249 -167
- package/src/storage/fact_store/fact_service.ts +69 -0
- package/src/storage/fact_store/fact_store.ts +487 -0
- package/src/storage/fact_store/fact_store_keys.ts +75 -0
- package/src/storage/fact_store/index.ts +14 -0
- package/src/storage/fact_store/origin_state.ts +75 -0
- package/src/storage/fact_store/stored_fact.ts +80 -0
- package/src/storage/index.ts +2 -1
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +297 -224
- package/src/storage/note_store/stored_note.ts +5 -27
- package/src/storage/open_pxe_stores.ts +52 -0
- package/src/storage/private_event_store/private_event_store.ts +127 -108
- package/src/storage/private_event_store/stored_private_event.ts +3 -3
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +34 -24
- package/src/storage/tagging_store/sender_tagging_store.ts +287 -156
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +19 -9
- package/src/tagging/get_all_logs_by_tags.ts +90 -38
- package/src/tagging/index.ts +5 -4
- package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +301 -0
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +4 -4
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +54 -19
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +44 -14
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +30 -30
- package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -60
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/oracle.js +0 -356
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -80
- package/dest/contract_sync/index.d.ts +0 -23
- package/dest/contract_sync/index.d.ts.map +0 -1
- package/dest/contract_sync/index.js +0 -54
- 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/storage/tagging_store/sender_address_book_store.d.ts +0 -14
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +0 -30
- 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/contract_function_simulator/oracle/oracle.ts +0 -620
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -83
- package/src/contract_sync/index.ts +0 -98
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -42
- 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
|
@@ -2,22 +2,28 @@ import {
|
|
|
2
2
|
AVM_EMITNOTEHASH_BASE_L2_GAS,
|
|
3
3
|
AVM_EMITNULLIFIER_BASE_L2_GAS,
|
|
4
4
|
AVM_SENDL2TOL1MSG_BASE_L2_GAS,
|
|
5
|
-
|
|
6
|
-
DA_GAS_PER_BYTE,
|
|
5
|
+
DA_GAS_PER_FIELD,
|
|
7
6
|
FIXED_AVM_STARTUP_L2_GAS,
|
|
8
|
-
FIXED_DA_GAS,
|
|
9
|
-
FIXED_L2_GAS,
|
|
10
7
|
L2_GAS_PER_CONTRACT_CLASS_LOG,
|
|
8
|
+
L2_GAS_PER_L2_TO_L1_MSG,
|
|
9
|
+
L2_GAS_PER_NOTE_HASH,
|
|
10
|
+
L2_GAS_PER_NULLIFIER,
|
|
11
11
|
L2_GAS_PER_PRIVATE_LOG,
|
|
12
12
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
13
13
|
MAX_ENQUEUED_CALLS_PER_TX,
|
|
14
14
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
15
15
|
MAX_NOTE_HASHES_PER_TX,
|
|
16
|
+
MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
|
|
16
17
|
MAX_NULLIFIERS_PER_TX,
|
|
18
|
+
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
17
19
|
MAX_PRIVATE_LOGS_PER_TX,
|
|
20
|
+
MAX_TX_LIFETIME,
|
|
21
|
+
PRIVATE_TX_L2_GAS_OVERHEAD,
|
|
22
|
+
PUBLIC_DATA_WRITE_LENGTH,
|
|
23
|
+
PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
24
|
+
TX_DA_GAS_OVERHEAD,
|
|
18
25
|
} from '@aztec/constants';
|
|
19
26
|
import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
|
|
20
|
-
import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
|
|
21
27
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
22
28
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
23
29
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -37,119 +43,204 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
|
37
43
|
import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
|
|
38
44
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
39
45
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
46
|
+
import type { BlockParameter, L2TipsProvider } from '@aztec/stdlib/block';
|
|
40
47
|
import { Gas } from '@aztec/stdlib/gas';
|
|
41
48
|
import {
|
|
42
49
|
computeNoteHashNonce,
|
|
43
50
|
computeProtocolNullifier,
|
|
51
|
+
computeSiloedPrivateLogFirstField,
|
|
44
52
|
computeUniqueNoteHash,
|
|
45
53
|
siloNoteHash,
|
|
46
54
|
siloNullifier,
|
|
47
55
|
} from '@aztec/stdlib/hash';
|
|
48
56
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
49
57
|
import {
|
|
58
|
+
ClaimedLengthArray,
|
|
50
59
|
PartialPrivateTailPublicInputsForPublic,
|
|
51
60
|
PartialPrivateTailPublicInputsForRollup,
|
|
52
61
|
type PrivateExecutionStep,
|
|
53
62
|
type PrivateKernelExecutionProofOutput,
|
|
54
63
|
PrivateKernelTailCircuitPublicInputs,
|
|
64
|
+
PrivateLogData,
|
|
55
65
|
PrivateToPublicAccumulatedData,
|
|
56
66
|
PrivateToRollupAccumulatedData,
|
|
57
67
|
PublicCallRequest,
|
|
68
|
+
ReadRequestActionEnum,
|
|
58
69
|
ScopedLogHash,
|
|
70
|
+
ScopedNoteHash,
|
|
71
|
+
ScopedNullifier,
|
|
72
|
+
ScopedReadRequest,
|
|
73
|
+
buildTransientDataHints,
|
|
74
|
+
getNoteHashReadRequestResetActions,
|
|
75
|
+
getNullifierReadRequestResetActions,
|
|
59
76
|
} from '@aztec/stdlib/kernel';
|
|
60
77
|
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
61
78
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
62
79
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
80
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
63
81
|
import {
|
|
64
82
|
BlockHeader,
|
|
65
83
|
CallContext,
|
|
84
|
+
type ContractOverrides,
|
|
66
85
|
HashedValues,
|
|
86
|
+
type OffchainEffect,
|
|
67
87
|
PrivateExecutionResult,
|
|
68
88
|
TxConstantData,
|
|
69
89
|
TxExecutionRequest,
|
|
70
90
|
collectNested,
|
|
91
|
+
collectNoteHashNullifierCounterMap,
|
|
71
92
|
getFinalMinRevertibleSideEffectCounter,
|
|
72
93
|
} from '@aztec/stdlib/tx';
|
|
73
94
|
|
|
95
|
+
import type { ContractClassService } from '../contract/contract_class_service.js';
|
|
96
|
+
import type { ContractSyncService } from '../contract/contract_sync_service.js';
|
|
97
|
+
import type { ExecutionHooks } from '../hooks/index.js';
|
|
98
|
+
import type { TxResolverService } from '../messages/tx_resolver_service.js';
|
|
74
99
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
75
|
-
import
|
|
100
|
+
import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
|
|
76
101
|
import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
77
102
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
103
|
+
import { FactService } from '../storage/fact_store/index.js';
|
|
104
|
+
import type { FactStore } from '../storage/fact_store/index.js';
|
|
78
105
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
79
106
|
import type { PrivateEventStore } from '../storage/private_event_store/private_event_store.js';
|
|
80
107
|
import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js';
|
|
81
|
-
import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js';
|
|
82
108
|
import type { SenderTaggingStore } from '../storage/tagging_store/sender_tagging_store.js';
|
|
109
|
+
import type { TaggingSecretSourcesStore } from '../storage/tagging_store/tagging_secret_sources_store.js';
|
|
110
|
+
import { AnchoredContractData } from './anchored_contract_data.js';
|
|
83
111
|
import type { BenchmarkedNode } from './benchmarked_node.js';
|
|
84
112
|
import { ExecutionNoteCache } from './execution_note_cache.js';
|
|
85
113
|
import { ExecutionTaggingIndexCache } from './execution_tagging_index_cache.js';
|
|
86
114
|
import { HashedValuesCache } from './hashed_values_cache.js';
|
|
87
|
-
import {
|
|
115
|
+
import { buildACIRCallback } from './oracle/acir_callback.js';
|
|
88
116
|
import { executePrivateFunction } from './oracle/private_execution.js';
|
|
89
117
|
import { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
|
|
90
118
|
import { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
119
|
+
import { TransientArrayService } from './transient_array_service.js';
|
|
120
|
+
|
|
121
|
+
/** Options for ContractFunctionSimulator.run. */
|
|
122
|
+
export type ContractSimulatorRunOpts = {
|
|
123
|
+
/** The address calling the function. Can be replaced to simulate a call from another contract or account. */
|
|
124
|
+
msgSender?: AztecAddress;
|
|
125
|
+
/** The block header to use as base state for this run. */
|
|
126
|
+
anchorBlockHeader: BlockHeader;
|
|
127
|
+
/** The address used as a tagging sender when emitting private logs. */
|
|
128
|
+
senderForTags?: AztecAddress;
|
|
129
|
+
/** The accounts whose notes we can access in this call. */
|
|
130
|
+
scopes: AztecAddress[];
|
|
131
|
+
/** The job ID for staged writes. */
|
|
132
|
+
jobId: string;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/** Args for ContractFunctionSimulator constructor. */
|
|
136
|
+
export type ContractFunctionSimulatorArgs = {
|
|
137
|
+
contractStore: ContractStore;
|
|
138
|
+
contractClassService: ContractClassService;
|
|
139
|
+
/** Per-simulation contract overrides. */
|
|
140
|
+
overrides?: ContractOverrides;
|
|
141
|
+
noteStore: NoteStore;
|
|
142
|
+
keyStore: KeyStore;
|
|
143
|
+
addressStore: AddressStore;
|
|
144
|
+
aztecNode: AztecNode;
|
|
145
|
+
l2TipsStore: L2TipsProvider;
|
|
146
|
+
senderTaggingStore: SenderTaggingStore;
|
|
147
|
+
recipientTaggingStore: RecipientTaggingStore;
|
|
148
|
+
taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
149
|
+
capsuleStore: CapsuleStore;
|
|
150
|
+
factStore: FactStore;
|
|
151
|
+
privateEventStore: PrivateEventStore;
|
|
152
|
+
simulator: CircuitSimulator;
|
|
153
|
+
contractSyncService: ContractSyncService;
|
|
154
|
+
txResolver: TxResolverService;
|
|
155
|
+
hooks?: ExecutionHooks;
|
|
156
|
+
};
|
|
91
157
|
|
|
92
158
|
/**
|
|
93
159
|
* The contract function simulator.
|
|
94
160
|
*/
|
|
95
161
|
export class ContractFunctionSimulator {
|
|
96
|
-
private log: Logger;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
162
|
+
private readonly log: Logger;
|
|
163
|
+
private readonly contractStore: ContractStore;
|
|
164
|
+
private readonly contractClassService: ContractClassService;
|
|
165
|
+
private readonly overrides: ContractOverrides | undefined;
|
|
166
|
+
private readonly noteStore: NoteStore;
|
|
167
|
+
private readonly keyStore: KeyStore;
|
|
168
|
+
private readonly addressStore: AddressStore;
|
|
169
|
+
private readonly aztecNode: AztecNode;
|
|
170
|
+
private readonly l2TipsStore: L2TipsProvider;
|
|
171
|
+
private readonly senderTaggingStore: SenderTaggingStore;
|
|
172
|
+
private readonly recipientTaggingStore: RecipientTaggingStore;
|
|
173
|
+
private readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
174
|
+
private readonly capsuleStore: CapsuleStore;
|
|
175
|
+
private readonly factStore: FactStore;
|
|
176
|
+
private readonly privateEventStore: PrivateEventStore;
|
|
177
|
+
private readonly simulator: CircuitSimulator;
|
|
178
|
+
private readonly contractSyncService: ContractSyncService;
|
|
179
|
+
private readonly txResolver: TxResolverService;
|
|
180
|
+
private readonly hooks: ExecutionHooks | undefined;
|
|
181
|
+
|
|
182
|
+
constructor(args: ContractFunctionSimulatorArgs) {
|
|
183
|
+
this.contractStore = args.contractStore;
|
|
184
|
+
this.contractClassService = args.contractClassService;
|
|
185
|
+
this.overrides = args.overrides;
|
|
186
|
+
this.noteStore = args.noteStore;
|
|
187
|
+
this.keyStore = args.keyStore;
|
|
188
|
+
this.addressStore = args.addressStore;
|
|
189
|
+
this.aztecNode = args.aztecNode;
|
|
190
|
+
this.l2TipsStore = args.l2TipsStore;
|
|
191
|
+
this.senderTaggingStore = args.senderTaggingStore;
|
|
192
|
+
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
193
|
+
this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
|
|
194
|
+
this.capsuleStore = args.capsuleStore;
|
|
195
|
+
this.factStore = args.factStore;
|
|
196
|
+
this.privateEventStore = args.privateEventStore;
|
|
197
|
+
this.simulator = args.simulator;
|
|
198
|
+
this.contractSyncService = args.contractSyncService;
|
|
199
|
+
this.txResolver = args.txResolver;
|
|
200
|
+
this.hooks = args.hooks;
|
|
112
201
|
this.log = createLogger('simulator');
|
|
113
202
|
}
|
|
114
203
|
|
|
115
204
|
/**
|
|
116
205
|
* Runs a private function.
|
|
117
206
|
* @param request - The transaction request.
|
|
118
|
-
* @param entryPointArtifact - The artifact of the entry point function.
|
|
119
|
-
* @param contractAddress - The address of the contract (should match request.origin)
|
|
120
|
-
* @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract
|
|
121
|
-
* or a specific account.
|
|
122
|
-
* @param anchorBlockHeader - The block header to use as base state for this run.
|
|
123
|
-
* @param senderForTags - The address that is used as a tagging sender when emitting private logs. Returned from
|
|
124
|
-
* the `privateGetSenderForTags` oracle.
|
|
125
|
-
* @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
126
|
-
* @param jobId - The job ID for staged writes.
|
|
127
|
-
* @returns The result of the execution.
|
|
128
207
|
*/
|
|
129
208
|
public async run(
|
|
130
209
|
request: TxExecutionRequest,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
210
|
+
{
|
|
211
|
+
msgSender = AztecAddress.NULL_MSG_SENDER,
|
|
212
|
+
anchorBlockHeader,
|
|
213
|
+
senderForTags,
|
|
214
|
+
scopes,
|
|
215
|
+
jobId,
|
|
216
|
+
}: ContractSimulatorRunOpts,
|
|
138
217
|
): Promise<PrivateExecutionResult> {
|
|
139
218
|
const simulatorSetupTimer = new Timer();
|
|
140
219
|
|
|
141
|
-
const
|
|
220
|
+
const contractAddress = request.origin;
|
|
142
221
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
222
|
+
const anchoredContractData = new AnchoredContractData(
|
|
223
|
+
this.contractStore,
|
|
224
|
+
this.contractClassService,
|
|
225
|
+
anchorBlockHeader,
|
|
226
|
+
this.overrides,
|
|
227
|
+
);
|
|
146
228
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
229
|
+
const entryPointArtifact = await anchoredContractData.getFunctionArtifactWithDebugMetadata(
|
|
230
|
+
contractAddress,
|
|
231
|
+
request.functionSelector,
|
|
232
|
+
);
|
|
233
|
+
if (!entryPointArtifact) {
|
|
234
|
+
throw new Error(
|
|
235
|
+
`Cannot run function ${request.functionSelector} on ${contractAddress}: the contract is not registered. ` +
|
|
236
|
+
`Register it via wallet.registerContract(...).`,
|
|
150
237
|
);
|
|
151
238
|
}
|
|
152
239
|
|
|
240
|
+
if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
|
|
241
|
+
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as private`);
|
|
242
|
+
}
|
|
243
|
+
|
|
153
244
|
// reserve the first side effect for the tx hash (inserted by the private kernel)
|
|
154
245
|
const startSideEffectCounter = 2;
|
|
155
246
|
|
|
@@ -164,38 +255,48 @@ export class ContractFunctionSimulator {
|
|
|
164
255
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
165
256
|
const taggingIndexCache = new ExecutionTaggingIndexCache();
|
|
166
257
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
258
|
+
// One shared transient store for the whole execution tree rooted at this transaction. Threaded into every child
|
|
259
|
+
// private oracle and inherited by nested utility frames, so that frames of the same contract see each other's
|
|
260
|
+
// transient arrays, then discarded when run() returns.
|
|
261
|
+
const transientArrayService = new TransientArrayService();
|
|
262
|
+
|
|
263
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
264
|
+
argsHash: request.firstCallArgsHash,
|
|
265
|
+
txContext: request.txContext,
|
|
266
|
+
txRequestSalt: request.salt,
|
|
170
267
|
callContext,
|
|
171
268
|
anchorBlockHeader,
|
|
172
|
-
async call => {
|
|
173
|
-
await this.runUtility(call, [], anchorBlockHeader,
|
|
269
|
+
utilityExecutor: async (call, execScopes) => {
|
|
270
|
+
await this.runUtility(call, [], anchorBlockHeader, execScopes, jobId);
|
|
174
271
|
},
|
|
175
|
-
request.authWitnesses,
|
|
176
|
-
request.capsules,
|
|
177
|
-
HashedValuesCache.create(request.argsOfCalls),
|
|
272
|
+
authWitnesses: request.authWitnesses,
|
|
273
|
+
capsules: request.capsules,
|
|
274
|
+
executionCache: HashedValuesCache.create(request.argsOfCalls),
|
|
178
275
|
noteCache,
|
|
179
276
|
taggingIndexCache,
|
|
180
|
-
|
|
181
|
-
this.noteStore,
|
|
182
|
-
this.keyStore,
|
|
183
|
-
this.addressStore,
|
|
184
|
-
this.aztecNode,
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
187
|
-
this.
|
|
188
|
-
this.
|
|
189
|
-
this.
|
|
190
|
-
this.privateEventStore,
|
|
277
|
+
anchoredContractData,
|
|
278
|
+
noteStore: this.noteStore,
|
|
279
|
+
keyStore: this.keyStore,
|
|
280
|
+
addressStore: this.addressStore,
|
|
281
|
+
aztecNode: this.aztecNode,
|
|
282
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
283
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
284
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
285
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
286
|
+
factService: new FactService(this.factStore, scopes),
|
|
287
|
+
privateEventStore: this.privateEventStore,
|
|
288
|
+
txResolver: this.txResolver,
|
|
289
|
+
contractSyncService: this.contractSyncService,
|
|
191
290
|
jobId,
|
|
192
|
-
0,
|
|
193
|
-
startSideEffectCounter,
|
|
194
|
-
undefined, // log
|
|
291
|
+
totalPublicCalldataCount: 0,
|
|
292
|
+
sideEffectCounter: startSideEffectCounter,
|
|
195
293
|
scopes,
|
|
196
294
|
senderForTags,
|
|
197
|
-
this.simulator,
|
|
198
|
-
|
|
295
|
+
simulator: this.simulator,
|
|
296
|
+
l2TipsStore: this.l2TipsStore,
|
|
297
|
+
hooks: this.hooks,
|
|
298
|
+
transientArrayService,
|
|
299
|
+
});
|
|
199
300
|
|
|
200
301
|
const setupTime = simulatorSetupTimer.ms();
|
|
201
302
|
|
|
@@ -213,8 +314,7 @@ export class ContractFunctionSimulator {
|
|
|
213
314
|
);
|
|
214
315
|
const simulatorTeardownTimer = new Timer();
|
|
215
316
|
|
|
216
|
-
noteCache.
|
|
217
|
-
const firstNullifierHint = noteCache.getNonceGenerator();
|
|
317
|
+
const firstNullifier = noteCache.getNonceGenerator();
|
|
218
318
|
|
|
219
319
|
const publicCallRequests = collectNested([executionResult], r =>
|
|
220
320
|
r.publicInputs.publicCallRequests
|
|
@@ -224,7 +324,7 @@ export class ContractFunctionSimulator {
|
|
|
224
324
|
);
|
|
225
325
|
const publicFunctionsCalldata = await Promise.all(
|
|
226
326
|
publicCallRequests.map(async r => {
|
|
227
|
-
const calldata = await privateExecutionOracle.
|
|
327
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
228
328
|
return new HashedValues(calldata, r.calldataHash);
|
|
229
329
|
}),
|
|
230
330
|
);
|
|
@@ -237,56 +337,80 @@ export class ContractFunctionSimulator {
|
|
|
237
337
|
}
|
|
238
338
|
|
|
239
339
|
// Not to be confused with a PrivateCallExecutionResult. This is a superset
|
|
240
|
-
// of the PrivateCallExecutionResult, containing also
|
|
340
|
+
// of the PrivateCallExecutionResult, containing also firstNullifier
|
|
241
341
|
// and publicFunctionsCalldata.
|
|
242
|
-
return new PrivateExecutionResult(executionResult,
|
|
342
|
+
return new PrivateExecutionResult(executionResult, firstNullifier, publicFunctionsCalldata);
|
|
243
343
|
} catch (err) {
|
|
244
344
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
245
345
|
}
|
|
246
346
|
}
|
|
247
347
|
|
|
248
|
-
// docs:start:execute_utility_function
|
|
249
348
|
/**
|
|
250
349
|
* Runs a utility function.
|
|
251
350
|
* @param call - The function call to execute.
|
|
252
|
-
* @param authwits - Authentication witnesses required for the function call.
|
|
253
|
-
* @param anchorBlockHeader - The block header to use as base state for this run.
|
|
254
|
-
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
255
|
-
* accounts if not specified.
|
|
256
351
|
* @returns A return value of the utility function in a form as returned by the simulator (Noir fields)
|
|
257
352
|
*/
|
|
258
353
|
public async runUtility(
|
|
259
354
|
call: FunctionCall,
|
|
260
355
|
authwits: AuthWitness[],
|
|
261
356
|
anchorBlockHeader: BlockHeader,
|
|
262
|
-
scopes: AztecAddress[]
|
|
357
|
+
scopes: AztecAddress[],
|
|
263
358
|
jobId: string,
|
|
264
|
-
): Promise<Fr[]> {
|
|
265
|
-
const
|
|
359
|
+
): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
|
|
360
|
+
const anchoredContractData = new AnchoredContractData(
|
|
361
|
+
this.contractStore,
|
|
362
|
+
this.contractClassService,
|
|
363
|
+
anchorBlockHeader,
|
|
364
|
+
this.overrides,
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
const entryPointArtifact = await anchoredContractData.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
368
|
+
if (!entryPointArtifact) {
|
|
369
|
+
throw new Error(
|
|
370
|
+
`Cannot run function ${call.selector} on ${call.to}: the contract is not registered. ` +
|
|
371
|
+
`Register it via wallet.registerContract(...).`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
266
374
|
|
|
267
375
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
268
376
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
269
377
|
}
|
|
270
378
|
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
379
|
+
const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
|
|
380
|
+
await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
const oracle = new UtilityExecutionOracle({
|
|
384
|
+
callContext: CallContext.from({
|
|
385
|
+
msgSender: AztecAddress.NULL_MSG_SENDER,
|
|
386
|
+
contractAddress: call.to,
|
|
387
|
+
functionSelector: call.selector,
|
|
388
|
+
isStaticCall: true,
|
|
389
|
+
}),
|
|
390
|
+
authWitnesses: authwits,
|
|
391
|
+
capsules: [],
|
|
275
392
|
anchorBlockHeader,
|
|
276
|
-
|
|
277
|
-
this.noteStore,
|
|
278
|
-
this.keyStore,
|
|
279
|
-
this.addressStore,
|
|
280
|
-
this.aztecNode,
|
|
281
|
-
this.
|
|
282
|
-
this.
|
|
283
|
-
this.
|
|
284
|
-
this.
|
|
285
|
-
this.privateEventStore,
|
|
393
|
+
anchoredContractData,
|
|
394
|
+
noteStore: this.noteStore,
|
|
395
|
+
keyStore: this.keyStore,
|
|
396
|
+
addressStore: this.addressStore,
|
|
397
|
+
aztecNode: this.aztecNode,
|
|
398
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
399
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
400
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
401
|
+
factService: new FactService(this.factStore, scopes),
|
|
402
|
+
privateEventStore: this.privateEventStore,
|
|
403
|
+
txResolver: this.txResolver,
|
|
404
|
+
contractSyncService: this.contractSyncService,
|
|
405
|
+
l2TipsStore: this.l2TipsStore,
|
|
286
406
|
jobId,
|
|
287
|
-
undefined,
|
|
288
407
|
scopes,
|
|
289
|
-
|
|
408
|
+
simulator: this.simulator,
|
|
409
|
+
hooks: this.hooks,
|
|
410
|
+
utilityExecutor,
|
|
411
|
+
// Execution-tree root (top-level utility run or contract sync): own store; nested frames inherit it.
|
|
412
|
+
transientArrayService: new TransientArrayService(),
|
|
413
|
+
});
|
|
290
414
|
|
|
291
415
|
try {
|
|
292
416
|
this.log.verbose(`Executing utility function ${entryPointArtifact.name}`, {
|
|
@@ -296,7 +420,7 @@ export class ContractFunctionSimulator {
|
|
|
296
420
|
|
|
297
421
|
const initialWitness = toACVMWitness(0, call.args);
|
|
298
422
|
const acirExecutionResult = await this.simulator
|
|
299
|
-
.executeUserCircuit(initialWitness, entryPointArtifact,
|
|
423
|
+
.executeUserCircuit(initialWitness, entryPointArtifact, buildACIRCallback(oracle))
|
|
300
424
|
.catch((err: Error) => {
|
|
301
425
|
err.message = resolveAssertionMessageFromError(err, entryPointArtifact);
|
|
302
426
|
throw new ExecutionError(
|
|
@@ -310,13 +434,15 @@ export class ContractFunctionSimulator {
|
|
|
310
434
|
);
|
|
311
435
|
});
|
|
312
436
|
|
|
313
|
-
this.log.verbose(`Utility
|
|
314
|
-
return
|
|
437
|
+
this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
438
|
+
return {
|
|
439
|
+
result: witnessMapToFields(acirExecutionResult.returnWitness),
|
|
440
|
+
offchainEffects: oracle.getOffchainEffects(),
|
|
441
|
+
};
|
|
315
442
|
} catch (err) {
|
|
316
443
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
317
444
|
}
|
|
318
445
|
}
|
|
319
|
-
// docs:end:execute_utility_function
|
|
320
446
|
|
|
321
447
|
/**
|
|
322
448
|
* Returns the execution statistics collected during the simulator run.
|
|
@@ -352,63 +478,82 @@ class OrderedSideEffect<T> {
|
|
|
352
478
|
* (allowing state overrides) and is much faster, while still generating a valid
|
|
353
479
|
* output that can be sent to the node for public simulation
|
|
354
480
|
* @param privateExecutionResult - The result of the private execution.
|
|
355
|
-
* @param
|
|
481
|
+
* @param debugFunctionNameGetter - A provider for contract data in order to get function names and debug info.
|
|
482
|
+
* @param node - AztecNode for verifying settled read requests against the note hash and nullifier trees.
|
|
356
483
|
* @param minRevertibleSideEffectCounterOverride - Optional override for the min revertible side effect counter.
|
|
357
484
|
* Used by TXE to simulate account contract behavior (setting the counter before app execution).
|
|
358
485
|
* @returns The simulated proving result.
|
|
359
486
|
*/
|
|
360
487
|
export async function generateSimulatedProvingResult(
|
|
361
488
|
privateExecutionResult: PrivateExecutionResult,
|
|
362
|
-
|
|
489
|
+
debugFunctionNameGetter: (contractAddress: AztecAddress, functionSelector: FunctionSelector) => Promise<string>,
|
|
490
|
+
node: AztecNode,
|
|
363
491
|
minRevertibleSideEffectCounterOverride?: number,
|
|
364
492
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
365
|
-
const
|
|
366
|
-
const nullifiers: OrderedSideEffect<Fr>[] = [];
|
|
367
|
-
const taggedPrivateLogs: OrderedSideEffect<PrivateLog>[] = [];
|
|
493
|
+
const taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[] = [];
|
|
368
494
|
const l2ToL1Messages: OrderedSideEffect<ScopedL2ToL1Message>[] = [];
|
|
369
495
|
const contractClassLogsHashes: OrderedSideEffect<ScopedLogHash>[] = [];
|
|
370
496
|
const publicCallRequests: OrderedSideEffect<PublicCallRequest>[] = [];
|
|
371
497
|
const executionSteps: PrivateExecutionStep[] = [];
|
|
372
498
|
|
|
499
|
+
// Unsiloed scoped arrays — used for squashing, read request verification,
|
|
500
|
+
// and siloed at the end only for the surviving items
|
|
501
|
+
const scopedNoteHashes: ScopedNoteHash[] = [];
|
|
502
|
+
const scopedNullifiers: ScopedNullifier[] = [];
|
|
503
|
+
|
|
504
|
+
// Read requests for verification
|
|
505
|
+
const noteHashReadRequests: ScopedReadRequest[] = [];
|
|
506
|
+
const nullifierReadRequests: ScopedReadRequest[] = [];
|
|
507
|
+
|
|
373
508
|
let publicTeardownCallRequest;
|
|
374
509
|
|
|
510
|
+
// We set expiration timestamp to anchor_block_timestamp + MAX_TX_LIFETIME (24h) just like kernels do
|
|
511
|
+
let expirationTimestamp =
|
|
512
|
+
privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.globalVariables.timestamp +
|
|
513
|
+
BigInt(MAX_TX_LIFETIME);
|
|
514
|
+
|
|
515
|
+
let feePayer = AztecAddress.zero();
|
|
516
|
+
|
|
375
517
|
const executions = [privateExecutionResult.entrypoint];
|
|
376
518
|
|
|
377
519
|
while (executions.length !== 0) {
|
|
378
520
|
const execution = executions.shift()!;
|
|
379
521
|
executions.unshift(...execution!.nestedExecutionResults);
|
|
380
522
|
|
|
523
|
+
// Just like kernels we overwrite the default value if the call sets it.
|
|
524
|
+
const callExpirationTimestamp = execution.publicInputs.expirationTimestamp;
|
|
525
|
+
if (callExpirationTimestamp !== 0n && callExpirationTimestamp < expirationTimestamp) {
|
|
526
|
+
expirationTimestamp = callExpirationTimestamp;
|
|
527
|
+
}
|
|
528
|
+
|
|
381
529
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
382
530
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
new OrderedSideEffect(await siloNoteHash(contractAddress, noteHash.value), noteHash.counter),
|
|
390
|
-
),
|
|
391
|
-
);
|
|
531
|
+
if (execution.publicInputs.isFeePayer) {
|
|
532
|
+
if (!feePayer.isZero()) {
|
|
533
|
+
throw new Error('Multiple fee payers found in private execution result');
|
|
534
|
+
}
|
|
535
|
+
feePayer = contractAddress;
|
|
536
|
+
}
|
|
392
537
|
|
|
393
|
-
|
|
394
|
-
execution.publicInputs.
|
|
538
|
+
scopedNoteHashes.push(
|
|
539
|
+
...execution.publicInputs.noteHashes
|
|
395
540
|
.getActiveItems()
|
|
396
|
-
.
|
|
397
|
-
|
|
398
|
-
new OrderedSideEffect(await siloNullifier(contractAddress, nullifier.value), nullifier.counter),
|
|
399
|
-
),
|
|
541
|
+
.filter(nh => !nh.isEmpty())
|
|
542
|
+
.map(nh => nh.scope(contractAddress)),
|
|
400
543
|
);
|
|
544
|
+
scopedNullifiers.push(...execution.publicInputs.nullifiers.getActiveItems().map(n => n.scope(contractAddress)));
|
|
401
545
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
546
|
+
taggedPrivateLogs.push(
|
|
547
|
+
...(await Promise.all(
|
|
548
|
+
execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
|
|
549
|
+
metadata.log.fields[0] = await computeSiloedPrivateLogFirstField(contractAddress, metadata.log.fields[0]);
|
|
550
|
+
return new OrderedSideEffect(metadata, metadata.counter);
|
|
551
|
+
}),
|
|
552
|
+
)),
|
|
407
553
|
);
|
|
408
554
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
nullifiers.push(...nullifiersFromExecution);
|
|
555
|
+
noteHashReadRequests.push(...execution.publicInputs.noteHashReadRequests.getActiveItems());
|
|
556
|
+
nullifierReadRequests.push(...execution.publicInputs.nullifierReadRequests.getActiveItems());
|
|
412
557
|
l2ToL1Messages.push(
|
|
413
558
|
...execution.publicInputs.l2ToL1Msgs
|
|
414
559
|
.getActiveItems()
|
|
@@ -437,7 +582,7 @@ export async function generateSimulatedProvingResult(
|
|
|
437
582
|
: execution.publicInputs.publicTeardownCallRequest;
|
|
438
583
|
|
|
439
584
|
executionSteps.push({
|
|
440
|
-
functionName: await
|
|
585
|
+
functionName: await debugFunctionNameGetter(
|
|
441
586
|
execution.publicInputs.callContext.contractAddress,
|
|
442
587
|
execution.publicInputs.callContext.functionSelector,
|
|
443
588
|
),
|
|
@@ -448,6 +593,47 @@ export async function generateSimulatedProvingResult(
|
|
|
448
593
|
});
|
|
449
594
|
}
|
|
450
595
|
|
|
596
|
+
const noteHashNullifierCounterMap = collectNoteHashNullifierCounterMap(privateExecutionResult);
|
|
597
|
+
const minRevertibleSideEffectCounter =
|
|
598
|
+
minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
|
|
599
|
+
|
|
600
|
+
const scopedNoteHashesCLA = new ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>(
|
|
601
|
+
padArrayEnd(scopedNoteHashes, ScopedNoteHash.empty(), MAX_NOTE_HASHES_PER_TX),
|
|
602
|
+
scopedNoteHashes.length,
|
|
603
|
+
);
|
|
604
|
+
const scopedNullifiersCLA = new ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>(
|
|
605
|
+
padArrayEnd(scopedNullifiers, ScopedNullifier.empty(), MAX_NULLIFIERS_PER_TX),
|
|
606
|
+
scopedNullifiers.length,
|
|
607
|
+
);
|
|
608
|
+
|
|
609
|
+
const { filteredNoteHashes, filteredNullifiers, filteredPrivateLogs } = squashTransientSideEffects(
|
|
610
|
+
taggedPrivateLogs,
|
|
611
|
+
scopedNoteHashesCLA,
|
|
612
|
+
scopedNullifiersCLA,
|
|
613
|
+
noteHashNullifierCounterMap,
|
|
614
|
+
minRevertibleSideEffectCounter,
|
|
615
|
+
);
|
|
616
|
+
|
|
617
|
+
await verifyReadRequests(
|
|
618
|
+
node,
|
|
619
|
+
await privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.hash(),
|
|
620
|
+
noteHashReadRequests,
|
|
621
|
+
nullifierReadRequests,
|
|
622
|
+
scopedNoteHashesCLA,
|
|
623
|
+
scopedNullifiersCLA,
|
|
624
|
+
);
|
|
625
|
+
|
|
626
|
+
const siloedNoteHashes = await Promise.all(
|
|
627
|
+
filteredNoteHashes
|
|
628
|
+
.sort((a, b) => a.counter - b.counter)
|
|
629
|
+
.map(async nh => new OrderedSideEffect(await siloNoteHash(nh.contractAddress, nh.value), nh.counter)),
|
|
630
|
+
);
|
|
631
|
+
const siloedNullifiers = await Promise.all(
|
|
632
|
+
filteredNullifiers
|
|
633
|
+
.sort((a, b) => a.counter - b.counter)
|
|
634
|
+
.map(async n => new OrderedSideEffect(await siloNullifier(n.contractAddress, n.value), n.counter)),
|
|
635
|
+
);
|
|
636
|
+
|
|
451
637
|
const constantData = new TxConstantData(
|
|
452
638
|
privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader,
|
|
453
639
|
privateExecutionResult.entrypoint.publicInputs.txContext,
|
|
@@ -464,25 +650,23 @@ export async function generateSimulatedProvingResult(
|
|
|
464
650
|
const getEffect = <T>(orderedSideEffect: OrderedSideEffect<T>) => orderedSideEffect.sideEffect;
|
|
465
651
|
|
|
466
652
|
const isPrivateOnlyTx = privateExecutionResult.publicFunctionCalldata.length === 0;
|
|
467
|
-
const minRevertibleSideEffectCounter =
|
|
468
|
-
minRevertibleSideEffectCounterOverride ?? getFinalMinRevertibleSideEffectCounter(privateExecutionResult);
|
|
469
653
|
|
|
470
654
|
const [nonRevertibleNullifiers, revertibleNullifiers] = splitOrderedSideEffects(
|
|
471
|
-
|
|
655
|
+
siloedNullifiers,
|
|
472
656
|
minRevertibleSideEffectCounter,
|
|
473
657
|
);
|
|
658
|
+
// The protocol nullifier is the nonce generator and the tx's first nullifier. It is injected by the
|
|
659
|
+
// init kernel (at counter 1, index 0) rather than emitted by any private call, so it is absent from
|
|
660
|
+
// the executed nullifiers above. Mirror the kernel here by prepending it as the first non-revertible
|
|
661
|
+
// nullifier.
|
|
474
662
|
const nonceGenerator = privateExecutionResult.firstNullifier;
|
|
475
|
-
|
|
476
|
-
nonRevertibleNullifiers.push(nonceGenerator);
|
|
477
|
-
} else if (!nonRevertibleNullifiers[0].equals(nonceGenerator)) {
|
|
478
|
-
throw new Error('The first non revertible nullifier should be equal to the nonce generator. This is a bug!');
|
|
479
|
-
}
|
|
663
|
+
nonRevertibleNullifiers.unshift(nonceGenerator);
|
|
480
664
|
|
|
481
665
|
if (isPrivateOnlyTx) {
|
|
482
666
|
// We must make the note hashes unique by using the
|
|
483
667
|
// nonce generator and their index in the tx.
|
|
484
668
|
const uniqueNoteHashes = await Promise.all(
|
|
485
|
-
siloedNoteHashes.
|
|
669
|
+
siloedNoteHashes.map(async (orderedSideEffect, i) => {
|
|
486
670
|
const siloedNoteHash = orderedSideEffect.sideEffect;
|
|
487
671
|
const nonce = await computeNoteHashNonce(nonceGenerator, i);
|
|
488
672
|
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
@@ -497,18 +681,18 @@ export async function generateSimulatedProvingResult(
|
|
|
497
681
|
ScopedL2ToL1Message.empty(),
|
|
498
682
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
499
683
|
),
|
|
500
|
-
padArrayEnd(
|
|
684
|
+
padArrayEnd(filteredPrivateLogs.sort(sortByCounter).map(getEffect), PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
501
685
|
padArrayEnd(
|
|
502
686
|
contractClassLogsHashes.sort(sortByCounter).map(getEffect),
|
|
503
687
|
ScopedLogHash.empty(),
|
|
504
688
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
505
689
|
),
|
|
506
690
|
);
|
|
507
|
-
gasUsed = meterGasUsed(accumulatedDataForRollup);
|
|
691
|
+
gasUsed = meterGasUsed(accumulatedDataForRollup, isPrivateOnlyTx);
|
|
508
692
|
inputsForRollup = new PartialPrivateTailPublicInputsForRollup(accumulatedDataForRollup);
|
|
509
693
|
} else {
|
|
510
694
|
const [nonRevertibleNoteHashes, revertibleNoteHashes] = splitOrderedSideEffects(
|
|
511
|
-
siloedNoteHashes
|
|
695
|
+
siloedNoteHashes,
|
|
512
696
|
minRevertibleSideEffectCounter,
|
|
513
697
|
);
|
|
514
698
|
const nonRevertibleUniqueNoteHashes = await Promise.all(
|
|
@@ -522,7 +706,7 @@ export async function generateSimulatedProvingResult(
|
|
|
522
706
|
minRevertibleSideEffectCounter,
|
|
523
707
|
);
|
|
524
708
|
const [nonRevertibleTaggedPrivateLogs, revertibleTaggedPrivateLogs] = splitOrderedSideEffects(
|
|
525
|
-
|
|
709
|
+
filteredPrivateLogs,
|
|
526
710
|
minRevertibleSideEffectCounter,
|
|
527
711
|
);
|
|
528
712
|
const [nonRevertibleContractClassLogHashes, revertibleContractClassLogHashes] = splitOrderedSideEffects(
|
|
@@ -551,9 +735,9 @@ export async function generateSimulatedProvingResult(
|
|
|
551
735
|
padArrayEnd(revertibleContractClassLogHashes, ScopedLogHash.empty(), MAX_CONTRACT_CLASS_LOGS_PER_TX),
|
|
552
736
|
padArrayEnd(revertiblePublicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
|
|
553
737
|
);
|
|
554
|
-
gasUsed = meterGasUsed(revertibleData).add(meterGasUsed(nonRevertibleData));
|
|
738
|
+
gasUsed = meterGasUsed(revertibleData, isPrivateOnlyTx).add(meterGasUsed(nonRevertibleData, isPrivateOnlyTx));
|
|
555
739
|
if (publicTeardownCallRequest) {
|
|
556
|
-
gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
740
|
+
gasUsed = gasUsed.add(privateExecutionResult.entrypoint.publicInputs.txContext.gasSettings.teardownGasLimits);
|
|
557
741
|
}
|
|
558
742
|
|
|
559
743
|
inputsForPublic = new PartialPrivateTailPublicInputsForPublic(
|
|
@@ -565,9 +749,14 @@ export async function generateSimulatedProvingResult(
|
|
|
565
749
|
|
|
566
750
|
const publicInputs = new PrivateKernelTailCircuitPublicInputs(
|
|
567
751
|
constantData,
|
|
568
|
-
/*gasUsed=*/ gasUsed.add(
|
|
569
|
-
|
|
570
|
-
|
|
752
|
+
/*gasUsed=*/ gasUsed.add(
|
|
753
|
+
Gas.from({
|
|
754
|
+
l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
755
|
+
daGas: TX_DA_GAS_OVERHEAD,
|
|
756
|
+
}),
|
|
757
|
+
),
|
|
758
|
+
/*feePayer=*/ feePayer,
|
|
759
|
+
/*expirationTimestamp=*/ expirationTimestamp,
|
|
571
760
|
hasPublicCalls ? inputsForPublic : undefined,
|
|
572
761
|
!hasPublicCalls ? inputsForRollup : undefined,
|
|
573
762
|
);
|
|
@@ -579,6 +768,116 @@ export async function generateSimulatedProvingResult(
|
|
|
579
768
|
};
|
|
580
769
|
}
|
|
581
770
|
|
|
771
|
+
/**
|
|
772
|
+
* Squashes transient note hashes and nullifiers, mimicking the behavior
|
|
773
|
+
* of the reset kernels. Returns the filtered (surviving) scoped items and private logs.
|
|
774
|
+
*/
|
|
775
|
+
function squashTransientSideEffects(
|
|
776
|
+
taggedPrivateLogs: OrderedSideEffect<PrivateLogData>[],
|
|
777
|
+
scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
|
|
778
|
+
scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
|
|
779
|
+
noteHashNullifierCounterMap: Map<number, number>,
|
|
780
|
+
minRevertibleSideEffectCounter: number,
|
|
781
|
+
) {
|
|
782
|
+
const { numTransientData, hints: transientDataHints } = buildTransientDataHints(
|
|
783
|
+
scopedNoteHashesCLA,
|
|
784
|
+
scopedNullifiersCLA,
|
|
785
|
+
/*futureNoteHashReads=*/ [],
|
|
786
|
+
/*futureNullifierReads=*/ [],
|
|
787
|
+
/*futureLogs=*/ [],
|
|
788
|
+
noteHashNullifierCounterMap,
|
|
789
|
+
minRevertibleSideEffectCounter,
|
|
790
|
+
);
|
|
791
|
+
|
|
792
|
+
const squashedNoteHashCounters = new Set<number>();
|
|
793
|
+
const squashedNullifierCounters = new Set<number>();
|
|
794
|
+
for (let i = 0; i < numTransientData; i++) {
|
|
795
|
+
const hint = transientDataHints[i];
|
|
796
|
+
squashedNoteHashCounters.add(scopedNoteHashesCLA.array[hint.noteHashIndex].counter);
|
|
797
|
+
squashedNullifierCounters.add(scopedNullifiersCLA.array[hint.nullifierIndex].counter);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
return {
|
|
801
|
+
filteredNoteHashes: scopedNoteHashesCLA.getActiveItems().filter(nh => !squashedNoteHashCounters.has(nh.counter)),
|
|
802
|
+
filteredNullifiers: scopedNullifiersCLA.getActiveItems().filter(n => !squashedNullifierCounters.has(n.counter)),
|
|
803
|
+
filteredPrivateLogs: taggedPrivateLogs
|
|
804
|
+
.filter(item => !squashedNoteHashCounters.has(item.sideEffect.noteHashCounter))
|
|
805
|
+
.map(item => new OrderedSideEffect(item.sideEffect.log, item.counter)),
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* Verifies settled read requests by checking membership in the note hash and nullifier trees
|
|
811
|
+
* at the tx's anchor block, mimicking the behavior of the kernels
|
|
812
|
+
*/
|
|
813
|
+
async function verifyReadRequests(
|
|
814
|
+
node: Pick<AztecNode, 'findLeavesIndexes'>,
|
|
815
|
+
anchorBlockHash: BlockParameter,
|
|
816
|
+
noteHashReadRequests: ScopedReadRequest[],
|
|
817
|
+
nullifierReadRequests: ScopedReadRequest[],
|
|
818
|
+
scopedNoteHashesCLA: ClaimedLengthArray<ScopedNoteHash, typeof MAX_NOTE_HASHES_PER_TX>,
|
|
819
|
+
scopedNullifiersCLA: ClaimedLengthArray<ScopedNullifier, typeof MAX_NULLIFIERS_PER_TX>,
|
|
820
|
+
) {
|
|
821
|
+
const noteHashReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX>(
|
|
822
|
+
padArrayEnd(noteHashReadRequests, ScopedReadRequest.empty(), MAX_NOTE_HASH_READ_REQUESTS_PER_TX),
|
|
823
|
+
noteHashReadRequests.length,
|
|
824
|
+
);
|
|
825
|
+
const nullifierReadRequestsCLA = new ClaimedLengthArray<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>(
|
|
826
|
+
padArrayEnd(nullifierReadRequests, ScopedReadRequest.empty(), MAX_NULLIFIER_READ_REQUESTS_PER_TX),
|
|
827
|
+
nullifierReadRequests.length,
|
|
828
|
+
);
|
|
829
|
+
|
|
830
|
+
const noteHashResetActions = getNoteHashReadRequestResetActions(noteHashReadRequestsCLA, scopedNoteHashesCLA);
|
|
831
|
+
const nullifierResetActions = getNullifierReadRequestResetActions(nullifierReadRequestsCLA, scopedNullifiersCLA);
|
|
832
|
+
|
|
833
|
+
const settledNoteHashReads: { index: number; value: Fr }[] = [];
|
|
834
|
+
for (let i = 0; i < noteHashResetActions.actions.length; i++) {
|
|
835
|
+
if (noteHashResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
|
|
836
|
+
settledNoteHashReads.push({ index: i, value: noteHashReadRequests[i].value });
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
const settledNullifierReads: { index: number; value: Fr }[] = [];
|
|
841
|
+
for (let i = 0; i < nullifierResetActions.actions.length; i++) {
|
|
842
|
+
if (nullifierResetActions.actions[i] === ReadRequestActionEnum.READ_AS_SETTLED) {
|
|
843
|
+
settledNullifierReads.push({ index: i, value: nullifierReadRequests[i].value });
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
const [noteHashResults, nullifierResults] = await Promise.all([
|
|
848
|
+
settledNoteHashReads.length > 0
|
|
849
|
+
? node.findLeavesIndexes(
|
|
850
|
+
anchorBlockHash,
|
|
851
|
+
MerkleTreeId.NOTE_HASH_TREE,
|
|
852
|
+
settledNoteHashReads.map(({ value }) => value),
|
|
853
|
+
)
|
|
854
|
+
: [],
|
|
855
|
+
settledNullifierReads.length > 0
|
|
856
|
+
? node.findLeavesIndexes(
|
|
857
|
+
anchorBlockHash,
|
|
858
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
859
|
+
settledNullifierReads.map(({ value }) => value),
|
|
860
|
+
)
|
|
861
|
+
: [],
|
|
862
|
+
]);
|
|
863
|
+
|
|
864
|
+
for (let i = 0; i < settledNoteHashReads.length; i++) {
|
|
865
|
+
if (!noteHashResults[i]) {
|
|
866
|
+
throw new Error(
|
|
867
|
+
`Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
|
|
868
|
+
);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
for (let i = 0; i < settledNullifierReads.length; i++) {
|
|
873
|
+
if (!nullifierResults[i]) {
|
|
874
|
+
throw new Error(
|
|
875
|
+
`Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
|
|
876
|
+
);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
582
881
|
function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertibleSideEffectCounter: number) {
|
|
583
882
|
const revertibleSideEffects: T[] = [];
|
|
584
883
|
const nonRevertibleSideEffects: T[] = [];
|
|
@@ -592,21 +891,24 @@ function splitOrderedSideEffects<T>(effects: OrderedSideEffect<T>[], minRevertib
|
|
|
592
891
|
return [nonRevertibleSideEffects, revertibleSideEffects];
|
|
593
892
|
}
|
|
594
893
|
|
|
595
|
-
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData) {
|
|
894
|
+
function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccumulatedData, isPrivateOnlyTx: boolean) {
|
|
596
895
|
let meteredDAFields = 0;
|
|
597
896
|
let meteredL2Gas = 0;
|
|
598
897
|
|
|
599
898
|
const numNoteHashes = arrayNonEmptyLength(data.noteHashes, hash => hash.isEmpty());
|
|
600
899
|
meteredDAFields += numNoteHashes;
|
|
601
|
-
|
|
900
|
+
const noteHashBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NOTE_HASH : AVM_EMITNOTEHASH_BASE_L2_GAS;
|
|
901
|
+
meteredL2Gas += numNoteHashes * noteHashBaseGas;
|
|
602
902
|
|
|
603
903
|
const numNullifiers = arrayNonEmptyLength(data.nullifiers, nullifier => nullifier.isEmpty());
|
|
604
904
|
meteredDAFields += numNullifiers;
|
|
605
|
-
|
|
905
|
+
const nullifierBaseGas = isPrivateOnlyTx ? L2_GAS_PER_NULLIFIER : AVM_EMITNULLIFIER_BASE_L2_GAS;
|
|
906
|
+
meteredL2Gas += numNullifiers * nullifierBaseGas;
|
|
606
907
|
|
|
607
908
|
const numL2toL1Messages = arrayNonEmptyLength(data.l2ToL1Msgs, msg => msg.isEmpty());
|
|
608
909
|
meteredDAFields += numL2toL1Messages;
|
|
609
|
-
|
|
910
|
+
const l2ToL1MessageBaseGas = isPrivateOnlyTx ? L2_GAS_PER_L2_TO_L1_MSG : AVM_SENDL2TOL1MSG_BASE_L2_GAS;
|
|
911
|
+
meteredL2Gas += numL2toL1Messages * l2ToL1MessageBaseGas;
|
|
610
912
|
|
|
611
913
|
const numPrivatelogs = arrayNonEmptyLength(data.privateLogs, log => log.isEmpty());
|
|
612
914
|
// Every private log emits its length as an additional field
|
|
@@ -614,14 +916,19 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
|
|
|
614
916
|
meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
|
|
615
917
|
|
|
616
918
|
const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
|
|
617
|
-
// Every contract class log emits its
|
|
919
|
+
// Every contract class log emits its contract address as an additional field
|
|
618
920
|
meteredDAFields += data.contractClassLogsHashes.reduce(
|
|
619
|
-
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length +
|
|
921
|
+
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
|
|
620
922
|
0,
|
|
621
923
|
);
|
|
622
924
|
meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
|
|
623
925
|
|
|
624
|
-
|
|
926
|
+
if (isPrivateOnlyTx) {
|
|
927
|
+
// The public data write that the private tx base rollup always performs to update the fee payer's balance.
|
|
928
|
+
meteredDAFields += PUBLIC_DATA_WRITE_LENGTH;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
const meteredDAGas = meteredDAFields * DA_GAS_PER_FIELD;
|
|
625
932
|
|
|
626
933
|
if ((data as PrivateToPublicAccumulatedData).publicCallRequests) {
|
|
627
934
|
const dataForPublic = data as PrivateToPublicAccumulatedData;
|