@aztec/simulator 0.76.4 → 0.77.0-testnet-ignition.21
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/README.md +3 -3
- package/dest/client.d.ts +5 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +3 -0
- package/dest/{public → common}/db_interfaces.d.ts +8 -33
- package/dest/common/db_interfaces.d.ts.map +1 -0
- package/dest/common/db_interfaces.js +1 -0
- package/dest/common/debug_fn_name.d.ts +3 -2
- package/dest/common/debug_fn_name.d.ts.map +1 -1
- package/dest/common/debug_fn_name.js +2 -5
- package/dest/common/errors.d.ts +4 -4
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +30 -39
- package/dest/common/index.d.ts +2 -1
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +2 -2
- package/dest/common/message_load_oracle_inputs.d.ts +2 -2
- package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/common/message_load_oracle_inputs.js +8 -8
- package/dest/common/stats/index.d.ts.map +1 -0
- package/dest/{stats → common/stats}/stats.d.ts +2 -2
- package/dest/common/stats/stats.d.ts.map +1 -0
- package/dest/common/stats/stats.js +10 -0
- package/dest/{acvm → private/acvm}/acvm.d.ts +4 -4
- package/dest/private/acvm/acvm.d.ts.map +1 -0
- package/dest/private/acvm/acvm.js +70 -0
- package/dest/{acvm → private/acvm}/acvm_types.d.ts +1 -1
- package/dest/private/acvm/acvm_types.d.ts.map +1 -0
- package/dest/private/acvm/acvm_types.js +3 -0
- package/dest/{acvm → private/acvm}/deserialize.d.ts +2 -2
- package/dest/private/acvm/deserialize.d.ts.map +1 -0
- package/dest/private/acvm/deserialize.js +42 -0
- package/dest/private/acvm/index.d.ts.map +1 -0
- package/dest/private/acvm/index.js +5 -0
- package/dest/{acvm → private/acvm}/oracle/index.d.ts +1 -1
- package/dest/private/acvm/oracle/index.d.ts.map +1 -0
- package/dest/private/acvm/oracle/index.js +2 -0
- package/dest/{acvm → private/acvm}/oracle/oracle.d.ts +4 -3
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/oracle.js +263 -0
- package/dest/{acvm → private/acvm}/oracle/typed_oracle.d.ts +12 -6
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/typed_oracle.js +132 -0
- package/dest/{acvm → private/acvm}/serialize.d.ts +7 -3
- package/dest/private/acvm/serialize.d.ts.map +1 -0
- package/dest/private/acvm/serialize.js +46 -0
- package/dest/{client → private}/client_execution_context.d.ts +20 -17
- package/dest/private/client_execution_context.d.ts.map +1 -0
- package/dest/private/client_execution_context.js +378 -0
- package/dest/{client → private}/db_oracle.d.ts +19 -7
- package/dest/private/db_oracle.d.ts.map +1 -0
- package/dest/private/db_oracle.js +14 -0
- package/dest/{client → private}/execution_note_cache.d.ts +2 -2
- package/dest/private/execution_note_cache.d.ts.map +1 -0
- package/dest/private/execution_note_cache.js +180 -0
- package/dest/{common → private}/hashed_values_cache.d.ts +2 -2
- package/dest/private/hashed_values_cache.d.ts.map +1 -0
- package/dest/private/hashed_values_cache.js +46 -0
- package/dest/private/index.d.ts +13 -0
- package/dest/private/index.d.ts.map +1 -0
- package/dest/private/index.js +12 -0
- package/dest/{client → private}/pick_notes.d.ts +1 -1
- package/dest/private/pick_notes.d.ts.map +1 -0
- package/dest/private/pick_notes.js +51 -0
- package/dest/private/private_execution.d.ts +24 -0
- package/dest/private/private_execution.d.ts.map +1 -0
- package/dest/private/private_execution.js +90 -0
- package/dest/{providers → private/providers}/acvm_native.d.ts +5 -5
- package/dest/private/providers/acvm_native.d.ts.map +1 -0
- package/dest/private/providers/acvm_native.js +139 -0
- package/dest/{providers → private/providers}/acvm_wasm.d.ts +4 -4
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -0
- package/dest/private/providers/acvm_wasm.js +62 -0
- package/dest/{providers → private/providers}/acvm_wasm_with_blobs.d.ts +5 -5
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/{providers → private/providers}/acvm_wasm_with_blobs.js +3 -6
- package/dest/{providers → private/providers}/factory.d.ts +1 -1
- package/dest/private/providers/factory.d.ts.map +1 -0
- package/dest/private/providers/factory.js +27 -0
- package/dest/{common → private/providers}/simulation_provider.d.ts +5 -5
- package/dest/private/providers/simulation_provider.d.ts.map +1 -0
- package/dest/private/providers/simulation_provider.js +24 -0
- package/dest/private/simulator.d.ts +36 -0
- package/dest/private/simulator.d.ts.map +1 -0
- package/dest/private/simulator.js +78 -0
- package/dest/{client → private}/unconstrained_execution.d.ts +5 -5
- package/dest/private/unconstrained_execution.d.ts.map +1 -0
- package/dest/private/unconstrained_execution.js +27 -0
- package/dest/{client → private}/view_data_oracle.d.ts +15 -7
- package/dest/private/view_data_oracle.d.ts.map +1 -0
- package/dest/private/view_data_oracle.js +260 -0
- package/dest/{avm → public/avm}/avm_context.d.ts +7 -5
- package/dest/public/avm/avm_context.d.ts.map +1 -0
- package/dest/public/avm/avm_context.js +44 -0
- package/dest/{avm → public/avm}/avm_contract_call_result.d.ts +5 -5
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -0
- package/dest/public/avm/avm_contract_call_result.js +50 -0
- package/dest/{avm → public/avm}/avm_execution_environment.d.ts +2 -2
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -0
- package/dest/public/avm/avm_execution_environment.js +31 -0
- package/dest/public/avm/avm_gas.d.ts.map +1 -0
- package/dest/public/avm/avm_gas.js +202 -0
- package/dest/{avm → public/avm}/avm_machine_state.d.ts +2 -2
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -0
- package/dest/public/avm/avm_machine_state.js +106 -0
- package/dest/{avm → public/avm}/avm_memory_types.d.ts +2 -2
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -0
- package/dest/public/avm/avm_memory_types.js +340 -0
- package/dest/{avm → public/avm}/avm_simulator.d.ts +5 -3
- package/dest/public/avm/avm_simulator.d.ts.map +1 -0
- package/dest/public/avm/avm_simulator.js +202 -0
- package/dest/public/avm/bytecode_utils.d.ts.map +1 -0
- package/dest/public/avm/bytecode_utils.js +17 -0
- package/dest/{avm → public/avm}/errors.d.ts +5 -4
- package/dest/public/avm/errors.d.ts.map +1 -0
- package/dest/public/avm/errors.js +179 -0
- package/dest/{avm → public/avm}/fixtures/avm_simulation_tester.d.ts +6 -6
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/fixtures/avm_simulation_tester.js +76 -0
- package/dest/{avm → public/avm}/fixtures/base_avm_simulation_tester.d.ts +13 -12
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +83 -0
- package/dest/{avm → public/avm}/fixtures/index.d.ts +24 -7
- package/dest/public/avm/fixtures/index.d.ts.map +1 -0
- package/dest/public/avm/fixtures/index.js +175 -0
- package/dest/{avm → public/avm}/fixtures/simple_contract_data_source.d.ts +10 -6
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/avm/fixtures/simple_contract_data_source.js +74 -0
- package/dest/public/avm/index.d.ts +4 -0
- package/dest/public/avm/index.d.ts.map +1 -0
- package/dest/{avm/index.d.ts → public/avm/index.js} +1 -2
- package/dest/public/avm/journal/index.d.ts.map +1 -0
- package/dest/{avm → public/avm}/journal/journal.d.ts +51 -18
- package/dest/public/avm/journal/journal.d.ts.map +1 -0
- package/dest/public/avm/journal/journal.js +486 -0
- package/dest/{avm → public/avm}/journal/nullifiers.d.ts +8 -6
- package/dest/public/avm/journal/nullifiers.d.ts.map +1 -0
- package/dest/public/avm/journal/nullifiers.js +97 -0
- package/dest/{avm → public/avm}/journal/public_storage.d.ts +2 -2
- package/dest/public/avm/journal/public_storage.d.ts.map +1 -0
- package/dest/public/avm/journal/public_storage.js +145 -0
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -0
- package/dest/public/avm/opcodes/accrued_substate.js +252 -0
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -0
- package/dest/public/avm/opcodes/addressing_mode.js +74 -0
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -0
- package/dest/public/avm/opcodes/arithmetic.js +73 -0
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -0
- package/dest/public/avm/opcodes/bitwise.js +106 -0
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -0
- package/dest/public/avm/opcodes/comparators.js +43 -0
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -0
- package/dest/public/avm/opcodes/contract.js +66 -0
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -0
- package/dest/public/avm/opcodes/control_flow.js +105 -0
- package/dest/{avm → public/avm}/opcodes/conversion.d.ts +1 -1
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -0
- package/dest/public/avm/opcodes/conversion.js +69 -0
- package/dest/{avm → public/avm}/opcodes/ec_add.d.ts +1 -1
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -0
- package/dest/public/avm/opcodes/ec_add.js +84 -0
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -0
- package/dest/public/avm/opcodes/environment_getters.js +79 -0
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -0
- package/dest/public/avm/opcodes/external_calls.js +180 -0
- package/dest/{avm → public/avm}/opcodes/hashing.d.ts +1 -1
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -0
- package/dest/public/avm/opcodes/hashing.js +114 -0
- package/dest/public/avm/opcodes/index.d.ts.map +1 -0
- package/dest/{avm → public/avm}/opcodes/instruction.d.ts +2 -2
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -0
- package/dest/public/avm/opcodes/instruction.js +91 -0
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -0
- package/dest/public/avm/opcodes/instruction_impl.js +30 -0
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -0
- package/dest/public/avm/opcodes/memory.js +253 -0
- package/dest/{avm → public/avm}/opcodes/misc.d.ts +1 -1
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -0
- package/dest/public/avm/opcodes/misc.js +48 -0
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -0
- package/dest/public/avm/opcodes/storage.js +66 -0
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -0
- package/dest/public/avm/serialization/buffer_cursor.js +99 -0
- package/dest/{avm → public/avm}/serialization/bytecode_serialization.d.ts +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/bytecode_serialization.js +328 -0
- package/dest/{avm → public/avm}/serialization/instruction_serialization.d.ts +1 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/instruction_serialization.js +225 -0
- package/dest/{avm → public/avm}/test_utils.d.ts +6 -4
- package/dest/public/avm/test_utils.d.ts.map +1 -0
- package/dest/public/avm/test_utils.js +52 -0
- package/dest/public/bytecode_errors.js +1 -2
- package/dest/public/execution.d.ts +8 -2
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +4 -5
- package/dest/public/executor_metrics.js +16 -12
- package/dest/public/fixtures/index.js +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +15 -9
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +54 -53
- package/dest/public/fixtures/utils.d.ts +7 -11
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +92 -32
- package/dest/public/index.d.ts +5 -4
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +5 -5
- package/dest/public/public_db_sources.d.ts +82 -34
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +171 -196
- package/dest/public/{public_processor.d.ts → public_processor/public_processor.d.ts} +10 -8
- package/dest/public/public_processor/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor.js +379 -0
- package/dest/public/{public_processor_metrics.d.ts → public_processor/public_processor_metrics.d.ts} +3 -3
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor_metrics.js +125 -0
- package/dest/public/{public_tx_context.d.ts → public_tx_simulator/public_tx_context.d.ts} +14 -8
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_context.js +320 -0
- package/dest/public/{public_tx_simulator.d.ts → public_tx_simulator/public_tx_simulator.d.ts} +10 -7
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.js +325 -0
- package/dest/public/side_effect_errors.js +1 -2
- package/dest/public/side_effect_trace.d.ts +16 -10
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +82 -149
- package/dest/public/side_effect_trace_interface.d.ts +9 -7
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/side_effect_trace_interface.js +1 -2
- package/dest/public/tx_contract_cache.d.ts +41 -0
- package/dest/public/tx_contract_cache.d.ts.map +1 -0
- package/dest/public/tx_contract_cache.js +49 -0
- package/dest/public/unique_class_ids.js +23 -28
- package/dest/public/utils.d.ts +2 -2
- package/dest/public/utils.d.ts.map +1 -1
- package/dest/public/utils.js +17 -12
- package/dest/server.d.ts +4 -4
- package/dest/server.d.ts.map +1 -1
- package/dest/server.js +3 -5
- package/dest/test/utils.d.ts +3 -2
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +9 -7
- package/package.json +19 -21
- package/src/client.ts +4 -0
- package/src/{public → common}/db_interfaces.ts +8 -40
- package/src/common/debug_fn_name.ts +4 -2
- package/src/common/errors.ts +5 -5
- package/src/common/index.ts +2 -1
- package/src/common/message_load_oracle_inputs.ts +2 -2
- package/src/common/stats/index.ts +1 -0
- package/src/{stats → common/stats}/stats.ts +2 -2
- package/src/{acvm → private/acvm}/acvm.ts +5 -5
- package/src/{acvm → private/acvm}/acvm_types.ts +1 -1
- package/src/{acvm → private/acvm}/deserialize.ts +2 -2
- package/src/{acvm → private/acvm}/oracle/index.ts +1 -1
- package/src/{acvm → private/acvm}/oracle/oracle.ts +22 -12
- package/src/{acvm → private/acvm}/oracle/typed_oracle.ts +50 -55
- package/src/{acvm → private/acvm}/serialize.ts +10 -3
- package/src/{client → private}/client_execution_context.ts +54 -37
- package/src/{client → private}/db_oracle.ts +20 -20
- package/src/{client → private}/execution_note_cache.ts +3 -3
- package/src/{common → private}/hashed_values_cache.ts +2 -2
- package/src/private/index.ts +12 -0
- package/src/{client → private}/pick_notes.ts +1 -1
- package/src/{client → private}/private_execution.ts +46 -14
- package/src/{providers → private/providers}/acvm_native.ts +6 -6
- package/src/{providers → private/providers}/acvm_wasm.ts +4 -4
- package/src/{providers → private/providers}/acvm_wasm_with_blobs.ts +5 -5
- package/src/{providers → private/providers}/factory.ts +1 -1
- package/src/{common → private/providers}/simulation_provider.ts +5 -5
- package/src/{client → private}/simulator.ts +31 -123
- package/src/{client → private}/unconstrained_execution.ts +7 -7
- package/src/{client → private}/view_data_oracle.ts +25 -28
- package/src/{avm → public/avm}/avm_context.ts +12 -7
- package/src/{avm → public/avm}/avm_contract_call_result.ts +6 -6
- package/src/{avm → public/avm}/avm_execution_environment.ts +2 -2
- package/src/{avm → public/avm}/avm_gas.ts +1 -3
- package/src/{avm → public/avm}/avm_machine_state.ts +2 -2
- package/src/{avm → public/avm}/avm_memory_types.ts +4 -4
- package/src/{avm → public/avm}/avm_simulator.ts +12 -6
- package/src/{avm → public/avm}/errors.ts +5 -4
- package/src/{avm → public/avm}/fixtures/avm_simulation_tester.ts +16 -15
- package/src/{avm → public/avm}/fixtures/base_avm_simulation_tester.ts +45 -40
- package/src/{avm → public/avm}/fixtures/index.ts +77 -12
- package/src/{avm → public/avm}/fixtures/simple_contract_data_source.ts +26 -19
- package/src/{avm → public/avm}/index.ts +1 -1
- package/src/public/avm/journal/index.ts +1 -0
- package/src/{avm → public/avm}/journal/journal.ts +330 -305
- package/src/{avm → public/avm}/journal/nullifiers.ts +20 -19
- package/src/{avm → public/avm}/journal/public_storage.ts +2 -2
- package/src/{avm → public/avm}/opcodes/contract.ts +1 -1
- package/src/{avm → public/avm}/opcodes/control_flow.ts +1 -1
- package/src/{avm → public/avm}/opcodes/conversion.ts +1 -1
- package/src/{avm → public/avm}/opcodes/ec_add.ts +2 -2
- package/src/{avm → public/avm}/opcodes/external_calls.ts +5 -6
- package/src/{avm → public/avm}/opcodes/hashing.ts +1 -1
- package/src/public/avm/opcodes/index.ts +15 -0
- package/src/{avm → public/avm}/opcodes/instruction.ts +2 -2
- package/src/{avm → public/avm}/opcodes/misc.ts +1 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +204 -0
- package/src/{avm → public/avm}/serialization/instruction_serialization.ts +0 -1
- package/src/{avm → public/avm}/test_utils.ts +10 -7
- package/src/public/execution.ts +9 -12
- package/src/public/fixtures/public_tx_simulation_tester.ts +66 -72
- package/src/public/fixtures/utils.ts +122 -33
- package/src/public/index.ts +5 -4
- package/src/public/public_db_sources.ts +216 -222
- package/src/public/{public_processor.ts → public_processor/public_processor.ts} +78 -53
- package/src/public/{public_processor_metrics.ts → public_processor/public_processor_metrics.ts} +3 -3
- package/src/public/{public_tx_context.ts → public_tx_simulator/public_tx_context.ts} +70 -75
- package/src/public/{public_tx_simulator.ts → public_tx_simulator/public_tx_simulator.ts} +104 -91
- package/src/public/side_effect_trace.ts +85 -160
- package/src/public/side_effect_trace_interface.ts +10 -23
- package/src/public/tx_contract_cache.ts +69 -0
- package/src/public/unique_class_ids.ts +1 -1
- package/src/public/utils.ts +2 -2
- package/src/server.ts +4 -4
- package/src/test/utils.ts +5 -3
- package/dest/acvm/acvm.d.ts.map +0 -1
- package/dest/acvm/acvm.js +0 -73
- package/dest/acvm/acvm_types.d.ts.map +0 -1
- package/dest/acvm/acvm_types.js +0 -2
- package/dest/acvm/deserialize.d.ts.map +0 -1
- package/dest/acvm/deserialize.js +0 -46
- package/dest/acvm/index.d.ts.map +0 -1
- package/dest/acvm/index.js +0 -6
- package/dest/acvm/oracle/index.d.ts.map +0 -1
- package/dest/acvm/oracle/index.js +0 -3
- package/dest/acvm/oracle/oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/oracle.js +0 -230
- package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/typed_oracle.js +0 -131
- package/dest/acvm/serialize.d.ts.map +0 -1
- package/dest/acvm/serialize.js +0 -48
- package/dest/avm/avm_context.d.ts.map +0 -1
- package/dest/avm/avm_context.js +0 -44
- package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
- package/dest/avm/avm_contract_call_result.js +0 -45
- package/dest/avm/avm_execution_environment.d.ts.map +0 -1
- package/dest/avm/avm_execution_environment.js +0 -28
- package/dest/avm/avm_gas.d.ts.map +0 -1
- package/dest/avm/avm_gas.js +0 -170
- package/dest/avm/avm_machine_state.d.ts.map +0 -1
- package/dest/avm/avm_machine_state.js +0 -112
- package/dest/avm/avm_memory_types.d.ts.map +0 -1
- package/dest/avm/avm_memory_types.js +0 -327
- package/dest/avm/avm_simulator.d.ts.map +0 -1
- package/dest/avm/avm_simulator.js +0 -193
- package/dest/avm/avm_tree.d.ts +0 -282
- package/dest/avm/avm_tree.d.ts.map +0 -1
- package/dest/avm/avm_tree.js +0 -684
- package/dest/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/avm/bytecode_utils.js +0 -15
- package/dest/avm/errors.d.ts.map +0 -1
- package/dest/avm/errors.js +0 -196
- package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/avm_simulation_tester.js +0 -73
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/base_avm_simulation_tester.js +0 -76
- package/dest/avm/fixtures/index.d.ts.map +0 -1
- package/dest/avm/fixtures/index.js +0 -134
- package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- package/dest/avm/fixtures/simple_contract_data_source.js +0 -75
- package/dest/avm/index.d.ts.map +0 -1
- package/dest/avm/index.js +0 -4
- package/dest/avm/journal/index.d.ts.map +0 -1
- package/dest/avm/journal/index.js +0 -2
- package/dest/avm/journal/journal.d.ts.map +0 -1
- package/dest/avm/journal/journal.js +0 -499
- package/dest/avm/journal/nullifiers.d.ts.map +0 -1
- package/dest/avm/journal/nullifiers.js +0 -99
- package/dest/avm/journal/public_storage.d.ts.map +0 -1
- package/dest/avm/journal/public_storage.js +0 -159
- package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
- package/dest/avm/opcodes/accrued_substate.js +0 -215
- package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
- package/dest/avm/opcodes/addressing_mode.js +0 -81
- package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
- package/dest/avm/opcodes/arithmetic.js +0 -70
- package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
- package/dest/avm/opcodes/bitwise.js +0 -90
- package/dest/avm/opcodes/comparators.d.ts.map +0 -1
- package/dest/avm/opcodes/comparators.js +0 -40
- package/dest/avm/opcodes/contract.d.ts.map +0 -1
- package/dest/avm/opcodes/contract.js +0 -63
- package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
- package/dest/avm/opcodes/control_flow.js +0 -97
- package/dest/avm/opcodes/conversion.d.ts.map +0 -1
- package/dest/avm/opcodes/conversion.js +0 -64
- package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
- package/dest/avm/opcodes/ec_add.js +0 -82
- package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
- package/dest/avm/opcodes/environment_getters.js +0 -78
- package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
- package/dest/avm/opcodes/external_calls.js +0 -169
- package/dest/avm/opcodes/hashing.d.ts.map +0 -1
- package/dest/avm/opcodes/hashing.js +0 -103
- package/dest/avm/opcodes/index.d.ts.map +0 -1
- package/dest/avm/opcodes/index.js +0 -16
- package/dest/avm/opcodes/instruction.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction.js +0 -100
- package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction_impl.js +0 -33
- package/dest/avm/opcodes/memory.d.ts.map +0 -1
- package/dest/avm/opcodes/memory.js +0 -226
- package/dest/avm/opcodes/misc.d.ts.map +0 -1
- package/dest/avm/opcodes/misc.js +0 -45
- package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
- package/dest/avm/opcodes/multi_scalar_mul.js +0 -112
- package/dest/avm/opcodes/storage.d.ts.map +0 -1
- package/dest/avm/opcodes/storage.js +0 -61
- package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
- package/dest/avm/serialization/buffer_cursor.js +0 -99
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/bytecode_serialization.js +0 -132
- package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/instruction_serialization.js +0 -187
- package/dest/avm/test_utils.d.ts.map +0 -1
- package/dest/avm/test_utils.js +0 -52
- package/dest/client/client_execution_context.d.ts.map +0 -1
- package/dest/client/client_execution_context.js +0 -392
- package/dest/client/db_oracle.d.ts.map +0 -1
- package/dest/client/db_oracle.js +0 -17
- package/dest/client/execution_note_cache.d.ts.map +0 -1
- package/dest/client/execution_note_cache.js +0 -181
- package/dest/client/index.d.ts +0 -16
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/index.js +0 -15
- package/dest/client/pick_notes.d.ts.map +0 -1
- package/dest/client/pick_notes.js +0 -54
- package/dest/client/private_execution.d.ts +0 -19
- package/dest/client/private_execution.d.ts.map +0 -1
- package/dest/client/private_execution.js +0 -72
- package/dest/client/simulator.d.ts +0 -60
- package/dest/client/simulator.d.ts.map +0 -1
- package/dest/client/simulator.js +0 -136
- package/dest/client/unconstrained_execution.d.ts.map +0 -1
- package/dest/client/unconstrained_execution.js +0 -30
- package/dest/client/view_data_oracle.d.ts.map +0 -1
- package/dest/client/view_data_oracle.js +0 -268
- package/dest/common/hashed_values_cache.d.ts.map +0 -1
- package/dest/common/hashed_values_cache.js +0 -50
- package/dest/common/simulation_provider.d.ts.map +0 -1
- package/dest/common/simulation_provider.js +0 -27
- package/dest/common.d.ts +0 -2
- package/dest/common.d.ts.map +0 -1
- package/dest/common.js +0 -2
- package/dest/providers/acvm_native.d.ts.map +0 -1
- package/dest/providers/acvm_native.js +0 -125
- package/dest/providers/acvm_wasm.d.ts.map +0 -1
- package/dest/providers/acvm_wasm.js +0 -54
- package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
- package/dest/providers/factory.d.ts.map +0 -1
- package/dest/providers/factory.js +0 -27
- package/dest/providers/index.d.ts +0 -5
- package/dest/providers/index.d.ts.map +0 -1
- package/dest/providers/index.js +0 -5
- package/dest/public/db_interfaces.d.ts.map +0 -1
- package/dest/public/db_interfaces.js +0 -2
- package/dest/public/fee_payment.d.ts +0 -11
- package/dest/public/fee_payment.d.ts.map +0 -1
- package/dest/public/fee_payment.js +0 -21
- package/dest/public/public_processor.d.ts.map +0 -1
- package/dest/public/public_processor.js +0 -352
- package/dest/public/public_processor_metrics.d.ts.map +0 -1
- package/dest/public/public_processor_metrics.js +0 -106
- package/dest/public/public_tx_context.d.ts.map +0 -1
- package/dest/public/public_tx_context.js +0 -341
- package/dest/public/public_tx_simulator.d.ts.map +0 -1
- package/dest/public/public_tx_simulator.js +0 -333
- package/dest/stats/index.d.ts.map +0 -1
- package/dest/stats/index.js +0 -2
- package/dest/stats/stats.d.ts.map +0 -1
- package/dest/stats/stats.js +0 -11
- package/src/avm/avm_tree.ts +0 -887
- package/src/avm/opcodes/multi_scalar_mul.ts +0 -121
- package/src/avm/serialization/bytecode_serialization.ts +0 -212
- package/src/client/index.ts +0 -15
- package/src/common.ts +0 -1
- package/src/providers/index.ts +0 -4
- package/src/public/fee_payment.ts +0 -23
- /package/dest/{stats → common/stats}/index.d.ts +0 -0
- /package/{src/stats/index.ts → dest/common/stats/index.js} +0 -0
- /package/dest/{acvm → private/acvm}/index.d.ts +0 -0
- /package/dest/{avm → public/avm}/avm_gas.d.ts +0 -0
- /package/dest/{avm → public/avm}/bytecode_utils.d.ts +0 -0
- /package/dest/{avm → public/avm}/journal/index.d.ts +0 -0
- /package/{src/avm/journal/index.ts → dest/public/avm/journal/index.js} +0 -0
- /package/dest/{avm → public/avm}/opcodes/accrued_substate.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/addressing_mode.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/arithmetic.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/bitwise.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/comparators.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/contract.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/control_flow.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/environment_getters.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/external_calls.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/index.d.ts +0 -0
- /package/{src/avm/opcodes/index.ts → dest/public/avm/opcodes/index.js} +0 -0
- /package/dest/{avm → public/avm}/opcodes/instruction_impl.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/memory.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/storage.d.ts +0 -0
- /package/dest/{avm → public/avm}/serialization/buffer_cursor.d.ts +0 -0
- /package/src/{acvm → private/acvm}/index.ts +0 -0
- /package/src/{avm → public/avm}/bytecode_utils.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/.eslintrc.cjs +0 -0
- /package/src/{avm → public/avm}/opcodes/accrued_substate.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/addressing_mode.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/arithmetic.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/bitwise.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/comparators.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/environment_getters.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/instruction_impl.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/memory.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/storage.ts +0 -0
- /package/src/{avm → public/avm}/serialization/buffer_cursor.ts +0 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
9
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
10
|
+
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
11
|
+
import { NestedProcessReturnValues, TxExecutionPhase } from '@aztec/stdlib/tx';
|
|
12
|
+
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
13
|
+
import { strict as assert } from 'assert';
|
|
14
|
+
import { getPublicFunctionDebugName } from '../../common/debug_fn_name.js';
|
|
15
|
+
import { AvmSimulator } from '../avm/index.js';
|
|
16
|
+
import { NullifierCollisionError } from '../avm/journal/nullifiers.js';
|
|
17
|
+
import { ExecutorMetrics } from '../executor_metrics.js';
|
|
18
|
+
import { PublicTxContext } from './public_tx_context.js';
|
|
19
|
+
export class PublicTxSimulator {
|
|
20
|
+
db;
|
|
21
|
+
worldStateDB;
|
|
22
|
+
globalVariables;
|
|
23
|
+
doMerkleOperations;
|
|
24
|
+
skipFeeEnforcement;
|
|
25
|
+
metrics;
|
|
26
|
+
log;
|
|
27
|
+
constructor(db, worldStateDB, globalVariables, doMerkleOperations = false, skipFeeEnforcement = false, telemetryClient = getTelemetryClient()){
|
|
28
|
+
this.db = db;
|
|
29
|
+
this.worldStateDB = worldStateDB;
|
|
30
|
+
this.globalVariables = globalVariables;
|
|
31
|
+
this.doMerkleOperations = doMerkleOperations;
|
|
32
|
+
this.skipFeeEnforcement = skipFeeEnforcement;
|
|
33
|
+
this.log = createLogger(`simulator:public_tx_simulator`);
|
|
34
|
+
this.metrics = new ExecutorMetrics(telemetryClient, 'PublicTxSimulator');
|
|
35
|
+
}
|
|
36
|
+
get tracer() {
|
|
37
|
+
return this.metrics.tracer;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Simulate a transaction's public portion including all of its phases.
|
|
41
|
+
* @param tx - The transaction to simulate.
|
|
42
|
+
* @returns The result of the transaction's public execution.
|
|
43
|
+
*/ async simulate(tx) {
|
|
44
|
+
try {
|
|
45
|
+
const startTime = process.hrtime.bigint();
|
|
46
|
+
const txHash = await tx.getTxHash();
|
|
47
|
+
this.log.debug(`Simulating ${tx.enqueuedPublicFunctionCalls.length} public calls for tx ${txHash}`, {
|
|
48
|
+
txHash
|
|
49
|
+
});
|
|
50
|
+
const context = await PublicTxContext.create(this.db, this.worldStateDB, tx, this.globalVariables, this.doMerkleOperations);
|
|
51
|
+
const nonRevertStart = process.hrtime.bigint();
|
|
52
|
+
await this.insertNonRevertiblesFromPrivate(context);
|
|
53
|
+
// add new contracts to the contracts db so that their functions may be found and called
|
|
54
|
+
// TODO(#6464): Should we allow emitting contracts in the private setup phase?
|
|
55
|
+
await this.worldStateDB.addNewNonRevertibleContracts(tx);
|
|
56
|
+
const nonRevertEnd = process.hrtime.bigint();
|
|
57
|
+
this.metrics.recordPrivateEffectsInsertion(Number(nonRevertEnd - nonRevertStart) / 1_000, 'non-revertible');
|
|
58
|
+
const processedPhases = [];
|
|
59
|
+
if (context.hasPhase(TxExecutionPhase.SETUP)) {
|
|
60
|
+
const setupResult = await this.simulateSetupPhase(context);
|
|
61
|
+
processedPhases.push(setupResult);
|
|
62
|
+
}
|
|
63
|
+
const revertStart = process.hrtime.bigint();
|
|
64
|
+
// FIXME(#12375): TX shouldn't die if revertible insertions fail. Should just revert to snapshot.
|
|
65
|
+
await this.insertRevertiblesFromPrivate(context);
|
|
66
|
+
// add new contracts to the contracts db so that their functions may be found and called
|
|
67
|
+
await this.worldStateDB.addNewRevertibleContracts(tx);
|
|
68
|
+
const revertEnd = process.hrtime.bigint();
|
|
69
|
+
this.metrics.recordPrivateEffectsInsertion(Number(revertEnd - revertStart) / 1_000, 'revertible');
|
|
70
|
+
if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
|
|
71
|
+
const appLogicResult = await this.simulateAppLogicPhase(context);
|
|
72
|
+
processedPhases.push(appLogicResult);
|
|
73
|
+
}
|
|
74
|
+
if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
|
|
75
|
+
const teardownResult = await this.simulateTeardownPhase(context);
|
|
76
|
+
processedPhases.push(teardownResult);
|
|
77
|
+
}
|
|
78
|
+
await context.halt();
|
|
79
|
+
await this.payFee(context);
|
|
80
|
+
const endStateReference = await this.db.getStateReference();
|
|
81
|
+
const avmProvingRequest = await context.generateProvingRequest(endStateReference);
|
|
82
|
+
const revertCode = context.getFinalRevertCode();
|
|
83
|
+
if (!revertCode.isOK()) {
|
|
84
|
+
await tx.filterRevertedLogs();
|
|
85
|
+
}
|
|
86
|
+
// Commit contracts from this TX to the block-level cache and clear tx cache
|
|
87
|
+
// If the tx reverted, only commit non-revertible contracts
|
|
88
|
+
// NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
|
|
89
|
+
this.worldStateDB.commitContractsForTx(/*onlyNonRevertibles=*/ !revertCode.isOK());
|
|
90
|
+
const endTime = process.hrtime.bigint();
|
|
91
|
+
this.log.debug(`Public TX simulator took ${Number(endTime - startTime) / 1_000_000} ms\n`);
|
|
92
|
+
return {
|
|
93
|
+
avmProvingRequest,
|
|
94
|
+
gasUsed: {
|
|
95
|
+
totalGas: context.getActualGasUsed(),
|
|
96
|
+
teardownGas: context.teardownGasUsed,
|
|
97
|
+
publicGas: context.getActualPublicGasUsed(),
|
|
98
|
+
billedGas: context.getTotalGasUsed()
|
|
99
|
+
},
|
|
100
|
+
revertCode,
|
|
101
|
+
revertReason: context.revertReason,
|
|
102
|
+
processedPhases: processedPhases
|
|
103
|
+
};
|
|
104
|
+
} finally{
|
|
105
|
+
// Make sure there are no new contracts in the tx-level cache.
|
|
106
|
+
// They should either be committed to block-level cache or cleared.
|
|
107
|
+
this.worldStateDB.clearContractsForTx();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Simulate the setup phase of a transaction's public execution.
|
|
112
|
+
* @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
|
|
113
|
+
* @returns The phase result.
|
|
114
|
+
*/ async simulateSetupPhase(context) {
|
|
115
|
+
return await this.simulatePhase(TxExecutionPhase.SETUP, context);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Simulate the app logic phase of a transaction's public execution.
|
|
119
|
+
* @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
|
|
120
|
+
* @returns The phase result.
|
|
121
|
+
*/ async simulateAppLogicPhase(context) {
|
|
122
|
+
assert(context.state.isForked(), 'App logic phase should operate with forked state.');
|
|
123
|
+
const result = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
|
|
124
|
+
if (result.reverted) {
|
|
125
|
+
// Drop the currently active forked state manager and rollback to end of setup.
|
|
126
|
+
await context.state.discardForkedState();
|
|
127
|
+
} else {
|
|
128
|
+
if (!context.hasPhase(TxExecutionPhase.TEARDOWN)) {
|
|
129
|
+
// Nothing to do after this (no teardown), so merge state updates now instead of letting teardown handle it.
|
|
130
|
+
await context.state.mergeForkedState();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Simulate the teardown phase of a transaction's public execution.
|
|
137
|
+
* @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
|
|
138
|
+
* @returns The phase result.
|
|
139
|
+
*/ async simulateTeardownPhase(context) {
|
|
140
|
+
if (!context.state.isForked()) {
|
|
141
|
+
// If state isn't forked (app logic reverted), fork now
|
|
142
|
+
// so we can rollback to the end of setup if teardown reverts.
|
|
143
|
+
await context.state.fork();
|
|
144
|
+
}
|
|
145
|
+
const result = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
|
|
146
|
+
if (result.reverted) {
|
|
147
|
+
// Drop the currently active forked state manager and rollback to end of setup.
|
|
148
|
+
await context.state.discardForkedState();
|
|
149
|
+
} else {
|
|
150
|
+
// Merge state updates from teardown,
|
|
151
|
+
await context.state.mergeForkedState();
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Simulate a phase of a transaction's public execution.
|
|
157
|
+
* @param phase - The current phase
|
|
158
|
+
* @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
|
|
159
|
+
* @returns The phase result.
|
|
160
|
+
*/ async simulatePhase(phase, context) {
|
|
161
|
+
const callRequests = context.getCallRequestsForPhase(phase);
|
|
162
|
+
const executionRequests = context.getExecutionRequestsForPhase(phase);
|
|
163
|
+
this.log.debug(`Processing phase ${TxExecutionPhase[phase]} for tx ${context.txHash}`, {
|
|
164
|
+
txHash: context.txHash.toString(),
|
|
165
|
+
phase: TxExecutionPhase[phase],
|
|
166
|
+
callRequests: callRequests.length,
|
|
167
|
+
executionRequests: executionRequests.length
|
|
168
|
+
});
|
|
169
|
+
const returnValues = [];
|
|
170
|
+
let reverted = false;
|
|
171
|
+
let revertReason;
|
|
172
|
+
const phaseTimer = new Timer();
|
|
173
|
+
for(let i = callRequests.length - 1; i >= 0; i--){
|
|
174
|
+
if (reverted) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
const callRequest = callRequests[i];
|
|
178
|
+
const executionRequest = executionRequests[i];
|
|
179
|
+
const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest, executionRequest);
|
|
180
|
+
returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output));
|
|
181
|
+
if (enqueuedCallResult.reverted) {
|
|
182
|
+
reverted = true;
|
|
183
|
+
revertReason = enqueuedCallResult.revertReason;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
phase,
|
|
188
|
+
durationMs: phaseTimer.ms(),
|
|
189
|
+
returnValues,
|
|
190
|
+
reverted,
|
|
191
|
+
revertReason
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Simulate an enqueued public call.
|
|
196
|
+
* @param phase - The current phase of public execution
|
|
197
|
+
* @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
|
|
198
|
+
* @param callRequest - The enqueued call to execute
|
|
199
|
+
* @param executionRequest - The execution request (includes args)
|
|
200
|
+
* @returns The result of execution.
|
|
201
|
+
*/ async simulateEnqueuedCall(phase, context, callRequest, executionRequest) {
|
|
202
|
+
const stateManager = context.state.getActiveStateManager();
|
|
203
|
+
const address = executionRequest.callContext.contractAddress;
|
|
204
|
+
const fnName = await getPublicFunctionDebugName(this.worldStateDB, address, executionRequest.args);
|
|
205
|
+
const allocatedGas = context.getGasLeftAtPhase(phase);
|
|
206
|
+
const result = await this.simulateEnqueuedCallInternal(context.state.getActiveStateManager(), executionRequest, allocatedGas, /*transactionFee=*/ context.getTransactionFee(phase), fnName);
|
|
207
|
+
const gasUsed = allocatedGas.sub(result.gasLeft); // by enqueued call
|
|
208
|
+
context.consumeGas(phase, gasUsed);
|
|
209
|
+
this.log.debug(`Simulated enqueued public call (${fnName}) consumed ${gasUsed.l2Gas} L2 gas ending with ${result.gasLeft.l2Gas} L2 gas left.`);
|
|
210
|
+
stateManager.traceEnqueuedCall(callRequest, executionRequest.args, result.reverted);
|
|
211
|
+
if (result.reverted) {
|
|
212
|
+
const culprit = `${executionRequest.callContext.contractAddress}:${executionRequest.callContext.functionSelector}`;
|
|
213
|
+
context.revert(phase, result.revertReason, culprit); // throws if in setup (non-revertible) phase
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Simulate an enqueued public call, without modifying the context (PublicTxContext).
|
|
219
|
+
* Resulting modifications to the context can be applied by the caller.
|
|
220
|
+
*
|
|
221
|
+
* This function can be mocked for testing to skip actual AVM simulation
|
|
222
|
+
* while still simulating phases and generating a proving request.
|
|
223
|
+
*
|
|
224
|
+
* @param stateManager - The state manager for AvmSimulation
|
|
225
|
+
* @param context - The context of the currently executing public transaction portion
|
|
226
|
+
* @param executionRequest - The execution request (includes args)
|
|
227
|
+
* @param allocatedGas - The gas allocated to the enqueued call
|
|
228
|
+
* @param fnName - The name of the function
|
|
229
|
+
* @returns The result of execution.
|
|
230
|
+
*/ async simulateEnqueuedCallInternal(stateManager, executionRequest, allocatedGas, transactionFee, fnName) {
|
|
231
|
+
const address = executionRequest.callContext.contractAddress;
|
|
232
|
+
const sender = executionRequest.callContext.msgSender;
|
|
233
|
+
this.log.debug(`Executing enqueued public call to external function ${fnName}@${address} with ${allocatedGas.l2Gas} allocated L2 gas.`);
|
|
234
|
+
const timer = new Timer();
|
|
235
|
+
const simulator = await AvmSimulator.create(stateManager, address, sender, transactionFee, this.globalVariables, executionRequest.callContext.isStaticCall, executionRequest.args, allocatedGas);
|
|
236
|
+
const avmCallResult = await simulator.execute();
|
|
237
|
+
const result = avmCallResult.finalize();
|
|
238
|
+
this.log.verbose(result.reverted ? `Simulation of enqueued public call ${fnName} reverted with reason ${result.revertReason}.` : `Simulation of enqueued public call ${fnName} completed successfully.`, {
|
|
239
|
+
eventName: 'avm-simulation',
|
|
240
|
+
appCircuitName: fnName,
|
|
241
|
+
duration: timer.ms()
|
|
242
|
+
});
|
|
243
|
+
if (result.reverted) {
|
|
244
|
+
this.metrics.recordFunctionSimulationFailure();
|
|
245
|
+
} else {
|
|
246
|
+
this.metrics.recordFunctionSimulation(timer.ms(), allocatedGas.sub(result.gasLeft).l2Gas, fnName);
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Insert the non-revertible accumulated data from private into the public state.
|
|
252
|
+
*/ async insertNonRevertiblesFromPrivate(context) {
|
|
253
|
+
const stateManager = context.state.getActiveStateManager();
|
|
254
|
+
try {
|
|
255
|
+
await stateManager.writeSiloedNullifiersFromPrivate(context.nonRevertibleAccumulatedDataFromPrivate.nullifiers);
|
|
256
|
+
} catch (e) {
|
|
257
|
+
if (e instanceof NullifierCollisionError) {
|
|
258
|
+
throw new NullifierCollisionError(`Nullifier collision encountered when inserting non-revertible nullifiers from private.\nDetails: ${e.message}\n.Stack:${e.stack}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
for (const noteHash of context.nonRevertibleAccumulatedDataFromPrivate.noteHashes){
|
|
262
|
+
if (!noteHash.isEmpty()) {
|
|
263
|
+
await stateManager.writeUniqueNoteHash(noteHash);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Insert the revertible accumulated data from private into the public state.
|
|
269
|
+
* Start by forking state so we can rollback to the end of setup if app logic or teardown reverts.
|
|
270
|
+
*/ async insertRevertiblesFromPrivate(context) {
|
|
271
|
+
// Fork the state manager so we can rollback to end of setup if app logic reverts.
|
|
272
|
+
await context.state.fork();
|
|
273
|
+
const stateManager = context.state.getActiveStateManager();
|
|
274
|
+
try {
|
|
275
|
+
await stateManager.writeSiloedNullifiersFromPrivate(context.revertibleAccumulatedDataFromPrivate.nullifiers);
|
|
276
|
+
} catch (e) {
|
|
277
|
+
if (e instanceof NullifierCollisionError) {
|
|
278
|
+
// FIXME(#12375): simulator should be able to recover from this and just revert to snapshot.
|
|
279
|
+
throw new NullifierCollisionError(`Nullifier collision encountered when inserting revertible nullifiers from private. Details:\n${e.message}\n.Stack:${e.stack}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes){
|
|
283
|
+
if (!noteHash.isEmpty()) {
|
|
284
|
+
// Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can.
|
|
285
|
+
await stateManager.writeSiloedNoteHash(noteHash);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async payFee(context) {
|
|
290
|
+
const txFee = context.getTransactionFee(TxExecutionPhase.TEARDOWN);
|
|
291
|
+
if (context.feePayer.isZero()) {
|
|
292
|
+
this.log.debug(`No one is paying the fee of ${txFee.toBigInt()}`);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
|
|
296
|
+
const balanceSlot = await computeFeePayerBalanceStorageSlot(context.feePayer);
|
|
297
|
+
this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${context.feePayer}`);
|
|
298
|
+
const stateManager = context.state.getActiveStateManager();
|
|
299
|
+
let currentBalance = await stateManager.readStorage(feeJuiceAddress, balanceSlot);
|
|
300
|
+
// We allow to fake the balance of the fee payer to allow fee estimation
|
|
301
|
+
// When mocking the balance of the fee payer, the circuit should not be able to prove the simulation
|
|
302
|
+
if (currentBalance.lt(txFee)) {
|
|
303
|
+
if (!this.skipFeeEnforcement) {
|
|
304
|
+
throw new Error(`Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`);
|
|
305
|
+
} else {
|
|
306
|
+
currentBalance = txFee;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const updatedBalance = currentBalance.sub(txFee);
|
|
310
|
+
await stateManager.writeStorage(feeJuiceAddress, balanceSlot, updatedBalance, true);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
_ts_decorate([
|
|
314
|
+
trackSpan('PublicTxSimulator.simulateEnqueuedCall', (phase, context, _callRequest, executionRequest)=>({
|
|
315
|
+
[Attributes.TX_HASH]: context.txHash.toString(),
|
|
316
|
+
[Attributes.TARGET_ADDRESS]: executionRequest.callContext.contractAddress.toString(),
|
|
317
|
+
[Attributes.SENDER_ADDRESS]: executionRequest.callContext.msgSender.toString(),
|
|
318
|
+
[Attributes.SIMULATOR_PHASE]: TxExecutionPhase[phase].toString()
|
|
319
|
+
}))
|
|
320
|
+
], PublicTxSimulator.prototype, "simulateEnqueuedCall", null);
|
|
321
|
+
_ts_decorate([
|
|
322
|
+
trackSpan('PublicTxSimulator.simulateEnqueuedCallInternal', (_stateManager, _executionRequest, _allocatedGas, _transactionFee, fnName)=>({
|
|
323
|
+
[Attributes.APP_CIRCUIT_NAME]: fnName
|
|
324
|
+
}))
|
|
325
|
+
], PublicTxSimulator.prototype, "simulateEnqueuedCallInternal", null);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export class SideEffectLimitReachedError extends Error {
|
|
2
|
-
constructor(sideEffectType, limit)
|
|
2
|
+
constructor(sideEffectType, limit){
|
|
3
3
|
super(`Reached the limit (${limit}) on number of '${sideEffectType}' per tx`);
|
|
4
4
|
this.name = 'SideEffectLimitReachedError';
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZV9lZmZlY3RfZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy9zaWRlX2VmZmVjdF9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLDJCQUE0QixTQUFRLEtBQUs7SUFDcEQsWUFBWSxjQUFzQixFQUFFLEtBQWE7UUFDL0MsS0FBSyxDQUFDLHNCQUFzQixLQUFLLG1CQUFtQixjQUFjLFVBQVUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxJQUFJLEdBQUcsNkJBQTZCLENBQUM7SUFDNUMsQ0FBQztDQUNGIn0=
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import { AvmCircuitPublicInputs, AvmExecutionHints, type AztecAddress, type ContractClassIdPreimage, type Gas, type GasSettings, type GlobalVariables, NoteHash, Nullifier, NullifierLeafPreimage, PublicCallRequest, PublicDataTreeLeafPreimage, PublicDataUpdateRequest, PublicLog, ScopedL2ToL1Message, SerializableContractInstance, type TreeSnapshots } from '@aztec/circuits.js';
|
|
4
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
-
import {
|
|
2
|
+
import { AvmCircuitPublicInputs, AvmExecutionHints, AvmPublicDataReadTreeHint, PublicDataUpdateRequest } from '@aztec/stdlib/avm';
|
|
3
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
+
import { type ContractClassWithCommitment, SerializableContractInstance } from '@aztec/stdlib/contract';
|
|
5
|
+
import type { Gas, GasSettings } from '@aztec/stdlib/gas';
|
|
6
|
+
import { NoteHash, Nullifier, PublicCallRequest } from '@aztec/stdlib/kernel';
|
|
7
|
+
import { PublicLog } from '@aztec/stdlib/logs';
|
|
8
|
+
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
9
|
+
import { NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
|
|
10
|
+
import type { GlobalVariables, TreeSnapshots } from '@aztec/stdlib/tx';
|
|
11
|
+
import type { PublicSideEffectTraceInterface } from './side_effect_trace_interface.js';
|
|
6
12
|
import { UniqueClassIds } from './unique_class_ids.js';
|
|
7
13
|
/**
|
|
8
14
|
* A struct containing just the side effects as regular arrays
|
|
@@ -37,8 +43,8 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
37
43
|
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
38
44
|
*/
|
|
39
45
|
private readonly previousSideEffectArrayLengths;
|
|
40
|
-
/** We need to track the set of class IDs used
|
|
41
|
-
private
|
|
46
|
+
/** We need to track the set of class IDs used, to enforce limits. */
|
|
47
|
+
private uniqueClassIds;
|
|
42
48
|
log: import("@aztec/foundation/log").Logger;
|
|
43
49
|
/** The side effect counter increments with every call to the trace. */
|
|
44
50
|
private sideEffectCounter;
|
|
@@ -60,8 +66,8 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
60
66
|
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
61
67
|
*/
|
|
62
68
|
previousSideEffectArrayLengths?: SideEffectArrayLengths,
|
|
63
|
-
/** We need to track the set of class IDs used
|
|
64
|
-
|
|
69
|
+
/** We need to track the set of class IDs used, to enforce limits. */
|
|
70
|
+
uniqueClassIds?: UniqueClassIds);
|
|
65
71
|
fork(): SideEffectTrace;
|
|
66
72
|
merge(forkedTrace: this, reverted?: boolean): void;
|
|
67
73
|
private mergeHints;
|
|
@@ -77,8 +83,8 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
77
83
|
traceL1ToL2MessageCheck(_contractAddress: AztecAddress, msgHash: Fr, msgLeafIndex: Fr, _exists: boolean, path?: Fr[]): void;
|
|
78
84
|
traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
|
|
79
85
|
tracePublicLog(contractAddress: AztecAddress, log: Fr[]): void;
|
|
80
|
-
traceGetContractInstance(contractAddress: AztecAddress, exists: boolean, instance?: SerializableContractInstance,
|
|
81
|
-
|
|
86
|
+
traceGetContractInstance(contractAddress: AztecAddress, exists: boolean, instance?: SerializableContractInstance, updateMembershipHint?: AvmPublicDataReadTreeHint, updatePreimage?: Fr[]): void;
|
|
87
|
+
traceGetContractClass(contractClassId: Fr, exists: boolean, contractClass?: ContractClassWithCommitment): void;
|
|
82
88
|
/**
|
|
83
89
|
* Trace an enqueued call.
|
|
84
90
|
* Accept some results from a finished call's trace into this one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"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"}
|