@aztec/simulator 0.0.0-test.0 → 0.0.1-commit.023c3e5

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 (528) hide show
  1. package/README.md +8 -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 -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 +27 -35
  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/avm_simulation_tester.d.ts +6 -5
  84. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/avm_simulation_tester.js +26 -18
  86. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  87. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  88. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  89. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  90. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/initializers.js +45 -0
  92. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  93. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  94. package/dest/public/avm/fixtures/utils.js +96 -0
  95. package/dest/public/avm/index.d.ts +1 -3
  96. package/dest/public/avm/index.d.ts.map +1 -1
  97. package/dest/public/avm/index.js +0 -2
  98. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  99. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/accrued_substate.js +58 -55
  101. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  102. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  104. package/dest/public/avm/opcodes/arithmetic.d.ts +14 -2
  105. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  107. package/dest/public/avm/opcodes/bitwise.d.ts +8 -16
  108. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/bitwise.js +22 -29
  110. package/dest/public/avm/opcodes/comparators.d.ts +1 -1
  111. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/comparators.js +3 -3
  113. package/dest/public/avm/opcodes/contract.d.ts +3 -4
  114. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/contract.js +11 -12
  116. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  117. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/control_flow.js +13 -11
  119. package/dest/public/avm/opcodes/conversion.d.ts +4 -3
  120. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/conversion.js +270 -6
  122. package/dest/public/avm/opcodes/ec_add.d.ts +3 -3
  123. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/ec_add.js +21 -12
  125. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  126. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/environment_getters.js +20 -22
  128. package/dest/public/avm/opcodes/external_calls.d.ts +14 -13
  129. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/external_calls.js +52 -46
  131. package/dest/public/avm/opcodes/hashing.d.ts +7 -7
  132. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/hashing.js +24 -19
  134. package/dest/public/avm/opcodes/index.d.ts +1 -1
  135. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  136. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/instruction.js +23 -19
  138. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  139. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  140. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  141. package/dest/public/avm/opcodes/memory.d.ts +15 -15
  142. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  143. package/dest/public/avm/opcodes/memory.js +52 -48
  144. package/dest/public/avm/opcodes/misc.d.ts +4 -3
  145. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  146. package/dest/public/avm/opcodes/misc.js +42 -17
  147. package/dest/public/avm/opcodes/storage.d.ts +14 -13
  148. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  149. package/dest/public/avm/opcodes/storage.js +39 -27
  150. package/dest/public/avm/revert_reason.d.ts +18 -0
  151. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  152. package/dest/public/avm/revert_reason.js +39 -0
  153. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  154. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  155. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  156. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  157. package/dest/public/avm/serialization/bytecode_serialization.js +79 -75
  158. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  159. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  160. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  161. package/dest/public/avm/test_utils.d.ts +12 -15
  162. package/dest/public/avm/test_utils.d.ts.map +1 -1
  163. package/dest/public/avm/test_utils.js +17 -25
  164. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  165. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  166. package/dest/public/contracts_db_checkpoint.js +30 -0
  167. package/dest/public/db_interfaces.d.ts +68 -0
  168. package/dest/public/db_interfaces.d.ts.map +1 -0
  169. package/dest/public/db_interfaces.js +3 -0
  170. package/dest/public/debug_fn_name.d.ts +18 -0
  171. package/dest/public/debug_fn_name.d.ts.map +1 -0
  172. package/dest/public/debug_fn_name.js +37 -0
  173. package/dest/public/executor_metrics.d.ts +12 -4
  174. package/dest/public/executor_metrics.d.ts.map +1 -1
  175. package/dest/public/executor_metrics.js +33 -23
  176. package/dest/public/executor_metrics_interface.d.ts +10 -0
  177. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  178. package/dest/public/executor_metrics_interface.js +1 -0
  179. package/dest/public/fixtures/amm_test.d.ts +10 -0
  180. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  181. package/dest/public/fixtures/amm_test.js +213 -0
  182. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  183. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  184. package/dest/public/fixtures/bulk_test.js +262 -0
  185. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  186. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  187. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  188. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  189. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  190. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  191. package/dest/public/fixtures/index.d.ts +10 -1
  192. package/dest/public/fixtures/index.d.ts.map +1 -1
  193. package/dest/public/fixtures/index.js +9 -0
  194. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  195. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  196. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  197. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  198. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  199. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  200. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +55 -15
  201. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  202. package/dest/public/fixtures/public_tx_simulation_tester.js +138 -72
  203. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  204. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  205. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  206. package/dest/public/fixtures/token_test.d.ts +12 -0
  207. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  208. package/dest/public/fixtures/token_test.js +96 -0
  209. package/dest/public/fixtures/utils.d.ts +18 -5
  210. package/dest/public/fixtures/utils.d.ts.map +1 -1
  211. package/dest/public/fixtures/utils.js +102 -59
  212. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  213. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  214. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  215. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  216. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  217. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  218. package/dest/public/hinting_db_sources.d.ts +80 -0
  219. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  220. package/dest/public/hinting_db_sources.js +355 -0
  221. package/dest/public/index.d.ts +6 -9
  222. package/dest/public/index.d.ts.map +1 -1
  223. package/dest/public/index.js +4 -7
  224. package/dest/public/public_db_sources.d.ts +54 -103
  225. package/dest/public/public_db_sources.d.ts.map +1 -1
  226. package/dest/public/public_db_sources.js +222 -195
  227. package/dest/public/public_errors.d.ts +12 -0
  228. package/dest/public/public_errors.d.ts.map +1 -0
  229. package/dest/public/public_errors.js +13 -0
  230. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  231. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  232. package/dest/public/public_processor/guarded_merkle_tree.js +113 -0
  233. package/dest/public/public_processor/public_processor.d.ts +28 -38
  234. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  235. package/dest/public/public_processor/public_processor.js +576 -136
  236. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -4
  237. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  238. package/dest/public/public_processor/public_processor_metrics.js +29 -46
  239. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
  240. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  241. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  242. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  243. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  244. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +132 -0
  245. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  246. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  247. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  248. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  249. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  250. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  251. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  252. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  253. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  254. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  255. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  256. package/dest/public/public_tx_simulator/factories.js +28 -0
  257. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  258. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  259. package/dest/public/public_tx_simulator/index.js +5 -0
  260. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  261. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  262. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  263. package/dest/public/public_tx_simulator/public_tx_context.d.ts +25 -31
  264. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  265. package/dest/public/public_tx_simulator/public_tx_context.js +75 -95
  266. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +38 -58
  267. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  268. package/dest/public/public_tx_simulator/public_tx_simulator.js +220 -207
  269. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  270. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  271. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  272. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  273. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  274. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
  275. package/dest/public/side_effect_errors.d.ts +42 -2
  276. package/dest/public/side_effect_errors.d.ts.map +1 -1
  277. package/dest/public/side_effect_errors.js +70 -1
  278. package/dest/public/side_effect_trace.d.ts +24 -69
  279. package/dest/public/side_effect_trace.d.ts.map +1 -1
  280. package/dest/public/side_effect_trace.js +74 -124
  281. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  282. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  283. package/dest/public/state_manager/index.d.ts +2 -0
  284. package/dest/public/state_manager/index.d.ts.map +1 -0
  285. package/dest/public/state_manager/index.js +1 -0
  286. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  287. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  288. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  289. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  290. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  291. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  292. package/dest/public/state_manager/state_manager.d.ts +170 -0
  293. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  294. package/dest/public/state_manager/state_manager.js +402 -0
  295. package/dest/public/test_executor_metrics.d.ts +56 -0
  296. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  297. package/dest/public/test_executor_metrics.js +307 -0
  298. package/dest/public/unique_class_ids.d.ts +1 -1
  299. package/dest/public/unique_class_ids.d.ts.map +1 -1
  300. package/dest/public/utils.d.ts +3 -5
  301. package/dest/public/utils.d.ts.map +1 -1
  302. package/dest/public/utils.js +4 -21
  303. package/dest/server.d.ts +7 -4
  304. package/dest/server.d.ts.map +1 -1
  305. package/dest/server.js +5 -2
  306. package/dest/testing.d.ts +2 -0
  307. package/dest/testing.d.ts.map +1 -0
  308. package/dest/testing.js +1 -0
  309. package/package.json +39 -33
  310. package/src/client.ts +5 -3
  311. package/src/common/errors.ts +80 -45
  312. package/src/common/index.ts +0 -1
  313. package/src/private/acvm/acvm.ts +21 -35
  314. package/src/private/acvm/acvm_types.ts +1 -1
  315. package/src/private/acvm/deserialize.ts +36 -30
  316. package/src/private/acvm/index.ts +0 -1
  317. package/src/private/acvm/serialize.ts +64 -1
  318. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +57 -28
  319. package/src/private/acvm_wasm.ts +76 -0
  320. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  321. package/src/private/circuit_recording/circuit_recorder.ts +263 -0
  322. package/src/private/circuit_recording/file_circuit_recorder.ts +163 -0
  323. package/src/private/circuit_recording/memory_circuit_recorder.ts +13 -0
  324. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  325. package/src/private/circuit_simulator.ts +90 -0
  326. package/src/private/{providers/factory.ts → factory.ts} +13 -10
  327. package/src/public/avm/avm_context.ts +6 -6
  328. package/src/public/avm/avm_contract_call_result.ts +23 -9
  329. package/src/public/avm/avm_execution_environment.ts +17 -5
  330. package/src/public/avm/avm_gas.ts +26 -38
  331. package/src/public/avm/avm_machine_state.ts +12 -6
  332. package/src/public/avm/avm_memory_types.ts +24 -7
  333. package/src/public/avm/avm_simulator.ts +57 -62
  334. package/src/public/avm/avm_simulator_interface.ts +8 -0
  335. package/src/public/avm/calldata.ts +100 -0
  336. package/src/public/avm/errors.ts +20 -75
  337. package/src/public/avm/fixtures/avm_simulation_tester.ts +41 -24
  338. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  339. package/src/public/avm/fixtures/initializers.ts +103 -0
  340. package/src/public/avm/fixtures/utils.ts +151 -0
  341. package/src/public/avm/index.ts +0 -2
  342. package/src/public/avm/opcodes/accrued_substate.ts +81 -48
  343. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  344. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  345. package/src/public/avm/opcodes/bitwise.ts +33 -29
  346. package/src/public/avm/opcodes/comparators.ts +6 -3
  347. package/src/public/avm/opcodes/contract.ts +10 -10
  348. package/src/public/avm/opcodes/control_flow.ts +19 -10
  349. package/src/public/avm/opcodes/conversion.ts +29 -5
  350. package/src/public/avm/opcodes/ec_add.ts +22 -10
  351. package/src/public/avm/opcodes/environment_getters.ts +28 -23
  352. package/src/public/avm/opcodes/external_calls.ts +70 -36
  353. package/src/public/avm/opcodes/hashing.ts +39 -13
  354. package/src/public/avm/opcodes/instruction.ts +31 -21
  355. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  356. package/src/public/avm/opcodes/memory.ts +81 -42
  357. package/src/public/avm/opcodes/misc.ts +61 -19
  358. package/src/public/avm/opcodes/storage.ts +47 -23
  359. package/src/public/avm/revert_reason.ts +58 -0
  360. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  361. package/src/public/avm/serialization/bytecode_serialization.ts +89 -80
  362. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  363. package/src/public/avm/test_utils.ts +25 -42
  364. package/src/public/contracts_db_checkpoint.ts +41 -0
  365. package/src/public/db_interfaces.ts +76 -0
  366. package/src/public/debug_fn_name.ts +52 -0
  367. package/src/public/executor_metrics.ts +49 -23
  368. package/src/public/executor_metrics_interface.ts +15 -0
  369. package/src/public/fixtures/amm_test.ts +331 -0
  370. package/src/public/fixtures/bulk_test.ts +169 -0
  371. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  372. package/src/public/fixtures/custom_bytecode_tests.ts +228 -0
  373. package/src/public/fixtures/index.ts +13 -0
  374. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  375. package/src/public/fixtures/opcode_spammer.ts +1721 -0
  376. package/src/public/fixtures/public_tx_simulation_tester.ts +223 -114
  377. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  378. package/src/public/fixtures/token_test.ts +148 -0
  379. package/src/public/fixtures/utils.ts +141 -69
  380. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  381. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  382. package/src/public/hinting_db_sources.ts +607 -0
  383. package/src/public/index.ts +11 -8
  384. package/src/public/public_db_sources.ts +290 -260
  385. package/src/public/public_errors.ts +14 -0
  386. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  387. package/src/public/public_processor/public_processor.ts +257 -179
  388. package/src/public/public_processor/public_processor_metrics.ts +18 -46
  389. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +124 -0
  390. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +211 -0
  391. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  392. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  393. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  394. package/src/public/public_tx_simulator/factories.ts +43 -0
  395. package/src/public/public_tx_simulator/index.ts +7 -0
  396. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  397. package/src/public/public_tx_simulator/public_tx_context.ts +179 -199
  398. package/src/public/public_tx_simulator/public_tx_simulator.ts +316 -263
  399. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  400. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  401. package/src/public/side_effect_errors.ts +91 -1
  402. package/src/public/side_effect_trace.ts +99 -322
  403. package/src/public/side_effect_trace_interface.ts +11 -59
  404. package/src/public/state_manager/index.ts +1 -0
  405. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  406. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  407. package/src/public/state_manager/state_manager.ts +569 -0
  408. package/src/public/test_executor_metrics.ts +397 -0
  409. package/src/public/utils.ts +5 -21
  410. package/src/server.ts +6 -3
  411. package/src/testing.ts +1 -0
  412. package/dest/common/db_interfaces.d.ts +0 -80
  413. package/dest/common/db_interfaces.d.ts.map +0 -1
  414. package/dest/common/db_interfaces.js +0 -1
  415. package/dest/common/debug_fn_name.d.ts +0 -5
  416. package/dest/common/debug_fn_name.d.ts.map +0 -1
  417. package/dest/common/debug_fn_name.js +0 -6
  418. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  419. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  420. package/dest/common/message_load_oracle_inputs.js +0 -15
  421. package/dest/private/acvm/oracle/index.d.ts +0 -14
  422. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  423. package/dest/private/acvm/oracle/index.js +0 -2
  424. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  425. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  426. package/dest/private/acvm/oracle/oracle.js +0 -263
  427. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  428. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  429. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  430. package/dest/private/execution_data_provider.d.ts +0 -261
  431. package/dest/private/execution_data_provider.d.ts.map +0 -1
  432. package/dest/private/execution_data_provider.js +0 -14
  433. package/dest/private/execution_note_cache.d.ts +0 -93
  434. package/dest/private/execution_note_cache.d.ts.map +0 -1
  435. package/dest/private/execution_note_cache.js +0 -180
  436. package/dest/private/hashed_values_cache.d.ts +0 -28
  437. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  438. package/dest/private/hashed_values_cache.js +0 -46
  439. package/dest/private/index.d.ts +0 -13
  440. package/dest/private/index.d.ts.map +0 -1
  441. package/dest/private/index.js +0 -12
  442. package/dest/private/pick_notes.d.ts +0 -85
  443. package/dest/private/pick_notes.d.ts.map +0 -1
  444. package/dest/private/pick_notes.js +0 -51
  445. package/dest/private/private_execution.d.ts +0 -25
  446. package/dest/private/private_execution.d.ts.map +0 -1
  447. package/dest/private/private_execution.js +0 -92
  448. package/dest/private/private_execution_oracle.d.ts +0 -215
  449. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  450. package/dest/private/private_execution_oracle.js +0 -382
  451. package/dest/private/providers/acvm_native.d.ts +0 -40
  452. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  453. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  454. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  455. package/dest/private/providers/acvm_wasm.js +0 -62
  456. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  457. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  458. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  459. package/dest/private/providers/factory.d.ts +0 -12
  460. package/dest/private/providers/factory.d.ts.map +0 -1
  461. package/dest/private/providers/simulation_provider.d.ts +0 -19
  462. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  463. package/dest/private/providers/simulation_provider.js +0 -24
  464. package/dest/private/simulator.d.ts +0 -34
  465. package/dest/private/simulator.d.ts.map +0 -1
  466. package/dest/private/simulator.js +0 -76
  467. package/dest/private/unconstrained_execution.d.ts +0 -10
  468. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  469. package/dest/private/unconstrained_execution.js +0 -27
  470. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  471. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  472. package/dest/private/unconstrained_execution_oracle.js +0 -258
  473. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  474. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  475. package/dest/public/avm/bytecode_utils.js +0 -17
  476. package/dest/public/avm/fixtures/index.d.ts +0 -84
  477. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  478. package/dest/public/avm/fixtures/index.js +0 -175
  479. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  480. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  481. package/dest/public/avm/journal/index.d.ts +0 -2
  482. package/dest/public/avm/journal/index.d.ts.map +0 -1
  483. package/dest/public/avm/journal/index.js +0 -1
  484. package/dest/public/avm/journal/journal.d.ts +0 -209
  485. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  486. package/dest/public/avm/journal/journal.js +0 -486
  487. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  488. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  489. package/dest/public/bytecode_errors.d.ts +0 -4
  490. package/dest/public/bytecode_errors.d.ts.map +0 -1
  491. package/dest/public/bytecode_errors.js +0 -6
  492. package/dest/public/execution.d.ts +0 -108
  493. package/dest/public/execution.d.ts.map +0 -1
  494. package/dest/public/execution.js +0 -9
  495. package/dest/public/tx_contract_cache.d.ts +0 -41
  496. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  497. package/dest/public/tx_contract_cache.js +0 -49
  498. package/dest/test/utils.d.ts +0 -13
  499. package/dest/test/utils.d.ts.map +0 -1
  500. package/dest/test/utils.js +0 -22
  501. package/src/common/db_interfaces.ts +0 -94
  502. package/src/common/debug_fn_name.ts +0 -18
  503. package/src/common/message_load_oracle_inputs.ts +0 -15
  504. package/src/private/acvm/oracle/index.ts +0 -16
  505. package/src/private/acvm/oracle/oracle.ts +0 -455
  506. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  507. package/src/private/execution_data_provider.ts +0 -323
  508. package/src/private/execution_note_cache.ts +0 -217
  509. package/src/private/hashed_values_cache.ts +0 -55
  510. package/src/private/index.ts +0 -16
  511. package/src/private/pick_notes.ts +0 -141
  512. package/src/private/private_execution.ts +0 -151
  513. package/src/private/private_execution_oracle.ts +0 -614
  514. package/src/private/providers/acvm_wasm.ts +0 -63
  515. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  516. package/src/private/providers/simulation_provider.ts +0 -45
  517. package/src/private/simulator.ts +0 -147
  518. package/src/private/unconstrained_execution.ts +0 -50
  519. package/src/private/unconstrained_execution_oracle.ts +0 -373
  520. package/src/public/avm/bytecode_utils.ts +0 -17
  521. package/src/public/avm/fixtures/index.ts +0 -296
  522. package/src/public/avm/journal/index.ts +0 -1
  523. package/src/public/avm/journal/journal.ts +0 -742
  524. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  525. package/src/public/bytecode_errors.ts +0 -6
  526. package/src/public/execution.ts +0 -140
  527. package/src/public/tx_contract_cache.ts +0 -69
  528. package/src/test/utils.ts +0 -36
@@ -1,7 +1,11 @@
1
+ import { AVM_MAX_OPERANDS } from '@aztec/constants';
2
+ import { padArrayEnd } from '@aztec/foundation/collection';
3
+ import type { Tuple } from '@aztec/foundation/serialize';
4
+
1
5
  import { strict as assert } from 'assert';
2
6
 
3
- import { TaggedMemory, type TaggedMemoryInterface } from '../avm_memory_types.js';
4
- import { RelativeAddressOutOfRangeError } from '../errors.js';
7
+ import { MemoryValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
8
+ import { RelativeAddressOutOfRangeError, TagCheckError } from '../errors.js';
5
9
 
6
10
  export enum AddressingMode {
7
11
  DIRECT = 0,
@@ -13,21 +17,26 @@ export enum AddressingMode {
13
17
  /** A class to represent the addressing mode of an instruction. */
14
18
  export class Addressing {
15
19
  public constructor(
16
- /** The addressing mode for each operand. The length of this array is the number of operands of the instruction. */
17
- private readonly modePerOperand: AddressingMode[],
20
+ /** The addressing mode for each possible operand. */
21
+ private readonly modePerOperand: Tuple<AddressingMode, typeof AVM_MAX_OPERANDS>,
18
22
  ) {}
19
23
 
20
- // TODO(facundo): 8 for backwards compatibility.
21
- public static fromWire(wireModes: number, numOperands: number = 8): Addressing {
22
- // The modes are stored in the wire format as a byte, with each bit representing the mode for an operand.
23
- // The least significant bit represents the zeroth operand, and the most significant bit represents the last operand.
24
- const modes = new Array<AddressingMode>(numOperands);
25
- for (let i = 0; i < numOperands; i++) {
24
+ public static fromModes(modes: AddressingMode[]): Addressing {
25
+ assert(modes.length <= AVM_MAX_OPERANDS, 'Too many operands for addressing mode');
26
+ return new Addressing(padArrayEnd(modes, AddressingMode.DIRECT, AVM_MAX_OPERANDS));
27
+ }
28
+
29
+ public static fromWire(wireModes: number): Addressing {
30
+ // The modes are stored in the wire format as one or two bytes, with each two bits representing the modes for an operand.
31
+ // Even bits are indirect, odd bits are relative.
32
+ const modes = new Array<AddressingMode>(AVM_MAX_OPERANDS);
33
+ for (let i = 0; i < AVM_MAX_OPERANDS; i++) {
26
34
  modes[i] =
27
- (((wireModes >> i) & 1) * AddressingMode.INDIRECT) |
28
- (((wireModes >> (i + numOperands)) & 1) * AddressingMode.RELATIVE);
35
+ (((wireModes >> (i * 2)) & 1) * AddressingMode.INDIRECT) |
36
+ (((wireModes >> (i * 2 + 1)) & 1) * AddressingMode.RELATIVE);
29
37
  }
30
- return new Addressing(modes);
38
+ // Casting the array to tuple since it should be more performant than using makeTuple
39
+ return new Addressing(modes as Tuple<AddressingMode, typeof AVM_MAX_OPERANDS>);
31
40
  }
32
41
 
33
42
  public toWire(): number {
@@ -36,50 +45,65 @@ export class Addressing {
36
45
  let wire: number = 0;
37
46
  for (let i = 0; i < this.modePerOperand.length; i++) {
38
47
  if (this.modePerOperand[i] & AddressingMode.INDIRECT) {
39
- wire |= 1 << i;
48
+ wire |= 1 << (i * 2);
40
49
  }
41
50
  if (this.modePerOperand[i] & AddressingMode.RELATIVE) {
42
- wire |= 1 << (this.modePerOperand.length + i);
51
+ wire |= 1 << (i * 2 + 1);
43
52
  }
44
53
  }
45
54
  return wire;
46
55
  }
47
56
 
48
- /** Returns how many operands use the given addressing mode. */
49
- public count(mode: AddressingMode): number {
50
- return this.modePerOperand.filter(m => (m & mode) !== 0).length;
57
+ public indirectOperandsCount(): number {
58
+ return this.modePerOperand.filter(mode => mode & AddressingMode.INDIRECT).length;
59
+ }
60
+
61
+ public relativeOperandsCount(): number {
62
+ return this.modePerOperand.filter(mode => mode & AddressingMode.RELATIVE).length;
51
63
  }
52
64
 
53
65
  /**
54
66
  * Resolves the offsets using the addressing mode.
55
67
  * @param offsets The offsets to resolve.
56
68
  * @param mem The memory to use for resolution.
57
- * @returns The resolved offsets. The length of the returned array is the same as the length of the input array.
69
+ * @returns The resolved offsets. The length of the returned array is the same as the length of the input array and the resolved offsets are guaranteed to be valid addresses.
70
+ * @throws An error if any step failed. Should be treated as a black box.
58
71
  */
59
72
  public resolve(offsets: number[], mem: TaggedMemoryInterface): number[] {
60
- assert(offsets.length <= this.modePerOperand.length);
61
- const resolved = new Array(offsets.length);
62
-
63
- let didRelativeOnce = false;
64
- let baseAddr = 0;
73
+ const resolved: number[] = new Array(offsets.length);
74
+ // These will be read (once) if we have any relative operands.
75
+ let baseAddr: MemoryValue | undefined;
65
76
 
66
77
  for (const [i, offset] of offsets.entries()) {
67
78
  const mode = this.modePerOperand[i];
79
+ // The given offsets are assumed to be valid addresses.
68
80
  resolved[i] = offset;
69
81
  if (mode & AddressingMode.RELATIVE) {
70
- if (!didRelativeOnce) {
71
- mem.checkIsValidMemoryOffsetTag(0);
72
- baseAddr = Number(mem.get(0).toBigInt());
73
- didRelativeOnce = true;
82
+ if (!baseAddr) {
83
+ baseAddr = mem.get(0);
84
+ const baseAddrTag = baseAddr.getTag();
85
+ if (!TaggedMemory.isValidMemoryAddressTag(baseAddrTag!)) {
86
+ throw TagCheckError.forBaseAddress(TypeTag[baseAddrTag!]);
87
+ }
74
88
  }
75
- resolved[i] += baseAddr;
89
+ // Here we know that resolved[i] is at most 32 bits and baseAddr is at most 32 bits.
90
+ // Therefore, the addition is safe since the `number` type fits more than 33 bits.
91
+ resolved[i] += Number(baseAddr.toBigInt());
76
92
  if (resolved[i] >= TaggedMemory.MAX_MEMORY_SIZE) {
77
- throw new RelativeAddressOutOfRangeError(baseAddr, offset);
93
+ throw new RelativeAddressOutOfRangeError(Number(baseAddr.toBigInt()), offset);
78
94
  }
79
95
  }
80
96
  if (mode & AddressingMode.INDIRECT) {
81
- mem.checkIsValidMemoryOffsetTag(resolved[i]);
82
- resolved[i] = Number(mem.get(resolved[i]).toBigInt());
97
+ // At this point we know that resolved[i] is a valid memory address.
98
+ const resolvedValue = mem.get(resolved[i]);
99
+ const resolvedTag = resolvedValue.getTag();
100
+
101
+ // Final check.
102
+ if (!TaggedMemory.isValidMemoryAddressTag(resolvedTag)) {
103
+ throw TagCheckError.forIndirectAddress(resolved[i], TypeTag[resolvedTag]);
104
+ }
105
+
106
+ resolved[i] = Number(resolvedValue.toBigInt());
83
107
  }
84
108
  }
85
109
  return resolved;
@@ -1,6 +1,7 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
2
  import {
3
3
  type Field,
4
+ type IntegralValue,
4
5
  type MemoryValue,
5
6
  TaggedMemory,
6
7
  type TaggedMemoryInterface,
@@ -14,10 +15,13 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
14
15
  export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction {
15
16
  public async execute(context: AvmContext): Promise<void> {
16
17
  const memory = context.machineState.memory;
17
- context.machineState.consumeGas(this.gasCost());
18
+ const addressing = Addressing.fromWire(this.addressingMode);
19
+
20
+ context.machineState.consumeGas(
21
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
22
+ );
18
23
 
19
24
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
20
- const addressing = Addressing.fromWire(this.indirect, operands.length);
21
25
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
22
26
  this.checkTags(memory, aOffset, bOffset);
23
27
 
@@ -84,7 +88,9 @@ export class FieldDiv extends ThreeOperandArithmeticInstruction {
84
88
  static readonly opcode = Opcode.FDIV_8; // FIXME: needed for gas.
85
89
 
86
90
  protected compute(a: Field, b: Field): Field {
87
- // return (a as Field).fdiv(b as Field);
91
+ if (b.toBigInt() === 0n) {
92
+ throw new ArithmeticError('Division by zero');
93
+ }
88
94
  return a.fdiv(b);
89
95
  }
90
96
 
@@ -93,3 +99,31 @@ export class FieldDiv extends ThreeOperandArithmeticInstruction {
93
99
  memory.checkTag(TypeTag.FIELD, aOffset); // Follows that bOffset has also tag of type Field
94
100
  }
95
101
  }
102
+
103
+ export class Shl extends ThreeOperandArithmeticInstruction {
104
+ static readonly type: string = 'SHL';
105
+ static readonly opcode = Opcode.SHL_8; // FIXME: needed for gas.
106
+
107
+ protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
108
+ return a.shl(b);
109
+ }
110
+
111
+ protected override checkTags(memory: TaggedMemoryInterface, aOffset: number, bOffset: number) {
112
+ memory.checkTagsAreSame(aOffset, bOffset);
113
+ TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset)); // Follows that bOffset tag is also of integral type
114
+ }
115
+ }
116
+
117
+ export class Shr extends ThreeOperandArithmeticInstruction {
118
+ static readonly type: string = 'SHR';
119
+ static readonly opcode = Opcode.SHR_8; // FIXME: needed for gas.
120
+
121
+ protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
122
+ return a.shr(b);
123
+ }
124
+
125
+ protected override checkTags(memory: TaggedMemoryInterface, aOffset: number, bOffset: number) {
126
+ memory.checkTagsAreSame(aOffset, bOffset);
127
+ TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset)); // Follows that bOffset tag is also of integral type
128
+ }
129
+ }
@@ -1,4 +1,5 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
+ import { getBitwiseDynamicGasMultiplier } from '../avm_gas.js';
2
3
  import { type IntegralValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
3
4
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
4
5
  import { Addressing } from './addressing_mode.js';
@@ -8,13 +9,19 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
8
9
  abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
9
10
  public async execute(context: AvmContext): Promise<void> {
10
11
  const memory = context.machineState.memory;
11
- context.machineState.consumeGas(this.gasCost());
12
+ const addressing = Addressing.fromWire(this.addressingMode);
13
+
14
+ context.machineState.consumeGas(
15
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
16
+ );
12
17
 
13
18
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
14
- const addressing = Addressing.fromWire(this.indirect, operands.length);
15
19
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
16
20
  this.checkTags(memory, aOffset, bOffset);
17
21
 
22
+ const multiplier = this.getDynamicMultiplier(memory.getTag(aOffset));
23
+ context.machineState.consumeGas(this.dynamicGasCost(multiplier));
24
+
18
25
  const a = memory.getAs<IntegralValue>(aOffset);
19
26
  const b = memory.getAs<IntegralValue>(bOffset);
20
27
 
@@ -27,6 +34,10 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
27
34
  TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
28
35
  memory.checkTagsAreSame(aOffset, bOffset);
29
36
  }
37
+
38
+ protected getDynamicMultiplier(_lhsTag: TypeTag): number {
39
+ return 0;
40
+ }
30
41
  }
31
42
 
32
43
  export class And extends ThreeOperandBitwiseInstruction {
@@ -36,6 +47,10 @@ export class And extends ThreeOperandBitwiseInstruction {
36
47
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
37
48
  return a.and(b);
38
49
  }
50
+
51
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
52
+ return getBitwiseDynamicGasMultiplier(lhsTag);
53
+ }
39
54
  }
40
55
 
41
56
  export class Or extends ThreeOperandBitwiseInstruction {
@@ -45,6 +60,10 @@ export class Or extends ThreeOperandBitwiseInstruction {
45
60
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
46
61
  return a.or(b);
47
62
  }
63
+
64
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
65
+ return getBitwiseDynamicGasMultiplier(lhsTag);
66
+ }
48
67
  }
49
68
 
50
69
  export class Xor extends ThreeOperandBitwiseInstruction {
@@ -54,31 +73,9 @@ export class Xor extends ThreeOperandBitwiseInstruction {
54
73
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
55
74
  return a.xor(b);
56
75
  }
57
- }
58
76
 
59
- export class Shl extends ThreeOperandBitwiseInstruction {
60
- static readonly type: string = 'SHL';
61
- static readonly opcode = Opcode.SHL_8; // FIXME: needed for gas.
62
-
63
- protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
64
- return a.shl(b);
65
- }
66
- protected override checkTags(memory: TaggedMemoryInterface, aOffset: number, bOffset: number) {
67
- TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
68
- memory.checkTag(TypeTag.UINT8, bOffset);
69
- }
70
- }
71
-
72
- export class Shr extends ThreeOperandBitwiseInstruction {
73
- static readonly type: string = 'SHR';
74
- static readonly opcode = Opcode.SHR_8; // FIXME: needed for gas.
75
-
76
- protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
77
- return a.shr(b);
78
- }
79
- protected override checkTags(memory: TaggedMemoryInterface, aOffset: number, bOffset: number) {
80
- TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
81
- memory.checkTag(TypeTag.UINT8, bOffset);
77
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
78
+ return getBitwiseDynamicGasMultiplier(lhsTag);
82
79
  }
83
80
  }
84
81
 
@@ -89,16 +86,23 @@ export class Not extends Instruction {
89
86
  static readonly wireFormat8 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT8, OperandType.UINT8];
90
87
  static readonly wireFormat16 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
91
88
 
92
- constructor(private indirect: number, private srcOffset: number, private dstOffset: number) {
89
+ constructor(
90
+ private addressingMode: number,
91
+ private srcOffset: number,
92
+ private dstOffset: number,
93
+ ) {
93
94
  super();
94
95
  }
95
96
 
96
97
  public async execute(context: AvmContext): Promise<void> {
97
98
  const memory = context.machineState.memory;
98
- context.machineState.consumeGas(this.gasCost());
99
+ const addressing = Addressing.fromWire(this.addressingMode);
100
+
101
+ context.machineState.consumeGas(
102
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
103
+ );
99
104
 
100
105
  const operands = [this.srcOffset, this.dstOffset];
101
- const addressing = Addressing.fromWire(this.indirect, operands.length);
102
106
  const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
103
107
  TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset));
104
108
  const value = memory.getAs<IntegralValue>(srcOffset);
@@ -7,12 +7,15 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
7
7
  abstract class ComparatorInstruction extends ThreeOperandInstruction {
8
8
  public async execute(context: AvmContext): Promise<void> {
9
9
  const memory = context.machineState.memory;
10
- context.machineState.consumeGas(this.gasCost());
10
+ const addressing = Addressing.fromWire(this.addressingMode);
11
+
12
+ context.machineState.consumeGas(
13
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
14
+ );
11
15
 
12
16
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
13
- const addressing = Addressing.fromWire(this.indirect, operands.length);
14
17
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
15
- memory.checkTagsAreSame(aOffset, bOffset);
18
+ memory.checkTagsAreSame(aOffset, bOffset); // Brillig semantic enforces that tags match.
16
19
 
17
20
  const a = memory.get(aOffset);
18
21
  const b = memory.get(bOffset);
@@ -17,18 +17,16 @@ export class GetContractInstance extends Instruction {
17
17
  // Informs (de)serialization. See Instruction.deserialize.
18
18
  static readonly wireFormat: OperandType[] = [
19
19
  OperandType.UINT8, // opcode
20
- OperandType.UINT8, // indirect bits
20
+ OperandType.UINT8, // addressing_mode bits
21
21
  OperandType.UINT16, // addressOffset
22
22
  OperandType.UINT16, // dstOffset
23
- OperandType.UINT16, // existsOfsset
24
23
  OperandType.UINT8, // member enum (immediate)
25
24
  ];
26
25
 
27
26
  constructor(
28
- private indirect: number,
27
+ private addressingMode: number,
29
28
  private addressOffset: number,
30
29
  private dstOffset: number,
31
- private existsOffset: number,
32
30
  private memberEnum: number,
33
31
  ) {
34
32
  super();
@@ -36,15 +34,18 @@ export class GetContractInstance extends Instruction {
36
34
 
37
35
  async execute(context: AvmContext): Promise<void> {
38
36
  const memory = context.machineState.memory;
39
- context.machineState.consumeGas(this.gasCost());
37
+ const addressing = Addressing.fromWire(this.addressingMode);
38
+
39
+ context.machineState.consumeGas(
40
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
41
+ );
40
42
 
41
43
  if (!(this.memberEnum in ContractInstanceMember)) {
42
44
  throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);
43
45
  }
44
46
 
45
- const operands = [this.addressOffset, this.dstOffset, this.existsOffset];
46
- const addressing = Addressing.fromWire(this.indirect, operands.length);
47
- const [addressOffset, dstOffset, existsOffset] = addressing.resolve(operands, memory);
47
+ const operands = [this.addressOffset, this.dstOffset];
48
+ const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
48
49
  memory.checkTag(TypeTag.FIELD, addressOffset);
49
50
 
50
51
  const address = memory.get(addressOffset).toAztecAddress();
@@ -66,7 +67,6 @@ export class GetContractInstance extends Instruction {
66
67
  }
67
68
  }
68
69
 
69
- memory.set(existsOffset, new Uint1(exists ? 1 : 0));
70
- memory.set(dstOffset, memberValue);
70
+ memory.setSlice(dstOffset, [new Uint1(exists ? 1 : 0), memberValue]);
71
71
  }
72
72
  }
@@ -1,5 +1,5 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
- import type { IntegralValue } from '../avm_memory_types.js';
2
+ import { TypeTag, type Uint1 } from '../avm_memory_types.js';
3
3
  import { InstructionExecutionError } from '../errors.js';
4
4
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
5
5
  import { Addressing } from './addressing_mode.js';
@@ -16,7 +16,7 @@ export class Jump extends Instruction {
16
16
  }
17
17
 
18
18
  public async execute(context: AvmContext): Promise<void> {
19
- context.machineState.consumeGas(this.gasCost());
19
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
20
20
 
21
21
  context.machineState.pc = this.jumpOffset;
22
22
  }
@@ -38,20 +38,29 @@ export class JumpI extends Instruction {
38
38
  OperandType.UINT32,
39
39
  ];
40
40
 
41
- constructor(private indirect: number, private condOffset: number, private loc: number) {
41
+ constructor(
42
+ private addressingMode: number,
43
+ private condOffset: number,
44
+ private loc: number,
45
+ ) {
42
46
  super();
43
47
  }
44
48
 
45
49
  public async execute(context: AvmContext): Promise<void> {
46
50
  const memory = context.machineState.memory;
47
- context.machineState.consumeGas(this.gasCost());
51
+ const addressing = Addressing.fromWire(this.addressingMode);
52
+
53
+ context.machineState.consumeGas(
54
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
55
+ );
48
56
 
49
57
  const operands = [this.condOffset];
50
- const addressing = Addressing.fromWire(this.indirect, operands.length);
51
- const [condOffset] = addressing.resolve(operands, memory);
52
- const condition = memory.getAs<IntegralValue>(condOffset);
58
+ const [resolvedCondOffset] = addressing.resolve(operands, memory);
59
+
60
+ memory.checkTag(TypeTag.UINT1, resolvedCondOffset);
61
+ const condition = memory.getAs<Uint1>(resolvedCondOffset);
53
62
 
54
- if (condition.toBigInt() == 0n) {
63
+ if (condition.toNumber() == 0) {
55
64
  context.machineState.pc = context.machineState.nextPc;
56
65
  } else {
57
66
  context.machineState.pc = this.loc;
@@ -74,7 +83,7 @@ export class InternalCall extends Instruction {
74
83
  }
75
84
 
76
85
  public async execute(context: AvmContext): Promise<void> {
77
- context.machineState.consumeGas(this.gasCost());
86
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
78
87
 
79
88
  context.machineState.internalCallStack.push({
80
89
  callPc: context.machineState.pc,
@@ -99,7 +108,7 @@ export class InternalReturn extends Instruction {
99
108
  }
100
109
 
101
110
  public async execute(context: AvmContext): Promise<void> {
102
- context.machineState.consumeGas(this.gasCost());
111
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
103
112
 
104
113
  const stackEntry = context.machineState.internalCallStack.pop();
105
114
  if (stackEntry === undefined) {
@@ -12,7 +12,7 @@ export class ToRadixBE extends Instruction {
12
12
  // Informs (de)serialization. See Instruction.deserialize.
13
13
  static readonly wireFormat: OperandType[] = [
14
14
  OperandType.UINT8, // Opcode
15
- OperandType.UINT16, // Indirect
15
+ OperandType.UINT16, // addressing_mode
16
16
  OperandType.UINT16, // src memory address
17
17
  OperandType.UINT16, // radix memory address
18
18
  OperandType.UINT16, // number of limbs address
@@ -21,7 +21,7 @@ export class ToRadixBE extends Instruction {
21
21
  ];
22
22
 
23
23
  constructor(
24
- private indirect: number,
24
+ private addressingMode: number,
25
25
  private srcOffset: number,
26
26
  private radixOffset: number,
27
27
  private numLimbsOffset: number,
@@ -33,8 +33,13 @@ export class ToRadixBE extends Instruction {
33
33
 
34
34
  public async execute(context: AvmContext): Promise<void> {
35
35
  const memory = context.machineState.memory;
36
+ const addressing = Addressing.fromWire(this.addressingMode);
37
+
38
+ context.machineState.consumeGas(
39
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
40
+ );
41
+
36
42
  const operands = [this.srcOffset, this.radixOffset, this.numLimbsOffset, this.outputBitsOffset, this.dstOffset];
37
- const addressing = Addressing.fromWire(this.indirect, operands.length);
38
43
  const [srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset] = addressing.resolve(operands, memory);
39
44
 
40
45
  // The radix gadget only takes in a Field
@@ -44,11 +49,13 @@ export class ToRadixBE extends Instruction {
44
49
  memory.checkTag(TypeTag.UINT1, outputBitsOffset);
45
50
 
46
51
  const numLimbs = memory.get(numLimbsOffset).toNumber();
47
- context.machineState.consumeGas(this.gasCost(numLimbs));
52
+ const radix: bigint = memory.get(radixOffset).toBigInt();
53
+ context.machineState.consumeGas(
54
+ this.dynamicGasCost(Math.max(numLimbs, radix > 256n ? 32 : MODULUS_LIMBS_PER_RADIX[Number(radix)])),
55
+ );
48
56
  const outputBits = memory.get(outputBitsOffset).toNumber();
49
57
 
50
58
  let value: bigint = memory.get(srcOffset).toBigInt();
51
- const radix: bigint = memory.get(radixOffset).toBigInt();
52
59
 
53
60
  if (radix < 2 || radix > 256) {
54
61
  throw new InvalidToRadixInputsError(`ToRadixBE instruction's radix should be in range [2,256] (was ${radix}).`);
@@ -73,8 +80,25 @@ export class ToRadixBE extends Instruction {
73
80
  value /= radixBN;
74
81
  }
75
82
 
83
+ if (value !== 0n) {
84
+ throw new InvalidToRadixInputsError(`Field failed to decompose in ${numLimbs} limbs.`);
85
+ }
86
+
76
87
  const outputType = outputBits != 0 ? Uint1 : Uint8;
77
88
  const res = limbArray.map(byte => new outputType(byte));
78
89
  memory.setSlice(dstOffset, res);
79
90
  }
80
91
  }
92
+
93
+ // First two are for radix = 0 and 1, which are invalid, so we have 0 limbs for those cases.
94
+ export const MODULUS_LIMBS_PER_RADIX: number[] = [
95
+ 0, 0, 254, 161, 127, 110, 99, 91, 85, 81, 77, 74, 71, 69, 67, 65, 64, 63, 61, 60, 59, 58, 57, 57, 56, 55, 54, 54, 53,
96
+ 53, 52, 52, 51, 51, 50, 50, 50, 49, 49, 48, 48, 48, 48, 47, 47, 47, 46, 46, 46, 46, 45, 45, 45, 45, 45, 44, 44, 44,
97
+ 44, 44, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40,
98
+ 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
99
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
100
+ 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
101
+ 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
102
+ 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
103
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
104
+ ];
@@ -1,8 +1,9 @@
1
- import { Grumpkin } from '@aztec/foundation/crypto';
2
- import { Point } from '@aztec/foundation/fields';
1
+ import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
2
+ import { Point } from '@aztec/foundation/curves/grumpkin';
3
3
 
4
4
  import type { AvmContext } from '../avm_context.js';
5
5
  import { Field, TypeTag, Uint1 } from '../avm_memory_types.js';
6
+ import { EcAddPointNotOnCurveError } from '../errors.js';
6
7
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
7
8
  import { Addressing } from './addressing_mode.js';
8
9
  import { Instruction } from './instruction.js';
@@ -25,7 +26,7 @@ export class EcAdd extends Instruction {
25
26
  ];
26
27
 
27
28
  constructor(
28
- private indirect: number,
29
+ private addressingMode: number,
29
30
  private p1XOffset: number,
30
31
  private p1YOffset: number,
31
32
  private p1IsInfiniteOffset: number,
@@ -39,7 +40,11 @@ export class EcAdd extends Instruction {
39
40
 
40
41
  public async execute(context: AvmContext): Promise<void> {
41
42
  const memory = context.machineState.memory;
42
- context.machineState.consumeGas(this.gasCost());
43
+ const addressing = Addressing.fromWire(this.addressingMode);
44
+
45
+ context.machineState.consumeGas(
46
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
47
+ );
43
48
 
44
49
  const operands = [
45
50
  this.p1XOffset,
@@ -50,7 +55,6 @@ export class EcAdd extends Instruction {
50
55
  this.p2IsInfiniteOffset,
51
56
  this.dstOffset,
52
57
  ];
53
- const addressing = Addressing.fromWire(this.indirect, operands.length);
54
58
  const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] =
55
59
  addressing.resolve(operands, memory);
56
60
 
@@ -62,7 +66,7 @@ export class EcAdd extends Instruction {
62
66
  const p1IsInfinite = memory.get(p1IsInfiniteOffset).toNumber() === 1;
63
67
  const p1 = new Point(p1X.toFr(), p1Y.toFr(), p1IsInfinite);
64
68
  if (!p1.isOnGrumpkin()) {
65
- throw new Error(`Point1 is not on the curve`);
69
+ throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 1, p1);
66
70
  }
67
71
 
68
72
  const p2X = memory.get(p2XOffset);
@@ -71,17 +75,25 @@ export class EcAdd extends Instruction {
71
75
  const p2IsInfinite = memory.get(p2IsInfiniteOffset).toNumber() === 1;
72
76
  const p2 = new Point(p2X.toFr(), p2Y.toFr(), p2IsInfinite);
73
77
  if (!p2.isOnGrumpkin()) {
74
- throw new Error(`Point1 is not on the curve`);
78
+ throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 2, p2);
75
79
  }
76
80
 
77
- const grumpkin = new Grumpkin();
78
81
  let dest;
79
- if (p1IsInfinite) {
82
+ if (p1IsInfinite && p2IsInfinite) {
83
+ dest = Point.ZERO;
84
+ } else if (p1IsInfinite) {
80
85
  dest = p2;
81
86
  } else if (p2IsInfinite) {
82
87
  dest = p1;
83
88
  } else {
84
- dest = await grumpkin.add(p1, p2);
89
+ // TS<>BB ecc add communication is broken for points that add up to infinity.
90
+ // However, here we know that both points are on the curve, and that none is infinity
91
+ // so we can check for the case where you add p + (-p) = infinity.
92
+ if (p1.x.equals(p2.x) && !p1.y.equals(p2.y)) {
93
+ dest = Point.ZERO;
94
+ } else {
95
+ dest = await Grumpkin.add(p1, p2);
96
+ }
85
97
  }
86
98
 
87
99
  // Important to use setSlice() and not set() in the two following statements as