@aztec/pxe 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316
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 +8 -23
- package/dest/bin/index.d.ts +2 -2
- package/dest/bin/index.d.ts.map +1 -1
- package/dest/bin/index.js +1 -1
- package/dest/bin/oracle_version_helpers.d.ts +16 -8
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
- package/dest/bin/oracle_version_helpers.js +22 -69
- 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 +18 -14
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +54 -18
- 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/contract_sync_service.d.ts +48 -0
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
- 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/skip_sync_contracts.d.ts +11 -0
- package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
- package/dest/contract/skip_sync_contracts.js +18 -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 +63 -32
- 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 +19 -10
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +6 -9
- 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 -24
- 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 +19 -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 +9 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -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 +2 -3
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- 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 +43 -31
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +259 -29
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +180 -45
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1024 -341
- 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 +2 -3
- 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 +132 -22
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +77 -34
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +247 -106
- 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/debug/pxe_debug_utils.d.ts +2 -2
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.d.ts +2 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/lazy/index.d.ts +2 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/store.d.ts +14 -0
- package/dest/entrypoints/client/store.d.ts.map +1 -0
- package/dest/entrypoints/client/store.js +42 -0
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +6 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -2
- package/dest/entrypoints/server/store.d.ts +18 -0
- package/dest/entrypoints/server/store.d.ts.map +1 -0
- package/dest/entrypoints/server/store.js +28 -0
- 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 +16 -4
- 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 +31 -11
- 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 +8 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +88 -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} +13 -8
- package/dest/notes/note_service.d.ts +1 -1
- package/dest/notes/note_service.js +1 -1
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +5 -5
- package/dest/private_kernel/batch_planner.d.ts +1 -1
- package/dest/private_kernel/batch_planner.d.ts.map +1 -1
- package/dest/private_kernel/batch_planner.js +1 -1
- 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 +61 -40
- 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 +114 -48
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +225 -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/anchor_block_store/anchor_block_store.d.ts +9 -6
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
- 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 +129 -49
- 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 +59 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +60 -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 +42 -33
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +197 -168
- 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 +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/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 +40 -43
- package/dest/storage/store_identity.d.ts +35 -0
- package/dest/storage/store_identity.d.ts.map +1 -0
- package/dest/storage/store_identity.js +44 -0
- 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/sender_tagging_store.d.ts +19 -3
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +48 -11
- 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 +3 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +28 -10
- package/dest/tagging/index.d.ts +2 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +26 -8
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +95 -20
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +1 -1
- 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 +6 -2
- package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
- package/dest/tagging/testing/tag_query_test_utils.js +10 -0
- package/package.json +17 -17
- package/src/bin/check_oracle_version.ts +8 -24
- package/src/bin/index.ts +1 -1
- package/src/bin/oracle_version_helpers.ts +23 -90
- package/src/block_synchronizer/block_stream_source.ts +6 -45
- package/src/block_synchronizer/block_synchronizer.ts +70 -29
- 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 +37 -50
- package/src/contract/helpers.ts +35 -0
- package/src/contract/skip_sync_contracts.ts +23 -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 +96 -42
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +48 -13
- 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 -26
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -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 +1 -2
- 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 +172 -47
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +814 -315
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +167 -30
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +399 -135
- package/src/contract_function_simulator/transient_array_service.ts +91 -0
- package/src/debug/pxe_debug_utils.ts +1 -1
- package/src/entrypoints/client/bundle/index.ts +1 -0
- package/src/entrypoints/client/bundle/utils.ts +24 -5
- package/src/entrypoints/client/lazy/index.ts +1 -0
- package/src/entrypoints/client/lazy/utils.ts +24 -5
- package/src/entrypoints/client/store.ts +54 -0
- package/src/entrypoints/pxe_creation_options.ts +8 -2
- package/src/entrypoints/server/index.ts +6 -2
- package/src/entrypoints/server/store.ts +47 -0
- package/src/entrypoints/server/utils.ts +31 -9
- package/src/error_enriching.ts +27 -11
- package/src/hooks/execution_hooks.ts +32 -12
- 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 +100 -37
- package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
- package/src/notes/note_service.ts +1 -1
- package/src/oracle_version.ts +5 -5
- package/src/private_kernel/batch_planner.ts +0 -1
- 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 +112 -56
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +328 -159
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
- 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 +9 -15
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
- 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 +29 -9
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
- 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 +15 -0
- package/src/storage/fact_store/origin_state.ts +84 -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 +226 -187
- package/src/storage/note_store/stored_note.ts +5 -27
- package/src/storage/open_pxe_stores.ts +6 -3
- package/src/storage/private_event_store/private_event_store.ts +49 -55
- package/src/storage/store_identity.ts +72 -0
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/sender_tagging_store.ts +62 -15
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +30 -10
- package/src/tagging/index.ts +1 -1
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +148 -30
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +1 -1
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +6 -2
- package/src/tagging/testing/tag_query_test_utils.ts +11 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/oracle.js +0 -552
- 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 +0 -42
- 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/oracle/oracle.ts +0 -711
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
CONTRACT_CLASS_LOG_SIZE_IN_FIELDS,
|
|
3
|
+
FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH,
|
|
4
4
|
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
5
5
|
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
6
6
|
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
@@ -8,48 +8,96 @@ import {
|
|
|
8
8
|
MAX_NULLIFIERS_PER_TX,
|
|
9
9
|
MAX_PRIVATE_LOGS_PER_TX,
|
|
10
10
|
MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
11
|
+
NULLIFIER_TREE_HEIGHT,
|
|
12
|
+
PRIVATE_LOG_CIPHERTEXT_LEN,
|
|
13
|
+
PRIVATE_LOG_SIZE_IN_FIELDS,
|
|
14
|
+
PUBLIC_DATA_TREE_HEIGHT,
|
|
11
15
|
} from '@aztec/constants';
|
|
12
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
16
|
+
import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
13
17
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
14
18
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
15
|
-
import {
|
|
19
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
16
20
|
import { FieldReader } from '@aztec/foundation/serialize';
|
|
17
|
-
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
18
|
-
import {
|
|
21
|
+
import { MembershipWitness, type SiblingPath } from '@aztec/foundation/trees';
|
|
22
|
+
import type { ACVMField } from '@aztec/simulator/client';
|
|
19
23
|
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
20
24
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
21
25
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
22
26
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
23
|
-
import type {
|
|
27
|
+
import type { ContractInstancePreimage, PartialAddress } from '@aztec/stdlib/contract';
|
|
28
|
+
import type { GasFees } from '@aztec/stdlib/gas';
|
|
24
29
|
import { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
25
30
|
import type { PublicKeys } from '@aztec/stdlib/keys';
|
|
26
31
|
import {
|
|
27
32
|
type AppTaggingSecretKind,
|
|
28
|
-
|
|
29
|
-
ContractClassLogFields,
|
|
30
|
-
FlatPublicLogs,
|
|
31
|
-
MessageContext,
|
|
32
|
-
PendingTaggedLog,
|
|
33
|
+
type FlatPublicLogs,
|
|
33
34
|
PrivateLog,
|
|
34
35
|
Tag,
|
|
35
36
|
appTaggingSecretKindFromDeliveryMode,
|
|
36
37
|
} from '@aztec/stdlib/logs';
|
|
37
|
-
import {
|
|
38
|
-
|
|
38
|
+
import {
|
|
39
|
+
type AppendOnlyTreeSnapshot,
|
|
40
|
+
type NullifierLeaf,
|
|
41
|
+
type NullifierLeafPreimage,
|
|
42
|
+
NullifierMembershipWitness,
|
|
43
|
+
type PublicDataTreeLeaf,
|
|
44
|
+
type PublicDataTreeLeafPreimage,
|
|
45
|
+
PublicDataWitness,
|
|
46
|
+
} from '@aztec/stdlib/trees';
|
|
47
|
+
import {
|
|
48
|
+
BlockHeader,
|
|
49
|
+
type GlobalVariables,
|
|
50
|
+
type PartialStateReference,
|
|
51
|
+
type StateReference,
|
|
52
|
+
TxHash,
|
|
53
|
+
} from '@aztec/stdlib/tx';
|
|
39
54
|
|
|
55
|
+
import {
|
|
56
|
+
type OriginBlock,
|
|
57
|
+
type OriginBlockState,
|
|
58
|
+
type RetractableFactOrigin,
|
|
59
|
+
originBlockStateFromNumber,
|
|
60
|
+
} from '../../storage/fact_store/index.js';
|
|
40
61
|
import { BoundedVec } from '../noir-structs/bounded_vec.js';
|
|
62
|
+
import type { ContractClassLogData } from '../noir-structs/contract_class_log_data.js';
|
|
63
|
+
import type { EmbeddedCurvePoint } from '../noir-structs/embedded_curve_point.js';
|
|
41
64
|
import { EphemeralArray } from '../noir-structs/ephemeral_array.js';
|
|
42
65
|
import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
66
|
+
import type { Fact } from '../noir-structs/fact.js';
|
|
67
|
+
import type { FactCollection } from '../noir-structs/fact_collection.js';
|
|
68
|
+
import { type LogRetrievalRequest, type LogSource, logSourceFromField } from '../noir-structs/log_retrieval_request.js';
|
|
69
|
+
import type { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
45
70
|
import type { NoteData } from '../noir-structs/note_data.js';
|
|
46
71
|
import { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
47
72
|
import { Option } from '../noir-structs/option.js';
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
73
|
+
import type { PendingTaggedLog } from '../noir-structs/pending_tagged_log.js';
|
|
74
|
+
import type { ProvidedSecret } from '../noir-structs/provided_secret.js';
|
|
75
|
+
import {
|
|
76
|
+
type ResolvedTaggingStrategy,
|
|
77
|
+
resolvedTaggingStrategyFromFields,
|
|
78
|
+
resolvedTaggingStrategyToFields,
|
|
79
|
+
} from '../noir-structs/resolved_tagging_strategy.js';
|
|
80
|
+
import type { ResolvedTx } from '../noir-structs/resolved_tx.js';
|
|
81
|
+
import type { TxEffectData } from '../noir-structs/tx_effect_data.js';
|
|
82
|
+
import type { UtilityContext } from '../noir-structs/utility_context.js';
|
|
83
|
+
import type { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
51
84
|
import { packAsHintedNote } from './note_packing_utils.js';
|
|
52
85
|
|
|
86
|
+
// `ORACLE_REGISTRY` infers its entry signatures from these mappings, so its emitted declaration (and the oracle
|
|
87
|
+
// interfaces derived from it) names the protocol types below. Re-exporting them gives tsc a portable path to each
|
|
88
|
+
// type instead of falling back to a deep node_modules path that breaks .d.ts portability (TS2742).
|
|
89
|
+
export type {
|
|
90
|
+
AppTaggingSecretKind,
|
|
91
|
+
BlockHash,
|
|
92
|
+
BlockHeader,
|
|
93
|
+
ContractInstancePreimage,
|
|
94
|
+
MembershipWitness,
|
|
95
|
+
NullifierMembershipWitness,
|
|
96
|
+
PendingTaggedLog,
|
|
97
|
+
PublicDataWitness,
|
|
98
|
+
TxHash,
|
|
99
|
+
};
|
|
100
|
+
|
|
53
101
|
// ─── Core Types ──────────────────────────────────────────────────────────────
|
|
54
102
|
|
|
55
103
|
/** One ACVM input slot: an array of hex-encoded field strings. */
|
|
@@ -58,28 +106,57 @@ export type InputSlot = ACVMField[];
|
|
|
58
106
|
/** One ACVM output slot: a scalar hex string or an array of hex strings. */
|
|
59
107
|
export type OutputSlot = ACVMField | ACVMField[];
|
|
60
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Wire layout of a single slot:
|
|
111
|
+
* - `'scalar'` — a bare field (one `Fr`); on the ACVM/Noir wire a `Field`.
|
|
112
|
+
* - `{ len }` — an array of exactly `len` fields (`Fr[]`); a `[Field; len]`.
|
|
113
|
+
* - `'variable'` — a slot whose field count is not statically known and cannot be sized on demand (a string, a
|
|
114
|
+
* length-prefixed struct). It contributes to the slot count but can never be zero-filled.
|
|
115
|
+
* - `{ lenFrom: fn }` — like `'variable'`, but its field count can be resolved from a runtime size descriptor. The
|
|
116
|
+
* descriptor's shape is type-specific (e.g. `{ length }`, `{ maxLength }`), so `size` is typed `any`: a single union
|
|
117
|
+
* can't type each mapping's distinct `lenFrom` under parameter contravariance.
|
|
118
|
+
*/
|
|
119
|
+
export type SlotShape = 'scalar' | { len: number } | 'variable' | { lenFrom: (size: any) => number };
|
|
120
|
+
|
|
61
121
|
/**
|
|
62
122
|
* Describes how to serialize and/or deserialize a single typed value to/from ACVM wire format.
|
|
63
123
|
* Either side is optional — output-only types omit `deserialization`, input-only types omit `serialization`.
|
|
64
124
|
*/
|
|
65
125
|
export interface TypeMapping<T = any> {
|
|
126
|
+
/**
|
|
127
|
+
* Discriminant for this mapping's shape: which scalar or combinator it is. The `is*Mapping` guards switch on it, and
|
|
128
|
+
* the combinators tag it (`'array'`, `'option'`, `'struct'`, ...). For a scalar it also names the Noir-declared type
|
|
129
|
+
* (`'field'`, `'u32'`), which is then its {@link label}.
|
|
130
|
+
*/
|
|
131
|
+
kind: string;
|
|
132
|
+
/**
|
|
133
|
+
* The wire-structural Noir type string the oracle interface hash is computed from:
|
|
134
|
+
* - a scalar's is its bare `kind` (`'field'`);
|
|
135
|
+
* - a combinator's is built from its inner mappings' labels (`'array(field,4)'`, `'option(u32)'`);
|
|
136
|
+
* - a struct's is a nameless `'{field,u32}'`, with nested struct labels spliced into the parent.
|
|
137
|
+
*
|
|
138
|
+
* The label encodes exactly what the wire does, so anything the wire tolerates (field names, struct-in-struct
|
|
139
|
+
* nesting, a TS wrapper over a Noir primitive like `TX_HASH` over `Field`) shares a label — and mappings sharing a
|
|
140
|
+
* label must be wire-equivalent.
|
|
141
|
+
*/
|
|
142
|
+
label: string;
|
|
66
143
|
serialization?: {
|
|
67
144
|
/** Convert a typed value to ACVM output slot(s). */
|
|
68
145
|
fn: (value: T) => (Fr | Fr[])[];
|
|
69
146
|
};
|
|
70
147
|
deserialization?: {
|
|
71
|
-
/** Read a typed value from one FieldReader per
|
|
148
|
+
/** Read a typed value from its slots — one {@link FieldReader} per slot, as laid out by {@link shape}. */
|
|
72
149
|
fn: (readers: FieldReader[]) => T;
|
|
73
|
-
/**
|
|
74
|
-
* Number of InputSlots this type reads from. `deserialization.fn` receives one FieldReader per slot in `readers`.
|
|
75
|
-
*
|
|
76
|
-
* Examples:
|
|
77
|
-
* - `FIELD`, `U32`, `AZTEC_ADDRESS` — single slot → `slots: 1`
|
|
78
|
-
* - `OPTION(T)` — discriminant + inner slots → `slots: T.slots + 1`
|
|
79
|
-
* - `CONTRACT_CLASS_LOG_INPUT` — [addr], [fields], [len] → `slots: 3`
|
|
80
|
-
*/
|
|
81
|
-
slots: number;
|
|
82
150
|
};
|
|
151
|
+
/**
|
|
152
|
+
* The type's wire layout, one entry per slot.
|
|
153
|
+
*
|
|
154
|
+
* Examples:
|
|
155
|
+
* - `FIELD` → `['scalar']` // single slot
|
|
156
|
+
* - `OPTION(T)` → `['scalar', ...T.shape]` // [discriminant], [...inner.shape]
|
|
157
|
+
* - `CONTRACT_CLASS_LOG` → `['scalar', { len: N }, 'scalar']` // [addr], [fields], [len]
|
|
158
|
+
*/
|
|
159
|
+
shape: SlotShape[];
|
|
83
160
|
}
|
|
84
161
|
|
|
85
162
|
export type MaybePromise<T> = T | Promise<T>;
|
|
@@ -99,65 +176,91 @@ export function assertReadersConsumed(readers: FieldReader[]): void {
|
|
|
99
176
|
|
|
100
177
|
// ─── Scalar Type Mappings ────────────────────────────────────────────────────
|
|
101
178
|
|
|
102
|
-
|
|
179
|
+
/**
|
|
180
|
+
* A leaf mapping whose {@link TypeMapping.label} is just its bare {@link TypeMapping.kind}. Its wire shape is arbitrary
|
|
181
|
+
* (several fields, or a variable-width run); a single-field scalar uses the shorter {@link SCALAR} instead.
|
|
182
|
+
*/
|
|
183
|
+
export function LEAF<T>(mapping: Omit<TypeMapping<T>, 'label'>): TypeMapping<T> {
|
|
184
|
+
return { ...mapping, label: mapping.kind };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** A {@link LEAF} occupying a single `'scalar'` wire slot, so callers omit the shape. */
|
|
188
|
+
export function SCALAR<T>(mapping: Omit<TypeMapping<T>, 'label' | 'shape'>): TypeMapping<T> {
|
|
189
|
+
return LEAF({ ...mapping, shape: ['scalar'] });
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export const FIELD: TypeMapping<Fr> = SCALAR({
|
|
193
|
+
kind: 'field',
|
|
103
194
|
serialization: { fn: v => [v] },
|
|
104
|
-
deserialization: { fn: ([reader]) => reader.readField()
|
|
105
|
-
};
|
|
195
|
+
deserialization: { fn: ([reader]) => reader.readField() },
|
|
196
|
+
});
|
|
106
197
|
|
|
107
|
-
export const BOOL: TypeMapping<boolean> = {
|
|
198
|
+
export const BOOL: TypeMapping<boolean> = SCALAR({
|
|
199
|
+
kind: 'bool',
|
|
108
200
|
serialization: { fn: v => [new Fr(v ? 1n : 0n)] },
|
|
109
|
-
deserialization: { fn: ([reader]) => !reader.readField().isZero()
|
|
110
|
-
};
|
|
201
|
+
deserialization: { fn: ([reader]) => !reader.readField().isZero() },
|
|
202
|
+
});
|
|
111
203
|
|
|
112
|
-
export const U32: TypeMapping<number> = {
|
|
204
|
+
export const U32: TypeMapping<number> = SCALAR({
|
|
205
|
+
kind: 'u32',
|
|
113
206
|
serialization: { fn: v => [new Fr(v)] },
|
|
114
|
-
deserialization: {
|
|
115
|
-
|
|
116
|
-
const value = reader.readField().toBigInt();
|
|
117
|
-
if (value > 0xffffffffn) {
|
|
118
|
-
throw new Error(`U32 overflow: value ${value} exceeds u32 max (${0xffffffffn})`);
|
|
119
|
-
}
|
|
120
|
-
return Number(value);
|
|
121
|
-
},
|
|
122
|
-
slots: 1,
|
|
123
|
-
},
|
|
124
|
-
};
|
|
207
|
+
deserialization: { fn: ([reader]) => Number(uintFromField(reader.readField(), 32)) },
|
|
208
|
+
});
|
|
125
209
|
|
|
126
|
-
export const BLOCK_NUMBER: TypeMapping<BlockNumber> = {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
};
|
|
210
|
+
export const BLOCK_NUMBER: TypeMapping<BlockNumber> = ALIAS(U32, {
|
|
211
|
+
wrap: v => BlockNumber(v),
|
|
212
|
+
unwrap: v => v,
|
|
213
|
+
});
|
|
130
214
|
|
|
131
|
-
|
|
132
|
-
|
|
215
|
+
export const U8: TypeMapping<number> = SCALAR({
|
|
216
|
+
kind: 'u8',
|
|
133
217
|
serialization: { fn: byte => [new Fr(byte)] },
|
|
218
|
+
deserialization: { fn: ([reader]) => Number(uintFromField(reader.readField(), 8)) },
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// Noir passes `MessageDelivery` onchain variants here.
|
|
222
|
+
export const DELIVERY_MODE: TypeMapping<AppTaggingSecretKind> = SCALAR({
|
|
223
|
+
kind: 'onchain-delivery-mode',
|
|
134
224
|
deserialization: {
|
|
135
|
-
fn:
|
|
136
|
-
const value = reader.readField().toBigInt();
|
|
137
|
-
if (value > 0xffn) {
|
|
138
|
-
throw new Error(`BYTE overflow: value ${value} exceeds u8 max (255)`);
|
|
139
|
-
}
|
|
140
|
-
return Number(value);
|
|
141
|
-
},
|
|
142
|
-
slots: 1,
|
|
225
|
+
fn: readers => appTaggingSecretKindFromDeliveryMode(U8.deserialization!.fn(readers)),
|
|
143
226
|
},
|
|
144
|
-
};
|
|
227
|
+
});
|
|
145
228
|
|
|
146
|
-
|
|
147
|
-
|
|
229
|
+
export const RESOLVED_TAGGING_STRATEGY: TypeMapping<ResolvedTaggingStrategy> = LEAF({
|
|
230
|
+
kind: 'resolved-tagging-strategy',
|
|
231
|
+
serialization: { fn: resolved => resolvedTaggingStrategyToFields(resolved) },
|
|
148
232
|
deserialization: {
|
|
149
|
-
fn:
|
|
150
|
-
|
|
233
|
+
fn: ([kindReader, secretReader]) =>
|
|
234
|
+
resolvedTaggingStrategyFromFields(kindReader.readField().toNumber(), secretReader.readField()),
|
|
151
235
|
},
|
|
152
|
-
|
|
236
|
+
shape: ['scalar', 'scalar'],
|
|
237
|
+
});
|
|
153
238
|
|
|
154
|
-
export const BIGINT: TypeMapping<bigint> = {
|
|
239
|
+
export const BIGINT: TypeMapping<bigint> = ALIAS(FIELD, {
|
|
240
|
+
wrap: f => f.toBigInt(),
|
|
241
|
+
unwrap: v => new Fr(v),
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
export const U64: TypeMapping<bigint> = SCALAR({
|
|
245
|
+
kind: 'u64',
|
|
155
246
|
serialization: { fn: v => [new Fr(v)] },
|
|
156
|
-
deserialization: { fn: ([reader]) => reader.readField()
|
|
157
|
-
};
|
|
247
|
+
deserialization: { fn: ([reader]) => uintFromField(reader.readField(), 64) },
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
export const U128: TypeMapping<bigint> = SCALAR({
|
|
251
|
+
kind: 'u128',
|
|
252
|
+
serialization: { fn: v => [new Fr(v)] },
|
|
253
|
+
deserialization: { fn: ([reader]) => uintFromField(reader.readField(), 128) },
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
export const LEAF_INDEX: TypeMapping<number> = ALIAS(FIELD, {
|
|
257
|
+
wrap: f => f.toNumber(),
|
|
258
|
+
unwrap: v => new Fr(v),
|
|
259
|
+
});
|
|
158
260
|
|
|
159
261
|
/** Reads every field in the slot as a UTF-8 character code. */
|
|
160
|
-
export const STR: TypeMapping<string> = {
|
|
262
|
+
export const STR: TypeMapping<string> = LEAF({
|
|
263
|
+
kind: 'str',
|
|
161
264
|
serialization: { fn: str => [Array.from(Buffer.from(str, 'utf-8')).map(b => new Fr(b))] },
|
|
162
265
|
deserialization: {
|
|
163
266
|
fn: ([reader]) => {
|
|
@@ -167,165 +270,234 @@ export const STR: TypeMapping<string> = {
|
|
|
167
270
|
}
|
|
168
271
|
return chars.join('');
|
|
169
272
|
},
|
|
170
|
-
slots: 1,
|
|
171
273
|
},
|
|
172
|
-
|
|
274
|
+
shape: ['variable'],
|
|
275
|
+
});
|
|
173
276
|
|
|
174
|
-
export const AZTEC_ADDRESS: TypeMapping<AztecAddress> = {
|
|
277
|
+
export const AZTEC_ADDRESS: TypeMapping<AztecAddress> = SCALAR({
|
|
278
|
+
kind: 'aztec-address',
|
|
175
279
|
serialization: { fn: v => [v.toField()] },
|
|
176
|
-
deserialization: { fn: ([reader]) => AztecAddress.
|
|
177
|
-
};
|
|
280
|
+
deserialization: { fn: ([reader]) => AztecAddress.fromFieldUnsafe(reader.readField()) },
|
|
281
|
+
});
|
|
178
282
|
|
|
179
|
-
export const BLOCK_HASH: TypeMapping<BlockHash> = {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
};
|
|
283
|
+
export const BLOCK_HASH: TypeMapping<BlockHash> = ALIAS(FIELD, {
|
|
284
|
+
wrap: f => new BlockHash(f),
|
|
285
|
+
unwrap: v => new Fr(v.toBuffer()),
|
|
286
|
+
});
|
|
183
287
|
|
|
184
|
-
export const FUNCTION_SELECTOR: TypeMapping<FunctionSelector> = {
|
|
288
|
+
export const FUNCTION_SELECTOR: TypeMapping<FunctionSelector> = SCALAR({
|
|
289
|
+
kind: 'function-selector',
|
|
185
290
|
serialization: { fn: v => [v.toField()] },
|
|
186
|
-
deserialization: { fn: ([reader]) => FunctionSelector.fromField(reader.readField())
|
|
187
|
-
};
|
|
291
|
+
deserialization: { fn: ([reader]) => FunctionSelector.fromField(reader.readField()) },
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
export const NOTE_SELECTOR: TypeMapping<NoteSelector> = ALIAS(FIELD, {
|
|
295
|
+
wrap: f => NoteSelector.fromField(f),
|
|
296
|
+
unwrap: v => v.toField(),
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
export const TX_HASH: TypeMapping<TxHash> = ALIAS(FIELD, {
|
|
300
|
+
wrap: f => TxHash.fromField(f),
|
|
301
|
+
unwrap: v => v.hash,
|
|
302
|
+
});
|
|
188
303
|
|
|
189
|
-
|
|
304
|
+
const TAG: TypeMapping<Tag> = ALIAS(FIELD, {
|
|
305
|
+
wrap: f => new Tag(f),
|
|
306
|
+
unwrap: v => v.value,
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
export const POINT: TypeMapping<EmbeddedCurvePoint> = STRUCT([
|
|
310
|
+
{ name: 'x', type: FIELD },
|
|
311
|
+
{ name: 'y', type: FIELD },
|
|
312
|
+
]);
|
|
313
|
+
|
|
314
|
+
const LOG_SOURCE: TypeMapping<LogSource> = SCALAR({
|
|
315
|
+
kind: 'log-source',
|
|
316
|
+
serialization: { fn: v => [new Fr(v)] },
|
|
317
|
+
deserialization: { fn: ([reader]) => logSourceFromField(reader.readField()) },
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
export const ETH_ADDRESS: TypeMapping<EthAddress> = SCALAR({
|
|
321
|
+
kind: 'eth-address',
|
|
190
322
|
serialization: { fn: v => [v.toField()] },
|
|
191
|
-
deserialization: { fn: ([reader]) =>
|
|
192
|
-
};
|
|
323
|
+
deserialization: { fn: ([reader]) => EthAddress.fromField(reader.readField()) },
|
|
324
|
+
});
|
|
193
325
|
|
|
194
|
-
export const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
};
|
|
326
|
+
export const SLOT_NUMBER: TypeMapping<SlotNumber> = ALIAS(FIELD, {
|
|
327
|
+
unwrap: v => new Fr(v),
|
|
328
|
+
});
|
|
198
329
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
330
|
+
const APPEND_ONLY_TREE_SNAPSHOT: TypeMapping<AppendOnlyTreeSnapshot> = STRUCT<AppendOnlyTreeSnapshot>([
|
|
331
|
+
{ name: 'root', type: FIELD },
|
|
332
|
+
{ name: 'nextAvailableLeafIndex', type: LEAF_INDEX },
|
|
333
|
+
]);
|
|
203
334
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
},
|
|
210
|
-
};
|
|
335
|
+
const PARTIAL_STATE_REFERENCE: TypeMapping<PartialStateReference> = STRUCT<PartialStateReference>([
|
|
336
|
+
{ name: 'noteHashTree', type: APPEND_ONLY_TREE_SNAPSHOT },
|
|
337
|
+
{ name: 'nullifierTree', type: APPEND_ONLY_TREE_SNAPSHOT },
|
|
338
|
+
{ name: 'publicDataTree', type: APPEND_ONLY_TREE_SNAPSHOT },
|
|
339
|
+
]);
|
|
211
340
|
|
|
212
|
-
|
|
341
|
+
const STATE_REFERENCE: TypeMapping<StateReference> = STRUCT<StateReference>([
|
|
342
|
+
{ name: 'l1ToL2MessageTree', type: APPEND_ONLY_TREE_SNAPSHOT },
|
|
343
|
+
{ name: 'partial', type: PARTIAL_STATE_REFERENCE },
|
|
344
|
+
]);
|
|
213
345
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
346
|
+
const GAS_FEES: TypeMapping<GasFees> = STRUCT<GasFees>([
|
|
347
|
+
{ name: 'feePerDaGas', type: U128 },
|
|
348
|
+
{ name: 'feePerL2Gas', type: U128 },
|
|
349
|
+
]);
|
|
218
350
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
},
|
|
225
|
-
}
|
|
351
|
+
const GLOBAL_VARIABLES: TypeMapping<GlobalVariables> = STRUCT<GlobalVariables>([
|
|
352
|
+
{ name: 'chainId', type: FIELD },
|
|
353
|
+
{ name: 'version', type: FIELD },
|
|
354
|
+
{ name: 'blockNumber', type: BLOCK_NUMBER },
|
|
355
|
+
{ name: 'slotNumber', type: SLOT_NUMBER },
|
|
356
|
+
{ name: 'timestamp', type: U64 },
|
|
357
|
+
{ name: 'coinbase', type: ETH_ADDRESS },
|
|
358
|
+
{ name: 'feeRecipient', type: AZTEC_ADDRESS },
|
|
359
|
+
{ name: 'gasFees', type: GAS_FEES },
|
|
360
|
+
]);
|
|
226
361
|
|
|
227
|
-
export const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
...v.publicKeys.toFields(),
|
|
236
|
-
],
|
|
237
|
-
},
|
|
238
|
-
};
|
|
362
|
+
export const BLOCK_HEADER: TypeMapping<BlockHeader> = STRUCT<BlockHeader>([
|
|
363
|
+
{ name: 'lastArchive', type: APPEND_ONLY_TREE_SNAPSHOT },
|
|
364
|
+
{ name: 'state', type: STATE_REFERENCE },
|
|
365
|
+
{ name: 'spongeBlobHash', type: FIELD },
|
|
366
|
+
{ name: 'globalVariables', type: GLOBAL_VARIABLES },
|
|
367
|
+
{ name: 'totalFees', type: FIELD },
|
|
368
|
+
{ name: 'totalManaUsed', type: FIELD },
|
|
369
|
+
]);
|
|
239
370
|
|
|
240
|
-
export const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
.toNoirRepresentation()
|
|
245
|
-
.map(slot => (Array.isArray(slot) ? slot.map(s => Fr.fromString(s)) : Fr.fromString(slot as string))),
|
|
246
|
-
},
|
|
247
|
-
};
|
|
371
|
+
export const KEY_VALIDATION_REQUEST: TypeMapping<KeyValidationRequest> = STRUCT<KeyValidationRequest>([
|
|
372
|
+
{ name: 'pkMHash', type: FIELD },
|
|
373
|
+
{ name: 'skApp', type: FIELD },
|
|
374
|
+
]);
|
|
248
375
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
},
|
|
256
|
-
|
|
376
|
+
const PUBLIC_KEYS: TypeMapping<PublicKeys> = STRUCT<PublicKeys>([
|
|
377
|
+
{ name: 'npkMHash', type: FIELD },
|
|
378
|
+
{ name: 'ivpkM', type: POINT },
|
|
379
|
+
{ name: 'ovpkMHash', type: FIELD },
|
|
380
|
+
{ name: 'tpkMHash', type: FIELD },
|
|
381
|
+
{ name: 'mspkMHash', type: FIELD },
|
|
382
|
+
{ name: 'fbpkMHash', type: FIELD },
|
|
383
|
+
]);
|
|
257
384
|
|
|
258
|
-
export const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
},
|
|
265
|
-
}
|
|
385
|
+
export const CONTRACT_INSTANCE: TypeMapping<ContractInstancePreimage> = STRUCT<ContractInstancePreimage>([
|
|
386
|
+
{ name: 'salt', type: FIELD },
|
|
387
|
+
{ name: 'deployer', type: AZTEC_ADDRESS },
|
|
388
|
+
// Note that the nr side of this struct does not contain the current class, only original
|
|
389
|
+
{ name: 'originalContractClassId', type: FIELD },
|
|
390
|
+
{ name: 'initializationHash', type: FIELD },
|
|
391
|
+
{ name: 'immutablesHash', type: FIELD },
|
|
392
|
+
{ name: 'publicKeys', type: PUBLIC_KEYS },
|
|
393
|
+
]);
|
|
266
394
|
|
|
267
|
-
|
|
268
|
-
serialization: {
|
|
269
|
-
fn: (ctx: UtilityContext) => [...ctx.blockHeader.toFields(), ctx.contractAddress.toField()],
|
|
270
|
-
},
|
|
271
|
-
};
|
|
395
|
+
const NULLIFIER_LEAF: TypeMapping<NullifierLeaf> = STRUCT<NullifierLeaf>([{ name: 'nullifier', type: FIELD }]);
|
|
272
396
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
397
|
+
const NULLIFIER_LEAF_PREIMAGE: TypeMapping<NullifierLeafPreimage> = STRUCT<NullifierLeafPreimage>([
|
|
398
|
+
{ name: 'leaf', type: NULLIFIER_LEAF },
|
|
399
|
+
{ name: 'nextKey', type: FIELD },
|
|
400
|
+
{ name: 'nextIndex', type: BIGINT },
|
|
401
|
+
]);
|
|
402
|
+
|
|
403
|
+
export const NULLIFIER_MEMBERSHIP_WITNESS: TypeMapping<NullifierMembershipWitness> = STRUCT<NullifierMembershipWitness>(
|
|
404
|
+
[
|
|
405
|
+
{ name: 'leafPreimage', type: NULLIFIER_LEAF_PREIMAGE },
|
|
406
|
+
{ name: 'index', type: BIGINT },
|
|
407
|
+
{ name: 'siblingPath', type: SIBLING_PATH(NULLIFIER_TREE_HEIGHT) },
|
|
408
|
+
],
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
const PUBLIC_DATA_LEAF: TypeMapping<PublicDataTreeLeaf> = STRUCT<PublicDataTreeLeaf>([
|
|
412
|
+
{ name: 'slot', type: FIELD },
|
|
413
|
+
{ name: 'value', type: FIELD },
|
|
414
|
+
]);
|
|
415
|
+
|
|
416
|
+
const PUBLIC_DATA_LEAF_PREIMAGE: TypeMapping<PublicDataTreeLeafPreimage> = STRUCT<PublicDataTreeLeafPreimage>([
|
|
417
|
+
{ name: 'leaf', type: PUBLIC_DATA_LEAF },
|
|
418
|
+
{ name: 'nextKey', type: FIELD },
|
|
419
|
+
{ name: 'nextIndex', type: BIGINT },
|
|
420
|
+
]);
|
|
421
|
+
|
|
422
|
+
export const PUBLIC_DATA_WITNESS: TypeMapping<PublicDataWitness> = STRUCT<PublicDataWitness>([
|
|
423
|
+
{ name: 'index', type: BIGINT },
|
|
424
|
+
{ name: 'leafPreimage', type: PUBLIC_DATA_LEAF_PREIMAGE },
|
|
425
|
+
{ name: 'siblingPath', type: SIBLING_PATH(PUBLIC_DATA_TREE_HEIGHT) },
|
|
426
|
+
]);
|
|
427
|
+
|
|
428
|
+
export const MESSAGE_LOAD_ORACLE_INPUTS: TypeMapping<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>> = STRUCT<
|
|
429
|
+
MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>
|
|
430
|
+
>([
|
|
431
|
+
{ name: 'index', type: BIGINT },
|
|
432
|
+
{ name: 'siblingPath', type: SIBLING_PATH(L1_TO_L2_MSG_TREE_HEIGHT) },
|
|
433
|
+
]);
|
|
434
|
+
|
|
435
|
+
export const UTILITY_CONTEXT: TypeMapping<UtilityContext> = STRUCT<UtilityContext>([
|
|
436
|
+
{ name: 'blockHeader', type: BLOCK_HEADER },
|
|
437
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
438
|
+
{ name: 'msgSender', type: AZTEC_ADDRESS },
|
|
439
|
+
]);
|
|
440
|
+
|
|
441
|
+
export const CALL_PRIVATE_RESULT: TypeMapping<{ endSideEffectCounter: Fr; returnsHash: Fr }> = STRUCT([
|
|
442
|
+
{ name: 'endSideEffectCounter', type: FIELD },
|
|
443
|
+
{ name: 'returnsHash', type: FIELD },
|
|
444
|
+
]);
|
|
276
445
|
|
|
277
446
|
export const PUBLIC_KEYS_AND_PARTIAL_ADDRESS: TypeMapping<{
|
|
278
447
|
publicKeys: PublicKeys;
|
|
279
448
|
partialAddress: PartialAddress;
|
|
280
|
-
}> =
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
};
|
|
449
|
+
}> = STRUCT([
|
|
450
|
+
{ name: 'publicKeys', type: PUBLIC_KEYS },
|
|
451
|
+
{ name: 'partialAddress', type: FIELD },
|
|
452
|
+
]);
|
|
285
453
|
|
|
286
|
-
export const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
const length = lengthReader.readField().toNumber();
|
|
292
|
-
return new ContractClassLog(addr, fields, length);
|
|
293
|
-
},
|
|
294
|
-
// ContractClassLog input occupies 3 ACVM slots: [contractAddress], [message fields...], [length].
|
|
295
|
-
slots: 3,
|
|
296
|
-
},
|
|
297
|
-
};
|
|
454
|
+
export const CONTRACT_CLASS_LOG: TypeMapping<ContractClassLogData> = STRUCT([
|
|
455
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
456
|
+
{ name: 'fields', type: FIXED_ARRAY(FIELD, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS) },
|
|
457
|
+
{ name: 'emittedLength', type: U32 },
|
|
458
|
+
]);
|
|
298
459
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
},
|
|
325
|
-
},
|
|
326
|
-
};
|
|
460
|
+
const PUBLIC_DATA_WRITE: TypeMapping<PublicDataWrite> = STRUCT<PublicDataWrite>([
|
|
461
|
+
{ name: 'leafSlot', type: FIELD },
|
|
462
|
+
{ name: 'value', type: FIELD },
|
|
463
|
+
]);
|
|
464
|
+
|
|
465
|
+
const PRIVATE_LOG: TypeMapping<PrivateLog> = STRUCT<PrivateLog>([
|
|
466
|
+
{ name: 'fields', type: FIXED_ARRAY(FIELD, PRIVATE_LOG_SIZE_IN_FIELDS) },
|
|
467
|
+
{ name: 'emittedLength', type: U32 },
|
|
468
|
+
]);
|
|
469
|
+
|
|
470
|
+
const FLAT_PUBLIC_LOGS: TypeMapping<FlatPublicLogs> = STRUCT<FlatPublicLogs>([
|
|
471
|
+
{ name: 'length', type: U32 },
|
|
472
|
+
{ name: 'payload', type: FIXED_ARRAY(FIELD, FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH) },
|
|
473
|
+
]);
|
|
474
|
+
|
|
475
|
+
const CONTRACT_CLASS_LOG_ENTRY: TypeMapping<ContractClassLogData> = STRUCT<ContractClassLogData>([
|
|
476
|
+
{ name: 'fields', type: FIXED_ARRAY(FIELD, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS) },
|
|
477
|
+
{ name: 'emittedLength', type: U32 },
|
|
478
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
479
|
+
]);
|
|
480
|
+
|
|
481
|
+
const CONTRACT_CLASS_LOGS: TypeMapping<ContractClassLogData[]> = FIXED_ARRAY(
|
|
482
|
+
CONTRACT_CLASS_LOG_ENTRY,
|
|
483
|
+
MAX_CONTRACT_CLASS_LOGS_PER_TX,
|
|
484
|
+
);
|
|
327
485
|
|
|
328
|
-
export const
|
|
486
|
+
export const TX_EFFECT: TypeMapping<TxEffectData> = STRUCT<TxEffectData>([
|
|
487
|
+
{ name: 'revertCode', type: U8 },
|
|
488
|
+
{ name: 'txHash', type: TX_HASH },
|
|
489
|
+
{ name: 'transactionFee', type: FIELD },
|
|
490
|
+
{ name: 'noteHashes', type: FIXED_ARRAY(FIELD, MAX_NOTE_HASHES_PER_TX) },
|
|
491
|
+
{ name: 'nullifiers', type: FIXED_ARRAY(FIELD, MAX_NULLIFIERS_PER_TX) },
|
|
492
|
+
{ name: 'l2ToL1Msgs', type: FIXED_ARRAY(FIELD, MAX_L2_TO_L1_MSGS_PER_TX) },
|
|
493
|
+
{ name: 'publicDataWrites', type: FIXED_ARRAY(PUBLIC_DATA_WRITE, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) },
|
|
494
|
+
{ name: 'privateLogs', type: FIXED_ARRAY(PRIVATE_LOG, MAX_PRIVATE_LOGS_PER_TX) },
|
|
495
|
+
{ name: 'publicLogs', type: FLAT_PUBLIC_LOGS },
|
|
496
|
+
{ name: 'contractClassLogs', type: CONTRACT_CLASS_LOGS },
|
|
497
|
+
]);
|
|
498
|
+
|
|
499
|
+
export const NOTE: TypeMapping<NoteData> = LEAF({
|
|
500
|
+
kind: 'note',
|
|
329
501
|
serialization: {
|
|
330
502
|
fn: noteData =>
|
|
331
503
|
packAsHintedNote({
|
|
@@ -338,77 +510,168 @@ export const NOTE: TypeMapping<NoteData> = {
|
|
|
338
510
|
note: noteData.note,
|
|
339
511
|
}),
|
|
340
512
|
},
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
};
|
|
513
|
+
// A packed note is the note's (variable-count) field items followed by 6 metadata scalars, emitted as one field
|
|
514
|
+
// output per element. Its length depends on the note, so it is described as a single variable-width run.
|
|
515
|
+
shape: ['variable'],
|
|
516
|
+
});
|
|
346
517
|
|
|
347
|
-
export const NOTE_VALIDATION_REQUEST: TypeMapping<NoteValidationRequest> = {
|
|
518
|
+
export const NOTE_VALIDATION_REQUEST: TypeMapping<NoteValidationRequest> = LEAF({
|
|
519
|
+
kind: 'note-validation-request',
|
|
348
520
|
deserialization: {
|
|
349
521
|
fn: ([reader]) => NoteValidationRequest.fromFields(reader),
|
|
350
|
-
slots: 1,
|
|
351
522
|
},
|
|
352
|
-
|
|
523
|
+
shape: ['variable'],
|
|
524
|
+
});
|
|
353
525
|
|
|
354
|
-
export const EVENT_VALIDATION_REQUEST: TypeMapping<EventValidationRequest> = {
|
|
526
|
+
export const EVENT_VALIDATION_REQUEST: TypeMapping<EventValidationRequest> = LEAF({
|
|
527
|
+
kind: 'event-validation-request',
|
|
355
528
|
deserialization: {
|
|
356
529
|
fn: ([reader]) => EventValidationRequest.fromFields(reader),
|
|
357
|
-
slots: 1,
|
|
358
530
|
},
|
|
359
|
-
|
|
531
|
+
shape: ['variable'],
|
|
532
|
+
});
|
|
360
533
|
|
|
361
|
-
export const LOG_RETRIEVAL_REQUEST: TypeMapping<LogRetrievalRequest> =
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
},
|
|
367
|
-
|
|
534
|
+
export const LOG_RETRIEVAL_REQUEST: TypeMapping<LogRetrievalRequest> = STRUCT<LogRetrievalRequest>([
|
|
535
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
536
|
+
{ name: 'tag', type: TAG },
|
|
537
|
+
{ name: 'source', type: LOG_SOURCE },
|
|
538
|
+
{ name: 'fromBlock', type: OPTION(BLOCK_NUMBER) },
|
|
539
|
+
{ name: 'toBlock', type: OPTION(BLOCK_NUMBER) },
|
|
540
|
+
]);
|
|
368
541
|
|
|
369
|
-
export const LOG_RETRIEVAL_RESPONSE: TypeMapping<LogRetrievalResponse> =
|
|
370
|
-
|
|
371
|
-
}
|
|
542
|
+
export const LOG_RETRIEVAL_RESPONSE: TypeMapping<LogRetrievalResponse> = STRUCT<LogRetrievalResponse>([
|
|
543
|
+
{ name: 'logPayload', type: FIXED_BOUNDED_VEC(FIELD, PRIVATE_LOG_CIPHERTEXT_LEN) },
|
|
544
|
+
{ name: 'txHash', type: TX_HASH },
|
|
545
|
+
{ name: 'uniqueNoteHashesInTx', type: FIXED_BOUNDED_VEC(FIELD, MAX_NOTE_HASHES_PER_TX) },
|
|
546
|
+
{ name: 'firstNullifierInTx', type: FIELD },
|
|
547
|
+
{ name: 'blockNumber', type: BLOCK_NUMBER },
|
|
548
|
+
{ name: 'blockTimestamp', type: U64 },
|
|
549
|
+
{ name: 'blockHash', type: BLOCK_HASH },
|
|
550
|
+
]);
|
|
372
551
|
|
|
373
|
-
export const
|
|
374
|
-
|
|
375
|
-
}
|
|
552
|
+
export const RESOLVED_TX: TypeMapping<ResolvedTx> = STRUCT([
|
|
553
|
+
{ name: 'txHash', type: TX_HASH },
|
|
554
|
+
{ name: 'uniqueNoteHashesInTx', type: FIXED_BOUNDED_VEC(FIELD, MAX_NOTE_HASHES_PER_TX) },
|
|
555
|
+
{ name: 'firstNullifierInTx', type: FIELD },
|
|
556
|
+
{ name: 'blockNumber', type: U32 },
|
|
557
|
+
{ name: 'blockHash', type: FIELD },
|
|
558
|
+
]);
|
|
376
559
|
|
|
377
|
-
export const
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
560
|
+
export const PENDING_TAGGED_LOG: TypeMapping<PendingTaggedLog> = STRUCT([
|
|
561
|
+
{ name: 'log', type: FIXED_BOUNDED_VEC(FIELD, PRIVATE_LOG_SIZE_IN_FIELDS) },
|
|
562
|
+
{ name: 'context', type: RESOLVED_TX },
|
|
563
|
+
]);
|
|
564
|
+
|
|
565
|
+
export const ORIGIN_BLOCK: TypeMapping<OriginBlock> = STRUCT([
|
|
566
|
+
{ name: 'blockNumber', type: U32 },
|
|
567
|
+
{ name: 'blockHash', type: FIELD },
|
|
568
|
+
]);
|
|
569
|
+
|
|
570
|
+
const ORIGIN_BLOCK_STATE: TypeMapping<OriginBlockState> = SCALAR({
|
|
571
|
+
kind: 'origin-block-state',
|
|
572
|
+
serialization: { fn: v => [new Fr(v)] },
|
|
573
|
+
deserialization: { fn: ([reader]) => originBlockStateFromNumber(reader.readField().toNumber()) },
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
/** Read-side origin of a retractable fact, carrying the chain state of its origin block. */
|
|
577
|
+
export const RETRACTABLE_FACT_ORIGIN: TypeMapping<RetractableFactOrigin> = STRUCT([
|
|
578
|
+
{ name: 'blockNumber', type: U32 },
|
|
579
|
+
{ name: 'blockHash', type: FIELD },
|
|
580
|
+
{ name: 'blockState', type: ORIGIN_BLOCK_STATE },
|
|
581
|
+
]);
|
|
582
|
+
|
|
583
|
+
export const FACT: TypeMapping<Fact> = STRUCT([
|
|
584
|
+
{ name: 'factTypeId', type: FIELD },
|
|
585
|
+
{ name: 'payload', type: EPHEMERAL_ARRAY(FIELD) },
|
|
586
|
+
{ name: 'originBlock', type: OPTION(RETRACTABLE_FACT_ORIGIN) },
|
|
587
|
+
]);
|
|
588
|
+
|
|
589
|
+
export const FACT_COLLECTION: TypeMapping<FactCollection> = STRUCT([
|
|
590
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
591
|
+
{ name: 'scope', type: AZTEC_ADDRESS },
|
|
592
|
+
{ name: 'factCollectionTypeId', type: FIELD },
|
|
593
|
+
{ name: 'factCollectionId', type: FIELD },
|
|
594
|
+
{ name: 'facts', type: EPHEMERAL_ARRAY(FACT) },
|
|
595
|
+
]);
|
|
596
|
+
|
|
597
|
+
export const PROVIDED_SECRET: TypeMapping<ProvidedSecret> = STRUCT([
|
|
598
|
+
{ name: 'secret', type: FIELD },
|
|
599
|
+
{ name: 'mode', type: DELIVERY_MODE },
|
|
600
|
+
]);
|
|
383
601
|
|
|
384
602
|
// ─── Combinator Type Mappings ────────────────────────────────────────────────
|
|
385
603
|
|
|
386
|
-
/**
|
|
387
|
-
|
|
604
|
+
/**
|
|
605
|
+
* A TS-side alias of `base`: the same Noir type on the wire (it inherits `base`'s `kind`, `label`, and `shape`) but a
|
|
606
|
+
* richer TS value. `wrap` maps a base value to the alias, `unwrap` back; a serialize-only alias passes only `unwrap`.
|
|
607
|
+
*/
|
|
608
|
+
export function ALIAS<B, T>(
|
|
609
|
+
base: TypeMapping<B>,
|
|
610
|
+
conversions: { wrap?: (value: B) => T; unwrap?: (value: T) => B },
|
|
611
|
+
): TypeMapping<T> {
|
|
612
|
+
const { wrap, unwrap } = conversions;
|
|
613
|
+
return {
|
|
614
|
+
kind: base.kind,
|
|
615
|
+
label: base.label,
|
|
616
|
+
serialization: base.serialization && unwrap ? { fn: value => base.serialization!.fn(unwrap(value)) } : undefined,
|
|
617
|
+
deserialization:
|
|
618
|
+
base.deserialization && wrap ? { fn: readers => wrap(base.deserialization!.fn(readers)) } : undefined,
|
|
619
|
+
shape: base.shape,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
function SIBLING_PATH<N extends number>(height: N): TypeMapping<SiblingPath<N>> {
|
|
624
|
+
return LEAF({
|
|
625
|
+
// On the wire (and in Noir) a sibling path is a plain `[Field; height]`, so it shares the fixed-array kind.
|
|
626
|
+
kind: `array(field,${height})`,
|
|
627
|
+
serialization: { fn: sp => [sp.toFields()] },
|
|
628
|
+
shape: [{ len: height }],
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
export function MEMBERSHIP_WITNESS<N extends number>(height: N): TypeMapping<MembershipWitness<N>> {
|
|
633
|
+
return STRUCT<MembershipWitness<N>>([
|
|
634
|
+
{ name: 'leafIndex', type: BIGINT },
|
|
635
|
+
{ name: 'siblingPath', type: FIXED_ARRAY(FIELD, height) },
|
|
636
|
+
]);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
export function ARRAY<T>(inner: TypeMapping<T>): ArrayMapping<T> {
|
|
388
640
|
return {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
641
|
+
kind: 'array',
|
|
642
|
+
label: `array(${inner.label})`,
|
|
643
|
+
inner,
|
|
644
|
+
serialization: inner.serialization ? { fn: values => [packElements(inner, values)] } : undefined,
|
|
645
|
+
deserialization: inner.deserialization
|
|
646
|
+
? {
|
|
647
|
+
// The whole slot is the array, so read as many elements as its fields hold.
|
|
648
|
+
fn: ([reader]) => unpackElements(inner, reader, reader.remainingFields() / fieldWidth(inner.shape)),
|
|
649
|
+
}
|
|
650
|
+
: undefined,
|
|
651
|
+
// One slot of variable length (all elements flattened into it).
|
|
652
|
+
shape: [{ lenFrom: (size: { length: number }) => size.length * fieldWidth(inner.shape) }],
|
|
392
653
|
};
|
|
393
654
|
}
|
|
394
655
|
|
|
395
|
-
|
|
656
|
+
/**
|
|
657
|
+
* Noir's fixed-length array `[T; length]` in one slot: serializes `values` (each flattened via `element`)
|
|
658
|
+
* zero-padded to exactly `length * elementWidth` fields, and deserializes all `length` elements back. An absent
|
|
659
|
+
* element is the zero encoding, so the padding is derived from the shape.
|
|
660
|
+
*/
|
|
661
|
+
export function FIXED_ARRAY<T>(element: TypeMapping<T>, length: number): FixedArrayMapping<T> {
|
|
662
|
+
const elementWidth = fieldWidth(element.shape);
|
|
396
663
|
return {
|
|
664
|
+
kind: 'fixed-array',
|
|
665
|
+
label: `array(${element.label},${length})`,
|
|
666
|
+
inner: element,
|
|
667
|
+
length,
|
|
397
668
|
serialization: element.serialization
|
|
398
|
-
? { fn: values => [values.
|
|
669
|
+
? { fn: values => [padArrayEnd(packElements(element, values), Fr.ZERO, length * elementWidth)] }
|
|
399
670
|
: undefined,
|
|
400
671
|
deserialization: element.deserialization
|
|
401
|
-
? {
|
|
402
|
-
fn: ([reader]) => {
|
|
403
|
-
const result: T[] = [];
|
|
404
|
-
while (!reader.isFinished()) {
|
|
405
|
-
result.push(element.deserialization!.fn([reader]));
|
|
406
|
-
}
|
|
407
|
-
return result;
|
|
408
|
-
},
|
|
409
|
-
slots: 1,
|
|
410
|
-
}
|
|
672
|
+
? { fn: ([reader]) => unpackElements(element, reader, length) }
|
|
411
673
|
: undefined,
|
|
674
|
+
shape: [{ len: length * elementWidth }],
|
|
412
675
|
};
|
|
413
676
|
}
|
|
414
677
|
|
|
@@ -419,135 +682,371 @@ export function ARRAY<T>(element: TypeMapping<T>): TypeMapping<T[]> {
|
|
|
419
682
|
*
|
|
420
683
|
* Both directions are derived from `element`: bidirectional iff `element` has both serialization and deserialization.
|
|
421
684
|
*
|
|
422
|
-
* @example Serializing `BoundedVec.from({ data: [0x41, 0x42], maxLength: 4 })` with `BOUNDED_VEC(
|
|
685
|
+
* @example Serializing `BoundedVec.from({ data: [0x41, 0x42], maxLength: 4 })` with `BOUNDED_VEC(U8)`:
|
|
423
686
|
* ```
|
|
424
687
|
* slot 0: [Fr(0x41), Fr(0x42), Fr(0), Fr(0)] // data padded to maxLength
|
|
425
688
|
* slot 1: Fr(2) // actual length
|
|
426
689
|
* ```
|
|
427
690
|
*/
|
|
428
|
-
export function BOUNDED_VEC<T>(
|
|
691
|
+
export function BOUNDED_VEC<T>(inner: TypeMapping<T>): BoundedVecMapping<T> {
|
|
429
692
|
return {
|
|
430
|
-
|
|
693
|
+
kind: 'bounded-vec',
|
|
694
|
+
label: `bounded-vec(${inner.label})`,
|
|
695
|
+
inner,
|
|
696
|
+
serialization: inner.serialization
|
|
431
697
|
? {
|
|
432
698
|
fn: bv => {
|
|
433
699
|
if (bv.data.length > bv.maxLength) {
|
|
434
700
|
throw new Error(`Got ${bv.data.length} items, but maxLength is ${bv.maxLength}`);
|
|
435
701
|
}
|
|
436
|
-
|
|
437
|
-
|
|
702
|
+
// Fixed-width elements take their width from the shape (consistent with deserialization); only a
|
|
703
|
+
// variable-width element (e.g. a packed note) falls back to the runtime `elementSize` the value carries.
|
|
704
|
+
const elementWidth = tryFieldWidth(inner.shape) ?? bv.elementSize;
|
|
705
|
+
const flat = padArrayEnd(packElements(inner, bv.data), Fr.ZERO, bv.maxLength * elementWidth);
|
|
706
|
+
return [flat, new Fr(bv.data.length)];
|
|
438
707
|
},
|
|
439
708
|
}
|
|
440
709
|
: undefined,
|
|
441
|
-
deserialization:
|
|
710
|
+
deserialization: inner.deserialization
|
|
442
711
|
? {
|
|
443
712
|
fn: ([storageReader, lengthReader]) => {
|
|
444
|
-
|
|
713
|
+
// slot 0 is the padded storage, slot 1 the actual length. Parse only the first `length` elements out of
|
|
714
|
+
// storage, then drain the trailing zero-padding so the storage reader is fully consumed.
|
|
715
|
+
const maxLength = storageReader.remainingFields() / fieldWidth(inner.shape);
|
|
445
716
|
const length = lengthReader.readField().toNumber();
|
|
446
|
-
const elements
|
|
447
|
-
for (let i = 0; i < length; i++) {
|
|
448
|
-
elements.push(element.deserialization!.fn([storageReader]));
|
|
449
|
-
}
|
|
450
|
-
// Drain the trailing zero-padding (maxLength - length unused element slots) so the storage reader is
|
|
451
|
-
// fully consumed.
|
|
717
|
+
const elements = unpackElements(inner, storageReader, length);
|
|
452
718
|
storageReader.skip(storageReader.remainingFields());
|
|
453
719
|
return BoundedVec.from<T>({ data: elements, maxLength });
|
|
454
720
|
},
|
|
455
|
-
slots: 2,
|
|
456
721
|
}
|
|
457
722
|
: undefined,
|
|
723
|
+
// slot 0: variable-length storage; slot 1: the length scalar.
|
|
724
|
+
shape: [{ lenFrom: (size: { maxLength: number }) => size.maxLength * fieldWidth(inner.shape) }, 'scalar'],
|
|
458
725
|
};
|
|
459
726
|
}
|
|
460
727
|
|
|
461
728
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
729
|
+
* Noir's `BoundedVec<T, MaxLen>` in its padded form (one fixed-width slot): `maxLength * elementWidth` storage fields
|
|
730
|
+
* (zero-padded) followed by the actual length, with no length prefix, so the width is statically known. Serialize-only.
|
|
731
|
+
* Throws if the input exceeds `maxLength`.
|
|
732
|
+
*/
|
|
733
|
+
export function FIXED_BOUNDED_VEC<T>(element: TypeMapping<T>, maxLength: number): FixedBoundedVecMapping<T> {
|
|
734
|
+
const width = fieldWidth(element.shape);
|
|
735
|
+
return {
|
|
736
|
+
kind: 'fixed-bounded-vec',
|
|
737
|
+
label: `bounded-vec(${element.label},${maxLength})`,
|
|
738
|
+
inner: element,
|
|
739
|
+
maxLength,
|
|
740
|
+
serialization: element.serialization
|
|
741
|
+
? {
|
|
742
|
+
fn: values => {
|
|
743
|
+
if (values.length > maxLength) {
|
|
744
|
+
throw new Error(`Got ${values.length} items, but maxLength is ${maxLength}`);
|
|
745
|
+
}
|
|
746
|
+
const flat = padArrayEnd(packElements(element, values), Fr.ZERO, maxLength * width);
|
|
747
|
+
return [[...flat, new Fr(values.length)]];
|
|
748
|
+
},
|
|
749
|
+
}
|
|
750
|
+
: undefined,
|
|
751
|
+
shape: [{ len: maxLength * width + 1 }],
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Wraps an inner TypeMapping in Noir-style `Option<T>`, adding a leading discriminant slot.
|
|
757
|
+
*
|
|
758
|
+
* For the `None` case, the inner's slots must still be present on the wire as zero-padding (so `Some` and `None` have
|
|
759
|
+
* identical size). That padding is derived entirely from `inner.shape`.
|
|
464
760
|
*
|
|
465
|
-
* @example Serializing `Option.some(AztecAddress.
|
|
761
|
+
* @example Serializing `Option.some(AztecAddress.fromFieldUnsafe(Fr(42)))` with `OPTION(AZTEC_ADDRESS)`:
|
|
466
762
|
* ```
|
|
467
763
|
* slot 0: Fr(1) // discriminant: Some
|
|
468
764
|
* slot 1: Fr(42) // inner value
|
|
469
765
|
* ```
|
|
470
766
|
*
|
|
471
|
-
* @example Serializing `Option.
|
|
767
|
+
* @example Serializing `Option.none()` with `OPTION(AZTEC_ADDRESS)`:
|
|
472
768
|
* ```
|
|
473
769
|
* slot 0: Fr(0) // discriminant: None
|
|
474
|
-
* slot 1: Fr(0) // zero-filled
|
|
770
|
+
* slot 1: Fr(0) // zero-filled from AZTEC_ADDRESS.shape
|
|
475
771
|
* ```
|
|
476
772
|
*/
|
|
477
|
-
export function OPTION<T>(inner: TypeMapping<T>):
|
|
773
|
+
export function OPTION<T>(inner: TypeMapping<T>): OptionMapping<T> {
|
|
478
774
|
return {
|
|
775
|
+
kind: 'option',
|
|
776
|
+
label: `option(${inner.label})`,
|
|
777
|
+
inner,
|
|
479
778
|
serialization: inner.serialization
|
|
480
779
|
? {
|
|
481
|
-
fn: opt =>
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
if (opt.template === undefined) {
|
|
486
|
-
throw new Error(
|
|
487
|
-
'Cannot serialize Option.empty() without an emptyTemplate — provide one via Option.empty(emptyTemplate)',
|
|
488
|
-
);
|
|
489
|
-
}
|
|
490
|
-
const zeroSlots = inner
|
|
491
|
-
.serialization!.fn(opt.template)
|
|
492
|
-
.map(s => (Array.isArray(s) ? Array(s.length).fill(Fr.ZERO) : Fr.ZERO));
|
|
493
|
-
return [Fr.ZERO, ...zeroSlots];
|
|
494
|
-
},
|
|
780
|
+
fn: opt =>
|
|
781
|
+
opt.isSome()
|
|
782
|
+
? [Fr.ONE, ...inner.serialization!.fn(opt.value)]
|
|
783
|
+
: [Fr.ZERO, ...zeroSlotsFromShape(inner.shape, opt.size)],
|
|
495
784
|
}
|
|
496
785
|
: undefined,
|
|
497
786
|
deserialization: inner.deserialization
|
|
498
787
|
? {
|
|
499
788
|
fn: ([discriminant, ...innerReaders]) => {
|
|
500
789
|
if (discriminant.readField().isZero()) {
|
|
501
|
-
// None still carries zero-
|
|
502
|
-
//
|
|
790
|
+
// None still carries the inner's zero-padded slots; consume them without parsing, since an inner that
|
|
791
|
+
// validates its fields would reject the zeros.
|
|
503
792
|
innerReaders.forEach(reader => reader.skip(reader.remainingFields()));
|
|
504
|
-
return Option.none<T>(
|
|
793
|
+
return Option.none<T>();
|
|
505
794
|
}
|
|
506
795
|
return Option.some(inner.deserialization!.fn(innerReaders));
|
|
507
796
|
},
|
|
508
|
-
slots: inner.deserialization.slots + 1,
|
|
509
797
|
}
|
|
510
798
|
: undefined,
|
|
799
|
+
// A leading discriminant slot followed by the inner's slots.
|
|
800
|
+
shape: ['scalar', ...inner.shape],
|
|
511
801
|
};
|
|
512
802
|
}
|
|
513
803
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
fn: buf => [Array.from(buf).map(b => new Fr(b))],
|
|
519
|
-
},
|
|
520
|
-
deserialization: {
|
|
521
|
-
fn: ([reader]) => {
|
|
522
|
-
const fields = reader.readFieldArray(reader.remainingFields()).map(f => f.toString());
|
|
523
|
-
return fromUintArray(fields, bitSize);
|
|
524
|
-
},
|
|
525
|
-
slots: 1,
|
|
526
|
-
},
|
|
527
|
-
};
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
export function EPHEMERAL_ARRAY<T>(element: TypeMapping<T>): TypeMapping<EphemeralArray<T>> {
|
|
531
|
-
// An EphemeralArray param is a single slot; the per-param assert covers that slot but never sees the
|
|
532
|
-
// per-row readers materialized in readAll(). Assert full consumption per row here.
|
|
804
|
+
export function EPHEMERAL_ARRAY<T>(element: TypeMapping<T>): EphemeralArrayMapping<T> {
|
|
805
|
+
// EphemeralArray.readAll hands each row's flat fields in as a single reader; reconstruct the element's per-slot
|
|
806
|
+
// readers from its shape, deserialize, and assert the row was fully consumed so a row with trailing fields is
|
|
807
|
+
// rejected.
|
|
533
808
|
const rowElement: TypeMapping<T> | undefined = element.deserialization
|
|
534
809
|
? {
|
|
810
|
+
kind: element.kind,
|
|
811
|
+
label: element.label,
|
|
535
812
|
deserialization: {
|
|
536
|
-
fn:
|
|
537
|
-
const value = element.deserialization!.fn(readers);
|
|
538
|
-
assertReadersConsumed(readers);
|
|
539
|
-
return value;
|
|
540
|
-
},
|
|
541
|
-
slots: element.deserialization.slots,
|
|
813
|
+
fn: ([rowReader]) => deserializeElement(element, rowReader.readFieldArray(rowReader.remainingFields())),
|
|
542
814
|
},
|
|
815
|
+
// `fn` reads the whole row from one reader, so this is one variable-width slot, not the element's multi-slot
|
|
816
|
+
// shape.
|
|
817
|
+
shape: ['variable'],
|
|
543
818
|
}
|
|
544
819
|
: undefined;
|
|
545
820
|
return {
|
|
821
|
+
kind: 'ephemeral-array',
|
|
822
|
+
label: `ephemeral-array(${element.label})`,
|
|
823
|
+
inner: element,
|
|
546
824
|
serialization: element.serialization
|
|
547
|
-
? { fn: ea => [ea.materializeSlot(v => element
|
|
825
|
+
? { fn: ea => [ea.materializeSlot(v => serializeElement(element, v))] }
|
|
548
826
|
: undefined,
|
|
549
827
|
deserialization: rowElement
|
|
550
|
-
? { fn: ([reader]) => EphemeralArray.fromSlot(reader.readField(), rowElement)
|
|
828
|
+
? { fn: ([reader]) => EphemeralArray.fromSlot(reader.readField(), rowElement) }
|
|
551
829
|
: undefined,
|
|
830
|
+
// A single slot carrying the array's service-slot id.
|
|
831
|
+
shape: ['scalar'],
|
|
552
832
|
};
|
|
553
833
|
}
|
|
834
|
+
|
|
835
|
+
/** A named field within a {@link STRUCT}: it owns however many wire slots its {@link TypeMapping} declares. */
|
|
836
|
+
export type StructField<TName extends string = string, T = any> = { name: TName; type: TypeMapping<T> };
|
|
837
|
+
|
|
838
|
+
/**
|
|
839
|
+
* A Noir struct: its `shape` and (de)serialization are the concatenation of its fields', so callers never hand-write a
|
|
840
|
+
* `shape`. `T` is the struct's TS value type and must match the field layout — serialization reads each field by name
|
|
841
|
+
* off the value, deserialization returns the decoded bag as `T`; convert in the handler, not here, when `T` differs.
|
|
842
|
+
*/
|
|
843
|
+
export function STRUCT<T>(fields: readonly StructField[]): StructMapping<T> {
|
|
844
|
+
return {
|
|
845
|
+
kind: 'struct',
|
|
846
|
+
label: `{${structFieldLabels(fields)}}`,
|
|
847
|
+
fields,
|
|
848
|
+
serialization: fields.every(f => f.type.serialization)
|
|
849
|
+
? {
|
|
850
|
+
fn: (value: T) => {
|
|
851
|
+
const props = value as any;
|
|
852
|
+
return fields.flatMap(f => f.type.serialization!.fn(props[f.name]));
|
|
853
|
+
},
|
|
854
|
+
}
|
|
855
|
+
: undefined,
|
|
856
|
+
deserialization: fields.every(f => f.type.deserialization)
|
|
857
|
+
? {
|
|
858
|
+
fn: readers => {
|
|
859
|
+
const props: Record<string, unknown> = {};
|
|
860
|
+
let slot = 0;
|
|
861
|
+
for (const f of fields) {
|
|
862
|
+
const slotCount = f.type.shape.length;
|
|
863
|
+
props[f.name] = f.type.deserialization!.fn(readers.slice(slot, slot + slotCount));
|
|
864
|
+
slot += slotCount;
|
|
865
|
+
}
|
|
866
|
+
return props as T;
|
|
867
|
+
},
|
|
868
|
+
}
|
|
869
|
+
: undefined,
|
|
870
|
+
shape: fields.flatMap(f => f.type.shape),
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* The composite `TypeMapping`s (`ARRAY`/`BOUNDED_VEC`/`OPTION`/`STRUCT`/`FIXED_ARRAY`/`FIXED_BOUNDED_VEC`/
|
|
876
|
+
* `EPHEMERAL_ARRAY`), discriminated by `kind`. The combinators attach `kind` plus the inner mapping(s) at construction;
|
|
877
|
+
* the registry erases params to the base `TypeMapping`, so the guards below recover the structure for recursion.
|
|
878
|
+
*/
|
|
879
|
+
export type ArrayMapping<T = any> = TypeMapping<T[]> & { kind: 'array'; inner: TypeMapping<T> };
|
|
880
|
+
export type BoundedVecMapping<T = any> = TypeMapping<BoundedVec<T>> & { kind: 'bounded-vec'; inner: TypeMapping<T> };
|
|
881
|
+
export type OptionMapping<T = any> = TypeMapping<Option<T>> & { kind: 'option'; inner: TypeMapping<T> };
|
|
882
|
+
export type StructMapping<T = any> = TypeMapping<T> & { kind: 'struct'; fields: readonly StructField[] };
|
|
883
|
+
export type FixedArrayMapping<T = any> = TypeMapping<T[]> & {
|
|
884
|
+
kind: 'fixed-array';
|
|
885
|
+
inner: TypeMapping<T>;
|
|
886
|
+
length: number;
|
|
887
|
+
};
|
|
888
|
+
export type FixedBoundedVecMapping<T = any> = TypeMapping<T[]> & {
|
|
889
|
+
kind: 'fixed-bounded-vec';
|
|
890
|
+
inner: TypeMapping<T>;
|
|
891
|
+
maxLength: number;
|
|
892
|
+
};
|
|
893
|
+
export type EphemeralArrayMapping<T = any> = TypeMapping<EphemeralArray<T>> & {
|
|
894
|
+
kind: 'ephemeral-array';
|
|
895
|
+
inner: TypeMapping<T>;
|
|
896
|
+
};
|
|
897
|
+
export type CompositeMapping =
|
|
898
|
+
| ArrayMapping
|
|
899
|
+
| BoundedVecMapping
|
|
900
|
+
| OptionMapping
|
|
901
|
+
| StructMapping
|
|
902
|
+
| FixedArrayMapping
|
|
903
|
+
| FixedBoundedVecMapping
|
|
904
|
+
| EphemeralArrayMapping;
|
|
905
|
+
|
|
906
|
+
export function isArrayMapping(type: TypeMapping<any>): type is ArrayMapping {
|
|
907
|
+
return type.kind === 'array';
|
|
908
|
+
}
|
|
909
|
+
export function isBoundedVecMapping(type: TypeMapping<any>): type is BoundedVecMapping {
|
|
910
|
+
return type.kind === 'bounded-vec';
|
|
911
|
+
}
|
|
912
|
+
export function isOptionMapping(type: TypeMapping<any>): type is OptionMapping {
|
|
913
|
+
return type.kind === 'option';
|
|
914
|
+
}
|
|
915
|
+
export function isStructMapping(type: TypeMapping<any>): type is StructMapping {
|
|
916
|
+
return type.kind === 'struct';
|
|
917
|
+
}
|
|
918
|
+
export function isFixedArrayMapping(type: TypeMapping<any>): type is FixedArrayMapping {
|
|
919
|
+
return type.kind === 'fixed-array';
|
|
920
|
+
}
|
|
921
|
+
export function isFixedBoundedVecMapping(type: TypeMapping<any>): type is FixedBoundedVecMapping {
|
|
922
|
+
return type.kind === 'fixed-bounded-vec';
|
|
923
|
+
}
|
|
924
|
+
export function isEphemeralArrayMapping(type: TypeMapping<any>): type is EphemeralArrayMapping {
|
|
925
|
+
return type.kind === 'ephemeral-array';
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/**
|
|
929
|
+
* The comma-joined labels of a struct's fields, with nested struct labels spliced into the parent: nesting affects
|
|
930
|
+
* neither the wire (struct slots concatenate) nor the interface, so the label treats nested and flat declarations as
|
|
931
|
+
* the same type.
|
|
932
|
+
*/
|
|
933
|
+
function structFieldLabels(fields: readonly StructField[]): string {
|
|
934
|
+
return fields.map(f => (isStructMapping(f.type) ? structFieldLabels(f.type.fields) : f.type.label)).join(',');
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
/** The field's value as a bigint, asserted to fit a `bits`-wide uint. */
|
|
938
|
+
function uintFromField(field: Fr, bits: number): bigint {
|
|
939
|
+
const max = 2n ** BigInt(bits) - 1n;
|
|
940
|
+
const value = field.toBigInt();
|
|
941
|
+
if (value > max) {
|
|
942
|
+
throw new Error(`u${bits} overflow: value ${value} exceeds max (${max})`);
|
|
943
|
+
}
|
|
944
|
+
return value;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/** Number of InputSlots a deserializable type spans, derived from its {@link TypeMapping.shape}. */
|
|
948
|
+
export function slotsOf(mapping: TypeMapping): number {
|
|
949
|
+
return mapping.shape.length;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/** Number of fields a fully-static shape occupies, or `undefined` if any slot is variable-width. */
|
|
953
|
+
export function tryFieldWidth(shape: SlotShape[]): number | undefined {
|
|
954
|
+
let total = 0;
|
|
955
|
+
for (const slot of shape) {
|
|
956
|
+
if (slot === 'scalar') {
|
|
957
|
+
total += 1;
|
|
958
|
+
} else if (typeof slot === 'object' && 'len' in slot) {
|
|
959
|
+
total += slot.len;
|
|
960
|
+
} else {
|
|
961
|
+
return undefined;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
return total;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/** Number of fields a fully-static shape occupies. Throws on a variable-width shape, whose field count isn't known. */
|
|
968
|
+
function fieldWidth(shape: SlotShape[]): number {
|
|
969
|
+
const width = tryFieldWidth(shape);
|
|
970
|
+
if (width === undefined) {
|
|
971
|
+
throw new Error('Cannot compute a fixed field width for a variable-width shape');
|
|
972
|
+
}
|
|
973
|
+
return width;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/** Reconstructs a value's per-slot readers from a flat run of fields, using its shape (inverse of slot-flattening). */
|
|
977
|
+
function splitByShape(fields: Fr[], shape: SlotShape[]): FieldReader[] {
|
|
978
|
+
const readers: FieldReader[] = [];
|
|
979
|
+
let cursor = 0;
|
|
980
|
+
shape.forEach((slot, i) => {
|
|
981
|
+
if (slot === 'scalar' || (typeof slot === 'object' && 'len' in slot)) {
|
|
982
|
+
const width = slot === 'scalar' ? 1 : slot.len;
|
|
983
|
+
if (cursor + width > fields.length) {
|
|
984
|
+
throw new Error(`Not enough fields to reconstruct shape: needed ${width}, had ${fields.length - cursor}`);
|
|
985
|
+
}
|
|
986
|
+
readers.push(new FieldReader(fields.slice(cursor, cursor + width)));
|
|
987
|
+
cursor += width;
|
|
988
|
+
} else {
|
|
989
|
+
// A variable slot (sized or not) takes whatever remains, so it must be last.
|
|
990
|
+
if (i !== shape.length - 1) {
|
|
991
|
+
throw new Error('A variable-width slot must be last to be reconstructed from a flat field array');
|
|
992
|
+
}
|
|
993
|
+
readers.push(new FieldReader(fields.slice(cursor)));
|
|
994
|
+
cursor = fields.length;
|
|
995
|
+
}
|
|
996
|
+
});
|
|
997
|
+
if (cursor !== fields.length) {
|
|
998
|
+
throw new Error(`Malformed flattened value: ${fields.length - cursor} unexpected trailing field(s)`);
|
|
999
|
+
}
|
|
1000
|
+
return readers;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
/** Serializes one element to its flat fields. Element must be serializable. */
|
|
1004
|
+
function serializeElement<T>(element: TypeMapping<T>, value: T): Fr[] {
|
|
1005
|
+
return element.serialization!.fn(value).flat();
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
/**
|
|
1009
|
+
* Deserializes one element from its exact flat fields, reconstructing its per-slot readers from its shape and asserting
|
|
1010
|
+
* they are fully consumed (so trailing fields are rejected). Element must be deserializable.
|
|
1011
|
+
*/
|
|
1012
|
+
function deserializeElement<T>(element: TypeMapping<T>, fields: Fr[]): T {
|
|
1013
|
+
const readers = splitByShape(fields, element.shape);
|
|
1014
|
+
const value = element.deserialization!.fn(readers);
|
|
1015
|
+
assertReadersConsumed(readers);
|
|
1016
|
+
return value;
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
/** Flattens `values` into one contiguous run of fields by serializing each element. Element must be serializable. */
|
|
1020
|
+
function packElements<T>(element: TypeMapping<T>, values: T[]): Fr[] {
|
|
1021
|
+
return values.flatMap(v => serializeElement(element, v));
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
/**
|
|
1025
|
+
* Reads `count` fixed-width elements out of a packed run (the inverse of {@link packElements}). Element must be
|
|
1026
|
+
* deserializable.
|
|
1027
|
+
*/
|
|
1028
|
+
function unpackElements<T>(element: TypeMapping<T>, reader: FieldReader, count: number): T[] {
|
|
1029
|
+
const elementWidth = fieldWidth(element.shape);
|
|
1030
|
+
return Array.from({ length: count }, () => deserializeElement(element, reader.readFieldArray(elementWidth)));
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
/** Builds the zero-filled slots for a `None`, matching a `Some`'s wire shape (variable slots sized from `size`). */
|
|
1034
|
+
function zeroSlotsFromShape(shape: SlotShape[], size: unknown): (Fr | Fr[])[] {
|
|
1035
|
+
return shape.map(slot => {
|
|
1036
|
+
if (slot === 'scalar') {
|
|
1037
|
+
return Fr.ZERO;
|
|
1038
|
+
}
|
|
1039
|
+
if (slot === 'variable') {
|
|
1040
|
+
throw new Error('Cannot zero-fill an unsized variable-width slot');
|
|
1041
|
+
}
|
|
1042
|
+
if ('len' in slot) {
|
|
1043
|
+
return Array<Fr>(slot.len).fill(Fr.ZERO);
|
|
1044
|
+
}
|
|
1045
|
+
if (size === undefined) {
|
|
1046
|
+
throw new Error(
|
|
1047
|
+
'Serializing Option.none() over a variable-size inner needs a size, e.g. Option.none({ length: n })',
|
|
1048
|
+
);
|
|
1049
|
+
}
|
|
1050
|
+
return Array<Fr>(slot.lenFrom(size)).fill(Fr.ZERO);
|
|
1051
|
+
});
|
|
1052
|
+
}
|