@aztec/simulator 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa

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 (405) hide show
  1. package/README.md +6 -4
  2. package/dest/client.d.ts +1 -3
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +0 -2
  5. package/dest/common/errors.d.ts +2 -2
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/index.d.ts +1 -1
  8. package/dest/common/stats/index.d.ts +1 -1
  9. package/dest/common/stats/stats.d.ts +1 -1
  10. package/dest/private/acvm/acvm.d.ts +4 -2
  11. package/dest/private/acvm/acvm.d.ts.map +1 -1
  12. package/dest/private/acvm/acvm.js +4 -3
  13. package/dest/private/acvm/acvm_types.d.ts +1 -1
  14. package/dest/private/acvm/deserialize.d.ts +2 -2
  15. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  16. package/dest/private/acvm/deserialize.js +1 -1
  17. package/dest/private/acvm/index.d.ts +1 -1
  18. package/dest/private/acvm/serialize.d.ts +2 -2
  19. package/dest/private/acvm/serialize.d.ts.map +1 -1
  20. package/dest/private/acvm/serialize.js +1 -1
  21. package/dest/private/acvm_native.d.ts +5 -3
  22. package/dest/private/acvm_native.d.ts.map +1 -1
  23. package/dest/private/acvm_native.js +8 -6
  24. package/dest/private/acvm_wasm.d.ts +4 -3
  25. package/dest/private/acvm_wasm.d.ts.map +1 -1
  26. package/dest/private/acvm_wasm.js +7 -5
  27. package/dest/private/acvm_wasm_with_blobs.d.ts +1 -1
  28. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -1
  29. package/dest/private/circuit_recording/circuit_recorder.d.ts +39 -25
  30. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  31. package/dest/private/circuit_recording/circuit_recorder.js +71 -72
  32. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +9 -20
  33. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  34. package/dest/private/circuit_recording/file_circuit_recorder.js +39 -43
  35. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  36. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  37. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  38. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
  39. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
  40. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +11 -14
  41. package/dest/private/circuit_simulator.d.ts +1 -1
  42. package/dest/private/factory.d.ts +3 -3
  43. package/dest/private/factory.d.ts.map +1 -1
  44. package/dest/private/factory.js +7 -4
  45. package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
  46. package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
  47. package/dest/public/avm/testing/account_proof_fetcher.js +152 -0
  48. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.d.ts +3 -2
  49. package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
  50. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.js +19 -4
  51. package/dest/public/avm/{fixtures → testing}/utils.d.ts +4 -10
  52. package/dest/public/avm/testing/utils.d.ts.map +1 -0
  53. package/dest/public/avm/{fixtures → testing}/utils.js +7 -36
  54. package/dest/public/avm_simulator.d.ts +28 -0
  55. package/dest/public/avm_simulator.d.ts.map +1 -0
  56. package/dest/public/avm_simulator.js +4 -0
  57. package/dest/public/avm_simulator_pool.d.ts +45 -0
  58. package/dest/public/avm_simulator_pool.d.ts.map +1 -0
  59. package/dest/public/avm_simulator_pool.js +197 -0
  60. package/dest/public/cdb/generated/api_types.d.ts +171 -0
  61. package/dest/public/cdb/generated/api_types.d.ts.map +1 -0
  62. package/dest/public/cdb/generated/api_types.js +314 -0
  63. package/dest/public/cdb/generated/server.d.ts +26 -0
  64. package/dest/public/cdb/generated/server.d.ts.map +1 -0
  65. package/dest/public/cdb/generated/server.js +135 -0
  66. package/dest/public/cdb_ipc_server.d.ts +33 -0
  67. package/dest/public/cdb_ipc_server.d.ts.map +1 -0
  68. package/dest/public/cdb_ipc_server.js +153 -0
  69. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  70. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  71. package/dest/public/contracts_db_checkpoint.js +30 -0
  72. package/dest/public/db_interfaces.d.ts +14 -2
  73. package/dest/public/db_interfaces.d.ts.map +1 -1
  74. package/dest/public/executor_metrics.d.ts +3 -2
  75. package/dest/public/executor_metrics.d.ts.map +1 -1
  76. package/dest/public/executor_metrics.js +13 -34
  77. package/dest/public/executor_metrics_interface.d.ts +3 -2
  78. package/dest/public/executor_metrics_interface.d.ts.map +1 -1
  79. package/dest/public/fixtures/amm_test.d.ts +1 -1
  80. package/dest/public/fixtures/amm_test.js +6 -6
  81. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  82. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  83. package/dest/public/fixtures/bulk_test.js +38 -75
  84. package/dest/public/fixtures/custom_bytecode_tester.d.ts +29 -7
  85. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  86. package/dest/public/fixtures/custom_bytecode_tester.js +36 -12
  87. package/dest/public/fixtures/index.d.ts +3 -3
  88. package/dest/public/fixtures/index.d.ts.map +1 -1
  89. package/dest/public/fixtures/index.js +2 -2
  90. package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
  91. package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
  92. package/dest/public/fixtures/public_processor_test_env.js +73 -0
  93. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +32 -9
  94. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  95. package/dest/public/fixtures/public_tx_simulation_tester.js +84 -26
  96. package/dest/public/fixtures/simple_contract_data_source.d.ts +5 -4
  97. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
  98. package/dest/public/fixtures/simple_contract_data_source.js +5 -5
  99. package/dest/public/fixtures/token_test.d.ts +6 -2
  100. package/dest/public/fixtures/token_test.d.ts.map +1 -1
  101. package/dest/public/fixtures/token_test.js +16 -15
  102. package/dest/public/fixtures/utils.d.ts +3 -3
  103. package/dest/public/fixtures/utils.d.ts.map +1 -1
  104. package/dest/public/fixtures/utils.js +25 -23
  105. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +67 -0
  106. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  107. package/dest/public/fuzzing/avm_fuzzer_simulator.js +185 -0
  108. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  109. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  110. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  111. package/dest/public/index.d.ts +6 -2
  112. package/dest/public/index.d.ts.map +1 -1
  113. package/dest/public/index.js +2 -1
  114. package/dest/public/public_db_sources.d.ts +29 -66
  115. package/dest/public/public_db_sources.d.ts.map +1 -1
  116. package/dest/public/public_db_sources.js +83 -134
  117. package/dest/public/public_errors.d.ts +1 -1
  118. package/dest/public/public_errors.d.ts.map +1 -1
  119. package/dest/public/public_processor/guarded_merkle_tree.d.ts +8 -5
  120. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  121. package/dest/public/public_processor/guarded_merkle_tree.js +12 -4
  122. package/dest/public/public_processor/public_processor.d.ts +24 -22
  123. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  124. package/dest/public/public_processor/public_processor.js +559 -125
  125. package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
  126. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  127. package/dest/public/public_processor/public_processor_metrics.js +36 -45
  128. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
  129. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
  130. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.js +39 -0
  131. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  132. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  133. package/dest/public/public_tx_simulator/factories.js +28 -0
  134. package/dest/public/public_tx_simulator/index.d.ts +6 -4
  135. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  136. package/dest/public/public_tx_simulator/index.js +3 -2
  137. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +43 -90
  138. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  139. package/dest/public/public_tx_simulator/public_tx_simulator.js +99 -331
  140. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
  141. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
  142. package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
  143. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +25 -2
  144. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
  145. package/dest/public/side_effect_errors.d.ts +1 -1
  146. package/dest/public/side_effect_errors.d.ts.map +1 -1
  147. package/dest/public/test_executor_metrics.d.ts +6 -4
  148. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  149. package/dest/public/test_executor_metrics.js +7 -6
  150. package/dest/public/unique_class_ids.d.ts +1 -1
  151. package/dest/public/unique_class_ids.d.ts.map +1 -1
  152. package/dest/public/utils.d.ts +1 -1
  153. package/dest/server.d.ts +1 -1
  154. package/dest/testing.d.ts +1 -1
  155. package/package.json +26 -22
  156. package/src/client.ts +0 -2
  157. package/src/common/errors.ts +1 -1
  158. package/src/private/acvm/acvm.ts +4 -3
  159. package/src/private/acvm/deserialize.ts +1 -1
  160. package/src/private/acvm/serialize.ts +1 -1
  161. package/src/private/acvm_native.ts +11 -5
  162. package/src/private/acvm_wasm.ts +11 -4
  163. package/src/private/circuit_recording/circuit_recorder.ts +90 -81
  164. package/src/private/circuit_recording/file_circuit_recorder.ts +45 -50
  165. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  166. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +9 -15
  167. package/src/private/factory.ts +7 -4
  168. package/src/public/avm/testing/account_proof.json +553 -0
  169. package/src/public/avm/testing/account_proof_fetcher.ts +166 -0
  170. package/src/public/avm/{fixtures → testing}/base_avm_simulation_tester.ts +24 -4
  171. package/src/public/avm/{fixtures → testing}/utils.ts +7 -42
  172. package/src/public/avm_simulator.ts +29 -0
  173. package/src/public/avm_simulator_pool.ts +226 -0
  174. package/src/public/cdb/generated/api_types.ts +457 -0
  175. package/src/public/cdb/generated/server.ts +109 -0
  176. package/src/public/cdb_ipc_server.ts +197 -0
  177. package/src/public/contracts_db_checkpoint.ts +41 -0
  178. package/src/public/db_interfaces.ts +16 -1
  179. package/src/public/executor_metrics.ts +11 -34
  180. package/src/public/executor_metrics_interface.ts +2 -1
  181. package/src/public/fixtures/amm_test.ts +6 -6
  182. package/src/public/fixtures/bulk_test.ts +40 -15
  183. package/src/public/fixtures/custom_bytecode_tester.ts +54 -20
  184. package/src/public/fixtures/index.ts +6 -2
  185. package/src/public/fixtures/public_processor_test_env.ts +88 -0
  186. package/src/public/fixtures/public_tx_simulation_tester.ts +117 -26
  187. package/src/public/fixtures/simple_contract_data_source.ts +9 -10
  188. package/src/public/fixtures/token_test.ts +21 -13
  189. package/src/public/fixtures/utils.ts +25 -27
  190. package/src/public/fuzzing/avm_fuzzer_simulator.ts +303 -0
  191. package/src/public/fuzzing/avm_simulator_bin.ts +173 -0
  192. package/src/public/index.ts +8 -2
  193. package/src/public/public_db_sources.ts +112 -174
  194. package/src/public/public_processor/guarded_merkle_tree.ts +14 -6
  195. package/src/public/public_processor/public_processor.ts +234 -138
  196. package/src/public/public_processor/public_processor_metrics.ts +28 -44
  197. package/src/public/public_tx_simulator/dumping_public_tx_simulator.ts +67 -0
  198. package/src/public/public_tx_simulator/factories.ts +61 -0
  199. package/src/public/public_tx_simulator/index.ts +8 -3
  200. package/src/public/public_tx_simulator/public_tx_simulator.ts +142 -500
  201. package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
  202. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +24 -2
  203. package/src/public/test_executor_metrics.ts +10 -8
  204. package/dest/public/avm/avm_context.d.ts +0 -41
  205. package/dest/public/avm/avm_context.d.ts.map +0 -1
  206. package/dest/public/avm/avm_context.js +0 -44
  207. package/dest/public/avm/avm_contract_call_result.d.ts +0 -32
  208. package/dest/public/avm/avm_contract_call_result.d.ts.map +0 -1
  209. package/dest/public/avm/avm_contract_call_result.js +0 -54
  210. package/dest/public/avm/avm_execution_environment.d.ts +0 -23
  211. package/dest/public/avm/avm_execution_environment.d.ts.map +0 -1
  212. package/dest/public/avm/avm_execution_environment.js +0 -36
  213. package/dest/public/avm/avm_gas.d.ts +0 -44
  214. package/dest/public/avm/avm_gas.d.ts.map +0 -1
  215. package/dest/public/avm/avm_gas.js +0 -195
  216. package/dest/public/avm/avm_machine_state.d.ts +0 -97
  217. package/dest/public/avm/avm_machine_state.d.ts.map +0 -1
  218. package/dest/public/avm/avm_machine_state.js +0 -109
  219. package/dest/public/avm/avm_memory_types.d.ts +0 -275
  220. package/dest/public/avm/avm_memory_types.d.ts.map +0 -1
  221. package/dest/public/avm/avm_memory_types.js +0 -351
  222. package/dest/public/avm/avm_simulator.d.ts +0 -39
  223. package/dest/public/avm/avm_simulator.d.ts.map +0 -1
  224. package/dest/public/avm/avm_simulator.js +0 -190
  225. package/dest/public/avm/avm_simulator_interface.d.ts +0 -9
  226. package/dest/public/avm/avm_simulator_interface.d.ts.map +0 -1
  227. package/dest/public/avm/avm_simulator_interface.js +0 -3
  228. package/dest/public/avm/errors.d.ts +0 -98
  229. package/dest/public/avm/errors.d.ts.map +0 -1
  230. package/dest/public/avm/errors.js +0 -129
  231. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +0 -22
  232. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  233. package/dest/public/avm/fixtures/avm_simulation_tester.js +0 -74
  234. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  235. package/dest/public/avm/fixtures/initializers.d.ts +0 -43
  236. package/dest/public/avm/fixtures/initializers.d.ts.map +0 -1
  237. package/dest/public/avm/fixtures/initializers.js +0 -42
  238. package/dest/public/avm/fixtures/utils.d.ts.map +0 -1
  239. package/dest/public/avm/index.d.ts +0 -2
  240. package/dest/public/avm/index.d.ts.map +0 -1
  241. package/dest/public/avm/index.js +0 -1
  242. package/dest/public/avm/opcodes/accrued_substate.d.ts +0 -75
  243. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +0 -1
  244. package/dest/public/avm/opcodes/accrued_substate.js +0 -255
  245. package/dest/public/avm/opcodes/addressing_mode.d.ts +0 -31
  246. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +0 -1
  247. package/dest/public/avm/opcodes/addressing_mode.js +0 -94
  248. package/dest/public/avm/opcodes/arithmetic.d.ts +0 -47
  249. package/dest/public/avm/opcodes/arithmetic.d.ts.map +0 -1
  250. package/dest/public/avm/opcodes/arithmetic.js +0 -87
  251. package/dest/public/avm/opcodes/bitwise.d.ts +0 -42
  252. package/dest/public/avm/opcodes/bitwise.d.ts.map +0 -1
  253. package/dest/public/avm/opcodes/bitwise.js +0 -99
  254. package/dest/public/avm/opcodes/comparators.d.ts +0 -25
  255. package/dest/public/avm/opcodes/comparators.d.ts.map +0 -1
  256. package/dest/public/avm/opcodes/comparators.js +0 -43
  257. package/dest/public/avm/opcodes/contract.d.ts +0 -20
  258. package/dest/public/avm/opcodes/contract.d.ts.map +0 -1
  259. package/dest/public/avm/opcodes/contract.js +0 -65
  260. package/dest/public/avm/opcodes/control_flow.d.ts +0 -41
  261. package/dest/public/avm/opcodes/control_flow.d.ts.map +0 -1
  262. package/dest/public/avm/opcodes/control_flow.js +0 -107
  263. package/dest/public/avm/opcodes/conversion.d.ts +0 -18
  264. package/dest/public/avm/opcodes/conversion.d.ts.map +0 -1
  265. package/dest/public/avm/opcodes/conversion.js +0 -333
  266. package/dest/public/avm/opcodes/ec_add.d.ts +0 -19
  267. package/dest/public/avm/opcodes/ec_add.d.ts.map +0 -1
  268. package/dest/public/avm/opcodes/ec_add.js +0 -84
  269. package/dest/public/avm/opcodes/environment_getters.d.ts +0 -28
  270. package/dest/public/avm/opcodes/environment_getters.d.ts.map +0 -1
  271. package/dest/public/avm/opcodes/environment_getters.js +0 -77
  272. package/dest/public/avm/opcodes/external_calls.d.ts +0 -59
  273. package/dest/public/avm/opcodes/external_calls.d.ts.map +0 -1
  274. package/dest/public/avm/opcodes/external_calls.js +0 -209
  275. package/dest/public/avm/opcodes/hashing.d.ts +0 -36
  276. package/dest/public/avm/opcodes/hashing.d.ts.map +0 -1
  277. package/dest/public/avm/opcodes/hashing.js +0 -114
  278. package/dest/public/avm/opcodes/index.d.ts +0 -16
  279. package/dest/public/avm/opcodes/index.d.ts.map +0 -1
  280. package/dest/public/avm/opcodes/index.js +0 -15
  281. package/dest/public/avm/opcodes/instruction.d.ts +0 -74
  282. package/dest/public/avm/opcodes/instruction.d.ts.map +0 -1
  283. package/dest/public/avm/opcodes/instruction.js +0 -95
  284. package/dest/public/avm/opcodes/instruction_impl.d.ts +0 -19
  285. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +0 -1
  286. package/dest/public/avm/opcodes/instruction_impl.js +0 -30
  287. package/dest/public/avm/opcodes/memory.d.ts +0 -74
  288. package/dest/public/avm/opcodes/memory.d.ts.map +0 -1
  289. package/dest/public/avm/opcodes/memory.js +0 -257
  290. package/dest/public/avm/opcodes/misc.d.ts +0 -18
  291. package/dest/public/avm/opcodes/misc.d.ts.map +0 -1
  292. package/dest/public/avm/opcodes/misc.js +0 -73
  293. package/dest/public/avm/opcodes/storage.d.ts +0 -24
  294. package/dest/public/avm/opcodes/storage.d.ts.map +0 -1
  295. package/dest/public/avm/opcodes/storage.js +0 -68
  296. package/dest/public/avm/revert_reason.d.ts +0 -18
  297. package/dest/public/avm/revert_reason.d.ts.map +0 -1
  298. package/dest/public/avm/revert_reason.js +0 -38
  299. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -26
  300. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +0 -1
  301. package/dest/public/avm/serialization/buffer_cursor.js +0 -99
  302. package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -17
  303. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  304. package/dest/public/avm/serialization/bytecode_serialization.js +0 -333
  305. package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -114
  306. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +0 -1
  307. package/dest/public/avm/serialization/instruction_serialization.js +0 -261
  308. package/dest/public/avm/test_utils.d.ts +0 -15
  309. package/dest/public/avm/test_utils.d.ts.map +0 -1
  310. package/dest/public/avm/test_utils.js +0 -44
  311. package/dest/public/debug_fn_name.d.ts +0 -5
  312. package/dest/public/debug_fn_name.d.ts.map +0 -1
  313. package/dest/public/debug_fn_name.js +0 -9
  314. package/dest/public/fixtures/custom_bytecode_tests.d.ts +0 -9
  315. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +0 -1
  316. package/dest/public/fixtures/custom_bytecode_tests.js +0 -109
  317. package/dest/public/fixtures/minimal_public_tx.d.ts +0 -10
  318. package/dest/public/fixtures/minimal_public_tx.d.ts.map +0 -1
  319. package/dest/public/fixtures/minimal_public_tx.js +0 -29
  320. package/dest/public/hinting_db_sources.d.ts +0 -70
  321. package/dest/public/hinting_db_sources.d.ts.map +0 -1
  322. package/dest/public/hinting_db_sources.js +0 -297
  323. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +0 -41
  324. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +0 -1
  325. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +0 -89
  326. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +0 -24
  327. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +0 -1
  328. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +0 -51
  329. package/dest/public/public_tx_simulator/public_tx_context.d.ts +0 -127
  330. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +0 -1
  331. package/dest/public/public_tx_simulator/public_tx_context.js +0 -292
  332. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +0 -21
  333. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +0 -1
  334. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +0 -39
  335. package/dest/public/side_effect_trace.d.ts +0 -87
  336. package/dest/public/side_effect_trace.d.ts.map +0 -1
  337. package/dest/public/side_effect_trace.js +0 -199
  338. package/dest/public/side_effect_trace_interface.d.ts +0 -23
  339. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  340. package/dest/public/side_effect_trace_interface.js +0 -1
  341. package/dest/public/state_manager/index.d.ts +0 -2
  342. package/dest/public/state_manager/index.d.ts.map +0 -1
  343. package/dest/public/state_manager/index.js +0 -1
  344. package/dest/public/state_manager/nullifiers.d.ts +0 -61
  345. package/dest/public/state_manager/nullifiers.d.ts.map +0 -1
  346. package/dest/public/state_manager/nullifiers.js +0 -92
  347. package/dest/public/state_manager/public_storage.d.ts +0 -66
  348. package/dest/public/state_manager/public_storage.d.ts.map +0 -1
  349. package/dest/public/state_manager/public_storage.js +0 -145
  350. package/dest/public/state_manager/state_manager.d.ts +0 -166
  351. package/dest/public/state_manager/state_manager.d.ts.map +0 -1
  352. package/dest/public/state_manager/state_manager.js +0 -391
  353. package/dest/public/tx_contract_cache.d.ts +0 -41
  354. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  355. package/dest/public/tx_contract_cache.js +0 -49
  356. package/src/public/avm/avm_context.ts +0 -61
  357. package/src/public/avm/avm_contract_call_result.ts +0 -67
  358. package/src/public/avm/avm_execution_environment.ts +0 -48
  359. package/src/public/avm/avm_gas.ts +0 -183
  360. package/src/public/avm/avm_machine_state.ts +0 -169
  361. package/src/public/avm/avm_memory_types.ts +0 -436
  362. package/src/public/avm/avm_simulator.ts +0 -274
  363. package/src/public/avm/avm_simulator_interface.ts +0 -8
  364. package/src/public/avm/errors.ts +0 -163
  365. package/src/public/avm/fixtures/avm_simulation_tester.ts +0 -108
  366. package/src/public/avm/fixtures/initializers.ts +0 -104
  367. package/src/public/avm/index.ts +0 -1
  368. package/src/public/avm/opcodes/accrued_substate.ts +0 -288
  369. package/src/public/avm/opcodes/addressing_mode.ts +0 -111
  370. package/src/public/avm/opcodes/arithmetic.ts +0 -117
  371. package/src/public/avm/opcodes/bitwise.ts +0 -113
  372. package/src/public/avm/opcodes/comparators.ts +0 -55
  373. package/src/public/avm/opcodes/contract.ts +0 -75
  374. package/src/public/avm/opcodes/control_flow.ts +0 -123
  375. package/src/public/avm/opcodes/conversion.ts +0 -104
  376. package/src/public/avm/opcodes/ec_add.ts +0 -96
  377. package/src/public/avm/opcodes/environment_getters.ts +0 -87
  378. package/src/public/avm/opcodes/external_calls.ts +0 -260
  379. package/src/public/avm/opcodes/hashing.ts +0 -145
  380. package/src/public/avm/opcodes/index.ts +0 -15
  381. package/src/public/avm/opcodes/instruction.ts +0 -136
  382. package/src/public/avm/opcodes/instruction_impl.ts +0 -36
  383. package/src/public/avm/opcodes/memory.ts +0 -293
  384. package/src/public/avm/opcodes/misc.ts +0 -102
  385. package/src/public/avm/opcodes/storage.ts +0 -87
  386. package/src/public/avm/revert_reason.ts +0 -55
  387. package/src/public/avm/serialization/buffer_cursor.ts +0 -118
  388. package/src/public/avm/serialization/bytecode_serialization.ts +0 -204
  389. package/src/public/avm/serialization/instruction_serialization.ts +0 -249
  390. package/src/public/avm/test_utils.ts +0 -64
  391. package/src/public/debug_fn_name.ts +0 -18
  392. package/src/public/fixtures/custom_bytecode_tests.ts +0 -135
  393. package/src/public/fixtures/minimal_public_tx.ts +0 -36
  394. package/src/public/hinting_db_sources.ts +0 -505
  395. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +0 -128
  396. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +0 -109
  397. package/src/public/public_tx_simulator/public_tx_context.ts +0 -471
  398. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +0 -63
  399. package/src/public/side_effect_trace.ts +0 -290
  400. package/src/public/side_effect_trace_interface.ts +0 -28
  401. package/src/public/state_manager/index.ts +0 -1
  402. package/src/public/state_manager/nullifiers.ts +0 -103
  403. package/src/public/state_manager/public_storage.ts +0 -174
  404. package/src/public/state_manager/state_manager.ts +0 -560
  405. package/src/public/tx_contract_cache.ts +0 -69
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Fetches an account proof from the Ethereum mainnet and saves it as account_proof.json.
3
+ * This script is not using any Aztec library code, so it's easily portable.
4
+ */
5
+ import fs from 'fs';
6
+ import { dirname, join } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import { createPublicClient, fromRlp, hexToBytes, http } from 'viem';
9
+ import { mainnet } from 'viem/chains';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+
13
+ const RPC_URL = process.env.RPC_URL;
14
+ const ADDRESS = (process.env.ADDRESS || '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045') as `0x${string}`;
15
+ const BLOCK_TAG = process.env.BLOCK_NUMBER ? BigInt(process.env.BLOCK_NUMBER) : 'latest';
16
+ const MAX_ACCOUNT_PATH = 15;
17
+
18
+ function padTo(arr: number[], len: number) {
19
+ return [...arr, ...Array(len - arr.length).fill(0)].slice(0, len);
20
+ }
21
+
22
+ function toBytes(hex: `0x${string}`) {
23
+ return Array.from(hexToBytes(hex));
24
+ }
25
+
26
+ function bytesToU64s(bytes: number[]) {
27
+ const paddedBytes = padTo(bytes, 32);
28
+ return Array.from({ length: 4 }, (_, i) => {
29
+ let val = 0n;
30
+ for (let j = 0; j < 8; j++) {
31
+ val += BigInt(paddedBytes[i * 8 + j]) << BigInt(j * 8);
32
+ }
33
+ return val.toString();
34
+ });
35
+ }
36
+
37
+ function toBytesAndLen(val: bigint | number) {
38
+ if (val === 0n || val === 0) {
39
+ return { bytes: [0], length: 0 };
40
+ }
41
+ let hex = val.toString(16);
42
+ if (hex.length % 2) {
43
+ hex = '0' + hex;
44
+ }
45
+ const bytes = toBytes(`0x${hex}`);
46
+ return { bytes, length: bytes.length };
47
+ }
48
+
49
+ function parseNode(rlp: `0x${string}`) {
50
+ // Should be safe when working with branches and extensions without embedded children.
51
+ const decoded = fromRlp(rlp) as `0x${string}`[];
52
+ const node = {
53
+ rows: Array(16)
54
+ .fill(0)
55
+ .map(() => Array(32).fill(0)),
56
+ row_exist: Array(16).fill(false),
57
+ node_type: 0,
58
+ };
59
+
60
+ if (decoded.length === 17) {
61
+ for (let i = 0; i < 16; i++) {
62
+ if (decoded[i] !== '0x') {
63
+ node.row_exist[i] = true;
64
+ node.rows[i] = padTo(toBytes(decoded[i]), 32);
65
+ }
66
+ }
67
+ } else if (decoded.length === 2) {
68
+ const keyBytes = toBytes(decoded[0]);
69
+ const prefix = keyBytes[0];
70
+ if (prefix >> 4 >= 2) {
71
+ throw new Error('Unsupported: leaf node in proof path');
72
+ }
73
+ node.node_type = 1;
74
+ // Extension header format expected by the noir code: check out storage_proof types.nr.
75
+ node.rows[0][0] = prefix >> 4;
76
+ node.rows[0][8] = prefix & 0x0f;
77
+ node.rows[0][16] = keyBytes.length - 1;
78
+
79
+ for (let i = 1; i < keyBytes.length && i < 32; i++) {
80
+ node.rows[1][i - 1] = keyBytes[i];
81
+ }
82
+ node.rows[2] = padTo(toBytes(decoded[1]), 32);
83
+ node.row_exist[0] = node.row_exist[1] = node.row_exist[2] = true;
84
+ }
85
+ return node;
86
+ }
87
+
88
+ function parseProof(proof: `0x${string}`[], maxLen: number) {
89
+ const nodes = proof.slice(0, -1).slice(0, maxLen).map(parseNode);
90
+ while (nodes.length < maxLen) {
91
+ nodes.push({
92
+ rows: Array(16)
93
+ .fill(0)
94
+ .map(() => Array(32).fill(0)),
95
+ row_exist: Array(16).fill(false),
96
+ node_type: 0,
97
+ });
98
+ }
99
+ return nodes;
100
+ }
101
+
102
+ function nodeToLibFormat(node: { rows: number[][]; row_exist: boolean[]; node_type: number }) {
103
+ return {
104
+ rows: node.rows.map(bytesToU64s),
105
+ row_exist: node.row_exist,
106
+ node_type: String(node.node_type),
107
+ };
108
+ }
109
+
110
+ async function main() {
111
+ if (!RPC_URL) {
112
+ throw new Error('RPC_URL is not set');
113
+ }
114
+ console.log(`Fetching account proof for ${ADDRESS}`);
115
+
116
+ const client = createPublicClient({
117
+ chain: mainnet,
118
+ transport: http(RPC_URL),
119
+ });
120
+
121
+ const [blockNumber, proof, block] = await Promise.all([
122
+ client.getBlockNumber(),
123
+ client.getProof({
124
+ address: ADDRESS,
125
+ storageKeys: [],
126
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
127
+ }),
128
+ client.getBlock({
129
+ blockNumber: BLOCK_TAG === 'latest' ? undefined : BLOCK_TAG,
130
+ }),
131
+ ]);
132
+
133
+ console.log(`Block: ${blockNumber}, Account nodes: ${proof.accountProof.length}`);
134
+
135
+ // The -1 is because the last node in the proof is the leaf, which is excluded from path verification.
136
+ const accountPathLen = proof.accountProof.length - 1;
137
+ if (accountPathLen > MAX_ACCOUNT_PATH) {
138
+ throw new Error(
139
+ `Account proof path length ${accountPathLen} exceeds MAX_ACCOUNT_PATH ${MAX_ACCOUNT_PATH}. Increase the limit.`,
140
+ );
141
+ }
142
+
143
+ const nonce = toBytesAndLen(proof.nonce);
144
+ const balance = toBytesAndLen(proof.balance);
145
+
146
+ const data = {
147
+ block_number: String(blockNumber),
148
+ node_length: String(accountPathLen),
149
+ root: bytesToU64s(toBytes(block.stateRoot)),
150
+ nodes: parseProof(proof.accountProof, MAX_ACCOUNT_PATH).map(nodeToLibFormat),
151
+ account: {
152
+ address: toBytes(ADDRESS).map(String),
153
+ balance: padTo(balance.bytes, 32).map(String),
154
+ balance_length: String(balance.length),
155
+ code_hash: bytesToU64s(toBytes(proof.codeHash)),
156
+ nonce: padTo(nonce.bytes, 8).map(String),
157
+ nonce_length: String(nonce.length),
158
+ storage_hash: bytesToU64s(toBytes(proof.storageHash)),
159
+ },
160
+ };
161
+
162
+ fs.writeFileSync(join(__dirname, 'account_proof.json'), JSON.stringify(data, null, 2));
163
+ console.log('account_proof.json generated');
164
+ }
165
+
166
+ main().catch(console.error);
@@ -1,10 +1,11 @@
1
1
  import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
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()]);
@@ -1,5 +1,6 @@
1
1
  import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import {
4
5
  type ContractArtifact,
5
6
  type FunctionAbi,
@@ -13,7 +14,6 @@ import {
13
14
  type ContractInstanceWithAddress,
14
15
  computeInitializationHash,
15
16
  } from '@aztec/stdlib/contract';
16
- import { isNoirCallStackUnresolved } from '@aztec/stdlib/errors';
17
17
  import { siloNullifier } from '@aztec/stdlib/hash';
18
18
  import { deriveKeys } from '@aztec/stdlib/keys';
19
19
  import { makeContractClassPublic, makeContractInstanceFromClassId } from '@aztec/stdlib/testing';
@@ -22,13 +22,9 @@ import type { UInt64 } from '@aztec/stdlib/types';
22
22
  import { strict as assert } from 'assert';
23
23
  import merge from 'lodash.merge';
24
24
 
25
- import { resolveAssertionMessageFromRevertData, traverseCauseChain } from '../../../common/index.js';
26
- import { Field, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
27
- import type { AvmRevertReason } from '../errors.js';
28
-
29
25
  export const PUBLIC_DISPATCH_FN_NAME = 'public_dispatch';
30
26
  export const DEFAULT_TIMESTAMP: UInt64 = 99833n;
31
- export const DEFAULT_BLOCK_NUMBER = 42;
27
+ export const DEFAULT_BLOCK_NUMBER = BlockNumber(42);
32
28
 
33
29
  /**
34
30
  * Create a new object with all the same properties as the original, except for the ones in the overrides object.
@@ -37,22 +33,6 @@ export function allSameExcept(original: any, overrides: any): any {
37
33
  return merge({}, original, overrides);
38
34
  }
39
35
 
40
- export function randomMemoryBytes(length: number): Uint8[] {
41
- return [...Array(length)].map(_ => new Uint8(Math.floor(Math.random() * 255)));
42
- }
43
-
44
- export function randomMemoryUint32s(length: number): Uint32[] {
45
- return [...Array(length)].map(_ => new Uint32(Math.floor(Math.random() * 255)));
46
- }
47
-
48
- export function randomMemoryUint64s(length: number): Uint64[] {
49
- return [...Array(length)].map(_ => new Uint64(Math.floor(Math.random() * 255)));
50
- }
51
-
52
- export function randomMemoryFields(length: number): Field[] {
53
- return [...Array(length)].map(_ => new Field(Fr.random()));
54
- }
55
-
56
36
  export function getFunctionSelector(
57
37
  functionName: string,
58
38
  contractArtifact: ContractArtifact,
@@ -80,24 +60,6 @@ export function getContractFunctionAbi(
80
60
  );
81
61
  }
82
62
 
83
- export function resolveContractAssertionMessage(
84
- functionName: string,
85
- revertReason: AvmRevertReason,
86
- output: Fr[],
87
- contractArtifact: ContractArtifact,
88
- ): string | undefined {
89
- traverseCauseChain(revertReason, cause => {
90
- revertReason = cause as AvmRevertReason;
91
- });
92
-
93
- const functionArtifact = getAllFunctionAbis(contractArtifact).find(f => f.name === functionName);
94
- if (!functionArtifact || !revertReason.noirCallStack || !isNoirCallStackUnresolved(revertReason.noirCallStack)) {
95
- return undefined;
96
- }
97
-
98
- return resolveAssertionMessageFromRevertData(output, functionArtifact);
99
- }
100
-
101
63
  /**
102
64
  * Create a contract class and instance given constructor args, artifact, etc.
103
65
  * NOTE: This is useful for testing real-ish contract class registration and instance deployment TXs (via logs)
@@ -127,22 +89,25 @@ export async function createContractClassAndInstance(
127
89
  const constructorAbi = getContractFunctionAbi('constructor', contractArtifact);
128
90
  const { publicKeys } = await deriveKeys(new Fr(seed));
129
91
  const initializationHash = await computeInitializationHash(constructorAbi, constructorArgs);
92
+ const immutablesHash = new Fr(seed + 1);
130
93
  const contractInstance =
131
94
  originalContractClassId === undefined
132
95
  ? await makeContractInstanceFromClassId(contractClass.id, seed, {
133
96
  deployer,
134
97
  initializationHash,
98
+ immutablesHash,
135
99
  publicKeys,
136
100
  })
137
101
  : await makeContractInstanceFromClassId(originalContractClassId, seed, {
138
102
  deployer,
139
103
  initializationHash,
140
104
  currentClassId: contractClass.id,
105
+ immutablesHash,
141
106
  publicKeys,
142
107
  });
143
108
 
144
109
  const contractAddressNullifier = await siloNullifier(
145
- AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
110
+ AztecAddress.fromNumberUnsafe(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
146
111
  contractInstance.address.toField(),
147
112
  );
148
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
+ }