@aztec/simulator 0.0.1-commit.03f7ef2 → 0.0.1-commit.04852196a

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 (243) 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 +22 -19
  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 +12 -12
  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 +7 -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 +1 -17
  113. package/dest/public/fixtures/custom_bytecode_tests.d.ts +11 -11
  114. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  115. package/dest/public/fixtures/custom_bytecode_tests.js +18 -18
  116. package/dest/public/fixtures/minimal_public_tx.js +2 -2
  117. package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
  118. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  119. package/dest/public/fixtures/opcode_spammer.js +99 -127
  120. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +6 -5
  121. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  122. package/dest/public/fixtures/public_tx_simulation_tester.js +36 -9
  123. package/dest/public/fixtures/utils.d.ts +2 -2
  124. package/dest/public/fixtures/utils.d.ts.map +1 -1
  125. package/dest/public/fixtures/utils.js +6 -6
  126. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
  127. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  128. package/dest/public/fuzzing/avm_fuzzer_simulator.js +42 -10
  129. package/dest/public/fuzzing/avm_simulator_bin.js +29 -11
  130. package/dest/public/hinting_db_sources.d.ts +2 -2
  131. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  132. package/dest/public/hinting_db_sources.js +3 -1
  133. package/dest/public/public_db_sources.d.ts +4 -3
  134. package/dest/public/public_db_sources.d.ts.map +1 -1
  135. package/dest/public/public_db_sources.js +4 -4
  136. package/dest/public/public_processor/guarded_merkle_tree.d.ts +2 -2
  137. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  138. package/dest/public/public_processor/guarded_merkle_tree.js +3 -1
  139. package/dest/public/public_processor/public_processor.d.ts +8 -4
  140. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  141. package/dest/public/public_processor/public_processor.js +451 -55
  142. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  143. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  144. package/dest/public/public_processor/public_processor_metrics.js +28 -45
  145. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  146. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  147. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +2 -2
  148. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
  149. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  150. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +10 -10
  151. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  152. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  153. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +7 -7
  154. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  155. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  156. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
  157. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  158. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  159. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  160. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  161. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  162. package/dest/public/public_tx_simulator/factories.js +4 -4
  163. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  164. package/dest/public/public_tx_simulator/public_tx_context.d.ts +4 -3
  165. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  166. package/dest/public/public_tx_simulator/public_tx_context.js +8 -8
  167. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +6 -4
  168. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  169. package/dest/public/public_tx_simulator/public_tx_simulator.js +14 -9
  170. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  171. package/dest/public/side_effect_trace.d.ts +5 -4
  172. package/dest/public/side_effect_trace.d.ts.map +1 -1
  173. package/dest/public/side_effect_trace.js +3 -3
  174. package/dest/public/state_manager/state_manager.d.ts +10 -4
  175. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  176. package/dest/public/state_manager/state_manager.js +14 -7
  177. package/dest/public/test_executor_metrics.d.ts +8 -2
  178. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  179. package/dest/public/test_executor_metrics.js +24 -2
  180. package/package.json +17 -17
  181. package/src/private/acvm/acvm.ts +4 -3
  182. package/src/private/acvm_native.ts +11 -5
  183. package/src/private/acvm_wasm.ts +7 -3
  184. package/src/private/circuit_recording/circuit_recorder.ts +23 -20
  185. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  186. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  187. package/src/private/factory.ts +7 -4
  188. package/src/public/avm/avm_context.ts +2 -2
  189. package/src/public/avm/avm_contract_call_result.ts +8 -6
  190. package/src/public/avm/avm_execution_environment.ts +9 -4
  191. package/src/public/avm/avm_gas.ts +2 -2
  192. package/src/public/avm/avm_machine_state.ts +6 -5
  193. package/src/public/avm/avm_memory_types.ts +4 -0
  194. package/src/public/avm/avm_simulator.ts +8 -5
  195. package/src/public/avm/calldata.ts +100 -0
  196. package/src/public/avm/fixtures/account_proof.json +553 -0
  197. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  198. package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -2
  199. package/src/public/avm/fixtures/initializers.ts +2 -1
  200. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  201. package/src/public/avm/opcodes/arithmetic.ts +1 -1
  202. package/src/public/avm/opcodes/bitwise.ts +3 -3
  203. package/src/public/avm/opcodes/comparators.ts +1 -1
  204. package/src/public/avm/opcodes/contract.ts +4 -7
  205. package/src/public/avm/opcodes/control_flow.ts +2 -2
  206. package/src/public/avm/opcodes/conversion.ts +3 -3
  207. package/src/public/avm/opcodes/ec_add.ts +13 -4
  208. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  209. package/src/public/avm/opcodes/external_calls.ts +17 -15
  210. package/src/public/avm/opcodes/hashing.ts +6 -6
  211. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  212. package/src/public/avm/opcodes/memory.ts +19 -19
  213. package/src/public/avm/opcodes/misc.ts +2 -2
  214. package/src/public/avm/opcodes/storage.ts +30 -22
  215. package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
  216. package/src/public/avm/serialization/instruction_serialization.ts +1 -1
  217. package/src/public/debug_fn_name.ts +10 -8
  218. package/src/public/executor_metrics.ts +9 -33
  219. package/src/public/fixtures/amm_test.ts +2 -2
  220. package/src/public/fixtures/bulk_test.ts +2 -2
  221. package/src/public/fixtures/custom_bytecode_tests.ts +27 -18
  222. package/src/public/fixtures/minimal_public_tx.ts +2 -2
  223. package/src/public/fixtures/opcode_spammer.ts +196 -117
  224. package/src/public/fixtures/public_tx_simulation_tester.ts +51 -5
  225. package/src/public/fixtures/utils.ts +6 -5
  226. package/src/public/fuzzing/avm_fuzzer_simulator.ts +61 -13
  227. package/src/public/fuzzing/avm_simulator_bin.ts +43 -8
  228. package/src/public/hinting_db_sources.ts +1 -1
  229. package/src/public/public_db_sources.ts +15 -5
  230. package/src/public/public_processor/guarded_merkle_tree.ts +1 -1
  231. package/src/public/public_processor/public_processor.ts +76 -47
  232. package/src/public/public_processor/public_processor_metrics.ts +16 -44
  233. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +6 -3
  234. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +17 -7
  235. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +7 -5
  236. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
  237. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  238. package/src/public/public_tx_simulator/factories.ts +6 -3
  239. package/src/public/public_tx_simulator/public_tx_context.ts +13 -6
  240. package/src/public/public_tx_simulator/public_tx_simulator.ts +21 -10
  241. package/src/public/side_effect_trace.ts +5 -2
  242. package/src/public/state_manager/state_manager.ts +29 -20
  243. package/src/public/test_executor_metrics.ts +27 -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';
@@ -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
 
@@ -161,6 +172,8 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
161
172
  }
162
173
  const avmResult = await this.simulator.simulate(tx, fullTxLabel);
163
174
 
175
+ await this.#recordBytecodeSizes(fullTxLabel, [...setupCalls, ...appCalls, ...(teardownCall ? [teardownCall] : [])]);
176
+
164
177
  // Something like this is often useful for debugging:
165
178
  //if (avmResult.revertReason) {
166
179
  // // resolve / enrich revert reason
@@ -190,8 +203,18 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
190
203
  teardownCall?: TestEnqueuedCall,
191
204
  feePayer?: AztecAddress,
192
205
  privateInsertions?: TestPrivateInsertions,
206
+ gasLimits?: Gas,
193
207
  ): Promise<PublicTxResult> {
194
- return await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions, txLabel);
208
+ return await this.simulateTx(
209
+ sender,
210
+ setupCalls,
211
+ appCalls,
212
+ teardownCall,
213
+ feePayer,
214
+ privateInsertions,
215
+ txLabel,
216
+ gasLimits,
217
+ );
195
218
  }
196
219
 
197
220
  /**
@@ -209,6 +232,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
209
232
  teardownCall?: TestEnqueuedCall,
210
233
  feePayer?: AztecAddress,
211
234
  privateInsertions?: TestPrivateInsertions,
235
+ gasLimits?: Gas,
212
236
  ): Promise<PublicTxResult> {
213
237
  return await this.simulateTxWithLabel(
214
238
  txLabel,
@@ -218,6 +242,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
218
242
  teardownCall,
219
243
  feePayer,
220
244
  privateInsertions,
245
+ gasLimits,
221
246
  );
222
247
  }
223
248
 
@@ -277,6 +302,27 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
277
302
 
278
303
  return new PublicCallRequestWithCalldata(request, calldata);
279
304
  }
305
+
306
+ // WARNING: Deduplicates by artifact name, so two different artifacts with the same name
307
+ // in a single tx would only record the first one's bytecode size.
308
+ async #recordBytecodeSizes(txLabel: string, calls: TestEnqueuedCall[]) {
309
+ const seenArtifactNames = new Set<string>();
310
+ for (const call of calls) {
311
+ const artifact = await this.contractDataSource.getContractArtifact(call.address);
312
+ if (!artifact || seenArtifactNames.has(artifact.name)) {
313
+ continue;
314
+ }
315
+ seenArtifactNames.add(artifact.name);
316
+ const instance = await this.contractDataSource.getContract(call.address);
317
+ if (!instance) {
318
+ continue;
319
+ }
320
+ const contractClass = await this.contractDataSource.getContractClass(instance.currentContractClassId);
321
+ if (contractClass) {
322
+ this.metrics.recordBytecodeSize(txLabel, artifact.name, contractClass.packedBytecode.length);
323
+ }
324
+ }
325
+ }
280
326
  }
281
327
 
282
328
  export function defaultGlobals() {
@@ -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
 
@@ -134,13 +135,13 @@ export async function createTxForPublicCalls(
134
135
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
135
136
  const header = BlockHeader.empty({ globalVariables: globals });
136
137
  const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
137
- const includeByTimestamp = 0n; // Not used in the simulator.
138
+ const expirationTimestamp = 0n; // Not used in the simulator.
138
139
 
139
140
  const txData = new PrivateKernelTailCircuitPublicInputs(
140
141
  constantData,
141
142
  /*gasUsed=*/ gasUsedByPrivate,
142
143
  feePayer,
143
- includeByTimestamp,
144
+ expirationTimestamp,
144
145
  forPublic,
145
146
  );
146
147
 
@@ -171,13 +172,13 @@ export async function createTxForPrivateOnly(
171
172
  const gasSettings = new GasSettings(gasLimits, Gas.empty(), maxFeesPerGas, GasFees.empty());
172
173
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
173
174
  const constantData = new TxConstantData(BlockHeader.empty(), txContext, Fr.zero(), Fr.zero());
174
- const includeByTimestamp = 0n; // Not used in the simulator.
175
+ const expirationTimestamp = 0n; // Not used in the simulator.
175
176
 
176
177
  const txData = new PrivateKernelTailCircuitPublicInputs(
177
178
  constantData,
178
179
  /*gasUsed=*/ gasUsedByPrivate,
179
180
  feePayer,
180
- includeByTimestamp,
181
+ expirationTimestamp,
181
182
  /*forPublic=*/ undefined,
182
183
  forRollup,
183
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: false,
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,10 +222,11 @@ 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
  /**
@@ -230,11 +254,35 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
230
254
 
231
255
  /**
232
256
  * Add a contract instance from C++ raw msgpack data.
233
- * 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).
234
259
  */
235
260
  public async addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void> {
236
261
  const address = AztecAddress.fromPlainObject(rawAddress);
237
262
  const instance = contractInstanceWithAddressFromPlainObject(address, rawInstance);
238
- 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);
239
287
  }
240
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,17 +127,20 @@ 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) {
101
135
  // If we error, treat as reverted
102
136
  const errorResult = serializeWithMessagePack({
103
137
  reverted: true,
104
- output: [] as string[],
138
+ output: [] as Fr[],
105
139
  revertReason: `Unexpected Error ${error.message}`,
106
140
  endTreeSnapshots: TreeSnapshots.empty(),
141
+ publicTxEffect: PublicTxEffect.empty(),
107
142
  });
108
- writeSync(process.stdout.fd, errorResult.toString('base64') + '\n');
143
+ await writeOutput(errorResult.toString('base64') + '\n');
109
144
  }
110
145
  }
111
146
 
@@ -572,7 +572,7 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
572
572
  return await this.db.close();
573
573
  }
574
574
 
575
- async [Symbol.dispose](): Promise<void> {
575
+ async [Symbol.asyncDispose](): Promise<void> {
576
576
  await this.close();
577
577
  }
578
578
 
@@ -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();
@@ -82,7 +82,7 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
82
82
  return this.guardAndPush(() => this.target.close());
83
83
  }
84
84
 
85
- async [Symbol.dispose](): Promise<void> {
85
+ async [Symbol.asyncDispose](): Promise<void> {
86
86
  await this.close();
87
87
  }
88
88
  getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {