@aztec/pxe 5.0.0-rc.1 → 5.0.0
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/block_synchronizer/block_stream_source.d.ts +5 -5
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
- package/dest/block_synchronizer/block_stream_source.js +4 -29
- package/dest/block_synchronizer/block_synchronizer.d.ts +16 -12
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +49 -15
- package/dest/config/index.d.ts +2 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -0
- 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_sync → contract}/contract_sync_service.d.ts +7 -6
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/{contract_sync → contract}/contract_sync_service.js +10 -30
- 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 +19 -18
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +52 -31
- package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
- 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/index.d.ts +17 -9
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +4 -7
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
- 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/event_validation_request.js +1 -1
- 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 +11 -12
- 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 +6 -49
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
- 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 +1 -60
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/option.js +18 -13
- 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 +6 -9
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -14
- 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 +7 -2
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/acir_callback.js +55 -11
- 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/oracle_registry.d.ts +86 -8
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +168 -18
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +126 -16
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +63 -33
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +175 -90
- package/dest/debug/pxe_debug_utils.d.ts +2 -2
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +3 -2
- package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +3 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +8 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +5 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -2
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +3 -1
- 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/hooks/execution_hooks.d.ts +27 -7
- package/dest/hooks/execution_hooks.d.ts.map +1 -1
- package/dest/hooks/execution_hooks.js +3 -3
- package/dest/hooks/index.d.ts +4 -3
- package/dest/hooks/index.d.ts.map +1 -1
- package/dest/hooks/index.js +1 -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/logs/log_service.d.ts +7 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +79 -28
- package/dest/messages/tx_resolver_service.d.ts +17 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +3 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
- 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 +6 -2
- package/dest/private_kernel/hints/test_utils.js +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
- package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +17 -5
- package/dest/pxe.d.ts +109 -47
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +222 -139
- 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/backwards_compatibility_tests/schema_tests.d.ts +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +114 -37
- package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_service.js +6 -9
- package/dest/storage/contract_store/contract_store.d.ts +27 -24
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +64 -75
- 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 +2 -1
- package/dest/storage/index.d.ts.map +1 -1
- package/dest/storage/index.js +1 -0
- 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/open_pxe_stores.d.ts +5 -3
- package/dest/storage/open_pxe_stores.d.ts.map +1 -1
- package/dest/storage/open_pxe_stores.js +5 -3
- 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/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/package.json +17 -17
- package/src/block_synchronizer/block_stream_source.ts +6 -45
- package/src/block_synchronizer/block_synchronizer.ts +65 -24
- package/src/config/index.ts +1 -0
- package/src/contract/contract_class_service.ts +83 -0
- package/src/{contract_sync → contract}/contract_sync_service.ts +18 -37
- 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 +86 -43
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +24 -9
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
- 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/event_validation_request.ts +1 -1
- 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 +20 -46
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/option.ts +17 -11
- 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 +4 -15
- 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 +58 -12
- 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/oracle_registry.ts +119 -86
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +155 -24
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +300 -115
- package/src/debug/pxe_debug_utils.ts +1 -1
- package/src/entrypoints/client/bundle/utils.ts +3 -2
- package/src/entrypoints/client/lazy/utils.ts +3 -2
- package/src/entrypoints/pxe_creation_options.ts +7 -1
- package/src/entrypoints/server/index.ts +5 -2
- package/src/entrypoints/server/utils.ts +3 -1
- package/src/error_enriching.ts +27 -11
- package/src/hooks/execution_hooks.ts +28 -8
- package/src/hooks/index.ts +8 -2
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
- package/src/logs/log_service.ts +91 -37
- package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
- package/src/oracle_version.ts +3 -3
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
- package/src/private_kernel/hints/test_utils.ts +1 -1
- package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +320 -158
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
- package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +21 -5
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +125 -36
- package/src/storage/capsule_store/capsule_service.ts +8 -13
- package/src/storage/contract_store/contract_store.ts +86 -93
- 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 +1 -0
- package/src/storage/metadata.ts +1 -1
- package/src/storage/open_pxe_stores.ts +6 -3
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +19 -9
- 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 -51
- package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
- package/dest/contract_sync/helpers.d.ts +0 -27
- package/dest/contract_sync/helpers.d.ts.map +0 -1
- package/dest/contract_sync/helpers.js +0 -53
- package/dest/messages/message_context_service.d.ts +0 -17
- package/dest/messages/message_context_service.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 -36
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
- package/src/contract_sync/helpers.ts +0 -86
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
|
@@ -3,7 +3,7 @@ import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
|
3
3
|
import { uniqueBy } from '@aztec/foundation/collection';
|
|
4
4
|
import { Aes128 } from '@aztec/foundation/crypto/aes128';
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
|
-
import
|
|
6
|
+
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
7
7
|
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
9
9
|
import type { KeyStore } from '@aztec/key-store';
|
|
@@ -20,79 +20,82 @@ import { type FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
|
|
|
20
20
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
21
21
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
22
22
|
import { BlockHash, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
23
|
-
import type { CompleteAddress,
|
|
23
|
+
import type { CompleteAddress, ContractInstancePreimageWithAddress, PartialAddress } from '@aztec/stdlib/contract';
|
|
24
24
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
25
25
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
26
26
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
27
27
|
import { PublicKeys, computeAddressSecret, hashPublicKey } from '@aztec/stdlib/keys';
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
MessageContext,
|
|
31
|
-
type PendingTaggedLog,
|
|
32
|
-
deriveAppSiloedSharedSecret,
|
|
33
|
-
} from '@aztec/stdlib/logs';
|
|
34
|
-
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
28
|
+
import { AppTaggingSecret, FlatPublicLogs, appSiloEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
29
|
+
import { type UnsiloedMessageNullifier, getL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
35
30
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
36
31
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
37
32
|
import {
|
|
38
33
|
type BlockHeader,
|
|
34
|
+
CallContext,
|
|
39
35
|
type Capsule,
|
|
40
36
|
type IndexedTxEffect,
|
|
41
37
|
type OffchainEffect,
|
|
42
|
-
TxEffect,
|
|
43
38
|
type TxHash,
|
|
44
39
|
} from '@aztec/stdlib/tx';
|
|
45
40
|
|
|
41
|
+
import type { ContractSyncService } from '../../contract/contract_sync_service.js';
|
|
46
42
|
import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
|
|
47
|
-
import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
|
|
48
43
|
import { EventService } from '../../events/event_service.js';
|
|
49
44
|
import type { UtilityCallAuthorizationRequest } from '../../hooks/authorize_utility_call.js';
|
|
50
45
|
import type { ExecutionHooks } from '../../hooks/index.js';
|
|
51
46
|
import { LogService } from '../../logs/log_service.js';
|
|
52
|
-
import {
|
|
47
|
+
import { TxResolverService } from '../../messages/tx_resolver_service.js';
|
|
53
48
|
import { NoteService } from '../../notes/note_service.js';
|
|
54
49
|
import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
|
|
55
50
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
56
51
|
import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
|
|
57
|
-
import
|
|
52
|
+
import { FactCollectionKey, FactCollectionTypeKey, anchoredTipBlockNumbers } from '../../storage/fact_store/index.js';
|
|
53
|
+
import type { FactService, OriginBlock } from '../../storage/fact_store/index.js';
|
|
58
54
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
59
55
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
60
56
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
61
|
-
import type {
|
|
57
|
+
import type { TaggingSecretSourcesStore } from '../../storage/tagging_store/tagging_secret_sources_store.js';
|
|
58
|
+
import type { AnchoredContractData } from '../anchored_contract_data.js';
|
|
59
|
+
import { AztecNodeReadCache } from '../aztec_node_read_cache.js';
|
|
62
60
|
import { EphemeralArrayService } from '../ephemeral_array_service.js';
|
|
63
61
|
import { BoundedVec } from '../noir-structs/bounded_vec.js';
|
|
62
|
+
import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
|
|
64
63
|
import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
|
|
65
64
|
import type { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
65
|
+
import { type FactCollection, emptyFactCollection, toNoirFactCollection } from '../noir-structs/fact_collection.js';
|
|
66
66
|
import type { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
67
67
|
import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
68
68
|
import type { NoteData } from '../noir-structs/note_data.js';
|
|
69
69
|
import type { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
70
70
|
import { Option } from '../noir-structs/option.js';
|
|
71
|
+
import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
|
|
71
72
|
import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
|
|
72
|
-
import {
|
|
73
|
+
import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
|
|
74
|
+
import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
|
|
75
|
+
import type { UtilityContext } from '../noir-structs/utility_context.js';
|
|
73
76
|
import { pickNotes } from '../pick_notes.js';
|
|
74
77
|
import type { TransientArrayService } from '../transient_array_service.js';
|
|
75
78
|
import { buildACIRCallback } from './acir_callback.js';
|
|
76
79
|
import type { IMiscOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
77
|
-
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
78
80
|
|
|
79
81
|
/** Args for UtilityExecutionOracle constructor. */
|
|
80
82
|
export type UtilityExecutionOracleArgs = {
|
|
81
|
-
|
|
83
|
+
callContext: CallContext;
|
|
82
84
|
/** List of transient auth witnesses to be used during this simulation */
|
|
83
85
|
authWitnesses: AuthWitness[];
|
|
84
86
|
capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
|
|
85
87
|
anchorBlockHeader: BlockHeader;
|
|
86
|
-
|
|
88
|
+
anchoredContractData: AnchoredContractData;
|
|
87
89
|
noteStore: NoteStore;
|
|
88
90
|
keyStore: KeyStore;
|
|
89
91
|
addressStore: AddressStore;
|
|
90
92
|
aztecNode: AztecNode;
|
|
91
93
|
recipientTaggingStore: RecipientTaggingStore;
|
|
92
|
-
|
|
94
|
+
taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
93
95
|
capsuleService: CapsuleService;
|
|
96
|
+
factService: FactService;
|
|
94
97
|
privateEventStore: PrivateEventStore;
|
|
95
|
-
|
|
98
|
+
txResolver: TxResolverService;
|
|
96
99
|
contractSyncService: ContractSyncService;
|
|
97
100
|
l2TipsStore: L2TipsProvider;
|
|
98
101
|
jobId: string;
|
|
@@ -117,24 +120,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
117
120
|
private offchainEffects: OffchainEffect[] = [];
|
|
118
121
|
private readonly ephemeralArrayService = new EphemeralArrayService();
|
|
119
122
|
protected readonly transientArrayService: TransientArrayService;
|
|
123
|
+
private readonly aztecNodeReadCache: AztecNodeReadCache;
|
|
120
124
|
|
|
121
125
|
// We store oracle version to be able to show a nice error message when an oracle handler is missing.
|
|
122
126
|
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
123
127
|
|
|
124
|
-
protected readonly
|
|
128
|
+
protected readonly callContext: CallContext;
|
|
125
129
|
protected readonly authWitnesses: AuthWitness[];
|
|
126
130
|
protected readonly capsules: Capsule[];
|
|
127
131
|
protected readonly anchorBlockHeader: BlockHeader;
|
|
128
|
-
protected readonly
|
|
132
|
+
protected readonly anchoredContractData: AnchoredContractData;
|
|
129
133
|
protected readonly noteStore: NoteStore;
|
|
130
134
|
protected readonly keyStore: KeyStore;
|
|
131
135
|
protected readonly addressStore: AddressStore;
|
|
132
136
|
protected readonly aztecNode: AztecNode;
|
|
133
137
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
134
|
-
protected readonly
|
|
138
|
+
protected readonly taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
135
139
|
protected readonly capsuleService: CapsuleService;
|
|
140
|
+
protected readonly factService: FactService;
|
|
136
141
|
protected readonly privateEventStore: PrivateEventStore;
|
|
137
|
-
protected readonly
|
|
142
|
+
protected readonly txResolver: TxResolverService;
|
|
138
143
|
protected readonly contractSyncService: ContractSyncService;
|
|
139
144
|
protected readonly l2TipsStore: L2TipsProvider;
|
|
140
145
|
protected readonly jobId: string;
|
|
@@ -145,20 +150,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
145
150
|
protected readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
146
151
|
|
|
147
152
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
148
|
-
this.
|
|
153
|
+
this.callContext = args.callContext;
|
|
149
154
|
this.authWitnesses = args.authWitnesses;
|
|
150
155
|
this.capsules = args.capsules;
|
|
151
156
|
this.anchorBlockHeader = args.anchorBlockHeader;
|
|
152
|
-
this.
|
|
157
|
+
this.anchoredContractData = args.anchoredContractData;
|
|
153
158
|
this.noteStore = args.noteStore;
|
|
154
159
|
this.keyStore = args.keyStore;
|
|
155
160
|
this.addressStore = args.addressStore;
|
|
156
161
|
this.aztecNode = args.aztecNode;
|
|
157
162
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
158
|
-
this.
|
|
163
|
+
this.taggingSecretSourcesStore = args.taggingSecretSourcesStore;
|
|
159
164
|
this.capsuleService = args.capsuleService;
|
|
165
|
+
this.factService = args.factService;
|
|
160
166
|
this.privateEventStore = args.privateEventStore;
|
|
161
|
-
this.
|
|
167
|
+
this.txResolver = args.txResolver;
|
|
162
168
|
this.contractSyncService = args.contractSyncService;
|
|
163
169
|
this.l2TipsStore = args.l2TipsStore;
|
|
164
170
|
this.jobId = args.jobId;
|
|
@@ -168,6 +174,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
168
174
|
this.hooks = args.hooks;
|
|
169
175
|
this.utilityExecutor = args.utilityExecutor;
|
|
170
176
|
this.transientArrayService = args.transientArrayService;
|
|
177
|
+
this.aztecNodeReadCache = new AztecNodeReadCache(args.aztecNode);
|
|
171
178
|
}
|
|
172
179
|
|
|
173
180
|
public assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
@@ -194,17 +201,22 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
194
201
|
}
|
|
195
202
|
|
|
196
203
|
public getUtilityContext(): UtilityContext {
|
|
197
|
-
return
|
|
204
|
+
return {
|
|
205
|
+
blockHeader: this.anchorBlockHeader,
|
|
206
|
+
contractAddress: this.callContext.contractAddress,
|
|
207
|
+
msgSender: this.callContext.msgSender,
|
|
208
|
+
};
|
|
198
209
|
}
|
|
199
210
|
|
|
200
211
|
/**
|
|
201
212
|
* Retrieve keys associated with a specific master public key and app address.
|
|
202
213
|
* @param pkMHash - The master public key hash.
|
|
214
|
+
* @param _keyIndex - Sent by the Noir oracle caller but unused here; kept to match the oracle signature.
|
|
203
215
|
* @returns A Promise that resolves to nullifier keys.
|
|
204
216
|
* @throws If the keys are not registered in the key store.
|
|
205
217
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
206
218
|
*/
|
|
207
|
-
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
219
|
+
public async getKeyValidationRequest(pkMHash: Fr, _keyIndex: Fr): Promise<KeyValidationRequest> {
|
|
208
220
|
let hasAccess = false;
|
|
209
221
|
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
210
222
|
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
@@ -256,9 +268,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
256
268
|
// hash at all. If the block hash did not exist by the reference block hash, then the node will not return the
|
|
257
269
|
// membership witness as there is none.
|
|
258
270
|
const witness = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
259
|
-
this.
|
|
271
|
+
this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash),
|
|
272
|
+
);
|
|
273
|
+
return witness ? Option.some(witness) : Option.none();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Returns whether each block hash is present in the archive tree at the referenced block. */
|
|
277
|
+
public async areBlockHashesInArchive(
|
|
278
|
+
referenceBlockHash: BlockHash,
|
|
279
|
+
blockHashes: EphemeralArray<BlockHash>,
|
|
280
|
+
): Promise<EphemeralArray<boolean>> {
|
|
281
|
+
const hashes = blockHashes.readAll(this.ephemeralArrayService);
|
|
282
|
+
const memberships = await this.#queryWithBlockHashNotAfterAnchor(referenceBlockHash, () =>
|
|
283
|
+
Promise.all(
|
|
284
|
+
hashes.map(blockHash =>
|
|
285
|
+
this.aztecNodeReadCache.getBlockHashMembershipWitness(referenceBlockHash, blockHash).then(Boolean),
|
|
286
|
+
),
|
|
287
|
+
),
|
|
260
288
|
);
|
|
261
|
-
return
|
|
289
|
+
return EphemeralArray.fromValues(this.ephemeralArrayService, memberships);
|
|
262
290
|
}
|
|
263
291
|
|
|
264
292
|
/**
|
|
@@ -309,7 +337,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
309
337
|
*/
|
|
310
338
|
public async getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness> {
|
|
311
339
|
const witness = await this.#queryWithBlockHashNotAfterAnchor(blockHash, () =>
|
|
312
|
-
this.
|
|
340
|
+
this.aztecNodeReadCache.getPublicDataWitness(blockHash, leafSlot),
|
|
313
341
|
);
|
|
314
342
|
if (!witness) {
|
|
315
343
|
throw new Error(`Public data witness not found for slot ${leafSlot} at block hash ${blockHash.toString()}.`);
|
|
@@ -350,7 +378,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
350
378
|
): Promise<Option<{ publicKeys: PublicKeys; partialAddress: PartialAddress }>> {
|
|
351
379
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
352
380
|
if (!completeAddress) {
|
|
353
|
-
return Option.none(
|
|
381
|
+
return Option.none();
|
|
354
382
|
}
|
|
355
383
|
return Option.some({ publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress });
|
|
356
384
|
}
|
|
@@ -360,7 +388,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
360
388
|
if (!completeAddress) {
|
|
361
389
|
throw new Error(
|
|
362
390
|
`No public key registered for address ${account}.
|
|
363
|
-
Register it by calling
|
|
391
|
+
Register it by calling wallet.registerSender(...).\nSee docs for context: https://docs.aztec.network/errors/14`,
|
|
364
392
|
);
|
|
365
393
|
}
|
|
366
394
|
return completeAddress;
|
|
@@ -371,8 +399,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
371
399
|
* @param address - Address.
|
|
372
400
|
* @returns A contract instance.
|
|
373
401
|
*/
|
|
374
|
-
public async getContractInstance(address: AztecAddress): Promise<
|
|
375
|
-
const instance = await this.
|
|
402
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress> {
|
|
403
|
+
const instance = await this.anchoredContractData.getContractInstance(address);
|
|
376
404
|
if (!instance) {
|
|
377
405
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
378
406
|
}
|
|
@@ -469,23 +497,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
469
497
|
}
|
|
470
498
|
|
|
471
499
|
/**
|
|
472
|
-
* Returns the membership witness of an
|
|
473
|
-
* @param contractAddress - Address of a contract by which the message was emitted.
|
|
500
|
+
* Returns the membership witness of an L1 to L2 message.
|
|
474
501
|
* @param messageHash - Hash of the message.
|
|
475
|
-
* @param
|
|
476
|
-
*
|
|
502
|
+
* @param nullifier - When present, the unsiloed nullifier of the message and the address to silo it with. The witness
|
|
503
|
+
* is only returned if the siloed nullifier is absent from the nullifier tree, i.e. the message has not been consumed.
|
|
477
504
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
478
505
|
*/
|
|
479
|
-
public async
|
|
480
|
-
const [messageIndex, siblingPath] = await
|
|
506
|
+
public async getL1ToL2MembershipWitnessV2(messageHash: Fr, nullifier: Option<UnsiloedMessageNullifier>) {
|
|
507
|
+
const [messageIndex, siblingPath] = await getL1ToL2MessageWitness(
|
|
481
508
|
this.aztecNode,
|
|
482
|
-
contractAddress,
|
|
483
509
|
messageHash,
|
|
484
|
-
|
|
510
|
+
nullifier.value,
|
|
485
511
|
await this.anchorBlockHeader.hash(),
|
|
486
512
|
);
|
|
487
513
|
|
|
488
|
-
return
|
|
514
|
+
return { index: messageIndex, siblingPath };
|
|
489
515
|
}
|
|
490
516
|
|
|
491
517
|
/**
|
|
@@ -502,16 +528,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
502
528
|
numberOfElements: number,
|
|
503
529
|
) {
|
|
504
530
|
return this.#queryWithBlockHashNotAfterAnchor(blockHash, async () => {
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
531
|
+
const values = await this.aztecNodeReadCache.getPublicStorageRange(
|
|
532
|
+
blockHash,
|
|
533
|
+
contractAddress,
|
|
534
|
+
startStorageSlot,
|
|
535
|
+
numberOfElements,
|
|
511
536
|
);
|
|
512
537
|
|
|
513
538
|
this.logger.debug(
|
|
514
|
-
`Oracle storage read:
|
|
539
|
+
`Oracle storage read: start=${startStorageSlot.toString()} count=${numberOfElements} ` +
|
|
540
|
+
`address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
515
541
|
);
|
|
516
542
|
|
|
517
543
|
return values;
|
|
@@ -527,7 +553,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
527
553
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
528
554
|
this.contractLogger = await createContractLogger(
|
|
529
555
|
this.contractAddress,
|
|
530
|
-
addr => this.
|
|
556
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
531
557
|
'user',
|
|
532
558
|
{ instanceId: this.jobId },
|
|
533
559
|
);
|
|
@@ -544,7 +570,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
544
570
|
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
545
571
|
this.aztecnrLogger = await createContractLogger(
|
|
546
572
|
this.contractAddress,
|
|
547
|
-
addr => this.
|
|
573
|
+
addr => this.anchoredContractData.getDebugContractName(addr),
|
|
548
574
|
'aztecnr',
|
|
549
575
|
{ instanceId: this.jobId },
|
|
550
576
|
);
|
|
@@ -564,7 +590,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
564
590
|
}
|
|
565
591
|
|
|
566
592
|
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns it. */
|
|
567
|
-
public async
|
|
593
|
+
public async getPendingTaggedLogsV2(
|
|
568
594
|
scope: AztecAddress,
|
|
569
595
|
providedSecrets: EphemeralArray<ProvidedSecret>,
|
|
570
596
|
): Promise<EphemeralArray<PendingTaggedLog>> {
|
|
@@ -584,7 +610,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
584
610
|
this.l2TipsStore,
|
|
585
611
|
this.keyStore,
|
|
586
612
|
this.recipientTaggingStore,
|
|
587
|
-
this.
|
|
613
|
+
this.taggingSecretSourcesStore,
|
|
588
614
|
this.addressStore,
|
|
589
615
|
this.jobId,
|
|
590
616
|
this.logger.getBindings(),
|
|
@@ -622,7 +648,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
622
648
|
]);
|
|
623
649
|
}
|
|
624
650
|
|
|
625
|
-
public async
|
|
651
|
+
public async getLogsByTagV2(
|
|
626
652
|
requests: EphemeralArray<LogRetrievalRequest>,
|
|
627
653
|
): Promise<EphemeralArray<EphemeralArray<LogRetrievalResponse>>> {
|
|
628
654
|
const logRetrievalRequests = requests.readAll(this.ephemeralArrayService);
|
|
@@ -638,20 +664,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
638
664
|
return EphemeralArray.fromValues(this.ephemeralArrayService, innerArrays);
|
|
639
665
|
}
|
|
640
666
|
|
|
641
|
-
/**
|
|
642
|
-
public async
|
|
643
|
-
requests: EphemeralArray<Fr>,
|
|
644
|
-
): Promise<EphemeralArray<Option<MessageContext>>> {
|
|
667
|
+
/** Given an array of tx hashes, returns an aligned array of tx info if the tx is available. */
|
|
668
|
+
public async getResolvedTxs(requests: EphemeralArray<Fr>): Promise<EphemeralArray<Option<ResolvedTx>>> {
|
|
645
669
|
const txHashes = requests.readAll(this.ephemeralArrayService);
|
|
646
670
|
|
|
647
|
-
const
|
|
648
|
-
txHashes,
|
|
649
|
-
this.anchorBlockHeader.getBlockNumber(),
|
|
650
|
-
);
|
|
671
|
+
const resolved = await this.txResolver.resolveTxs(txHashes, this.anchorBlockHeader.getBlockNumber());
|
|
651
672
|
|
|
652
|
-
const options =
|
|
653
|
-
mc ? Option.some(mc) : Option.none<MessageContext>(MessageContext.empty()),
|
|
654
|
-
);
|
|
673
|
+
const options = resolved.map(r => (r ? Option.some(r) : Option.none<ResolvedTx>()));
|
|
655
674
|
return EphemeralArray.fromValues(this.ephemeralArrayService, options);
|
|
656
675
|
}
|
|
657
676
|
|
|
@@ -659,24 +678,30 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
659
678
|
* Fetches the effects of a transaction by its hash. Returns null if the tx is not found or is beyond the anchor
|
|
660
679
|
* block.
|
|
661
680
|
*/
|
|
662
|
-
public async getTxEffect(txHash: TxHash): Promise<Option<
|
|
681
|
+
public async getTxEffect(txHash: TxHash): Promise<Option<TxEffectData>> {
|
|
663
682
|
if (txHash.hash.isZero()) {
|
|
664
683
|
throw new Error('Invalid tx hash passed into aztec_utl_getTxEffect oracle handler');
|
|
665
684
|
}
|
|
666
685
|
|
|
667
|
-
const receipt = await this.
|
|
686
|
+
const receipt = await this.aztecNodeReadCache.getTxReceiptWithEffect(txHash);
|
|
668
687
|
if (!receipt.isMined() || !receipt.txEffect || receipt.blockNumber > this.anchorBlockHeader.getBlockNumber()) {
|
|
669
|
-
return Option.none(
|
|
688
|
+
return Option.none();
|
|
670
689
|
}
|
|
671
690
|
|
|
672
|
-
|
|
691
|
+
const txEffect = receipt.txEffect;
|
|
692
|
+
return Option.some({
|
|
693
|
+
...txEffect,
|
|
694
|
+
publicLogs: FlatPublicLogs.fromLogs(txEffect.publicLogs),
|
|
695
|
+
contractClassLogs: txEffect.contractClassLogs.map(log => ({
|
|
696
|
+
contractAddress: log.contractAddress,
|
|
697
|
+
fields: log.fields.toFields(),
|
|
698
|
+
emittedLength: log.emittedLength,
|
|
699
|
+
})),
|
|
700
|
+
});
|
|
673
701
|
}
|
|
674
702
|
|
|
675
703
|
public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
|
|
676
|
-
|
|
677
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
678
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
679
|
-
}
|
|
704
|
+
this.#assertOwnContract(contractAddress);
|
|
680
705
|
this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
|
|
681
706
|
}
|
|
682
707
|
|
|
@@ -686,19 +711,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
686
711
|
tSize: number,
|
|
687
712
|
scope: AztecAddress,
|
|
688
713
|
): Promise<Option<Fr[]>> {
|
|
689
|
-
|
|
690
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
691
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
692
|
-
}
|
|
714
|
+
this.#assertOwnContract(contractAddress);
|
|
693
715
|
const values = await this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
|
|
694
|
-
return values ? Option.some(values) : Option.none(
|
|
716
|
+
return values ? Option.some(values) : Option.none({ length: tSize });
|
|
695
717
|
}
|
|
696
718
|
|
|
697
719
|
public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
|
|
698
|
-
|
|
699
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
700
|
-
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
701
|
-
}
|
|
720
|
+
this.#assertOwnContract(contractAddress);
|
|
702
721
|
this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
|
|
703
722
|
}
|
|
704
723
|
|
|
@@ -709,11 +728,114 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
709
728
|
numEntries: number,
|
|
710
729
|
scope: AztecAddress,
|
|
711
730
|
): Promise<void> {
|
|
731
|
+
this.#assertOwnContract(contractAddress);
|
|
732
|
+
return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Asserts the executing contract may only access its own slice of PXE DB.
|
|
737
|
+
*/
|
|
738
|
+
#assertOwnContract(contractAddress: AztecAddress): void {
|
|
712
739
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
713
|
-
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
714
740
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
715
741
|
}
|
|
716
|
-
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* Records a fact into a collection. A `Some` origin block makes the fact retractable (pruned on reorg of that
|
|
746
|
+
* block), a `None` origin block makes it non-retractable, surviving reorgs.
|
|
747
|
+
*/
|
|
748
|
+
public recordFact(
|
|
749
|
+
contractAddress: AztecAddress,
|
|
750
|
+
scope: AztecAddress,
|
|
751
|
+
factCollectionTypeId: Fr,
|
|
752
|
+
factCollectionId: Fr,
|
|
753
|
+
factTypeId: Fr,
|
|
754
|
+
payload: EphemeralArray<Fr>,
|
|
755
|
+
originBlock: Option<OriginBlock>,
|
|
756
|
+
): Promise<void> {
|
|
757
|
+
this.#assertOwnContract(contractAddress);
|
|
758
|
+
return this.factService.recordFact(
|
|
759
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
760
|
+
factTypeId,
|
|
761
|
+
payload.readAll(this.ephemeralArrayService),
|
|
762
|
+
originBlock.isSome() ? originBlock.value : undefined,
|
|
763
|
+
this.jobId,
|
|
764
|
+
);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* Deletes a fact collection, removing all its facts. A no-op if no such collection exists.
|
|
769
|
+
*/
|
|
770
|
+
public deleteFactCollection(
|
|
771
|
+
contractAddress: AztecAddress,
|
|
772
|
+
scope: AztecAddress,
|
|
773
|
+
factCollectionTypeId: Fr,
|
|
774
|
+
factCollectionId: Fr,
|
|
775
|
+
): Promise<void> {
|
|
776
|
+
this.#assertOwnContract(contractAddress);
|
|
777
|
+
return this.factService.deleteFactCollection(
|
|
778
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
779
|
+
this.jobId,
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Returns a fact collection.
|
|
785
|
+
*/
|
|
786
|
+
public async getFactCollection(
|
|
787
|
+
contractAddress: AztecAddress,
|
|
788
|
+
scope: AztecAddress,
|
|
789
|
+
factCollectionTypeId: Fr,
|
|
790
|
+
factCollectionId: Fr,
|
|
791
|
+
): Promise<Option<FactCollection>> {
|
|
792
|
+
this.#assertOwnContract(contractAddress);
|
|
793
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
794
|
+
const collection = await this.factService.getFactCollection(
|
|
795
|
+
new FactCollectionKey(contractAddress, scope, factCollectionTypeId, factCollectionId),
|
|
796
|
+
tips,
|
|
797
|
+
this.jobId,
|
|
798
|
+
);
|
|
799
|
+
return collection
|
|
800
|
+
? Option.some(
|
|
801
|
+
toNoirFactCollection(
|
|
802
|
+
this.ephemeralArrayService,
|
|
803
|
+
contractAddress,
|
|
804
|
+
scope,
|
|
805
|
+
factCollectionTypeId,
|
|
806
|
+
factCollectionId,
|
|
807
|
+
collection.facts,
|
|
808
|
+
),
|
|
809
|
+
)
|
|
810
|
+
: Option.none(emptyFactCollection(this.ephemeralArrayService));
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/** Returns every fact collection of `factCollectionTypeId`. */
|
|
814
|
+
public async getFactCollectionsByType(
|
|
815
|
+
contractAddress: AztecAddress,
|
|
816
|
+
scope: AztecAddress,
|
|
817
|
+
factCollectionTypeId: Fr,
|
|
818
|
+
): Promise<EphemeralArray<FactCollection>> {
|
|
819
|
+
this.#assertOwnContract(contractAddress);
|
|
820
|
+
const tips = anchoredTipBlockNumbers(await this.l2TipsStore.getL2Tips(), this.anchorBlockHeader.getBlockNumber());
|
|
821
|
+
const collections = await this.factService.getFactCollectionsByType(
|
|
822
|
+
new FactCollectionTypeKey(contractAddress, scope, factCollectionTypeId),
|
|
823
|
+
tips,
|
|
824
|
+
this.jobId,
|
|
825
|
+
);
|
|
826
|
+
return EphemeralArray.fromValues(
|
|
827
|
+
this.ephemeralArrayService,
|
|
828
|
+
collections.map(collection =>
|
|
829
|
+
toNoirFactCollection(
|
|
830
|
+
this.ephemeralArrayService,
|
|
831
|
+
collection.key.contractAddress,
|
|
832
|
+
collection.key.scope,
|
|
833
|
+
collection.key.factCollectionTypeId,
|
|
834
|
+
collection.key.factCollectionId,
|
|
835
|
+
collection.facts,
|
|
836
|
+
),
|
|
837
|
+
),
|
|
838
|
+
);
|
|
717
839
|
}
|
|
718
840
|
|
|
719
841
|
/**
|
|
@@ -739,7 +861,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
739
861
|
const plaintext = await aes128.decryptBufferCBC(Buffer.from(ciphertext.data), iv, symKey);
|
|
740
862
|
return Option.some(BoundedVec.from<number>({ data: [...plaintext], maxLength: capacity }));
|
|
741
863
|
} catch {
|
|
742
|
-
return Option.none(
|
|
864
|
+
return Option.none({ maxLength: capacity });
|
|
743
865
|
}
|
|
744
866
|
}
|
|
745
867
|
|
|
@@ -748,11 +870,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
748
870
|
* @param address - The recipient address.
|
|
749
871
|
* @param ephPks - Ephemeral array containing the serialized Points.
|
|
750
872
|
* @param contractAddress - The contract address for app-siloing (validated against execution context).
|
|
751
|
-
* @returns A new ephemeral array containing the computed shared secrets
|
|
873
|
+
* @returns A new ephemeral array containing the computed shared secrets, or an empty array when the PXE does not
|
|
874
|
+
* hold the keys for `address`, signaling that no secrets can be derived for it.
|
|
752
875
|
*/
|
|
753
876
|
public async getSharedSecrets(
|
|
754
877
|
address: AztecAddress,
|
|
755
|
-
ephPks: EphemeralArray<
|
|
878
|
+
ephPks: EphemeralArray<EmbeddedCurvePoint>,
|
|
756
879
|
contractAddress: AztecAddress,
|
|
757
880
|
): Promise<EphemeralArray<Fr>> {
|
|
758
881
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
@@ -760,14 +883,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
760
883
|
`getSharedSecrets called with contract address ${contractAddress}, expected ${this.contractAddress}`,
|
|
761
884
|
);
|
|
762
885
|
}
|
|
763
|
-
const recipientCompleteAddress = await this.
|
|
886
|
+
const recipientCompleteAddress = await this.addressStore.getCompleteAddress(address);
|
|
887
|
+
if (!recipientCompleteAddress) {
|
|
888
|
+
this.logger.warn(
|
|
889
|
+
`Computing shared secrets for address ${address} whose keys are not held - returning no secrets`,
|
|
890
|
+
{
|
|
891
|
+
address,
|
|
892
|
+
contractAddress: this.contractAddress,
|
|
893
|
+
},
|
|
894
|
+
);
|
|
895
|
+
return EphemeralArray.fromValues<Fr>(this.ephemeralArrayService, []);
|
|
896
|
+
}
|
|
764
897
|
const ivpkMHash = await hashPublicKey(recipientCompleteAddress.publicKeys.ivpkM);
|
|
765
898
|
const ivskM = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
766
899
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
767
900
|
|
|
768
901
|
const ephPkPoints = ephPks.readAll(this.ephemeralArrayService);
|
|
769
902
|
const secrets = await Promise.all(
|
|
770
|
-
ephPkPoints.map(
|
|
903
|
+
ephPkPoints.map(({ x, y }) => appSiloEcdhSharedSecret(addressSecret, new Point(x, y), this.contractAddress)),
|
|
771
904
|
);
|
|
772
905
|
|
|
773
906
|
return EphemeralArray.fromValues(this.ephemeralArrayService, secrets);
|
|
@@ -840,36 +973,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
840
973
|
functionSelector: FunctionSelector,
|
|
841
974
|
args: Fr[],
|
|
842
975
|
): Promise<Fr[]> {
|
|
843
|
-
const targetArtifact = await this.
|
|
976
|
+
const targetArtifact = await this.anchoredContractData.getFunctionArtifactWithDebugMetadata(
|
|
844
977
|
targetContractAddress,
|
|
845
978
|
functionSelector,
|
|
846
979
|
);
|
|
980
|
+
if (!targetArtifact) {
|
|
981
|
+
throw new Error(
|
|
982
|
+
`Cannot call ${targetContractAddress}:${functionSelector}: the contract is not registered. ` +
|
|
983
|
+
`Register it via wallet.registerContract(...).`,
|
|
984
|
+
);
|
|
985
|
+
}
|
|
847
986
|
|
|
848
987
|
if (!targetContractAddress.equals(this.contractAddress)) {
|
|
849
|
-
//
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
if (!isHandshakeRegistryRead) {
|
|
855
|
-
const [callerInstance, targetInstance] = await Promise.all([
|
|
856
|
-
this.getContractInstance(this.contractAddress),
|
|
857
|
-
this.getContractInstance(targetContractAddress),
|
|
988
|
+
// Standard handshake registry reads are authorized by default; every other cross-contract call needs the hook.
|
|
989
|
+
if (!(await isStandardHandshakeRegistryUtilityRead(targetContractAddress, functionSelector))) {
|
|
990
|
+
const [callerClassId, targetClassId] = await Promise.all([
|
|
991
|
+
this.anchoredContractData.getCurrentClassId(this.contractAddress),
|
|
992
|
+
this.anchoredContractData.getCurrentClassId(targetContractAddress),
|
|
858
993
|
]);
|
|
994
|
+
if (!callerClassId || !targetClassId) {
|
|
995
|
+
throw new Error(
|
|
996
|
+
`Cannot authorize utility call from ${this.contractAddress} to ${targetContractAddress}: ` +
|
|
997
|
+
`${!callerClassId ? this.contractAddress : targetContractAddress} is not registered.`,
|
|
998
|
+
);
|
|
999
|
+
}
|
|
859
1000
|
const request: UtilityCallAuthorizationRequest = {
|
|
860
1001
|
caller: this.contractAddress,
|
|
861
|
-
callerClassId
|
|
1002
|
+
callerClassId,
|
|
862
1003
|
target: targetContractAddress,
|
|
863
|
-
targetClassId
|
|
1004
|
+
targetClassId,
|
|
864
1005
|
functionSelector,
|
|
865
1006
|
functionName: targetArtifact.name,
|
|
866
1007
|
args,
|
|
867
1008
|
callerContext: this.callerContext,
|
|
868
1009
|
};
|
|
869
1010
|
|
|
870
|
-
const response = this.hooks
|
|
1011
|
+
const response = this.hooks?.authorizeUtilityCall
|
|
871
1012
|
? await this.hooks.authorizeUtilityCall(request)
|
|
872
|
-
: { authorized: false, reason: 'No
|
|
1013
|
+
: { authorized: false, reason: 'No authorizeUtilityCall hook configured' };
|
|
873
1014
|
|
|
874
1015
|
if (!response.authorized) {
|
|
875
1016
|
const reason = response.reason ? `: ${response.reason}` : '';
|
|
@@ -896,20 +1037,26 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
896
1037
|
);
|
|
897
1038
|
|
|
898
1039
|
const nestedOracle = new UtilityExecutionOracle({
|
|
899
|
-
|
|
1040
|
+
callContext: CallContext.from({
|
|
1041
|
+
msgSender: this.contractAddress,
|
|
1042
|
+
contractAddress: targetContractAddress,
|
|
1043
|
+
functionSelector,
|
|
1044
|
+
isStaticCall: true,
|
|
1045
|
+
}),
|
|
900
1046
|
authWitnesses: this.authWitnesses,
|
|
901
1047
|
capsules: this.capsules,
|
|
902
1048
|
anchorBlockHeader: this.anchorBlockHeader,
|
|
903
|
-
|
|
1049
|
+
anchoredContractData: this.anchoredContractData,
|
|
904
1050
|
noteStore: this.noteStore,
|
|
905
1051
|
keyStore: this.keyStore,
|
|
906
1052
|
addressStore: this.addressStore,
|
|
907
1053
|
aztecNode: this.aztecNode,
|
|
908
1054
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
909
|
-
|
|
1055
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
910
1056
|
capsuleService: this.capsuleService,
|
|
1057
|
+
factService: this.factService,
|
|
911
1058
|
privateEventStore: this.privateEventStore,
|
|
912
|
-
|
|
1059
|
+
txResolver: this.txResolver,
|
|
913
1060
|
contractSyncService: this.contractSyncService,
|
|
914
1061
|
l2TipsStore: this.l2TipsStore,
|
|
915
1062
|
jobId: this.jobId,
|
|
@@ -949,9 +1096,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
949
1096
|
*/
|
|
950
1097
|
async #fetchTxEffects(txHashes: TxHash[]): Promise<Map<string, IndexedTxEffect>> {
|
|
951
1098
|
const uniqueTxHashes = uniqueBy(txHashes, h => h.toString());
|
|
952
|
-
const fetched = await Promise.all(
|
|
953
|
-
uniqueTxHashes.map(h => this.aztecNode.getTxReceipt(h, { includeTxEffect: true })),
|
|
954
|
-
);
|
|
1099
|
+
const fetched = await Promise.all(uniqueTxHashes.map(h => this.aztecNodeReadCache.getTxReceiptWithEffect(h)));
|
|
955
1100
|
return new Map(
|
|
956
1101
|
uniqueTxHashes
|
|
957
1102
|
.map((h, i): [string, IndexedTxEffect | undefined] => {
|
|
@@ -985,7 +1130,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
985
1130
|
const [response] = await Promise.all([
|
|
986
1131
|
query(),
|
|
987
1132
|
(async () => {
|
|
988
|
-
const block = await this.
|
|
1133
|
+
const block = await this.aztecNodeReadCache.getBlock(blockHash);
|
|
989
1134
|
const header = block?.header;
|
|
990
1135
|
if (!header) {
|
|
991
1136
|
throw new Error(`Could not find block header for block hash ${blockHash}`);
|
|
@@ -1005,4 +1150,44 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
1005
1150
|
protected get callerContext(): 'private' | 'private view' | 'utility' {
|
|
1006
1151
|
return 'utility';
|
|
1007
1152
|
}
|
|
1153
|
+
|
|
1154
|
+
/** The address of the contract whose function is being executed, from the call context. */
|
|
1155
|
+
protected get contractAddress(): AztecAddress {
|
|
1156
|
+
return this.callContext.contractAddress;
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
// Registry reads that any contract may issue without an `authorizeUtilityCall` hook. The constrained-delivery
|
|
1161
|
+
// library calls these implicitly for the app, and they are safe to default-authorize: `get_app_siloed_secrets`
|
|
1162
|
+
// siloes every returned secret to `msg_sender`, and `get_non_interactive_handshakes` only exposes ephemeral public
|
|
1163
|
+
// keys, from which the shared secret cannot be derived without the recipient's secret keys.
|
|
1164
|
+
const STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES = [
|
|
1165
|
+
'get_non_interactive_handshakes((Field),u32)',
|
|
1166
|
+
'get_app_siloed_secrets((Field),(Field))',
|
|
1167
|
+
];
|
|
1168
|
+
|
|
1169
|
+
async function doesSelectorHaveSignature(functionSelector: FunctionSelector, signature: string): Promise<boolean> {
|
|
1170
|
+
return functionSelector.equals(await FunctionSelector.fromSignature(signature));
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
/**
|
|
1174
|
+
* Whether a cross-contract utility call targets one of the standard handshake registry's read functions.
|
|
1175
|
+
*
|
|
1176
|
+
* These reads are authorized by PXE for every wallet, without consulting the `authorizeUtilityCall` hook, so that
|
|
1177
|
+
* wallets don't need to know the handshake registry exists in order to deliver and discover messages through it.
|
|
1178
|
+
*/
|
|
1179
|
+
async function isStandardHandshakeRegistryUtilityRead(
|
|
1180
|
+
targetContractAddress: AztecAddress,
|
|
1181
|
+
functionSelector: FunctionSelector,
|
|
1182
|
+
): Promise<boolean> {
|
|
1183
|
+
if (!targetContractAddress.equals(STANDARD_HANDSHAKE_REGISTRY_ADDRESS)) {
|
|
1184
|
+
return false;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
const matches = await Promise.all(
|
|
1188
|
+
STANDARD_HANDSHAKE_REGISTRY_DEFAULT_AUTHORIZED_READ_SIGNATURES.map(signature =>
|
|
1189
|
+
doesSelectorHaveSignature(functionSelector, signature),
|
|
1190
|
+
),
|
|
1191
|
+
);
|
|
1192
|
+
return matches.some(Boolean);
|
|
1008
1193
|
}
|