@aztec/simulator 0.86.0 → 0.87.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 (188) hide show
  1. package/dest/common/errors.d.ts +3 -6
  2. package/dest/common/errors.d.ts.map +1 -1
  3. package/dest/common/errors.js +50 -31
  4. package/dest/private/acvm/acvm.d.ts +0 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +2 -2
  7. package/dest/private/acvm/deserialize.d.ts +0 -2
  8. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  9. package/dest/private/acvm/oracle/oracle.d.ts +2 -2
  10. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
  11. package/dest/private/acvm/oracle/oracle.js +30 -33
  12. package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -3
  13. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
  14. package/dest/private/acvm/serialize.d.ts +8 -2
  15. package/dest/private/acvm/serialize.d.ts.map +1 -1
  16. package/dest/private/acvm/serialize.js +26 -0
  17. package/dest/private/index.d.ts +3 -0
  18. package/dest/private/index.d.ts.map +1 -1
  19. package/dest/private/index.js +3 -0
  20. package/dest/private/private_execution.d.ts.map +1 -1
  21. package/dest/private/private_execution.js +7 -1
  22. package/dest/private/providers/acvm_native.d.ts +0 -2
  23. package/dest/private/providers/acvm_native.d.ts.map +1 -1
  24. package/dest/private/providers/acvm_native.js +1 -1
  25. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +0 -2
  26. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -1
  27. package/dest/private/providers/simulation_provider.d.ts.map +1 -1
  28. package/dest/private/providers/simulation_provider.js +14 -16
  29. package/dest/private/simulator.d.ts.map +1 -1
  30. package/dest/private/utility_execution_oracle.d.ts +0 -2
  31. package/dest/private/utility_execution_oracle.d.ts.map +1 -1
  32. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  33. package/dest/public/avm/avm_contract_call_result.js +2 -2
  34. package/dest/public/avm/avm_execution_environment.d.ts +2 -1
  35. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  36. package/dest/public/avm/avm_execution_environment.js +4 -2
  37. package/dest/public/avm/avm_gas.d.ts +0 -15
  38. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  39. package/dest/public/avm/avm_gas.js +0 -18
  40. package/dest/public/avm/avm_memory_types.d.ts +84 -86
  41. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  42. package/dest/public/avm/avm_simulator.d.ts +1 -3
  43. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  44. package/dest/public/avm/avm_simulator.js +3 -3
  45. package/dest/public/avm/avm_simulator_interface.d.ts +0 -2
  46. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -1
  47. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  48. package/dest/public/avm/fixtures/initializers.js +1 -1
  49. package/dest/public/avm/fixtures/utils.d.ts +0 -10
  50. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  51. package/dest/public/avm/fixtures/utils.js +0 -42
  52. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  53. package/dest/public/avm/opcodes/accrued_substate.js +7 -7
  54. package/dest/public/avm/opcodes/addressing_mode.d.ts +7 -6
  55. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  56. package/dest/public/avm/opcodes/addressing_mode.js +18 -15
  57. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  58. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  59. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  60. package/dest/public/avm/opcodes/bitwise.js +2 -2
  61. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/comparators.js +1 -1
  63. package/dest/public/avm/opcodes/contract.d.ts +1 -2
  64. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  65. package/dest/public/avm/opcodes/contract.js +8 -9
  66. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  67. package/dest/public/avm/opcodes/control_flow.js +1 -1
  68. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  69. package/dest/public/avm/opcodes/conversion.js +1 -1
  70. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  71. package/dest/public/avm/opcodes/ec_add.js +1 -1
  72. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  73. package/dest/public/avm/opcodes/environment_getters.js +1 -1
  74. package/dest/public/avm/opcodes/external_calls.d.ts +6 -6
  75. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  76. package/dest/public/avm/opcodes/external_calls.js +22 -22
  77. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  78. package/dest/public/avm/opcodes/hashing.js +3 -3
  79. package/dest/public/avm/opcodes/instruction.d.ts +0 -2
  80. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  81. package/dest/public/avm/opcodes/memory.d.ts +4 -4
  82. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  83. package/dest/public/avm/opcodes/memory.js +16 -16
  84. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  85. package/dest/public/avm/opcodes/misc.js +18 -11
  86. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  87. package/dest/public/avm/opcodes/storage.js +2 -2
  88. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -2
  89. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  90. package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -2
  91. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  92. package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -2
  93. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  94. package/dest/public/executor_metrics.d.ts +3 -3
  95. package/dest/public/executor_metrics.d.ts.map +1 -1
  96. package/dest/public/executor_metrics.js +6 -6
  97. package/dest/public/executor_metrics_interface.d.ts +1 -1
  98. package/dest/public/executor_metrics_interface.d.ts.map +1 -1
  99. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  100. package/dest/public/fixtures/public_tx_simulation_tester.js +3 -3
  101. package/dest/public/fixtures/utils.d.ts.map +1 -1
  102. package/dest/public/fixtures/utils.js +19 -26
  103. package/dest/public/hinting_db_sources.d.ts +0 -2
  104. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  105. package/dest/public/hinting_db_sources.js +9 -2
  106. package/dest/public/public_processor/public_processor.d.ts +5 -7
  107. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  108. package/dest/public/public_processor/public_processor.js +10 -7
  109. package/dest/public/public_tx_simulator/apps_tests/amm_test.js +5 -5
  110. package/dest/public/public_tx_simulator/apps_tests/token_test.js +6 -6
  111. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  112. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
  113. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +3 -3
  114. package/dest/public/public_tx_simulator/public_tx_context.d.ts +1 -1
  115. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  116. package/dest/public/public_tx_simulator/public_tx_context.js +37 -34
  117. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +2 -1
  118. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  119. package/dest/public/public_tx_simulator/public_tx_simulator.js +15 -4
  120. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +1 -1
  121. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
  122. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +2 -2
  123. package/dest/public/side_effect_trace.d.ts +2 -39
  124. package/dest/public/side_effect_trace.d.ts.map +1 -1
  125. package/dest/public/side_effect_trace.js +8 -32
  126. package/dest/public/side_effect_trace_interface.d.ts +0 -4
  127. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  128. package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
  129. package/dest/public/state_manager/public_storage.d.ts.map +1 -1
  130. package/dest/public/state_manager/state_manager.d.ts +6 -4
  131. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  132. package/dest/public/state_manager/state_manager.js +6 -3
  133. package/dest/public/test_executor_metrics.d.ts +5 -4
  134. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  135. package/dest/public/test_executor_metrics.js +47 -11
  136. package/dest/public/unique_class_ids.d.ts.map +1 -1
  137. package/dest/test/utils.d.ts.map +1 -1
  138. package/package.json +18 -17
  139. package/src/common/errors.ts +77 -41
  140. package/src/private/acvm/acvm.ts +2 -2
  141. package/src/private/acvm/oracle/oracle.ts +38 -31
  142. package/src/private/acvm/oracle/typed_oracle.ts +1 -1
  143. package/src/private/acvm/serialize.ts +35 -0
  144. package/src/private/index.ts +3 -0
  145. package/src/private/pick_notes.ts +4 -4
  146. package/src/private/private_execution.ts +8 -0
  147. package/src/private/providers/acvm_native.ts +6 -2
  148. package/src/private/providers/simulation_provider.ts +14 -16
  149. package/src/private/simulator.ts +4 -1
  150. package/src/public/avm/avm_contract_call_result.ts +2 -2
  151. package/src/public/avm/avm_execution_environment.ts +7 -1
  152. package/src/public/avm/avm_gas.ts +0 -20
  153. package/src/public/avm/avm_simulator.ts +3 -1
  154. package/src/public/avm/fixtures/initializers.ts +1 -0
  155. package/src/public/avm/fixtures/utils.ts +0 -66
  156. package/src/public/avm/opcodes/accrued_substate.ts +31 -11
  157. package/src/public/avm/opcodes/addressing_mode.ts +23 -20
  158. package/src/public/avm/opcodes/arithmetic.ts +2 -1
  159. package/src/public/avm/opcodes/bitwise.ts +9 -3
  160. package/src/public/avm/opcodes/comparators.ts +2 -1
  161. package/src/public/avm/opcodes/contract.ts +7 -6
  162. package/src/public/avm/opcodes/control_flow.ts +7 -2
  163. package/src/public/avm/opcodes/conversion.ts +2 -1
  164. package/src/public/avm/opcodes/ec_add.ts +2 -1
  165. package/src/public/avm/opcodes/environment_getters.ts +7 -2
  166. package/src/public/avm/opcodes/external_calls.ts +26 -14
  167. package/src/public/avm/opcodes/hashing.ts +17 -5
  168. package/src/public/avm/opcodes/memory.ts +33 -15
  169. package/src/public/avm/opcodes/misc.ts +23 -15
  170. package/src/public/avm/opcodes/storage.ts +9 -3
  171. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  172. package/src/public/executor_metrics.ts +11 -6
  173. package/src/public/executor_metrics_interface.ts +1 -1
  174. package/src/public/fixtures/public_tx_simulation_tester.ts +3 -2
  175. package/src/public/fixtures/utils.ts +21 -28
  176. package/src/public/hinting_db_sources.ts +17 -4
  177. package/src/public/public_processor/public_processor.ts +11 -5
  178. package/src/public/public_tx_simulator/apps_tests/amm_test.ts +5 -5
  179. package/src/public/public_tx_simulator/apps_tests/token_test.ts +6 -6
  180. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +3 -2
  181. package/src/public/public_tx_simulator/public_tx_context.ts +96 -81
  182. package/src/public/public_tx_simulator/public_tx_simulator.ts +14 -3
  183. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +10 -1
  184. package/src/public/side_effect_trace.ts +7 -111
  185. package/src/public/side_effect_trace_interface.ts +0 -4
  186. package/src/public/state_manager/state_manager.ts +13 -5
  187. package/src/public/test_executor_metrics.ts +60 -13
  188. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
@@ -29,9 +29,10 @@ export class NoteHashExists extends Instruction {
29
29
 
30
30
  public async execute(context: AvmContext): Promise<void> {
31
31
  const memory = context.machineState.memory;
32
+ const addressing = Addressing.fromWire(this.indirect);
33
+
32
34
  context.machineState.consumeGas(this.gasCost());
33
35
  const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
34
- const addressing = Addressing.fromWire(this.indirect, operands.length);
35
36
  const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
36
37
  memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
37
38
 
@@ -50,16 +51,20 @@ export class EmitNoteHash extends Instruction {
50
51
  // Informs (de)serialization. See Instruction.deserialize.
51
52
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
52
53
 
53
- constructor(private indirect: number, private noteHashOffset: number) {
54
+ constructor(
55
+ private indirect: number,
56
+ private noteHashOffset: number,
57
+ ) {
54
58
  super();
55
59
  }
56
60
 
57
61
  public async execute(context: AvmContext): Promise<void> {
58
62
  const memory = context.machineState.memory;
63
+ const addressing = Addressing.fromWire(this.indirect);
64
+
59
65
  context.machineState.consumeGas(this.gasCost());
60
66
 
61
67
  const operands = [this.noteHashOffset];
62
- const addressing = Addressing.fromWire(this.indirect, operands.length);
63
68
  const [noteHashOffset] = addressing.resolve(operands, memory);
64
69
  memory.checkTag(TypeTag.FIELD, noteHashOffset);
65
70
 
@@ -95,10 +100,11 @@ export class NullifierExists extends Instruction {
95
100
 
96
101
  public async execute(context: AvmContext): Promise<void> {
97
102
  const memory = context.machineState.memory;
103
+ const addressing = Addressing.fromWire(this.indirect);
104
+
98
105
  context.machineState.consumeGas(this.gasCost());
99
106
 
100
107
  const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
101
- const addressing = Addressing.fromWire(this.indirect, operands.length);
102
108
  const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
103
109
  memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
104
110
 
@@ -116,7 +122,10 @@ export class EmitNullifier extends Instruction {
116
122
  // Informs (de)serialization. See Instruction.deserialize.
117
123
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
118
124
 
119
- constructor(private indirect: number, private nullifierOffset: number) {
125
+ constructor(
126
+ private indirect: number,
127
+ private nullifierOffset: number,
128
+ ) {
120
129
  super();
121
130
  }
122
131
 
@@ -126,10 +135,11 @@ export class EmitNullifier extends Instruction {
126
135
  }
127
136
 
128
137
  const memory = context.machineState.memory;
138
+ const addressing = Addressing.fromWire(this.indirect);
139
+
129
140
  context.machineState.consumeGas(this.gasCost());
130
141
 
131
142
  const operands = [this.nullifierOffset];
132
- const addressing = Addressing.fromWire(this.indirect, operands.length);
133
143
  const [nullifierOffset] = addressing.resolve(operands, memory);
134
144
  memory.checkTag(TypeTag.FIELD, nullifierOffset);
135
145
 
@@ -172,10 +182,11 @@ export class L1ToL2MessageExists extends Instruction {
172
182
 
173
183
  public async execute(context: AvmContext): Promise<void> {
174
184
  const memory = context.machineState.memory;
185
+ const addressing = Addressing.fromWire(this.indirect);
186
+
175
187
  context.machineState.consumeGas(this.gasCost());
176
188
 
177
189
  const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
178
- const addressing = Addressing.fromWire(this.indirect, operands.length);
179
190
  const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
180
191
  memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset);
181
192
 
@@ -193,7 +204,11 @@ export class EmitUnencryptedLog extends Instruction {
193
204
  // Informs (de)serialization. See Instruction.deserialize.
194
205
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
195
206
 
196
- constructor(private indirect: number, private logOffset: number, private logSizeOffset: number) {
207
+ constructor(
208
+ private indirect: number,
209
+ private logOffset: number,
210
+ private logSizeOffset: number,
211
+ ) {
197
212
  super();
198
213
  }
199
214
 
@@ -203,9 +218,9 @@ export class EmitUnencryptedLog extends Instruction {
203
218
  }
204
219
 
205
220
  const memory = context.machineState.memory;
221
+ const addressing = Addressing.fromWire(this.indirect);
206
222
 
207
223
  const operands = [this.logOffset, this.logSizeOffset];
208
- const addressing = Addressing.fromWire(this.indirect, operands.length);
209
224
  const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
210
225
  memory.checkTag(TypeTag.UINT32, logSizeOffset);
211
226
  const logSize = memory.get(logSizeOffset).toNumber();
@@ -225,7 +240,11 @@ export class SendL2ToL1Message extends Instruction {
225
240
  // Informs (de)serialization. See Instruction.deserialize.
226
241
  static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
227
242
 
228
- constructor(private indirect: number, private recipientOffset: number, private contentOffset: number) {
243
+ constructor(
244
+ private indirect: number,
245
+ private recipientOffset: number,
246
+ private contentOffset: number,
247
+ ) {
229
248
  super();
230
249
  }
231
250
 
@@ -235,10 +254,11 @@ export class SendL2ToL1Message extends Instruction {
235
254
  }
236
255
 
237
256
  const memory = context.machineState.memory;
257
+ const addressing = Addressing.fromWire(this.indirect);
258
+
238
259
  context.machineState.consumeGas(this.gasCost());
239
260
 
240
261
  const operands = [this.recipientOffset, this.contentOffset];
241
- const addressing = Addressing.fromWire(this.indirect, operands.length);
242
262
  const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
243
263
  memory.checkTags(TypeTag.FIELD, recipientOffset, contentOffset);
244
264
 
@@ -1,4 +1,6 @@
1
- import { strict as assert } from 'assert';
1
+ import { AVM_MAX_OPERANDS } from '@aztec/constants';
2
+ import { padArrayEnd } from '@aztec/foundation/collection';
3
+ import type { Tuple } from '@aztec/foundation/serialize';
2
4
 
3
5
  import { TaggedMemory, type TaggedMemoryInterface } from '../avm_memory_types.js';
4
6
  import { RelativeAddressOutOfRangeError } from '../errors.js';
@@ -13,21 +15,28 @@ export enum AddressingMode {
13
15
  /** A class to represent the addressing mode of an instruction. */
14
16
  export class Addressing {
15
17
  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[],
18
+ /** The addressing mode for each possible operand. */
19
+ private readonly modePerOperand: Tuple<AddressingMode, typeof AVM_MAX_OPERANDS>,
18
20
  ) {}
19
21
 
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++) {
22
+ public static fromModes(modes: AddressingMode[]): Addressing {
23
+ if (modes.length > AVM_MAX_OPERANDS) {
24
+ throw new Error('Too many operands for addressing mode');
25
+ }
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,20 +45,15 @@ 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;
51
- }
52
-
53
57
  /**
54
58
  * Resolves the offsets using the addressing mode.
55
59
  * @param offsets The offsets to resolve.
@@ -57,7 +61,6 @@ export class Addressing {
57
61
  * @returns The resolved offsets. The length of the returned array is the same as the length of the input array.
58
62
  */
59
63
  public resolve(offsets: number[], mem: TaggedMemoryInterface): number[] {
60
- assert(offsets.length <= this.modePerOperand.length);
61
64
  const resolved = new Array(offsets.length);
62
65
 
63
66
  let didRelativeOnce = false;
@@ -14,10 +14,11 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
14
14
  export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction {
15
15
  public async execute(context: AvmContext): Promise<void> {
16
16
  const memory = context.machineState.memory;
17
+ const addressing = Addressing.fromWire(this.indirect);
18
+
17
19
  context.machineState.consumeGas(this.gasCost());
18
20
 
19
21
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
20
- const addressing = Addressing.fromWire(this.indirect, operands.length);
21
22
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
22
23
  this.checkTags(memory, aOffset, bOffset);
23
24
 
@@ -8,10 +8,11 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
8
8
  abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
9
9
  public async execute(context: AvmContext): Promise<void> {
10
10
  const memory = context.machineState.memory;
11
+ const addressing = Addressing.fromWire(this.indirect);
12
+
11
13
  context.machineState.consumeGas(this.gasCost());
12
14
 
13
15
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
14
- const addressing = Addressing.fromWire(this.indirect, operands.length);
15
16
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
16
17
  this.checkTags(memory, aOffset, bOffset);
17
18
 
@@ -89,16 +90,21 @@ export class Not extends Instruction {
89
90
  static readonly wireFormat8 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT8, OperandType.UINT8];
90
91
  static readonly wireFormat16 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
91
92
 
92
- constructor(private indirect: number, private srcOffset: number, private dstOffset: number) {
93
+ constructor(
94
+ private indirect: number,
95
+ private srcOffset: number,
96
+ private dstOffset: number,
97
+ ) {
93
98
  super();
94
99
  }
95
100
 
96
101
  public async execute(context: AvmContext): Promise<void> {
97
102
  const memory = context.machineState.memory;
103
+ const addressing = Addressing.fromWire(this.indirect);
104
+
98
105
  context.machineState.consumeGas(this.gasCost());
99
106
 
100
107
  const operands = [this.srcOffset, this.dstOffset];
101
- const addressing = Addressing.fromWire(this.indirect, operands.length);
102
108
  const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
103
109
  TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset));
104
110
  const value = memory.getAs<IntegralValue>(srcOffset);
@@ -7,10 +7,11 @@ 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
+ const addressing = Addressing.fromWire(this.indirect);
11
+
10
12
  context.machineState.consumeGas(this.gasCost());
11
13
 
12
14
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
13
- const addressing = Addressing.fromWire(this.indirect, operands.length);
14
15
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
15
16
  memory.checkTagsAreSame(aOffset, bOffset);
16
17
 
@@ -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,16 @@ export class GetContractInstance extends Instruction {
36
34
 
37
35
  async execute(context: AvmContext): Promise<void> {
38
36
  const memory = context.machineState.memory;
37
+ const addressing = Addressing.fromWire(this.indirect);
38
+
39
39
  context.machineState.consumeGas(this.gasCost());
40
40
 
41
41
  if (!(this.memberEnum in ContractInstanceMember)) {
42
42
  throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);
43
43
  }
44
44
 
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);
45
+ const operands = [this.addressOffset, this.dstOffset];
46
+ const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
48
47
  memory.checkTag(TypeTag.FIELD, addressOffset);
49
48
 
50
49
  const address = memory.get(addressOffset).toAztecAddress();
@@ -66,7 +65,9 @@ export class GetContractInstance extends Instruction {
66
65
  }
67
66
  }
68
67
 
68
+ const existsOffset = dstOffset;
69
+ const memberValueOffset = dstOffset + 1;
69
70
  memory.set(existsOffset, new Uint1(exists ? 1 : 0));
70
- memory.set(dstOffset, memberValue);
71
+ memory.set(memberValueOffset, memberValue);
71
72
  }
72
73
  }
@@ -38,16 +38,21 @@ 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;
51
+ const addressing = Addressing.fromWire(this.indirect);
52
+
47
53
  context.machineState.consumeGas(this.gasCost());
48
54
 
49
55
  const operands = [this.condOffset];
50
- const addressing = Addressing.fromWire(this.indirect, operands.length);
51
56
  const [condOffset] = addressing.resolve(operands, memory);
52
57
  const condition = memory.getAs<IntegralValue>(condOffset);
53
58
 
@@ -33,8 +33,9 @@ export class ToRadixBE extends Instruction {
33
33
 
34
34
  public async execute(context: AvmContext): Promise<void> {
35
35
  const memory = context.machineState.memory;
36
+ const addressing = Addressing.fromWire(this.indirect);
37
+
36
38
  const operands = [this.srcOffset, this.radixOffset, this.numLimbsOffset, this.outputBitsOffset, this.dstOffset];
37
- const addressing = Addressing.fromWire(this.indirect, operands.length);
38
39
  const [srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset] = addressing.resolve(operands, memory);
39
40
 
40
41
  // The radix gadget only takes in a Field
@@ -39,6 +39,8 @@ export class EcAdd extends Instruction {
39
39
 
40
40
  public async execute(context: AvmContext): Promise<void> {
41
41
  const memory = context.machineState.memory;
42
+ const addressing = Addressing.fromWire(this.indirect);
43
+
42
44
  context.machineState.consumeGas(this.gasCost());
43
45
 
44
46
  const operands = [
@@ -50,7 +52,6 @@ export class EcAdd extends Instruction {
50
52
  this.p2IsInfiniteOffset,
51
53
  this.dstOffset,
52
54
  ];
53
- const addressing = Addressing.fromWire(this.indirect, operands.length);
54
55
  const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] =
55
56
  addressing.resolve(operands, memory);
56
57
 
@@ -61,12 +61,18 @@ export class GetEnvVar extends Instruction {
61
61
  OperandType.UINT8, // variable enum (immediate)
62
62
  ];
63
63
 
64
- constructor(private indirect: number, private dstOffset: number, private varEnum: number) {
64
+ constructor(
65
+ private indirect: number,
66
+ private dstOffset: number,
67
+ private varEnum: number,
68
+ ) {
65
69
  super();
66
70
  }
67
71
 
68
72
  public async execute(context: AvmContext): Promise<void> {
69
73
  const memory = context.machineState.memory;
74
+ const addressing = Addressing.fromWire(this.indirect);
75
+
70
76
  context.machineState.consumeGas(this.gasCost());
71
77
 
72
78
  if (!(this.varEnum in EnvironmentVariable)) {
@@ -74,7 +80,6 @@ export class GetEnvVar extends Instruction {
74
80
  }
75
81
 
76
82
  const operands = [this.dstOffset];
77
- const addressing = Addressing.fromWire(this.indirect, operands.length);
78
83
  const [dstOffset] = addressing.resolve(operands, memory);
79
84
 
80
85
  memory.set(dstOffset, getValue(this.varEnum as EnvironmentVariable, context));
@@ -22,17 +22,18 @@ abstract class ExternalCall extends Instruction {
22
22
  private l2GasOffset: number,
23
23
  private daGasOffset: number,
24
24
  private addrOffset: number,
25
- private argsOffset: number,
26
25
  private argsSizeOffset: number,
26
+ private argsOffset: number,
27
27
  ) {
28
28
  super();
29
29
  }
30
30
 
31
31
  public async execute(context: AvmContext) {
32
32
  const memory = context.machineState.memory;
33
- const operands = [this.l2GasOffset, this.daGasOffset, this.addrOffset, this.argsOffset, this.argsSizeOffset];
34
- const addressing = Addressing.fromWire(this.indirect, operands.length);
35
- const [l2GasOffset, daGasOffset, addrOffset, argsOffset, argsSizeOffset] = addressing.resolve(operands, memory);
33
+ const addressing = Addressing.fromWire(this.indirect);
34
+
35
+ const operands = [this.l2GasOffset, this.daGasOffset, this.addrOffset, this.argsSizeOffset, this.argsOffset];
36
+ const [l2GasOffset, daGasOffset, addrOffset, argsSizeOffset, argsOffset] = addressing.resolve(operands, memory);
36
37
  // TODO: Should be U32
37
38
  memory.checkTags(TypeTag.FIELD, l2GasOffset);
38
39
  memory.checkTags(TypeTag.FIELD, daGasOffset);
@@ -133,15 +134,18 @@ export class SuccessCopy extends Instruction {
133
134
  OperandType.UINT16, // dstOffset (16-bit)
134
135
  ];
135
136
 
136
- constructor(private indirect: number, private dstOffset: number) {
137
+ constructor(
138
+ private indirect: number,
139
+ private dstOffset: number,
140
+ ) {
137
141
  super();
138
142
  }
139
143
 
140
144
  public async execute(context: AvmContext): Promise<void> {
141
145
  const memory = context.machineState.memory;
146
+ const addressing = Addressing.fromWire(this.indirect);
142
147
 
143
148
  const operands = [this.dstOffset];
144
- const addressing = Addressing.fromWire(this.indirect, operands.length);
145
149
  const [dstOffset] = addressing.resolve(operands, memory);
146
150
 
147
151
  // Use the direct success tracking property
@@ -163,16 +167,20 @@ export class Return extends Instruction {
163
167
  OperandType.UINT16,
164
168
  ];
165
169
 
166
- constructor(private indirect: number, private returnOffset: number, private returnSizeOffset: number) {
170
+ constructor(
171
+ private indirect: number,
172
+ private returnSizeOffset: number,
173
+ private returnOffset: number,
174
+ ) {
167
175
  super();
168
176
  }
169
177
 
170
178
  public async execute(context: AvmContext): Promise<void> {
171
179
  const memory = context.machineState.memory;
180
+ const addressing = Addressing.fromWire(this.indirect);
172
181
 
173
- const operands = [this.returnOffset, this.returnSizeOffset];
174
- const addressing = Addressing.fromWire(this.indirect, operands.length);
175
- const [returnOffset, returnSizeOffset] = addressing.resolve(operands, memory);
182
+ const operands = [this.returnSizeOffset, this.returnOffset];
183
+ const [returnSizeOffset, returnOffset] = addressing.resolve(operands, memory);
176
184
 
177
185
  memory.checkTag(TypeTag.UINT32, returnSizeOffset);
178
186
  const returnSize = memory.get(returnSizeOffset).toNumber();
@@ -205,16 +213,20 @@ export class Revert extends Instruction {
205
213
  OperandType.UINT16,
206
214
  ];
207
215
 
208
- constructor(private indirect: number, private returnOffset: number, private retSizeOffset: number) {
216
+ constructor(
217
+ private indirect: number,
218
+ private retSizeOffset: number,
219
+ private returnOffset: number,
220
+ ) {
209
221
  super();
210
222
  }
211
223
 
212
224
  public async execute(context: AvmContext): Promise<void> {
213
225
  const memory = context.machineState.memory;
226
+ const addressing = Addressing.fromWire(this.indirect);
214
227
 
215
- const operands = [this.returnOffset, this.retSizeOffset];
216
- const addressing = Addressing.fromWire(this.indirect, operands.length);
217
- const [returnOffset, retSizeOffset] = addressing.resolve(operands, memory);
228
+ const operands = [this.retSizeOffset, this.returnOffset];
229
+ const [retSizeOffset, returnOffset] = addressing.resolve(operands, memory);
218
230
 
219
231
  memory.checkTag(TypeTag.UINT32, retSizeOffset);
220
232
  const retSize = memory.get(retSizeOffset).toNumber();
@@ -19,16 +19,22 @@ export class Poseidon2 extends Instruction {
19
19
  OperandType.UINT16,
20
20
  ];
21
21
 
22
- constructor(private indirect: number, private inputStateOffset: number, private outputStateOffset: number) {
22
+ constructor(
23
+ private indirect: number,
24
+ private inputStateOffset: number,
25
+ private outputStateOffset: number,
26
+ ) {
23
27
  super();
24
28
  }
25
29
 
26
30
  public async execute(context: AvmContext): Promise<void> {
27
31
  const memory = context.machineState.memory;
32
+ const addressing = Addressing.fromWire(this.indirect);
33
+
28
34
  context.machineState.consumeGas(this.gasCost());
29
35
 
30
36
  const operands = [this.inputStateOffset, this.outputStateOffset];
31
- const addressing = Addressing.fromWire(this.indirect, operands.length);
37
+
32
38
  const [inputOffset, outputOffset] = addressing.resolve(operands, memory);
33
39
 
34
40
  const inputState = memory.getSlice(inputOffset, Poseidon2.stateSize);
@@ -54,7 +60,11 @@ export class KeccakF1600 extends Instruction {
54
60
  OperandType.UINT16,
55
61
  ];
56
62
 
57
- constructor(private indirect: number, private dstOffset: number, private inputOffset: number) {
63
+ constructor(
64
+ private indirect: number,
65
+ private dstOffset: number,
66
+ private inputOffset: number,
67
+ ) {
58
68
  super();
59
69
  }
60
70
 
@@ -62,8 +72,9 @@ export class KeccakF1600 extends Instruction {
62
72
  public async execute(context: AvmContext): Promise<void> {
63
73
  const inputSize = 25;
64
74
  const memory = context.machineState.memory;
75
+ const addressing = Addressing.fromWire(this.indirect);
76
+
65
77
  const operands = [this.dstOffset, this.inputOffset];
66
- const addressing = Addressing.fromWire(this.indirect, operands.length);
67
78
  const [dstOffset, inputOffset] = addressing.resolve(operands, memory);
68
79
  context.machineState.consumeGas(this.gasCost());
69
80
 
@@ -104,8 +115,9 @@ export class Sha256Compression extends Instruction {
104
115
  const INPUTS_SIZE = 16;
105
116
 
106
117
  const memory = context.machineState.memory;
118
+ const addressing = Addressing.fromWire(this.indirect);
119
+
107
120
  const operands = [this.outputOffset, this.stateOffset, this.inputsOffset];
108
- const addressing = Addressing.fromWire(this.indirect, operands.length);
109
121
  const [outputOffset, stateOffset, inputsOffset] = addressing.resolve(operands, memory);
110
122
 
111
123
  // Note: size of output is same as size of state