@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
@@ -1,7 +1,6 @@
1
- import { strict as assert } from 'assert';
2
-
3
1
  import { type AvmContext } from '../avm_context.js';
4
- import { TypeTag, Uint8 } from '../avm_memory_types.js';
2
+ import { TypeTag, Uint1, Uint8 } from '../avm_memory_types.js';
3
+ import { InstructionExecutionError } from '../errors.js';
5
4
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
6
5
  import { Addressing } from './addressing_mode.js';
7
6
  import { Instruction } from './instruction.js';
@@ -16,32 +15,39 @@ export class ToRadixLE extends Instruction {
16
15
  OperandType.UINT8, // Indirect
17
16
  OperandType.UINT32, // src memory address
18
17
  OperandType.UINT32, // dst memory address
19
- OperandType.UINT32, // radix (immediate)
18
+ OperandType.UINT32, // radix memory address
20
19
  OperandType.UINT32, // number of limbs (Immediate)
20
+ OperandType.UINT8, // output is in "bits" mode (Immediate - Uint1 still takes up a whole byte)
21
21
  ];
22
22
 
23
23
  constructor(
24
24
  private indirect: number,
25
25
  private srcOffset: number,
26
26
  private dstOffset: number,
27
- private radix: number,
27
+ private radixOffset: number,
28
28
  private numLimbs: number,
29
+ private outputBits: number, // effectively a bool
29
30
  ) {
30
- assert(radix <= 256, 'Radix cannot be greater than 256');
31
31
  super();
32
32
  }
33
33
 
34
34
  public async execute(context: AvmContext): Promise<void> {
35
35
  const memory = context.machineState.memory.track(this.type);
36
- const [srcOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.srcOffset, this.dstOffset], memory);
37
- const memoryOperations = { reads: 1, writes: this.numLimbs, indirect: this.indirect };
38
- context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.numLimbs }));
36
+ const operands = [this.srcOffset, this.dstOffset, this.radixOffset];
37
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
38
+ const [srcOffset, dstOffset, radixOffset] = addressing.resolve(operands, memory);
39
+ context.machineState.consumeGas(this.gasCost(this.numLimbs));
39
40
 
40
41
  // The radix gadget only takes in a Field
41
42
  memory.checkTag(TypeTag.FIELD, srcOffset);
43
+ memory.checkTag(TypeTag.UINT32, radixOffset);
42
44
 
43
45
  let value: bigint = memory.get(srcOffset).toBigInt();
44
- const radixBN: bigint = BigInt(this.radix);
46
+ const radix: bigint = memory.get(radixOffset).toBigInt();
47
+ if (radix > 256) {
48
+ throw new InstructionExecutionError(`ToRadixLE instruction's radix should be <= 256 (was ${radix})`);
49
+ }
50
+ const radixBN: bigint = BigInt(radix);
45
51
  const limbArray = [];
46
52
 
47
53
  for (let i = 0; i < this.numLimbs; i++) {
@@ -50,10 +56,11 @@ export class ToRadixLE extends Instruction {
50
56
  value /= radixBN;
51
57
  }
52
58
 
53
- const res = limbArray.map(byte => new Uint8(byte));
59
+ const outputType = this.outputBits != 0 ? Uint1 : Uint8;
60
+ const res = limbArray.map(byte => new outputType(byte));
54
61
  memory.setSlice(dstOffset, res);
55
62
 
56
- memory.assert(memoryOperations);
63
+ memory.assert({ reads: 2, writes: this.numLimbs, addressing });
57
64
  context.machineState.incrementPc();
58
65
  }
59
66
  }
@@ -14,7 +14,7 @@ export class EcAdd extends Instruction {
14
14
  // Informs (de)serialization. See Instruction.deserialize.
15
15
  static readonly wireFormat: OperandType[] = [
16
16
  OperandType.UINT8, // reserved
17
- OperandType.UINT8, // indirect
17
+ OperandType.UINT16, // indirect
18
18
  OperandType.UINT32, // p1X
19
19
  OperandType.UINT32, // p1Y
20
20
  OperandType.UINT32, // p1IsInfinite
@@ -38,23 +38,21 @@ export class EcAdd extends Instruction {
38
38
  }
39
39
 
40
40
  public async execute(context: AvmContext): Promise<void> {
41
- const memoryOperations = { reads: 6, writes: 3, indirect: this.indirect };
42
41
  const memory = context.machineState.memory.track(this.type);
43
- context.machineState.consumeGas(this.gasCost(memoryOperations));
42
+ context.machineState.consumeGas(this.gasCost());
44
43
 
44
+ const operands = [
45
+ this.p1XOffset,
46
+ this.p1YOffset,
47
+ this.p1IsInfiniteOffset,
48
+ this.p2XOffset,
49
+ this.p2YOffset,
50
+ this.p2IsInfiniteOffset,
51
+ this.dstOffset,
52
+ ];
53
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
45
54
  const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] =
46
- Addressing.fromWire(this.indirect).resolve(
47
- [
48
- this.p1XOffset,
49
- this.p1YOffset,
50
- this.p1IsInfiniteOffset,
51
- this.p2XOffset,
52
- this.p2YOffset,
53
- this.p2IsInfiniteOffset,
54
- this.dstOffset,
55
- ],
56
- memory,
57
- );
55
+ addressing.resolve(operands, memory);
58
56
 
59
57
  const p1X = memory.get(p1XOffset);
60
58
  const p1Y = memory.get(p1YOffset);
@@ -86,7 +84,7 @@ export class EcAdd extends Instruction {
86
84
  // Check representation of infinity for grumpkin
87
85
  memory.set(dstOffset + 2, new Field(dest.equals(Point.ZERO) ? 1 : 0));
88
86
 
89
- memory.assert(memoryOperations);
87
+ memory.assert({ reads: 6, writes: 3, addressing });
90
88
  context.machineState.incrementPc();
91
89
  }
92
90
  }
@@ -1,112 +1,86 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
- import type { AvmExecutionEnvironment } from '../avm_execution_environment.js';
3
- import { Field, type MemoryValue, Uint32, Uint64 } from '../avm_memory_types.js';
4
- import { Opcode } from '../serialization/instruction_serialization.js';
5
- import { GetterInstruction } from './instruction_impl.js';
6
-
7
- abstract class EnvironmentGetterInstruction extends GetterInstruction {
8
- protected getValue(context: AvmContext): MemoryValue {
9
- return this.getEnvironmentValue(context.environment);
10
- }
11
-
12
- protected abstract getEnvironmentValue(env: AvmExecutionEnvironment): MemoryValue;
13
- }
14
-
15
- export class Address extends EnvironmentGetterInstruction {
16
- static type: string = 'ADDRESS';
17
- static readonly opcode: Opcode = Opcode.ADDRESS;
18
-
19
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
20
- return new Field(env.address.toField());
21
- }
22
- }
23
-
24
- export class StorageAddress extends EnvironmentGetterInstruction {
25
- static type: string = 'STORAGEADDRESS';
26
- static readonly opcode: Opcode = Opcode.STORAGEADDRESS;
27
-
28
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
29
- return new Field(env.storageAddress.toField());
30
- }
31
- }
32
-
33
- export class Sender extends EnvironmentGetterInstruction {
34
- static type: string = 'SENDER';
35
- static readonly opcode: Opcode = Opcode.SENDER;
36
-
37
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
38
- return new Field(env.sender.toField());
39
- }
40
- }
41
-
42
- export class FunctionSelector extends EnvironmentGetterInstruction {
43
- static type: string = 'FUNCTIONSELECTOR';
44
- static readonly opcode: Opcode = Opcode.FUNCTIONSELECTOR;
45
-
46
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
47
- return new Uint32(env.functionSelector.value);
48
- }
49
- }
50
-
51
- export class TransactionFee extends EnvironmentGetterInstruction {
52
- static type: string = 'TRANSACTIONFEE';
53
- static readonly opcode: Opcode = Opcode.TRANSACTIONFEE;
54
-
55
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
56
- return new Field(env.transactionFee);
57
- }
58
- }
59
-
60
- export class ChainId extends EnvironmentGetterInstruction {
61
- static type: string = 'CHAINID';
62
- static readonly opcode: Opcode = Opcode.CHAINID;
63
-
64
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
65
- return new Field(env.globals.chainId);
66
- }
2
+ import { Field, Uint32, Uint64 } from '../avm_memory_types.js';
3
+ import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
4
+ import { Addressing } from './addressing_mode.js';
5
+ import { Instruction } from './instruction.js';
6
+
7
+ export enum EnvironmentVariable {
8
+ ADDRESS,
9
+ STORAGEADDRESS,
10
+ SENDER,
11
+ FUNCTIONSELECTOR,
12
+ TRANSACTIONFEE,
13
+ CHAINID,
14
+ VERSION,
15
+ BLOCKNUMBER,
16
+ TIMESTAMP,
17
+ FEEPERL2GAS,
18
+ FEEPERDAGAS,
19
+ ISSTATICCALL,
20
+ L2GASLEFT,
21
+ DAGASLEFT,
67
22
  }
68
23
 
69
- export class Version extends EnvironmentGetterInstruction {
70
- static type: string = 'VERSION';
71
- static readonly opcode: Opcode = Opcode.VERSION;
72
-
73
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
74
- return new Field(env.globals.version);
24
+ function getValue(e: EnvironmentVariable, ctx: AvmContext) {
25
+ switch (e) {
26
+ case EnvironmentVariable.ADDRESS:
27
+ return new Field(ctx.environment.address.toField());
28
+ case EnvironmentVariable.STORAGEADDRESS:
29
+ return new Field(ctx.environment.storageAddress.toField());
30
+ case EnvironmentVariable.SENDER:
31
+ return new Field(ctx.environment.sender.toField());
32
+ case EnvironmentVariable.FUNCTIONSELECTOR:
33
+ return new Uint32(ctx.environment.functionSelector.value);
34
+ case EnvironmentVariable.TRANSACTIONFEE:
35
+ return new Field(ctx.environment.transactionFee);
36
+ case EnvironmentVariable.CHAINID:
37
+ return new Field(ctx.environment.globals.chainId);
38
+ case EnvironmentVariable.VERSION:
39
+ return new Field(ctx.environment.globals.version);
40
+ case EnvironmentVariable.BLOCKNUMBER:
41
+ return new Field(ctx.environment.globals.blockNumber);
42
+ case EnvironmentVariable.TIMESTAMP:
43
+ return new Uint64(ctx.environment.globals.timestamp.toBigInt());
44
+ case EnvironmentVariable.FEEPERL2GAS:
45
+ return new Field(ctx.environment.globals.gasFees.feePerL2Gas);
46
+ case EnvironmentVariable.FEEPERDAGAS:
47
+ return new Field(ctx.environment.globals.gasFees.feePerDaGas);
48
+ case EnvironmentVariable.ISSTATICCALL:
49
+ return new Field(ctx.environment.isStaticCall ? 1 : 0);
50
+ case EnvironmentVariable.L2GASLEFT:
51
+ return new Field(ctx.machineState.l2GasLeft);
52
+ case EnvironmentVariable.DAGASLEFT:
53
+ return new Field(ctx.machineState.daGasLeft);
54
+ default:
55
+ throw new Error(`Unknown environment variable ${e}`);
75
56
  }
76
57
  }
77
58
 
78
- export class BlockNumber extends EnvironmentGetterInstruction {
79
- static type: string = 'BLOCKNUMBER';
80
- static readonly opcode: Opcode = Opcode.BLOCKNUMBER;
81
-
82
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
83
- return new Field(env.globals.blockNumber);
59
+ export class GetEnvVar extends Instruction {
60
+ public static readonly type: string = 'GETENVVAR';
61
+ public static readonly opcode: Opcode = Opcode.GETENVVAR_16;
62
+ static readonly wireFormat16: OperandType[] = [
63
+ OperandType.UINT8, // opcode
64
+ OperandType.UINT8, // indirect
65
+ OperandType.UINT8, // variable enum (immediate)
66
+ OperandType.UINT16, // dstOffset
67
+ ];
68
+
69
+ constructor(private indirect: number, private varEnum: EnvironmentVariable, private dstOffset: number) {
70
+ super();
84
71
  }
85
- }
86
72
 
87
- export class Timestamp extends EnvironmentGetterInstruction {
88
- static type: string = 'TIMESTAMP';
89
- static readonly opcode: Opcode = Opcode.TIMESTAMP;
73
+ public async execute(context: AvmContext): Promise<void> {
74
+ const memory = context.machineState.memory.track(this.type);
75
+ context.machineState.consumeGas(this.gasCost());
90
76
 
91
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
92
- return new Uint64(env.globals.timestamp.toBigInt());
93
- }
94
- }
95
-
96
- export class FeePerL2Gas extends EnvironmentGetterInstruction {
97
- static type: string = 'FEEPERL2GAS';
98
- static readonly opcode: Opcode = Opcode.FEEPERL2GAS;
99
-
100
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
101
- return new Field(env.globals.gasFees.feePerL2Gas);
102
- }
103
- }
77
+ const operands = [this.dstOffset];
78
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
79
+ const [dstOffset] = addressing.resolve(operands, memory);
104
80
 
105
- export class FeePerDAGas extends EnvironmentGetterInstruction {
106
- static type: string = 'FEEPERDAGAS';
107
- static readonly opcode: Opcode = Opcode.FEEPERDAGAS;
81
+ memory.set(dstOffset, getValue(this.varEnum, context));
108
82
 
109
- protected getEnvironmentValue(env: AvmExecutionEnvironment) {
110
- return new Field(env.globals.gasFees.feePerDaGas);
83
+ memory.assert({ writes: 1, addressing });
84
+ context.machineState.incrementPc();
111
85
  }
112
86
  }
@@ -15,7 +15,7 @@ abstract class ExternalCall extends Instruction {
15
15
  // Informs (de)serialization. See Instruction.deserialize.
16
16
  static readonly wireFormat: OperandType[] = [
17
17
  OperandType.UINT8,
18
- OperandType.UINT8,
18
+ OperandType.UINT16, // Indirect
19
19
  OperandType.UINT32,
20
20
  OperandType.UINT32,
21
21
  OperandType.UINT32,
@@ -45,29 +45,34 @@ abstract class ExternalCall extends Instruction {
45
45
 
46
46
  public async execute(context: AvmContext) {
47
47
  const memory = context.machineState.memory.track(this.type);
48
- const [gasOffset, addrOffset, argsOffset, argsSizeOffset, retOffset, successOffset] = Addressing.fromWire(
49
- this.indirect,
50
- ).resolve(
51
- [this.gasOffset, this.addrOffset, this.argsOffset, this.argsSizeOffset, this.retOffset, this.successOffset],
52
- memory,
53
- );
48
+ const operands = [
49
+ this.gasOffset,
50
+ this.addrOffset,
51
+ this.argsOffset,
52
+ this.argsSizeOffset,
53
+ this.retOffset,
54
+ this.successOffset,
55
+ this.functionSelectorOffset,
56
+ ];
57
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
58
+ const [gasOffset, addrOffset, argsOffset, argsSizeOffset, retOffset, successOffset, functionSelectorOffset] =
59
+ addressing.resolve(operands, memory);
54
60
  memory.checkTags(TypeTag.FIELD, gasOffset, gasOffset + 1);
55
61
  memory.checkTag(TypeTag.FIELD, addrOffset);
56
62
  memory.checkTag(TypeTag.UINT32, argsSizeOffset);
57
- memory.checkTag(TypeTag.FIELD, this.functionSelectorOffset);
63
+ memory.checkTag(TypeTag.FIELD, functionSelectorOffset);
58
64
 
59
65
  const calldataSize = memory.get(argsSizeOffset).toNumber();
60
66
  memory.checkTagsRange(TypeTag.FIELD, argsOffset, calldataSize);
61
67
 
62
68
  const callAddress = memory.getAs<Field>(addrOffset);
63
69
  const calldata = memory.getSlice(argsOffset, calldataSize).map(f => f.toFr());
64
- const functionSelector = memory.getAs<Field>(this.functionSelectorOffset).toFr();
70
+ const functionSelector = memory.getAs<Field>(functionSelectorOffset).toFr();
65
71
  // If we are already in a static call, we propagate the environment.
66
72
  const callType = context.environment.isStaticCall ? 'STATICCALL' : this.type;
67
73
 
68
74
  // First we consume the gas for this operation.
69
- const memoryOperations = { reads: calldataSize + 5, writes: 1 + this.retSize, indirect: this.indirect };
70
- context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: calldataSize + this.retSize }));
75
+ context.machineState.consumeGas(this.gasCost(calldataSize + this.retSize));
71
76
  // Then we consume the gas allocated for the nested call. The excess will be refunded later.
72
77
  // Gas allocation is capped by the amount of gas left in the current context.
73
78
  // We have to do some dancing here because the gas allocation is a field,
@@ -127,7 +132,7 @@ abstract class ExternalCall extends Instruction {
127
132
  /*avmCallResults=*/ nestedCallResults,
128
133
  );
129
134
 
130
- memory.assert(memoryOperations);
135
+ memory.assert({ reads: calldataSize + 5, writes: 1 + this.retSize, addressing });
131
136
  context.machineState.incrementPc();
132
137
  }
133
138
 
@@ -168,16 +173,17 @@ export class Return extends Instruction {
168
173
  }
169
174
 
170
175
  public async execute(context: AvmContext): Promise<void> {
171
- const memoryOperations = { reads: this.copySize, indirect: this.indirect };
172
176
  const memory = context.machineState.memory.track(this.type);
173
- context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.copySize }));
177
+ context.machineState.consumeGas(this.gasCost(this.copySize));
174
178
 
175
- const [returnOffset] = Addressing.fromWire(this.indirect).resolve([this.returnOffset], memory);
179
+ const operands = [this.returnOffset];
180
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
181
+ const [returnOffset] = addressing.resolve(operands, memory);
176
182
 
177
183
  const output = memory.getSlice(returnOffset, this.copySize).map(word => word.toFr());
178
184
 
179
185
  context.machineState.return(output);
180
- memory.assert(memoryOperations);
186
+ memory.assert({ reads: this.copySize, addressing });
181
187
  }
182
188
  }
183
189
 
@@ -203,16 +209,17 @@ export class Revert extends Instruction {
203
209
  }
204
210
 
205
211
  public async execute(context: AvmContext): Promise<void> {
206
- const memoryOperations = { reads: this.retSize, indirect: this.indirect };
207
212
  const memory = context.machineState.memory.track(this.type);
208
- context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.retSize }));
213
+ context.machineState.consumeGas(this.gasCost(this.retSize));
209
214
 
210
- const [returnOffset] = Addressing.fromWire(this.indirect).resolve([this.returnOffset], memory);
215
+ const operands = [this.returnOffset];
216
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
217
+ const [returnOffset] = addressing.resolve(operands, memory);
211
218
 
212
219
  const output = memory.getSlice(returnOffset, this.retSize).map(word => word.toFr());
213
220
 
214
221
  context.machineState.revert(output);
215
- memory.assert(memoryOperations);
222
+ memory.assert({ reads: this.retSize, addressing });
216
223
  }
217
224
  }
218
225
 
@@ -1,9 +1,15 @@
1
- import { keccak256, keccakf1600, pedersenHash, poseidon2Permutation, sha256 } from '@aztec/foundation/crypto';
1
+ import {
2
+ keccak256,
3
+ keccakf1600,
4
+ pedersenHash,
5
+ poseidon2Permutation,
6
+ sha256Compression,
7
+ } from '@aztec/foundation/crypto';
2
8
 
3
9
  import { strict as assert } from 'assert';
4
10
 
5
11
  import { type AvmContext } from '../avm_context.js';
6
- import { Field, TypeTag, Uint8, Uint64 } from '../avm_memory_types.js';
12
+ import { Field, TypeTag, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
7
13
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
8
14
  import { Addressing } from './addressing_mode.js';
9
15
  import { Instruction } from './instruction.js';
@@ -26,14 +32,12 @@ export class Poseidon2 extends Instruction {
26
32
  }
27
33
 
28
34
  public async execute(context: AvmContext): Promise<void> {
29
- const memoryOperations = { reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, indirect: this.indirect };
30
35
  const memory = context.machineState.memory.track(this.type);
31
- context.machineState.consumeGas(this.gasCost(memoryOperations));
36
+ context.machineState.consumeGas(this.gasCost());
32
37
 
33
- const [inputOffset, outputOffset] = Addressing.fromWire(this.indirect).resolve(
34
- [this.inputStateOffset, this.outputStateOffset],
35
- memory,
36
- );
38
+ const operands = [this.inputStateOffset, this.outputStateOffset];
39
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
40
+ const [inputOffset, outputOffset] = addressing.resolve(operands, memory);
37
41
  memory.checkTagsRange(TypeTag.FIELD, inputOffset, Poseidon2.stateSize);
38
42
 
39
43
  const inputState = memory.getSlice(inputOffset, Poseidon2.stateSize);
@@ -43,7 +47,7 @@ export class Poseidon2 extends Instruction {
43
47
  outputState.map(word => new Field(word)),
44
48
  );
45
49
 
46
- memory.assert(memoryOperations);
50
+ memory.assert({ reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, addressing });
47
51
  context.machineState.incrementPc();
48
52
  }
49
53
  }
@@ -73,14 +77,12 @@ export class Keccak extends Instruction {
73
77
  // pub fn keccak256(input: [u8], message_size: u32) -> [u8; 32]
74
78
  public async execute(context: AvmContext): Promise<void> {
75
79
  const memory = context.machineState.memory.track(this.type);
76
- const [dstOffset, messageOffset, messageSizeOffset] = Addressing.fromWire(this.indirect).resolve(
77
- [this.dstOffset, this.messageOffset, this.messageSizeOffset],
78
- memory,
79
- );
80
+ const operands = [this.dstOffset, this.messageOffset, this.messageSizeOffset];
81
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
82
+ const [dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory);
80
83
  memory.checkTag(TypeTag.UINT32, messageSizeOffset);
81
84
  const messageSize = memory.get(messageSizeOffset).toNumber();
82
- const memoryOperations = { reads: messageSize + 1, writes: 32, indirect: this.indirect };
83
- context.machineState.consumeGas(this.gasCost(memoryOperations));
85
+ context.machineState.consumeGas(this.gasCost(messageSize));
84
86
 
85
87
  memory.checkTagsRange(TypeTag.UINT8, messageOffset, messageSize);
86
88
 
@@ -91,7 +93,7 @@ export class Keccak extends Instruction {
91
93
  const res = [...hashBuffer].map(byte => new Uint8(byte));
92
94
  memory.setSlice(dstOffset, res);
93
95
 
94
- memory.assert(memoryOperations);
96
+ memory.assert({ reads: messageSize + 1, writes: 32, addressing });
95
97
  context.machineState.incrementPc();
96
98
  }
97
99
  }
@@ -122,15 +124,13 @@ export class KeccakF1600 extends Instruction {
122
124
  // pub fn keccakf1600(input: [u64; 25]) -> [u64; 25]
123
125
  public async execute(context: AvmContext): Promise<void> {
124
126
  const memory = context.machineState.memory.track(this.type);
125
- const [dstOffset, stateOffset, stateSizeOffset] = Addressing.fromWire(this.indirect).resolve(
126
- [this.dstOffset, this.stateOffset, this.stateSizeOffset],
127
- memory,
128
- );
127
+ const operands = [this.dstOffset, this.stateOffset, this.stateSizeOffset];
128
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
129
+ const [dstOffset, stateOffset, stateSizeOffset] = addressing.resolve(operands, memory);
129
130
  memory.checkTag(TypeTag.UINT32, stateSizeOffset);
130
131
  const stateSize = memory.get(stateSizeOffset).toNumber();
131
132
  assert(stateSize === 25, 'Invalid state size for keccakf1600');
132
- const memoryOperations = { reads: stateSize + 1, writes: 25, indirect: this.indirect };
133
- context.machineState.consumeGas(this.gasCost(memoryOperations));
133
+ context.machineState.consumeGas(this.gasCost());
134
134
 
135
135
  memory.checkTagsRange(TypeTag.UINT64, stateOffset, stateSize);
136
136
 
@@ -140,14 +140,14 @@ export class KeccakF1600 extends Instruction {
140
140
  const res = updatedState.map(word => new Uint64(word));
141
141
  memory.setSlice(dstOffset, res);
142
142
 
143
- memory.assert(memoryOperations);
143
+ memory.assert({ reads: stateSize + 1, writes: 25, addressing });
144
144
  context.machineState.incrementPc();
145
145
  }
146
146
  }
147
147
 
148
- export class Sha256 extends Instruction {
149
- static type: string = 'SHA256';
150
- static readonly opcode: Opcode = Opcode.SHA256;
148
+ export class Sha256Compression extends Instruction {
149
+ static type: string = 'SHA256COMPRESSION';
150
+ static readonly opcode: Opcode = Opcode.SHA256COMPRESSION;
151
151
 
152
152
  // Informs (de)serialization. See Instruction.deserialize.
153
153
  static readonly wireFormat: OperandType[] = [
@@ -160,34 +160,36 @@ export class Sha256 extends Instruction {
160
160
 
161
161
  constructor(
162
162
  private indirect: number,
163
- private dstOffset: number,
164
- private messageOffset: number,
165
- private messageSizeOffset: number,
163
+ private outputOffset: number,
164
+ private stateOffset: number,
165
+ private inputsOffset: number,
166
166
  ) {
167
167
  super();
168
168
  }
169
169
 
170
- // pub fn sha256_slice(input: [u8]) -> [u8; 32]
171
170
  public async execute(context: AvmContext): Promise<void> {
171
+ const STATE_SIZE = 8;
172
+ const INPUTS_SIZE = 16;
173
+
172
174
  const memory = context.machineState.memory.track(this.type);
173
- const [dstOffset, messageOffset, messageSizeOffset] = Addressing.fromWire(this.indirect).resolve(
174
- [this.dstOffset, this.messageOffset, this.messageSizeOffset],
175
- memory,
176
- );
177
- memory.checkTag(TypeTag.UINT32, messageSizeOffset);
178
- const messageSize = memory.get(messageSizeOffset).toNumber();
179
- const memoryOperations = { reads: messageSize + 1, writes: 32, indirect: this.indirect };
180
- context.machineState.consumeGas(this.gasCost(memoryOperations));
181
- memory.checkTagsRange(TypeTag.UINT8, messageOffset, messageSize);
175
+ const operands = [this.outputOffset, this.stateOffset, this.inputsOffset];
176
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
177
+ const [outputOffset, stateOffset, inputsOffset] = addressing.resolve(operands, memory);
182
178
 
183
- const messageData = Buffer.concat(memory.getSlice(messageOffset, messageSize).map(word => word.toBuffer()));
184
- const hashBuffer = sha256(messageData);
179
+ // Note: size of output is same as size of state
180
+ context.machineState.consumeGas(this.gasCost());
181
+ memory.checkTagsRange(TypeTag.UINT32, inputsOffset, INPUTS_SIZE);
182
+ memory.checkTagsRange(TypeTag.UINT32, stateOffset, STATE_SIZE);
185
183
 
186
- // We need to convert the hashBuffer because map doesn't work as expected on an Uint8Array (Buffer).
187
- const res = [...hashBuffer].map(byte => new Uint8(byte));
188
- memory.setSlice(dstOffset, res);
184
+ const state = Uint32Array.from(memory.getSlice(stateOffset, STATE_SIZE).map(word => word.toNumber()));
185
+ const inputs = Uint32Array.from(memory.getSlice(inputsOffset, INPUTS_SIZE).map(word => word.toNumber()));
186
+ const output = sha256Compression(state, inputs);
189
187
 
190
- memory.assert(memoryOperations);
188
+ // Conversion required from Uint32Array to Uint32[] (can't map directly, need `...`)
189
+ const res = [...output].map(word => new Uint32(word));
190
+ memory.setSlice(outputOffset, res);
191
+
192
+ memory.assert({ reads: STATE_SIZE + INPUTS_SIZE, writes: STATE_SIZE, addressing });
191
193
  context.machineState.incrementPc();
192
194
  }
193
195
  }
@@ -218,10 +220,9 @@ export class Pedersen extends Instruction {
218
220
 
219
221
  public async execute(context: AvmContext): Promise<void> {
220
222
  const memory = context.machineState.memory.track(this.type);
221
- const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset] = Addressing.fromWire(this.indirect).resolve(
222
- [this.genIndexOffset, this.dstOffset, this.messageOffset, this.messageSizeOffset],
223
- memory,
224
- );
223
+ const operands = [this.genIndexOffset, this.dstOffset, this.messageOffset, this.messageSizeOffset];
224
+ const addressing = Addressing.fromWire(this.indirect, operands.length);
225
+ const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory);
225
226
 
226
227
  // We hash a set of field elements
227
228
  const genIndex = Number(memory.get(genIndexOffset).toBigInt());
@@ -230,8 +231,7 @@ export class Pedersen extends Instruction {
230
231
  memory.checkTag(TypeTag.UINT32, messageSizeOffset);
231
232
  const hashData = memory.getSlice(messageOffset, messageSize);
232
233
 
233
- const memoryOperations = { reads: messageSize + 2, writes: 1, indirect: this.indirect };
234
- context.machineState.consumeGas(this.gasCost(memoryOperations));
234
+ context.machineState.consumeGas(this.gasCost(messageSize));
235
235
 
236
236
  memory.checkTagsRange(TypeTag.FIELD, messageOffset, messageSize);
237
237
 
@@ -239,7 +239,7 @@ export class Pedersen extends Instruction {
239
239
  const hash = pedersenHash(hashData, genIndex);
240
240
  memory.set(dstOffset, new Field(hash));
241
241
 
242
- memory.assert(memoryOperations);
242
+ memory.assert({ reads: messageSize + 2, writes: 1, addressing });
243
243
  context.machineState.incrementPc();
244
244
  }
245
245
  }
@@ -11,3 +11,6 @@ export * from './storage.js';
11
11
  export * from './external_calls.js';
12
12
  export * from './environment_getters.js';
13
13
  export * from './accrued_substate.js';
14
+ export * from './hashing.js';
15
+ export * from './ec_add.js';
16
+ export * from './commitment.js';
@@ -1,8 +1,7 @@
1
1
  import { strict as assert } from 'assert';
2
2
 
3
3
  import type { AvmContext } from '../avm_context.js';
4
- import { getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
5
- import { type MemoryOperations } from '../avm_memory_types.js';
4
+ import { type Gas, getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
6
5
  import { type BufferCursor } from '../serialization/buffer_cursor.js';
7
6
  import { type Serializable } from '../serialization/bytecode_serialization.js';
8
7
  import { Opcode, type OperandType, deserialize, serializeAs } from '../serialization/instruction_serialization.js';
@@ -86,17 +85,11 @@ export abstract class Instruction {
86
85
 
87
86
  /**
88
87
  * Computes gas cost for the instruction based on its base cost and memory operations.
89
- * @param memoryOps Memory operations performed by the instruction.
90
88
  * @returns Gas cost.
91
89
  */
92
- protected gasCost(ops: Partial<MemoryOperations & { indirect: number; dynMultiplier: number }> = {}) {
90
+ protected gasCost(dynMultiplier: number = 0): Gas {
93
91
  const baseGasCost = getBaseGasCost(this.opcode);
94
- // TODO: We are using a simplified gas model to reduce complexity in the circuit.
95
- // Memory accounting will probably be removed.
96
- // TODO(https://github.com/AztecProtocol/aztec-packages/issues/6861): reconsider.
97
- // const memoryGasCost = getMemoryGasCost(memoryOps);
98
- // const memoryGasCost = { l2Gas: 0, daGas: 0 };
99
- const dynGasCost = mulGas(getDynamicGasCost(this.opcode), ops.dynMultiplier ?? 0);
92
+ const dynGasCost = mulGas(getDynamicGasCost(this.opcode), dynMultiplier);
100
93
  return sumGas(baseGasCost, dynGasCost);
101
94
  }
102
95