@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.5476d83

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 (492) hide show
  1. package/README.md +6 -0
  2. package/dest/client.d.ts +6 -4
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +5 -14
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +1 -2
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/common/stats/index.d.ts +1 -1
  12. package/dest/common/stats/stats.d.ts +1 -1
  13. package/dest/private/acvm/acvm.d.ts +12 -6
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +10 -16
  16. package/dest/private/acvm/acvm_types.d.ts +2 -2
  17. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.d.ts +18 -19
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +31 -23
  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 +20 -3
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +53 -0
  27. package/dest/private/acvm_native.d.ts +39 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  30. package/dest/private/acvm_wasm.d.ts +15 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  33. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  34. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  35. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  36. package/dest/private/circuit_recording/circuit_recorder.d.ts +108 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +209 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -0
  40. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  41. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +5 -0
  43. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  44. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  46. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  47. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  48. package/dest/private/circuit_simulator.d.ts +35 -0
  49. package/dest/private/circuit_simulator.d.ts.map +1 -0
  50. package/dest/private/circuit_simulator.js +43 -0
  51. package/dest/private/factory.d.ts +12 -0
  52. package/dest/private/factory.d.ts.map +1 -0
  53. package/dest/private/{providers/factory.js → factory.js} +2 -2
  54. package/dest/public/avm/avm_context.d.ts +6 -6
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +5 -3
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +11 -7
  59. package/dest/public/avm/avm_execution_environment.d.ts +4 -2
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +4 -2
  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 +3 -1
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +2 -0
  68. package/dest/public/avm/avm_memory_types.d.ts +99 -88
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +17 -6
  71. package/dest/public/avm/avm_simulator.d.ts +6 -6
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +23 -35
  74. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  75. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  76. package/dest/public/avm/avm_simulator_interface.js +3 -0
  77. package/dest/public/avm/errors.d.ts +7 -31
  78. package/dest/public/avm/errors.d.ts.map +1 -1
  79. package/dest/public/avm/errors.js +7 -57
  80. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  81. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  82. package/dest/public/avm/fixtures/avm_simulation_tester.js +22 -15
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +7 -5
  84. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +37 -14
  86. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  87. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  88. package/dest/public/avm/fixtures/initializers.js +44 -0
  89. package/dest/public/avm/fixtures/utils.d.ts +38 -0
  90. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/utils.js +95 -0
  92. package/dest/public/avm/index.d.ts +1 -3
  93. package/dest/public/avm/index.d.ts.map +1 -1
  94. package/dest/public/avm/index.js +0 -2
  95. package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -3
  96. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  97. package/dest/public/avm/opcodes/accrued_substate.js +28 -25
  98. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  99. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  101. package/dest/public/avm/opcodes/arithmetic.d.ts +17 -7
  102. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/arithmetic.js +16 -2
  104. package/dest/public/avm/opcodes/bitwise.d.ts +10 -18
  105. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/bitwise.js +19 -26
  107. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  108. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/comparators.js +3 -3
  110. package/dest/public/avm/opcodes/contract.d.ts +2 -3
  111. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/contract.js +9 -10
  113. package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
  114. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/control_flow.js +10 -8
  116. package/dest/public/avm/opcodes/conversion.d.ts +2 -1
  117. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/conversion.js +267 -3
  119. package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
  120. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/ec_add.js +6 -6
  122. package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
  123. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  125. package/dest/public/avm/opcodes/external_calls.d.ts +9 -8
  126. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/external_calls.js +39 -34
  128. package/dest/public/avm/opcodes/hashing.d.ts +2 -2
  129. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/hashing.js +6 -6
  131. package/dest/public/avm/opcodes/index.d.ts +1 -1
  132. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  133. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  134. package/dest/public/avm/opcodes/instruction.js +23 -19
  135. package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
  136. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/memory.d.ts +6 -6
  138. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  139. package/dest/public/avm/opcodes/memory.js +37 -33
  140. package/dest/public/avm/opcodes/misc.d.ts +3 -2
  141. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  142. package/dest/public/avm/opcodes/misc.js +41 -16
  143. package/dest/public/avm/opcodes/storage.d.ts +3 -3
  144. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  145. package/dest/public/avm/opcodes/storage.js +7 -5
  146. package/dest/public/avm/revert_reason.d.ts +18 -0
  147. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  148. package/dest/public/avm/revert_reason.js +38 -0
  149. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  150. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  151. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  152. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  153. package/dest/public/avm/serialization/bytecode_serialization.js +70 -69
  154. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  155. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  156. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  157. package/dest/public/avm/test_utils.d.ts +11 -14
  158. package/dest/public/avm/test_utils.d.ts.map +1 -1
  159. package/dest/public/avm/test_utils.js +16 -24
  160. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  161. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  162. package/dest/public/contracts_db_checkpoint.js +30 -0
  163. package/dest/public/db_interfaces.d.ts +68 -0
  164. package/dest/public/db_interfaces.d.ts.map +1 -0
  165. package/dest/public/db_interfaces.js +3 -0
  166. package/dest/public/debug_fn_name.d.ts +5 -0
  167. package/dest/public/debug_fn_name.d.ts.map +1 -0
  168. package/dest/public/debug_fn_name.js +9 -0
  169. package/dest/public/executor_metrics.d.ts +12 -4
  170. package/dest/public/executor_metrics.d.ts.map +1 -1
  171. package/dest/public/executor_metrics.js +37 -6
  172. package/dest/public/executor_metrics_interface.d.ts +10 -0
  173. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  174. package/dest/public/executor_metrics_interface.js +1 -0
  175. package/dest/public/fixtures/amm_test.d.ts +10 -0
  176. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  177. package/dest/public/fixtures/amm_test.js +213 -0
  178. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  179. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  180. package/dest/public/fixtures/bulk_test.js +326 -0
  181. package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
  182. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  183. package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
  184. package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
  185. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  186. package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
  187. package/dest/public/fixtures/index.d.ts +8 -1
  188. package/dest/public/fixtures/index.d.ts.map +1 -1
  189. package/dest/public/fixtures/index.js +7 -0
  190. package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
  191. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  192. package/dest/public/fixtures/minimal_public_tx.js +29 -0
  193. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -14
  194. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  195. package/dest/public/fixtures/public_tx_simulation_tester.js +100 -71
  196. package/dest/public/fixtures/simple_contract_data_source.d.ts +35 -0
  197. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  198. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  199. package/dest/public/fixtures/token_test.d.ts +8 -0
  200. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  201. package/dest/public/fixtures/token_test.js +94 -0
  202. package/dest/public/fixtures/utils.d.ts +17 -4
  203. package/dest/public/fixtures/utils.d.ts.map +1 -1
  204. package/dest/public/fixtures/utils.js +100 -58
  205. package/dest/public/hinting_db_sources.d.ts +78 -0
  206. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  207. package/dest/public/hinting_db_sources.js +350 -0
  208. package/dest/public/index.d.ts +6 -9
  209. package/dest/public/index.d.ts.map +1 -1
  210. package/dest/public/index.js +4 -7
  211. package/dest/public/public_db_sources.d.ts +51 -101
  212. package/dest/public/public_db_sources.d.ts.map +1 -1
  213. package/dest/public/public_db_sources.js +219 -192
  214. package/dest/public/public_errors.d.ts +12 -0
  215. package/dest/public/public_errors.d.ts.map +1 -0
  216. package/dest/public/public_errors.js +13 -0
  217. package/dest/public/public_processor/guarded_merkle_tree.d.ts +49 -0
  218. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  219. package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
  220. package/dest/public/public_processor/public_processor.d.ts +25 -37
  221. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  222. package/dest/public/public_processor/public_processor.js +154 -111
  223. package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
  224. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  225. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  226. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +30 -0
  227. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  228. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +133 -0
  229. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +66 -0
  230. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  231. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +210 -0
  232. package/dest/public/public_tx_simulator/index.d.ts +5 -0
  233. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  234. package/dest/public/public_tx_simulator/index.js +2 -0
  235. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  236. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  237. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  238. package/dest/public/public_tx_simulator/public_tx_context.d.ts +23 -30
  239. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  240. package/dest/public/public_tx_simulator/public_tx_context.js +71 -91
  241. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -58
  242. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  243. package/dest/public/public_tx_simulator/public_tx_simulator.js +208 -206
  244. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -0
  245. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  246. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  247. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  248. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  249. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  250. package/dest/public/side_effect_errors.d.ts +42 -2
  251. package/dest/public/side_effect_errors.d.ts.map +1 -1
  252. package/dest/public/side_effect_errors.js +70 -1
  253. package/dest/public/side_effect_trace.d.ts +21 -67
  254. package/dest/public/side_effect_trace.d.ts.map +1 -1
  255. package/dest/public/side_effect_trace.js +71 -121
  256. package/dest/public/side_effect_trace_interface.d.ts +12 -24
  257. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  258. package/dest/public/state_manager/index.d.ts +2 -0
  259. package/dest/public/state_manager/index.d.ts.map +1 -0
  260. package/dest/public/state_manager/index.js +1 -0
  261. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +3 -6
  262. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  263. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  264. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +3 -3
  265. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  266. package/dest/public/state_manager/state_manager.d.ts +159 -0
  267. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  268. package/dest/public/state_manager/state_manager.js +392 -0
  269. package/dest/public/test_executor_metrics.d.ts +55 -0
  270. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  271. package/dest/public/test_executor_metrics.js +307 -0
  272. package/dest/public/unique_class_ids.d.ts +1 -1
  273. package/dest/public/unique_class_ids.d.ts.map +1 -1
  274. package/dest/public/utils.d.ts +3 -5
  275. package/dest/public/utils.d.ts.map +1 -1
  276. package/dest/public/utils.js +4 -21
  277. package/dest/server.d.ts +7 -4
  278. package/dest/server.d.ts.map +1 -1
  279. package/dest/server.js +5 -2
  280. package/dest/testing.d.ts +2 -0
  281. package/dest/testing.d.ts.map +1 -0
  282. package/dest/testing.js +1 -0
  283. package/package.json +39 -33
  284. package/src/client.ts +5 -3
  285. package/src/common/errors.ts +79 -44
  286. package/src/common/index.ts +0 -1
  287. package/src/private/acvm/acvm.ts +17 -32
  288. package/src/private/acvm/acvm_types.ts +1 -1
  289. package/src/private/acvm/deserialize.ts +35 -29
  290. package/src/private/acvm/index.ts +0 -1
  291. package/src/private/acvm/serialize.ts +63 -0
  292. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  293. package/src/private/acvm_wasm.ts +72 -0
  294. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  295. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  296. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  297. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  298. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  299. package/src/private/circuit_simulator.ts +90 -0
  300. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  301. package/src/public/avm/avm_context.ts +4 -4
  302. package/src/public/avm/avm_contract_call_result.ts +17 -5
  303. package/src/public/avm/avm_execution_environment.ts +8 -1
  304. package/src/public/avm/avm_gas.ts +23 -35
  305. package/src/public/avm/avm_machine_state.ts +5 -0
  306. package/src/public/avm/avm_memory_types.ts +19 -6
  307. package/src/public/avm/avm_simulator.ts +43 -54
  308. package/src/public/avm/avm_simulator_interface.ts +8 -0
  309. package/src/public/avm/errors.ts +8 -77
  310. package/src/public/avm/fixtures/avm_simulation_tester.ts +32 -21
  311. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
  312. package/src/public/avm/fixtures/initializers.ts +102 -0
  313. package/src/public/avm/fixtures/utils.ts +150 -0
  314. package/src/public/avm/index.ts +0 -2
  315. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  316. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  317. package/src/public/avm/opcodes/arithmetic.ts +24 -2
  318. package/src/public/avm/opcodes/bitwise.ts +33 -29
  319. package/src/public/avm/opcodes/comparators.ts +6 -3
  320. package/src/public/avm/opcodes/contract.ts +10 -7
  321. package/src/public/avm/opcodes/control_flow.ts +19 -10
  322. package/src/public/avm/opcodes/conversion.ts +27 -3
  323. package/src/public/avm/opcodes/ec_add.ts +9 -6
  324. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  325. package/src/public/avm/opcodes/external_calls.ts +61 -29
  326. package/src/public/avm/opcodes/hashing.ts +28 -8
  327. package/src/public/avm/opcodes/instruction.ts +31 -21
  328. package/src/public/avm/opcodes/memory.ts +71 -32
  329. package/src/public/avm/opcodes/misc.ts +60 -18
  330. package/src/public/avm/opcodes/storage.ts +22 -6
  331. package/src/public/avm/revert_reason.ts +55 -0
  332. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  333. package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
  334. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  335. package/src/public/avm/test_utils.ts +24 -41
  336. package/src/public/contracts_db_checkpoint.ts +41 -0
  337. package/src/public/db_interfaces.ts +76 -0
  338. package/src/{common → public}/debug_fn_name.ts +7 -7
  339. package/src/public/executor_metrics.ts +56 -6
  340. package/src/public/executor_metrics_interface.ts +15 -0
  341. package/src/public/fixtures/amm_test.ts +331 -0
  342. package/src/public/fixtures/bulk_test.ts +169 -0
  343. package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
  344. package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
  345. package/src/public/fixtures/index.ts +7 -0
  346. package/src/public/fixtures/minimal_public_tx.ts +35 -0
  347. package/src/public/fixtures/public_tx_simulation_tester.ts +166 -113
  348. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
  349. package/src/public/fixtures/token_test.ts +139 -0
  350. package/src/public/fixtures/utils.ts +141 -68
  351. package/src/public/hinting_db_sources.ts +602 -0
  352. package/src/public/index.ts +5 -8
  353. package/src/public/public_db_sources.ts +278 -258
  354. package/src/public/public_errors.ts +14 -0
  355. package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
  356. package/src/public/public_processor/public_processor.ts +212 -164
  357. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  358. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +162 -0
  359. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +306 -0
  360. package/src/public/public_tx_simulator/index.ts +4 -0
  361. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  362. package/src/public/public_tx_simulator/public_tx_context.ts +167 -194
  363. package/src/public/public_tx_simulator/public_tx_simulator.ts +292 -265
  364. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +10 -0
  365. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  366. package/src/public/side_effect_errors.ts +91 -1
  367. package/src/public/side_effect_trace.ts +94 -320
  368. package/src/public/side_effect_trace_interface.ts +10 -58
  369. package/src/public/state_manager/index.ts +1 -0
  370. package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
  371. package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
  372. package/src/public/state_manager/state_manager.ts +553 -0
  373. package/src/public/test_executor_metrics.ts +397 -0
  374. package/src/public/utils.ts +5 -21
  375. package/src/server.ts +6 -3
  376. package/src/testing.ts +1 -0
  377. package/dest/common/db_interfaces.d.ts +0 -80
  378. package/dest/common/db_interfaces.d.ts.map +0 -1
  379. package/dest/common/db_interfaces.js +0 -1
  380. package/dest/common/debug_fn_name.d.ts +0 -5
  381. package/dest/common/debug_fn_name.d.ts.map +0 -1
  382. package/dest/common/debug_fn_name.js +0 -6
  383. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  384. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  385. package/dest/common/message_load_oracle_inputs.js +0 -15
  386. package/dest/private/acvm/oracle/index.d.ts +0 -14
  387. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  388. package/dest/private/acvm/oracle/index.js +0 -2
  389. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  390. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  391. package/dest/private/acvm/oracle/oracle.js +0 -263
  392. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  393. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  394. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  395. package/dest/private/execution_data_provider.d.ts +0 -261
  396. package/dest/private/execution_data_provider.d.ts.map +0 -1
  397. package/dest/private/execution_data_provider.js +0 -14
  398. package/dest/private/execution_note_cache.d.ts +0 -93
  399. package/dest/private/execution_note_cache.d.ts.map +0 -1
  400. package/dest/private/execution_note_cache.js +0 -180
  401. package/dest/private/hashed_values_cache.d.ts +0 -28
  402. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  403. package/dest/private/hashed_values_cache.js +0 -46
  404. package/dest/private/index.d.ts +0 -13
  405. package/dest/private/index.d.ts.map +0 -1
  406. package/dest/private/index.js +0 -12
  407. package/dest/private/pick_notes.d.ts +0 -85
  408. package/dest/private/pick_notes.d.ts.map +0 -1
  409. package/dest/private/pick_notes.js +0 -51
  410. package/dest/private/private_execution.d.ts +0 -25
  411. package/dest/private/private_execution.d.ts.map +0 -1
  412. package/dest/private/private_execution.js +0 -92
  413. package/dest/private/private_execution_oracle.d.ts +0 -215
  414. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  415. package/dest/private/private_execution_oracle.js +0 -382
  416. package/dest/private/providers/acvm_native.d.ts +0 -40
  417. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  418. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  419. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  420. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  421. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  422. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  423. package/dest/private/providers/factory.d.ts +0 -12
  424. package/dest/private/providers/factory.d.ts.map +0 -1
  425. package/dest/private/providers/simulation_provider.d.ts +0 -19
  426. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  427. package/dest/private/providers/simulation_provider.js +0 -24
  428. package/dest/private/simulator.d.ts +0 -34
  429. package/dest/private/simulator.d.ts.map +0 -1
  430. package/dest/private/simulator.js +0 -76
  431. package/dest/private/unconstrained_execution.d.ts +0 -10
  432. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  433. package/dest/private/unconstrained_execution.js +0 -27
  434. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  435. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  436. package/dest/private/unconstrained_execution_oracle.js +0 -258
  437. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  438. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  439. package/dest/public/avm/bytecode_utils.js +0 -17
  440. package/dest/public/avm/fixtures/index.d.ts +0 -84
  441. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  442. package/dest/public/avm/fixtures/index.js +0 -175
  443. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  444. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  445. package/dest/public/avm/journal/index.d.ts +0 -2
  446. package/dest/public/avm/journal/index.d.ts.map +0 -1
  447. package/dest/public/avm/journal/index.js +0 -1
  448. package/dest/public/avm/journal/journal.d.ts +0 -209
  449. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  450. package/dest/public/avm/journal/journal.js +0 -486
  451. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  452. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  453. package/dest/public/bytecode_errors.d.ts +0 -4
  454. package/dest/public/bytecode_errors.d.ts.map +0 -1
  455. package/dest/public/bytecode_errors.js +0 -6
  456. package/dest/public/execution.d.ts +0 -108
  457. package/dest/public/execution.d.ts.map +0 -1
  458. package/dest/public/execution.js +0 -9
  459. package/dest/public/tx_contract_cache.d.ts +0 -41
  460. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  461. package/dest/public/tx_contract_cache.js +0 -49
  462. package/dest/test/utils.d.ts +0 -13
  463. package/dest/test/utils.d.ts.map +0 -1
  464. package/dest/test/utils.js +0 -22
  465. package/src/common/db_interfaces.ts +0 -94
  466. package/src/common/message_load_oracle_inputs.ts +0 -15
  467. package/src/private/acvm/oracle/index.ts +0 -16
  468. package/src/private/acvm/oracle/oracle.ts +0 -455
  469. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  470. package/src/private/execution_data_provider.ts +0 -323
  471. package/src/private/execution_note_cache.ts +0 -217
  472. package/src/private/hashed_values_cache.ts +0 -55
  473. package/src/private/index.ts +0 -16
  474. package/src/private/pick_notes.ts +0 -141
  475. package/src/private/private_execution.ts +0 -151
  476. package/src/private/private_execution_oracle.ts +0 -614
  477. package/src/private/providers/acvm_wasm.ts +0 -63
  478. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  479. package/src/private/providers/simulation_provider.ts +0 -45
  480. package/src/private/simulator.ts +0 -147
  481. package/src/private/unconstrained_execution.ts +0 -50
  482. package/src/private/unconstrained_execution_oracle.ts +0 -373
  483. package/src/public/avm/bytecode_utils.ts +0 -17
  484. package/src/public/avm/fixtures/index.ts +0 -296
  485. package/src/public/avm/journal/index.ts +0 -1
  486. package/src/public/avm/journal/journal.ts +0 -742
  487. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  488. package/src/public/bytecode_errors.ts +0 -6
  489. package/src/public/execution.ts +0 -140
  490. package/src/public/tx_contract_cache.ts +0 -69
  491. package/src/test/utils.ts +0 -36
  492. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -1,7 +1,7 @@
1
+ import { NullifierCollisionError } from '../../side_effect_errors.js';
1
2
  import type { AvmContext } from '../avm_context.js';
2
3
  import { TypeTag, Uint1 } from '../avm_memory_types.js';
3
4
  import { InstructionExecutionError, StaticCallAlterationError } from '../errors.js';
4
- import { NullifierCollisionError } from '../journal/nullifiers.js';
5
5
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
6
6
  import { Addressing } from './addressing_mode.js';
7
7
  import { Instruction } from './instruction.js';
@@ -29,15 +29,19 @@ export class NoteHashExists extends Instruction {
29
29
 
30
30
  public async execute(context: AvmContext): Promise<void> {
31
31
  const memory = context.machineState.memory;
32
- context.machineState.consumeGas(this.gasCost());
32
+ const addressing = Addressing.fromWire(this.indirect);
33
+
34
+ context.machineState.consumeGas(
35
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
36
+ );
33
37
  const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
34
- const addressing = Addressing.fromWire(this.indirect, operands.length);
35
38
  const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
36
- memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
39
+ memory.checkTag(TypeTag.FIELD, noteHashOffset);
40
+ memory.checkTag(TypeTag.UINT64, leafIndexOffset);
37
41
 
38
42
  // Note that this instruction accepts any type in memory, and converts to Field.
39
43
  const noteHash = memory.get(noteHashOffset).toFr();
40
- const leafIndex = memory.get(leafIndexOffset).toFr();
44
+ const leafIndex = memory.get(leafIndexOffset).toBigInt();
41
45
 
42
46
  const exists = await context.persistableState.checkNoteHashExists(context.environment.address, noteHash, leafIndex);
43
47
  memory.set(existsOffset, exists ? new Uint1(1) : new Uint1(0));
@@ -50,16 +54,22 @@ export class EmitNoteHash extends Instruction {
50
54
  // Informs (de)serialization. See Instruction.deserialize.
51
55
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
52
56
 
53
- constructor(private indirect: number, private noteHashOffset: number) {
57
+ constructor(
58
+ private indirect: number,
59
+ private noteHashOffset: number,
60
+ ) {
54
61
  super();
55
62
  }
56
63
 
57
64
  public async execute(context: AvmContext): Promise<void> {
58
65
  const memory = context.machineState.memory;
59
- context.machineState.consumeGas(this.gasCost());
66
+ const addressing = Addressing.fromWire(this.indirect);
67
+
68
+ context.machineState.consumeGas(
69
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
70
+ );
60
71
 
61
72
  const operands = [this.noteHashOffset];
62
- const addressing = Addressing.fromWire(this.indirect, operands.length);
63
73
  const [noteHashOffset] = addressing.resolve(operands, memory);
64
74
  memory.checkTag(TypeTag.FIELD, noteHashOffset);
65
75
 
@@ -95,10 +105,13 @@ export class NullifierExists extends Instruction {
95
105
 
96
106
  public async execute(context: AvmContext): Promise<void> {
97
107
  const memory = context.machineState.memory;
98
- context.machineState.consumeGas(this.gasCost());
108
+ const addressing = Addressing.fromWire(this.indirect);
109
+
110
+ context.machineState.consumeGas(
111
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
112
+ );
99
113
 
100
114
  const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
101
- const addressing = Addressing.fromWire(this.indirect, operands.length);
102
115
  const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
103
116
  memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
104
117
 
@@ -116,7 +129,10 @@ export class EmitNullifier extends Instruction {
116
129
  // Informs (de)serialization. See Instruction.deserialize.
117
130
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
118
131
 
119
- constructor(private indirect: number, private nullifierOffset: number) {
132
+ constructor(
133
+ private indirect: number,
134
+ private nullifierOffset: number,
135
+ ) {
120
136
  super();
121
137
  }
122
138
 
@@ -126,10 +142,13 @@ export class EmitNullifier extends Instruction {
126
142
  }
127
143
 
128
144
  const memory = context.machineState.memory;
129
- context.machineState.consumeGas(this.gasCost());
145
+ const addressing = Addressing.fromWire(this.indirect);
146
+
147
+ context.machineState.consumeGas(
148
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
149
+ );
130
150
 
131
151
  const operands = [this.nullifierOffset];
132
- const addressing = Addressing.fromWire(this.indirect, operands.length);
133
152
  const [nullifierOffset] = addressing.resolve(operands, memory);
134
153
  memory.checkTag(TypeTag.FIELD, nullifierOffset);
135
154
 
@@ -172,20 +191,21 @@ export class L1ToL2MessageExists extends Instruction {
172
191
 
173
192
  public async execute(context: AvmContext): Promise<void> {
174
193
  const memory = context.machineState.memory;
175
- context.machineState.consumeGas(this.gasCost());
194
+ const addressing = Addressing.fromWire(this.indirect);
195
+
196
+ context.machineState.consumeGas(
197
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
198
+ );
176
199
 
177
200
  const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
178
- const addressing = Addressing.fromWire(this.indirect, operands.length);
179
201
  const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
180
- memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset);
202
+
203
+ memory.checkTag(TypeTag.FIELD, msgHashOffset);
204
+ memory.checkTag(TypeTag.UINT64, msgLeafIndexOffset);
181
205
 
182
206
  const msgHash = memory.get(msgHashOffset).toFr();
183
207
  const msgLeafIndex = memory.get(msgLeafIndexOffset).toFr();
184
- const exists = await context.persistableState.checkL1ToL2MessageExists(
185
- context.environment.address,
186
- msgHash,
187
- msgLeafIndex,
188
- );
208
+ const exists = await context.persistableState.checkL1ToL2MessageExists(msgHash, msgLeafIndex);
189
209
  memory.set(existsOffset, exists ? new Uint1(1) : new Uint1(0));
190
210
  }
191
211
  }
@@ -197,7 +217,11 @@ export class EmitUnencryptedLog extends Instruction {
197
217
  // Informs (de)serialization. See Instruction.deserialize.
198
218
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
199
219
 
200
- constructor(private indirect: number, private logOffset: number, private logSizeOffset: number) {
220
+ constructor(
221
+ private indirect: number,
222
+ private logSizeOffset: number,
223
+ private logOffset: number,
224
+ ) {
201
225
  super();
202
226
  }
203
227
 
@@ -207,17 +231,21 @@ export class EmitUnencryptedLog extends Instruction {
207
231
  }
208
232
 
209
233
  const memory = context.machineState.memory;
234
+ const addressing = Addressing.fromWire(this.indirect);
210
235
 
211
- const operands = [this.logOffset, this.logSizeOffset];
212
- const addressing = Addressing.fromWire(this.indirect, operands.length);
213
- const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
236
+ context.machineState.consumeGas(
237
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
238
+ );
239
+
240
+ const operands = [this.logSizeOffset, this.logOffset];
241
+ const [logSizeOffset, logOffset] = addressing.resolve(operands, memory);
214
242
  memory.checkTag(TypeTag.UINT32, logSizeOffset);
215
243
  const logSize = memory.get(logSizeOffset).toNumber();
216
244
  memory.checkTagsRange(TypeTag.FIELD, logOffset, logSize);
217
245
 
218
246
  const contractAddress = context.environment.address;
219
247
 
220
- context.machineState.consumeGas(this.gasCost(logSize));
248
+ context.machineState.consumeGas(this.dynamicGasCost(logSize));
221
249
  const log = memory.getSlice(logOffset, logSize).map(f => f.toFr());
222
250
  context.persistableState.writePublicLog(contractAddress, log);
223
251
  }
@@ -229,7 +257,11 @@ export class SendL2ToL1Message extends Instruction {
229
257
  // Informs (de)serialization. See Instruction.deserialize.
230
258
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
231
259
 
232
- constructor(private indirect: number, private recipientOffset: number, private contentOffset: number) {
260
+ constructor(
261
+ private indirect: number,
262
+ private recipientOffset: number,
263
+ private contentOffset: number,
264
+ ) {
233
265
  super();
234
266
  }
235
267
 
@@ -239,10 +271,13 @@ export class SendL2ToL1Message extends Instruction {
239
271
  }
240
272
 
241
273
  const memory = context.machineState.memory;
242
- context.machineState.consumeGas(this.gasCost());
274
+ const addressing = Addressing.fromWire(this.indirect);
275
+
276
+ context.machineState.consumeGas(
277
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
278
+ );
243
279
 
244
280
  const operands = [this.recipientOffset, this.contentOffset];
245
- const addressing = Addressing.fromWire(this.indirect, operands.length);
246
281
  const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
247
282
  memory.checkTags(TypeTag.FIELD, recipientOffset, contentOffset);
248
283
 
@@ -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.forOffset(0, TypeTag[baseAddrTag!], TypeTag[TypeTag.UINT32]);
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.forOffset(resolved[i], TypeTag[resolvedTag], TypeTag[TypeTag.UINT32]);
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.indirect);
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
 
@@ -93,3 +97,21 @@ export class FieldDiv extends ThreeOperandArithmeticInstruction {
93
97
  memory.checkTag(TypeTag.FIELD, aOffset); // Follows that bOffset has also tag of type Field
94
98
  }
95
99
  }
100
+
101
+ export class Shl extends ThreeOperandArithmeticInstruction {
102
+ static readonly type: string = 'SHL';
103
+ static readonly opcode = Opcode.SHL_8; // FIXME: needed for gas.
104
+
105
+ protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
106
+ return a.shl(b);
107
+ }
108
+ }
109
+
110
+ export class Shr extends ThreeOperandArithmeticInstruction {
111
+ static readonly type: string = 'SHR';
112
+ static readonly opcode = Opcode.SHR_8; // FIXME: needed for gas.
113
+
114
+ protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
115
+ return a.shr(b);
116
+ }
117
+ }
@@ -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.indirect);
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 indirect: 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.indirect);
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.indirect);
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);
@@ -20,7 +20,6 @@ export class GetContractInstance extends Instruction {
20
20
  OperandType.UINT8, // indirect 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
 
@@ -28,7 +27,6 @@ export class GetContractInstance extends Instruction {
28
27
  private indirect: 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.indirect);
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,9 @@ export class GetContractInstance extends Instruction {
66
67
  }
67
68
  }
68
69
 
70
+ const existsOffset = dstOffset;
71
+ const memberValueOffset = dstOffset + 1;
69
72
  memory.set(existsOffset, new Uint1(exists ? 1 : 0));
70
- memory.set(dstOffset, memberValue);
73
+ memory.set(memberValueOffset, memberValue);
71
74
  }
72
75
  }
@@ -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 indirect: 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.indirect);
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) {