@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.1142ef1

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 (521) hide show
  1. package/README.md +6 -0
  2. package/dest/client.d.ts +6 -4
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +6 -15
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +1 -2
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/common/stats/index.d.ts +1 -1
  12. package/dest/common/stats/stats.d.ts +1 -1
  13. package/dest/private/acvm/acvm.d.ts +12 -6
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +10 -16
  16. package/dest/private/acvm/acvm_types.d.ts +2 -2
  17. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.d.ts +19 -20
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +32 -24
  21. package/dest/private/acvm/index.d.ts +1 -2
  22. package/dest/private/acvm/index.d.ts.map +1 -1
  23. package/dest/private/acvm/index.js +0 -1
  24. package/dest/private/acvm/serialize.d.ts +21 -4
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +54 -1
  27. package/dest/private/acvm_native.d.ts +39 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  30. package/dest/private/acvm_wasm.d.ts +15 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  33. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  34. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  35. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  36. package/dest/private/circuit_recording/circuit_recorder.d.ts +108 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +210 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -0
  40. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  41. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +5 -0
  43. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  44. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  46. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  47. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  48. package/dest/private/circuit_simulator.d.ts +35 -0
  49. package/dest/private/circuit_simulator.d.ts.map +1 -0
  50. package/dest/private/circuit_simulator.js +43 -0
  51. package/dest/private/factory.d.ts +12 -0
  52. package/dest/private/factory.d.ts.map +1 -0
  53. package/dest/private/{providers/factory.js → factory.js} +2 -2
  54. package/dest/public/avm/avm_context.d.ts +7 -7
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +6 -4
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +11 -7
  59. package/dest/public/avm/avm_execution_environment.d.ts +5 -3
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +5 -3
  62. package/dest/public/avm/avm_gas.d.ts +5 -21
  63. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  64. package/dest/public/avm/avm_gas.js +27 -35
  65. package/dest/public/avm/avm_machine_state.d.ts +4 -2
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +2 -0
  68. package/dest/public/avm/avm_memory_types.d.ts +100 -89
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +18 -7
  71. package/dest/public/avm/avm_simulator.d.ts +7 -7
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +28 -39
  74. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  75. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  76. package/dest/public/avm/avm_simulator_interface.js +3 -0
  77. package/dest/public/avm/errors.d.ts +11 -29
  78. package/dest/public/avm/errors.d.ts.map +1 -1
  79. package/dest/public/avm/errors.js +19 -57
  80. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  81. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  82. package/dest/public/avm/fixtures/avm_simulation_tester.js +23 -16
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  84. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  86. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  87. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  88. package/dest/public/avm/fixtures/initializers.js +44 -0
  89. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  90. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/utils.js +96 -0
  92. package/dest/public/avm/index.d.ts +1 -3
  93. package/dest/public/avm/index.d.ts.map +1 -1
  94. package/dest/public/avm/index.js +0 -2
  95. package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -3
  96. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  97. package/dest/public/avm/opcodes/accrued_substate.js +29 -26
  98. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  99. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  101. package/dest/public/avm/opcodes/arithmetic.d.ts +19 -7
  102. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  104. package/dest/public/avm/opcodes/bitwise.d.ts +10 -18
  105. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/bitwise.js +19 -26
  107. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  108. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/comparators.js +3 -3
  110. package/dest/public/avm/opcodes/contract.d.ts +2 -3
  111. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/contract.js +9 -10
  113. package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
  114. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/control_flow.js +10 -8
  116. package/dest/public/avm/opcodes/conversion.d.ts +2 -1
  117. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/conversion.js +267 -3
  119. package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
  120. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/ec_add.js +8 -8
  122. package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
  123. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  125. package/dest/public/avm/opcodes/external_calls.d.ts +9 -8
  126. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/external_calls.js +40 -34
  128. package/dest/public/avm/opcodes/hashing.d.ts +2 -2
  129. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/hashing.js +15 -10
  131. package/dest/public/avm/opcodes/index.d.ts +1 -1
  132. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  133. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  134. package/dest/public/avm/opcodes/instruction.js +23 -19
  135. package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
  136. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/memory.d.ts +6 -6
  138. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  139. package/dest/public/avm/opcodes/memory.js +37 -33
  140. package/dest/public/avm/opcodes/misc.d.ts +3 -2
  141. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  142. package/dest/public/avm/opcodes/misc.js +41 -16
  143. package/dest/public/avm/opcodes/storage.d.ts +3 -3
  144. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  145. package/dest/public/avm/opcodes/storage.js +7 -5
  146. package/dest/public/avm/revert_reason.d.ts +18 -0
  147. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  148. package/dest/public/avm/revert_reason.js +39 -0
  149. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  150. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  151. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  152. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  153. package/dest/public/avm/serialization/bytecode_serialization.js +79 -75
  154. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  155. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  156. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  157. package/dest/public/avm/test_utils.d.ts +12 -15
  158. package/dest/public/avm/test_utils.d.ts.map +1 -1
  159. package/dest/public/avm/test_utils.js +17 -25
  160. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  161. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  162. package/dest/public/contracts_db_checkpoint.js +30 -0
  163. package/dest/public/db_interfaces.d.ts +68 -0
  164. package/dest/public/db_interfaces.d.ts.map +1 -0
  165. package/dest/public/db_interfaces.js +3 -0
  166. package/dest/public/debug_fn_name.d.ts +18 -0
  167. package/dest/public/debug_fn_name.d.ts.map +1 -0
  168. package/dest/public/debug_fn_name.js +35 -0
  169. package/dest/public/executor_metrics.d.ts +12 -4
  170. package/dest/public/executor_metrics.d.ts.map +1 -1
  171. package/dest/public/executor_metrics.js +29 -24
  172. package/dest/public/executor_metrics_interface.d.ts +10 -0
  173. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  174. package/dest/public/executor_metrics_interface.js +1 -0
  175. package/dest/public/fixtures/amm_test.d.ts +10 -0
  176. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  177. package/dest/public/fixtures/amm_test.js +213 -0
  178. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  179. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  180. package/dest/public/fixtures/bulk_test.js +262 -0
  181. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  182. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  183. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  184. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  185. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  186. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  187. package/dest/public/fixtures/index.d.ts +10 -1
  188. package/dest/public/fixtures/index.d.ts.map +1 -1
  189. package/dest/public/fixtures/index.js +9 -0
  190. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  191. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  192. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  193. package/dest/public/fixtures/opcode_spammer.d.ts +123 -0
  194. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  195. package/dest/public/fixtures/opcode_spammer.js +1681 -0
  196. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +55 -15
  197. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  198. package/dest/public/fixtures/public_tx_simulation_tester.js +138 -72
  199. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  200. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  201. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  202. package/dest/public/fixtures/token_test.d.ts +12 -0
  203. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  204. package/dest/public/fixtures/token_test.js +96 -0
  205. package/dest/public/fixtures/utils.d.ts +18 -5
  206. package/dest/public/fixtures/utils.d.ts.map +1 -1
  207. package/dest/public/fixtures/utils.js +102 -59
  208. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +46 -0
  209. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  210. package/dest/public/fuzzing/avm_fuzzer_simulator.js +139 -0
  211. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  212. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  213. package/dest/public/fuzzing/avm_simulator_bin.js +111 -0
  214. package/dest/public/hinting_db_sources.d.ts +80 -0
  215. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  216. package/dest/public/hinting_db_sources.js +355 -0
  217. package/dest/public/index.d.ts +6 -9
  218. package/dest/public/index.d.ts.map +1 -1
  219. package/dest/public/index.js +4 -7
  220. package/dest/public/public_db_sources.d.ts +52 -102
  221. package/dest/public/public_db_sources.d.ts.map +1 -1
  222. package/dest/public/public_db_sources.js +220 -193
  223. package/dest/public/public_errors.d.ts +12 -0
  224. package/dest/public/public_errors.d.ts.map +1 -0
  225. package/dest/public/public_errors.js +13 -0
  226. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  227. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  228. package/dest/public/public_processor/guarded_merkle_tree.js +113 -0
  229. package/dest/public/public_processor/public_processor.d.ts +26 -38
  230. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  231. package/dest/public/public_processor/public_processor.js +570 -135
  232. package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
  233. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  234. package/dest/public/public_processor/public_processor_metrics.js +13 -46
  235. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +18 -0
  236. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  237. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  238. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  239. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  240. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +131 -0
  241. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  242. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  243. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  244. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  245. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  246. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  247. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +22 -0
  248. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  249. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  250. package/dest/public/public_tx_simulator/factories.d.ts +13 -0
  251. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  252. package/dest/public/public_tx_simulator/factories.js +28 -0
  253. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  254. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  255. package/dest/public/public_tx_simulator/index.js +5 -0
  256. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  257. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  258. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  259. package/dest/public/public_tx_simulator/public_tx_context.d.ts +24 -31
  260. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  261. package/dest/public/public_tx_simulator/public_tx_context.js +72 -92
  262. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -58
  263. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  264. package/dest/public/public_tx_simulator/public_tx_simulator.js +213 -205
  265. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  266. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  267. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  268. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  269. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  270. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
  271. package/dest/public/side_effect_errors.d.ts +42 -2
  272. package/dest/public/side_effect_errors.d.ts.map +1 -1
  273. package/dest/public/side_effect_errors.js +70 -1
  274. package/dest/public/side_effect_trace.d.ts +22 -68
  275. package/dest/public/side_effect_trace.d.ts.map +1 -1
  276. package/dest/public/side_effect_trace.js +72 -122
  277. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  278. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  279. package/dest/public/state_manager/index.d.ts +2 -0
  280. package/dest/public/state_manager/index.d.ts.map +1 -0
  281. package/dest/public/state_manager/index.js +1 -0
  282. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  283. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  284. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  285. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  286. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  287. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  288. package/dest/public/state_manager/state_manager.d.ts +164 -0
  289. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  290. package/dest/public/state_manager/state_manager.js +395 -0
  291. package/dest/public/test_executor_metrics.d.ts +55 -0
  292. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  293. package/dest/public/test_executor_metrics.js +307 -0
  294. package/dest/public/unique_class_ids.d.ts +1 -1
  295. package/dest/public/unique_class_ids.d.ts.map +1 -1
  296. package/dest/public/utils.d.ts +3 -5
  297. package/dest/public/utils.d.ts.map +1 -1
  298. package/dest/public/utils.js +4 -21
  299. package/dest/server.d.ts +7 -4
  300. package/dest/server.d.ts.map +1 -1
  301. package/dest/server.js +5 -2
  302. package/dest/testing.d.ts +2 -0
  303. package/dest/testing.d.ts.map +1 -0
  304. package/dest/testing.js +1 -0
  305. package/package.json +39 -33
  306. package/src/client.ts +5 -3
  307. package/src/common/errors.ts +80 -45
  308. package/src/common/index.ts +0 -1
  309. package/src/private/acvm/acvm.ts +17 -32
  310. package/src/private/acvm/acvm_types.ts +1 -1
  311. package/src/private/acvm/deserialize.ts +36 -30
  312. package/src/private/acvm/index.ts +0 -1
  313. package/src/private/acvm/serialize.ts +64 -1
  314. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  315. package/src/private/acvm_wasm.ts +72 -0
  316. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  317. package/src/private/circuit_recording/circuit_recorder.ts +261 -0
  318. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  319. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  320. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  321. package/src/private/circuit_simulator.ts +90 -0
  322. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  323. package/src/public/avm/avm_context.ts +5 -5
  324. package/src/public/avm/avm_contract_call_result.ts +18 -6
  325. package/src/public/avm/avm_execution_environment.ts +9 -2
  326. package/src/public/avm/avm_gas.ts +26 -38
  327. package/src/public/avm/avm_machine_state.ts +6 -1
  328. package/src/public/avm/avm_memory_types.ts +20 -7
  329. package/src/public/avm/avm_simulator.ts +50 -58
  330. package/src/public/avm/avm_simulator_interface.ts +8 -0
  331. package/src/public/avm/errors.ts +20 -75
  332. package/src/public/avm/fixtures/avm_simulation_tester.ts +33 -22
  333. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  334. package/src/public/avm/fixtures/initializers.ts +102 -0
  335. package/src/public/avm/fixtures/utils.ts +151 -0
  336. package/src/public/avm/index.ts +0 -2
  337. package/src/public/avm/opcodes/accrued_substate.ts +65 -30
  338. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  339. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  340. package/src/public/avm/opcodes/bitwise.ts +33 -29
  341. package/src/public/avm/opcodes/comparators.ts +6 -3
  342. package/src/public/avm/opcodes/contract.ts +10 -7
  343. package/src/public/avm/opcodes/control_flow.ts +19 -10
  344. package/src/public/avm/opcodes/conversion.ts +27 -3
  345. package/src/public/avm/opcodes/ec_add.ts +11 -8
  346. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  347. package/src/public/avm/opcodes/external_calls.ts +62 -29
  348. package/src/public/avm/opcodes/hashing.ts +38 -12
  349. package/src/public/avm/opcodes/instruction.ts +31 -21
  350. package/src/public/avm/opcodes/memory.ts +71 -32
  351. package/src/public/avm/opcodes/misc.ts +60 -18
  352. package/src/public/avm/opcodes/storage.ts +22 -6
  353. package/src/public/avm/revert_reason.ts +58 -0
  354. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  355. package/src/public/avm/serialization/bytecode_serialization.ts +89 -80
  356. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  357. package/src/public/avm/test_utils.ts +25 -42
  358. package/src/public/contracts_db_checkpoint.ts +41 -0
  359. package/src/public/db_interfaces.ts +76 -0
  360. package/src/public/debug_fn_name.ts +50 -0
  361. package/src/public/executor_metrics.ts +47 -24
  362. package/src/public/executor_metrics_interface.ts +15 -0
  363. package/src/public/fixtures/amm_test.ts +331 -0
  364. package/src/public/fixtures/bulk_test.ts +169 -0
  365. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  366. package/src/public/fixtures/custom_bytecode_tests.ts +219 -0
  367. package/src/public/fixtures/index.ts +13 -0
  368. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  369. package/src/public/fixtures/opcode_spammer.ts +1638 -0
  370. package/src/public/fixtures/public_tx_simulation_tester.ts +223 -114
  371. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  372. package/src/public/fixtures/token_test.ts +148 -0
  373. package/src/public/fixtures/utils.ts +141 -69
  374. package/src/public/fuzzing/avm_fuzzer_simulator.ts +240 -0
  375. package/src/public/fuzzing/avm_simulator_bin.ts +153 -0
  376. package/src/public/hinting_db_sources.ts +607 -0
  377. package/src/public/index.ts +11 -8
  378. package/src/public/public_db_sources.ts +279 -259
  379. package/src/public/public_errors.ts +14 -0
  380. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  381. package/src/public/public_processor/public_processor.ts +242 -178
  382. package/src/public/public_processor/public_processor_metrics.ts +13 -47
  383. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +121 -0
  384. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +207 -0
  385. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +132 -0
  386. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +237 -0
  387. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +81 -0
  388. package/src/public/public_tx_simulator/factories.ts +41 -0
  389. package/src/public/public_tx_simulator/index.ts +7 -0
  390. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  391. package/src/public/public_tx_simulator/public_tx_context.ts +168 -195
  392. package/src/public/public_tx_simulator/public_tx_simulator.ts +302 -260
  393. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  394. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  395. package/src/public/side_effect_errors.ts +91 -1
  396. package/src/public/side_effect_trace.ts +95 -321
  397. package/src/public/side_effect_trace_interface.ts +11 -59
  398. package/src/public/state_manager/index.ts +1 -0
  399. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  400. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  401. package/src/public/state_manager/state_manager.ts +560 -0
  402. package/src/public/test_executor_metrics.ts +397 -0
  403. package/src/public/utils.ts +5 -21
  404. package/src/server.ts +6 -3
  405. package/src/testing.ts +1 -0
  406. package/dest/common/db_interfaces.d.ts +0 -80
  407. package/dest/common/db_interfaces.d.ts.map +0 -1
  408. package/dest/common/db_interfaces.js +0 -1
  409. package/dest/common/debug_fn_name.d.ts +0 -5
  410. package/dest/common/debug_fn_name.d.ts.map +0 -1
  411. package/dest/common/debug_fn_name.js +0 -6
  412. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  413. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  414. package/dest/common/message_load_oracle_inputs.js +0 -15
  415. package/dest/private/acvm/oracle/index.d.ts +0 -14
  416. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  417. package/dest/private/acvm/oracle/index.js +0 -2
  418. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  419. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  420. package/dest/private/acvm/oracle/oracle.js +0 -263
  421. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  422. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  423. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  424. package/dest/private/execution_data_provider.d.ts +0 -261
  425. package/dest/private/execution_data_provider.d.ts.map +0 -1
  426. package/dest/private/execution_data_provider.js +0 -14
  427. package/dest/private/execution_note_cache.d.ts +0 -93
  428. package/dest/private/execution_note_cache.d.ts.map +0 -1
  429. package/dest/private/execution_note_cache.js +0 -180
  430. package/dest/private/hashed_values_cache.d.ts +0 -28
  431. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  432. package/dest/private/hashed_values_cache.js +0 -46
  433. package/dest/private/index.d.ts +0 -13
  434. package/dest/private/index.d.ts.map +0 -1
  435. package/dest/private/index.js +0 -12
  436. package/dest/private/pick_notes.d.ts +0 -85
  437. package/dest/private/pick_notes.d.ts.map +0 -1
  438. package/dest/private/pick_notes.js +0 -51
  439. package/dest/private/private_execution.d.ts +0 -25
  440. package/dest/private/private_execution.d.ts.map +0 -1
  441. package/dest/private/private_execution.js +0 -92
  442. package/dest/private/private_execution_oracle.d.ts +0 -215
  443. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  444. package/dest/private/private_execution_oracle.js +0 -382
  445. package/dest/private/providers/acvm_native.d.ts +0 -40
  446. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  447. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  448. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  449. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  450. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  451. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  452. package/dest/private/providers/factory.d.ts +0 -12
  453. package/dest/private/providers/factory.d.ts.map +0 -1
  454. package/dest/private/providers/simulation_provider.d.ts +0 -19
  455. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  456. package/dest/private/providers/simulation_provider.js +0 -24
  457. package/dest/private/simulator.d.ts +0 -34
  458. package/dest/private/simulator.d.ts.map +0 -1
  459. package/dest/private/simulator.js +0 -76
  460. package/dest/private/unconstrained_execution.d.ts +0 -10
  461. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  462. package/dest/private/unconstrained_execution.js +0 -27
  463. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  464. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  465. package/dest/private/unconstrained_execution_oracle.js +0 -258
  466. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  467. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  468. package/dest/public/avm/bytecode_utils.js +0 -17
  469. package/dest/public/avm/fixtures/index.d.ts +0 -84
  470. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  471. package/dest/public/avm/fixtures/index.js +0 -175
  472. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  473. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  474. package/dest/public/avm/journal/index.d.ts +0 -2
  475. package/dest/public/avm/journal/index.d.ts.map +0 -1
  476. package/dest/public/avm/journal/index.js +0 -1
  477. package/dest/public/avm/journal/journal.d.ts +0 -209
  478. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  479. package/dest/public/avm/journal/journal.js +0 -486
  480. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  481. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  482. package/dest/public/bytecode_errors.d.ts +0 -4
  483. package/dest/public/bytecode_errors.d.ts.map +0 -1
  484. package/dest/public/bytecode_errors.js +0 -6
  485. package/dest/public/execution.d.ts +0 -108
  486. package/dest/public/execution.d.ts.map +0 -1
  487. package/dest/public/execution.js +0 -9
  488. package/dest/public/tx_contract_cache.d.ts +0 -41
  489. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  490. package/dest/public/tx_contract_cache.js +0 -49
  491. package/dest/test/utils.d.ts +0 -13
  492. package/dest/test/utils.d.ts.map +0 -1
  493. package/dest/test/utils.js +0 -22
  494. package/src/common/db_interfaces.ts +0 -94
  495. package/src/common/debug_fn_name.ts +0 -18
  496. package/src/common/message_load_oracle_inputs.ts +0 -15
  497. package/src/private/acvm/oracle/index.ts +0 -16
  498. package/src/private/acvm/oracle/oracle.ts +0 -455
  499. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  500. package/src/private/execution_data_provider.ts +0 -323
  501. package/src/private/execution_note_cache.ts +0 -217
  502. package/src/private/hashed_values_cache.ts +0 -55
  503. package/src/private/index.ts +0 -16
  504. package/src/private/pick_notes.ts +0 -141
  505. package/src/private/private_execution.ts +0 -151
  506. package/src/private/private_execution_oracle.ts +0 -614
  507. package/src/private/providers/acvm_wasm.ts +0 -63
  508. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  509. package/src/private/providers/simulation_provider.ts +0 -45
  510. package/src/private/simulator.ts +0 -147
  511. package/src/private/unconstrained_execution.ts +0 -50
  512. package/src/private/unconstrained_execution_oracle.ts +0 -373
  513. package/src/public/avm/bytecode_utils.ts +0 -17
  514. package/src/public/avm/fixtures/index.ts +0 -296
  515. package/src/public/avm/journal/index.ts +0 -1
  516. package/src/public/avm/journal/journal.ts +0 -742
  517. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  518. package/src/public/bytecode_errors.ts +0 -6
  519. package/src/public/execution.ts +0 -140
  520. package/src/public/tx_contract_cache.ts +0 -69
  521. package/src/test/utils.ts +0 -36
@@ -1,25 +1,397 @@
1
- function _ts_decorate(decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1
+ function applyDecs2203RFactory() {
2
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
3
+ return function addInitializer(initializer) {
4
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
5
+ assertCallable(initializer, "An initializer");
6
+ initializers.push(initializer);
7
+ };
8
+ }
9
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
10
+ var kindStr;
11
+ switch(kind){
12
+ case 1:
13
+ kindStr = "accessor";
14
+ break;
15
+ case 2:
16
+ kindStr = "method";
17
+ break;
18
+ case 3:
19
+ kindStr = "getter";
20
+ break;
21
+ case 4:
22
+ kindStr = "setter";
23
+ break;
24
+ default:
25
+ kindStr = "field";
26
+ }
27
+ var ctx = {
28
+ kind: kindStr,
29
+ name: isPrivate ? "#" + name : name,
30
+ static: isStatic,
31
+ private: isPrivate,
32
+ metadata: metadata
33
+ };
34
+ var decoratorFinishedRef = {
35
+ v: false
36
+ };
37
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
38
+ var get, set;
39
+ if (kind === 0) {
40
+ if (isPrivate) {
41
+ get = desc.get;
42
+ set = desc.set;
43
+ } else {
44
+ get = function() {
45
+ return this[name];
46
+ };
47
+ set = function(v) {
48
+ this[name] = v;
49
+ };
50
+ }
51
+ } else if (kind === 2) {
52
+ get = function() {
53
+ return desc.value;
54
+ };
55
+ } else {
56
+ if (kind === 1 || kind === 3) {
57
+ get = function() {
58
+ return desc.get.call(this);
59
+ };
60
+ }
61
+ if (kind === 1 || kind === 4) {
62
+ set = function(v) {
63
+ desc.set.call(this, v);
64
+ };
65
+ }
66
+ }
67
+ ctx.access = get && set ? {
68
+ get: get,
69
+ set: set
70
+ } : get ? {
71
+ get: get
72
+ } : {
73
+ set: set
74
+ };
75
+ try {
76
+ return dec(value, ctx);
77
+ } finally{
78
+ decoratorFinishedRef.v = true;
79
+ }
80
+ }
81
+ function assertNotFinished(decoratorFinishedRef, fnName) {
82
+ if (decoratorFinishedRef.v) {
83
+ throw new Error("attempted to call " + fnName + " after decoration was finished");
84
+ }
85
+ }
86
+ function assertCallable(fn, hint) {
87
+ if (typeof fn !== "function") {
88
+ throw new TypeError(hint + " must be a function");
89
+ }
90
+ }
91
+ function assertValidReturnValue(kind, value) {
92
+ var type = typeof value;
93
+ if (kind === 1) {
94
+ if (type !== "object" || value === null) {
95
+ throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
96
+ }
97
+ if (value.get !== undefined) {
98
+ assertCallable(value.get, "accessor.get");
99
+ }
100
+ if (value.set !== undefined) {
101
+ assertCallable(value.set, "accessor.set");
102
+ }
103
+ if (value.init !== undefined) {
104
+ assertCallable(value.init, "accessor.init");
105
+ }
106
+ } else if (type !== "function") {
107
+ var hint;
108
+ if (kind === 0) {
109
+ hint = "field";
110
+ } else if (kind === 10) {
111
+ hint = "class";
112
+ } else {
113
+ hint = "method";
114
+ }
115
+ throw new TypeError(hint + " decorators must return a function or void 0");
116
+ }
117
+ }
118
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
119
+ var decs = decInfo[0];
120
+ var desc, init, value;
121
+ if (isPrivate) {
122
+ if (kind === 0 || kind === 1) {
123
+ desc = {
124
+ get: decInfo[3],
125
+ set: decInfo[4]
126
+ };
127
+ } else if (kind === 3) {
128
+ desc = {
129
+ get: decInfo[3]
130
+ };
131
+ } else if (kind === 4) {
132
+ desc = {
133
+ set: decInfo[3]
134
+ };
135
+ } else {
136
+ desc = {
137
+ value: decInfo[3]
138
+ };
139
+ }
140
+ } else if (kind !== 0) {
141
+ desc = Object.getOwnPropertyDescriptor(base, name);
142
+ }
143
+ if (kind === 1) {
144
+ value = {
145
+ get: desc.get,
146
+ set: desc.set
147
+ };
148
+ } else if (kind === 2) {
149
+ value = desc.value;
150
+ } else if (kind === 3) {
151
+ value = desc.get;
152
+ } else if (kind === 4) {
153
+ value = desc.set;
154
+ }
155
+ var newValue, get, set;
156
+ if (typeof decs === "function") {
157
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
158
+ if (newValue !== void 0) {
159
+ assertValidReturnValue(kind, newValue);
160
+ if (kind === 0) {
161
+ init = newValue;
162
+ } else if (kind === 1) {
163
+ init = newValue.init;
164
+ get = newValue.get || value.get;
165
+ set = newValue.set || value.set;
166
+ value = {
167
+ get: get,
168
+ set: set
169
+ };
170
+ } else {
171
+ value = newValue;
172
+ }
173
+ }
174
+ } else {
175
+ for(var i = decs.length - 1; i >= 0; i--){
176
+ var dec = decs[i];
177
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
178
+ if (newValue !== void 0) {
179
+ assertValidReturnValue(kind, newValue);
180
+ var newInit;
181
+ if (kind === 0) {
182
+ newInit = newValue;
183
+ } else if (kind === 1) {
184
+ newInit = newValue.init;
185
+ get = newValue.get || value.get;
186
+ set = newValue.set || value.set;
187
+ value = {
188
+ get: get,
189
+ set: set
190
+ };
191
+ } else {
192
+ value = newValue;
193
+ }
194
+ if (newInit !== void 0) {
195
+ if (init === void 0) {
196
+ init = newInit;
197
+ } else if (typeof init === "function") {
198
+ init = [
199
+ init,
200
+ newInit
201
+ ];
202
+ } else {
203
+ init.push(newInit);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ if (kind === 0 || kind === 1) {
210
+ if (init === void 0) {
211
+ init = function(instance, init) {
212
+ return init;
213
+ };
214
+ } else if (typeof init !== "function") {
215
+ var ownInitializers = init;
216
+ init = function(instance, init) {
217
+ var value = init;
218
+ for(var i = 0; i < ownInitializers.length; i++){
219
+ value = ownInitializers[i].call(instance, value);
220
+ }
221
+ return value;
222
+ };
223
+ } else {
224
+ var originalInitializer = init;
225
+ init = function(instance, init) {
226
+ return originalInitializer.call(instance, init);
227
+ };
228
+ }
229
+ ret.push(init);
230
+ }
231
+ if (kind !== 0) {
232
+ if (kind === 1) {
233
+ desc.get = value.get;
234
+ desc.set = value.set;
235
+ } else if (kind === 2) {
236
+ desc.value = value;
237
+ } else if (kind === 3) {
238
+ desc.get = value;
239
+ } else if (kind === 4) {
240
+ desc.set = value;
241
+ }
242
+ if (isPrivate) {
243
+ if (kind === 1) {
244
+ ret.push(function(instance, args) {
245
+ return value.get.call(instance, args);
246
+ });
247
+ ret.push(function(instance, args) {
248
+ return value.set.call(instance, args);
249
+ });
250
+ } else if (kind === 2) {
251
+ ret.push(value);
252
+ } else {
253
+ ret.push(function(instance, args) {
254
+ return value.call(instance, args);
255
+ });
256
+ }
257
+ } else {
258
+ Object.defineProperty(base, name, desc);
259
+ }
260
+ }
261
+ }
262
+ function applyMemberDecs(Class, decInfos, metadata) {
263
+ var ret = [];
264
+ var protoInitializers;
265
+ var staticInitializers;
266
+ var existingProtoNonFields = new Map();
267
+ var existingStaticNonFields = new Map();
268
+ for(var i = 0; i < decInfos.length; i++){
269
+ var decInfo = decInfos[i];
270
+ if (!Array.isArray(decInfo)) continue;
271
+ var kind = decInfo[1];
272
+ var name = decInfo[2];
273
+ var isPrivate = decInfo.length > 3;
274
+ var isStatic = kind >= 5;
275
+ var base;
276
+ var initializers;
277
+ if (isStatic) {
278
+ base = Class;
279
+ kind = kind - 5;
280
+ staticInitializers = staticInitializers || [];
281
+ initializers = staticInitializers;
282
+ } else {
283
+ base = Class.prototype;
284
+ protoInitializers = protoInitializers || [];
285
+ initializers = protoInitializers;
286
+ }
287
+ if (kind !== 0 && !isPrivate) {
288
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
289
+ var existingKind = existingNonFields.get(name) || 0;
290
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
291
+ throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
292
+ } else if (!existingKind && kind > 2) {
293
+ existingNonFields.set(name, kind);
294
+ } else {
295
+ existingNonFields.set(name, true);
296
+ }
297
+ }
298
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
299
+ }
300
+ pushInitializers(ret, protoInitializers);
301
+ pushInitializers(ret, staticInitializers);
302
+ return ret;
303
+ }
304
+ function pushInitializers(ret, initializers) {
305
+ if (initializers) {
306
+ ret.push(function(instance) {
307
+ for(var i = 0; i < initializers.length; i++){
308
+ initializers[i].call(instance);
309
+ }
310
+ return instance;
311
+ });
312
+ }
313
+ }
314
+ function applyClassDecs(targetClass, classDecs, metadata) {
315
+ if (classDecs.length > 0) {
316
+ var initializers = [];
317
+ var newClass = targetClass;
318
+ var name = targetClass.name;
319
+ for(var i = classDecs.length - 1; i >= 0; i--){
320
+ var decoratorFinishedRef = {
321
+ v: false
322
+ };
323
+ try {
324
+ var nextNewClass = classDecs[i](newClass, {
325
+ kind: "class",
326
+ name: name,
327
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
328
+ metadata
329
+ });
330
+ } finally{
331
+ decoratorFinishedRef.v = true;
332
+ }
333
+ if (nextNewClass !== undefined) {
334
+ assertValidReturnValue(10, nextNewClass);
335
+ newClass = nextNewClass;
336
+ }
337
+ }
338
+ return [
339
+ defineMetadata(newClass, metadata),
340
+ function() {
341
+ for(var i = 0; i < initializers.length; i++){
342
+ initializers[i].call(newClass);
343
+ }
344
+ }
345
+ ];
346
+ }
347
+ }
348
+ function defineMetadata(Class, metadata) {
349
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
350
+ configurable: true,
351
+ enumerable: true,
352
+ value: metadata
353
+ });
354
+ }
355
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
356
+ if (parentClass !== void 0) {
357
+ var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
358
+ }
359
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
360
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
361
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
362
+ return {
363
+ e: e,
364
+ get c () {
365
+ return applyClassDecs(targetClass, classDecs, metadata);
366
+ }
367
+ };
368
+ };
369
+ }
370
+ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
+ return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
6
372
  }
373
+ var _dec, _dec1, _dec2, _initProto;
7
374
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
8
375
  import { padArrayEnd } from '@aztec/foundation/collection';
9
- import { Fr } from '@aztec/foundation/fields';
376
+ import { Fr } from '@aztec/foundation/curves/bn254';
10
377
  import { createLogger } from '@aztec/foundation/log';
11
- import { Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
378
+ import { sleep } from '@aztec/foundation/sleep';
379
+ import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
12
380
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
13
- import { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer';
381
+ import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
14
382
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
15
- import { PublicDataWrite } from '@aztec/stdlib/avm';
383
+ import { AvmCircuitInputs, AvmExecutionHints, PublicDataWrite } from '@aztec/stdlib/avm';
384
+ import { computeTransactionFee } from '@aztec/stdlib/fees';
16
385
  import { Gas } from '@aztec/stdlib/gas';
386
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
17
387
  import { MerkleTreeId } from '@aztec/stdlib/trees';
18
- import { NestedProcessReturnValues, Tx, TxExecutionPhase, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
388
+ import { NestedProcessReturnValues, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
19
389
  import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
20
390
  import { ForkCheckpoint } from '@aztec/world-state/native';
21
- import { WorldStateDB } from '../public_db_sources.js';
22
- import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
391
+ import { AssertionError } from 'assert';
392
+ import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
393
+ import { TelemetryCppPublicTxSimulator } from '../public_tx_simulator/index.js';
394
+ import { GuardedMerkleTreeOperations } from './guarded_merkle_tree.js';
23
395
  import { PublicProcessorMetrics } from './public_processor_metrics.js';
24
396
  /**
25
397
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
@@ -27,24 +399,24 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
27
399
  contractDataSource;
28
400
  dateProvider;
29
401
  telemetryClient;
30
- constructor(contractDataSource, dateProvider, telemetryClient = getTelemetryClient()){
402
+ constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient()){
31
403
  this.contractDataSource = contractDataSource;
32
404
  this.dateProvider = dateProvider;
33
405
  this.telemetryClient = telemetryClient;
34
406
  }
35
407
  /**
36
408
  * Creates a new instance of a PublicProcessor.
37
- * @param historicalHeader - The header of a block previous to the one in which the tx is included.
38
409
  * @param globalVariables - The global variables for the block being processed.
39
410
  * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
40
411
  * @returns A new instance of a PublicProcessor.
41
- */ create(merkleTree, globalVariables, skipFeeEnforcement) {
42
- const worldStateDB = new WorldStateDB(merkleTree, this.contractDataSource);
43
- const publicTxSimulator = this.createPublicTxSimulator(merkleTree, worldStateDB, globalVariables, /*doMerkleOperations=*/ true, skipFeeEnforcement, this.telemetryClient);
44
- return new PublicProcessor(merkleTree, globalVariables, worldStateDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
412
+ */ create(merkleTree, globalVariables, config) {
413
+ const contractsDB = new PublicContractsDB(this.contractDataSource);
414
+ const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
415
+ const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
416
+ return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
45
417
  }
46
- createPublicTxSimulator(db, worldStateDB, globalVariables, doMerkleOperations, skipFeeEnforcement, telemetryClient) {
47
- return new PublicTxSimulator(db, worldStateDB, globalVariables, doMerkleOperations, skipFeeEnforcement, telemetryClient);
418
+ createPublicTxSimulator(merkleTree, contractsDB, globalVariables, config) {
419
+ return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
48
420
  }
49
421
  }
50
422
  class PublicProcessorTimeoutError extends Error {
@@ -53,24 +425,53 @@ class PublicProcessorTimeoutError extends Error {
53
425
  this.name = 'PublicProcessorTimeoutError';
54
426
  }
55
427
  }
428
+ _dec = trackSpan('PublicProcessor.processTx', (tx)=>({
429
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
430
+ })), _dec1 = trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
431
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
432
+ })), _dec2 = trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
433
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
434
+ }));
56
435
  /**
57
436
  * Converts Txs lifted from the P2P module into ProcessedTx objects by executing
58
437
  * any public function calls in them. Txs with private calls only are unaffected.
59
438
  */ export class PublicProcessor {
60
- db;
61
439
  globalVariables;
62
- worldStateDB;
440
+ guardedMerkleTree;
441
+ contractsDB;
63
442
  publicTxSimulator;
64
443
  dateProvider;
65
444
  log;
445
+ opts;
446
+ static{
447
+ ({ e: [_initProto] } = _apply_decs_2203_r(this, [
448
+ [
449
+ _dec,
450
+ 2,
451
+ "processTx"
452
+ ],
453
+ [
454
+ _dec1,
455
+ 2,
456
+ "processPrivateOnlyTx"
457
+ ],
458
+ [
459
+ _dec2,
460
+ 2,
461
+ "processTxWithPublicCalls"
462
+ ]
463
+ ], []));
464
+ }
66
465
  metrics;
67
- constructor(db, globalVariables, worldStateDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor')){
68
- this.db = db;
466
+ constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor'), opts = {}){
69
467
  this.globalVariables = globalVariables;
70
- this.worldStateDB = worldStateDB;
468
+ this.guardedMerkleTree = guardedMerkleTree;
469
+ this.contractsDB = contractsDB;
71
470
  this.publicTxSimulator = publicTxSimulator;
72
471
  this.dateProvider = dateProvider;
73
472
  this.log = log;
473
+ this.opts = opts;
474
+ _initProto(this);
74
475
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
75
476
  }
76
477
  get tracer() {
@@ -79,19 +480,22 @@ class PublicProcessorTimeoutError extends Error {
79
480
  /**
80
481
  * Run each tx through the public circuit and the public kernel circuit if needed.
81
482
  * @param txs - Txs to process.
82
- * @param processedTxHandler - Handler for processed txs in the context of block building or proving.
483
+ * @param limits - Limits for processing the txs.
484
+ * @param validator - Pre-process validator and nullifier cache to use for processing the txs.
83
485
  * @returns The list of processed txs with their circuit simulation outputs.
84
- */ async process(txs, limits = {}, validators = {}) {
85
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas } = limits;
86
- const { preprocessValidator, postprocessValidator, nullifierCache } = validators;
486
+ */ async process(txs, limits = {}, validator = {}) {
487
+ const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
488
+ const { preprocessValidator, nullifierCache } = validator;
87
489
  const result = [];
490
+ const usedTxs = [];
88
491
  const failed = [];
89
492
  const timer = new Timer();
90
493
  let totalSizeInBytes = 0;
91
494
  let returns = [];
92
495
  let totalPublicGas = new Gas(0, 0);
93
496
  let totalBlockGas = new Gas(0, 0);
94
- for await (const origTx of txs){
497
+ let totalBlobFields = 0;
498
+ for await (const tx of txs){
95
499
  // Only process up to the max tx limit
96
500
  if (maxTransactions !== undefined && result.length >= maxTransactions) {
97
501
  this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
@@ -103,8 +507,8 @@ class PublicProcessorTimeoutError extends Error {
103
507
  break;
104
508
  }
105
509
  // Skip this tx if it'd exceed max block size
106
- const txHash = (await origTx.getTxHash()).toString();
107
- const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
510
+ const txHash = tx.getTxHash().toString();
511
+ const preTxSizeInBytes = tx.getEstimatedPrivateTxEffectsSize();
108
512
  if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
109
513
  this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
110
514
  txHash,
@@ -115,7 +519,7 @@ class PublicProcessorTimeoutError extends Error {
115
519
  continue;
116
520
  }
117
521
  // Skip this tx if its gas limit would exceed the block gas limit
118
- const txGasLimit = origTx.data.constants.txContext.gasSettings.gasLimits;
522
+ const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
119
523
  if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
120
524
  this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
121
525
  txHash,
@@ -125,15 +529,13 @@ class PublicProcessorTimeoutError extends Error {
125
529
  });
126
530
  continue;
127
531
  }
128
- // The processor modifies the tx objects in place, so we need to clone them.
129
- const tx = Tx.clone(origTx);
130
532
  // We validate the tx before processing it, to avoid unnecessary work.
131
533
  if (preprocessValidator) {
132
534
  const result = await preprocessValidator.validateTx(tx);
133
- const txHash = await tx.getTxHash();
535
+ const txHash = tx.getTxHash();
134
536
  if (result.result === 'invalid') {
135
537
  const reason = result.reason.join(', ');
136
- this.log.warn(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
538
+ this.log.debug(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
137
539
  failed.push({
138
540
  tx,
139
541
  error: new Error(`Tx failed preprocess validation: ${reason}`)
@@ -142,7 +544,7 @@ class PublicProcessorTimeoutError extends Error {
142
544
  continue;
143
545
  } else if (result.result === 'skipped') {
144
546
  const reason = result.reason.join(', ');
145
- this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
547
+ this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
146
548
  returns.push(new NestedProcessReturnValues([]));
147
549
  continue;
148
550
  } else {
@@ -152,13 +554,23 @@ class PublicProcessorTimeoutError extends Error {
152
554
  // We checkpoint the transaction here, then within the try/catch we
153
555
  // 1. Revert the checkpoint if the tx fails or needs to be discarded for any reason
154
556
  // 2. Commit the transaction in the finally block. Note that by using the ForkCheckpoint lifecycle only the first commit/revert takes effect
155
- const checkpoint = await ForkCheckpoint.new(this.worldStateDB);
557
+ // By doing this, every transaction starts on a fresh checkpoint and it's state updates only make it to the fork if this checkpoint is committed.
558
+ // Note: We use the underlying fork here not the guarded one, this ensures that it's not impacted by stopping the guarded version
559
+ const checkpoint = await ForkCheckpoint.new(this.guardedMerkleTree.getUnderlyingFork());
560
+ const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
561
+ this.contractsDB.createCheckpoint();
156
562
  try {
157
563
  const [processedTx, returnValues] = await this.processTx(tx, deadline);
564
+ // Inject a fake processing failure after N txs if requested
565
+ const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
566
+ if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
567
+ throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
568
+ }
569
+ const txBlobFields = processedTx.txEffect.getNumBlobFields();
158
570
  // If the actual size of this tx would exceed block size, skip it
159
- const txSize = processedTx.txEffect.getDASize();
571
+ const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
160
572
  if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
161
- this.log.warn(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
573
+ this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
162
574
  txHash,
163
575
  sizeInBytes: txSize,
164
576
  totalSizeInBytes,
@@ -166,64 +578,78 @@ class PublicProcessorTimeoutError extends Error {
166
578
  });
167
579
  // Need to revert the checkpoint here and don't go any further
168
580
  await checkpoint.revert();
581
+ this.contractsDB.revertCheckpoint();
169
582
  continue;
170
583
  }
171
- // Re-validate the transaction
172
- if (postprocessValidator) {
173
- // Only accept processed transactions that are not double-spends,
174
- // public functions emitting nullifiers would pass earlier check but fail here.
175
- // Note that we're checking all nullifiers generated in the private execution twice,
176
- // we could store the ones already checked and skip them here as an optimization.
177
- // TODO(palla/txs): Can we get into this case? AVM validates this. We should be able to remove it.
178
- const result = await postprocessValidator.validateTx(processedTx);
179
- if (result.result !== 'valid') {
180
- const reason = result.reason.join(', ');
181
- this.log.error(`Rejecting tx ${processedTx.hash} after processing: ${reason}.`);
182
- failed.push({
183
- tx,
184
- error: new Error(`Tx failed post-process validation: ${reason}`)
185
- });
186
- // Need to revert the checkpoint here and don't go any further
187
- await checkpoint.revert();
188
- continue;
189
- } else {
190
- this.log.trace(`Tx ${txHash.toString()} is valid post processing.`);
191
- }
192
- }
193
- if (!tx.hasPublicCalls()) {
194
- // If there are no public calls, perform all tree insertions for side effects from private
195
- // When there are public calls, the PublicTxSimulator & AVM handle tree insertions.
196
- await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
197
- // Add any contracts registered/deployed in this private-only tx to the block-level cache
198
- // (add to tx-level cache and then commit to block-level cache)
199
- await this.worldStateDB.addNewContracts(tx);
200
- this.worldStateDB.commitContractsForTx();
584
+ // If the actual blob fields of this tx would exceed the limit, skip it
585
+ if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
586
+ this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
587
+ txHash,
588
+ txBlobFields,
589
+ totalBlobFields,
590
+ maxBlobFields
591
+ });
592
+ // Need to revert the checkpoint here and don't go any further
593
+ await checkpoint.revert();
594
+ this.contractsDB.revertCheckpoint();
595
+ continue;
201
596
  }
597
+ // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
598
+ // I'd rather pass the validators the processedTx as well and let them deal with it.
202
599
  nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map((n)=>n.toBuffer()));
203
600
  result.push(processedTx);
601
+ usedTxs.push(tx);
204
602
  returns = returns.concat(returnValues);
205
603
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
206
604
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
207
605
  totalSizeInBytes += txSize;
606
+ totalBlobFields += txBlobFields;
208
607
  } catch (err) {
209
- // Roll back state to start of TX before proceeding to next TX
210
- await checkpoint.revert();
211
608
  if (err?.name === 'PublicProcessorTimeoutError') {
212
609
  this.log.warn(`Stopping tx processing due to timeout.`);
610
+ // We hit the transaction execution deadline.
611
+ // There may still be a transaction executing on a worker thread (C++ via NAPI).
612
+ // Signal cancellation AND WAIT for the simulation to actually stop.
613
+ // This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
614
+ // and won't check the cancellation flag until that operation completes.
615
+ // Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
616
+ // Wait for C++ to stop gracefully.
617
+ await this.publicTxSimulator.cancel?.();
618
+ // Now stop the guarded fork to prevent any further TS-side access to the world state.
619
+ await this.guardedMerkleTree.stop();
620
+ // We now know there can't be any further access to world state. The fork is in a state where there is:
621
+ // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
622
+ // 2. Possible state updates on that checkpoint or any others created during execution.
623
+ // First we revert a checkpoint as managed by the ForkCheckpoint. This will revert whatever is the current checkpoint
624
+ // which may not be the one originally created by this object. But that is ok, we do this to fulfil the ForkCheckpoint
625
+ // lifecycle expectations and ensure it doesn't attempt to commit later on.
626
+ await checkpoint.revert();
627
+ // Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
628
+ // This needs to be done directly on the underlying fork as the guarded fork has been stopped.
629
+ await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
630
+ // Revert any contracts added to the DB for the tx.
631
+ this.contractsDB.revertCheckpoint();
632
+ // Ensure we're at the same state as when we started processing this tx.
633
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
213
634
  break;
214
635
  }
215
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
636
+ // Roll back state to start of TX before proceeding to next TX
637
+ await checkpoint.revert();
638
+ await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
639
+ this.contractsDB.revertCheckpoint();
640
+ const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
216
641
  this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
217
642
  failed.push({
218
643
  tx,
219
644
  error: err instanceof Error ? err : new Error(errorMessage)
220
645
  });
221
646
  returns.push(new NestedProcessReturnValues([]));
647
+ // Ensure we're at the same state as when we started processing this tx.
648
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
222
649
  } finally{
223
- // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was reverted
650
+ // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
224
651
  await checkpoint.commit();
225
- // The tx-level contracts cache should not live on to the next tx
226
- this.worldStateDB.clearContractsForTx();
652
+ this.contractsDB.commitCheckpointOkIfNone();
227
653
  }
228
654
  }
229
655
  const duration = timer.s();
@@ -239,12 +665,26 @@ class PublicProcessorTimeoutError extends Error {
239
665
  return [
240
666
  result,
241
667
  failed,
668
+ usedTxs,
242
669
  returns
243
670
  ];
244
671
  }
672
+ async checkWorldStateUnchanged(startStateReference, txHash, cause) {
673
+ const endStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
674
+ if (!startStateReference.equals(endStateReference)) {
675
+ this.log.warn(`Fork state reference changed by tx ${txHash} after error in public processor`, {
676
+ expected: startStateReference.toInspect(),
677
+ actual: endStateReference.toInspect(),
678
+ cause
679
+ });
680
+ throw new Error(`Fork state reference changed by tx ${txHash} after error in public processor`, {
681
+ cause
682
+ });
683
+ }
684
+ }
245
685
  async processTx(tx, deadline) {
246
686
  const [time, [processedTx, returnValues]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
247
- this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls in ${time}ms`, {
687
+ this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`, {
248
688
  txHash: processedTx.hash,
249
689
  txFee: processedTx.txEffect.transactionFee.toBigInt(),
250
690
  revertCode: processedTx.txEffect.revertCode.getCode(),
@@ -264,7 +704,7 @@ class PublicProcessorTimeoutError extends Error {
264
704
  returnValues ?? []
265
705
  ];
266
706
  }
267
- async doTreeInsertionsForPrivateOnlyTx(processedTx, txValidator) {
707
+ async doTreeInsertionsForPrivateOnlyTx(processedTx) {
268
708
  const treeInsertionStart = process.hrtime.bigint();
269
709
  // Update the state so that the next tx in the loop has the correct .startState
270
710
  // NB: before this change, all .startStates were actually incorrect, but the issue was never caught because we either:
@@ -272,29 +712,31 @@ class PublicProcessorTimeoutError extends Error {
272
712
  // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop
273
713
  // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
274
714
  // The below is taken from buildBaseRollupHints:
275
- await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
715
+ await this.guardedMerkleTree.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
276
716
  try {
277
- await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map((n)=>n.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
278
- } catch (error) {
279
- if (txValidator) {
280
- // Ideally the validator has already caught this above, but just in case:
281
- throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`);
282
- } else {
283
- // We have no validator and assume this call should blindly process txs with duplicates being caught later
284
- this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`);
285
- }
717
+ await this.guardedMerkleTree.batchInsert(MerkleTreeId.NULLIFIER_TREE, padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map((n)=>n.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
718
+ } catch (cause) {
719
+ throw new Error(`Transaction ${processedTx.hash} failed with duplicate nullifiers`, {
720
+ cause
721
+ });
286
722
  }
287
- // The only public data write should be for fee payment
288
- await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, processedTx.txEffect.publicDataWrites.map((x)=>x.toBuffer()));
289
723
  const treeInsertionEnd = process.hrtime.bigint();
290
724
  this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
291
725
  }
292
726
  /** Processes the given tx within deadline. Returns timeout if deadline is hit. */ async processTxWithinDeadline(tx, deadline) {
293
- const processFn = tx.hasPublicCalls() ? ()=>this.processTxWithPublicCalls(tx) : ()=>this.processPrivateOnlyTx(tx);
727
+ const innerProcessFn = tx.hasPublicCalls() ? ()=>this.processTxWithPublicCalls(tx) : ()=>this.processPrivateOnlyTx(tx);
728
+ // Fake a delay per tx if instructed (used for tests)
729
+ const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
730
+ const processFn = fakeDelayPerTxMs && fakeDelayPerTxMs > 0 ? async ()=>{
731
+ const result = await innerProcessFn();
732
+ this.log.warn(`Sleeping ${fakeDelayPerTxMs}ms after processing tx ${tx.getTxHash().toString()}`);
733
+ await sleep(fakeDelayPerTxMs);
734
+ return result;
735
+ } : innerProcessFn;
294
736
  if (!deadline) {
295
737
  return await processFn();
296
738
  }
297
- const txHash = await tx.getTxHash();
739
+ const txHash = tx.getTxHash();
298
740
  const timeout = +deadline - this.dateProvider.now();
299
741
  if (timeout <= 0) {
300
742
  throw new PublicProcessorTimeoutError();
@@ -310,26 +752,30 @@ class PublicProcessorTimeoutError extends Error {
310
752
  * Creates the public data write for paying the tx fee.
311
753
  * This is used in private only txs, since for txs with public calls
312
754
  * the avm handles the fee payment itself.
313
- */ async getFeePaymentPublicDataWrite(txFee, feePayer) {
755
+ */ async performFeePaymentPublicDataWrite(txFee, feePayer) {
314
756
  const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
315
757
  const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
316
758
  const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
759
+ // This high-level db is used as a convenient helper. It could be done with the merkleTree directly.
760
+ const treesDB = new PublicTreesDB(this.guardedMerkleTree);
317
761
  this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
318
- const balance = await this.worldStateDB.storageRead(feeJuiceAddress, balanceSlot);
762
+ const balance = await treesDB.storageRead(feeJuiceAddress, balanceSlot);
319
763
  if (balance.lt(txFee)) {
320
764
  throw new Error(`Not enough balance for fee payer to pay for transaction (got ${balance.toBigInt()} needs ${txFee.toBigInt()})`);
321
765
  }
322
766
  const updatedBalance = balance.sub(txFee);
323
- await this.worldStateDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
767
+ await treesDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
324
768
  return new PublicDataWrite(leafSlot, updatedBalance);
325
769
  }
326
770
  async processPrivateOnlyTx(tx) {
327
771
  const gasFees = this.globalVariables.gasFees;
328
- const transactionFee = tx.data.gasUsed.computeFee(gasFees);
329
- const feePaymentPublicDataWrite = await this.getFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
330
- const processedTx = await makeProcessedTxFromPrivateOnlyTx(tx, transactionFee, feePaymentPublicDataWrite, this.globalVariables);
331
- const siloedContractClassLogs = await tx.filterContractClassLogs(tx.data.getNonEmptyContractClassLogsHashes(), true);
332
- this.metrics.recordClassRegistration(...siloedContractClassLogs.filter((log)=>ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)).map((log)=>ContractClassRegisteredEvent.fromLog(log)));
772
+ const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
773
+ const feePaymentPublicDataWrite = await this.performFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
774
+ const processedTx = makeProcessedTxFromPrivateOnlyTx(tx, transactionFee, feePaymentPublicDataWrite, this.globalVariables);
775
+ this.metrics.recordClassPublication(...tx.getContractClassLogs().filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
776
+ // Fee payment insertion has already been done. Do the rest.
777
+ await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
778
+ await this.contractsDB.addNewContracts(tx);
333
779
  return [
334
780
  processedTx,
335
781
  undefined
@@ -337,43 +783,32 @@ class PublicProcessorTimeoutError extends Error {
337
783
  }
338
784
  async processTxWithPublicCalls(tx) {
339
785
  const timer = new Timer();
340
- const { avmProvingRequest, gasUsed, revertCode, revertReason, processedPhases } = await this.publicTxSimulator.simulate(tx);
341
- if (!avmProvingRequest) {
342
- this.metrics.recordFailedTx();
343
- throw new Error('Avm proving result was not generated.');
344
- }
345
- processedPhases.forEach((phase)=>{
346
- if (phase.reverted) {
347
- this.metrics.recordRevertedPhase(phase.phase);
348
- } else {
349
- this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
350
- }
351
- });
352
- const siloedContractClassLogs = await tx.filterContractClassLogs(tx.data.getNonEmptyContractClassLogsHashes(), true);
353
- this.metrics.recordClassRegistration(...siloedContractClassLogs.filter((log)=>ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)).map((log)=>ContractClassRegisteredEvent.fromLog(log)));
354
- const phaseCount = processedPhases.length;
786
+ const result = await this.publicTxSimulator.simulate(tx);
787
+ // TODO: use the callStackMetadata here to extract more data about public execution
788
+ const { hints, publicInputs, publicTxEffect, gasUsed, revertCode/*callStackMetadata*/ } = result;
789
+ const contractClassLogs = revertCode.isOK() ? tx.getContractClassLogs() : tx.getSplitContractClassLogs(false);
790
+ this.metrics.recordClassPublication(...contractClassLogs.filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
791
+ // TODO(fcarreiro): remove phase count metric.
355
792
  const durationMs = timer.ms();
356
- this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
357
- const processedTx = await makeProcessedTxFromTxWithPublicCalls(tx, avmProvingRequest, gasUsed, revertCode, revertReason);
358
- const returnValues = processedPhases.find(({ phase })=>phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
793
+ this.metrics.recordTx(/*phaseCount=*/ 1, durationMs, gasUsed.publicGas);
794
+ // Extract the return values from the call stack metadata.
795
+ const appLogicReturnValues = result.getAppLogicReturnValues();
796
+ // Extract the revert reason from the call stack metadata.
797
+ const revertReason = result.findRevertReason();
798
+ // Create proving request if we have hints and public inputs.
799
+ const avmProvingRequest = hints && publicInputs ? PublicProcessor.generateProvingRequest(publicInputs, hints) : undefined;
800
+ const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, this.globalVariables, avmProvingRequest, publicTxEffect, gasUsed, revertCode, revertReason);
359
801
  return [
360
802
  processedTx,
361
- returnValues
803
+ appLogicReturnValues
362
804
  ];
363
805
  }
806
+ /**
807
+ * Generate the proving request for the AVM circuit.
808
+ */ static generateProvingRequest(publicInputs, hints = AvmExecutionHints.empty()) {
809
+ return {
810
+ type: ProvingRequestType.PUBLIC_VM,
811
+ inputs: new AvmCircuitInputs(hints, publicInputs)
812
+ };
813
+ }
364
814
  }
365
- _ts_decorate([
366
- trackSpan('PublicProcessor.processTx', async (tx)=>({
367
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
368
- }))
369
- ], PublicProcessor.prototype, "processTx", null);
370
- _ts_decorate([
371
- trackSpan('PublicProcessor.processPrivateOnlyTx', async (tx)=>({
372
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
373
- }))
374
- ], PublicProcessor.prototype, "processPrivateOnlyTx", null);
375
- _ts_decorate([
376
- trackSpan('PublicProcessor.processTxWithPublicCalls', async (tx)=>({
377
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
378
- }))
379
- ], PublicProcessor.prototype, "processTxWithPublicCalls", null);