@aztec/simulator 0.55.1 → 0.57.0

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 (255) hide show
  1. package/dest/acvm/oracle/oracle.d.ts +2 -5
  2. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  3. package/dest/acvm/oracle/oracle.js +6 -37
  4. package/dest/acvm/oracle/typed_oracle.d.ts +3 -6
  5. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/typed_oracle.js +1 -10
  7. package/dest/avm/avm_execution_environment.d.ts +2 -11
  8. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  9. package/dest/avm/avm_execution_environment.js +3 -22
  10. package/dest/avm/avm_gas.d.ts +2 -2
  11. package/dest/avm/avm_gas.d.ts.map +1 -1
  12. package/dest/avm/avm_gas.js +31 -116
  13. package/dest/avm/avm_machine_state.d.ts.map +1 -1
  14. package/dest/avm/avm_machine_state.js +6 -6
  15. package/dest/avm/avm_memory_types.d.ts +38 -9
  16. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  17. package/dest/avm/avm_memory_types.js +27 -13
  18. package/dest/avm/avm_simulator.d.ts.map +1 -1
  19. package/dest/avm/avm_simulator.js +5 -6
  20. package/dest/avm/bytecode_utils.d.ts +1 -2
  21. package/dest/avm/bytecode_utils.d.ts.map +1 -1
  22. package/dest/avm/bytecode_utils.js +3 -17
  23. package/dest/avm/errors.d.ts +1 -1
  24. package/dest/avm/errors.d.ts.map +1 -1
  25. package/dest/avm/errors.js +12 -3
  26. package/dest/avm/fixtures/index.d.ts +4 -16
  27. package/dest/avm/fixtures/index.d.ts.map +1 -1
  28. package/dest/avm/fixtures/index.js +11 -27
  29. package/dest/avm/journal/index.d.ts +0 -1
  30. package/dest/avm/journal/index.d.ts.map +1 -1
  31. package/dest/avm/journal/index.js +1 -2
  32. package/dest/avm/journal/journal.d.ts +6 -5
  33. package/dest/avm/journal/journal.d.ts.map +1 -1
  34. package/dest/avm/journal/journal.js +18 -16
  35. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  36. package/dest/avm/opcodes/accrued_substate.js +37 -30
  37. package/dest/avm/opcodes/addressing_mode.d.ts +3 -2
  38. package/dest/avm/opcodes/addressing_mode.d.ts.map +1 -1
  39. package/dest/avm/opcodes/addressing_mode.js +25 -21
  40. package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
  41. package/dest/avm/opcodes/arithmetic.js +6 -5
  42. package/dest/avm/opcodes/bitwise.d.ts +10 -4
  43. package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
  44. package/dest/avm/opcodes/bitwise.js +26 -18
  45. package/dest/avm/opcodes/commitment.d.ts.map +1 -1
  46. package/dest/avm/opcodes/commitment.js +6 -5
  47. package/dest/avm/opcodes/comparators.d.ts.map +1 -1
  48. package/dest/avm/opcodes/comparators.js +8 -7
  49. package/dest/avm/opcodes/contract.d.ts.map +1 -1
  50. package/dest/avm/opcodes/contract.js +6 -5
  51. package/dest/avm/opcodes/control_flow.js +6 -6
  52. package/dest/avm/opcodes/conversion.d.ts +3 -2
  53. package/dest/avm/opcodes/conversion.d.ts.map +1 -1
  54. package/dest/avm/opcodes/conversion.js +21 -13
  55. package/dest/avm/opcodes/ec_add.d.ts.map +1 -1
  56. package/dest/avm/opcodes/ec_add.js +8 -7
  57. package/dest/avm/opcodes/environment_getters.d.ts +27 -63
  58. package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
  59. package/dest/avm/opcodes/environment_getters.js +76 -80
  60. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  61. package/dest/avm/opcodes/external_calls.js +27 -16
  62. package/dest/avm/opcodes/hashing.d.ts +5 -5
  63. package/dest/avm/opcodes/hashing.d.ts.map +1 -1
  64. package/dest/avm/opcodes/hashing.js +47 -40
  65. package/dest/avm/opcodes/index.d.ts +3 -0
  66. package/dest/avm/opcodes/index.d.ts.map +1 -1
  67. package/dest/avm/opcodes/index.js +4 -1
  68. package/dest/avm/opcodes/instruction.d.ts +2 -6
  69. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  70. package/dest/avm/opcodes/instruction.js +3 -9
  71. package/dest/avm/opcodes/instruction_impl.d.ts +0 -26
  72. package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
  73. package/dest/avm/opcodes/instruction_impl.js +1 -51
  74. package/dest/avm/opcodes/memory.d.ts +5 -12
  75. package/dest/avm/opcodes/memory.d.ts.map +1 -1
  76. package/dest/avm/opcodes/memory.js +40 -53
  77. package/dest/avm/opcodes/misc.d.ts.map +1 -1
  78. package/dest/avm/opcodes/misc.js +6 -5
  79. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -1
  80. package/dest/avm/opcodes/multi_scalar_mul.js +17 -16
  81. package/dest/avm/opcodes/storage.d.ts.map +1 -1
  82. package/dest/avm/opcodes/storage.js +11 -9
  83. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  84. package/dest/avm/serialization/bytecode_serialization.js +5 -25
  85. package/dest/avm/serialization/instruction_serialization.d.ts +40 -54
  86. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  87. package/dest/avm/serialization/instruction_serialization.js +41 -57
  88. package/dest/avm/test_utils.d.ts +8 -8
  89. package/dest/avm/test_utils.d.ts.map +1 -1
  90. package/dest/avm/test_utils.js +15 -15
  91. package/dest/client/client_execution_context.d.ts +6 -30
  92. package/dest/client/client_execution_context.d.ts.map +1 -1
  93. package/dest/client/client_execution_context.js +31 -53
  94. package/dest/client/index.d.ts +0 -1
  95. package/dest/client/index.d.ts.map +1 -1
  96. package/dest/client/index.js +1 -2
  97. package/dest/client/private_execution.d.ts +2 -2
  98. package/dest/client/private_execution.d.ts.map +1 -1
  99. package/dest/client/private_execution.js +5 -19
  100. package/dest/client/simulator.d.ts +3 -4
  101. package/dest/client/simulator.d.ts.map +1 -1
  102. package/dest/client/simulator.js +1 -1
  103. package/dest/client/test_utils.d.ts.map +1 -1
  104. package/dest/client/test_utils.js +12 -6
  105. package/dest/client/unconstrained_execution.d.ts +2 -2
  106. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  107. package/dest/client/unconstrained_execution.js +3 -3
  108. package/dest/common/debug_fn_name.d.ts +4 -0
  109. package/dest/common/debug_fn_name.d.ts.map +1 -0
  110. package/dest/common/debug_fn_name.js +15 -0
  111. package/dest/common/index.d.ts +0 -1
  112. package/dest/common/index.d.ts.map +1 -1
  113. package/dest/common/index.js +1 -2
  114. package/dest/public/enqueued_call_simulator.d.ts +43 -0
  115. package/dest/public/enqueued_call_simulator.d.ts.map +1 -0
  116. package/dest/public/enqueued_call_simulator.js +154 -0
  117. package/dest/public/enqueued_calls_processor.d.ts +44 -0
  118. package/dest/public/enqueued_calls_processor.d.ts.map +1 -0
  119. package/dest/public/enqueued_calls_processor.js +218 -0
  120. package/dest/public/execution.d.ts +10 -8
  121. package/dest/public/execution.d.ts.map +1 -1
  122. package/dest/public/execution.js +15 -8
  123. package/dest/public/executor.d.ts +4 -7
  124. package/dest/public/executor.d.ts.map +1 -1
  125. package/dest/public/executor.js +10 -14
  126. package/dest/public/hints_builder.d.ts +4 -3
  127. package/dest/public/hints_builder.d.ts.map +1 -1
  128. package/dest/public/hints_builder.js +5 -5
  129. package/dest/public/index.d.ts +3 -2
  130. package/dest/public/index.d.ts.map +1 -1
  131. package/dest/public/index.js +3 -3
  132. package/dest/public/public_db_sources.d.ts +17 -24
  133. package/dest/public/public_db_sources.d.ts.map +1 -1
  134. package/dest/public/public_db_sources.js +58 -65
  135. package/dest/public/public_kernel.d.ts +3 -9
  136. package/dest/public/public_kernel.d.ts.map +1 -1
  137. package/dest/public/public_kernel.js +13 -40
  138. package/dest/public/public_kernel_circuit_simulator.d.ts +5 -11
  139. package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -1
  140. package/dest/public/public_kernel_tail_simulator.d.ts +19 -0
  141. package/dest/public/public_kernel_tail_simulator.d.ts.map +1 -0
  142. package/dest/public/public_kernel_tail_simulator.js +45 -0
  143. package/dest/public/public_processor.d.ts +9 -5
  144. package/dest/public/public_processor.d.ts.map +1 -1
  145. package/dest/public/public_processor.js +34 -48
  146. package/dest/public/public_processor_metrics.d.ts +3 -3
  147. package/dest/public/public_processor_metrics.d.ts.map +1 -1
  148. package/dest/public/public_processor_metrics.js +1 -1
  149. package/dest/public/side_effect_errors.d.ts +4 -0
  150. package/dest/public/side_effect_errors.d.ts.map +1 -0
  151. package/dest/public/side_effect_errors.js +7 -0
  152. package/dest/public/side_effect_trace.d.ts +2 -2
  153. package/dest/public/side_effect_trace.d.ts.map +1 -1
  154. package/dest/public/side_effect_trace.js +56 -35
  155. package/dest/public/side_effect_trace_interface.d.ts +1 -1
  156. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  157. package/package.json +12 -9
  158. package/src/acvm/oracle/oracle.ts +7 -85
  159. package/src/acvm/oracle/typed_oracle.ts +2 -31
  160. package/src/avm/avm_execution_environment.ts +2 -24
  161. package/src/avm/avm_gas.ts +30 -115
  162. package/src/avm/avm_machine_state.ts +5 -5
  163. package/src/avm/avm_memory_types.ts +41 -14
  164. package/src/avm/avm_simulator.ts +4 -5
  165. package/src/avm/bytecode_utils.ts +2 -17
  166. package/src/avm/errors.ts +11 -3
  167. package/src/avm/fixtures/index.ts +13 -46
  168. package/src/avm/journal/index.ts +0 -1
  169. package/src/avm/journal/journal.ts +22 -22
  170. package/src/avm/opcodes/accrued_substate.ts +36 -44
  171. package/src/avm/opcodes/addressing_mode.ts +27 -24
  172. package/src/avm/opcodes/arithmetic.ts +5 -7
  173. package/src/avm/opcodes/bitwise.ts +23 -20
  174. package/src/avm/opcodes/commitment.ts +6 -7
  175. package/src/avm/opcodes/comparators.ts +7 -9
  176. package/src/avm/opcodes/contract.ts +5 -7
  177. package/src/avm/opcodes/control_flow.ts +5 -5
  178. package/src/avm/opcodes/conversion.ts +19 -12
  179. package/src/avm/opcodes/ec_add.ts +14 -16
  180. package/src/avm/opcodes/environment_getters.ts +73 -99
  181. package/src/avm/opcodes/external_calls.ts +27 -20
  182. package/src/avm/opcodes/hashing.ts +52 -52
  183. package/src/avm/opcodes/index.ts +3 -0
  184. package/src/avm/opcodes/instruction.ts +3 -10
  185. package/src/avm/opcodes/instruction_impl.ts +0 -62
  186. package/src/avm/opcodes/memory.ts +37 -67
  187. package/src/avm/opcodes/misc.ts +5 -7
  188. package/src/avm/opcodes/multi_scalar_mul.ts +16 -19
  189. package/src/avm/opcodes/storage.ts +10 -8
  190. package/src/avm/serialization/bytecode_serialization.ts +11 -35
  191. package/src/avm/serialization/instruction_serialization.ts +3 -19
  192. package/src/avm/test_utils.ts +20 -16
  193. package/src/client/client_execution_context.ts +40 -96
  194. package/src/client/index.ts +0 -1
  195. package/src/client/private_execution.ts +9 -9
  196. package/src/client/simulator.ts +2 -3
  197. package/src/client/test_utils.ts +36 -9
  198. package/src/client/unconstrained_execution.ts +3 -8
  199. package/src/common/debug_fn_name.ts +22 -0
  200. package/src/common/index.ts +0 -1
  201. package/src/public/enqueued_call_simulator.ts +335 -0
  202. package/src/public/enqueued_calls_processor.ts +388 -0
  203. package/src/public/execution.ts +16 -12
  204. package/src/public/executor.ts +8 -22
  205. package/src/public/hints_builder.ts +21 -21
  206. package/src/public/index.ts +3 -2
  207. package/src/public/public_db_sources.ts +62 -67
  208. package/src/public/public_kernel.ts +15 -49
  209. package/src/public/public_kernel_circuit_simulator.ts +6 -10
  210. package/src/public/public_kernel_tail_simulator.ts +106 -0
  211. package/src/public/public_processor.ts +65 -86
  212. package/src/public/public_processor_metrics.ts +3 -3
  213. package/src/public/side_effect_errors.ts +6 -0
  214. package/src/public/side_effect_trace.ts +77 -39
  215. package/src/public/side_effect_trace_interface.ts +2 -2
  216. package/dest/avm/journal/host_storage.d.ts +0 -13
  217. package/dest/avm/journal/host_storage.d.ts.map +0 -1
  218. package/dest/avm/journal/host_storage.js +0 -13
  219. package/dest/avm/opcodes/context_getters.d.ts +0 -15
  220. package/dest/avm/opcodes/context_getters.d.ts.map +0 -1
  221. package/dest/avm/opcodes/context_getters.js +0 -19
  222. package/dest/client/execution_result.d.ts +0 -104
  223. package/dest/client/execution_result.d.ts.map +0 -1
  224. package/dest/client/execution_result.js +0 -136
  225. package/dest/common/return_values.d.ts +0 -11
  226. package/dest/common/return_values.d.ts.map +0 -1
  227. package/dest/common/return_values.js +0 -13
  228. package/dest/public/abstract_phase_manager.d.ts +0 -93
  229. package/dest/public/abstract_phase_manager.d.ts.map +0 -1
  230. package/dest/public/abstract_phase_manager.js +0 -285
  231. package/dest/public/app_logic_phase_manager.d.ts +0 -25
  232. package/dest/public/app_logic_phase_manager.d.ts.map +0 -1
  233. package/dest/public/app_logic_phase_manager.js +0 -52
  234. package/dest/public/phase_manager_factory.d.ts +0 -18
  235. package/dest/public/phase_manager_factory.d.ts.map +0 -1
  236. package/dest/public/phase_manager_factory.js +0 -56
  237. package/dest/public/setup_phase_manager.d.ts +0 -25
  238. package/dest/public/setup_phase_manager.d.ts.map +0 -1
  239. package/dest/public/setup_phase_manager.js +0 -39
  240. package/dest/public/tail_phase_manager.d.ts +0 -23
  241. package/dest/public/tail_phase_manager.d.ts.map +0 -1
  242. package/dest/public/tail_phase_manager.js +0 -50
  243. package/dest/public/teardown_phase_manager.d.ts +0 -27
  244. package/dest/public/teardown_phase_manager.d.ts.map +0 -1
  245. package/dest/public/teardown_phase_manager.js +0 -56
  246. package/src/avm/journal/host_storage.ts +0 -14
  247. package/src/avm/opcodes/context_getters.ts +0 -23
  248. package/src/client/execution_result.ts +0 -228
  249. package/src/common/return_values.ts +0 -18
  250. package/src/public/abstract_phase_manager.ts +0 -522
  251. package/src/public/app_logic_phase_manager.ts +0 -81
  252. package/src/public/phase_manager_factory.ts +0 -126
  253. package/src/public/setup_phase_manager.ts +0 -61
  254. package/src/public/tail_phase_manager.ts +0 -127
  255. package/src/public/teardown_phase_manager.ts +0 -86
@@ -3,11 +3,12 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
4
4
  import { SerializableContractInstance } from '@aztec/types/contracts';
5
5
 
6
+ import { getPublicFunctionDebugName } from '../../common/debug_fn_name.js';
7
+ import { type WorldStateDB } from '../../public/public_db_sources.js';
6
8
  import { type TracedContractInstance } from '../../public/side_effect_trace.js';
7
9
  import { type PublicSideEffectTraceInterface } from '../../public/side_effect_trace_interface.js';
8
10
  import { type AvmContractCallResult } from '../avm_contract_call_result.js';
9
11
  import { type AvmExecutionEnvironment } from '../avm_execution_environment.js';
10
- import { type HostStorage } from './host_storage.js';
11
12
  import { NullifierManager } from './nullifiers.js';
12
13
  import { PublicStorage } from './public_storage.js';
13
14
 
@@ -25,7 +26,7 @@ export class AvmPersistableStateManager {
25
26
 
26
27
  constructor(
27
28
  /** Reference to node storage */
28
- private readonly hostStorage: HostStorage,
29
+ private readonly worldStateDB: WorldStateDB,
29
30
  /** Side effect trace */
30
31
  private readonly trace: PublicSideEffectTraceInterface,
31
32
  /** Public storage, including cached writes */
@@ -39,18 +40,15 @@ export class AvmPersistableStateManager {
39
40
  * Create a new state manager with some preloaded pending siloed nullifiers
40
41
  */
41
42
  public static newWithPendingSiloedNullifiers(
42
- hostStorage: HostStorage,
43
+ worldStateDB: WorldStateDB,
43
44
  trace: PublicSideEffectTraceInterface,
44
45
  pendingSiloedNullifiers: Fr[],
45
46
  ) {
46
- const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(
47
- hostStorage.commitmentsDb,
48
- pendingSiloedNullifiers,
49
- );
47
+ const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(worldStateDB, pendingSiloedNullifiers);
50
48
  return new AvmPersistableStateManager(
51
- hostStorage,
49
+ worldStateDB,
52
50
  trace,
53
- /*publicStorage=*/ new PublicStorage(hostStorage.publicStateDb),
51
+ /*publicStorage=*/ new PublicStorage(worldStateDB),
54
52
  /*nullifiers=*/ parentNullifiers.fork(),
55
53
  );
56
54
  }
@@ -60,7 +58,7 @@ export class AvmPersistableStateManager {
60
58
  */
61
59
  public fork() {
62
60
  return new AvmPersistableStateManager(
63
- this.hostStorage,
61
+ this.worldStateDB,
64
62
  this.trace.fork(),
65
63
  this.publicStorage.fork(),
66
64
  this.nullifiers.fork(),
@@ -122,7 +120,7 @@ export class AvmPersistableStateManager {
122
120
  * @returns true if the note hash exists at the given leaf index, false otherwise
123
121
  */
124
122
  public async checkNoteHashExists(storageAddress: Fr, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
125
- const gotLeafValue = (await this.hostStorage.commitmentsDb.getCommitmentValue(leafIndex.toBigInt())) ?? Fr.ZERO;
123
+ const gotLeafValue = (await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt())) ?? Fr.ZERO;
126
124
  const exists = gotLeafValue.equals(noteHash);
127
125
  this.log.debug(
128
126
  `noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
@@ -177,7 +175,7 @@ export class AvmPersistableStateManager {
177
175
  * @returns exists - whether the message exists in the L1 to L2 Messages tree
178
176
  */
179
177
  public async checkL1ToL2MessageExists(contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr): Promise<boolean> {
180
- const valueAtIndex = (await this.hostStorage.commitmentsDb.getL1ToL2LeafValue(msgLeafIndex.toBigInt())) ?? Fr.ZERO;
178
+ const valueAtIndex = (await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt())) ?? Fr.ZERO;
181
179
  const exists = valueAtIndex.equals(msgHash);
182
180
  this.log.debug(
183
181
  `l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
@@ -190,12 +188,13 @@ export class AvmPersistableStateManager {
190
188
 
191
189
  /**
192
190
  * Write an L2 to L1 message.
191
+ * @param contractAddress - L2 contract address that created this message
193
192
  * @param recipient - L1 contract address to send the message to.
194
193
  * @param content - Message content.
195
194
  */
196
- public writeL2ToL1Message(recipient: Fr, content: Fr) {
197
- this.log.debug(`L1Messages(${recipient}) += ${content}.`);
198
- this.trace.traceNewL2ToL1Message(recipient, content);
195
+ public writeL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr) {
196
+ this.log.debug(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
197
+ this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
199
198
  }
200
199
 
201
200
  /**
@@ -217,7 +216,7 @@ export class AvmPersistableStateManager {
217
216
  public async getContractInstance(contractAddress: Fr): Promise<TracedContractInstance> {
218
217
  let exists = true;
219
218
  const aztecAddress = AztecAddress.fromField(contractAddress);
220
- let instance = await this.hostStorage.contractsDb.getContractInstance(aztecAddress);
219
+ let instance = await this.worldStateDB.getContractInstance(aztecAddress);
221
220
  if (instance === undefined) {
222
221
  instance = SerializableContractInstance.empty().withAddress(aztecAddress);
223
222
  exists = false;
@@ -242,7 +241,7 @@ export class AvmPersistableStateManager {
242
241
  * Get a contract's bytecode from the contracts DB
243
242
  */
244
243
  public async getBytecode(contractAddress: AztecAddress, selector: FunctionSelector): Promise<Buffer | undefined> {
245
- return await this.hostStorage.contractsDb.getBytecode(contractAddress, selector);
244
+ return await this.worldStateDB.getBytecode(contractAddress, selector);
246
245
  }
247
246
 
248
247
  /**
@@ -259,11 +258,12 @@ export class AvmPersistableStateManager {
259
258
  if (!avmCallResults.reverted) {
260
259
  this.acceptNestedCallState(nestedState);
261
260
  }
262
- const functionName =
263
- (await nestedState.hostStorage.contractsDb.getDebugFunctionName(
264
- nestedEnvironment.address,
265
- nestedEnvironment.functionSelector,
266
- )) ?? `${nestedEnvironment.address}:${nestedEnvironment.functionSelector}`;
261
+ const functionName = await getPublicFunctionDebugName(
262
+ this.worldStateDB,
263
+ nestedEnvironment.address,
264
+ nestedEnvironment.functionSelector,
265
+ nestedEnvironment.calldata,
266
+ );
267
267
 
268
268
  this.log.verbose(`[AVM] Calling nested function ${functionName}`);
269
269
 
@@ -28,13 +28,11 @@ export class NoteHashExists extends Instruction {
28
28
  }
29
29
 
30
30
  public async execute(context: AvmContext): Promise<void> {
31
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
32
31
  const memory = context.machineState.memory.track(this.type);
33
- context.machineState.consumeGas(this.gasCost(memoryOperations));
34
- const [noteHashOffset, leafIndexOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve(
35
- [this.noteHashOffset, this.leafIndexOffset, this.existsOffset],
36
- memory,
37
- );
32
+ context.machineState.consumeGas(this.gasCost());
33
+ const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
34
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
35
+ const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
38
36
  memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
39
37
 
40
38
  // Note that this instruction accepts any type in memory, and converts to Field.
@@ -48,7 +46,7 @@ export class NoteHashExists extends Instruction {
48
46
  );
49
47
  memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
50
48
 
51
- memory.assert(memoryOperations);
49
+ memory.assert({ reads: 2, writes: 1, addressing });
52
50
  context.machineState.incrementPc();
53
51
  }
54
52
  }
@@ -64,11 +62,12 @@ export class EmitNoteHash extends Instruction {
64
62
  }
65
63
 
66
64
  public async execute(context: AvmContext): Promise<void> {
67
- const memoryOperations = { reads: 1, indirect: this.indirect };
68
65
  const memory = context.machineState.memory.track(this.type);
69
- context.machineState.consumeGas(this.gasCost(memoryOperations));
66
+ context.machineState.consumeGas(this.gasCost());
70
67
 
71
- const [noteHashOffset] = Addressing.fromWire(this.indirect).resolve([this.noteHashOffset], memory);
68
+ const operands = [this.noteHashOffset];
69
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
70
+ const [noteHashOffset] = addressing.resolve(operands, memory);
72
71
  memory.checkTag(TypeTag.FIELD, noteHashOffset);
73
72
 
74
73
  if (context.environment.isStaticCall) {
@@ -78,7 +77,7 @@ export class EmitNoteHash extends Instruction {
78
77
  const noteHash = memory.get(noteHashOffset).toFr();
79
78
  context.persistableState.writeNoteHash(context.environment.storageAddress, noteHash);
80
79
 
81
- memory.assert(memoryOperations);
80
+ memory.assert({ reads: 1, addressing });
82
81
  context.machineState.incrementPc();
83
82
  }
84
83
  }
@@ -105,14 +104,12 @@ export class NullifierExists extends Instruction {
105
104
  }
106
105
 
107
106
  public async execute(context: AvmContext): Promise<void> {
108
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
109
107
  const memory = context.machineState.memory.track(this.type);
110
- context.machineState.consumeGas(this.gasCost(memoryOperations));
108
+ context.machineState.consumeGas(this.gasCost());
111
109
 
112
- const [nullifierOffset, addressOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve(
113
- [this.nullifierOffset, this.addressOffset, this.existsOffset],
114
- memory,
115
- );
110
+ const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
111
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
112
+ const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
116
113
  memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
117
114
 
118
115
  const nullifier = memory.get(nullifierOffset).toFr();
@@ -121,7 +118,7 @@ export class NullifierExists extends Instruction {
121
118
 
122
119
  memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
123
120
 
124
- memory.assert(memoryOperations);
121
+ memory.assert({ reads: 2, writes: 1, addressing });
125
122
  context.machineState.incrementPc();
126
123
  }
127
124
  }
@@ -141,11 +138,12 @@ export class EmitNullifier extends Instruction {
141
138
  throw new StaticCallAlterationError();
142
139
  }
143
140
 
144
- const memoryOperations = { reads: 1, indirect: this.indirect };
145
141
  const memory = context.machineState.memory.track(this.type);
146
- context.machineState.consumeGas(this.gasCost(memoryOperations));
142
+ context.machineState.consumeGas(this.gasCost());
147
143
 
148
- const [nullifierOffset] = Addressing.fromWire(this.indirect).resolve([this.nullifierOffset], memory);
144
+ const operands = [this.nullifierOffset];
145
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
146
+ const [nullifierOffset] = addressing.resolve(operands, memory);
149
147
  memory.checkTag(TypeTag.FIELD, nullifierOffset);
150
148
 
151
149
  const nullifier = memory.get(nullifierOffset).toFr();
@@ -162,7 +160,7 @@ export class EmitNullifier extends Instruction {
162
160
  }
163
161
  }
164
162
 
165
- memory.assert(memoryOperations);
163
+ memory.assert({ reads: 1, addressing });
166
164
  context.machineState.incrementPc();
167
165
  }
168
166
  }
@@ -189,14 +187,12 @@ export class L1ToL2MessageExists extends Instruction {
189
187
  }
190
188
 
191
189
  public async execute(context: AvmContext): Promise<void> {
192
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
193
190
  const memory = context.machineState.memory.track(this.type);
194
- context.machineState.consumeGas(this.gasCost(memoryOperations));
191
+ context.machineState.consumeGas(this.gasCost());
195
192
 
196
- const [msgHashOffset, msgLeafIndexOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve(
197
- [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset],
198
- memory,
199
- );
193
+ const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
194
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
195
+ const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
200
196
  memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset);
201
197
 
202
198
  const msgHash = memory.get(msgHashOffset).toFr();
@@ -208,7 +204,7 @@ export class L1ToL2MessageExists extends Instruction {
208
204
  );
209
205
  memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
210
206
 
211
- memory.assert(memoryOperations);
207
+ memory.assert({ reads: 2, writes: 1, addressing });
212
208
  context.machineState.incrementPc();
213
209
  }
214
210
  }
@@ -230,22 +226,20 @@ export class EmitUnencryptedLog extends Instruction {
230
226
 
231
227
  const memory = context.machineState.memory.track(this.type);
232
228
 
233
- const [logOffset, logSizeOffset] = Addressing.fromWire(this.indirect).resolve(
234
- [this.logOffset, this.logSizeOffset],
235
- memory,
236
- );
229
+ const operands = [this.logOffset, this.logSizeOffset];
230
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
231
+ const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
237
232
  memory.checkTag(TypeTag.UINT32, logSizeOffset);
238
233
  const logSize = memory.get(logSizeOffset).toNumber();
239
234
  memory.checkTagsRange(TypeTag.FIELD, logOffset, logSize);
240
235
 
241
236
  const contractAddress = context.environment.address;
242
237
 
243
- const memoryOperations = { reads: 1 + logSize, indirect: this.indirect };
244
- context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: logSize }));
238
+ context.machineState.consumeGas(this.gasCost(logSize));
245
239
  const log = memory.getSlice(logOffset, logSize).map(f => f.toFr());
246
240
  context.persistableState.writeUnencryptedLog(contractAddress, log);
247
241
 
248
- memory.assert(memoryOperations);
242
+ memory.assert({ reads: 1 + logSize, addressing });
249
243
  context.machineState.incrementPc();
250
244
  }
251
245
  }
@@ -265,20 +259,18 @@ export class SendL2ToL1Message extends Instruction {
265
259
  throw new StaticCallAlterationError();
266
260
  }
267
261
 
268
- const memoryOperations = { reads: 2, indirect: this.indirect };
269
262
  const memory = context.machineState.memory.track(this.type);
270
- context.machineState.consumeGas(this.gasCost(memoryOperations));
263
+ context.machineState.consumeGas(this.gasCost());
271
264
 
272
- const [recipientOffset, contentOffset] = Addressing.fromWire(this.indirect).resolve(
273
- [this.recipientOffset, this.contentOffset],
274
- memory,
275
- );
265
+ const operands = [this.recipientOffset, this.contentOffset];
266
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
267
+ const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
276
268
 
277
269
  const recipient = memory.get(recipientOffset).toFr();
278
270
  const content = memory.get(contentOffset).toFr();
279
- context.persistableState.writeL2ToL1Message(recipient, content);
271
+ context.persistableState.writeL2ToL1Message(context.environment.address, recipient, content);
280
272
 
281
- memory.assert(memoryOperations);
273
+ memory.assert({ reads: 2, addressing });
282
274
  context.machineState.incrementPc();
283
275
  }
284
276
  }
@@ -3,9 +3,10 @@ import { strict as assert } from 'assert';
3
3
  import { type TaggedMemoryInterface } from '../avm_memory_types.js';
4
4
 
5
5
  export enum AddressingMode {
6
- DIRECT,
7
- INDIRECT,
8
- INDIRECT_PLUS_CONSTANT, // Not implemented yet.
6
+ DIRECT = 0,
7
+ INDIRECT = 1,
8
+ RELATIVE = 2,
9
+ INDIRECT_RELATIVE = 3,
9
10
  }
10
11
 
11
12
  /** A class to represent the addressing mode of an instruction. */
@@ -13,16 +14,17 @@ export class Addressing {
13
14
  public constructor(
14
15
  /** The addressing mode for each operand. The length of this array is the number of operands of the instruction. */
15
16
  private readonly modePerOperand: AddressingMode[],
16
- ) {
17
- assert(modePerOperand.length <= 8, 'At most 8 operands are supported');
18
- }
17
+ ) {}
19
18
 
20
- public static fromWire(wireModes: number): Addressing {
19
+ // TODO(facundo): 8 for backwards compatibility.
20
+ public static fromWire(wireModes: number, numOperands: number = 8): Addressing {
21
21
  // The modes are stored in the wire format as a byte, with each bit representing the mode for an operand.
22
22
  // The least significant bit represents the zeroth operand, and the most significant bit represents the last operand.
23
- const modes = new Array<AddressingMode>(8);
24
- for (let i = 0; i < 8; i++) {
25
- modes[i] = (wireModes & (1 << i)) === 0 ? AddressingMode.DIRECT : AddressingMode.INDIRECT;
23
+ const modes = new Array<AddressingMode>(numOperands);
24
+ for (let i = 0; i < numOperands; i++) {
25
+ modes[i] =
26
+ (((wireModes >> i) & 1) * AddressingMode.INDIRECT) |
27
+ (((wireModes >> (i + numOperands)) & 1) * AddressingMode.RELATIVE);
26
28
  }
27
29
  return new Addressing(modes);
28
30
  }
@@ -31,17 +33,20 @@ export class Addressing {
31
33
  // The modes are stored in the wire format as a byte, with each bit representing the mode for an operand.
32
34
  // The least significant bit represents the zeroth operand, and the least significant bit represents the last operand.
33
35
  let wire: number = 0;
34
- for (let i = 0; i < 8; i++) {
35
- if (this.modePerOperand[i] === AddressingMode.INDIRECT) {
36
+ for (let i = 0; i < this.modePerOperand.length; i++) {
37
+ if (this.modePerOperand[i] & AddressingMode.INDIRECT) {
36
38
  wire |= 1 << i;
37
39
  }
40
+ if (this.modePerOperand[i] & AddressingMode.RELATIVE) {
41
+ wire |= 1 << (this.modePerOperand.length + i);
42
+ }
38
43
  }
39
44
  return wire;
40
45
  }
41
46
 
42
47
  /** Returns how many operands use the given addressing mode. */
43
48
  public count(mode: AddressingMode): number {
44
- return this.modePerOperand.filter(m => m === mode).length;
49
+ return this.modePerOperand.filter(m => (m & mode) !== 0).length;
45
50
  }
46
51
 
47
52
  /**
@@ -54,17 +59,15 @@ export class Addressing {
54
59
  assert(offsets.length <= this.modePerOperand.length);
55
60
  const resolved = new Array(offsets.length);
56
61
  for (const [i, offset] of offsets.entries()) {
57
- switch (this.modePerOperand[i]) {
58
- case AddressingMode.INDIRECT:
59
- // NOTE(reviewer): less than equal is a deviation from the spec - i dont see why this shouldnt be possible!
60
- mem.checkIsValidMemoryOffsetTag(offset);
61
- resolved[i] = Number(mem.get(offset).toBigInt());
62
- break;
63
- case AddressingMode.DIRECT:
64
- resolved[i] = offset;
65
- break;
66
- default:
67
- throw new Error(`Unimplemented addressing mode: ${AddressingMode[this.modePerOperand[i]]}`);
62
+ const mode = this.modePerOperand[i];
63
+ resolved[i] = offset;
64
+ if (mode & AddressingMode.RELATIVE) {
65
+ mem.checkIsValidMemoryOffsetTag(0);
66
+ resolved[i] += Number(mem.get(0).toBigInt());
67
+ }
68
+ if (mode & AddressingMode.INDIRECT) {
69
+ mem.checkIsValidMemoryOffsetTag(resolved[i]);
70
+ resolved[i] = Number(mem.get(resolved[i]).toBigInt());
68
71
  }
69
72
  }
70
73
  return resolved;
@@ -6,14 +6,12 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
6
6
 
7
7
  export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction {
8
8
  public async execute(context: AvmContext): Promise<void> {
9
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
10
9
  const memory = context.machineState.memory.track(this.type);
11
- context.machineState.consumeGas(this.gasCost(memoryOperations));
10
+ context.machineState.consumeGas(this.gasCost());
12
11
 
13
- const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve(
14
- [this.aOffset, this.bOffset, this.dstOffset],
15
- memory,
16
- );
12
+ const operands = [this.aOffset, this.bOffset, this.dstOffset];
13
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
14
+ const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
17
15
  memory.checkTags(this.inTag, aOffset, bOffset);
18
16
 
19
17
  const a = memory.get(aOffset);
@@ -22,7 +20,7 @@ export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInst
22
20
  const dest = this.compute(a, b);
23
21
  memory.set(dstOffset, dest);
24
22
 
25
- memory.assert(memoryOperations);
23
+ memory.assert({ reads: 2, writes: 1, addressing });
26
24
  context.machineState.incrementPc();
27
25
  }
28
26
 
@@ -1,19 +1,18 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
- import { type IntegralValue, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
3
- import { Opcode } from '../serialization/instruction_serialization.js';
2
+ import { type IntegralValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
3
+ import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
4
4
  import { Addressing } from './addressing_mode.js';
5
- import { ThreeOperandInstruction, TwoOperandInstruction } from './instruction_impl.js';
5
+ import { Instruction } from './instruction.js';
6
+ import { ThreeOperandInstruction } from './instruction_impl.js';
6
7
 
7
8
  abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
8
9
  public async execute(context: AvmContext): Promise<void> {
9
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
10
10
  const memory = context.machineState.memory.track(this.type);
11
- context.machineState.consumeGas(this.gasCost(memoryOperations));
11
+ context.machineState.consumeGas(this.gasCost());
12
12
 
13
- const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve(
14
- [this.aOffset, this.bOffset, this.dstOffset],
15
- memory,
16
- );
13
+ const operands = [this.aOffset, this.bOffset, this.dstOffset];
14
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
15
+ const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
17
16
  this.checkTags(memory, this.inTag, aOffset, bOffset);
18
17
 
19
18
  const a = memory.getAs<IntegralValue>(aOffset);
@@ -22,7 +21,7 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
22
21
  const res = this.compute(a, b);
23
22
  memory.set(dstOffset, res);
24
23
 
25
- memory.assert(memoryOperations);
24
+ memory.assert({ reads: 2, writes: 1, addressing });
26
25
  context.machineState.incrementPc();
27
26
  }
28
27
 
@@ -85,27 +84,31 @@ export class Shr extends ThreeOperandBitwiseInstruction {
85
84
  }
86
85
  }
87
86
 
88
- export class Not extends TwoOperandInstruction {
87
+ export class Not extends Instruction {
89
88
  static readonly type: string = 'NOT';
90
89
  static readonly opcode = Opcode.NOT_8;
91
90
 
92
- constructor(indirect: number, inTag: number, aOffset: number, dstOffset: number) {
93
- super(indirect, inTag, aOffset, dstOffset);
91
+ static readonly wireFormat8 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT8, OperandType.UINT8];
92
+ static readonly wireFormat16 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
93
+
94
+ constructor(private indirect: number, private srcOffset: number, private dstOffset: number) {
95
+ super();
94
96
  }
95
97
 
96
98
  public async execute(context: AvmContext): Promise<void> {
97
- const memoryOperations = { reads: 1, writes: 1, indirect: this.indirect };
98
99
  const memory = context.machineState.memory.track(this.type);
99
- context.machineState.consumeGas(this.gasCost(memoryOperations));
100
+ context.machineState.consumeGas(this.gasCost());
100
101
 
101
- const [aOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.dstOffset], memory);
102
- memory.checkTags(this.inTag, aOffset);
103
- const a = memory.getAs<IntegralValue>(aOffset);
102
+ const operands = [this.srcOffset, this.dstOffset];
103
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
104
+ const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
105
+ TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset));
106
+ const value = memory.getAs<IntegralValue>(srcOffset);
104
107
 
105
- const res = a.not();
108
+ const res = value.not();
106
109
  memory.set(dstOffset, res);
107
110
 
108
- memory.assert(memoryOperations);
111
+ memory.assert({ reads: 1, writes: 1, addressing });
109
112
  context.machineState.incrementPc();
110
113
  }
111
114
  }
@@ -32,10 +32,10 @@ export class PedersenCommitment extends Instruction {
32
32
 
33
33
  public async execute(context: AvmContext): Promise<void> {
34
34
  const memory = context.machineState.memory.track(this.type);
35
- const [inputOffset, outputOffset, inputSizeOffset, genIndexOffset] = Addressing.fromWire(this.indirect).resolve(
36
- [this.inputOffset, this.outputOffset, this.inputSizeOffset, this.genIndexOffset],
37
- memory,
38
- );
35
+
36
+ const operands = [this.inputOffset, this.outputOffset, this.inputSizeOffset, this.genIndexOffset];
37
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
38
+ const [inputOffset, outputOffset, inputSizeOffset, genIndexOffset] = addressing.resolve(operands, memory);
39
39
 
40
40
  const inputSize = memory.get(inputSizeOffset).toNumber();
41
41
  memory.checkTag(TypeTag.UINT32, inputSizeOffset);
@@ -46,8 +46,7 @@ export class PedersenCommitment extends Instruction {
46
46
  const generatorIndex = memory.get(genIndexOffset).toNumber();
47
47
  memory.checkTag(TypeTag.UINT32, genIndexOffset);
48
48
 
49
- const memoryOperations = { reads: inputSize + 2, writes: 3, indirect: this.indirect };
50
- context.machineState.consumeGas(this.gasCost(memoryOperations));
49
+ context.machineState.consumeGas(this.gasCost(inputSize));
51
50
 
52
51
  const inputBuffer: Buffer[] = inputs.map(input => input.toBuffer());
53
52
  // TODO: Add the generate index to the pedersenCommit function
@@ -60,7 +59,7 @@ export class PedersenCommitment extends Instruction {
60
59
  memory.set(outputOffset + 1, commitment[1]); // Field typed
61
60
  memory.set(outputOffset + 2, new Uint8(isInfinity ? 1 : 0)); // U8 typed
62
61
 
63
- memory.assert(memoryOperations);
62
+ memory.assert({ reads: inputSize + 2, writes: 3, addressing });
64
63
  context.machineState.incrementPc();
65
64
  }
66
65
  }
@@ -1,28 +1,26 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
- import { type MemoryValue, Uint8 } from '../avm_memory_types.js';
2
+ import { type MemoryValue, Uint1 } from '../avm_memory_types.js';
3
3
  import { Opcode } from '../serialization/instruction_serialization.js';
4
4
  import { Addressing } from './addressing_mode.js';
5
5
  import { ThreeOperandInstruction } from './instruction_impl.js';
6
6
 
7
7
  abstract class ComparatorInstruction extends ThreeOperandInstruction {
8
8
  public async execute(context: AvmContext): Promise<void> {
9
- const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
10
9
  const memory = context.machineState.memory.track(this.type);
11
- context.machineState.consumeGas(this.gasCost(memoryOperations));
10
+ context.machineState.consumeGas(this.gasCost());
12
11
 
13
- const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve(
14
- [this.aOffset, this.bOffset, this.dstOffset],
15
- memory,
16
- );
12
+ const operands = [this.aOffset, this.bOffset, this.dstOffset];
13
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
14
+ const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
17
15
  memory.checkTags(this.inTag, aOffset, bOffset);
18
16
 
19
17
  const a = memory.get(aOffset);
20
18
  const b = memory.get(bOffset);
21
19
 
22
- const dest = new Uint8(this.compare(a, b) ? 1 : 0);
20
+ const dest = new Uint1(this.compare(a, b) ? 1 : 0);
23
21
  memory.set(dstOffset, dest);
24
22
 
25
- memory.assert(memoryOperations);
23
+ memory.assert({ reads: 2, writes: 1, addressing });
26
24
  context.machineState.incrementPc();
27
25
  }
28
26
 
@@ -22,14 +22,12 @@ export class GetContractInstance extends Instruction {
22
22
  }
23
23
 
24
24
  async execute(context: AvmContext): Promise<void> {
25
- const memoryOperations = { reads: 1, writes: 6, indirect: this.indirect };
26
25
  const memory = context.machineState.memory.track(this.type);
27
- context.machineState.consumeGas(this.gasCost(memoryOperations));
26
+ context.machineState.consumeGas(this.gasCost());
28
27
 
29
- const [addressOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve(
30
- [this.addressOffset, this.dstOffset],
31
- memory,
32
- );
28
+ const operands = [this.addressOffset, this.dstOffset];
29
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
30
+ const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
33
31
  memory.checkTag(TypeTag.FIELD, addressOffset);
34
32
 
35
33
  const address = memory.get(addressOffset).toFr();
@@ -46,7 +44,7 @@ export class GetContractInstance extends Instruction {
46
44
 
47
45
  memory.setSlice(dstOffset, data);
48
46
 
49
- memory.assert(memoryOperations);
47
+ memory.assert({ reads: 1, writes: 6, addressing });
50
48
  context.machineState.incrementPc();
51
49
  }
52
50
  }
@@ -41,21 +41,21 @@ export class JumpI extends Instruction {
41
41
  }
42
42
 
43
43
  public async execute(context: AvmContext): Promise<void> {
44
- const memoryOperations = { reads: 1, indirect: this.indirect };
45
44
  const memory = context.machineState.memory.track(this.type);
46
- context.machineState.consumeGas(this.gasCost(memoryOperations));
45
+ context.machineState.consumeGas(this.gasCost());
47
46
 
48
- const [condOffset] = Addressing.fromWire(this.indirect).resolve([this.condOffset], memory);
47
+ const operands = [this.condOffset];
48
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
49
+ const [condOffset] = addressing.resolve(operands, memory);
49
50
  const condition = memory.getAs<IntegralValue>(condOffset);
50
51
 
51
- // TODO: reconsider this casting
52
52
  if (condition.toBigInt() == 0n) {
53
53
  context.machineState.incrementPc();
54
54
  } else {
55
55
  context.machineState.pc = this.loc;
56
56
  }
57
57
 
58
- memory.assert(memoryOperations);
58
+ memory.assert({ reads: 1, addressing });
59
59
  }
60
60
  }
61
61