@aztec/simulator 0.0.1-commit.4d3c002 → 0.0.1-commit.4d9804df

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 (359) hide show
  1. package/dest/client.d.ts +1 -3
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +0 -2
  4. package/dest/private/acvm_wasm.d.ts +1 -1
  5. package/dest/private/acvm_wasm.d.ts.map +1 -1
  6. package/dest/private/acvm_wasm.js +3 -1
  7. package/dest/private/circuit_recording/circuit_recorder.d.ts +36 -23
  8. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  9. package/dest/private/circuit_recording/circuit_recorder.js +65 -69
  10. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +7 -19
  11. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  12. package/dest/private/circuit_recording/file_circuit_recorder.js +38 -42
  13. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
  14. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +11 -14
  16. package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
  17. package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
  18. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.d.ts +2 -1
  19. package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
  20. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.js +18 -3
  21. package/dest/public/avm/testing/utils.d.ts +32 -0
  22. package/dest/public/avm/testing/utils.d.ts.map +1 -0
  23. package/dest/public/avm/{fixtures → testing}/utils.js +4 -34
  24. package/dest/public/avm_simulator.d.ts +28 -0
  25. package/dest/public/avm_simulator.d.ts.map +1 -0
  26. package/dest/public/avm_simulator.js +4 -0
  27. package/dest/public/avm_simulator_pool.d.ts +45 -0
  28. package/dest/public/avm_simulator_pool.d.ts.map +1 -0
  29. package/dest/public/avm_simulator_pool.js +197 -0
  30. package/dest/public/cdb/generated/api_types.d.ts +171 -0
  31. package/dest/public/cdb/generated/api_types.d.ts.map +1 -0
  32. package/dest/public/cdb/generated/api_types.js +314 -0
  33. package/dest/public/cdb/generated/server.d.ts +26 -0
  34. package/dest/public/cdb/generated/server.d.ts.map +1 -0
  35. package/dest/public/cdb/generated/server.js +135 -0
  36. package/dest/public/cdb_ipc_server.d.ts +33 -0
  37. package/dest/public/cdb_ipc_server.d.ts.map +1 -0
  38. package/dest/public/cdb_ipc_server.js +153 -0
  39. package/dest/public/fixtures/amm_test.js +2 -2
  40. package/dest/public/fixtures/bulk_test.d.ts +1 -1
  41. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  42. package/dest/public/fixtures/bulk_test.js +33 -6
  43. package/dest/public/fixtures/custom_bytecode_tester.d.ts +1 -1
  44. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  45. package/dest/public/fixtures/custom_bytecode_tester.js +2 -2
  46. package/dest/public/fixtures/index.d.ts +2 -4
  47. package/dest/public/fixtures/index.d.ts.map +1 -1
  48. package/dest/public/fixtures/index.js +1 -3
  49. package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
  50. package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
  51. package/dest/public/fixtures/public_processor_test_env.js +73 -0
  52. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +11 -7
  53. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  54. package/dest/public/fixtures/public_tx_simulation_tester.js +33 -43
  55. package/dest/public/fixtures/simple_contract_data_source.js +1 -1
  56. package/dest/public/fixtures/token_test.js +3 -3
  57. package/dest/public/fixtures/utils.d.ts +1 -1
  58. package/dest/public/fixtures/utils.d.ts.map +1 -1
  59. package/dest/public/fixtures/utils.js +16 -15
  60. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +11 -4
  61. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  62. package/dest/public/fuzzing/avm_fuzzer_simulator.js +24 -10
  63. package/dest/public/fuzzing/avm_simulator_bin.js +4 -4
  64. package/dest/public/index.d.ts +5 -2
  65. package/dest/public/index.d.ts.map +1 -1
  66. package/dest/public/index.js +2 -1
  67. package/dest/public/public_db_sources.d.ts +5 -2
  68. package/dest/public/public_db_sources.d.ts.map +1 -1
  69. package/dest/public/public_db_sources.js +9 -3
  70. package/dest/public/public_processor/guarded_merkle_tree.d.ts +4 -3
  71. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  72. package/dest/public/public_processor/guarded_merkle_tree.js +3 -0
  73. package/dest/public/public_processor/public_processor.d.ts +11 -6
  74. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  75. package/dest/public/public_processor/public_processor.js +67 -38
  76. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -1
  77. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  78. package/dest/public/public_processor/public_processor_metrics.js +8 -0
  79. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
  80. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
  81. package/dest/public/public_tx_simulator/{dumping_cpp_public_tx_simulator.js → dumping_public_tx_simulator.js} +10 -23
  82. package/dest/public/public_tx_simulator/factories.d.ts +8 -8
  83. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  84. package/dest/public/public_tx_simulator/factories.js +8 -8
  85. package/dest/public/public_tx_simulator/index.d.ts +4 -6
  86. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  87. package/dest/public/public_tx_simulator/index.js +2 -4
  88. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +42 -71
  89. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  90. package/dest/public/public_tx_simulator/public_tx_simulator.js +98 -318
  91. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
  92. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
  93. package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
  94. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +5 -5
  95. package/dest/public/test_executor_metrics.d.ts +1 -6
  96. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  97. package/dest/public/test_executor_metrics.js +0 -22
  98. package/package.json +22 -18
  99. package/src/client.ts +0 -2
  100. package/src/private/acvm_wasm.ts +4 -1
  101. package/src/private/circuit_recording/circuit_recorder.ts +84 -78
  102. package/src/private/circuit_recording/file_circuit_recorder.ts +38 -48
  103. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +9 -15
  104. package/src/public/avm/{fixtures → testing}/base_avm_simulation_tester.ts +23 -3
  105. package/src/public/avm/{fixtures → testing}/utils.ts +4 -40
  106. package/src/public/avm_simulator.ts +29 -0
  107. package/src/public/avm_simulator_pool.ts +226 -0
  108. package/src/public/cdb/generated/api_types.ts +457 -0
  109. package/src/public/cdb/generated/server.ts +109 -0
  110. package/src/public/cdb_ipc_server.ts +197 -0
  111. package/src/public/fixtures/amm_test.ts +2 -2
  112. package/src/public/fixtures/bulk_test.ts +31 -6
  113. package/src/public/fixtures/custom_bytecode_tester.ts +2 -2
  114. package/src/public/fixtures/index.ts +1 -3
  115. package/src/public/fixtures/public_processor_test_env.ts +88 -0
  116. package/src/public/fixtures/public_tx_simulation_tester.ts +41 -60
  117. package/src/public/fixtures/simple_contract_data_source.ts +1 -1
  118. package/src/public/fixtures/token_test.ts +3 -3
  119. package/src/public/fixtures/utils.ts +18 -20
  120. package/src/public/fuzzing/avm_fuzzer_simulator.ts +25 -10
  121. package/src/public/fuzzing/avm_simulator_bin.ts +3 -5
  122. package/src/public/index.ts +7 -3
  123. package/src/public/public_db_sources.ts +12 -3
  124. package/src/public/public_processor/guarded_merkle_tree.ts +5 -2
  125. package/src/public/public_processor/public_processor.ts +89 -46
  126. package/src/public/public_processor/public_processor_metrics.ts +12 -0
  127. package/src/public/public_tx_simulator/{dumping_cpp_public_tx_simulator.ts → dumping_public_tx_simulator.ts} +15 -31
  128. package/src/public/public_tx_simulator/factories.ts +27 -10
  129. package/src/public/public_tx_simulator/index.ts +6 -5
  130. package/src/public/public_tx_simulator/public_tx_simulator.ts +139 -476
  131. package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
  132. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +5 -5
  133. package/src/public/test_executor_metrics.ts +0 -24
  134. package/dest/public/avm/avm_context.d.ts +0 -41
  135. package/dest/public/avm/avm_context.d.ts.map +0 -1
  136. package/dest/public/avm/avm_context.js +0 -44
  137. package/dest/public/avm/avm_contract_call_result.d.ts +0 -32
  138. package/dest/public/avm/avm_contract_call_result.d.ts.map +0 -1
  139. package/dest/public/avm/avm_contract_call_result.js +0 -54
  140. package/dest/public/avm/avm_execution_environment.d.ts +0 -24
  141. package/dest/public/avm/avm_execution_environment.d.ts.map +0 -1
  142. package/dest/public/avm/avm_execution_environment.js +0 -33
  143. package/dest/public/avm/avm_gas.d.ts +0 -44
  144. package/dest/public/avm/avm_gas.d.ts.map +0 -1
  145. package/dest/public/avm/avm_gas.js +0 -195
  146. package/dest/public/avm/avm_machine_state.d.ts +0 -98
  147. package/dest/public/avm/avm_machine_state.d.ts.map +0 -1
  148. package/dest/public/avm/avm_machine_state.js +0 -110
  149. package/dest/public/avm/avm_memory_types.d.ts +0 -275
  150. package/dest/public/avm/avm_memory_types.d.ts.map +0 -1
  151. package/dest/public/avm/avm_memory_types.js +0 -354
  152. package/dest/public/avm/avm_simulator.d.ts +0 -41
  153. package/dest/public/avm/avm_simulator.d.ts.map +0 -1
  154. package/dest/public/avm/avm_simulator.js +0 -192
  155. package/dest/public/avm/avm_simulator_interface.d.ts +0 -9
  156. package/dest/public/avm/avm_simulator_interface.d.ts.map +0 -1
  157. package/dest/public/avm/avm_simulator_interface.js +0 -3
  158. package/dest/public/avm/calldata.d.ts +0 -51
  159. package/dest/public/avm/calldata.d.ts.map +0 -1
  160. package/dest/public/avm/calldata.js +0 -64
  161. package/dest/public/avm/errors.d.ts +0 -104
  162. package/dest/public/avm/errors.d.ts.map +0 -1
  163. package/dest/public/avm/errors.js +0 -141
  164. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +0 -2
  165. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +0 -1
  166. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +0 -22
  167. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  168. package/dest/public/avm/fixtures/avm_simulation_tester.js +0 -84
  169. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  170. package/dest/public/avm/fixtures/initializers.d.ts +0 -42
  171. package/dest/public/avm/fixtures/initializers.d.ts.map +0 -1
  172. package/dest/public/avm/fixtures/initializers.js +0 -45
  173. package/dest/public/avm/fixtures/utils.d.ts +0 -39
  174. package/dest/public/avm/fixtures/utils.d.ts.map +0 -1
  175. package/dest/public/avm/index.d.ts +0 -2
  176. package/dest/public/avm/index.d.ts.map +0 -1
  177. package/dest/public/avm/index.js +0 -1
  178. package/dest/public/avm/opcodes/accrued_substate.d.ts +0 -74
  179. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +0 -1
  180. package/dest/public/avm/opcodes/accrued_substate.js +0 -254
  181. package/dest/public/avm/opcodes/addressing_mode.d.ts +0 -31
  182. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +0 -1
  183. package/dest/public/avm/opcodes/addressing_mode.js +0 -94
  184. package/dest/public/avm/opcodes/arithmetic.d.ts +0 -49
  185. package/dest/public/avm/opcodes/arithmetic.d.ts.map +0 -1
  186. package/dest/public/avm/opcodes/arithmetic.js +0 -97
  187. package/dest/public/avm/opcodes/bitwise.d.ts +0 -42
  188. package/dest/public/avm/opcodes/bitwise.d.ts.map +0 -1
  189. package/dest/public/avm/opcodes/bitwise.js +0 -99
  190. package/dest/public/avm/opcodes/comparators.d.ts +0 -25
  191. package/dest/public/avm/opcodes/comparators.d.ts.map +0 -1
  192. package/dest/public/avm/opcodes/comparators.js +0 -43
  193. package/dest/public/avm/opcodes/contract.d.ts +0 -20
  194. package/dest/public/avm/opcodes/contract.d.ts.map +0 -1
  195. package/dest/public/avm/opcodes/contract.js +0 -65
  196. package/dest/public/avm/opcodes/control_flow.d.ts +0 -41
  197. package/dest/public/avm/opcodes/control_flow.d.ts.map +0 -1
  198. package/dest/public/avm/opcodes/control_flow.js +0 -107
  199. package/dest/public/avm/opcodes/conversion.d.ts +0 -18
  200. package/dest/public/avm/opcodes/conversion.d.ts.map +0 -1
  201. package/dest/public/avm/opcodes/conversion.js +0 -333
  202. package/dest/public/avm/opcodes/ec_add.d.ts +0 -19
  203. package/dest/public/avm/opcodes/ec_add.d.ts.map +0 -1
  204. package/dest/public/avm/opcodes/ec_add.js +0 -93
  205. package/dest/public/avm/opcodes/environment_getters.d.ts +0 -28
  206. package/dest/public/avm/opcodes/environment_getters.d.ts.map +0 -1
  207. package/dest/public/avm/opcodes/environment_getters.js +0 -77
  208. package/dest/public/avm/opcodes/external_calls.d.ts +0 -59
  209. package/dest/public/avm/opcodes/external_calls.d.ts.map +0 -1
  210. package/dest/public/avm/opcodes/external_calls.js +0 -210
  211. package/dest/public/avm/opcodes/hashing.d.ts +0 -36
  212. package/dest/public/avm/opcodes/hashing.d.ts.map +0 -1
  213. package/dest/public/avm/opcodes/hashing.js +0 -119
  214. package/dest/public/avm/opcodes/index.d.ts +0 -16
  215. package/dest/public/avm/opcodes/index.d.ts.map +0 -1
  216. package/dest/public/avm/opcodes/index.js +0 -15
  217. package/dest/public/avm/opcodes/instruction.d.ts +0 -74
  218. package/dest/public/avm/opcodes/instruction.d.ts.map +0 -1
  219. package/dest/public/avm/opcodes/instruction.js +0 -95
  220. package/dest/public/avm/opcodes/instruction_impl.d.ts +0 -19
  221. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +0 -1
  222. package/dest/public/avm/opcodes/instruction_impl.js +0 -30
  223. package/dest/public/avm/opcodes/memory.d.ts +0 -74
  224. package/dest/public/avm/opcodes/memory.d.ts.map +0 -1
  225. package/dest/public/avm/opcodes/memory.js +0 -257
  226. package/dest/public/avm/opcodes/misc.d.ts +0 -18
  227. package/dest/public/avm/opcodes/misc.d.ts.map +0 -1
  228. package/dest/public/avm/opcodes/misc.js +0 -73
  229. package/dest/public/avm/opcodes/storage.d.ts +0 -25
  230. package/dest/public/avm/opcodes/storage.d.ts.map +0 -1
  231. package/dest/public/avm/opcodes/storage.js +0 -78
  232. package/dest/public/avm/revert_reason.d.ts +0 -18
  233. package/dest/public/avm/revert_reason.d.ts.map +0 -1
  234. package/dest/public/avm/revert_reason.js +0 -39
  235. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -26
  236. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +0 -1
  237. package/dest/public/avm/serialization/buffer_cursor.js +0 -99
  238. package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -17
  239. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  240. package/dest/public/avm/serialization/bytecode_serialization.js +0 -336
  241. package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -114
  242. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +0 -1
  243. package/dest/public/avm/serialization/instruction_serialization.js +0 -261
  244. package/dest/public/avm/test_utils.d.ts +0 -15
  245. package/dest/public/avm/test_utils.d.ts.map +0 -1
  246. package/dest/public/avm/test_utils.js +0 -44
  247. package/dest/public/debug_fn_name.d.ts +0 -18
  248. package/dest/public/debug_fn_name.d.ts.map +0 -1
  249. package/dest/public/debug_fn_name.js +0 -37
  250. package/dest/public/fixtures/custom_bytecode_tests.d.ts +0 -12
  251. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +0 -1
  252. package/dest/public/fixtures/custom_bytecode_tests.js +0 -174
  253. package/dest/public/fixtures/minimal_public_tx.d.ts +0 -4
  254. package/dest/public/fixtures/minimal_public_tx.d.ts.map +0 -1
  255. package/dest/public/fixtures/minimal_public_tx.js +0 -19
  256. package/dest/public/fixtures/opcode_spammer.d.ts +0 -122
  257. package/dest/public/fixtures/opcode_spammer.d.ts.map +0 -1
  258. package/dest/public/fixtures/opcode_spammer.js +0 -1653
  259. package/dest/public/hinting_db_sources.d.ts +0 -80
  260. package/dest/public/hinting_db_sources.d.ts.map +0 -1
  261. package/dest/public/hinting_db_sources.js +0 -356
  262. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +0 -19
  263. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +0 -1
  264. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +0 -99
  265. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +0 -53
  266. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +0 -1
  267. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +0 -131
  268. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +0 -42
  269. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +0 -1
  270. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +0 -86
  271. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +0 -30
  272. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +0 -1
  273. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +0 -171
  274. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +0 -23
  275. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +0 -1
  276. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +0 -31
  277. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +0 -1
  278. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +0 -51
  279. package/dest/public/public_tx_simulator/public_tx_context.d.ts +0 -135
  280. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +0 -1
  281. package/dest/public/public_tx_simulator/public_tx_context.js +0 -298
  282. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +0 -21
  283. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +0 -1
  284. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +0 -415
  285. package/dest/public/side_effect_trace.d.ts +0 -87
  286. package/dest/public/side_effect_trace.d.ts.map +0 -1
  287. package/dest/public/side_effect_trace.js +0 -199
  288. package/dest/public/side_effect_trace_interface.d.ts +0 -22
  289. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  290. package/dest/public/side_effect_trace_interface.js +0 -1
  291. package/dest/public/state_manager/index.d.ts +0 -2
  292. package/dest/public/state_manager/index.d.ts.map +0 -1
  293. package/dest/public/state_manager/index.js +0 -1
  294. package/dest/public/state_manager/nullifiers.d.ts +0 -61
  295. package/dest/public/state_manager/nullifiers.d.ts.map +0 -1
  296. package/dest/public/state_manager/nullifiers.js +0 -92
  297. package/dest/public/state_manager/public_storage.d.ts +0 -66
  298. package/dest/public/state_manager/public_storage.d.ts.map +0 -1
  299. package/dest/public/state_manager/public_storage.js +0 -145
  300. package/dest/public/state_manager/state_manager.d.ts +0 -170
  301. package/dest/public/state_manager/state_manager.d.ts.map +0 -1
  302. package/dest/public/state_manager/state_manager.js +0 -402
  303. package/src/public/avm/avm_context.ts +0 -61
  304. package/src/public/avm/avm_contract_call_result.ts +0 -69
  305. package/src/public/avm/avm_execution_environment.ts +0 -51
  306. package/src/public/avm/avm_gas.ts +0 -183
  307. package/src/public/avm/avm_machine_state.ts +0 -170
  308. package/src/public/avm/avm_memory_types.ts +0 -440
  309. package/src/public/avm/avm_simulator.ts +0 -279
  310. package/src/public/avm/avm_simulator_interface.ts +0 -8
  311. package/src/public/avm/calldata.ts +0 -101
  312. package/src/public/avm/errors.ts +0 -177
  313. package/src/public/avm/fixtures/avm_simulation_tester.ts +0 -122
  314. package/src/public/avm/fixtures/initializers.ts +0 -103
  315. package/src/public/avm/index.ts +0 -1
  316. package/src/public/avm/opcodes/accrued_substate.ts +0 -285
  317. package/src/public/avm/opcodes/addressing_mode.ts +0 -111
  318. package/src/public/avm/opcodes/arithmetic.ts +0 -129
  319. package/src/public/avm/opcodes/bitwise.ts +0 -113
  320. package/src/public/avm/opcodes/comparators.ts +0 -55
  321. package/src/public/avm/opcodes/contract.ts +0 -72
  322. package/src/public/avm/opcodes/control_flow.ts +0 -123
  323. package/src/public/avm/opcodes/conversion.ts +0 -104
  324. package/src/public/avm/opcodes/ec_add.ts +0 -105
  325. package/src/public/avm/opcodes/environment_getters.ts +0 -87
  326. package/src/public/avm/opcodes/external_calls.ts +0 -262
  327. package/src/public/avm/opcodes/hashing.ts +0 -151
  328. package/src/public/avm/opcodes/index.ts +0 -15
  329. package/src/public/avm/opcodes/instruction.ts +0 -136
  330. package/src/public/avm/opcodes/instruction_impl.ts +0 -36
  331. package/src/public/avm/opcodes/memory.ts +0 -293
  332. package/src/public/avm/opcodes/misc.ts +0 -102
  333. package/src/public/avm/opcodes/storage.ts +0 -95
  334. package/src/public/avm/revert_reason.ts +0 -58
  335. package/src/public/avm/serialization/buffer_cursor.ts +0 -118
  336. package/src/public/avm/serialization/bytecode_serialization.ts +0 -215
  337. package/src/public/avm/serialization/instruction_serialization.ts +0 -249
  338. package/src/public/avm/test_utils.ts +0 -64
  339. package/src/public/debug_fn_name.ts +0 -52
  340. package/src/public/fixtures/custom_bytecode_tests.ts +0 -228
  341. package/src/public/fixtures/minimal_public_tx.ts +0 -26
  342. package/src/public/fixtures/opcode_spammer.ts +0 -1717
  343. package/src/public/hinting_db_sources.ts +0 -609
  344. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +0 -125
  345. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +0 -210
  346. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +0 -134
  347. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +0 -239
  348. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +0 -105
  349. package/src/public/public_tx_simulator/public_tx_context.ts +0 -482
  350. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +0 -63
  351. package/src/public/side_effect_trace.ts +0 -293
  352. package/src/public/side_effect_trace_interface.ts +0 -28
  353. package/src/public/state_manager/index.ts +0 -1
  354. package/src/public/state_manager/nullifiers.ts +0 -103
  355. package/src/public/state_manager/public_storage.ts +0 -174
  356. package/src/public/state_manager/state_manager.ts +0 -569
  357. /package/dest/public/avm/{fixtures → testing}/account_proof_fetcher.js +0 -0
  358. /package/src/public/avm/{fixtures → testing}/account_proof.json +0 -0
  359. /package/src/public/avm/{fixtures → testing}/account_proof_fetcher.ts +0 -0
@@ -3,11 +3,13 @@ import type { Logger } from '@aztec/foundation/log';
3
3
  import fs from 'fs/promises';
4
4
  import path from 'path';
5
5
 
6
- import type { ACVMWitness } from '../acvm/acvm_types.js';
7
6
  import { CircuitRecorder, type CircuitRecording } from './circuit_recorder.js';
8
7
 
8
+ /** Per-recording file state, keyed by recording so concurrent/nested executions don't share it. */
9
+ type RecordingFileState = { filePath: string; isFirstCall: boolean };
10
+
9
11
  export class FileCircuitRecorder extends CircuitRecorder {
10
- declare recording?: CircuitRecording & { filePath: string; isFirstCall: boolean };
12
+ readonly #fileState = new WeakMap<CircuitRecording, RecordingFileState>();
11
13
 
12
14
  constructor(
13
15
  private readonly recordDir: string,
@@ -16,16 +18,9 @@ export class FileCircuitRecorder extends CircuitRecorder {
16
18
  super(logger);
17
19
  }
18
20
 
19
- override async start(
20
- input: ACVMWitness,
21
- circuitBytecode: Buffer,
22
- circuitName: string,
23
- functionName: string = 'main',
24
- ) {
25
- await super.start(input, circuitBytecode, circuitName, functionName);
26
-
21
+ protected override async onStart(recording: CircuitRecording): Promise<void> {
27
22
  const recordingStringWithoutClosingBracket = JSON.stringify(
28
- { ...this.recording, isFirstCall: undefined, parent: undefined, oracleCalls: undefined, filePath: undefined },
23
+ { ...recording, parent: undefined, oracleCalls: undefined },
29
24
  null,
30
25
  2,
31
26
  ).slice(0, -2);
@@ -45,13 +40,13 @@ export class FileCircuitRecorder extends CircuitRecorder {
45
40
  }
46
41
  }
47
42
 
48
- this.recording!.isFirstCall = true;
49
- this.recording!.filePath = await FileCircuitRecorder.#computeFilePathAndStoreInitialRecording(
43
+ const filePath = await FileCircuitRecorder.#computeFilePathAndStoreInitialRecording(
50
44
  this.recordDir,
51
- this.recording!.circuitName,
52
- this.recording!.functionName,
45
+ recording.circuitName,
46
+ recording.functionName,
53
47
  recordingStringWithoutClosingBracket,
54
48
  );
49
+ this.#fileState.set(recording, { filePath, isFirstCall: true });
55
50
  }
56
51
 
57
52
  /**
@@ -95,53 +90,48 @@ export class FileCircuitRecorder extends CircuitRecorder {
95
90
  * @param inputs - Input arguments
96
91
  * @param outputs - Output results
97
92
  */
98
- override async recordCall(name: string, inputs: unknown[], outputs: unknown, time: number, stackDepth: number) {
99
- const entry = await super.recordCall(name, inputs, outputs, time, stackDepth);
100
- try {
101
- const prefix = this.recording!.isFirstCall ? ' ' : ' ,';
102
- this.recording!.isFirstCall = false;
103
- await fs.appendFile(this.recording!.filePath, prefix + JSON.stringify(entry) + '\n');
104
- } catch (err) {
105
- this.logger.error('Failed to log circuit call', { error: err });
93
+ override async recordCall(name: string, inputs: unknown[], outputs: unknown, time: number) {
94
+ const entry = await super.recordCall(name, inputs, outputs, time);
95
+ const recording = this.currentRecording();
96
+ const state = recording && this.#fileState.get(recording);
97
+ if (state) {
98
+ try {
99
+ const prefix = state.isFirstCall ? ' ' : ' ,';
100
+ state.isFirstCall = false;
101
+ await fs.appendFile(state.filePath, prefix + JSON.stringify(entry) + '\n');
102
+ } catch (err) {
103
+ this.logger.error('Failed to log circuit call', { error: err });
104
+ }
106
105
  }
107
106
  return entry;
108
107
  }
109
108
 
110
- /**
111
- * Finalizes the recording file by adding closing brackets. Without calling this method, the recording file is
112
- * incomplete and it fails to parse.
113
- */
114
- override async finish(): Promise<CircuitRecording> {
115
- // Finish sets the recording to undefined if we are at the topmost circuit,
116
- // so we save the current file path before that
117
- const filePath = this.recording!.filePath;
118
- const result = await super.finish();
109
+ /** Closes the recording file with the trailing brackets so the JSON parses. */
110
+ protected override async onFinish(recording: CircuitRecording): Promise<void> {
111
+ const state = this.#fileState.get(recording);
112
+ if (!state) {
113
+ return;
114
+ }
119
115
  try {
120
- await fs.appendFile(filePath, ' ]\n}\n');
116
+ await fs.appendFile(state.filePath, ' ]\n}\n');
121
117
  } catch (err) {
122
118
  this.logger.error('Failed to finalize recording file', { error: err });
123
119
  }
124
- return result!;
125
120
  }
126
121
 
127
- /**
128
- * Finalizes the recording file by adding the error and closing brackets. Without calling this method or `finish`,
129
- * the recording file is incomplete and it fails to parse.
130
- * @param error - The error that occurred during circuit execution
131
- */
132
- override async finishWithError(error: unknown): Promise<CircuitRecording> {
133
- // Finish sets the recording to undefined if we are at the topmost circuit,
134
- // so we save the current file path before that
135
- const filePath = this.recording!.filePath;
136
- const result = await super.finishWithError(error);
122
+ /** Closes the recording file with the execution error and trailing brackets so the JSON parses. */
123
+ protected override async onError(recording: CircuitRecording, error: unknown): Promise<void> {
124
+ const state = this.#fileState.get(recording);
125
+ if (!state) {
126
+ return;
127
+ }
137
128
  try {
138
- await fs.appendFile(filePath, ' ],\n');
139
- await fs.appendFile(filePath, ` "error": ${JSON.stringify(error)}\n`);
140
- await fs.appendFile(filePath, '}\n');
129
+ await fs.appendFile(state.filePath, ' ],\n');
130
+ await fs.appendFile(state.filePath, ` "error": ${JSON.stringify(error)}\n`);
131
+ await fs.appendFile(state.filePath, '}\n');
141
132
  } catch (err) {
142
133
  this.logger.error('Failed to finalize recording file with error', { error: err });
143
134
  }
144
- return result!;
145
135
  }
146
136
  }
147
137
 
@@ -58,24 +58,18 @@ export class SimulatorRecorderWrapper implements CircuitSimulator {
58
58
  functionName: string,
59
59
  callback: C,
60
60
  ): Promise<T> {
61
- // Start recording circuit execution
62
- await this.recorder.start(input, bytecode, contractName, functionName);
63
-
64
- // If callback was provided, we wrap it in a circuit recorder callback wrapper
61
+ // If a callback was provided, we wrap it so that its oracle calls are recorded. The wrapped callback reads the
62
+ // active recording lazily, so it picks up the recording opened by record() below.
65
63
  const wrappedCallback = this.recorder.wrapCallback(callback);
66
- let result: T;
67
- try {
68
- result = await simulateFn(wrappedCallback as C);
69
- } catch (error) {
70
- // If an error occurs, we finalize the recording file with the error
71
- await this.recorder.finishWithError(error);
72
- throw error;
73
- }
74
64
 
75
- // Witness generation is complete so we finish the circuit recorder
76
- const recording = await this.recorder.finish();
65
+ // record() opens a recording for this circuit, runs the simulation within it, and finalizes it. A simulation
66
+ // failure is re-thrown unchanged, so recorder bookkeeping never masks the underlying error.
67
+ const { result, recording } = await this.recorder.record(
68
+ { input, bytecode, circuitName: contractName, functionName },
69
+ () => simulateFn(wrappedCallback as C),
70
+ );
77
71
 
78
- (result as ACIRExecutionResult).oracles = recording.oracleCalls?.reduce(
72
+ (result as ACIRExecutionResult).oracles = recording.oracleCalls.reduce(
79
73
  (acc, { time, name }) => {
80
74
  if (!acc[name]) {
81
75
  acc[name] = { times: [] };
@@ -2,9 +2,10 @@ import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS } from '@aztec/constants';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
5
- import { getCanonicalAuthRegistry } from '@aztec/protocol-contracts/auth-registry';
5
+ import { getCanonicalClassRegistry } from '@aztec/protocol-contracts/class-registry';
6
6
  import { computeFeePayerBalanceStorageSlot, getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
7
7
  import { getCanonicalInstanceRegistry } from '@aztec/protocol-contracts/instance-registry';
8
+ import { getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
8
9
  import type { ContractArtifact } from '@aztec/stdlib/abi';
9
10
  import { PublicDataWrite } from '@aztec/stdlib/avm';
10
11
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
@@ -91,7 +92,7 @@ export abstract class BaseAvmSimulationTester {
91
92
  }
92
93
 
93
94
  async registerAuthContract(): Promise<ContractInstanceWithAddress> {
94
- const authRegistry = await getCanonicalAuthRegistry();
95
+ const authRegistry = await getStandardAuthRegistry();
95
96
  const authRegistryContractClassPublic = {
96
97
  ...authRegistry.contractClass,
97
98
  privateFunctions: [],
@@ -102,9 +103,28 @@ export abstract class BaseAvmSimulationTester {
102
103
  authRegistryContractClassPublic,
103
104
  authRegistry.instance,
104
105
  );
106
+ // AuthRegistry is a standard contract (not a protocol contract), so the AVM enforces a
107
+ // deployment-nullifier check on every instance retrieval. Insert the nullifier here so
108
+ // calls to AuthRegistry don't EXCEPTIONAL_HALT during simulation.
109
+ await this.insertContractAddressNullifier(authRegistry.instance.address);
105
110
  return authRegistry.instance;
106
111
  }
107
112
 
113
+ async registerClassRegistryContract(): Promise<ContractInstanceWithAddress> {
114
+ const classRegistry = await getCanonicalClassRegistry();
115
+ const classRegistryContractClassPublic = {
116
+ ...classRegistry.contractClass,
117
+ privateFunctions: [],
118
+ utilityFunctions: [],
119
+ };
120
+ await this.contractDataSource.addNewContract(
121
+ classRegistry.artifact,
122
+ classRegistryContractClassPublic,
123
+ classRegistry.instance,
124
+ );
125
+ return classRegistry.instance;
126
+ }
127
+
108
128
  async registerInstanceRegistryContract(): Promise<ContractInstanceWithAddress> {
109
129
  const instanceRegistry = await getCanonicalInstanceRegistry();
110
130
  const instanceRegistryContractClassPublic = {
@@ -129,7 +149,7 @@ export abstract class BaseAvmSimulationTester {
129
149
 
130
150
  private async insertContractAddressNullifier(contractAddress: AztecAddress) {
131
151
  const contractAddressNullifier = await siloNullifier(
132
- AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
152
+ AztecAddress.fromNumberUnsafe(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
133
153
  contractAddress.toField(),
134
154
  );
135
155
  await this.merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [contractAddressNullifier.toBuffer()]);
@@ -14,7 +14,6 @@ import {
14
14
  type ContractInstanceWithAddress,
15
15
  computeInitializationHash,
16
16
  } from '@aztec/stdlib/contract';
17
- import { isNoirCallStackUnresolved } from '@aztec/stdlib/errors';
18
17
  import { siloNullifier } from '@aztec/stdlib/hash';
19
18
  import { deriveKeys } from '@aztec/stdlib/keys';
20
19
  import { makeContractClassPublic, makeContractInstanceFromClassId } from '@aztec/stdlib/testing';
@@ -23,10 +22,6 @@ import type { UInt64 } from '@aztec/stdlib/types';
23
22
  import { strict as assert } from 'assert';
24
23
  import merge from 'lodash.merge';
25
24
 
26
- import { resolveAssertionMessageFromRevertData, traverseCauseChain } from '../../../common/index.js';
27
- import { Field, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
28
- import type { AvmRevertReason } from '../errors.js';
29
-
30
25
  export const PUBLIC_DISPATCH_FN_NAME = 'public_dispatch';
31
26
  export const DEFAULT_TIMESTAMP: UInt64 = 99833n;
32
27
  export const DEFAULT_BLOCK_NUMBER = BlockNumber(42);
@@ -38,22 +33,6 @@ export function allSameExcept(original: any, overrides: any): any {
38
33
  return merge({}, original, overrides);
39
34
  }
40
35
 
41
- export function randomMemoryBytes(length: number): Uint8[] {
42
- return [...Array(length)].map(_ => new Uint8(Math.floor(Math.random() * 255)));
43
- }
44
-
45
- export function randomMemoryUint32s(length: number): Uint32[] {
46
- return [...Array(length)].map(_ => new Uint32(Math.floor(Math.random() * 255)));
47
- }
48
-
49
- export function randomMemoryUint64s(length: number): Uint64[] {
50
- return [...Array(length)].map(_ => new Uint64(Math.floor(Math.random() * 255)));
51
- }
52
-
53
- export function randomMemoryFields(length: number): Field[] {
54
- return [...Array(length)].map(_ => new Field(Fr.random()));
55
- }
56
-
57
36
  export function getFunctionSelector(
58
37
  functionName: string,
59
38
  contractArtifact: ContractArtifact,
@@ -81,24 +60,6 @@ export function getContractFunctionAbi(
81
60
  );
82
61
  }
83
62
 
84
- export function resolveContractAssertionMessage(
85
- functionName: string,
86
- revertReason: AvmRevertReason,
87
- output: Fr[],
88
- contractArtifact: ContractArtifact,
89
- ): string | undefined {
90
- traverseCauseChain(revertReason, cause => {
91
- revertReason = cause as AvmRevertReason;
92
- });
93
-
94
- const functionArtifact = getAllFunctionAbis(contractArtifact).find(f => f.name === functionName);
95
- if (!functionArtifact || !revertReason.noirCallStack || !isNoirCallStackUnresolved(revertReason.noirCallStack)) {
96
- return undefined;
97
- }
98
-
99
- return resolveAssertionMessageFromRevertData(output, functionArtifact);
100
- }
101
-
102
63
  /**
103
64
  * Create a contract class and instance given constructor args, artifact, etc.
104
65
  * NOTE: This is useful for testing real-ish contract class registration and instance deployment TXs (via logs)
@@ -128,22 +89,25 @@ export async function createContractClassAndInstance(
128
89
  const constructorAbi = getContractFunctionAbi('constructor', contractArtifact);
129
90
  const { publicKeys } = await deriveKeys(new Fr(seed));
130
91
  const initializationHash = await computeInitializationHash(constructorAbi, constructorArgs);
92
+ const immutablesHash = new Fr(seed + 1);
131
93
  const contractInstance =
132
94
  originalContractClassId === undefined
133
95
  ? await makeContractInstanceFromClassId(contractClass.id, seed, {
134
96
  deployer,
135
97
  initializationHash,
98
+ immutablesHash,
136
99
  publicKeys,
137
100
  })
138
101
  : await makeContractInstanceFromClassId(originalContractClassId, seed, {
139
102
  deployer,
140
103
  initializationHash,
141
104
  currentClassId: contractClass.id,
105
+ immutablesHash,
142
106
  publicKeys,
143
107
  });
144
108
 
145
109
  const contractAddressNullifier = await siloNullifier(
146
- AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
110
+ AztecAddress.fromNumberUnsafe(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
147
111
  contractInstance.address.toField(),
148
112
  );
149
113
 
@@ -0,0 +1,29 @@
1
+ import type { PublicContractsDB } from './public_db_sources.js';
2
+
3
+ /**
4
+ * Identifies the contract data a single simulation reads. The AVM's contract-data lookups during a
5
+ * `simulate` call are answered from `contractsDB`; `forkId` and `timestamp` scope those lookups to the
6
+ * world-state fork being simulated against. How this reaches the AVM (in-process call, IPC callback
7
+ * server, ...) is the implementation's concern — callers only supply the context.
8
+ */
9
+ export interface AvmContractsDBContext {
10
+ contractsDB: PublicContractsDB;
11
+ forkId: number;
12
+ timestamp: bigint;
13
+ }
14
+
15
+ /**
16
+ * Something that can run AVM simulations, independent of how the work is dispatched (a single external
17
+ * process, a pool of them, or an in-process stub). Callers hold this and never see the underlying transport.
18
+ */
19
+ export interface AvmSimulator {
20
+ /**
21
+ * Run a fast simulation and return the msgpack-encoded result. `context` supplies the contracts DB whose
22
+ * data the simulation reads. If `signal` aborts, the simulation stops at the next cancellation checkpoint.
23
+ */
24
+ simulate(inputBuffer: Uint8Array, context: AvmContractsDBContext, signal?: AbortSignal): Promise<Uint8Array>;
25
+ /** Run a simulation collecting proving hints and return the msgpack-encoded result. */
26
+ simulateWithHints(inputBuffer: Uint8Array): Promise<Uint8Array>;
27
+ /** Release any resources held by the underlying implementation. */
28
+ destroy?(): Promise<void>;
29
+ }
@@ -0,0 +1,226 @@
1
+ import { AvmService } from '@aztec/bb-avm-sim';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
+
4
+ import type { AvmContractsDBContext, AvmSimulator } from './avm_simulator.js';
5
+ import { CdbIpcServer } from './cdb_ipc_server.js';
6
+
7
+ export interface AvmSimulatorPoolOptions {
8
+ /** Maximum number of concurrent AVM processes. If not set, defaults to AVM_MAX_CONCURRENT_SIMULATIONS env var or 4. */
9
+ maxSize?: number;
10
+ /** Path to the bb-avm-sim binary. If omitted, the generated package resolves it. */
11
+ avmBinaryPath?: string;
12
+ /** IPC path for the shared WSDB server. */
13
+ wsdbIpcPath: string;
14
+ /** Optional logger function for AVM process output. */
15
+ logger?: (msg: string) => void;
16
+ }
17
+
18
+ /**
19
+ * A raw handle to a single bb-avm-sim process: it runs a serialized simulation and connects back to the
20
+ * shared CDB/WSDB servers for state, but is unaware of which fork's contract data it is reading — that is
21
+ * routed by the fork id baked into the input buffer.
22
+ */
23
+ interface AvmProcessHandle {
24
+ simulate(inputBuffer: Uint8Array, signal?: AbortSignal): Promise<Uint8Array>;
25
+ simulateWithHints(inputBuffer: Uint8Array): Promise<Uint8Array>;
26
+ destroy(): Promise<void>;
27
+ }
28
+
29
+ /**
30
+ * The public-execution AVM backend: a lazily-grown pool of bb-avm-sim processes plus the CDB server that
31
+ * answers those processes' contract-data callbacks. Callers hold this as an {@link AvmSimulator}; the pool,
32
+ * the CDB server, its IPC path, and fork-id routing are all hidden behind that interface. Each `simulate`
33
+ * registers the call's contracts DB on the CDB server for the duration of the simulation (keyed by fork id
34
+ * so concurrent simulations on different forks don't collide) and unregisters it once the call returns.
35
+ */
36
+ export class AvmSimulatorPool implements AvmSimulator {
37
+ private slots: Array<AvmProcessHandle | null> = [];
38
+ private available: number[] = [];
39
+ private waiters: Array<{ resolve: (simulator: AvmProcessHandle) => void; reject: (error: Error) => void }> = [];
40
+ private createdCount = 0;
41
+ private log: Logger;
42
+ private maxSize: number;
43
+ private cdbServer: CdbIpcServer;
44
+
45
+ constructor(private options: AvmSimulatorPoolOptions) {
46
+ this.log = createLogger('simulator:avm-pool');
47
+ this.maxSize = options.maxSize ?? parseInt(process.env.AVM_MAX_CONCURRENT_SIMULATIONS ?? '4', 10);
48
+ this.cdbServer = new CdbIpcServer();
49
+ }
50
+
51
+ static async spawn(options: AvmSimulatorPoolOptions): Promise<AvmSimulatorPool> {
52
+ const pool = new AvmSimulatorPool(options);
53
+ // Always start one process up front so the first simulate() doesn't pay process spawn/connect cost.
54
+ await pool.prewarm();
55
+ return pool;
56
+ }
57
+
58
+ async [Symbol.asyncDispose](): Promise<void> {
59
+ await this.destroy();
60
+ }
61
+
62
+ async simulate(inputBuffer: Uint8Array, context: AvmContractsDBContext, signal?: AbortSignal): Promise<Uint8Array> {
63
+ // Register the fork's contracts DB so the C++ AVM's callbacks (which carry this fork id) route to it,
64
+ // and unregister once the simulation returns — registration is only needed while the call is running.
65
+ this.cdbServer.registerFork(context.forkId, context.contractsDB, context.timestamp);
66
+ try {
67
+ const simulator = await this.checkout();
68
+ try {
69
+ return await simulator.simulate(inputBuffer, signal);
70
+ } finally {
71
+ this.return(simulator);
72
+ }
73
+ } finally {
74
+ this.cdbServer.unregisterFork(context.forkId);
75
+ }
76
+ }
77
+
78
+ async simulateWithHints(inputBuffer: Uint8Array): Promise<Uint8Array> {
79
+ // The hinted path makes no contract-data callbacks, so no CDB registration is needed.
80
+ const simulator = await this.checkout();
81
+ try {
82
+ return await simulator.simulateWithHints(inputBuffer);
83
+ } finally {
84
+ this.return(simulator);
85
+ }
86
+ }
87
+
88
+ /** Destroy all AVM processes in the pool and close the CDB server. */
89
+ async destroy(): Promise<void> {
90
+ for (const waiter of this.waiters) {
91
+ waiter.reject(new Error('AVM simulator pool destroyed'));
92
+ }
93
+ this.waiters = [];
94
+
95
+ const destroyPromises: Promise<void>[] = [];
96
+ for (const slot of this.slots) {
97
+ if (slot) {
98
+ destroyPromises.push(slot.destroy());
99
+ }
100
+ }
101
+ await Promise.all(destroyPromises);
102
+
103
+ this.slots = [];
104
+ this.available = [];
105
+ this.createdCount = 0;
106
+ await this.cdbServer.close();
107
+ this.log.info('AVM simulator pool destroyed');
108
+ }
109
+
110
+ /**
111
+ * Eagerly spawn up to `count` AVM processes (capped at maxSize) and leave them available, so the
112
+ * first simulate() doesn't pay process spawn/connect cost. Idempotent.
113
+ */
114
+ async prewarm(count = 1): Promise<void> {
115
+ const target = Math.min(count, this.maxSize);
116
+ const created: AvmProcessHandle[] = [];
117
+ while (this.createdCount < target) {
118
+ created.push(await this.createSlot());
119
+ }
120
+ // Hand the freshly-spawned processes back to the pool so checkout() reuses them.
121
+ for (const simulator of created) {
122
+ this.return(simulator);
123
+ }
124
+ }
125
+
126
+ /** Check out an AVM process from the pool, blocking until one is free. Caller must return() it when done. */
127
+ private async checkout(): Promise<AvmProcessHandle> {
128
+ const idx = this.available.pop();
129
+ if (idx !== undefined && this.slots[idx]) {
130
+ return this.slots[idx]!;
131
+ }
132
+
133
+ if (this.createdCount < this.maxSize || (idx !== undefined && !this.slots[idx])) {
134
+ return await this.createSlot(idx);
135
+ }
136
+
137
+ return new Promise<AvmProcessHandle>((resolve, reject) => {
138
+ this.waiters.push({ resolve, reject });
139
+ });
140
+ }
141
+
142
+ /** Return an AVM process to the pool after use. */
143
+ private return(simulator: AvmProcessHandle): void {
144
+ const waiter = this.waiters.shift();
145
+ if (waiter) {
146
+ waiter.resolve(simulator);
147
+ } else {
148
+ const idx = this.slots.indexOf(simulator);
149
+ if (idx >= 0) {
150
+ this.available.push(idx);
151
+ }
152
+ }
153
+ }
154
+
155
+ private async createSlot(reuseIdx?: number): Promise<AvmProcessHandle> {
156
+ const reuse = reuseIdx !== undefined && reuseIdx < this.slots.length;
157
+ // Reserve the slot count synchronously, before the async spawn, so concurrent checkouts can't all
158
+ // observe `createdCount < maxSize` and overshoot the pool (the count is only bumped once control has
159
+ // yielded on the await). Roll back the reservation if the spawn itself fails.
160
+ if (!reuse) {
161
+ this.createdCount++;
162
+ }
163
+ let simulator: AvmProcessHandle;
164
+ try {
165
+ simulator = await AvmSimulatorProcess.spawn({
166
+ binaryPath: this.options.avmBinaryPath,
167
+ wsdbIpcPath: this.options.wsdbIpcPath,
168
+ cdbIpcPath: this.cdbServer.ipcPath,
169
+ logger: this.options.logger,
170
+ });
171
+ } catch (err) {
172
+ if (!reuse) {
173
+ this.createdCount--;
174
+ }
175
+ throw err;
176
+ }
177
+ if (reuse) {
178
+ this.slots[reuseIdx!] = simulator;
179
+ } else {
180
+ this.slots.push(simulator);
181
+ }
182
+ this.log.debug(`Created AVM pool slot (${this.createdCount}/${this.maxSize})`);
183
+ return simulator;
184
+ }
185
+ }
186
+
187
+ class AvmSimulatorProcess implements AvmProcessHandle {
188
+ private constructor(private service: AvmService) {}
189
+
190
+ static async spawn(options: {
191
+ binaryPath?: string;
192
+ wsdbIpcPath: string;
193
+ cdbIpcPath: string;
194
+ logger?: (msg: string) => void;
195
+ }): Promise<AvmSimulatorProcess> {
196
+ const service = await AvmService.spawn({
197
+ binaryPath: options.binaryPath,
198
+ transport: 'uds',
199
+ logger: options.logger,
200
+ extraArgs: ['--wsdb', options.wsdbIpcPath, '--cdb', options.cdbIpcPath],
201
+ });
202
+ return new AvmSimulatorProcess(service);
203
+ }
204
+
205
+ public async simulate(inputBuffer: Uint8Array, signal?: AbortSignal): Promise<Uint8Array> {
206
+ // Signal the C++ process to stop at its next cancellation checkpoint when the caller aborts.
207
+ const onAbort = () => this.service.sendProcessSignal('SIGUSR1');
208
+ if (signal?.aborted) {
209
+ onAbort();
210
+ }
211
+ signal?.addEventListener('abort', onAbort, { once: true });
212
+ try {
213
+ return (await this.service.simulate({ inputs: inputBuffer })).result;
214
+ } finally {
215
+ signal?.removeEventListener('abort', onAbort);
216
+ }
217
+ }
218
+
219
+ public async simulateWithHints(inputBuffer: Uint8Array): Promise<Uint8Array> {
220
+ return (await this.service.simulateWithHints({ inputs: inputBuffer })).result;
221
+ }
222
+
223
+ public async destroy(): Promise<void> {
224
+ await this.service.destroy();
225
+ }
226
+ }