@aztec/simulator 0.86.0-starknet.1 → 0.87.0-nightly.20250521

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 (153) hide show
  1. package/dest/common/errors.d.ts.map +1 -1
  2. package/dest/private/acvm/acvm.d.ts +0 -2
  3. package/dest/private/acvm/acvm.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.js +1 -1
  5. package/dest/private/acvm/deserialize.d.ts +0 -2
  6. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  7. package/dest/private/acvm/oracle/oracle.d.ts +2 -2
  8. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
  9. package/dest/private/acvm/oracle/oracle.js +30 -33
  10. package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -3
  11. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
  12. package/dest/private/acvm/serialize.d.ts +8 -2
  13. package/dest/private/acvm/serialize.d.ts.map +1 -1
  14. package/dest/private/acvm/serialize.js +26 -0
  15. package/dest/private/index.d.ts +3 -0
  16. package/dest/private/index.d.ts.map +1 -1
  17. package/dest/private/index.js +3 -0
  18. package/dest/private/providers/acvm_native.d.ts +0 -2
  19. package/dest/private/providers/acvm_native.d.ts.map +1 -1
  20. package/dest/private/providers/acvm_native.js +1 -1
  21. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +0 -2
  22. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -1
  23. package/dest/private/providers/simulation_provider.js +2 -2
  24. package/dest/private/simulator.d.ts.map +1 -1
  25. package/dest/private/utility_execution_oracle.d.ts +0 -2
  26. package/dest/private/utility_execution_oracle.d.ts.map +1 -1
  27. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  28. package/dest/public/avm/avm_contract_call_result.js +2 -2
  29. package/dest/public/avm/avm_execution_environment.d.ts +2 -1
  30. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  31. package/dest/public/avm/avm_execution_environment.js +4 -2
  32. package/dest/public/avm/avm_gas.d.ts +0 -15
  33. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  34. package/dest/public/avm/avm_gas.js +0 -18
  35. package/dest/public/avm/avm_memory_types.d.ts +84 -86
  36. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  37. package/dest/public/avm/avm_simulator.d.ts +1 -3
  38. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  39. package/dest/public/avm/avm_simulator.js +3 -3
  40. package/dest/public/avm/avm_simulator_interface.d.ts +0 -2
  41. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -1
  42. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  43. package/dest/public/avm/fixtures/initializers.js +1 -1
  44. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  45. package/dest/public/avm/opcodes/accrued_substate.js +7 -7
  46. package/dest/public/avm/opcodes/addressing_mode.d.ts +7 -6
  47. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  48. package/dest/public/avm/opcodes/addressing_mode.js +18 -15
  49. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  50. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  51. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  52. package/dest/public/avm/opcodes/bitwise.js +2 -2
  53. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  54. package/dest/public/avm/opcodes/comparators.js +1 -1
  55. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  56. package/dest/public/avm/opcodes/contract.js +1 -1
  57. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  58. package/dest/public/avm/opcodes/control_flow.js +1 -1
  59. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  60. package/dest/public/avm/opcodes/conversion.js +1 -1
  61. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/ec_add.js +1 -1
  63. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  64. package/dest/public/avm/opcodes/environment_getters.js +1 -1
  65. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  66. package/dest/public/avm/opcodes/external_calls.js +4 -4
  67. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  68. package/dest/public/avm/opcodes/hashing.js +3 -3
  69. package/dest/public/avm/opcodes/instruction.d.ts +0 -2
  70. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  71. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  72. package/dest/public/avm/opcodes/memory.js +6 -6
  73. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  74. package/dest/public/avm/opcodes/misc.js +18 -11
  75. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  76. package/dest/public/avm/opcodes/storage.js +2 -2
  77. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -2
  78. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  79. package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -2
  80. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  81. package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -2
  82. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  83. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  84. package/dest/public/fixtures/public_tx_simulation_tester.js +1 -1
  85. package/dest/public/fixtures/utils.d.ts.map +1 -1
  86. package/dest/public/fixtures/utils.js +19 -26
  87. package/dest/public/hinting_db_sources.d.ts +0 -2
  88. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  89. package/dest/public/public_processor/public_processor.d.ts +3 -5
  90. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  91. package/dest/public/public_processor/public_processor.js +8 -5
  92. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  93. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
  94. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +3 -3
  95. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  96. package/dest/public/public_tx_simulator/public_tx_context.js +5 -9
  97. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +2 -1
  98. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  99. package/dest/public/public_tx_simulator/public_tx_simulator.js +15 -3
  100. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +1 -1
  101. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
  102. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +2 -2
  103. package/dest/public/side_effect_trace.d.ts.map +1 -1
  104. package/dest/public/side_effect_trace.js +5 -5
  105. package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
  106. package/dest/public/state_manager/public_storage.d.ts.map +1 -1
  107. package/dest/public/state_manager/state_manager.d.ts +6 -2
  108. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  109. package/dest/public/state_manager/state_manager.js +6 -0
  110. package/dest/public/unique_class_ids.d.ts.map +1 -1
  111. package/dest/test/utils.d.ts.map +1 -1
  112. package/package.json +18 -18
  113. package/src/private/acvm/acvm.ts +1 -1
  114. package/src/private/acvm/oracle/oracle.ts +38 -31
  115. package/src/private/acvm/oracle/typed_oracle.ts +1 -1
  116. package/src/private/acvm/serialize.ts +35 -0
  117. package/src/private/index.ts +3 -0
  118. package/src/private/pick_notes.ts +4 -4
  119. package/src/private/providers/acvm_native.ts +6 -2
  120. package/src/private/providers/simulation_provider.ts +2 -2
  121. package/src/private/simulator.ts +4 -1
  122. package/src/public/avm/avm_contract_call_result.ts +2 -2
  123. package/src/public/avm/avm_execution_environment.ts +7 -1
  124. package/src/public/avm/avm_gas.ts +0 -20
  125. package/src/public/avm/avm_simulator.ts +3 -1
  126. package/src/public/avm/fixtures/initializers.ts +1 -0
  127. package/src/public/avm/opcodes/accrued_substate.ts +31 -11
  128. package/src/public/avm/opcodes/addressing_mode.ts +23 -20
  129. package/src/public/avm/opcodes/arithmetic.ts +2 -1
  130. package/src/public/avm/opcodes/bitwise.ts +9 -3
  131. package/src/public/avm/opcodes/comparators.ts +2 -1
  132. package/src/public/avm/opcodes/contract.ts +2 -1
  133. package/src/public/avm/opcodes/control_flow.ts +7 -2
  134. package/src/public/avm/opcodes/conversion.ts +2 -1
  135. package/src/public/avm/opcodes/ec_add.ts +2 -1
  136. package/src/public/avm/opcodes/environment_getters.ts +7 -2
  137. package/src/public/avm/opcodes/external_calls.ts +19 -7
  138. package/src/public/avm/opcodes/hashing.ts +17 -5
  139. package/src/public/avm/opcodes/memory.ts +27 -9
  140. package/src/public/avm/opcodes/misc.ts +23 -15
  141. package/src/public/avm/opcodes/storage.ts +9 -3
  142. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  143. package/src/public/fixtures/public_tx_simulation_tester.ts +1 -0
  144. package/src/public/fixtures/utils.ts +21 -28
  145. package/src/public/hinting_db_sources.ts +8 -2
  146. package/src/public/public_processor/public_processor.ts +9 -3
  147. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +3 -2
  148. package/src/public/public_tx_simulator/public_tx_context.ts +4 -23
  149. package/src/public/public_tx_simulator/public_tx_simulator.ts +14 -1
  150. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +10 -1
  151. package/src/public/side_effect_trace.ts +5 -7
  152. package/src/public/state_manager/state_manager.ts +13 -0
  153. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
@@ -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
 
@@ -34,6 +34,8 @@ export class GetContractInstance extends Instruction {
34
34
 
35
35
  async execute(context: AvmContext): Promise<void> {
36
36
  const memory = context.machineState.memory;
37
+ const addressing = Addressing.fromWire(this.indirect);
38
+
37
39
  context.machineState.consumeGas(this.gasCost());
38
40
 
39
41
  if (!(this.memberEnum in ContractInstanceMember)) {
@@ -41,7 +43,6 @@ export class GetContractInstance extends Instruction {
41
43
  }
42
44
 
43
45
  const operands = [this.addressOffset, this.dstOffset];
44
- const addressing = Addressing.fromWire(this.indirect, operands.length);
45
46
  const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
46
47
  memory.checkTag(TypeTag.FIELD, addressOffset);
47
48
 
@@ -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));
@@ -30,8 +30,9 @@ abstract class ExternalCall extends Instruction {
30
30
 
31
31
  public async execute(context: AvmContext) {
32
32
  const memory = context.machineState.memory;
33
+ const addressing = Addressing.fromWire(this.indirect);
34
+
33
35
  const operands = [this.l2GasOffset, this.daGasOffset, this.addrOffset, this.argsSizeOffset, this.argsOffset];
34
- const addressing = Addressing.fromWire(this.indirect, operands.length);
35
36
  const [l2GasOffset, daGasOffset, addrOffset, argsSizeOffset, argsOffset] = addressing.resolve(operands, memory);
36
37
  // TODO: Should be U32
37
38
  memory.checkTags(TypeTag.FIELD, l2GasOffset);
@@ -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,15 +167,19 @@ export class Return extends Instruction {
163
167
  OperandType.UINT16,
164
168
  ];
165
169
 
166
- constructor(private indirect: number, private returnSizeOffset: number, private returnOffset: 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
182
  const operands = [this.returnSizeOffset, this.returnOffset];
174
- const addressing = Addressing.fromWire(this.indirect, operands.length);
175
183
  const [returnSizeOffset, returnOffset] = addressing.resolve(operands, memory);
176
184
 
177
185
  memory.checkTag(TypeTag.UINT32, returnSizeOffset);
@@ -205,15 +213,19 @@ export class Revert extends Instruction {
205
213
  OperandType.UINT16,
206
214
  ];
207
215
 
208
- constructor(private indirect: number, private retSizeOffset: number, private returnOffset: 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
228
  const operands = [this.retSizeOffset, this.returnOffset];
216
- const addressing = Addressing.fromWire(this.indirect, operands.length);
217
229
  const [retSizeOffset, returnOffset] = addressing.resolve(operands, memory);
218
230
 
219
231
  memory.checkTag(TypeTag.UINT32, retSizeOffset);
@@ -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
@@ -66,10 +66,11 @@ export class Set extends Instruction {
66
66
  const res = TaggedMemory.buildFromTagTruncating(this.value, this.inTag);
67
67
 
68
68
  const memory = context.machineState.memory;
69
+ const addressing = Addressing.fromWire(this.indirect);
70
+
69
71
  context.machineState.consumeGas(this.gasCost());
70
72
 
71
73
  const operands = [this.dstOffset];
72
- const addressing = Addressing.fromWire(this.indirect, operands.length);
73
74
  const [dstOffset] = addressing.resolve(operands, memory);
74
75
  memory.set(dstOffset, res);
75
76
  }
@@ -94,16 +95,22 @@ export class Cast extends Instruction {
94
95
  OperandType.TAG,
95
96
  ];
96
97
 
97
- constructor(private indirect: number, private srcOffset: number, private dstOffset: number, private dstTag: number) {
98
+ constructor(
99
+ private indirect: number,
100
+ private srcOffset: number,
101
+ private dstOffset: number,
102
+ private dstTag: number,
103
+ ) {
98
104
  super();
99
105
  }
100
106
 
101
107
  public async execute(context: AvmContext): Promise<void> {
102
108
  const memory = context.machineState.memory;
109
+ const addressing = Addressing.fromWire(this.indirect);
110
+
103
111
  context.machineState.consumeGas(this.gasCost());
104
112
 
105
113
  const operands = [this.srcOffset, this.dstOffset];
106
- const addressing = Addressing.fromWire(this.indirect, operands.length);
107
114
  const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
108
115
 
109
116
  const a = memory.get(srcOffset);
@@ -132,16 +139,21 @@ export class Mov extends Instruction {
132
139
  OperandType.UINT16,
133
140
  ];
134
141
 
135
- constructor(private indirect: number, private srcOffset: number, private dstOffset: number) {
142
+ constructor(
143
+ private indirect: number,
144
+ private srcOffset: number,
145
+ private dstOffset: number,
146
+ ) {
136
147
  super();
137
148
  }
138
149
 
139
150
  public async execute(context: AvmContext): Promise<void> {
140
151
  const memory = context.machineState.memory;
152
+ const addressing = Addressing.fromWire(this.indirect);
153
+
141
154
  context.machineState.consumeGas(this.gasCost());
142
155
 
143
156
  const operands = [this.srcOffset, this.dstOffset];
144
- const addressing = Addressing.fromWire(this.indirect, operands.length);
145
157
  const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
146
158
  const a = memory.get(srcOffset);
147
159
  memory.set(dstOffset, a);
@@ -171,8 +183,9 @@ export class CalldataCopy extends Instruction {
171
183
 
172
184
  public async execute(context: AvmContext): Promise<void> {
173
185
  const memory = context.machineState.memory;
186
+ const addressing = Addressing.fromWire(this.indirect);
187
+
174
188
  const operands = [this.copySizeOffset, this.cdStartOffset, this.dstOffset];
175
- const addressing = Addressing.fromWire(this.indirect, operands.length);
176
189
  const [copySizeOffset, cdStartOffset, dstOffset] = addressing.resolve(operands, memory);
177
190
 
178
191
  memory.checkTags(TypeTag.UINT32, cdStartOffset, copySizeOffset);
@@ -195,14 +208,18 @@ export class ReturndataSize extends Instruction {
195
208
  // Informs (de)serialization. See Instruction.deserialize.
196
209
  static readonly wireFormat: OperandType[] = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
197
210
 
198
- constructor(private indirect: number, private dstOffset: number) {
211
+ constructor(
212
+ private indirect: number,
213
+ private dstOffset: number,
214
+ ) {
199
215
  super();
200
216
  }
201
217
 
202
218
  public async execute(context: AvmContext): Promise<void> {
203
219
  const memory = context.machineState.memory;
220
+ const addressing = Addressing.fromWire(this.indirect);
221
+
204
222
  const operands = [this.dstOffset];
205
- const addressing = Addressing.fromWire(this.indirect, operands.length);
206
223
  const [dstOffset] = addressing.resolve(operands, memory);
207
224
  context.machineState.consumeGas(this.gasCost());
208
225
 
@@ -233,8 +250,9 @@ export class ReturndataCopy extends Instruction {
233
250
 
234
251
  public async execute(context: AvmContext): Promise<void> {
235
252
  const memory = context.machineState.memory;
253
+ const addressing = Addressing.fromWire(this.indirect);
254
+
236
255
  const operands = [this.copySizeOffset, this.rdStartOffset, this.dstOffset];
237
- const addressing = Addressing.fromWire(this.indirect, operands.length);
238
256
  const [copySizeOffset, rdStartOffset, dstOffset] = addressing.resolve(operands, memory);
239
257
 
240
258
  memory.checkTags(TypeTag.UINT32, rdStartOffset, copySizeOffset);
@@ -33,28 +33,36 @@ export class DebugLog 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.messageOffset, this.fieldsOffset, this.fieldsSizeOffset];
37
- const addressing = Addressing.fromWire(this.indirect, operands.length);
38
39
  const [messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory);
39
-
40
40
  memory.checkTag(TypeTag.UINT32, fieldsSizeOffset);
41
- const fieldsSize = memory.get(fieldsSizeOffset).toNumber();
42
41
 
43
- const rawMessage = memory.getSlice(messageOffset, this.messageSize);
44
- const fields = memory.getSlice(fieldsOffset, fieldsSize);
42
+ // DebugLog is a no-op except when doing client-initiated simulation with debug logging enabled.
43
+ // Note that we still do address resolution and basic tag-checking (above)
44
+ // To avoid a special-case in the witness generator and circuit.
45
+ if (context.environment.clientInitiatedSimulation && DebugLog.logger.isLevelEnabled('verbose')) {
46
+ const fieldsSize = memory.get(fieldsSizeOffset).toNumber();
47
+
48
+ const rawMessage = memory.getSlice(messageOffset, this.messageSize);
49
+ const fields = memory.getSlice(fieldsOffset, fieldsSize);
45
50
 
46
- memory.checkTagsRange(TypeTag.UINT8, messageOffset, this.messageSize);
47
- memory.checkTagsRange(TypeTag.FIELD, fieldsOffset, fieldsSize);
51
+ memory.checkTagsRange(TypeTag.UINT8, messageOffset, this.messageSize);
52
+ memory.checkTagsRange(TypeTag.FIELD, fieldsOffset, fieldsSize);
48
53
 
49
- context.machineState.consumeGas(this.gasCost(this.messageSize + fieldsSize));
54
+ // Interpret str<N> = [u8; N] to string.
55
+ const messageAsStr = rawMessage.map(field => String.fromCharCode(field.toNumber())).join('');
56
+ const formattedStr = applyStringFormatting(
57
+ messageAsStr,
58
+ fields.map(field => field.toFr()),
59
+ );
50
60
 
51
- // Interpret str<N> = [u8; N] to string.
52
- const messageAsStr = rawMessage.map(field => String.fromCharCode(field.toNumber())).join('');
53
- const formattedStr = applyStringFormatting(
54
- messageAsStr,
55
- fields.map(field => field.toFr()),
56
- );
61
+ DebugLog.logger.verbose(formattedStr);
62
+ }
57
63
 
58
- DebugLog.logger.verbose(formattedStr);
64
+ // Despite having dynamic "size" operands, the gas cost is fixed because
65
+ // this opcode is a no-op except during client-initiated simulation
66
+ context.machineState.consumeGas(this.gasCost());
59
67
  }
60
68
  }
@@ -14,7 +14,11 @@ abstract class BaseStorageInstruction extends Instruction {
14
14
  OperandType.UINT16,
15
15
  ];
16
16
 
17
- constructor(protected indirect: number, protected aOffset: number, protected bOffset: number) {
17
+ constructor(
18
+ protected indirect: number,
19
+ protected aOffset: number,
20
+ protected bOffset: number,
21
+ ) {
18
22
  super();
19
23
  }
20
24
  }
@@ -33,10 +37,11 @@ export class SStore extends BaseStorageInstruction {
33
37
  }
34
38
 
35
39
  const memory = context.machineState.memory;
40
+ const addressing = Addressing.fromWire(this.indirect);
41
+
36
42
  context.machineState.consumeGas(this.gasCost());
37
43
 
38
44
  const operands = [this.aOffset, this.bOffset];
39
- const addressing = Addressing.fromWire(this.indirect, operands.length);
40
45
  const [srcOffset, slotOffset] = addressing.resolve(operands, memory);
41
46
  memory.checkTag(TypeTag.FIELD, slotOffset);
42
47
  memory.checkTag(TypeTag.FIELD, srcOffset);
@@ -57,10 +62,11 @@ export class SLoad extends BaseStorageInstruction {
57
62
 
58
63
  public async execute(context: AvmContext): Promise<void> {
59
64
  const memory = context.machineState.memory;
65
+ const addressing = Addressing.fromWire(this.indirect);
66
+
60
67
  context.machineState.consumeGas(this.gasCost());
61
68
 
62
69
  const operands = [this.aOffset, this.bOffset];
63
- const addressing = Addressing.fromWire(this.indirect, operands.length);
64
70
  const [slotOffset, dstOffset] = addressing.resolve(operands, memory);
65
71
  memory.checkTag(TypeTag.FIELD, slotOffset);
66
72
 
@@ -2,7 +2,10 @@
2
2
  * A Buffer-like class that automatically advances the position.
3
3
  */
4
4
  export class BufferCursor {
5
- constructor(private _buffer: Buffer, private _position: number = 0) {}
5
+ constructor(
6
+ private _buffer: Buffer,
7
+ private _position: number = 0,
8
+ ) {}
6
9
 
7
10
  public position(): number {
8
11
  return this._position;
@@ -54,6 +54,7 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
54
54
  globals,
55
55
  /*doMerkleOperations=*/ true,
56
56
  /*skipFeeEnforcement=*/ false,
57
+ /*clientInitiatedSimulation=*/ true,
57
58
  this.metrics,
58
59
  );
59
60
  }
@@ -1,5 +1,4 @@
1
1
  import {
2
- CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS,
3
2
  DEFAULT_GAS_LIMIT,
4
3
  DEPLOYER_CONTRACT_ADDRESS,
5
4
  MAX_L2_GAS_PER_TX_PUBLIC_PORTION,
@@ -7,8 +6,8 @@ import {
7
6
  REGISTERER_CONTRACT_ADDRESS,
8
7
  REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE,
9
8
  } from '@aztec/constants';
9
+ import { padArrayEnd } from '@aztec/foundation/collection';
10
10
  import { Fr } from '@aztec/foundation/fields';
11
- import { assertLength } from '@aztec/foundation/serialize';
12
11
  import { DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_TAG } from '@aztec/protocol-contracts';
13
12
  import { bufferAsFields } from '@aztec/stdlib/abi';
14
13
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
@@ -16,14 +15,14 @@ import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/st
16
15
  import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas';
17
16
  import { siloNullifier } from '@aztec/stdlib/hash';
18
17
  import {
18
+ LogHash,
19
19
  PartialPrivateTailPublicInputsForPublic,
20
20
  PartialPrivateTailPublicInputsForRollup,
21
21
  PrivateKernelTailCircuitPublicInputs,
22
22
  RollupValidationRequests,
23
- ScopedLogHash,
24
23
  countAccumulatedItems,
25
24
  } from '@aztec/stdlib/kernel';
26
- import { ContractClassLog, PrivateLog } from '@aztec/stdlib/logs';
25
+ import { ContractClassLogFields, PrivateLog } from '@aztec/stdlib/logs';
27
26
  import { ClientIvcProof } from '@aztec/stdlib/proofs';
28
27
  import {
29
28
  BlockHeader,
@@ -58,13 +57,11 @@ export function createTxForPublicCalls(
58
57
  // TODO(#9269): Remove this fake nullifier method as we move away from 1st nullifier as hash.
59
58
  forPublic.nonRevertibleAccumulatedData.nullifiers[0] = firstNullifier;
60
59
 
61
- // We reverse order because the simulator expects it to be like a "stack" of calls to pop from
62
- for (let i = setupCallRequests.length - 1; i >= 0; i--) {
63
- forPublic.nonRevertibleAccumulatedData.publicCallRequests[setupCallRequests.length - i - 1] =
64
- setupCallRequests[i].request;
60
+ for (let i = 0; i < setupCallRequests.length; i++) {
61
+ forPublic.nonRevertibleAccumulatedData.publicCallRequests[i] = setupCallRequests[i].request;
65
62
  }
66
- for (let i = appCallRequests.length - 1; i >= 0; i--) {
67
- forPublic.revertibleAccumulatedData.publicCallRequests[appCallRequests.length - i - 1] = appCallRequests[i].request;
63
+ for (let i = 0; i < appCallRequests.length; i++) {
64
+ forPublic.revertibleAccumulatedData.publicCallRequests[i] = appCallRequests[i].request;
68
65
  }
69
66
  if (teardownCallRequest) {
70
67
  forPublic.publicTeardownCallRequest = teardownCallRequest.request;
@@ -128,18 +125,14 @@ export async function addNewContractClassToTx(
128
125
  new Fr(contractClass.privateFunctionsRoot),
129
126
  ...bufferAsFields(contractClass.packedBytecode, Math.ceil(contractClass.packedBytecode.length / 31) + 1),
130
127
  ];
131
- const contractClassLog = ContractClassLog.fromFields([
132
- new Fr(REGISTERER_CONTRACT_ADDRESS),
133
- ...contractClassLogFields.concat(
134
- new Array(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - contractClassLogFields.length).fill(Fr.ZERO),
135
- ),
136
- ]);
137
- const contractClassLogHash = ScopedLogHash.fromFields([
138
- await contractClassLog.hash(),
139
- new Fr(7),
140
- new Fr(contractClassLog.getEmittedLength()),
141
- new Fr(REGISTERER_CONTRACT_ADDRESS),
142
- ]);
128
+ const contractAddress = new AztecAddress(new Fr(REGISTERER_CONTRACT_ADDRESS));
129
+ const emittedLength = contractClassLogFields.length;
130
+ const log = ContractClassLogFields.fromEmittedFields(contractClassLogFields);
131
+
132
+ const contractClassLogHash = LogHash.from({
133
+ value: await log.hash(),
134
+ length: emittedLength,
135
+ }).scope(contractAddress);
143
136
 
144
137
  const accumulatedData = tx.data.forPublic ? tx.data.forPublic!.revertibleAccumulatedData : tx.data.forRollup!.end;
145
138
  if (!skipNullifierInsertion) {
@@ -150,7 +143,7 @@ export async function addNewContractClassToTx(
150
143
  const nextLogIndex = countAccumulatedItems(accumulatedData.contractClassLogsHashes);
151
144
  accumulatedData.contractClassLogsHashes[nextLogIndex] = contractClassLogHash;
152
145
 
153
- tx.contractClassLogs.push(contractClassLog);
146
+ tx.contractClassLogs.push(log);
154
147
  }
155
148
 
156
149
  export async function addNewContractInstanceToTx(
@@ -170,7 +163,7 @@ export async function addNewContractInstanceToTx(
170
163
  contractInstance.publicKeys.masterTaggingPublicKey.x,
171
164
  contractInstance.publicKeys.masterTaggingPublicKey.y,
172
165
  ];
173
- const fields = [
166
+ const logFields = [
174
167
  DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_TAG,
175
168
  contractInstance.address.toField(),
176
169
  new Fr(contractInstance.version),
@@ -179,11 +172,11 @@ export async function addNewContractInstanceToTx(
179
172
  contractInstance.initializationHash,
180
173
  ...publicKeysAsFields,
181
174
  contractInstance.deployer.toField(),
182
- new Fr(0),
183
- new Fr(0),
184
- new Fr(0),
185
175
  ];
186
- const contractInstanceLog = new PrivateLog(assertLength(fields, PRIVATE_LOG_SIZE_IN_FIELDS));
176
+ const contractInstanceLog = new PrivateLog(
177
+ padArrayEnd(logFields, Fr.ZERO, PRIVATE_LOG_SIZE_IN_FIELDS),
178
+ logFields.length,
179
+ );
187
180
 
188
181
  const contractAddressNullifier = await siloNullifier(
189
182
  AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS),
@@ -47,7 +47,10 @@ import type { PublicContractsDBInterface } from './db_interfaces.js';
47
47
  * A public contracts database that forwards requests and collects AVM hints.
48
48
  */
49
49
  export class HintingPublicContractsDB implements PublicContractsDBInterface {
50
- constructor(private readonly db: PublicContractsDBInterface, private hints: AvmExecutionHints) {}
50
+ constructor(
51
+ private readonly db: PublicContractsDBInterface,
52
+ private hints: AvmExecutionHints,
53
+ ) {}
51
54
 
52
55
  public async getContractInstance(
53
56
  address: AztecAddress,
@@ -129,7 +132,10 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
129
132
  }
130
133
 
131
134
  // Use create() to instantiate.
132
- private constructor(private db: MerkleTreeWriteOperations, private hints: AvmExecutionHints) {}
135
+ private constructor(
136
+ private db: MerkleTreeWriteOperations,
137
+ private hints: AvmExecutionHints,
138
+ ) {}
133
139
 
134
140
  // Getters.
135
141
  public async getSiblingPath<N extends number>(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<N>> {