@aztec/simulator 3.0.3 → 3.9.9-nightly.20260312

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.
Files changed (256) hide show
  1. package/README.md +6 -4
  2. package/dest/common/errors.d.ts +7 -1
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.d.ts +4 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +4 -3
  7. package/dest/private/acvm_native.d.ts +5 -3
  8. package/dest/private/acvm_native.d.ts.map +1 -1
  9. package/dest/private/acvm_native.js +8 -6
  10. package/dest/private/acvm_wasm.d.ts +4 -3
  11. package/dest/private/acvm_wasm.d.ts.map +1 -1
  12. package/dest/private/acvm_wasm.js +4 -4
  13. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  14. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/circuit_recorder.js +20 -17
  16. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  17. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  19. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  20. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  21. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  22. package/dest/private/factory.d.ts +3 -3
  23. package/dest/private/factory.d.ts.map +1 -1
  24. package/dest/private/factory.js +7 -4
  25. package/dest/public/avm/avm_context.d.ts +3 -3
  26. package/dest/public/avm/avm_context.d.ts.map +1 -1
  27. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  28. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  29. package/dest/public/avm/avm_contract_call_result.js +3 -3
  30. package/dest/public/avm/avm_execution_environment.d.ts +6 -5
  31. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  32. package/dest/public/avm/avm_gas.js +3 -3
  33. package/dest/public/avm/avm_machine_state.d.ts +6 -5
  34. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  35. package/dest/public/avm/avm_machine_state.js +3 -2
  36. package/dest/public/avm/avm_memory_types.d.ts +1 -1
  37. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  38. package/dest/public/avm/avm_memory_types.js +3 -0
  39. package/dest/public/avm/avm_simulator.d.ts +3 -2
  40. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  41. package/dest/public/avm/avm_simulator.js +5 -4
  42. package/dest/public/avm/calldata.d.ts +51 -0
  43. package/dest/public/avm/calldata.d.ts.map +1 -0
  44. package/dest/public/avm/calldata.js +63 -0
  45. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  46. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  47. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  48. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  49. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  50. package/dest/public/avm/fixtures/avm_simulation_tester.js +3 -2
  51. package/dest/public/avm/fixtures/initializers.d.ts +1 -1
  52. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  53. package/dest/public/avm/fixtures/initializers.js +2 -1
  54. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  55. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  56. package/dest/public/avm/opcodes/accrued_substate.js +42 -43
  57. package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
  58. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  59. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  60. package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
  61. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/bitwise.js +5 -5
  63. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  64. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  65. package/dest/public/avm/opcodes/comparators.js +1 -1
  66. package/dest/public/avm/opcodes/contract.d.ts +3 -3
  67. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  68. package/dest/public/avm/opcodes/contract.js +8 -8
  69. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  70. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  71. package/dest/public/avm/opcodes/control_flow.js +4 -4
  72. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  73. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  74. package/dest/public/avm/opcodes/conversion.js +4 -4
  75. package/dest/public/avm/opcodes/ec_add.d.ts +4 -4
  76. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  77. package/dest/public/avm/opcodes/ec_add.js +15 -6
  78. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  79. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  80. package/dest/public/avm/opcodes/environment_getters.js +6 -6
  81. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  82. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  83. package/dest/public/avm/opcodes/external_calls.js +23 -22
  84. package/dest/public/avm/opcodes/hashing.d.ts +8 -8
  85. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  86. package/dest/public/avm/opcodes/hashing.js +18 -15
  87. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  88. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  89. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  90. package/dest/public/avm/opcodes/memory.d.ts +14 -14
  91. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  92. package/dest/public/avm/opcodes/memory.js +25 -25
  93. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  94. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  95. package/dest/public/avm/opcodes/misc.js +4 -4
  96. package/dest/public/avm/opcodes/storage.d.ts +16 -15
  97. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  98. package/dest/public/avm/opcodes/storage.js +34 -24
  99. package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
  100. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  101. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  102. package/dest/public/avm/serialization/instruction_serialization.js +1 -1
  103. package/dest/public/debug_fn_name.d.ts +4 -4
  104. package/dest/public/debug_fn_name.d.ts.map +1 -1
  105. package/dest/public/debug_fn_name.js +14 -5
  106. package/dest/public/executor_metrics.d.ts +1 -1
  107. package/dest/public/executor_metrics.d.ts.map +1 -1
  108. package/dest/public/executor_metrics.js +12 -33
  109. package/dest/public/fixtures/amm_test.js +2 -2
  110. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  111. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  112. package/dest/public/fixtures/bulk_test.js +4 -68
  113. package/dest/public/fixtures/custom_bytecode_tester.d.ts +28 -6
  114. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  115. package/dest/public/fixtures/custom_bytecode_tester.js +36 -12
  116. package/dest/public/fixtures/custom_bytecode_tests.d.ts +11 -9
  117. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  118. package/dest/public/fixtures/custom_bytecode_tests.js +66 -22
  119. package/dest/public/fixtures/index.d.ts +4 -2
  120. package/dest/public/fixtures/index.d.ts.map +1 -1
  121. package/dest/public/fixtures/index.js +3 -1
  122. package/dest/public/fixtures/minimal_public_tx.d.ts +2 -7
  123. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
  124. package/dest/public/fixtures/minimal_public_tx.js +4 -14
  125. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  126. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  127. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  128. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +20 -6
  129. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  130. package/dest/public/fixtures/public_tx_simulation_tester.js +43 -16
  131. package/dest/public/fixtures/utils.d.ts +2 -2
  132. package/dest/public/fixtures/utils.d.ts.map +1 -1
  133. package/dest/public/fixtures/utils.js +9 -8
  134. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
  135. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  136. package/dest/public/fuzzing/avm_fuzzer_simulator.js +46 -11
  137. package/dest/public/fuzzing/avm_simulator_bin.js +47 -13
  138. package/dest/public/hinting_db_sources.d.ts +2 -1
  139. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  140. package/dest/public/hinting_db_sources.js +5 -0
  141. package/dest/public/public_db_sources.d.ts +4 -3
  142. package/dest/public/public_db_sources.d.ts.map +1 -1
  143. package/dest/public/public_db_sources.js +4 -4
  144. package/dest/public/public_processor/guarded_merkle_tree.d.ts +2 -1
  145. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  146. package/dest/public/public_processor/guarded_merkle_tree.js +5 -0
  147. package/dest/public/public_processor/public_processor.d.ts +8 -4
  148. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  149. package/dest/public/public_processor/public_processor.js +468 -62
  150. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  151. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  152. package/dest/public/public_processor/public_processor_metrics.js +28 -45
  153. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  154. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  155. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +17 -13
  156. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +20 -5
  157. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  158. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +50 -12
  159. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  160. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  161. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +7 -7
  162. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  163. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  164. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +8 -7
  165. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  166. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  167. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  168. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  169. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  170. package/dest/public/public_tx_simulator/factories.js +4 -4
  171. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  172. package/dest/public/public_tx_simulator/public_tx_context.d.ts +4 -3
  173. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  174. package/dest/public/public_tx_simulator/public_tx_context.js +8 -8
  175. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +6 -4
  176. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  177. package/dest/public/public_tx_simulator/public_tx_simulator.js +14 -9
  178. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +24 -1
  179. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
  180. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  181. package/dest/public/side_effect_trace.d.ts +5 -4
  182. package/dest/public/side_effect_trace.d.ts.map +1 -1
  183. package/dest/public/side_effect_trace.js +3 -3
  184. package/dest/public/state_manager/state_manager.d.ts +10 -4
  185. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  186. package/dest/public/state_manager/state_manager.js +14 -7
  187. package/dest/public/test_executor_metrics.d.ts +3 -2
  188. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  189. package/dest/public/test_executor_metrics.js +2 -2
  190. package/package.json +17 -17
  191. package/src/private/acvm/acvm.ts +4 -3
  192. package/src/private/acvm_native.ts +11 -5
  193. package/src/private/acvm_wasm.ts +7 -3
  194. package/src/private/circuit_recording/circuit_recorder.ts +21 -18
  195. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  196. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  197. package/src/private/factory.ts +7 -4
  198. package/src/public/avm/avm_context.ts +2 -2
  199. package/src/public/avm/avm_contract_call_result.ts +8 -6
  200. package/src/public/avm/avm_execution_environment.ts +9 -4
  201. package/src/public/avm/avm_gas.ts +2 -2
  202. package/src/public/avm/avm_machine_state.ts +6 -5
  203. package/src/public/avm/avm_memory_types.ts +4 -0
  204. package/src/public/avm/avm_simulator.ts +8 -5
  205. package/src/public/avm/calldata.ts +100 -0
  206. package/src/public/avm/fixtures/account_proof.json +553 -0
  207. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  208. package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -2
  209. package/src/public/avm/fixtures/initializers.ts +2 -1
  210. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  211. package/src/public/avm/opcodes/arithmetic.ts +1 -1
  212. package/src/public/avm/opcodes/bitwise.ts +3 -3
  213. package/src/public/avm/opcodes/comparators.ts +1 -1
  214. package/src/public/avm/opcodes/contract.ts +4 -7
  215. package/src/public/avm/opcodes/control_flow.ts +2 -2
  216. package/src/public/avm/opcodes/conversion.ts +3 -3
  217. package/src/public/avm/opcodes/ec_add.ts +13 -4
  218. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  219. package/src/public/avm/opcodes/external_calls.ts +17 -15
  220. package/src/public/avm/opcodes/hashing.ts +13 -9
  221. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  222. package/src/public/avm/opcodes/memory.ts +19 -19
  223. package/src/public/avm/opcodes/misc.ts +2 -2
  224. package/src/public/avm/opcodes/storage.ts +30 -22
  225. package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
  226. package/src/public/avm/serialization/instruction_serialization.ts +1 -1
  227. package/src/public/debug_fn_name.ts +17 -8
  228. package/src/public/executor_metrics.ts +9 -33
  229. package/src/public/fixtures/amm_test.ts +2 -2
  230. package/src/public/fixtures/bulk_test.ts +8 -8
  231. package/src/public/fixtures/custom_bytecode_tester.ts +53 -19
  232. package/src/public/fixtures/custom_bytecode_tests.ts +91 -22
  233. package/src/public/fixtures/index.ts +7 -1
  234. package/src/public/fixtures/minimal_public_tx.ts +5 -14
  235. package/src/public/fixtures/opcode_spammer.ts +1717 -0
  236. package/src/public/fixtures/public_tx_simulation_tester.ts +66 -10
  237. package/src/public/fixtures/utils.ts +7 -7
  238. package/src/public/fuzzing/avm_fuzzer_simulator.ts +68 -13
  239. package/src/public/fuzzing/avm_simulator_bin.ts +64 -10
  240. package/src/public/hinting_db_sources.ts +4 -0
  241. package/src/public/public_db_sources.ts +15 -5
  242. package/src/public/public_processor/guarded_merkle_tree.ts +4 -0
  243. package/src/public/public_processor/public_processor.ts +95 -55
  244. package/src/public/public_processor/public_processor_metrics.ts +16 -44
  245. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +22 -14
  246. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +64 -9
  247. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +7 -5
  248. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +9 -6
  249. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  250. package/src/public/public_tx_simulator/factories.ts +6 -3
  251. package/src/public/public_tx_simulator/public_tx_context.ts +13 -6
  252. package/src/public/public_tx_simulator/public_tx_simulator.ts +21 -10
  253. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +23 -0
  254. package/src/public/side_effect_trace.ts +5 -2
  255. package/src/public/state_manager/state_manager.ts +29 -20
  256. package/src/public/test_executor_metrics.ts +3 -3
@@ -1,4 +1,9 @@
1
- import { DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT } from '@aztec/constants';
1
+ import {
2
+ DEFAULT_TEARDOWN_DA_GAS_LIMIT,
3
+ DEFAULT_TEARDOWN_L2_GAS_LIMIT,
4
+ PUBLIC_TX_L2_GAS_OVERHEAD,
5
+ TX_DA_GAS_OVERHEAD,
6
+ } from '@aztec/constants';
2
7
  import { asyncMap } from '@aztec/foundation/async-map';
3
8
  import { BlockNumber } from '@aztec/foundation/branded-types';
4
9
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -31,7 +36,7 @@ const DEFAULT_GAS_FEES = new GasFees(2, 3);
31
36
  export type TestEnqueuedCall = {
32
37
  sender?: AztecAddress;
33
38
  address: AztecAddress;
34
- fnName: string;
39
+ fnName?: string;
35
40
  args: any[];
36
41
  isStaticCall?: boolean;
37
42
  contractArtifact?: ContractArtifact;
@@ -112,6 +117,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
112
117
  feePayer: AztecAddress = sender,
113
118
  /* need some unique first nullifier for note-nonce computations */
114
119
  privateInsertions: TestPrivateInsertions = { nonRevertible: { nullifiers: [new Fr(420000 + this.txCount)] } },
120
+ gasLimits?: Gas,
115
121
  ): Promise<Tx> {
116
122
  const setupCallRequests = await asyncMap(setupCalls, call =>
117
123
  this.#createPubicCallRequestForCall(call, call.sender ?? sender),
@@ -131,9 +137,13 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
131
137
  teardownCallRequest,
132
138
  feePayer,
133
139
  /*gasUsedByPrivate*/ teardownCall
134
- ? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT)
135
- : Gas.empty(),
140
+ ? new Gas(
141
+ DEFAULT_TEARDOWN_DA_GAS_LIMIT + TX_DA_GAS_OVERHEAD,
142
+ DEFAULT_TEARDOWN_L2_GAS_LIMIT + PUBLIC_TX_L2_GAS_OVERHEAD,
143
+ )
144
+ : new Gas(TX_DA_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD),
136
145
  defaultGlobals(),
146
+ gasLimits,
137
147
  );
138
148
  }
139
149
 
@@ -146,8 +156,9 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
146
156
  /* need some unique first nullifier for note-nonce computations */
147
157
  privateInsertions?: TestPrivateInsertions,
148
158
  txLabel: string = 'unlabeledTx',
159
+ gasLimits?: Gas,
149
160
  ): Promise<PublicTxResult> {
150
- const tx = await this.createTx(sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions);
161
+ const tx = await this.createTx(sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions, gasLimits);
151
162
 
152
163
  await this.setFeePayerBalance(feePayer);
153
164
 
@@ -190,8 +201,18 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
190
201
  teardownCall?: TestEnqueuedCall,
191
202
  feePayer?: AztecAddress,
192
203
  privateInsertions?: TestPrivateInsertions,
204
+ gasLimits?: Gas,
193
205
  ): Promise<PublicTxResult> {
194
- return await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions, txLabel);
206
+ return await this.simulateTx(
207
+ sender,
208
+ setupCalls,
209
+ appCalls,
210
+ teardownCall,
211
+ feePayer,
212
+ privateInsertions,
213
+ txLabel,
214
+ gasLimits,
215
+ );
195
216
  }
196
217
 
197
218
  /**
@@ -209,6 +230,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
209
230
  teardownCall?: TestEnqueuedCall,
210
231
  feePayer?: AztecAddress,
211
232
  privateInsertions?: TestPrivateInsertions,
233
+ gasLimits?: Gas,
212
234
  ): Promise<PublicTxResult> {
213
235
  return await this.simulateTxWithLabel(
214
236
  txLabel,
@@ -218,6 +240,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
218
240
  teardownCall,
219
241
  feePayer,
220
242
  privateInsertions,
243
+ gasLimits,
221
244
  );
222
245
  }
223
246
 
@@ -225,6 +248,25 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
225
248
  this.metrics.prettyPrint();
226
249
  }
227
250
 
251
+ /**
252
+ * Cancel the current simulation if one is in progress.
253
+ * This signals the underlying simulator (e.g., C++) to stop at the next safe point.
254
+ * Safe to call even if no simulation is in progress.
255
+ *
256
+ * @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
257
+ */
258
+ public async cancel(waitTimeoutMs?: number): Promise<void> {
259
+ await this.simulator.cancel?.(waitTimeoutMs);
260
+ }
261
+
262
+ /**
263
+ * Get the underlying simulator for advanced test scenarios.
264
+ * Use this when you need direct control over simulation (e.g., for testing cancellation).
265
+ */
266
+ public getSimulator(): MeasuredPublicTxSimulatorInterface {
267
+ return this.simulator;
268
+ }
269
+
228
270
  async #createPubicCallRequestForCall(
229
271
  call: TestEnqueuedCall,
230
272
  sender: AztecAddress,
@@ -235,10 +277,24 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
235
277
  throw new Error(`Contract artifact not found for address: ${address}`);
236
278
  }
237
279
 
238
- const fnSelector = await getFunctionSelector(call.fnName, contractArtifact);
239
- const fnAbi = getContractFunctionAbi(call.fnName, contractArtifact)!;
240
- const encodedArgs = encodeArguments(fnAbi, call.args);
241
- const calldata = [fnSelector.toField(), ...encodedArgs];
280
+ let calldata: Fr[] = [];
281
+ if (!call.fnName) {
282
+ this.logger.debug(
283
+ `No function name specified for call to contract ${call.address.toString()}. Assuming this is a custom bytecode with no public_dispatch function.`,
284
+ );
285
+ this.logger.debug(`Not using ABI to encode arguments. Not prepending fn selector to calldata.`);
286
+ try {
287
+ calldata = call.args.map(arg => new Fr(arg));
288
+ } catch (error) {
289
+ this.logger.warn(`Tried assuming that all arguments are Field-like. Failed. Error: ${error}`);
290
+ throw error;
291
+ }
292
+ } else {
293
+ const fnSelector = await getFunctionSelector(call.fnName, contractArtifact);
294
+ const fnAbi = getContractFunctionAbi(call.fnName, contractArtifact)!;
295
+ const encodedArgs = encodeArguments(fnAbi, call.args);
296
+ calldata = [fnSelector.toField(), ...encodedArgs];
297
+ }
242
298
  const isStaticCall = call.isStaticCall ?? false;
243
299
  const request = await PublicCallRequest.fromCalldata(sender, address, isStaticCall, calldata);
244
300
 
@@ -62,13 +62,14 @@ export async function createTxForPublicCalls(
62
62
  feePayer = AztecAddress.zero(),
63
63
  gasUsedByPrivate: Gas = Gas.empty(),
64
64
  globals: GlobalVariables = GlobalVariables.empty(),
65
+ gasLimits?: Gas,
65
66
  ): Promise<Tx> {
66
67
  assert(
67
68
  setupCallRequests.length > 0 || appCallRequests.length > 0 || teardownCallRequest !== undefined,
68
69
  "Can't create public tx with no enqueued calls",
69
70
  );
70
71
  // use max limits
71
- const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
72
+ gasLimits = gasLimits ?? new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
72
73
 
73
74
  const forPublic = PartialPrivateTailPublicInputsForPublic.empty();
74
75
 
@@ -132,16 +133,15 @@ export async function createTxForPublicCalls(
132
133
  : Gas.empty();
133
134
  const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
134
135
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
135
- const header = BlockHeader.empty();
136
- header.globalVariables = globals;
136
+ const header = BlockHeader.empty({ globalVariables: globals });
137
137
  const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
138
- const includeByTimestamp = 0n; // Not used in the simulator.
138
+ const expirationTimestamp = 0n; // Not used in the simulator.
139
139
 
140
140
  const txData = new PrivateKernelTailCircuitPublicInputs(
141
141
  constantData,
142
142
  /*gasUsed=*/ gasUsedByPrivate,
143
143
  feePayer,
144
- includeByTimestamp,
144
+ expirationTimestamp,
145
145
  forPublic,
146
146
  );
147
147
 
@@ -172,13 +172,13 @@ export async function createTxForPrivateOnly(
172
172
  const gasSettings = new GasSettings(gasLimits, Gas.empty(), maxFeesPerGas, GasFees.empty());
173
173
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
174
174
  const constantData = new TxConstantData(BlockHeader.empty(), txContext, Fr.zero(), Fr.zero());
175
- const includeByTimestamp = 0n; // Not used in the simulator.
175
+ const expirationTimestamp = 0n; // Not used in the simulator.
176
176
 
177
177
  const txData = new PrivateKernelTailCircuitPublicInputs(
178
178
  constantData,
179
179
  /*gasUsed=*/ gasUsedByPrivate,
180
180
  feePayer,
181
- includeByTimestamp,
181
+ expirationTimestamp,
182
182
  /*forPublic=*/ undefined,
183
183
  forRollup,
184
184
  );
@@ -4,6 +4,7 @@ import {
4
4
  MAX_NOTE_HASHES_PER_TX,
5
5
  MAX_NULLIFIERS_PER_TX,
6
6
  MAX_PRIVATE_LOGS_PER_TX,
7
+ MAX_PROTOCOL_CONTRACTS,
7
8
  } from '@aztec/constants';
8
9
  import { padArrayEnd } from '@aztec/foundation/collection';
9
10
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -19,8 +20,17 @@ import {
19
20
  import { PrivateLog } from '@aztec/stdlib/logs';
20
21
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
21
22
  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';
23
+ import { MerkleTreeId, type MerkleTreeWriteOperations, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
24
+ import {
25
+ BlockHeader,
26
+ GlobalVariables,
27
+ HashedValues,
28
+ ProtocolContracts,
29
+ Tx,
30
+ TxConstantData,
31
+ TxContext,
32
+ TxHash,
33
+ } from '@aztec/stdlib/tx';
24
34
  import type { NativeWorldStateService } from '@aztec/world-state';
25
35
 
26
36
  import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
@@ -40,6 +50,9 @@ export class FuzzerSimulationRequest {
40
50
  public readonly globals: GlobalVariables,
41
51
  public readonly contractClasses: any[], // Raw, processed by addContractClassFromCpp
42
52
  public readonly contractInstances: [any, any][], // Raw pairs [address, instance]
53
+ public readonly publicDataWrites: any[], // Raw public data tree writes to apply before simulation
54
+ public readonly noteHashes: any[], // Raw note hashes to apply before simulation
55
+ public readonly protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
43
56
  ) {}
44
57
 
45
58
  static fromPlainObject(obj: any): FuzzerSimulationRequest {
@@ -53,6 +66,9 @@ export class FuzzerSimulationRequest {
53
66
  GlobalVariables.fromPlainObject(obj.globals),
54
67
  obj.contractClasses,
55
68
  obj.contractInstances,
69
+ obj.publicDataWrites ?? [],
70
+ obj.noteHashes ?? [],
71
+ ProtocolContracts.fromPlainObject(obj.protocolContracts),
56
72
  );
57
73
  }
58
74
  }
@@ -130,7 +146,7 @@ async function createTxFromHint(cppTx: AvmTxHint): Promise<Tx> {
130
146
  constants,
131
147
  cppTx.gasUsedByPrivate,
132
148
  cppTx.feePayer,
133
- 0n, // includeByTimestamp
149
+ 0n, // expirationTimestamp
134
150
  forPublic,
135
151
  undefined, // forRollup - not needed for public simulation
136
152
  );
@@ -181,16 +197,23 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
181
197
  merkleTrees: MerkleTreeWriteOperations,
182
198
  contractDataSource: SimpleContractDataSource,
183
199
  globals: GlobalVariables,
200
+ protocolContracts: ProtocolContracts,
184
201
  ) {
185
202
  super(contractDataSource, merkleTrees);
186
203
  const contractsDb = new PublicContractsDB(contractDataSource);
187
- this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
188
- skipFeeEnforcement: true,
189
- collectDebugLogs: false,
190
- collectHints: false,
191
- collectStatistics: false,
192
- collectCallMetadata: false,
193
- });
204
+ this.simulator = new PublicTxSimulator(
205
+ merkleTrees,
206
+ contractsDb,
207
+ globals,
208
+ {
209
+ skipFeeEnforcement: false,
210
+ collectDebugLogs: false,
211
+ collectHints: false,
212
+ collectStatistics: false,
213
+ collectCallMetadata: false,
214
+ },
215
+ protocolContracts,
216
+ );
194
217
  }
195
218
 
196
219
  /**
@@ -199,16 +222,24 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
199
222
  public static async create(
200
223
  worldStateService: NativeWorldStateService,
201
224
  globals: GlobalVariables,
225
+ protocolContracts: ProtocolContracts,
202
226
  ): Promise<AvmFuzzerSimulator> {
203
227
  const contractDataSource = new SimpleContractDataSource();
204
228
  const merkleTrees = await worldStateService.fork();
205
- return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals);
229
+ return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals, protocolContracts);
206
230
  }
207
231
 
208
232
  /**
209
233
  * Simulate a transaction from a C++ AvmTxHint.
210
234
  */
211
235
  public async simulate(txHint: AvmTxHint): Promise<PublicTxResult> {
236
+ // Compute fee from gas limits and max fees per gas (upper bound on fee)
237
+ const totalFee =
238
+ BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas +
239
+ BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
240
+
241
+ await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
242
+
212
243
  const tx = await createTxFromHint(txHint);
213
244
  return await this.simulator.simulate(tx);
214
245
  }
@@ -223,11 +254,35 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
223
254
 
224
255
  /**
225
256
  * Add a contract instance from C++ raw msgpack data.
226
- * This also inserts the contract address nullifier into the nullifier tree.
257
+ * This also inserts the contract address nullifier into the nullifier tree,
258
+ * unless the address is a protocol canonical address (1-11).
227
259
  */
228
260
  public async addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void> {
229
261
  const address = AztecAddress.fromPlainObject(rawAddress);
230
262
  const instance = contractInstanceWithAddressFromPlainObject(address, rawInstance);
231
- await this.addContractInstance(instance);
263
+ // Protocol canonical addresses (1-11) should not have nullifiers inserted
264
+ const isProtocolCanonicalAddress = address.toBigInt() <= MAX_PROTOCOL_CONTRACTS && address.toBigInt() >= 1n;
265
+ await this.addContractInstance(instance, /* skipNullifierInsertion */ isProtocolCanonicalAddress);
266
+ }
267
+
268
+ /**
269
+ * Apply public data tree writes from C++ raw msgpack data.
270
+ * This is used to pre-populate the public data tree before simulation (e.g., for bytecode upgrades).
271
+ */
272
+ public async applyPublicDataWrites(rawWrites: any[]): Promise<void> {
273
+ for (const rawWrite of rawWrites) {
274
+ const leaf = PublicDataTreeLeaf.fromPlainObject(rawWrite);
275
+ await this.merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [leaf.toBuffer()]);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Apply note hashes from C++ raw msgpack data.
281
+ * This is used to pre-populate the note hash tree before simulation.
282
+ */
283
+ public async applyNoteHashes(rawNoteHashes: any[]): Promise<void> {
284
+ const paddingLeaves = MAX_NOTE_HASHES_PER_TX - (rawNoteHashes.length % MAX_NOTE_HASHES_PER_TX);
285
+ const paddedNoteHashes = [...rawNoteHashes, ...Array(paddingLeaves).fill(Fr.ZERO)];
286
+ await this.merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, paddedNoteHashes);
232
287
  }
233
288
  }
@@ -3,17 +3,30 @@ import { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import {
4
4
  AvmCircuitPublicInputs,
5
5
  type AvmTxHint,
6
+ PublicTxEffect,
6
7
  deserializeFromMessagePack,
7
8
  serializeWithMessagePack,
8
9
  } from '@aztec/stdlib/avm';
9
- import { GlobalVariables, TreeSnapshots } from '@aztec/stdlib/tx';
10
+ import { GlobalVariables, ProtocolContracts, TreeSnapshots } from '@aztec/stdlib/tx';
10
11
  import { NativeWorldStateService } from '@aztec/world-state';
11
12
 
12
- import { writeSync } from 'fs';
13
13
  import { createInterface } from 'readline';
14
14
 
15
15
  import { AvmFuzzerSimulator, FuzzerSimulationRequest } from './avm_fuzzer_simulator.js';
16
16
 
17
+ /** Write data to stdout, letting Node handle buffering. */
18
+ function writeOutput(data: string): Promise<void> {
19
+ return new Promise<void>((resolve, reject) => {
20
+ process.stdout.write(data, err => {
21
+ if (err) {
22
+ reject(err);
23
+ } else {
24
+ resolve();
25
+ }
26
+ });
27
+ });
28
+ }
29
+
17
30
  // This cache holds opened world states to avoid reopening them for each invocation.
18
31
  // It's a map so that in the future we could support multiple world states (if we had multiple fuzzers).
19
32
  const worldStateCache = new Map<string, NativeWorldStateService>();
@@ -43,12 +56,23 @@ async function simulateWithFuzzer(
43
56
  globals: GlobalVariables,
44
57
  rawContractClasses: any[], // Replace these when we are moving contract classes to TS
45
58
  rawContractInstances: [any, any][], // Replace these when we are moving contract instances to TS
46
- ): Promise<{ reverted: boolean; output: Fr[]; revertReason?: string; publicInputs: AvmCircuitPublicInputs }> {
59
+ rawPublicDataWrites: any[], // Public data tree writes to apply before simulation
60
+ rawNoteHashes: any[], // Note hashes to apply before simulation
61
+ protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
62
+ ): Promise<{
63
+ reverted: boolean;
64
+ output: Fr[];
65
+ revertReason?: string;
66
+ publicInputs: AvmCircuitPublicInputs;
67
+ publicTxEffect: PublicTxEffect;
68
+ }> {
47
69
  const worldStateService = await openExistingWorldState(dataDir, mapSizeKb);
48
70
 
49
- const simulator = await AvmFuzzerSimulator.create(worldStateService, globals);
71
+ const simulator = await AvmFuzzerSimulator.create(worldStateService, globals, protocolContracts);
72
+
73
+ await simulator.applyNoteHashes(rawNoteHashes);
50
74
 
51
- // Register contract classes from C++
75
+ // Register contract classes from C++ (must happen before public data writes to match C++ order)
52
76
  for (const rawClass of rawContractClasses) {
53
77
  await simulator.addContractClassFromCpp(rawClass);
54
78
  }
@@ -58,6 +82,10 @@ async function simulateWithFuzzer(
58
82
  await simulator.addContractInstanceFromCpp(rawAddress, rawInstance);
59
83
  }
60
84
 
85
+ // Apply public data writes after contract registration (e.g., for bytecode upgrades)
86
+ // This must happen last to match C++ setup_fuzzer_state ordering
87
+ await simulator.applyPublicDataWrites(rawPublicDataWrites);
88
+
61
89
  const result = await simulator.simulate(txHint);
62
90
 
63
91
  const output = result
@@ -69,6 +97,7 @@ async function simulateWithFuzzer(
69
97
  output,
70
98
  revertReason: result.findRevertReason()?.message,
71
99
  publicInputs: result.publicInputs!,
100
+ publicTxEffect: result.publicTxEffect,
72
101
  };
73
102
  }
74
103
 
@@ -87,6 +116,9 @@ async function execute(base64Line: string): Promise<void> {
87
116
  request.globals,
88
117
  request.contractClasses,
89
118
  request.contractInstances,
119
+ request.publicDataWrites,
120
+ request.noteHashes,
121
+ request.protocolContracts,
90
122
  );
91
123
 
92
124
  // Serialize the result to msgpack and encode it in base64 for output
@@ -95,27 +127,49 @@ async function execute(base64Line: string): Promise<void> {
95
127
  output: result.output,
96
128
  revertReason: result.revertReason ?? '',
97
129
  endTreeSnapshots: result.publicInputs.endTreeSnapshots,
130
+ publicTxEffect: result.publicTxEffect,
98
131
  });
99
- writeSync(process.stdout.fd, resultBuffer.toString('base64') + '\n');
132
+ const base64Response = resultBuffer.toString('base64') + '\n';
133
+ await writeOutput(base64Response);
100
134
  } catch (error: any) {
135
+ // If we error, treat as reverted
101
136
  const errorResult = serializeWithMessagePack({
102
137
  reverted: true,
103
- output: [] as string[],
138
+ output: [] as Fr[],
104
139
  revertReason: `Unexpected Error ${error.message}`,
105
140
  endTreeSnapshots: TreeSnapshots.empty(),
141
+ publicTxEffect: PublicTxEffect.empty(),
106
142
  });
107
- writeSync(process.stdout.fd, errorResult.toString('base64') + '\n');
143
+ await writeOutput(errorResult.toString('base64') + '\n');
108
144
  }
109
145
  }
110
146
 
111
147
  function mainLoop() {
112
148
  const rl = createInterface({ input: process.stdin, terminal: false });
149
+
150
+ // Process lines sequentially to avoid race conditions in responses
151
+ const lineQueue: string[] = [];
152
+ let processing = false;
153
+
154
+ async function processQueue() {
155
+ if (processing || lineQueue.length === 0) {
156
+ return;
157
+ }
158
+ processing = true;
159
+ while (lineQueue.length > 0) {
160
+ const line = lineQueue.shift()!;
161
+ await execute(line);
162
+ }
163
+ processing = false;
164
+ }
165
+
113
166
  rl.on('line', (line: string) => {
114
167
  if (line.trim()) {
115
- void execute(line);
168
+ lineQueue.push(line);
169
+ void processQueue();
116
170
  }
117
171
  });
118
172
  rl.on('close', () => process.exit(0));
119
173
  }
120
174
 
121
- mainLoop();
175
+ void mainLoop();
@@ -572,6 +572,10 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
572
572
  return await this.db.close();
573
573
  }
574
574
 
575
+ async [Symbol.asyncDispose](): Promise<void> {
576
+ await this.close();
577
+ }
578
+
575
579
  public async findLeafIndices<ID extends MerkleTreeId>(
576
580
  treeId: ID,
577
581
  values: MerkleTreeLeafType<ID>[],
@@ -5,7 +5,7 @@ import {
5
5
  PUBLIC_DATA_SUBTREE_HEIGHT,
6
6
  } from '@aztec/constants';
7
7
  import { Fr } from '@aztec/foundation/curves/bn254';
8
- import { createLogger } from '@aztec/foundation/log';
8
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
9
9
  import { Timer } from '@aztec/foundation/timer';
10
10
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
11
11
  import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
@@ -46,9 +46,14 @@ import { L1ToL2MessageIndexOutOfRangeError, NoteHashIndexOutOfRangeError } from
46
46
  export class PublicContractsDB implements PublicContractsDBInterface {
47
47
  private contractStateStack: ContractsDbCheckpoint[] = [new ContractsDbCheckpoint()];
48
48
 
49
- private log = createLogger('simulator:contracts-data-source');
49
+ private log: Logger;
50
50
 
51
- constructor(private dataSource: ContractDataSource) {}
51
+ constructor(
52
+ private dataSource: ContractDataSource,
53
+ bindings?: LoggerBindings,
54
+ ) {
55
+ this.log = createLogger('simulator:contracts-data-source', bindings);
56
+ }
52
57
 
53
58
  public async addContracts(contractDeploymentData: ContractDeploymentData): Promise<void> {
54
59
  const currentState = this.getCurrentState();
@@ -208,9 +213,14 @@ export class PublicContractsDB implements PublicContractsDBInterface {
208
213
  * to decide whether to use hints or not (same with tracing, etc).
209
214
  */
210
215
  export class PublicTreesDB implements PublicStateDBInterface {
211
- private logger = createLogger('simulator:public-trees-db');
216
+ private logger: Logger;
212
217
 
213
- constructor(private readonly db: MerkleTreeWriteOperations) {}
218
+ constructor(
219
+ private readonly db: MerkleTreeWriteOperations,
220
+ bindings?: LoggerBindings,
221
+ ) {
222
+ this.logger = createLogger('simulator:public-trees-db', bindings);
223
+ }
214
224
 
215
225
  public async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
216
226
  const timer = new Timer();
@@ -81,6 +81,10 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
81
81
  close(): Promise<void> {
82
82
  return this.guardAndPush(() => this.target.close());
83
83
  }
84
+
85
+ async [Symbol.asyncDispose](): Promise<void> {
86
+ await this.close();
87
+ }
84
88
  getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {
85
89
  return this.guardAndPush(() => this.target.getTreeInfo(treeId));
86
90
  }