@aztec/simulator 0.33.0 → 0.35.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 (186) hide show
  1. package/dest/acvm/acvm.d.ts +4 -1
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +5 -5
  4. package/dest/acvm/deserialize.d.ts +3 -5
  5. package/dest/acvm/deserialize.d.ts.map +1 -1
  6. package/dest/acvm/deserialize.js +6 -9
  7. package/dest/acvm/oracle/oracle.d.ts +3 -1
  8. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/oracle.js +14 -6
  10. package/dest/acvm/oracle/typed_oracle.d.ts +2 -0
  11. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  12. package/dest/acvm/oracle/typed_oracle.js +7 -1
  13. package/dest/avm/avm_execution_environment.d.ts +6 -3
  14. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  15. package/dest/avm/avm_execution_environment.js +12 -9
  16. package/dest/avm/avm_gas.js +2 -2
  17. package/dest/avm/avm_machine_state.d.ts +2 -0
  18. package/dest/avm/avm_machine_state.d.ts.map +1 -1
  19. package/dest/avm/avm_machine_state.js +24 -6
  20. package/dest/avm/avm_memory_types.js +6 -6
  21. package/dest/avm/avm_simulator.js +7 -7
  22. package/dest/avm/fixtures/index.d.ts +3 -0
  23. package/dest/avm/fixtures/index.d.ts.map +1 -1
  24. package/dest/avm/fixtures/index.js +11 -4
  25. package/dest/avm/journal/journal.d.ts +15 -13
  26. package/dest/avm/journal/journal.d.ts.map +1 -1
  27. package/dest/avm/journal/journal.js +16 -5
  28. package/dest/avm/journal/trace.d.ts +8 -19
  29. package/dest/avm/journal/trace.d.ts.map +1 -1
  30. package/dest/avm/journal/trace.js +48 -116
  31. package/dest/avm/journal/trace_types.d.ts +23 -4
  32. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  33. package/dest/avm/opcodes/accrued_substate.d.ts +2 -1
  34. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  35. package/dest/avm/opcodes/accrued_substate.js +14 -6
  36. package/dest/avm/opcodes/context_getters.js +2 -2
  37. package/dest/avm/opcodes/external_calls.d.ts +2 -2
  38. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  39. package/dest/avm/opcodes/external_calls.js +26 -10
  40. package/dest/avm/opcodes/hashing.d.ts +8 -8
  41. package/dest/avm/opcodes/hashing.d.ts.map +1 -1
  42. package/dest/avm/opcodes/hashing.js +35 -43
  43. package/dest/avm/serialization/instruction_serialization.d.ts +1 -1
  44. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  45. package/dest/avm/serialization/instruction_serialization.js +2 -2
  46. package/dest/client/client_execution_context.d.ts +14 -4
  47. package/dest/client/client_execution_context.d.ts.map +1 -1
  48. package/dest/client/client_execution_context.js +28 -13
  49. package/dest/client/private_execution.d.ts +1 -1
  50. package/dest/client/private_execution.d.ts.map +1 -1
  51. package/dest/client/private_execution.js +10 -8
  52. package/dest/client/simulator.d.ts.map +1 -1
  53. package/dest/client/simulator.js +6 -5
  54. package/dest/client/unconstrained_execution.d.ts +1 -1
  55. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  56. package/dest/client/unconstrained_execution.js +6 -5
  57. package/dest/client/view_data_oracle.d.ts +2 -2
  58. package/dest/client/view_data_oracle.d.ts.map +1 -1
  59. package/dest/client/view_data_oracle.js +2 -2
  60. package/dest/common/index.d.ts +1 -1
  61. package/dest/common/index.d.ts.map +1 -1
  62. package/dest/common/index.js +2 -2
  63. package/dest/common/packed_values_cache.d.ts +28 -0
  64. package/dest/common/packed_values_cache.d.ts.map +1 -0
  65. package/dest/common/packed_values_cache.js +50 -0
  66. package/dest/index.d.ts +1 -0
  67. package/dest/index.d.ts.map +1 -1
  68. package/dest/index.js +2 -1
  69. package/dest/mocks/fixtures.d.ts +42 -0
  70. package/dest/mocks/fixtures.d.ts.map +1 -0
  71. package/dest/mocks/fixtures.js +84 -0
  72. package/dest/mocks/index.d.ts +2 -0
  73. package/dest/mocks/index.d.ts.map +1 -0
  74. package/dest/mocks/index.js +2 -0
  75. package/dest/public/abstract_phase_manager.d.ts +82 -0
  76. package/dest/public/abstract_phase_manager.d.ts.map +1 -0
  77. package/dest/public/abstract_phase_manager.js +320 -0
  78. package/dest/public/app_logic_phase_manager.d.ts +29 -0
  79. package/dest/public/app_logic_phase_manager.d.ts.map +1 -0
  80. package/dest/public/app_logic_phase_manager.js +50 -0
  81. package/dest/public/execution.d.ts +3 -0
  82. package/dest/public/execution.d.ts.map +1 -1
  83. package/dest/public/execution.js +1 -1
  84. package/dest/public/executor.d.ts +1 -15
  85. package/dest/public/executor.d.ts.map +1 -1
  86. package/dest/public/executor.js +80 -83
  87. package/dest/public/hints_builder.d.ts +23 -0
  88. package/dest/public/hints_builder.d.ts.map +1 -0
  89. package/dest/public/hints_builder.js +62 -0
  90. package/dest/public/index.d.ts +5 -0
  91. package/dest/public/index.d.ts.map +1 -1
  92. package/dest/public/index.js +6 -1
  93. package/dest/public/phase_manager_factory.d.ts +18 -0
  94. package/dest/public/phase_manager_factory.d.ts.map +1 -0
  95. package/dest/public/phase_manager_factory.js +56 -0
  96. package/dest/public/public_execution_context.d.ts +20 -10
  97. package/dest/public/public_execution_context.d.ts.map +1 -1
  98. package/dest/public/public_execution_context.js +35 -23
  99. package/dest/public/public_executor.d.ts +79 -0
  100. package/dest/public/public_executor.d.ts.map +1 -0
  101. package/dest/public/public_executor.js +198 -0
  102. package/dest/public/public_kernel.d.ts +37 -0
  103. package/dest/public/public_kernel.d.ts.map +1 -0
  104. package/dest/public/public_kernel.js +97 -0
  105. package/dest/public/public_kernel_circuit_simulator.d.ts +31 -0
  106. package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -0
  107. package/dest/public/public_kernel_circuit_simulator.js +2 -0
  108. package/dest/public/public_processor.d.ts +53 -0
  109. package/dest/public/public_processor.d.ts.map +1 -0
  110. package/dest/public/public_processor.js +144 -0
  111. package/dest/public/setup_phase_manager.d.ts +30 -0
  112. package/dest/public/setup_phase_manager.d.ts.map +1 -0
  113. package/dest/public/setup_phase_manager.js +46 -0
  114. package/dest/public/tail_phase_manager.d.ts +30 -0
  115. package/dest/public/tail_phase_manager.d.ts.map +1 -0
  116. package/dest/public/tail_phase_manager.js +60 -0
  117. package/dest/public/teardown_phase_manager.d.ts +30 -0
  118. package/dest/public/teardown_phase_manager.d.ts.map +1 -0
  119. package/dest/public/teardown_phase_manager.js +46 -0
  120. package/dest/public/transitional_adaptors.d.ts +33 -0
  121. package/dest/public/transitional_adaptors.d.ts.map +1 -0
  122. package/dest/public/transitional_adaptors.js +162 -0
  123. package/dest/public/utils.d.ts +8 -0
  124. package/dest/public/utils.d.ts.map +1 -0
  125. package/dest/public/utils.js +29 -0
  126. package/dest/simulator/acvm_native.d.ts +19 -3
  127. package/dest/simulator/acvm_native.d.ts.map +1 -1
  128. package/dest/simulator/acvm_native.js +75 -48
  129. package/dest/simulator/acvm_wasm.d.ts.map +1 -1
  130. package/dest/simulator/acvm_wasm.js +3 -4
  131. package/package.json +8 -5
  132. package/src/acvm/acvm.ts +8 -5
  133. package/src/acvm/deserialize.ts +5 -9
  134. package/src/acvm/oracle/oracle.ts +15 -5
  135. package/src/acvm/oracle/typed_oracle.ts +8 -0
  136. package/src/avm/avm_execution_environment.ts +17 -17
  137. package/src/avm/avm_gas.ts +1 -1
  138. package/src/avm/avm_machine_state.ts +26 -5
  139. package/src/avm/avm_memory_types.ts +5 -5
  140. package/src/avm/avm_simulator.ts +6 -6
  141. package/src/avm/fixtures/index.ts +14 -1
  142. package/src/avm/journal/journal.ts +37 -17
  143. package/src/avm/journal/trace.ts +59 -121
  144. package/src/avm/journal/trace_types.ts +39 -39
  145. package/src/avm/opcodes/accrued_substate.ts +17 -5
  146. package/src/avm/opcodes/context_getters.ts +1 -1
  147. package/src/avm/opcodes/external_calls.ts +32 -9
  148. package/src/avm/opcodes/hashing.ts +38 -54
  149. package/src/avm/serialization/instruction_serialization.ts +1 -1
  150. package/src/client/client_execution_context.ts +30 -11
  151. package/src/client/private_execution.ts +9 -8
  152. package/src/client/simulator.ts +7 -3
  153. package/src/client/unconstrained_execution.ts +5 -4
  154. package/src/client/view_data_oracle.ts +1 -1
  155. package/src/common/index.ts +1 -1
  156. package/src/common/packed_values_cache.ts +55 -0
  157. package/src/index.ts +1 -0
  158. package/src/mocks/fixtures.ts +169 -0
  159. package/src/mocks/index.ts +1 -0
  160. package/src/public/abstract_phase_manager.ts +571 -0
  161. package/src/public/app_logic_phase_manager.ts +76 -0
  162. package/src/public/execution.ts +4 -0
  163. package/src/public/executor.ts +93 -93
  164. package/src/public/hints_builder.ts +119 -0
  165. package/src/public/index.ts +5 -0
  166. package/src/public/phase_manager_factory.ts +126 -0
  167. package/src/public/public_execution_context.ts +43 -37
  168. package/src/public/public_executor.ts +267 -0
  169. package/src/public/public_kernel.ts +139 -0
  170. package/src/public/public_kernel_circuit_simulator.ts +36 -0
  171. package/src/public/public_processor.ts +212 -0
  172. package/src/public/setup_phase_manager.ts +66 -0
  173. package/src/public/tail_phase_manager.ts +120 -0
  174. package/src/public/teardown_phase_manager.ts +66 -0
  175. package/src/public/transitional_adaptors.ts +249 -0
  176. package/src/public/utils.ts +31 -0
  177. package/src/simulator/acvm_native.ts +94 -47
  178. package/src/simulator/acvm_wasm.ts +7 -3
  179. package/dest/avm/temporary_executor_migration.d.ts +0 -27
  180. package/dest/avm/temporary_executor_migration.d.ts.map +0 -1
  181. package/dest/avm/temporary_executor_migration.js +0 -94
  182. package/dest/common/packed_args_cache.d.ts +0 -28
  183. package/dest/common/packed_args_cache.d.ts.map +0 -1
  184. package/dest/common/packed_args_cache.js +0 -50
  185. package/src/avm/temporary_executor_migration.ts +0 -136
  186. package/src/common/packed_args_cache.ts +0 -55
@@ -89,6 +89,14 @@ export abstract class TypedOracle {
89
89
  throw new OracleMethodNotAvailableError('packArguments');
90
90
  }
91
91
 
92
+ packReturns(_returns: Fr[]): Promise<Fr> {
93
+ throw new OracleMethodNotAvailableError('packReturns');
94
+ }
95
+
96
+ unpackReturns(_returnsHash: Fr): Promise<Fr[]> {
97
+ throw new OracleMethodNotAvailableError('unpackReturns');
98
+ }
99
+
92
100
  getNullifierKeyPair(_accountAddress: AztecAddress): Promise<KeyPair> {
93
101
  throw new OracleMethodNotAvailableError('getNullifierKeyPair');
94
102
  }
@@ -1,4 +1,4 @@
1
- import { FunctionSelector, type GlobalVariables } from '@aztec/circuits.js';
1
+ import { FunctionSelector, type GasSettings, type GlobalVariables, type Header } from '@aztec/circuits.js';
2
2
  import { computeVarArgsHash } from '@aztec/circuits.js/hash';
3
3
  import { type AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { type EthAddress } from '@aztec/foundation/eth-address';
@@ -22,30 +22,21 @@ export class AvmContextInputs {
22
22
  export class AvmExecutionEnvironment {
23
23
  constructor(
24
24
  public readonly address: AztecAddress,
25
-
26
25
  public readonly storageAddress: AztecAddress,
27
-
28
26
  public readonly origin: AztecAddress,
29
-
30
27
  public readonly sender: AztecAddress,
31
-
32
28
  public readonly portal: EthAddress,
33
-
34
29
  public readonly feePerL1Gas: Fr,
35
-
36
30
  public readonly feePerL2Gas: Fr,
37
-
38
31
  public readonly feePerDaGas: Fr,
39
-
40
32
  public readonly contractCallDepth: Fr,
41
-
33
+ public readonly header: Header,
42
34
  public readonly globals: GlobalVariables,
43
-
44
35
  public readonly isStaticCall: boolean,
45
-
46
36
  public readonly isDelegateCall: boolean,
47
-
48
37
  public readonly calldata: Fr[],
38
+ public readonly gasSettings: GasSettings,
39
+ public readonly transactionFee: Fr,
49
40
 
50
41
  // Function selector is temporary since eventually public contract bytecode will be one blob
51
42
  // containing all functions, and function selector will become an application-level mechanism
@@ -59,24 +50,27 @@ export class AvmExecutionEnvironment {
59
50
  }
60
51
 
61
52
  public deriveEnvironmentForNestedCall(
62
- address: AztecAddress,
53
+ targetAddress: AztecAddress,
63
54
  calldata: Fr[],
64
55
  temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
65
56
  ): AvmExecutionEnvironment {
66
57
  return new AvmExecutionEnvironment(
67
- address,
68
- /*storageAddress=*/ address,
58
+ targetAddress,
59
+ /*storageAddress=*/ targetAddress,
69
60
  this.origin,
70
- this.sender,
61
+ this.address,
71
62
  this.portal,
72
63
  this.feePerL1Gas,
73
64
  this.feePerL2Gas,
74
65
  this.feePerDaGas,
75
66
  this.contractCallDepth,
67
+ this.header,
76
68
  this.globals,
77
69
  this.isStaticCall,
78
70
  this.isDelegateCall,
79
71
  calldata,
72
+ this.gasSettings,
73
+ this.transactionFee,
80
74
  temporaryFunctionSelector,
81
75
  );
82
76
  }
@@ -96,10 +90,13 @@ export class AvmExecutionEnvironment {
96
90
  this.feePerL2Gas,
97
91
  this.feePerDaGas,
98
92
  this.contractCallDepth,
93
+ this.header,
99
94
  this.globals,
100
95
  /*isStaticCall=*/ true,
101
96
  this.isDelegateCall,
102
97
  calldata,
98
+ this.gasSettings,
99
+ this.transactionFee,
103
100
  temporaryFunctionSelector,
104
101
  );
105
102
  }
@@ -119,10 +116,13 @@ export class AvmExecutionEnvironment {
119
116
  this.feePerL2Gas,
120
117
  this.feePerDaGas,
121
118
  this.contractCallDepth,
119
+ this.header,
122
120
  this.globals,
123
121
  this.isStaticCall,
124
122
  /*isDelegateCall=*/ true,
125
123
  calldata,
124
+ this.gasSettings,
125
+ this.transactionFee,
126
126
  temporaryFunctionSelector,
127
127
  );
128
128
  }
@@ -127,7 +127,7 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
127
127
  [Opcode.REVERT]: TemporaryDefaultGasCost,
128
128
  // Gadgets
129
129
  [Opcode.KECCAK]: TemporaryDefaultGasCost,
130
- [Opcode.POSEIDON]: TemporaryDefaultGasCost,
130
+ [Opcode.POSEIDON2]: TemporaryDefaultGasCost,
131
131
  [Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
132
132
  [Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
133
133
  };
@@ -44,10 +44,20 @@ export class AvmMachineState {
44
44
  /** Output data must NOT be modified once it is set */
45
45
  private output: Fr[] = [];
46
46
 
47
- constructor(l1GasLeft: number, l2GasLeft: number, daGasLeft: number) {
48
- this.l1GasLeft = l1GasLeft;
49
- this.l2GasLeft = l2GasLeft;
50
- this.daGasLeft = daGasLeft;
47
+ constructor(gasLeft: Gas);
48
+ constructor(l1GasLeft: number, l2GasLeft: number, daGasLeft: number);
49
+ constructor(gasLeftOrL1GasLeft: Gas | number, l2GasLeft?: number, daGasLeft?: number) {
50
+ if (typeof gasLeftOrL1GasLeft === 'object') {
51
+ ({ l1Gas: this.l1GasLeft, l2Gas: this.l2GasLeft, daGas: this.daGasLeft } = gasLeftOrL1GasLeft);
52
+ } else {
53
+ this.l1GasLeft = gasLeftOrL1GasLeft;
54
+ this.l2GasLeft = l2GasLeft!;
55
+ this.daGasLeft = daGasLeft!;
56
+ }
57
+ }
58
+
59
+ public get gasLeft(): Gas {
60
+ return { l1Gas: this.l1GasLeft, l2Gas: this.l2GasLeft, daGas: this.daGasLeft };
51
61
  }
52
62
 
53
63
  public static fromState(state: InitialAvmMachineState): AvmMachineState {
@@ -128,6 +138,17 @@ export class AvmMachineState {
128
138
  if (!this.halted) {
129
139
  throw new Error('Execution results are not ready! Execution is ongoing.');
130
140
  }
131
- return new AvmContractCallResults(this.reverted, this.output);
141
+ let revertReason = undefined;
142
+ if (this.reverted && this.output.length > 0) {
143
+ try {
144
+ // Try to interpret the output as a text string.
145
+ revertReason = new Error(
146
+ 'Reverted with output: ' + String.fromCharCode(...this.output.map(fr => fr.toNumber())),
147
+ );
148
+ } catch (e) {
149
+ revertReason = new Error('Reverted with non-string output');
150
+ }
151
+ }
152
+ return new AvmContractCallResults(this.reverted, this.output, revertReason);
132
153
  }
133
154
  }
@@ -238,9 +238,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
238
238
  public getAs<T>(offset: number): T {
239
239
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
240
240
  const word = this._mem[offset];
241
- TaggedMemory.log(`get(${offset}) = ${word}`);
241
+ TaggedMemory.log.debug(`get(${offset}) = ${word}`);
242
242
  if (word === undefined) {
243
- TaggedMemory.log.warn(`Memory at offset ${offset} is undefined! This might be OK if it's stack dumping.`);
243
+ TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`);
244
244
  }
245
245
  return word as T;
246
246
  }
@@ -249,7 +249,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
249
249
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
250
250
  assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
251
251
  const value = this._mem.slice(offset, offset + size);
252
- TaggedMemory.log(`getSlice(${offset}, ${size}) = ${value}`);
252
+ TaggedMemory.log.debug(`getSlice(${offset}, ${size}) = ${value}`);
253
253
  assert(!value.some(e => e === undefined), 'Memory slice contains undefined values.');
254
254
  assert(value.length === size, `Expected slice of size ${size}, got ${value.length}.`);
255
255
  return value;
@@ -270,7 +270,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
270
270
  public set(offset: number, v: MemoryValue) {
271
271
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
272
272
  this._mem[offset] = v;
273
- TaggedMemory.log(`set(${offset}, ${v})`);
273
+ TaggedMemory.log.debug(`set(${offset}, ${v})`);
274
274
  }
275
275
 
276
276
  public setSlice(offset: number, vs: MemoryValue[]) {
@@ -281,7 +281,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
281
281
  this._mem.length = offset + vs.length;
282
282
  }
283
283
  this._mem.splice(offset, vs.length, ...vs);
284
- TaggedMemory.log(`setSlice(${offset}, ${vs})`);
284
+ TaggedMemory.log.debug(`setSlice(${offset}, ${vs})`);
285
285
  }
286
286
 
287
287
  public getTag(offset: number): TypeTag {
@@ -62,33 +62,33 @@ export class AvmSimulator {
62
62
  );
63
63
 
64
64
  const gasLeft = `l1=${machineState.l1GasLeft} l2=${machineState.l2GasLeft} da=${machineState.daGasLeft}`;
65
- this.log.debug(`@${machineState.pc} (${gasLeft}) ${instruction.toString()}`);
65
+ this.log.debug(`@${machineState.pc} ${instruction.toString()} (${gasLeft})`);
66
66
  // Execute the instruction.
67
67
  // Normal returns and reverts will return normally here.
68
68
  // "Exceptional halts" will throw.
69
69
  await instruction.execute(this.context);
70
70
 
71
71
  if (machineState.pc >= instructions.length) {
72
- this.log('Passed end of program!');
72
+ this.log.warn('Passed end of program');
73
73
  throw new InvalidProgramCounterError(machineState.pc, /*max=*/ instructions.length);
74
74
  }
75
75
  }
76
76
 
77
77
  // Return results for processing by calling context
78
78
  const results = machineState.getResults();
79
- this.log(`Context execution results: ${results.toString()}`);
79
+ this.log.debug(`Context execution results: ${results.toString()}`);
80
80
  return results;
81
81
  } catch (e) {
82
- this.log('Exceptional halt');
82
+ this.log.verbose('Exceptional halt');
83
83
  if (!(e instanceof AvmExecutionError)) {
84
- this.log(`Unknown error thrown by avm: ${e}`);
84
+ this.log.verbose(`Unknown error thrown by avm: ${e}`);
85
85
  throw e;
86
86
  }
87
87
 
88
88
  // Return results for processing by calling context
89
89
  // Note: "exceptional halts" cannot return data
90
90
  const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], /*revertReason=*/ e);
91
- this.log(`Context execution results: ${results.toString()}`);
91
+ this.log.debug(`Context execution results: ${results.toString()}`);
92
92
  return results;
93
93
  }
94
94
  }
@@ -1,5 +1,5 @@
1
1
  import { SiblingPath } from '@aztec/circuit-types';
2
- import { GlobalVariables, L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/circuits.js';
2
+ import { GasFees, GasSettings, GlobalVariables, Header, L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/circuits.js';
3
3
  import { FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
5
5
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -17,6 +17,7 @@ import {
17
17
  import { AvmContext } from '../avm_context.js';
18
18
  import { AvmContextInputs, AvmExecutionEnvironment } from '../avm_execution_environment.js';
19
19
  import { AvmMachineState } from '../avm_machine_state.js';
20
+ import { Field, Uint8 } from '../avm_memory_types.js';
20
21
  import { HostStorage } from '../journal/host_storage.js';
21
22
  import { AvmPersistableStateManager } from '../journal/journal.js';
22
23
 
@@ -67,10 +68,13 @@ export function initExecutionEnvironment(overrides?: Partial<AvmExecutionEnviron
67
68
  overrides?.feePerL2Gas ?? Fr.zero(),
68
69
  overrides?.feePerDaGas ?? Fr.zero(),
69
70
  overrides?.contractCallDepth ?? Fr.zero(),
71
+ overrides?.header ?? Header.empty(),
70
72
  overrides?.globals ?? GlobalVariables.empty(),
71
73
  overrides?.isStaticCall ?? false,
72
74
  overrides?.isDelegateCall ?? false,
73
75
  overrides?.calldata ?? [],
76
+ overrides?.gasSettings ?? GasSettings.empty(),
77
+ overrides?.transactionFee ?? Fr.ZERO,
74
78
  overrides?.temporaryFunctionSelector ?? FunctionSelector.empty(),
75
79
  );
76
80
  }
@@ -86,6 +90,7 @@ export function initGlobalVariables(overrides?: Partial<GlobalVariables>): Globa
86
90
  overrides?.timestamp ?? Fr.zero(),
87
91
  overrides?.coinbase ?? EthAddress.ZERO,
88
92
  overrides?.feeRecipient ?? AztecAddress.zero(),
93
+ overrides?.gasFees ?? GasFees.empty(),
89
94
  );
90
95
  }
91
96
 
@@ -134,3 +139,11 @@ export function anyAvmContextInputs() {
134
139
  }
135
140
  return tv;
136
141
  }
142
+
143
+ export function randomMemoryBytes(length: number): Uint8[] {
144
+ return [...Array(length)].map(_ => new Uint8(Math.floor(Math.random() * 255)));
145
+ }
146
+
147
+ export function randomMemoryFields(length: number): Field[] {
148
+ return [...Array(length)].map(_ => new Field(Fr.random()));
149
+ }
@@ -2,21 +2,33 @@ import { UnencryptedL2Log } from '@aztec/circuit-types';
2
2
  import { AztecAddress, EthAddress, L2ToL1Message } from '@aztec/circuits.js';
3
3
  import { EventSelector } from '@aztec/foundation/abi';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
+ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
5
6
 
6
7
  import { type HostStorage } from './host_storage.js';
7
8
  import { Nullifiers } from './nullifiers.js';
8
9
  import { PublicStorage } from './public_storage.js';
9
10
  import { WorldStateAccessTrace } from './trace.js';
10
- import { type TracedL1toL2MessageCheck, type TracedNoteHashCheck, type TracedNullifierCheck } from './trace_types.js';
11
+ import {
12
+ type TracedL1toL2MessageCheck,
13
+ type TracedNoteHash,
14
+ type TracedNoteHashCheck,
15
+ type TracedNullifier,
16
+ type TracedNullifierCheck,
17
+ type TracedPublicStorageRead,
18
+ type TracedPublicStorageWrite,
19
+ } from './trace_types.js';
11
20
 
12
21
  /**
13
22
  * Data held within the journal
14
23
  */
15
24
  export type JournalData = {
25
+ storageWrites: TracedPublicStorageWrite[];
26
+ storageReads: TracedPublicStorageRead[];
27
+
16
28
  noteHashChecks: TracedNoteHashCheck[];
17
- newNoteHashes: Fr[];
29
+ newNoteHashes: TracedNoteHash[];
18
30
  nullifierChecks: TracedNullifierCheck[];
19
- newNullifiers: Fr[];
31
+ newNullifiers: TracedNullifier[];
20
32
  l1ToL2MessageChecks: TracedL1toL2MessageCheck[];
21
33
 
22
34
  newL1Messages: L2ToL1Message[];
@@ -24,11 +36,6 @@ export type JournalData = {
24
36
 
25
37
  /** contract address -\> key -\> value */
26
38
  currentStorageValue: Map<bigint, Map<bigint, Fr>>;
27
-
28
- /** contract address -\> key -\> value[] (stored in order of access) */
29
- storageWrites: Map<bigint, Map<bigint, Fr[]>>;
30
- /** contract address -\> key -\> value[] (stored in order of access) */
31
- storageReads: Map<bigint, Map<bigint, Fr[]>>;
32
39
  };
33
40
 
34
41
  /**
@@ -41,21 +48,23 @@ export type JournalData = {
41
48
  * Manages merging of successful/reverted child state into current state.
42
49
  */
43
50
  export class AvmPersistableStateManager {
51
+ private readonly log: DebugLogger = createDebugLogger('aztec:avm_simulator:state_manager');
44
52
  /** Reference to node storage */
45
53
  public readonly hostStorage: HostStorage;
46
54
 
55
+ // TODO: make members private once this is not used in transitional_adaptors.ts.
47
56
  /** World State */
48
57
  /** Public storage, including cached writes */
49
- private publicStorage: PublicStorage;
58
+ public publicStorage: PublicStorage;
50
59
  /** Nullifier set, including cached/recently-emitted nullifiers */
51
- private nullifiers: Nullifiers;
60
+ public nullifiers: Nullifiers;
52
61
 
53
62
  /** World State Access Trace */
54
- private trace: WorldStateAccessTrace;
63
+ public trace: WorldStateAccessTrace;
55
64
 
56
65
  /** Accrued Substate **/
57
- private newL1Messages: L2ToL1Message[] = [];
58
- private newLogs: UnencryptedL2Log[] = [];
66
+ public newL1Messages: L2ToL1Message[] = [];
67
+ public newLogs: UnencryptedL2Log[] = [];
59
68
 
60
69
  constructor(hostStorage: HostStorage, parent?: AvmPersistableStateManager) {
61
70
  this.hostStorage = hostStorage;
@@ -79,6 +88,7 @@ export class AvmPersistableStateManager {
79
88
  * @param value - the value being written to the slot
80
89
  */
81
90
  public writeStorage(storageAddress: Fr, slot: Fr, value: Fr) {
91
+ this.log.debug(`storage(${storageAddress})@${slot} <- ${value}`);
82
92
  // Cache storage writes for later reference/reads
83
93
  this.publicStorage.write(storageAddress, slot, value);
84
94
  // Trace all storage writes (even reverted ones)
@@ -93,9 +103,10 @@ export class AvmPersistableStateManager {
93
103
  * @returns the latest value written to slot, or 0 if never written to before
94
104
  */
95
105
  public async readStorage(storageAddress: Fr, slot: Fr): Promise<Fr> {
96
- const [_exists, value] = await this.publicStorage.read(storageAddress, slot);
106
+ const [exists, value] = await this.publicStorage.read(storageAddress, slot);
107
+ this.log.debug(`storage(${storageAddress})@${slot} ?? value: ${value}, exists: ${exists}.`);
97
108
  // We want to keep track of all performed reads (even reverted ones)
98
- this.trace.tracePublicStorageRead(storageAddress, slot, value);
109
+ this.trace.tracePublicStorageRead(storageAddress, slot, value, exists);
99
110
  return Promise.resolve(value);
100
111
  }
101
112
 
@@ -111,6 +122,7 @@ export class AvmPersistableStateManager {
111
122
  public async checkNoteHashExists(storageAddress: Fr, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
112
123
  const gotLeafIndex = await this.hostStorage.commitmentsDb.getCommitmentIndex(noteHash);
113
124
  const exists = gotLeafIndex === leafIndex.toBigInt();
125
+ this.log.debug(`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex}, exists: ${exists}.`);
114
126
  this.trace.traceNoteHashCheck(storageAddress, noteHash, exists, leafIndex);
115
127
  return Promise.resolve(exists);
116
128
  }
@@ -119,8 +131,9 @@ export class AvmPersistableStateManager {
119
131
  * Write a note hash, trace the write.
120
132
  * @param noteHash - the unsiloed note hash to write
121
133
  */
122
- public writeNoteHash(noteHash: Fr) {
123
- this.trace.traceNewNoteHash(/*storageAddress*/ Fr.ZERO, noteHash);
134
+ public writeNoteHash(storageAddress: Fr, noteHash: Fr) {
135
+ this.log.debug(`noteHashes(${storageAddress}) += @${noteHash}.`);
136
+ this.trace.traceNewNoteHash(storageAddress, noteHash);
124
137
  }
125
138
 
126
139
  /**
@@ -131,6 +144,9 @@ export class AvmPersistableStateManager {
131
144
  */
132
145
  public async checkNullifierExists(storageAddress: Fr, nullifier: Fr): Promise<boolean> {
133
146
  const [exists, isPending, leafIndex] = await this.nullifiers.checkExists(storageAddress, nullifier);
147
+ this.log.debug(
148
+ `nullifiers(${storageAddress})@${nullifier} ?? leafIndex: ${leafIndex}, pending: ${isPending}, exists: ${exists}.`,
149
+ );
134
150
  this.trace.traceNullifierCheck(storageAddress, nullifier, exists, isPending, leafIndex);
135
151
  return Promise.resolve(exists);
136
152
  }
@@ -141,6 +157,7 @@ export class AvmPersistableStateManager {
141
157
  * @param nullifier - the unsiloed nullifier to write
142
158
  */
143
159
  public async writeNullifier(storageAddress: Fr, nullifier: Fr) {
160
+ this.log.debug(`nullifiers(${storageAddress}) += ${nullifier}.`);
144
161
  // Cache pending nullifiers for later access
145
162
  await this.nullifiers.append(storageAddress, nullifier);
146
163
  // Trace all nullifier creations (even reverted ones)
@@ -171,6 +188,7 @@ export class AvmPersistableStateManager {
171
188
  // error getting message - doesn't exist!
172
189
  exists = false;
173
190
  }
191
+ this.log.debug(`l1ToL2Messages(${msgHash})@${msgLeafIndex} ?? exists: ${exists}.`);
174
192
  this.trace.traceL1ToL2MessageCheck(msgHash, msgLeafIndex, exists);
175
193
  return Promise.resolve(exists);
176
194
  }
@@ -181,11 +199,13 @@ export class AvmPersistableStateManager {
181
199
  * @param content - Message content.
182
200
  */
183
201
  public writeL1Message(recipient: EthAddress | Fr, content: Fr) {
202
+ this.log.debug(`L1Messages(${recipient}) += ${content}.`);
184
203
  const recipientAddress = recipient instanceof EthAddress ? recipient : EthAddress.fromField(recipient);
185
204
  this.newL1Messages.push(new L2ToL1Message(recipientAddress, content));
186
205
  }
187
206
 
188
207
  public writeLog(contractAddress: Fr, event: Fr, log: Fr[]) {
208
+ this.log.debug(`UnencryptedL2Log(${contractAddress}) += event ${event} with ${log.length} fields.`);
189
209
  this.newLogs.push(
190
210
  new UnencryptedL2Log(
191
211
  AztecAddress.fromField(contractAddress),