@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.001888fc

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