@aztec/simulator 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (304) hide show
  1. package/dest/acvm/acvm.js +18 -21
  2. package/dest/acvm/acvm_types.js +3 -2
  3. package/dest/acvm/deserialize.js +9 -13
  4. package/dest/acvm/index.js +0 -1
  5. package/dest/acvm/oracle/index.js +0 -1
  6. package/dest/acvm/oracle/oracle.js +42 -23
  7. package/dest/acvm/oracle/typed_oracle.js +36 -38
  8. package/dest/acvm/serialize.js +7 -14
  9. package/dest/avm/avm_context.js +24 -27
  10. package/dest/avm/avm_contract_call_result.js +12 -7
  11. package/dest/avm/avm_execution_environment.js +10 -7
  12. package/dest/avm/avm_gas.js +93 -56
  13. package/dest/avm/avm_machine_state.js +60 -61
  14. package/dest/avm/avm_memory_types.js +166 -255
  15. package/dest/avm/avm_simulator.js +68 -47
  16. package/dest/avm/avm_tree.js +282 -276
  17. package/dest/avm/bytecode_utils.js +8 -6
  18. package/dest/avm/errors.js +46 -63
  19. package/dest/avm/fixtures/avm_simulation_tester.js +18 -17
  20. package/dest/avm/fixtures/base_avm_simulation_tester.js +21 -16
  21. package/dest/avm/fixtures/index.js +27 -26
  22. package/dest/avm/fixtures/simple_contract_data_source.js +9 -13
  23. package/dest/avm/index.js +0 -1
  24. package/dest/avm/journal/index.js +0 -1
  25. package/dest/avm/journal/journal.js +147 -200
  26. package/dest/avm/journal/nullifiers.js +43 -46
  27. package/dest/avm/journal/public_storage.js +73 -87
  28. package/dest/avm/opcodes/accrued_substate.js +140 -110
  29. package/dest/avm/opcodes/addressing_mode.js +29 -31
  30. package/dest/avm/opcodes/arithmetic.js +17 -15
  31. package/dest/avm/opcodes/bitwise.js +40 -26
  32. package/dest/avm/opcodes/comparators.js +12 -10
  33. package/dest/avm/opcodes/contract.js +31 -29
  34. package/dest/avm/opcodes/control_flow.js +47 -43
  35. package/dest/avm/opcodes/conversion.js +30 -26
  36. package/dest/avm/opcodes/ec_add.js +35 -34
  37. package/dest/avm/opcodes/environment_getters.js +33 -33
  38. package/dest/avm/opcodes/external_calls.js +83 -74
  39. package/dest/avm/opcodes/hashing.js +69 -61
  40. package/dest/avm/opcodes/index.js +0 -1
  41. package/dest/avm/opcodes/instruction.js +31 -40
  42. package/dest/avm/opcodes/instruction_impl.js +12 -15
  43. package/dest/avm/opcodes/memory.js +177 -156
  44. package/dest/avm/opcodes/misc.js +27 -25
  45. package/dest/avm/opcodes/multi_scalar_mul.js +43 -41
  46. package/dest/avm/opcodes/storage.js +28 -25
  47. package/dest/avm/serialization/buffer_cursor.js +4 -4
  48. package/dest/avm/serialization/bytecode_serialization.js +292 -89
  49. package/dest/avm/serialization/instruction_serialization.js +67 -28
  50. package/dest/avm/test_utils.js +6 -9
  51. package/dest/client/client_execution_context.js +197 -219
  52. package/dest/client/db_oracle.js +4 -7
  53. package/dest/client/execution_note_cache.js +80 -81
  54. package/dest/client/index.js +0 -1
  55. package/dest/client/pick_notes.js +27 -30
  56. package/dest/client/private_execution.js +13 -14
  57. package/dest/client/simulator.js +44 -48
  58. package/dest/client/unconstrained_execution.js +8 -11
  59. package/dest/client/view_data_oracle.js +130 -139
  60. package/dest/common/debug_fn_name.js +1 -4
  61. package/dest/common/errors.js +30 -39
  62. package/dest/common/hashed_values_cache.js +16 -20
  63. package/dest/common/index.js +0 -1
  64. package/dest/common/message_load_oracle_inputs.js +7 -7
  65. package/dest/common/simulation_provider.js +3 -6
  66. package/dest/common.js +0 -1
  67. package/dest/providers/acvm_native.js +46 -32
  68. package/dest/providers/acvm_wasm.js +18 -10
  69. package/dest/providers/acvm_wasm_with_blobs.js +2 -5
  70. package/dest/providers/factory.js +5 -5
  71. package/dest/providers/index.js +0 -1
  72. package/dest/public/bytecode_errors.js +1 -2
  73. package/dest/public/db_interfaces.js +1 -2
  74. package/dest/public/execution.js +2 -4
  75. package/dest/public/executor_metrics.js +16 -12
  76. package/dest/public/fee_payment.js +2 -5
  77. package/dest/public/fixtures/index.js +0 -1
  78. package/dest/public/fixtures/public_tx_simulation_tester.js +13 -17
  79. package/dest/public/fixtures/utils.js +11 -14
  80. package/dest/public/index.js +0 -1
  81. package/dest/public/public_db_sources.js +79 -87
  82. package/dest/public/public_processor.js +310 -306
  83. package/dest/public/public_processor_metrics.js +46 -27
  84. package/dest/public/public_tx_context.js +97 -118
  85. package/dest/public/public_tx_simulator.js +299 -314
  86. package/dest/public/side_effect_errors.js +1 -2
  87. package/dest/public/side_effect_trace.js +44 -71
  88. package/dest/public/side_effect_trace_interface.js +1 -2
  89. package/dest/public/unique_class_ids.js +22 -27
  90. package/dest/public/utils.js +16 -11
  91. package/dest/server.js +0 -1
  92. package/dest/stats/index.js +0 -1
  93. package/dest/stats/stats.js +1 -2
  94. package/dest/test/utils.js +5 -4
  95. package/package.json +11 -11
  96. package/src/acvm/oracle/typed_oracle.ts +34 -34
  97. package/src/avm/avm_machine_state.ts +18 -14
  98. package/src/avm/avm_memory_types.ts +43 -183
  99. package/src/avm/avm_simulator.ts +37 -11
  100. package/src/avm/opcodes/accrued_substate.ts +7 -21
  101. package/src/avm/opcodes/addressing_mode.ts +9 -2
  102. package/src/avm/opcodes/arithmetic.ts +1 -3
  103. package/src/avm/opcodes/bitwise.ts +2 -6
  104. package/src/avm/opcodes/comparators.ts +1 -3
  105. package/src/avm/opcodes/contract.ts +1 -3
  106. package/src/avm/opcodes/control_flow.ts +1 -9
  107. package/src/avm/opcodes/conversion.ts +1 -3
  108. package/src/avm/opcodes/ec_add.ts +1 -3
  109. package/src/avm/opcodes/environment_getters.ts +1 -3
  110. package/src/avm/opcodes/external_calls.ts +3 -6
  111. package/src/avm/opcodes/hashing.ts +3 -9
  112. package/src/avm/opcodes/memory.ts +6 -20
  113. package/src/avm/opcodes/misc.ts +1 -3
  114. package/src/avm/opcodes/multi_scalar_mul.ts +1 -7
  115. package/src/avm/opcodes/storage.ts +2 -6
  116. package/src/client/index.ts +2 -2
  117. package/dest/acvm/acvm.d.ts +0 -35
  118. package/dest/acvm/acvm.d.ts.map +0 -1
  119. package/dest/acvm/acvm_types.d.ts +0 -10
  120. package/dest/acvm/acvm_types.d.ts.map +0 -1
  121. package/dest/acvm/deserialize.d.ts +0 -36
  122. package/dest/acvm/deserialize.d.ts.map +0 -1
  123. package/dest/acvm/index.d.ts +0 -6
  124. package/dest/acvm/index.d.ts.map +0 -1
  125. package/dest/acvm/oracle/index.d.ts +0 -14
  126. package/dest/acvm/oracle/index.d.ts.map +0 -1
  127. package/dest/acvm/oracle/oracle.d.ts +0 -49
  128. package/dest/acvm/oracle/oracle.d.ts.map +0 -1
  129. package/dest/acvm/oracle/typed_oracle.d.ts +0 -75
  130. package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
  131. package/dest/acvm/serialize.d.ts +0 -20
  132. package/dest/acvm/serialize.d.ts.map +0 -1
  133. package/dest/avm/avm_context.d.ts +0 -39
  134. package/dest/avm/avm_context.d.ts.map +0 -1
  135. package/dest/avm/avm_contract_call_result.d.ts +0 -30
  136. package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
  137. package/dest/avm/avm_execution_environment.d.ts +0 -21
  138. package/dest/avm/avm_execution_environment.d.ts.map +0 -1
  139. package/dest/avm/avm_gas.d.ts +0 -60
  140. package/dest/avm/avm_gas.d.ts.map +0 -1
  141. package/dest/avm/avm_machine_state.d.ts +0 -93
  142. package/dest/avm/avm_machine_state.d.ts.map +0 -1
  143. package/dest/avm/avm_memory_types.d.ts +0 -310
  144. package/dest/avm/avm_memory_types.d.ts.map +0 -1
  145. package/dest/avm/avm_simulator.d.ts +0 -37
  146. package/dest/avm/avm_simulator.d.ts.map +0 -1
  147. package/dest/avm/avm_tree.d.ts +0 -281
  148. package/dest/avm/avm_tree.d.ts.map +0 -1
  149. package/dest/avm/bytecode_utils.d.ts +0 -5
  150. package/dest/avm/bytecode_utils.d.ts.map +0 -1
  151. package/dest/avm/errors.d.ts +0 -121
  152. package/dest/avm/errors.d.ts.map +0 -1
  153. package/dest/avm/fixtures/avm_simulation_tester.d.ts +0 -21
  154. package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  155. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +0 -35
  156. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  157. package/dest/avm/fixtures/index.d.ts +0 -67
  158. package/dest/avm/fixtures/index.d.ts.map +0 -1
  159. package/dest/avm/fixtures/simple_contract_data_source.d.ts +0 -31
  160. package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  161. package/dest/avm/index.d.ts +0 -4
  162. package/dest/avm/index.d.ts.map +0 -1
  163. package/dest/avm/journal/index.d.ts +0 -2
  164. package/dest/avm/journal/index.d.ts.map +0 -1
  165. package/dest/avm/journal/journal.d.ts +0 -176
  166. package/dest/avm/journal/journal.d.ts.map +0 -1
  167. package/dest/avm/journal/nullifiers.d.ts +0 -62
  168. package/dest/avm/journal/nullifiers.d.ts.map +0 -1
  169. package/dest/avm/journal/public_storage.d.ts +0 -66
  170. package/dest/avm/journal/public_storage.d.ts.map +0 -1
  171. package/dest/avm/opcodes/accrued_substate.d.ts +0 -75
  172. package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
  173. package/dest/avm/opcodes/addressing_mode.d.ts +0 -27
  174. package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
  175. package/dest/avm/opcodes/arithmetic.d.ts +0 -37
  176. package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
  177. package/dest/avm/opcodes/bitwise.d.ts +0 -50
  178. package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
  179. package/dest/avm/opcodes/comparators.d.ts +0 -25
  180. package/dest/avm/opcodes/comparators.d.ts.map +0 -1
  181. package/dest/avm/opcodes/contract.d.ts +0 -21
  182. package/dest/avm/opcodes/contract.d.ts.map +0 -1
  183. package/dest/avm/opcodes/control_flow.d.ts +0 -41
  184. package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
  185. package/dest/avm/opcodes/conversion.d.ts +0 -17
  186. package/dest/avm/opcodes/conversion.d.ts.map +0 -1
  187. package/dest/avm/opcodes/ec_add.d.ts +0 -19
  188. package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
  189. package/dest/avm/opcodes/environment_getters.d.ts +0 -28
  190. package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
  191. package/dest/avm/opcodes/external_calls.d.ts +0 -50
  192. package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
  193. package/dest/avm/opcodes/hashing.d.ts +0 -36
  194. package/dest/avm/opcodes/hashing.d.ts.map +0 -1
  195. package/dest/avm/opcodes/index.d.ts +0 -16
  196. package/dest/avm/opcodes/index.d.ts.map +0 -1
  197. package/dest/avm/opcodes/instruction.d.ts +0 -70
  198. package/dest/avm/opcodes/instruction.d.ts.map +0 -1
  199. package/dest/avm/opcodes/instruction_impl.d.ts +0 -19
  200. package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
  201. package/dest/avm/opcodes/memory.d.ts +0 -74
  202. package/dest/avm/opcodes/memory.d.ts.map +0 -1
  203. package/dest/avm/opcodes/misc.d.ts +0 -17
  204. package/dest/avm/opcodes/misc.d.ts.map +0 -1
  205. package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
  206. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
  207. package/dest/avm/opcodes/storage.d.ts +0 -24
  208. package/dest/avm/opcodes/storage.d.ts.map +0 -1
  209. package/dest/avm/serialization/buffer_cursor.d.ts +0 -28
  210. package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
  211. package/dest/avm/serialization/bytecode_serialization.d.ts +0 -21
  212. package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  213. package/dest/avm/serialization/instruction_serialization.d.ts +0 -105
  214. package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
  215. package/dest/avm/test_utils.d.ts +0 -16
  216. package/dest/avm/test_utils.d.ts.map +0 -1
  217. package/dest/client/client_execution_context.d.ts +0 -214
  218. package/dest/client/client_execution_context.d.ts.map +0 -1
  219. package/dest/client/db_oracle.d.ts +0 -229
  220. package/dest/client/db_oracle.d.ts.map +0 -1
  221. package/dest/client/execution_note_cache.d.ts +0 -93
  222. package/dest/client/execution_note_cache.d.ts.map +0 -1
  223. package/dest/client/index.d.ts +0 -15
  224. package/dest/client/index.d.ts.map +0 -1
  225. package/dest/client/pick_notes.d.ts +0 -85
  226. package/dest/client/pick_notes.d.ts.map +0 -1
  227. package/dest/client/private_execution.d.ts +0 -19
  228. package/dest/client/private_execution.d.ts.map +0 -1
  229. package/dest/client/simulator.d.ts +0 -60
  230. package/dest/client/simulator.d.ts.map +0 -1
  231. package/dest/client/unconstrained_execution.d.ts +0 -10
  232. package/dest/client/unconstrained_execution.d.ts.map +0 -1
  233. package/dest/client/view_data_oracle.d.ts +0 -159
  234. package/dest/client/view_data_oracle.d.ts.map +0 -1
  235. package/dest/common/debug_fn_name.d.ts +0 -4
  236. package/dest/common/debug_fn_name.d.ts.map +0 -1
  237. package/dest/common/errors.d.ts +0 -54
  238. package/dest/common/errors.d.ts.map +0 -1
  239. package/dest/common/hashed_values_cache.d.ts +0 -28
  240. package/dest/common/hashed_values_cache.d.ts.map +0 -1
  241. package/dest/common/index.d.ts +0 -3
  242. package/dest/common/index.d.ts.map +0 -1
  243. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  244. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  245. package/dest/common/simulation_provider.d.ts +0 -19
  246. package/dest/common/simulation_provider.d.ts.map +0 -1
  247. package/dest/common.d.ts +0 -2
  248. package/dest/common.d.ts.map +0 -1
  249. package/dest/providers/acvm_native.d.ts +0 -40
  250. package/dest/providers/acvm_native.d.ts.map +0 -1
  251. package/dest/providers/acvm_wasm.d.ts +0 -15
  252. package/dest/providers/acvm_wasm.d.ts.map +0 -1
  253. package/dest/providers/acvm_wasm_with_blobs.d.ts +0 -19
  254. package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  255. package/dest/providers/factory.d.ts +0 -12
  256. package/dest/providers/factory.d.ts.map +0 -1
  257. package/dest/providers/index.d.ts +0 -5
  258. package/dest/providers/index.d.ts.map +0 -1
  259. package/dest/public/bytecode_errors.d.ts +0 -4
  260. package/dest/public/bytecode_errors.d.ts.map +0 -1
  261. package/dest/public/db_interfaces.d.ts +0 -105
  262. package/dest/public/db_interfaces.d.ts.map +0 -1
  263. package/dest/public/execution.d.ts +0 -102
  264. package/dest/public/execution.d.ts.map +0 -1
  265. package/dest/public/executor_metrics.d.ts +0 -13
  266. package/dest/public/executor_metrics.d.ts.map +0 -1
  267. package/dest/public/fee_payment.d.ts +0 -11
  268. package/dest/public/fee_payment.d.ts.map +0 -1
  269. package/dest/public/fixtures/index.d.ts +0 -3
  270. package/dest/public/fixtures/index.d.ts.map +0 -1
  271. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +0 -21
  272. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +0 -1
  273. package/dest/public/fixtures/utils.d.ts +0 -17
  274. package/dest/public/fixtures/utils.d.ts.map +0 -1
  275. package/dest/public/index.d.ts +0 -9
  276. package/dest/public/index.d.ts.map +0 -1
  277. package/dest/public/public_db_sources.d.ts +0 -81
  278. package/dest/public/public_db_sources.d.ts.map +0 -1
  279. package/dest/public/public_processor.d.ts +0 -72
  280. package/dest/public/public_processor.d.ts.map +0 -1
  281. package/dest/public/public_processor_metrics.d.ts +0 -27
  282. package/dest/public/public_processor_metrics.d.ts.map +0 -1
  283. package/dest/public/public_tx_context.d.ts +0 -131
  284. package/dest/public/public_tx_context.d.ts.map +0 -1
  285. package/dest/public/public_tx_simulator.d.ts +0 -99
  286. package/dest/public/public_tx_simulator.d.ts.map +0 -1
  287. package/dest/public/side_effect_errors.d.ts +0 -4
  288. package/dest/public/side_effect_errors.d.ts.map +0 -1
  289. package/dest/public/side_effect_trace.d.ts +0 -126
  290. package/dest/public/side_effect_trace.d.ts.map +0 -1
  291. package/dest/public/side_effect_trace_interface.d.ts +0 -32
  292. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  293. package/dest/public/unique_class_ids.d.ts +0 -37
  294. package/dest/public/unique_class_ids.d.ts.map +0 -1
  295. package/dest/public/utils.d.ts +0 -5
  296. package/dest/public/utils.d.ts.map +0 -1
  297. package/dest/server.d.ts +0 -6
  298. package/dest/server.d.ts.map +0 -1
  299. package/dest/stats/index.d.ts +0 -2
  300. package/dest/stats/index.d.ts.map +0 -1
  301. package/dest/stats/stats.d.ts +0 -4
  302. package/dest/stats/stats.d.ts.map +0 -1
  303. package/dest/test/utils.d.ts +0 -12
  304. package/dest/test/utils.d.ts.map +0 -1
@@ -57,70 +57,70 @@ export abstract class TypedOracle {
57
57
  }
58
58
 
59
59
  storeInExecutionCache(_values: Fr[]): Promise<Fr> {
60
- throw new OracleMethodNotAvailableError('storeInExecutionCache');
60
+ return Promise.reject(new OracleMethodNotAvailableError('storeInExecutionCache'));
61
61
  }
62
62
 
63
63
  loadFromExecutionCache(_hash: Fr): Promise<Fr[]> {
64
- throw new OracleMethodNotAvailableError('loadFromExecutionCache');
64
+ return Promise.reject(new OracleMethodNotAvailableError('loadFromExecutionCache'));
65
65
  }
66
66
 
67
67
  getBlockNumber(): Promise<number> {
68
- throw new OracleMethodNotAvailableError('getBlockNumber');
68
+ return Promise.reject(new OracleMethodNotAvailableError('getBlockNumber'));
69
69
  }
70
70
 
71
71
  getContractAddress(): Promise<AztecAddress> {
72
- throw new OracleMethodNotAvailableError('getContractAddress');
72
+ return Promise.reject(new OracleMethodNotAvailableError('getContractAddress'));
73
73
  }
74
74
 
75
75
  getChainId(): Promise<Fr> {
76
- throw new OracleMethodNotAvailableError('getChainId');
76
+ return Promise.reject(new OracleMethodNotAvailableError('getChainId'));
77
77
  }
78
78
 
79
79
  getVersion(): Promise<Fr> {
80
- throw new OracleMethodNotAvailableError('getVersion');
80
+ return Promise.reject(new OracleMethodNotAvailableError('getVersion'));
81
81
  }
82
82
 
83
83
  getKeyValidationRequest(_pkMHash: Fr): Promise<KeyValidationRequest> {
84
- throw new OracleMethodNotAvailableError('getKeyValidationRequest');
84
+ return Promise.reject(new OracleMethodNotAvailableError('getKeyValidationRequest'));
85
85
  }
86
86
 
87
87
  getContractInstance(_address: AztecAddress): Promise<ContractInstance> {
88
- throw new OracleMethodNotAvailableError('getContractInstance');
88
+ return Promise.reject(new OracleMethodNotAvailableError('getContractInstance'));
89
89
  }
90
90
 
91
91
  getMembershipWitness(_blockNumber: number, _treeId: MerkleTreeId, _leafValue: Fr): Promise<Fr[] | undefined> {
92
- throw new OracleMethodNotAvailableError('getMembershipWitness');
92
+ return Promise.reject(new OracleMethodNotAvailableError('getMembershipWitness'));
93
93
  }
94
94
 
95
95
  getNullifierMembershipWitness(_blockNumber: number, _nullifier: Fr): Promise<NullifierMembershipWitness | undefined> {
96
- throw new OracleMethodNotAvailableError('getNullifierMembershipWitness');
96
+ return Promise.reject(new OracleMethodNotAvailableError('getNullifierMembershipWitness'));
97
97
  }
98
98
 
99
99
  getPublicDataTreeWitness(_blockNumber: number, _leafSlot: Fr): Promise<PublicDataWitness | undefined> {
100
- throw new OracleMethodNotAvailableError('getPublicDataTreeWitness');
100
+ return Promise.reject(new OracleMethodNotAvailableError('getPublicDataTreeWitness'));
101
101
  }
102
102
 
103
103
  getLowNullifierMembershipWitness(
104
104
  _blockNumber: number,
105
105
  _nullifier: Fr,
106
106
  ): Promise<NullifierMembershipWitness | undefined> {
107
- throw new OracleMethodNotAvailableError('getLowNullifierMembershipWitness');
107
+ return Promise.reject(new OracleMethodNotAvailableError('getLowNullifierMembershipWitness'));
108
108
  }
109
109
 
110
110
  getBlockHeader(_blockNumber: number): Promise<BlockHeader | undefined> {
111
- throw new OracleMethodNotAvailableError('getBlockHeader');
111
+ return Promise.reject(new OracleMethodNotAvailableError('getBlockHeader'));
112
112
  }
113
113
 
114
114
  getCompleteAddress(_account: AztecAddress): Promise<CompleteAddress> {
115
- throw new OracleMethodNotAvailableError('getCompleteAddress');
115
+ return Promise.reject(new OracleMethodNotAvailableError('getCompleteAddress'));
116
116
  }
117
117
 
118
118
  getAuthWitness(_messageHash: Fr): Promise<Fr[] | undefined> {
119
- throw new OracleMethodNotAvailableError('getAuthWitness');
119
+ return Promise.reject(new OracleMethodNotAvailableError('getAuthWitness'));
120
120
  }
121
121
 
122
122
  popCapsule(): Promise<Fr[]> {
123
- throw new OracleMethodNotAvailableError('popCapsule');
123
+ return Promise.reject(new OracleMethodNotAvailableError('popCapsule'));
124
124
  }
125
125
 
126
126
  getNotes(
@@ -139,7 +139,7 @@ export abstract class TypedOracle {
139
139
  _offset: number,
140
140
  _status: NoteStatus,
141
141
  ): Promise<NoteData[]> {
142
- throw new OracleMethodNotAvailableError('getNotes');
142
+ return Promise.reject(new OracleMethodNotAvailableError('getNotes'));
143
143
  }
144
144
 
145
145
  notifyCreatedNote(_storageSlot: Fr, _noteTypeId: NoteSelector, _note: Fr[], _noteHash: Fr, _counter: number): void {
@@ -147,15 +147,15 @@ export abstract class TypedOracle {
147
147
  }
148
148
 
149
149
  notifyNullifiedNote(_innerNullifier: Fr, _noteHash: Fr, _counter: number): Promise<void> {
150
- throw new OracleMethodNotAvailableError('notifyNullifiedNote');
150
+ return Promise.reject(new OracleMethodNotAvailableError('notifyNullifiedNote'));
151
151
  }
152
152
 
153
153
  notifyCreatedNullifier(_innerNullifier: Fr): Promise<void> {
154
- throw new OracleMethodNotAvailableError('notifyCreatedNullifier');
154
+ return Promise.reject(new OracleMethodNotAvailableError('notifyCreatedNullifier'));
155
155
  }
156
156
 
157
157
  checkNullifierExists(_innerNullifier: Fr): Promise<boolean> {
158
- throw new OracleMethodNotAvailableError('checkNullifierExists');
158
+ return Promise.reject(new OracleMethodNotAvailableError('checkNullifierExists'));
159
159
  }
160
160
 
161
161
  getL1ToL2MembershipWitness(
@@ -163,7 +163,7 @@ export abstract class TypedOracle {
163
163
  _messageHash: Fr,
164
164
  _secret: Fr,
165
165
  ): Promise<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
166
- throw new OracleMethodNotAvailableError('getL1ToL2MembershipWitness');
166
+ return Promise.reject(new OracleMethodNotAvailableError('getL1ToL2MembershipWitness'));
167
167
  }
168
168
 
169
169
  storageRead(
@@ -172,11 +172,11 @@ export abstract class TypedOracle {
172
172
  _blockNumber: number,
173
173
  _numberOfElements: number,
174
174
  ): Promise<Fr[]> {
175
- throw new OracleMethodNotAvailableError('storageRead');
175
+ return Promise.reject(new OracleMethodNotAvailableError('storageRead'));
176
176
  }
177
177
 
178
178
  storageWrite(_startStorageSlot: Fr, _values: Fr[]): Promise<Fr[]> {
179
- throw new OracleMethodNotAvailableError('storageWrite');
179
+ return Promise.reject(new OracleMethodNotAvailableError('storageWrite'));
180
180
  }
181
181
 
182
182
  emitContractClassLog(_log: UnencryptedL2Log, _counter: number): Fr {
@@ -190,7 +190,7 @@ export abstract class TypedOracle {
190
190
  _sideEffectCounter: number,
191
191
  _isStaticCall: boolean,
192
192
  ): Promise<{ endSideEffectCounter: Fr; returnsHash: Fr }> {
193
- throw new OracleMethodNotAvailableError('callPrivateFunction');
193
+ return Promise.reject(new OracleMethodNotAvailableError('callPrivateFunction'));
194
194
  }
195
195
 
196
196
  enqueuePublicFunctionCall(
@@ -200,7 +200,7 @@ export abstract class TypedOracle {
200
200
  _sideEffectCounter: number,
201
201
  _isStaticCall: boolean,
202
202
  ): Promise<Fr> {
203
- throw new OracleMethodNotAvailableError('enqueuePublicFunctionCall');
203
+ return Promise.reject(new OracleMethodNotAvailableError('enqueuePublicFunctionCall'));
204
204
  }
205
205
 
206
206
  setPublicTeardownFunctionCall(
@@ -210,7 +210,7 @@ export abstract class TypedOracle {
210
210
  _sideEffectCounter: number,
211
211
  _isStaticCall: boolean,
212
212
  ): Promise<Fr> {
213
- throw new OracleMethodNotAvailableError('setPublicTeardownFunctionCall');
213
+ return Promise.reject(new OracleMethodNotAvailableError('setPublicTeardownFunctionCall'));
214
214
  }
215
215
 
216
216
  notifySetMinRevertibleSideEffectCounter(_minRevertibleSideEffectCounter: number): void {
@@ -222,15 +222,15 @@ export abstract class TypedOracle {
222
222
  }
223
223
 
224
224
  getIndexedTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<IndexedTaggingSecret> {
225
- throw new OracleMethodNotAvailableError('getIndexedTaggingSecretAsSender');
225
+ return Promise.reject(new OracleMethodNotAvailableError('getIndexedTaggingSecretAsSender'));
226
226
  }
227
227
 
228
228
  incrementAppTaggingSecretIndexAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<void> {
229
- throw new OracleMethodNotAvailableError('incrementAppTaggingSecretIndexAsSender');
229
+ return Promise.reject(new OracleMethodNotAvailableError('incrementAppTaggingSecretIndexAsSender'));
230
230
  }
231
231
 
232
232
  syncNotes(): Promise<void> {
233
- throw new OracleMethodNotAvailableError('syncNotes');
233
+ return Promise.reject(new OracleMethodNotAvailableError('syncNotes'));
234
234
  }
235
235
 
236
236
  deliverNote(
@@ -243,22 +243,22 @@ export abstract class TypedOracle {
243
243
  _txHash: Fr,
244
244
  _recipient: AztecAddress,
245
245
  ): Promise<void> {
246
- throw new OracleMethodNotAvailableError('deliverNote');
246
+ return Promise.reject(new OracleMethodNotAvailableError('deliverNote'));
247
247
  }
248
248
 
249
249
  dbStore(_contractAddress: AztecAddress, _key: Fr, _values: Fr[]): Promise<void> {
250
- throw new OracleMethodNotAvailableError('dbStore');
250
+ return Promise.reject(new OracleMethodNotAvailableError('dbStore'));
251
251
  }
252
252
 
253
253
  dbLoad(_contractAddress: AztecAddress, _key: Fr): Promise<Fr[] | null> {
254
- throw new OracleMethodNotAvailableError('dbLoad');
254
+ return Promise.reject(new OracleMethodNotAvailableError('dbLoad'));
255
255
  }
256
256
 
257
257
  dbDelete(_contractAddress: AztecAddress, _key: Fr): Promise<void> {
258
- throw new OracleMethodNotAvailableError('dbDelete');
258
+ return Promise.reject(new OracleMethodNotAvailableError('dbDelete'));
259
259
  }
260
260
 
261
261
  dbCopy(_contractAddress: AztecAddress, _srcKey: Fr, _dstKey: Fr, _numEntries: number): Promise<void> {
262
- throw new OracleMethodNotAvailableError('dbCopy');
262
+ return Promise.reject(new OracleMethodNotAvailableError('dbCopy'));
263
263
  }
264
264
  }
@@ -1,6 +1,6 @@
1
1
  import { type Fr } from '@aztec/circuits.js';
2
2
 
3
- import { GAS_DIMENSIONS, type Gas } from './avm_gas.js';
3
+ import { type Gas } from './avm_gas.js';
4
4
  import { TaggedMemory } from './avm_memory_types.js';
5
5
  import { type AvmRevertReason, OutOfGasError } from './errors.js';
6
6
 
@@ -92,26 +92,29 @@ export class AvmMachineState {
92
92
  */
93
93
  public consumeGas(gasCost: Partial<Gas>) {
94
94
  // Assert there is enough gas on every dimension.
95
- const outOfGasDimensions = GAS_DIMENSIONS.filter(
96
- dimension => this[`${dimension}Left`] - (gasCost[dimension] ?? 0) < 0,
97
- );
95
+ const outOfL2Gas = this.l2GasLeft - (gasCost.l2Gas ?? 0) < 0;
96
+ const outOfDaGas = this.daGasLeft - (gasCost.daGas ?? 0) < 0;
98
97
  // If not, trigger an exceptional halt.
99
- // See https://yp-aztec.netlify.app/docs/public-vm/execution#gas-checks-and-tracking
100
- if (outOfGasDimensions.length > 0) {
98
+ if (outOfL2Gas || outOfDaGas) {
101
99
  this.exceptionalHalt();
102
- throw new OutOfGasError(outOfGasDimensions);
100
+ const dimensions = [];
101
+ if (outOfL2Gas) {
102
+ dimensions.push('l2Gas');
103
+ }
104
+ if (outOfDaGas) {
105
+ dimensions.push('daGas');
106
+ }
107
+ throw new OutOfGasError(dimensions);
103
108
  }
104
109
  // Otherwise, charge the corresponding gas
105
- for (const dimension of GAS_DIMENSIONS) {
106
- this[`${dimension}Left`] -= gasCost[dimension] ?? 0;
107
- }
110
+ this.l2GasLeft -= gasCost.l2Gas ?? 0;
111
+ this.daGasLeft -= gasCost.daGas ?? 0;
108
112
  }
109
113
 
110
114
  /** Increases the gas left by the amounts specified. */
111
115
  public refundGas(gasRefund: Partial<Gas>) {
112
- for (const dimension of GAS_DIMENSIONS) {
113
- this[`${dimension}Left`] += gasRefund[dimension] ?? 0;
114
- }
116
+ this.l2GasLeft += gasRefund.l2Gas ?? 0;
117
+ this.daGasLeft += gasRefund.daGas ?? 0;
115
118
  }
116
119
 
117
120
  /**
@@ -151,7 +154,8 @@ export class AvmMachineState {
151
154
  * Flag an exceptional halt. Clears gas left and sets the reverted flag. No output data.
152
155
  */
153
156
  private exceptionalHalt() {
154
- GAS_DIMENSIONS.forEach(dimension => (this[`${dimension}Left`] = 0));
157
+ this.l2GasLeft = 0;
158
+ this.daGasLeft = 0;
155
159
  this.reverted = true;
156
160
  this.halted = true;
157
161
  }
@@ -15,13 +15,7 @@ import { type FunctionsOf } from '@aztec/foundation/types';
15
15
 
16
16
  import { strict as assert } from 'assert';
17
17
 
18
- import {
19
- InstructionExecutionError,
20
- InvalidTagValueError,
21
- MemorySliceOutOfRangeError,
22
- TagCheckError,
23
- } from './errors.js';
24
- import { Addressing, AddressingMode } from './opcodes/addressing_mode.js';
18
+ import { InvalidTagValueError, MemorySliceOutOfRangeError, TagCheckError } from './errors.js';
25
19
 
26
20
  /** MemoryValue gathers the common operations for all memory types. */
27
21
  export abstract class MemoryValue {
@@ -251,22 +245,14 @@ export class TaggedMemory implements TaggedMemoryInterface {
251
245
  return TaggedMemory.MAX_MEMORY_SIZE;
252
246
  }
253
247
 
254
- /** Returns a MeteredTaggedMemory instance to track the number of reads and writes if TRACK_MEMORY_ACCESSES is set. */
255
- public track(type: string = 'instruction'): TaggedMemoryInterface {
256
- return TaggedMemory.TRACK_MEMORY_ACCESSES ? new MeteredTaggedMemory(this, type) : this;
257
- }
258
-
259
248
  public get(offset: number): MemoryValue {
260
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
261
- const value = this.getAs<MemoryValue>(offset);
262
- return value;
249
+ return this.getAs<MemoryValue>(offset);
263
250
  }
264
251
 
265
252
  public getAs<T>(offset: number): T {
266
- assert(Number.isInteger(offset));
267
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
253
+ assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
268
254
  const word = this._mem.get(offset);
269
- TaggedMemory.log.trace(`get(${offset}) = ${word}`);
255
+ //TaggedMemory.log.trace(`get(${offset}) = ${word}`);
270
256
  if (word === undefined) {
271
257
  TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`);
272
258
  return new Field(0) as T;
@@ -300,10 +286,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
300
286
  }
301
287
 
302
288
  public set(offset: number, v: MemoryValue) {
303
- assert(Number.isInteger(offset));
304
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
289
+ assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
305
290
  this._mem.set(offset, v);
306
- TaggedMemory.log.trace(`set(${offset}, ${v})`);
291
+ //TaggedMemory.log.trace(`set(${offset}, ${v})`);
307
292
  }
308
293
 
309
294
  public setSlice(offset: number, slice: MemoryValue[]) {
@@ -320,8 +305,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
320
305
  }
321
306
 
322
307
  public getTag(offset: number): TypeTag {
323
- assert(Number.isInteger(offset));
324
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
308
+ assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
325
309
  return TaggedMemory.getTag(this._mem.get(offset));
326
310
  }
327
311
 
@@ -340,25 +324,13 @@ export class TaggedMemory implements TaggedMemoryInterface {
340
324
  }
341
325
 
342
326
  public static checkIsIntegralTag(tag: TypeTag) {
343
- if (
344
- ![TypeTag.UINT1, TypeTag.UINT8, TypeTag.UINT16, TypeTag.UINT32, TypeTag.UINT64, TypeTag.UINT128].includes(tag)
345
- ) {
327
+ if (!INTEGRAL_TAGS.has(tag)) {
346
328
  throw TagCheckError.forTag(TypeTag[tag], 'integral');
347
329
  }
348
330
  }
349
331
 
350
332
  public static checkIsValidTag(tagNumber: number) {
351
- if (
352
- ![
353
- TypeTag.FIELD,
354
- TypeTag.UINT1,
355
- TypeTag.UINT8,
356
- TypeTag.UINT16,
357
- TypeTag.UINT32,
358
- TypeTag.UINT64,
359
- TypeTag.UINT128,
360
- ].includes(tagNumber)
361
- ) {
333
+ if (!VALID_TAGS.has(tagNumber)) {
362
334
  throw new InvalidTagValueError(tagNumber);
363
335
  }
364
336
  }
@@ -375,11 +347,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
375
347
  /**
376
348
  * Check that all tags at the given offsets are the same.
377
349
  */
378
- public checkTagsAreSame(...offsets: number[]) {
379
- const tag = this.getTag(offsets[0]);
380
- for (let i = 1; i < offsets.length; i++) {
381
- this.checkTag(tag, offsets[i]);
382
- }
350
+ public checkTagsAreSame(offset0: number, offset1: number) {
351
+ const tag0 = this.getTag(offset0);
352
+ this.checkTag(tag0, offset1);
383
353
  }
384
354
 
385
355
  /**
@@ -391,32 +361,12 @@ export class TaggedMemory implements TaggedMemoryInterface {
391
361
  }
392
362
  }
393
363
 
394
- // TODO: this might be slow, but I don't want to have the types know of their tags.
395
- // It might be possible to have a map<Prototype, TypeTag>.
396
364
  public static getTag(v: MemoryValue | undefined): TypeTag {
397
- let tag = TypeTag.INVALID;
398
-
399
- // Not sure why, but using instanceof here doesn't work and leads odd behavior,
400
- // but using constructor.name does the job...
401
365
  if (v === undefined) {
402
- tag = TypeTag.FIELD; // uninitialized memory is Field(0)
403
- } else if (v.constructor.name == 'Field') {
404
- tag = TypeTag.FIELD;
405
- } else if (v.constructor.name == 'Uint1') {
406
- tag = TypeTag.UINT1;
407
- } else if (v.constructor.name == 'Uint8') {
408
- tag = TypeTag.UINT8;
409
- } else if (v.constructor.name == 'Uint16') {
410
- tag = TypeTag.UINT16;
411
- } else if (v.constructor.name == 'Uint32') {
412
- tag = TypeTag.UINT32;
413
- } else if (v.constructor.name == 'Uint64') {
414
- tag = TypeTag.UINT64;
415
- } else if (v.constructor.name == 'Uint128') {
416
- tag = TypeTag.UINT128;
366
+ return TypeTag.FIELD; // uninitialized memory is Field(0)
367
+ } else {
368
+ return TAG_FOR_MEM_VAL.get(v.constructor.name) ?? TypeTag.INVALID;
417
369
  }
418
-
419
- return tag;
420
370
  }
421
371
 
422
372
  // Truncates the value to fit the type.
@@ -441,123 +391,33 @@ export class TaggedMemory implements TaggedMemoryInterface {
441
391
  throw new InvalidTagValueError(tag);
442
392
  }
443
393
  }
444
-
445
- /** No-op. Implemented here for compatibility with the MeteredTaggedMemory. */
446
- public assert(_operations: Partial<MemoryOperations & { addressing: Addressing }>) {}
447
- }
448
-
449
- /** Tagged memory wrapper with metering for each memory read and write operation. */
450
- export class MeteredTaggedMemory implements TaggedMemoryInterface {
451
- private reads: number = 0;
452
- private writes: number = 0;
453
-
454
- constructor(private wrapped: TaggedMemory, private type: string = 'instruction') {}
455
-
456
- /** Returns the number of reads and writes tracked so far and resets them to zero. */
457
- public reset(): MemoryOperations {
458
- const stats = { reads: this.reads, writes: this.writes };
459
- this.reads = 0;
460
- this.writes = 0;
461
- return stats;
462
- }
463
-
464
- /**
465
- * Asserts that the exact number of memory operations have been performed.
466
- * Indirect represents the flags for indirect accesses: each bit set to one counts as an extra read.
467
- */
468
- public assert(operations: Partial<MemoryOperations & { addressing: Addressing }>) {
469
- const {
470
- reads: expectedReads,
471
- writes: expectedWrites,
472
- addressing,
473
- } = { reads: 0, writes: 0, addressing: new Addressing([]), ...operations };
474
-
475
- const totalExpectedReads =
476
- expectedReads + addressing.count(AddressingMode.INDIRECT) + addressing.count(AddressingMode.RELATIVE);
477
- const { reads: actualReads, writes: actualWrites } = this.reset();
478
- if (actualReads !== totalExpectedReads) {
479
- throw new InstructionExecutionError(
480
- `Incorrect number of memory reads for ${this.type}: expected ${totalExpectedReads} but executed ${actualReads}`,
481
- );
482
- }
483
- if (actualWrites !== expectedWrites) {
484
- throw new InstructionExecutionError(
485
- `Incorrect number of memory writes for ${this.type}: expected ${expectedWrites} but executed ${actualWrites}`,
486
- );
487
- }
488
- }
489
-
490
- public getMaxMemorySize(): number {
491
- return this.wrapped.getMaxMemorySize();
492
- }
493
-
494
- public track(type: string = 'instruction'): MeteredTaggedMemory {
495
- return new MeteredTaggedMemory(this.wrapped, type);
496
- }
497
-
498
- public get(offset: number): MemoryValue {
499
- this.reads++;
500
- return this.wrapped.get(offset);
501
- }
502
-
503
- public getSliceAs<T>(offset: number, size: number): T[] {
504
- this.reads += size;
505
- return this.wrapped.getSliceAs<T>(offset, size);
506
- }
507
-
508
- public getAs<T>(offset: number): T {
509
- this.reads++;
510
- return this.wrapped.getAs(offset);
511
- }
512
-
513
- public getSlice(offset: number, size: number): MemoryValue[] {
514
- this.reads += size;
515
- return this.wrapped.getSlice(offset, size);
516
- }
517
-
518
- public set(offset: number, v: MemoryValue): void {
519
- this.writes++;
520
- this.wrapped.set(offset, v);
521
- }
522
-
523
- public setSlice(offset: number, vs: MemoryValue[]): void {
524
- this.writes += vs.length;
525
- this.wrapped.setSlice(offset, vs);
526
- }
527
-
528
- public getSliceTags(offset: number, size: number): TypeTag[] {
529
- return this.wrapped.getSliceTags(offset, size);
530
- }
531
-
532
- public getTag(offset: number): TypeTag {
533
- return this.wrapped.getTag(offset);
534
- }
535
-
536
- public checkTag(tag: TypeTag, offset: number): void {
537
- this.wrapped.checkTag(tag, offset);
538
- }
539
-
540
- public checkIsValidMemoryOffsetTag(offset: number): void {
541
- this.wrapped.checkIsValidMemoryOffsetTag(offset);
542
- }
543
-
544
- public checkTags(tag: TypeTag, ...offsets: number[]): void {
545
- this.wrapped.checkTags(tag, ...offsets);
546
- }
547
-
548
- public checkTagsAreSame(...offsets: number[]): void {
549
- this.wrapped.checkTagsAreSame(...offsets);
550
- }
551
-
552
- public checkTagsRange(tag: TypeTag, startOffset: number, size: number): void {
553
- this.wrapped.checkTagsRange(tag, startOffset, size);
554
- }
555
394
  }
556
395
 
557
- /** Tracks number of memory reads and writes. */
558
- export type MemoryOperations = {
559
- /** How many total reads are performed. Slice reads are count as one per element. */
560
- reads: number;
561
- /** How many total writes are performed. Slice writes are count as one per element. */
562
- writes: number;
563
- };
396
+ const TAG_FOR_MEM_VAL = new Map<string, TypeTag>([
397
+ ['Field', TypeTag.FIELD],
398
+ ['Uint1', TypeTag.UINT1],
399
+ ['Uint8', TypeTag.UINT8],
400
+ ['Uint16', TypeTag.UINT16],
401
+ ['Uint32', TypeTag.UINT32],
402
+ ['Uint64', TypeTag.UINT64],
403
+ ['Uint128', TypeTag.UINT128],
404
+ ]);
405
+
406
+ const VALID_TAGS = new Set([
407
+ TypeTag.FIELD,
408
+ TypeTag.UINT1,
409
+ TypeTag.UINT8,
410
+ TypeTag.UINT16,
411
+ TypeTag.UINT32,
412
+ TypeTag.UINT64,
413
+ TypeTag.UINT128,
414
+ ]);
415
+
416
+ const INTEGRAL_TAGS = new Set([
417
+ TypeTag.UINT1,
418
+ TypeTag.UINT8,
419
+ TypeTag.UINT16,
420
+ TypeTag.UINT32,
421
+ TypeTag.UINT64,
422
+ TypeTag.UINT128,
423
+ ]);
@@ -18,6 +18,7 @@ import {
18
18
  revertReasonFromExplicitRevert,
19
19
  } from './errors.js';
20
20
  import { type AvmPersistableStateManager } from './journal/journal.js';
21
+ import { type Instruction } from './opcodes/instruction.js';
21
22
  import {
22
23
  INSTRUCTION_SET,
23
24
  type InstructionSet,
@@ -33,20 +34,26 @@ export class AvmSimulator {
33
34
  private log: Logger;
34
35
  private bytecode: Buffer | undefined;
35
36
  private opcodeTallies: Map<string, OpcodeTally> = new Map();
37
+ // maps pc to [instr, bytesRead]
38
+ private deserializedInstructionsCache: Map<number, [Instruction, number]> = new Map();
36
39
 
37
40
  private tallyPrintFunction = () => {};
38
41
  private tallyInstructionFunction = (_b: string, _c: Gas) => {};
39
42
 
40
43
  // Test Purposes only: Logger will not have the proper function name. Use this constructor for testing purposes
41
44
  // only. Otherwise, use build() below.
42
- constructor(private context: AvmContext, private instructionSet: InstructionSet = INSTRUCTION_SET()) {
45
+ constructor(
46
+ private context: AvmContext,
47
+ private instructionSet: InstructionSet = INSTRUCTION_SET(),
48
+ enableTallying = false,
49
+ ) {
43
50
  assert(
44
51
  context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_TX_PUBLIC_PORTION,
45
52
  `Cannot allocate more than ${MAX_L2_GAS_PER_TX_PUBLIC_PORTION} to the AVM for execution.`,
46
53
  );
47
54
  this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata[0]})`);
48
- // TODO(palla/log): Should tallies be printed on debug, or only on trace?
49
- if (this.log.isLevelEnabled('debug')) {
55
+ // Turn on tallying if explicitly enabled or if trace logging
56
+ if (enableTallying || this.log.isLevelEnabled('trace')) {
50
57
  this.tallyPrintFunction = this.printOpcodeTallies;
51
58
  this.tallyInstructionFunction = this.tallyInstruction;
52
59
  }
@@ -125,6 +132,7 @@ export class AvmSimulator {
125
132
  * This method is useful for testing and debugging.
126
133
  */
127
134
  public async executeBytecode(bytecode: Buffer): Promise<AvmContractCallResult> {
135
+ const startTotalTime = performance.now();
128
136
  assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
129
137
  assert(bytecode.length > 0, "AVM simulator can't execute empty bytecode");
130
138
 
@@ -137,19 +145,32 @@ export class AvmSimulator {
137
145
  // continuing until the machine state signifies a halt
138
146
  let instrCounter = 0;
139
147
  while (!machineState.getHalted()) {
140
- const [instruction, bytesRead] = decodeInstructionFromBytecode(bytecode, machineState.pc, this.instructionSet);
148
+ // Get the instruction from cache, or deserialize for the first time
149
+ let cachedInstruction = this.deserializedInstructionsCache.get(machineState.pc);
150
+
151
+ if (cachedInstruction === undefined) {
152
+ cachedInstruction = decodeInstructionFromBytecode(bytecode, machineState.pc, this.instructionSet);
153
+ this.deserializedInstructionsCache.set(machineState.pc, cachedInstruction);
154
+ }
155
+ const [instruction, bytesRead] = cachedInstruction;
156
+
141
157
  const instrStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
142
158
 
143
- this.log.trace(
144
- `[PC:${machineState.pc}] [IC:${instrCounter++}] ${instruction.toString()} (gasLeft l2=${
145
- machineState.l2GasLeft
146
- } da=${machineState.daGasLeft})`,
147
- );
159
+ if (this.log.isLevelEnabled('trace')) {
160
+ // Skip this entirely to avoid toStringing etc if trace is not enabled
161
+ this.log.trace(
162
+ `[PC:${machineState.pc}] [IC:${instrCounter}] ${instruction.toString()} (gasLeft l2=${
163
+ machineState.l2GasLeft
164
+ } da=${machineState.daGasLeft})`,
165
+ );
166
+ }
167
+ instrCounter++;
168
+
169
+ machineState.nextPc = machineState.pc + bytesRead;
170
+
148
171
  // Execute the instruction.
149
172
  // Normal returns and reverts will return normally here.
150
173
  // "Exceptional halts" will throw.
151
- machineState.nextPc = machineState.pc + bytesRead;
152
-
153
174
  await instruction.execute(this.context);
154
175
  if (!instruction.handlesPC()) {
155
176
  // Increment PC if the instruction doesn't handle it itself
@@ -181,6 +202,11 @@ export class AvmSimulator {
181
202
  this.log.debug(`Executed ${instrCounter} instructions and consumed ${totalGasUsed.l2Gas} L2 Gas`);
182
203
 
183
204
  this.tallyPrintFunction();
205
+
206
+ const endTotalTime = performance.now();
207
+ const totalTime = endTotalTime - startTotalTime;
208
+ this.log.debug(`Total execution time: ${totalTime}ms`);
209
+
184
210
  // Return results for processing by calling context
185
211
  return results;
186
212
  } catch (err: any) {