@aztec/simulator 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108
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/client.d.ts +1 -1
- package/dest/common/errors.d.ts +2 -8
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/index.d.ts +1 -1
- package/dest/common/stats/index.d.ts +1 -1
- package/dest/common/stats/stats.d.ts +1 -1
- package/dest/private/acvm/acvm.d.ts +1 -1
- package/dest/private/acvm/acvm_types.d.ts +1 -1
- package/dest/private/acvm/deserialize.d.ts +2 -2
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +1 -1
- package/dest/private/acvm/index.d.ts +1 -1
- package/dest/private/acvm/serialize.d.ts +2 -2
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +1 -1
- package/dest/private/acvm_native.d.ts +2 -3
- package/dest/private/acvm_native.d.ts.map +1 -1
- package/dest/private/acvm_native.js +15 -13
- package/dest/private/acvm_wasm.d.ts +1 -1
- package/dest/private/acvm_wasm.d.ts.map +1 -1
- package/dest/private/acvm_wasm_with_blobs.d.ts +1 -1
- package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.d.ts +1 -1
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +16 -15
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +1 -1
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +1 -1
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +2 -2
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
- package/dest/private/circuit_simulator.d.ts +1 -1
- package/dest/private/factory.d.ts +1 -1
- package/dest/public/avm/avm_context.d.ts +2 -2
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts +2 -2
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.d.ts +5 -4
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +5 -5
- package/dest/public/avm/avm_gas.d.ts +2 -2
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +2 -2
- package/dest/public/avm/avm_machine_state.d.ts +2 -2
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.d.ts +20 -14
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +10 -3
- package/dest/public/avm/avm_simulator.d.ts +4 -3
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +19 -25
- package/dest/public/avm/avm_simulator_interface.d.ts +1 -1
- package/dest/public/avm/errors.d.ts +13 -16
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +21 -22
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +3 -2
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +14 -6
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +4 -2
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +23 -1
- package/dest/public/avm/fixtures/initializers.d.ts +2 -3
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.js +6 -4
- package/dest/public/avm/fixtures/utils.d.ts +4 -3
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
- package/dest/public/avm/fixtures/utils.js +3 -2
- package/dest/public/avm/index.d.ts +1 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -3
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +8 -8
- package/dest/public/avm/opcodes/addressing_mode.d.ts +1 -1
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +4 -5
- package/dest/public/avm/opcodes/arithmetic.d.ts +10 -8
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +11 -1
- package/dest/public/avm/opcodes/bitwise.d.ts +5 -5
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.d.ts +4 -4
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.d.ts +1 -1
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.d.ts +1 -1
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +3 -0
- package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +6 -6
- package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +7 -9
- package/dest/public/avm/opcodes/external_calls.d.ts +1 -1
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +1 -1
- package/dest/public/avm/opcodes/hashing.d.ts +2 -2
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +9 -4
- package/dest/public/avm/opcodes/index.d.ts +1 -1
- package/dest/public/avm/opcodes/instruction.d.ts +2 -2
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +5 -6
- package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.d.ts +2 -2
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +1 -1
- package/dest/public/avm/opcodes/misc.d.ts +3 -2
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +28 -8
- package/dest/public/avm/opcodes/storage.d.ts +3 -3
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/revert_reason.d.ts +2 -2
- package/dest/public/avm/revert_reason.d.ts.map +1 -1
- package/dest/public/avm/revert_reason.js +3 -2
- package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -1
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.js +9 -6
- package/dest/public/avm/serialization/instruction_serialization.d.ts +9 -1
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +11 -1
- package/dest/public/avm/test_utils.d.ts +4 -4
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +7 -10
- package/dest/public/contracts_db_checkpoint.d.ts +16 -0
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
- package/dest/public/contracts_db_checkpoint.js +30 -0
- package/dest/public/db_interfaces.d.ts +14 -2
- package/dest/public/db_interfaces.d.ts.map +1 -1
- package/dest/public/debug_fn_name.d.ts +15 -2
- package/dest/public/debug_fn_name.d.ts.map +1 -1
- package/dest/public/debug_fn_name.js +28 -2
- package/dest/public/executor_metrics.d.ts +3 -2
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +1 -1
- package/dest/public/executor_metrics_interface.d.ts +3 -2
- package/dest/public/executor_metrics_interface.d.ts.map +1 -1
- package/dest/public/fixtures/amm_test.d.ts +1 -1
- package/dest/public/fixtures/amm_test.js +2 -2
- package/dest/public/fixtures/bulk_test.d.ts +1 -1
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +59 -177
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
- package/dest/public/fixtures/index.d.ts +5 -2
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +4 -1
- package/dest/public/fixtures/minimal_public_tx.d.ts +4 -9
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
- package/dest/public/fixtures/minimal_public_tx.js +8 -32
- package/dest/public/fixtures/opcode_spammer.d.ts +123 -0
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
- package/dest/public/fixtures/opcode_spammer.js +1681 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +25 -5
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +63 -17
- package/dest/public/fixtures/simple_contract_data_source.d.ts +5 -4
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
- package/dest/public/fixtures/simple_contract_data_source.js +4 -4
- package/dest/public/fixtures/token_test.d.ts +6 -2
- package/dest/public/fixtures/token_test.d.ts.map +1 -1
- package/dest/public/fixtures/token_test.js +13 -12
- package/dest/public/fixtures/utils.d.ts +2 -2
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +7 -6
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +46 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +139 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_simulator_bin.js +100 -0
- package/dest/public/hinting_db_sources.d.ts +16 -4
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +74 -13
- package/dest/public/index.d.ts +3 -2
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +1 -1
- package/dest/public/public_db_sources.d.ts +24 -65
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +85 -132
- package/dest/public/public_errors.d.ts +12 -0
- package/dest/public/public_errors.d.ts.map +1 -0
- package/dest/public/public_errors.js +13 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +6 -2
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.js +8 -0
- package/dest/public/public_processor/public_processor.d.ts +11 -13
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +477 -70
- package/dest/public/public_processor/public_processor_metrics.d.ts +1 -1
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +18 -0
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +131 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +22 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
- package/dest/public/public_tx_simulator/factories.d.ts +13 -0
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/factories.js +28 -0
- package/dest/public/public_tx_simulator/index.d.ts +6 -1
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/index.js +3 -0
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +16 -8
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +7 -8
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +9 -4
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +22 -10
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +22 -29
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +178 -127
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +4 -3
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +396 -20
- package/dest/public/side_effect_errors.d.ts +42 -2
- package/dest/public/side_effect_errors.d.ts.map +1 -1
- package/dest/public/side_effect_errors.js +70 -1
- package/dest/public/side_effect_trace.d.ts +13 -7
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +36 -21
- package/dest/public/side_effect_trace_interface.d.ts +9 -4
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/index.d.ts +1 -1
- package/dest/public/state_manager/nullifiers.d.ts +2 -5
- package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
- package/dest/public/state_manager/nullifiers.js +1 -6
- package/dest/public/state_manager/public_storage.d.ts +2 -2
- package/dest/public/state_manager/public_storage.d.ts.map +1 -1
- package/dest/public/state_manager/public_storage.js +1 -1
- package/dest/public/state_manager/state_manager.d.ts +16 -13
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +64 -21
- package/dest/public/test_executor_metrics.d.ts +4 -3
- package/dest/public/test_executor_metrics.d.ts.map +1 -1
- package/dest/public/test_executor_metrics.js +5 -4
- package/dest/public/unique_class_ids.d.ts +1 -1
- package/dest/public/unique_class_ids.d.ts.map +1 -1
- package/dest/public/utils.d.ts +1 -1
- package/dest/server.d.ts +1 -1
- package/dest/testing.d.ts +1 -1
- package/package.json +24 -19
- package/src/common/errors.ts +1 -1
- package/src/private/acvm/deserialize.ts +1 -1
- package/src/private/acvm/serialize.ts +1 -1
- package/src/private/acvm_native.ts +18 -11
- package/src/private/circuit_recording/circuit_recorder.ts +17 -16
- package/src/private/circuit_recording/simulator_recorder_wrapper.ts +1 -1
- package/src/public/avm/avm_context.ts +1 -1
- package/src/public/avm/avm_contract_call_result.ts +1 -1
- package/src/public/avm/avm_execution_environment.ts +4 -3
- package/src/public/avm/avm_gas.ts +5 -5
- package/src/public/avm/avm_machine_state.ts +1 -1
- package/src/public/avm/avm_memory_types.ts +12 -3
- package/src/public/avm/avm_simulator.ts +24 -33
- package/src/public/avm/errors.ts +24 -27
- package/src/public/avm/fixtures/avm_simulation_tester.ts +14 -4
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +33 -1
- package/src/public/avm/fixtures/initializers.ts +7 -8
- package/src/public/avm/fixtures/utils.ts +3 -2
- package/src/public/avm/opcodes/accrued_substate.ts +5 -5
- package/src/public/avm/opcodes/addressing_mode.ts +5 -5
- package/src/public/avm/opcodes/arithmetic.ts +13 -1
- package/src/public/avm/opcodes/conversion.ts +4 -0
- package/src/public/avm/opcodes/ec_add.ts +6 -6
- package/src/public/avm/opcodes/environment_getters.ts +10 -12
- package/src/public/avm/opcodes/external_calls.ts +1 -1
- package/src/public/avm/opcodes/hashing.ts +10 -4
- package/src/public/avm/opcodes/instruction.ts +8 -6
- package/src/public/avm/opcodes/memory.ts +1 -1
- package/src/public/avm/opcodes/misc.ts +41 -7
- package/src/public/avm/revert_reason.ts +6 -3
- package/src/public/avm/serialization/bytecode_serialization.ts +17 -6
- package/src/public/avm/serialization/instruction_serialization.ts +13 -1
- package/src/public/avm/test_utils.ts +7 -15
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +16 -1
- package/src/public/debug_fn_name.ts +35 -3
- package/src/public/executor_metrics.ts +2 -1
- package/src/public/executor_metrics_interface.ts +2 -1
- package/src/public/fixtures/amm_test.ts +2 -2
- package/src/public/fixtures/bulk_test.ts +39 -26
- package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
- package/src/public/fixtures/custom_bytecode_tests.ts +219 -0
- package/src/public/fixtures/index.ts +8 -1
- package/src/public/fixtures/minimal_public_tx.ts +9 -42
- package/src/public/fixtures/opcode_spammer.ts +1638 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +90 -22
- package/src/public/fixtures/simple_contract_data_source.ts +8 -9
- package/src/public/fixtures/token_test.ts +18 -10
- package/src/public/fixtures/utils.ts +5 -6
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +240 -0
- package/src/public/fuzzing/avm_simulator_bin.ts +140 -0
- package/src/public/hinting_db_sources.ts +117 -10
- package/src/public/index.ts +8 -1
- package/src/public/public_db_sources.ts +112 -175
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +10 -1
- package/src/public/public_processor/public_processor.ts +112 -79
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +121 -0
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +200 -0
- package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +132 -0
- package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +237 -0
- package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +81 -0
- package/src/public/public_tx_simulator/factories.ts +41 -0
- package/src/public/public_tx_simulator/index.ts +5 -0
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +13 -14
- package/src/public/public_tx_simulator/public_tx_context.ts +20 -7
- package/src/public/public_tx_simulator/public_tx_simulator.ts +265 -179
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +4 -13
- package/src/public/side_effect_errors.ts +91 -1
- package/src/public/side_effect_trace.ts +49 -24
- package/src/public/side_effect_trace_interface.ts +7 -1
- package/src/public/state_manager/nullifiers.ts +2 -8
- package/src/public/state_manager/public_storage.ts +1 -1
- package/src/public/state_manager/state_manager.ts +87 -39
- package/src/public/test_executor_metrics.ts +7 -5
- package/dest/public/bytecode_errors.d.ts +0 -4
- package/dest/public/bytecode_errors.d.ts.map +0 -1
- package/dest/public/bytecode_errors.js +0 -6
- package/dest/public/tx_contract_cache.d.ts +0 -41
- package/dest/public/tx_contract_cache.d.ts.map +0 -1
- package/dest/public/tx_contract_cache.js +0 -49
- package/src/public/bytecode_errors.ts +0 -6
- package/src/public/tx_contract_cache.ts +0 -69
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT } from '@aztec/constants';
|
|
1
2
|
import { asyncMap } from '@aztec/foundation/async-map';
|
|
2
|
-
import {
|
|
3
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
5
|
import { type ContractArtifact, encodeArguments } from '@aztec/stdlib/abi';
|
|
6
|
+
import { PublicSimulatorConfig, type PublicTxResult } from '@aztec/stdlib/avm';
|
|
4
7
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
8
|
import { Gas, GasFees } from '@aztec/stdlib/gas';
|
|
6
9
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
@@ -16,8 +19,9 @@ import {
|
|
|
16
19
|
getFunctionSelector,
|
|
17
20
|
} from '../avm/fixtures/utils.js';
|
|
18
21
|
import { PublicContractsDB } from '../public_db_sources.js';
|
|
19
|
-
import {
|
|
20
|
-
import
|
|
22
|
+
import { MeasuredCppPublicTxSimulator } from '../public_tx_simulator/cpp_public_tx_simulator.js';
|
|
23
|
+
import { MeasuredCppVsTsPublicTxSimulator } from '../public_tx_simulator/cpp_vs_ts_public_tx_simulator.js';
|
|
24
|
+
import type { MeasuredPublicTxSimulatorInterface } from '../public_tx_simulator/public_tx_simulator_interface.js';
|
|
21
25
|
import { TestExecutorMetrics } from '../test_executor_metrics.js';
|
|
22
26
|
import { SimpleContractDataSource } from './simple_contract_data_source.js';
|
|
23
27
|
import { type TestPrivateInsertions, createTxForPublicCalls } from './utils.js';
|
|
@@ -27,12 +31,32 @@ const DEFAULT_GAS_FEES = new GasFees(2, 3);
|
|
|
27
31
|
export type TestEnqueuedCall = {
|
|
28
32
|
sender?: AztecAddress;
|
|
29
33
|
address: AztecAddress;
|
|
30
|
-
fnName
|
|
34
|
+
fnName?: string;
|
|
31
35
|
args: any[];
|
|
32
36
|
isStaticCall?: boolean;
|
|
33
37
|
contractArtifact?: ContractArtifact;
|
|
34
38
|
};
|
|
35
39
|
|
|
40
|
+
const defaultConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
|
|
41
|
+
skipFeeEnforcement: false,
|
|
42
|
+
collectCallMetadata: true,
|
|
43
|
+
collectDebugLogs: true,
|
|
44
|
+
collectHints: false,
|
|
45
|
+
collectPublicInputs: false,
|
|
46
|
+
collectStatistics: false,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Factory type for creating a MeasuredPublicTxSimulatorInterface.
|
|
51
|
+
*/
|
|
52
|
+
export type MeasuredSimulatorFactory = (
|
|
53
|
+
merkleTree: MerkleTreeWriteOperations,
|
|
54
|
+
contractsDB: PublicContractsDB,
|
|
55
|
+
globals: GlobalVariables,
|
|
56
|
+
metrics: TestExecutorMetrics,
|
|
57
|
+
config: PublicSimulatorConfig,
|
|
58
|
+
) => MeasuredPublicTxSimulatorInterface;
|
|
59
|
+
|
|
36
60
|
/**
|
|
37
61
|
* A test class that extends the BaseAvmSimulationTester to enable real-app testing of the PublicTxSimulator.
|
|
38
62
|
* It provides an interface for simulating one transaction at a time and maintains state between subsequent
|
|
@@ -40,7 +64,7 @@ export type TestEnqueuedCall = {
|
|
|
40
64
|
*/
|
|
41
65
|
export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
42
66
|
protected txCount: number = 0;
|
|
43
|
-
private simulator:
|
|
67
|
+
private simulator: MeasuredPublicTxSimulatorInterface;
|
|
44
68
|
private metricsPrefix?: string;
|
|
45
69
|
|
|
46
70
|
constructor(
|
|
@@ -48,28 +72,32 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
|
48
72
|
contractDataSource: SimpleContractDataSource,
|
|
49
73
|
globals: GlobalVariables = defaultGlobals(),
|
|
50
74
|
private metrics: TestExecutorMetrics = new TestExecutorMetrics(),
|
|
75
|
+
simulatorFactory?: MeasuredSimulatorFactory,
|
|
76
|
+
config: PublicSimulatorConfig = defaultConfig,
|
|
51
77
|
) {
|
|
52
78
|
super(contractDataSource, merkleTree);
|
|
53
79
|
|
|
54
80
|
const contractsDB = new PublicContractsDB(contractDataSource);
|
|
55
|
-
|
|
56
|
-
merkleTree,
|
|
57
|
-
|
|
58
|
-
globals,
|
|
59
|
-
|
|
60
|
-
/*skipFeeEnforcement=*/ false,
|
|
61
|
-
/*clientInitiatedSimulation=*/ true,
|
|
62
|
-
this.metrics,
|
|
63
|
-
);
|
|
81
|
+
if (simulatorFactory) {
|
|
82
|
+
this.simulator = simulatorFactory(merkleTree, contractsDB, globals, this.metrics, config);
|
|
83
|
+
} else {
|
|
84
|
+
this.simulator = new MeasuredCppPublicTxSimulator(merkleTree, contractsDB, globals, this.metrics, config);
|
|
85
|
+
}
|
|
64
86
|
}
|
|
65
87
|
|
|
66
88
|
public static async create(
|
|
89
|
+
worldStateService: NativeWorldStateService, // make sure to close this later
|
|
67
90
|
globals: GlobalVariables = defaultGlobals(),
|
|
68
91
|
metrics: TestExecutorMetrics = new TestExecutorMetrics(),
|
|
92
|
+
useCppSimulator = false,
|
|
93
|
+
config: PublicSimulatorConfig = defaultConfig,
|
|
69
94
|
): Promise<PublicTxSimulationTester> {
|
|
70
95
|
const contractDataSource = new SimpleContractDataSource();
|
|
71
|
-
const merkleTree = await
|
|
72
|
-
|
|
96
|
+
const merkleTree = await worldStateService.fork();
|
|
97
|
+
const simulatorFactory: MeasuredSimulatorFactory = useCppSimulator
|
|
98
|
+
? (mt, cdb, g, m, c) => new MeasuredCppPublicTxSimulator(mt, cdb, g, m, c)
|
|
99
|
+
: (mt, cdb, g, m, c) => new MeasuredCppVsTsPublicTxSimulator(mt, cdb, g, m, c);
|
|
100
|
+
return new PublicTxSimulationTester(merkleTree, contractDataSource, globals, metrics, simulatorFactory, config);
|
|
73
101
|
}
|
|
74
102
|
|
|
75
103
|
public setMetricsPrefix(prefix: string) {
|
|
@@ -102,7 +130,9 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
|
102
130
|
appCallRequests,
|
|
103
131
|
teardownCallRequest,
|
|
104
132
|
feePayer,
|
|
105
|
-
/*gasUsedByPrivate*/
|
|
133
|
+
/*gasUsedByPrivate*/ teardownCall
|
|
134
|
+
? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT)
|
|
135
|
+
: Gas.empty(),
|
|
106
136
|
defaultGlobals(),
|
|
107
137
|
);
|
|
108
138
|
}
|
|
@@ -124,6 +154,11 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
|
124
154
|
const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
|
|
125
155
|
const fullTxLabel = this.metricsPrefix ? `${this.metricsPrefix}/${txLabelWithCount}` : txLabelWithCount;
|
|
126
156
|
|
|
157
|
+
if (!this.simulator) {
|
|
158
|
+
throw new Error(
|
|
159
|
+
'No simulator configured. Pass a simulatorFactory to the constructor or use PublicTxSimulationTester.create()',
|
|
160
|
+
);
|
|
161
|
+
}
|
|
127
162
|
const avmResult = await this.simulator.simulate(tx, fullTxLabel);
|
|
128
163
|
|
|
129
164
|
// Something like this is often useful for debugging:
|
|
@@ -190,6 +225,25 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
|
190
225
|
this.metrics.prettyPrint();
|
|
191
226
|
}
|
|
192
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Cancel the current simulation if one is in progress.
|
|
230
|
+
* This signals the underlying simulator (e.g., C++) to stop at the next safe point.
|
|
231
|
+
* Safe to call even if no simulation is in progress.
|
|
232
|
+
*
|
|
233
|
+
* @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
|
|
234
|
+
*/
|
|
235
|
+
public async cancel(waitTimeoutMs?: number): Promise<void> {
|
|
236
|
+
await this.simulator.cancel?.(waitTimeoutMs);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get the underlying simulator for advanced test scenarios.
|
|
241
|
+
* Use this when you need direct control over simulation (e.g., for testing cancellation).
|
|
242
|
+
*/
|
|
243
|
+
public getSimulator(): MeasuredPublicTxSimulatorInterface {
|
|
244
|
+
return this.simulator;
|
|
245
|
+
}
|
|
246
|
+
|
|
193
247
|
async #createPubicCallRequestForCall(
|
|
194
248
|
call: TestEnqueuedCall,
|
|
195
249
|
sender: AztecAddress,
|
|
@@ -200,10 +254,24 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
|
|
|
200
254
|
throw new Error(`Contract artifact not found for address: ${address}`);
|
|
201
255
|
}
|
|
202
256
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
257
|
+
let calldata: Fr[] = [];
|
|
258
|
+
if (!call.fnName) {
|
|
259
|
+
this.logger.debug(
|
|
260
|
+
`No function name specified for call to contract ${call.address.toString()}. Assuming this is a custom bytecode with no public_dispatch function.`,
|
|
261
|
+
);
|
|
262
|
+
this.logger.debug(`Not using ABI to encode arguments. Not prepending fn selector to calldata.`);
|
|
263
|
+
try {
|
|
264
|
+
calldata = call.args.map(arg => new Fr(arg));
|
|
265
|
+
} catch (error) {
|
|
266
|
+
this.logger.warn(`Tried assuming that all arguments are Field-like. Failed. Error: ${error}`);
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
const fnSelector = await getFunctionSelector(call.fnName, contractArtifact);
|
|
271
|
+
const fnAbi = getContractFunctionAbi(call.fnName, contractArtifact)!;
|
|
272
|
+
const encodedArgs = encodeArguments(fnAbi, call.args);
|
|
273
|
+
calldata = [fnSelector.toField(), ...encodedArgs];
|
|
274
|
+
}
|
|
207
275
|
const isStaticCall = call.isStaticCall ?? false;
|
|
208
276
|
const request = await PublicCallRequest.fromCalldata(sender, address, isStaticCall, calldata);
|
|
209
277
|
|
|
@@ -215,6 +283,6 @@ export function defaultGlobals() {
|
|
|
215
283
|
const globals = GlobalVariables.empty();
|
|
216
284
|
globals.timestamp = DEFAULT_TIMESTAMP;
|
|
217
285
|
globals.gasFees = DEFAULT_GAS_FEES; // apply some nonzero default gas fees
|
|
218
|
-
globals.blockNumber = DEFAULT_BLOCK_NUMBER;
|
|
286
|
+
globals.blockNumber = BlockNumber(DEFAULT_BLOCK_NUMBER);
|
|
219
287
|
return globals;
|
|
220
288
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import type { ContractArtifact, FunctionSelector } from '@aztec/stdlib/abi';
|
|
4
5
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -59,7 +60,7 @@ export class SimpleContractDataSource implements ContractDataSource {
|
|
|
59
60
|
|
|
60
61
|
/////////////////////////////////////////////////////////////
|
|
61
62
|
// ContractDataSource function implementations
|
|
62
|
-
getBlockNumber(): Promise<
|
|
63
|
+
getBlockNumber(): Promise<BlockNumber> {
|
|
63
64
|
throw new Error('Method not implemented.');
|
|
64
65
|
}
|
|
65
66
|
|
|
@@ -90,19 +91,17 @@ export class SimpleContractDataSource implements ContractDataSource {
|
|
|
90
91
|
return this.contractArtifacts.get(contractInstance!.currentContractClassId.toString());
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
async getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string> {
|
|
94
|
+
async getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
|
|
94
95
|
const contractInstance = await this.getContract(address);
|
|
95
96
|
if (!contractInstance) {
|
|
96
|
-
this.logger.warn(
|
|
97
|
-
|
|
98
|
-
);
|
|
99
|
-
return `selector:${selector.toString()}`;
|
|
97
|
+
this.logger.warn(`Couldn't get fn name for debugging. Contract not in tester's ContractDataSource.`);
|
|
98
|
+
return undefined;
|
|
100
99
|
}
|
|
101
100
|
const key = `${contractInstance.currentContractClassId.toString()}:${selector.toString()}`;
|
|
102
101
|
const fnName = this.debugFunctionName.get(key);
|
|
103
102
|
if (!fnName) {
|
|
104
|
-
this.logger.warn(`Couldn't get fn name for debugging
|
|
105
|
-
return
|
|
103
|
+
this.logger.warn(`Couldn't get fn name for debugging...`);
|
|
104
|
+
return undefined;
|
|
106
105
|
}
|
|
107
106
|
return fnName;
|
|
108
107
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
3
|
import { Timer } from '@aztec/foundation/timer';
|
|
4
4
|
import type { ContractArtifact } from '@aztec/stdlib/abi';
|
|
@@ -7,11 +7,17 @@ import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
|
7
7
|
|
|
8
8
|
import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
9
9
|
|
|
10
|
+
export type TokenTestOptions = {
|
|
11
|
+
/** Skip return value assertions in balance checks (useful for benchmarking with collectCallMetadata=false) */
|
|
12
|
+
skipReturnValueAssertions?: boolean;
|
|
13
|
+
};
|
|
14
|
+
|
|
10
15
|
export async function tokenTest(
|
|
11
16
|
tester: PublicTxSimulationTester,
|
|
12
17
|
logger: Logger,
|
|
13
18
|
tokenArtifact: ContractArtifact,
|
|
14
19
|
expectToBeTrue: (x: boolean) => void,
|
|
20
|
+
options: TokenTestOptions = {},
|
|
15
21
|
) {
|
|
16
22
|
const timer = new Timer();
|
|
17
23
|
|
|
@@ -36,7 +42,7 @@ export async function tokenTest(
|
|
|
36
42
|
],
|
|
37
43
|
);
|
|
38
44
|
expectToBeTrue(mintResult.revertCode.isOK());
|
|
39
|
-
await checkBalance(tester, token, sender, sender, mintAmount, expectToBeTrue);
|
|
45
|
+
await checkBalance(tester, token, sender, sender, mintAmount, expectToBeTrue, options);
|
|
40
46
|
|
|
41
47
|
const authwitNonce = new Fr(0);
|
|
42
48
|
const transferAmount = 50n;
|
|
@@ -54,8 +60,8 @@ export async function tokenTest(
|
|
|
54
60
|
],
|
|
55
61
|
);
|
|
56
62
|
expectToBeTrue(transferResult.revertCode.isOK());
|
|
57
|
-
await checkBalance(tester, token, sender,
|
|
58
|
-
await checkBalance(tester, token, sender, receiver, transferAmount, expectToBeTrue);
|
|
63
|
+
await checkBalance(tester, token, sender, sender, mintAmount - transferAmount, expectToBeTrue, options);
|
|
64
|
+
await checkBalance(tester, token, sender, receiver, transferAmount, expectToBeTrue, options);
|
|
59
65
|
|
|
60
66
|
// EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
|
|
61
67
|
const burnResult = await tester.executeTxWithLabel(
|
|
@@ -71,7 +77,7 @@ export async function tokenTest(
|
|
|
71
77
|
],
|
|
72
78
|
);
|
|
73
79
|
expectToBeTrue(burnResult.revertCode.isOK());
|
|
74
|
-
await checkBalance(tester, token, sender, receiver, 0n, expectToBeTrue);
|
|
80
|
+
await checkBalance(tester, token, sender, receiver, 0n, expectToBeTrue, options);
|
|
75
81
|
|
|
76
82
|
logger.info(`TokenContract test took ${timer.ms()}ms\n`);
|
|
77
83
|
}
|
|
@@ -116,6 +122,7 @@ async function checkBalance(
|
|
|
116
122
|
account: AztecAddress,
|
|
117
123
|
expectedBalance: bigint,
|
|
118
124
|
expectToBeTrue: (x: boolean) => void,
|
|
125
|
+
options: TokenTestOptions = {},
|
|
119
126
|
) {
|
|
120
127
|
// Strictly simulate this! No need to "execute" (aka prove if using AvmProvingTester subclass).
|
|
121
128
|
const balResult = await tester.simulateTxWithLabel(
|
|
@@ -132,9 +139,10 @@ async function checkBalance(
|
|
|
132
139
|
],
|
|
133
140
|
);
|
|
134
141
|
expectToBeTrue(balResult.revertCode.isOK());
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
142
|
+
if (!options.skipReturnValueAssertions) {
|
|
143
|
+
// should be 1 call with 1 return value that is expectedBalance
|
|
144
|
+
const appLogicReturnValues = balResult.getAppLogicReturnValues();
|
|
145
|
+
expectToBeTrue(appLogicReturnValues.length === 1);
|
|
146
|
+
expectToBeTrue(appLogicReturnValues[0].values?.[0]?.toBigInt() === expectedBalance);
|
|
147
|
+
}
|
|
140
148
|
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
PRIVATE_LOG_SIZE_IN_FIELDS,
|
|
10
10
|
} from '@aztec/constants';
|
|
11
11
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
12
|
-
import { Fr } from '@aztec/foundation/
|
|
12
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
13
13
|
import { CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG } from '@aztec/protocol-contracts';
|
|
14
14
|
import { bufferAsFields } from '@aztec/stdlib/abi';
|
|
15
15
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from '@aztec/stdlib/kernel';
|
|
26
26
|
import { ContractClassLogFields, PrivateLog } from '@aztec/stdlib/logs';
|
|
27
27
|
import type { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
28
|
-
import {
|
|
28
|
+
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
29
29
|
import {
|
|
30
30
|
BlockHeader,
|
|
31
31
|
GlobalVariables,
|
|
@@ -132,8 +132,7 @@ export async function createTxForPublicCalls(
|
|
|
132
132
|
: Gas.empty();
|
|
133
133
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
|
|
134
134
|
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
135
|
-
const header = BlockHeader.empty();
|
|
136
|
-
header.globalVariables = globals;
|
|
135
|
+
const header = BlockHeader.empty({ globalVariables: globals });
|
|
137
136
|
const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
|
|
138
137
|
const includeByTimestamp = 0n; // Not used in the simulator.
|
|
139
138
|
|
|
@@ -153,7 +152,7 @@ export async function createTxForPublicCalls(
|
|
|
153
152
|
|
|
154
153
|
return await Tx.create({
|
|
155
154
|
data: txData,
|
|
156
|
-
|
|
155
|
+
chonkProof: ChonkProof.random(),
|
|
157
156
|
contractClassLogFields: [],
|
|
158
157
|
publicFunctionCalldata: calldata,
|
|
159
158
|
});
|
|
@@ -184,7 +183,7 @@ export async function createTxForPrivateOnly(
|
|
|
184
183
|
);
|
|
185
184
|
return await Tx.create({
|
|
186
185
|
data: txData,
|
|
187
|
-
|
|
186
|
+
chonkProof: ChonkProof.empty(),
|
|
188
187
|
contractClassLogFields: [],
|
|
189
188
|
publicFunctionCalldata: [],
|
|
190
189
|
});
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MAX_ENQUEUED_CALLS_PER_TX,
|
|
3
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
4
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
5
|
+
MAX_NULLIFIERS_PER_TX,
|
|
6
|
+
MAX_PRIVATE_LOGS_PER_TX,
|
|
7
|
+
} from '@aztec/constants';
|
|
8
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
9
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
10
|
+
import { AvmTxHint, type PublicTxResult } from '@aztec/stdlib/avm';
|
|
11
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
12
|
+
import { contractClassPublicFromPlainObject, contractInstanceWithAddressFromPlainObject } from '@aztec/stdlib/contract';
|
|
13
|
+
import {
|
|
14
|
+
PartialPrivateTailPublicInputsForPublic,
|
|
15
|
+
PrivateKernelTailCircuitPublicInputs,
|
|
16
|
+
PrivateToPublicAccumulatedData,
|
|
17
|
+
PublicCallRequest,
|
|
18
|
+
} from '@aztec/stdlib/kernel';
|
|
19
|
+
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
20
|
+
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
21
|
+
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
22
|
+
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
|
|
23
|
+
import { BlockHeader, GlobalVariables, HashedValues, Tx, TxConstantData, TxContext, TxHash } from '@aztec/stdlib/tx';
|
|
24
|
+
import type { NativeWorldStateService } from '@aztec/world-state';
|
|
25
|
+
|
|
26
|
+
import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
|
|
27
|
+
import { SimpleContractDataSource } from '../fixtures/simple_contract_data_source.js';
|
|
28
|
+
import { PublicContractsDB } from '../public_db_sources.js';
|
|
29
|
+
import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Request structure for fuzzer simulation communication from C++.
|
|
33
|
+
* Matches the C++ FuzzerSimulationRequest struct
|
|
34
|
+
*/
|
|
35
|
+
export class FuzzerSimulationRequest {
|
|
36
|
+
constructor(
|
|
37
|
+
public readonly wsDataDir: string,
|
|
38
|
+
public readonly wsMapSizeKb: number,
|
|
39
|
+
public readonly tx: AvmTxHint,
|
|
40
|
+
public readonly globals: GlobalVariables,
|
|
41
|
+
public readonly contractClasses: any[], // Raw, processed by addContractClassFromCpp
|
|
42
|
+
public readonly contractInstances: [any, any][], // Raw pairs [address, instance]
|
|
43
|
+
) {}
|
|
44
|
+
|
|
45
|
+
static fromPlainObject(obj: any): FuzzerSimulationRequest {
|
|
46
|
+
if (obj instanceof FuzzerSimulationRequest) {
|
|
47
|
+
return obj;
|
|
48
|
+
}
|
|
49
|
+
return new FuzzerSimulationRequest(
|
|
50
|
+
obj.wsDataDir,
|
|
51
|
+
obj.wsMapSizeKb,
|
|
52
|
+
AvmTxHint.fromPlainObject(obj.tx),
|
|
53
|
+
GlobalVariables.fromPlainObject(obj.globals),
|
|
54
|
+
obj.contractClasses,
|
|
55
|
+
obj.contractInstances,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Creates a TypeScript Tx object from a deserialized C++ Tx (AvmTxHint-like structure).
|
|
62
|
+
* This allows using PublicTxSimulator.simulate() with fuzzer-generated transactions.
|
|
63
|
+
*/
|
|
64
|
+
async function createTxFromHint(cppTx: AvmTxHint): Promise<Tx> {
|
|
65
|
+
// Create TxHash from the C++ tx hash string
|
|
66
|
+
if (!cppTx.hash) {
|
|
67
|
+
throw new Error(`cppTx.hash is undefined. Keys: ${Object.keys(cppTx || {}).join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
const txHash = TxHash.fromString(cppTx.hash);
|
|
70
|
+
|
|
71
|
+
// Extract PublicCallRequest instances from enqueued calls
|
|
72
|
+
const setupCallRequests = cppTx.setupEnqueuedCalls.map(call => call.request);
|
|
73
|
+
const paddedSetupCalls = padArrayEnd(setupCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX);
|
|
74
|
+
|
|
75
|
+
const appLogicCallRequests = cppTx.appLogicEnqueuedCalls.map(call => call.request);
|
|
76
|
+
const paddedAppLogicCalls = padArrayEnd(appLogicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX);
|
|
77
|
+
|
|
78
|
+
// Build non-revertible accumulated data from C++ tx
|
|
79
|
+
const emptyNonRevertible = PrivateToPublicAccumulatedData.empty();
|
|
80
|
+
const nonRevertibleAccumulatedData = new PrivateToPublicAccumulatedData(
|
|
81
|
+
padArrayEnd(cppTx.nonRevertibleAccumulatedData.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
82
|
+
padArrayEnd(cppTx.nonRevertibleAccumulatedData.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
|
|
83
|
+
padArrayEnd(
|
|
84
|
+
cppTx.nonRevertibleAccumulatedData.l2ToL1Messages,
|
|
85
|
+
ScopedL2ToL1Message.empty(),
|
|
86
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
87
|
+
),
|
|
88
|
+
padArrayEnd(cppTx.nonRevertibleContractDeploymentData.privateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
89
|
+
emptyNonRevertible.contractClassLogsHashes,
|
|
90
|
+
paddedSetupCalls,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Build revertible accumulated data from C++ tx
|
|
94
|
+
const emptyRevertible = PrivateToPublicAccumulatedData.empty();
|
|
95
|
+
const revertibleAccumulatedData = new PrivateToPublicAccumulatedData(
|
|
96
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
97
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
|
|
98
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.l2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
|
|
99
|
+
padArrayEnd(cppTx.revertibleContractDeploymentData.privateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
100
|
+
emptyRevertible.contractClassLogsHashes,
|
|
101
|
+
paddedAppLogicCalls,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
// Build teardown call request (if exists)
|
|
105
|
+
const teardownCallRequest = cppTx.teardownEnqueuedCall?.request ?? PublicCallRequest.empty();
|
|
106
|
+
|
|
107
|
+
// Create forPublic structure
|
|
108
|
+
const forPublic = new PartialPrivateTailPublicInputsForPublic(
|
|
109
|
+
nonRevertibleAccumulatedData,
|
|
110
|
+
revertibleAccumulatedData,
|
|
111
|
+
teardownCallRequest,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
// Build TxContext - gasSettings is already a proper GasSettings after AvmTxHint.fromPlainObject
|
|
115
|
+
const txContext = new TxContext(
|
|
116
|
+
Fr.ZERO, // chainId - this is fine because simulation actually reads from globalVariables not here
|
|
117
|
+
Fr.ZERO, // version - this is fine because simulation actually reads from globalVariables not here
|
|
118
|
+
cppTx.gasSettings,
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// Build TxConstantData
|
|
122
|
+
const constants = new TxConstantData(
|
|
123
|
+
BlockHeader.empty(), // anchorBlockHeader (unused in simulation)
|
|
124
|
+
txContext,
|
|
125
|
+
Fr.ZERO, // vkTreeRoot - not needed for public simulation
|
|
126
|
+
Fr.ZERO, // protocolContractsHash - not needed for public simulation
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const data = new PrivateKernelTailCircuitPublicInputs(
|
|
130
|
+
constants,
|
|
131
|
+
cppTx.gasUsedByPrivate,
|
|
132
|
+
cppTx.feePayer,
|
|
133
|
+
0n, // includeByTimestamp
|
|
134
|
+
forPublic,
|
|
135
|
+
undefined, // forRollup - not needed for public simulation
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
// Build publicFunctionCalldata from all enqueued calls
|
|
139
|
+
// Calldata is already Fr[] after AvmTxHint.fromPlainObject
|
|
140
|
+
const publicFunctionCalldata: HashedValues[] = [];
|
|
141
|
+
|
|
142
|
+
// Add setup calls
|
|
143
|
+
for (const call of cppTx.setupEnqueuedCalls || []) {
|
|
144
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(call.calldata));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Add app logic calls
|
|
148
|
+
for (const call of cppTx.appLogicEnqueuedCalls || []) {
|
|
149
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(call.calldata));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Add teardown call if present
|
|
153
|
+
if (cppTx.teardownEnqueuedCall) {
|
|
154
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(cppTx.teardownEnqueuedCall.calldata));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Extract contract class log fields from ContractDeploymentData
|
|
158
|
+
const contractClassLogFields = [
|
|
159
|
+
...cppTx.nonRevertibleContractDeploymentData.contractClassLogs.map(log => log.fields),
|
|
160
|
+
...cppTx.revertibleContractDeploymentData.contractClassLogs.map(log => log.fields),
|
|
161
|
+
];
|
|
162
|
+
|
|
163
|
+
// Create the Tx
|
|
164
|
+
return new Tx(
|
|
165
|
+
txHash,
|
|
166
|
+
data,
|
|
167
|
+
ChonkProof.empty(), // No real proof needed for simulation
|
|
168
|
+
contractClassLogFields,
|
|
169
|
+
publicFunctionCalldata,
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* A simulator class for the AVM fuzzer that extends BaseAvmSimulationTester.
|
|
175
|
+
* It provides methods for registering contracts from C++ msgpack data and simulating transactions.
|
|
176
|
+
*/
|
|
177
|
+
export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
178
|
+
private simulator: PublicTxSimulator;
|
|
179
|
+
|
|
180
|
+
constructor(
|
|
181
|
+
merkleTrees: MerkleTreeWriteOperations,
|
|
182
|
+
contractDataSource: SimpleContractDataSource,
|
|
183
|
+
globals: GlobalVariables,
|
|
184
|
+
) {
|
|
185
|
+
super(contractDataSource, merkleTrees);
|
|
186
|
+
const contractsDb = new PublicContractsDB(contractDataSource);
|
|
187
|
+
this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
|
|
188
|
+
skipFeeEnforcement: false,
|
|
189
|
+
collectDebugLogs: false,
|
|
190
|
+
collectHints: false,
|
|
191
|
+
collectStatistics: false,
|
|
192
|
+
collectCallMetadata: false,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Static factory method to create an AvmFuzzerSimulator.
|
|
198
|
+
*/
|
|
199
|
+
public static async create(
|
|
200
|
+
worldStateService: NativeWorldStateService,
|
|
201
|
+
globals: GlobalVariables,
|
|
202
|
+
): Promise<AvmFuzzerSimulator> {
|
|
203
|
+
const contractDataSource = new SimpleContractDataSource();
|
|
204
|
+
const merkleTrees = await worldStateService.fork();
|
|
205
|
+
return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Simulate a transaction from a C++ AvmTxHint.
|
|
210
|
+
*/
|
|
211
|
+
public async simulate(txHint: AvmTxHint): Promise<PublicTxResult> {
|
|
212
|
+
// Compute fee from gas limits and max fees per gas (upper bound on fee)
|
|
213
|
+
const totalFee =
|
|
214
|
+
BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas +
|
|
215
|
+
BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
|
|
216
|
+
|
|
217
|
+
await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
|
|
218
|
+
|
|
219
|
+
const tx = await createTxFromHint(txHint);
|
|
220
|
+
return await this.simulator.simulate(tx);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Add a contract class from C++ raw msgpack data.
|
|
225
|
+
*/
|
|
226
|
+
public async addContractClassFromCpp(rawClass: any): Promise<void> {
|
|
227
|
+
const contractClass = contractClassPublicFromPlainObject(rawClass);
|
|
228
|
+
await this.contractDataSource.addContractClass(contractClass);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Add a contract instance from C++ raw msgpack data.
|
|
233
|
+
* This also inserts the contract address nullifier into the nullifier tree.
|
|
234
|
+
*/
|
|
235
|
+
public async addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void> {
|
|
236
|
+
const address = AztecAddress.fromPlainObject(rawAddress);
|
|
237
|
+
const instance = contractInstanceWithAddressFromPlainObject(address, rawInstance);
|
|
238
|
+
await this.addContractInstance(instance);
|
|
239
|
+
}
|
|
240
|
+
}
|