@aztec/simulator 0.0.1-commit.96bb3f7 → 0.0.1-commit.9d2bcf6d

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 (209) hide show
  1. package/README.md +2 -0
  2. package/dest/common/errors.d.ts +7 -1
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.d.ts +4 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +4 -3
  7. package/dest/private/acvm_native.d.ts +5 -3
  8. package/dest/private/acvm_native.d.ts.map +1 -1
  9. package/dest/private/acvm_native.js +8 -6
  10. package/dest/private/acvm_wasm.d.ts +4 -3
  11. package/dest/private/acvm_wasm.d.ts.map +1 -1
  12. package/dest/private/acvm_wasm.js +4 -4
  13. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  14. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/circuit_recorder.js +5 -3
  16. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  17. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  19. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  20. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  21. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  22. package/dest/private/factory.d.ts +3 -3
  23. package/dest/private/factory.d.ts.map +1 -1
  24. package/dest/private/factory.js +7 -4
  25. package/dest/public/avm/avm_context.d.ts +3 -3
  26. package/dest/public/avm/avm_context.d.ts.map +1 -1
  27. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  28. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  29. package/dest/public/avm/avm_contract_call_result.js +3 -3
  30. package/dest/public/avm/avm_execution_environment.d.ts +6 -5
  31. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  32. package/dest/public/avm/avm_machine_state.d.ts +6 -5
  33. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  34. package/dest/public/avm/avm_machine_state.js +3 -2
  35. package/dest/public/avm/avm_memory_types.d.ts +1 -1
  36. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  37. package/dest/public/avm/avm_memory_types.js +3 -0
  38. package/dest/public/avm/avm_simulator.d.ts +3 -2
  39. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  40. package/dest/public/avm/avm_simulator.js +5 -4
  41. package/dest/public/avm/calldata.d.ts +51 -0
  42. package/dest/public/avm/calldata.d.ts.map +1 -0
  43. package/dest/public/avm/calldata.js +63 -0
  44. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  45. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  46. package/dest/public/avm/fixtures/avm_simulation_tester.js +3 -2
  47. package/dest/public/avm/fixtures/initializers.d.ts +1 -1
  48. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  49. package/dest/public/avm/fixtures/initializers.js +2 -1
  50. package/dest/public/avm/opcodes/accrued_substate.d.ts +16 -17
  51. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  52. package/dest/public/avm/opcodes/accrued_substate.js +38 -38
  53. package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
  54. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  55. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  56. package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
  57. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  58. package/dest/public/avm/opcodes/bitwise.js +5 -5
  59. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  60. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  61. package/dest/public/avm/opcodes/comparators.js +1 -1
  62. package/dest/public/avm/opcodes/contract.d.ts +3 -3
  63. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  64. package/dest/public/avm/opcodes/contract.js +8 -8
  65. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  66. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  67. package/dest/public/avm/opcodes/control_flow.js +4 -4
  68. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  69. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  70. package/dest/public/avm/opcodes/conversion.js +4 -4
  71. package/dest/public/avm/opcodes/ec_add.d.ts +4 -4
  72. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  73. package/dest/public/avm/opcodes/ec_add.js +15 -6
  74. package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
  75. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  76. package/dest/public/avm/opcodes/environment_getters.js +4 -4
  77. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  78. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  79. package/dest/public/avm/opcodes/external_calls.js +23 -23
  80. package/dest/public/avm/opcodes/hashing.d.ts +8 -8
  81. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  82. package/dest/public/avm/opcodes/hashing.js +12 -12
  83. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  84. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  85. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  86. package/dest/public/avm/opcodes/memory.d.ts +14 -14
  87. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  88. package/dest/public/avm/opcodes/memory.js +25 -25
  89. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  90. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  91. package/dest/public/avm/opcodes/misc.js +4 -4
  92. package/dest/public/avm/opcodes/storage.d.ts +16 -15
  93. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  94. package/dest/public/avm/opcodes/storage.js +34 -24
  95. package/dest/public/debug_fn_name.d.ts +4 -4
  96. package/dest/public/debug_fn_name.d.ts.map +1 -1
  97. package/dest/public/debug_fn_name.js +7 -5
  98. package/dest/public/executor_metrics.d.ts +1 -1
  99. package/dest/public/executor_metrics.d.ts.map +1 -1
  100. package/dest/public/executor_metrics.js +7 -2
  101. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  102. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  103. package/dest/public/fixtures/custom_bytecode_tests.d.ts +11 -11
  104. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  105. package/dest/public/fixtures/custom_bytecode_tests.js +18 -18
  106. package/dest/public/fixtures/minimal_public_tx.js +2 -2
  107. package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
  108. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  109. package/dest/public/fixtures/opcode_spammer.js +95 -123
  110. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
  111. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  112. package/dest/public/fuzzing/avm_fuzzer_simulator.js +42 -10
  113. package/dest/public/fuzzing/avm_simulator_bin.js +15 -8
  114. package/dest/public/public_db_sources.d.ts +4 -3
  115. package/dest/public/public_db_sources.d.ts.map +1 -1
  116. package/dest/public/public_db_sources.js +4 -4
  117. package/dest/public/public_processor/public_processor.d.ts +6 -4
  118. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  119. package/dest/public/public_processor/public_processor.js +11 -6
  120. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  121. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  122. package/dest/public/public_processor/public_processor_metrics.js +20 -4
  123. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  124. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  125. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +2 -2
  126. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
  127. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  128. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +10 -9
  129. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  130. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  131. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +5 -5
  132. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  133. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  134. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
  135. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  136. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  137. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  138. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  139. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  140. package/dest/public/public_tx_simulator/factories.js +3 -3
  141. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  142. package/dest/public/public_tx_simulator/public_tx_context.d.ts +4 -3
  143. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  144. package/dest/public/public_tx_simulator/public_tx_context.js +8 -8
  145. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +6 -4
  146. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  147. package/dest/public/public_tx_simulator/public_tx_simulator.js +12 -7
  148. package/dest/public/side_effect_trace.d.ts +5 -4
  149. package/dest/public/side_effect_trace.d.ts.map +1 -1
  150. package/dest/public/side_effect_trace.js +3 -3
  151. package/dest/public/state_manager/state_manager.d.ts +10 -4
  152. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  153. package/dest/public/state_manager/state_manager.js +14 -7
  154. package/dest/public/test_executor_metrics.d.ts +3 -2
  155. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  156. package/dest/public/test_executor_metrics.js +2 -2
  157. package/package.json +17 -17
  158. package/src/private/acvm/acvm.ts +4 -3
  159. package/src/private/acvm_native.ts +11 -5
  160. package/src/private/acvm_wasm.ts +7 -3
  161. package/src/private/circuit_recording/circuit_recorder.ts +5 -3
  162. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  163. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  164. package/src/private/factory.ts +7 -4
  165. package/src/public/avm/avm_context.ts +2 -2
  166. package/src/public/avm/avm_contract_call_result.ts +8 -6
  167. package/src/public/avm/avm_execution_environment.ts +9 -4
  168. package/src/public/avm/avm_machine_state.ts +6 -5
  169. package/src/public/avm/avm_memory_types.ts +4 -0
  170. package/src/public/avm/avm_simulator.ts +8 -5
  171. package/src/public/avm/calldata.ts +100 -0
  172. package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -2
  173. package/src/public/avm/fixtures/initializers.ts +2 -1
  174. package/src/public/avm/opcodes/accrued_substate.ts +27 -29
  175. package/src/public/avm/opcodes/arithmetic.ts +1 -1
  176. package/src/public/avm/opcodes/bitwise.ts +3 -3
  177. package/src/public/avm/opcodes/comparators.ts +1 -1
  178. package/src/public/avm/opcodes/contract.ts +4 -7
  179. package/src/public/avm/opcodes/control_flow.ts +2 -2
  180. package/src/public/avm/opcodes/conversion.ts +3 -3
  181. package/src/public/avm/opcodes/ec_add.ts +13 -4
  182. package/src/public/avm/opcodes/environment_getters.ts +3 -3
  183. package/src/public/avm/opcodes/external_calls.ts +17 -16
  184. package/src/public/avm/opcodes/hashing.ts +6 -6
  185. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  186. package/src/public/avm/opcodes/memory.ts +19 -19
  187. package/src/public/avm/opcodes/misc.ts +2 -2
  188. package/src/public/avm/opcodes/storage.ts +30 -22
  189. package/src/public/debug_fn_name.ts +10 -8
  190. package/src/public/executor_metrics.ts +4 -1
  191. package/src/public/fixtures/custom_bytecode_tests.ts +27 -18
  192. package/src/public/fixtures/minimal_public_tx.ts +2 -2
  193. package/src/public/fixtures/opcode_spammer.ts +196 -113
  194. package/src/public/fuzzing/avm_fuzzer_simulator.ts +60 -12
  195. package/src/public/fuzzing/avm_simulator_bin.ts +26 -4
  196. package/src/public/public_db_sources.ts +15 -5
  197. package/src/public/public_processor/public_processor.ts +21 -7
  198. package/src/public/public_processor/public_processor_metrics.ts +10 -4
  199. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +6 -3
  200. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +11 -7
  201. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +6 -4
  202. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
  203. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  204. package/src/public/public_tx_simulator/factories.ts +4 -2
  205. package/src/public/public_tx_simulator/public_tx_context.ts +13 -6
  206. package/src/public/public_tx_simulator/public_tx_simulator.ts +18 -7
  207. package/src/public/side_effect_trace.ts +5 -2
  208. package/src/public/state_manager/state_manager.ts +29 -20
  209. package/src/public/test_executor_metrics.ts +3 -3
@@ -4,6 +4,7 @@ import {
4
4
  MAX_NOTE_HASHES_PER_TX,
5
5
  MAX_NULLIFIERS_PER_TX,
6
6
  MAX_PRIVATE_LOGS_PER_TX,
7
+ MAX_PROTOCOL_CONTRACTS,
7
8
  } from '@aztec/constants';
8
9
  import { padArrayEnd } from '@aztec/foundation/collection';
9
10
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -19,8 +20,17 @@ import {
19
20
  import { PrivateLog } from '@aztec/stdlib/logs';
20
21
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
21
22
  import { ChonkProof } from '@aztec/stdlib/proofs';
22
- import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
23
- import { BlockHeader, GlobalVariables, HashedValues, Tx, TxConstantData, TxContext, TxHash } from '@aztec/stdlib/tx';
23
+ import { MerkleTreeId, type MerkleTreeWriteOperations, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
24
+ import {
25
+ BlockHeader,
26
+ GlobalVariables,
27
+ HashedValues,
28
+ ProtocolContracts,
29
+ Tx,
30
+ TxConstantData,
31
+ TxContext,
32
+ TxHash,
33
+ } from '@aztec/stdlib/tx';
24
34
  import type { NativeWorldStateService } from '@aztec/world-state';
25
35
 
26
36
  import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
@@ -40,6 +50,9 @@ export class FuzzerSimulationRequest {
40
50
  public readonly globals: GlobalVariables,
41
51
  public readonly contractClasses: any[], // Raw, processed by addContractClassFromCpp
42
52
  public readonly contractInstances: [any, any][], // Raw pairs [address, instance]
53
+ public readonly publicDataWrites: any[], // Raw public data tree writes to apply before simulation
54
+ public readonly noteHashes: any[], // Raw note hashes to apply before simulation
55
+ public readonly protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
43
56
  ) {}
44
57
 
45
58
  static fromPlainObject(obj: any): FuzzerSimulationRequest {
@@ -53,6 +66,9 @@ export class FuzzerSimulationRequest {
53
66
  GlobalVariables.fromPlainObject(obj.globals),
54
67
  obj.contractClasses,
55
68
  obj.contractInstances,
69
+ obj.publicDataWrites ?? [],
70
+ obj.noteHashes ?? [],
71
+ ProtocolContracts.fromPlainObject(obj.protocolContracts),
56
72
  );
57
73
  }
58
74
  }
@@ -181,16 +197,23 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
181
197
  merkleTrees: MerkleTreeWriteOperations,
182
198
  contractDataSource: SimpleContractDataSource,
183
199
  globals: GlobalVariables,
200
+ protocolContracts: ProtocolContracts,
184
201
  ) {
185
202
  super(contractDataSource, merkleTrees);
186
203
  const contractsDb = new PublicContractsDB(contractDataSource);
187
- this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
188
- skipFeeEnforcement: false,
189
- collectDebugLogs: false,
190
- collectHints: false,
191
- collectStatistics: false,
192
- collectCallMetadata: false,
193
- });
204
+ this.simulator = new PublicTxSimulator(
205
+ merkleTrees,
206
+ contractsDb,
207
+ globals,
208
+ {
209
+ skipFeeEnforcement: false,
210
+ collectDebugLogs: false,
211
+ collectHints: false,
212
+ collectStatistics: false,
213
+ collectCallMetadata: false,
214
+ },
215
+ protocolContracts,
216
+ );
194
217
  }
195
218
 
196
219
  /**
@@ -199,10 +222,11 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
199
222
  public static async create(
200
223
  worldStateService: NativeWorldStateService,
201
224
  globals: GlobalVariables,
225
+ protocolContracts: ProtocolContracts,
202
226
  ): Promise<AvmFuzzerSimulator> {
203
227
  const contractDataSource = new SimpleContractDataSource();
204
228
  const merkleTrees = await worldStateService.fork();
205
- return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals);
229
+ return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals, protocolContracts);
206
230
  }
207
231
 
208
232
  /**
@@ -230,11 +254,35 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
230
254
 
231
255
  /**
232
256
  * Add a contract instance from C++ raw msgpack data.
233
- * This also inserts the contract address nullifier into the nullifier tree.
257
+ * This also inserts the contract address nullifier into the nullifier tree,
258
+ * unless the address is a protocol canonical address (1-11).
234
259
  */
235
260
  public async addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void> {
236
261
  const address = AztecAddress.fromPlainObject(rawAddress);
237
262
  const instance = contractInstanceWithAddressFromPlainObject(address, rawInstance);
238
- await this.addContractInstance(instance);
263
+ // Protocol canonical addresses (1-11) should not have nullifiers inserted
264
+ const isProtocolCanonicalAddress = address.toBigInt() <= MAX_PROTOCOL_CONTRACTS && address.toBigInt() >= 1n;
265
+ await this.addContractInstance(instance, /* skipNullifierInsertion */ isProtocolCanonicalAddress);
266
+ }
267
+
268
+ /**
269
+ * Apply public data tree writes from C++ raw msgpack data.
270
+ * This is used to pre-populate the public data tree before simulation (e.g., for bytecode upgrades).
271
+ */
272
+ public async applyPublicDataWrites(rawWrites: any[]): Promise<void> {
273
+ for (const rawWrite of rawWrites) {
274
+ const leaf = PublicDataTreeLeaf.fromPlainObject(rawWrite);
275
+ await this.merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [leaf.toBuffer()]);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Apply note hashes from C++ raw msgpack data.
281
+ * This is used to pre-populate the note hash tree before simulation.
282
+ */
283
+ public async applyNoteHashes(rawNoteHashes: any[]): Promise<void> {
284
+ const paddingLeaves = MAX_NOTE_HASHES_PER_TX - (rawNoteHashes.length % MAX_NOTE_HASHES_PER_TX);
285
+ const paddedNoteHashes = [...rawNoteHashes, ...Array(paddingLeaves).fill(Fr.ZERO)];
286
+ await this.merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, paddedNoteHashes);
239
287
  }
240
288
  }
@@ -3,10 +3,11 @@ import { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import {
4
4
  AvmCircuitPublicInputs,
5
5
  type AvmTxHint,
6
+ PublicTxEffect,
6
7
  deserializeFromMessagePack,
7
8
  serializeWithMessagePack,
8
9
  } from '@aztec/stdlib/avm';
9
- import { GlobalVariables, TreeSnapshots } from '@aztec/stdlib/tx';
10
+ import { GlobalVariables, ProtocolContracts, TreeSnapshots } from '@aztec/stdlib/tx';
10
11
  import { NativeWorldStateService } from '@aztec/world-state';
11
12
 
12
13
  import { createInterface } from 'readline';
@@ -55,12 +56,23 @@ async function simulateWithFuzzer(
55
56
  globals: GlobalVariables,
56
57
  rawContractClasses: any[], // Replace these when we are moving contract classes to TS
57
58
  rawContractInstances: [any, any][], // Replace these when we are moving contract instances to TS
58
- ): Promise<{ reverted: boolean; output: Fr[]; revertReason?: string; publicInputs: AvmCircuitPublicInputs }> {
59
+ rawPublicDataWrites: any[], // Public data tree writes to apply before simulation
60
+ rawNoteHashes: any[], // Note hashes to apply before simulation
61
+ protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
62
+ ): Promise<{
63
+ reverted: boolean;
64
+ output: Fr[];
65
+ revertReason?: string;
66
+ publicInputs: AvmCircuitPublicInputs;
67
+ publicTxEffect: PublicTxEffect;
68
+ }> {
59
69
  const worldStateService = await openExistingWorldState(dataDir, mapSizeKb);
60
70
 
61
- const simulator = await AvmFuzzerSimulator.create(worldStateService, globals);
71
+ const simulator = await AvmFuzzerSimulator.create(worldStateService, globals, protocolContracts);
62
72
 
63
- // Register contract classes from C++
73
+ await simulator.applyNoteHashes(rawNoteHashes);
74
+
75
+ // Register contract classes from C++ (must happen before public data writes to match C++ order)
64
76
  for (const rawClass of rawContractClasses) {
65
77
  await simulator.addContractClassFromCpp(rawClass);
66
78
  }
@@ -70,6 +82,10 @@ async function simulateWithFuzzer(
70
82
  await simulator.addContractInstanceFromCpp(rawAddress, rawInstance);
71
83
  }
72
84
 
85
+ // Apply public data writes after contract registration (e.g., for bytecode upgrades)
86
+ // This must happen last to match C++ setup_fuzzer_state ordering
87
+ await simulator.applyPublicDataWrites(rawPublicDataWrites);
88
+
73
89
  const result = await simulator.simulate(txHint);
74
90
 
75
91
  const output = result
@@ -81,6 +97,7 @@ async function simulateWithFuzzer(
81
97
  output,
82
98
  revertReason: result.findRevertReason()?.message,
83
99
  publicInputs: result.publicInputs!,
100
+ publicTxEffect: result.publicTxEffect,
84
101
  };
85
102
  }
86
103
 
@@ -99,6 +116,9 @@ async function execute(base64Line: string): Promise<void> {
99
116
  request.globals,
100
117
  request.contractClasses,
101
118
  request.contractInstances,
119
+ request.publicDataWrites,
120
+ request.noteHashes,
121
+ request.protocolContracts,
102
122
  );
103
123
 
104
124
  // Serialize the result to msgpack and encode it in base64 for output
@@ -107,6 +127,7 @@ async function execute(base64Line: string): Promise<void> {
107
127
  output: result.output,
108
128
  revertReason: result.revertReason ?? '',
109
129
  endTreeSnapshots: result.publicInputs.endTreeSnapshots,
130
+ publicTxEffect: result.publicTxEffect,
110
131
  });
111
132
  const base64Response = resultBuffer.toString('base64') + '\n';
112
133
  await writeOutput(base64Response);
@@ -117,6 +138,7 @@ async function execute(base64Line: string): Promise<void> {
117
138
  output: [] as Fr[],
118
139
  revertReason: `Unexpected Error ${error.message}`,
119
140
  endTreeSnapshots: TreeSnapshots.empty(),
141
+ publicTxEffect: PublicTxEffect.empty(),
120
142
  });
121
143
  await writeOutput(errorResult.toString('base64') + '\n');
122
144
  }
@@ -5,7 +5,7 @@ import {
5
5
  PUBLIC_DATA_SUBTREE_HEIGHT,
6
6
  } from '@aztec/constants';
7
7
  import { Fr } from '@aztec/foundation/curves/bn254';
8
- import { createLogger } from '@aztec/foundation/log';
8
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
9
9
  import { Timer } from '@aztec/foundation/timer';
10
10
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
11
11
  import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
@@ -46,9 +46,14 @@ import { L1ToL2MessageIndexOutOfRangeError, NoteHashIndexOutOfRangeError } from
46
46
  export class PublicContractsDB implements PublicContractsDBInterface {
47
47
  private contractStateStack: ContractsDbCheckpoint[] = [new ContractsDbCheckpoint()];
48
48
 
49
- private log = createLogger('simulator:contracts-data-source');
49
+ private log: Logger;
50
50
 
51
- constructor(private dataSource: ContractDataSource) {}
51
+ constructor(
52
+ private dataSource: ContractDataSource,
53
+ bindings?: LoggerBindings,
54
+ ) {
55
+ this.log = createLogger('simulator:contracts-data-source', bindings);
56
+ }
52
57
 
53
58
  public async addContracts(contractDeploymentData: ContractDeploymentData): Promise<void> {
54
59
  const currentState = this.getCurrentState();
@@ -208,9 +213,14 @@ export class PublicContractsDB implements PublicContractsDBInterface {
208
213
  * to decide whether to use hints or not (same with tracing, etc).
209
214
  */
210
215
  export class PublicTreesDB implements PublicStateDBInterface {
211
- private logger = createLogger('simulator:public-trees-db');
216
+ private logger: Logger;
212
217
 
213
- constructor(private readonly db: MerkleTreeWriteOperations) {}
218
+ constructor(
219
+ private readonly db: MerkleTreeWriteOperations,
220
+ bindings?: LoggerBindings,
221
+ ) {
222
+ this.logger = createLogger('simulator:public-trees-db', bindings);
223
+ }
214
224
 
215
225
  public async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
216
226
  const timer = new Timer();
@@ -1,7 +1,7 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
6
  import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
7
7
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
@@ -62,11 +62,15 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
62
62
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
63
63
  */
64
64
  export class PublicProcessorFactory {
65
+ private log: Logger;
65
66
  constructor(
66
67
  private contractDataSource: ContractDataSource,
67
68
  private dateProvider: DateProvider = new DateProvider(),
68
69
  protected telemetryClient: TelemetryClient = getTelemetryClient(),
69
- ) {}
70
+ bindings?: LoggerBindings,
71
+ ) {
72
+ this.log = createLogger('simulator:public-processor-factory', bindings);
73
+ }
70
74
 
71
75
  /**
72
76
  * Creates a new instance of a PublicProcessor.
@@ -79,7 +83,8 @@ export class PublicProcessorFactory {
79
83
  globalVariables: GlobalVariables,
80
84
  config: PublicSimulatorConfig,
81
85
  ): PublicProcessor {
82
- const contractsDB = new PublicContractsDB(this.contractDataSource);
86
+ const bindings = this.log.getBindings();
87
+ const contractsDB = new PublicContractsDB(this.contractDataSource, bindings);
83
88
 
84
89
  const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
85
90
  const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
@@ -91,6 +96,7 @@ export class PublicProcessorFactory {
91
96
  publicTxSimulator,
92
97
  this.dateProvider,
93
98
  this.telemetryClient,
99
+ createLogger('simulator:public-processor', bindings),
94
100
  );
95
101
  }
96
102
 
@@ -100,7 +106,14 @@ export class PublicProcessorFactory {
100
106
  globalVariables: GlobalVariables,
101
107
  config?: Partial<PublicTxSimulatorConfig>,
102
108
  ): PublicTxSimulatorInterface {
103
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
109
+ return new TelemetryCppPublicTxSimulator(
110
+ merkleTree,
111
+ contractsDB,
112
+ globalVariables,
113
+ this.telemetryClient,
114
+ config,
115
+ this.log.getBindings(),
116
+ );
104
117
  }
105
118
  }
106
119
 
@@ -125,7 +138,7 @@ export class PublicProcessor implements Traceable {
125
138
  protected publicTxSimulator: PublicTxSimulatorInterface,
126
139
  private dateProvider: DateProvider,
127
140
  telemetryClient: TelemetryClient = getTelemetryClient(),
128
- private log = createLogger('simulator:public-processor'),
141
+ private log: Logger,
129
142
  private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
130
143
  ) {
131
144
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
@@ -146,7 +159,7 @@ export class PublicProcessor implements Traceable {
146
159
  txs: Iterable<Tx> | AsyncIterable<Tx>,
147
160
  limits: PublicProcessorLimits = {},
148
161
  validator: PublicProcessorValidator = {},
149
- ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[]]> {
162
+ ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], number]> {
150
163
  const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
151
164
  const { preprocessValidator, nullifierCache } = validator;
152
165
  const result: ProcessedTx[] = [];
@@ -254,6 +267,7 @@ export class PublicProcessor implements Traceable {
254
267
  }
255
268
 
256
269
  // If the actual blob fields of this tx would exceed the limit, skip it
270
+ // Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
257
271
  if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
258
272
  this.log.debug(
259
273
  `Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`,
@@ -349,7 +363,7 @@ export class PublicProcessor implements Traceable {
349
363
  totalSizeInBytes,
350
364
  });
351
365
 
352
- return [result, failed, usedTxs, returns];
366
+ return [result, failed, usedTxs, returns, totalBlobFields];
353
367
  }
354
368
 
355
369
  private async checkWorldStateUnchanged(
@@ -1,6 +1,6 @@
1
1
  import type { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
2
2
  import type { Gas } from '@aztec/stdlib/gas';
3
- import type { TxExecutionPhase } from '@aztec/stdlib/tx';
3
+ import { TxExecutionPhase } from '@aztec/stdlib/tx';
4
4
  import {
5
5
  Attributes,
6
6
  type Gauge,
@@ -9,6 +9,7 @@ import {
9
9
  type TelemetryClient,
10
10
  type Tracer,
11
11
  type UpDownCounter,
12
+ createUpDownCounterWithDefault,
12
13
  } from '@aztec/telemetry-client';
13
14
 
14
15
  export class PublicProcessorMetrics {
@@ -35,13 +36,18 @@ export class PublicProcessorMetrics {
35
36
 
36
37
  this.txDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_DURATION);
37
38
 
38
- this.txCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_COUNT);
39
+ this.txCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_COUNT, {
40
+ [Attributes.OK]: [true, false],
41
+ });
39
42
 
40
- this.txPhaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
43
+ this.txPhaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
41
44
 
42
45
  this.phaseDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_PHASE_DURATION);
43
46
 
44
- this.phaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_PHASE_COUNT);
47
+ this.phaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_PHASE_COUNT, {
48
+ [Attributes.TX_PHASE_NAME]: [TxExecutionPhase.SETUP, TxExecutionPhase.APP_LOGIC, TxExecutionPhase.TEARDOWN],
49
+ [Attributes.OK]: [true, false],
50
+ });
45
51
 
46
52
  this.bytecodeDeployed = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_DEPLOY_BYTECODE_SIZE);
47
53
 
@@ -1,5 +1,5 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { type Logger, createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import type { ContractProvider } from '@aztec/native';
4
4
  import { FunctionSelector } from '@aztec/stdlib/abi';
5
5
  import { deserializeFromMessagePack, serializeWithMessagePack } from '@aztec/stdlib/avm';
@@ -10,12 +10,15 @@ import type { GlobalVariables } from '@aztec/stdlib/tx';
10
10
  import type { PublicContractsDB } from '../public_db_sources.js';
11
11
 
12
12
  export class ContractProviderForCpp implements ContractProvider {
13
- private log: Logger = createLogger('simulator:contract_provider_for_cpp');
13
+ private log: Logger;
14
14
 
15
15
  constructor(
16
16
  private contractsDB: PublicContractsDB,
17
17
  private globalVariables: GlobalVariables,
18
- ) {}
18
+ bindings?: LoggerBindings,
19
+ ) {
20
+ this.log = createLogger('simulator:contract_provider_for_cpp', bindings);
21
+ }
19
22
 
20
23
  public getContractInstance = async (address: string): Promise<Buffer | undefined> => {
21
24
  this.log.trace(`Contract provider callback: getContractInstance(${address})`);
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { sleep } from '@aztec/foundation/sleep';
3
3
  import { type CancellationToken, avmSimulate, cancelSimulation, createCancellationToken } from '@aztec/native';
4
4
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
@@ -44,9 +44,10 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
44
44
  contractsDB: PublicContractsDB,
45
45
  globalVariables: GlobalVariables,
46
46
  config?: Partial<PublicSimulatorConfig>,
47
+ bindings?: LoggerBindings,
47
48
  ) {
48
- super(merkleTree, contractsDB, globalVariables, config);
49
- this.log = createLogger(`simulator:cpp_public_tx_simulator`);
49
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
50
+ this.log = createLogger(`simulator:cpp_public_tx_simulator`, bindings);
50
51
  }
51
52
 
52
53
  /**
@@ -84,7 +85,7 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
84
85
  );
85
86
 
86
87
  // Create contract provider for callbacks to TypeScript PublicContractsDB from C++
87
- const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables);
88
+ const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables, this.bindings);
88
89
 
89
90
  // Serialize to msgpack and call the C++ simulator
90
91
  this.log.trace(`Serializing fast simulation inputs to msgpack...`);
@@ -100,7 +101,8 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
100
101
  contractProvider,
101
102
  wsCppHandle,
102
103
  logLevel,
103
- this.log,
104
+ // TODO: re-enable logging
105
+ undefined,
104
106
  this.cancellationToken,
105
107
  );
106
108
 
@@ -170,8 +172,9 @@ export class MeasuredCppPublicTxSimulator extends CppPublicTxSimulator implement
170
172
  globalVariables: GlobalVariables,
171
173
  protected readonly metrics: ExecutorMetricsInterface,
172
174
  config?: Partial<PublicSimulatorConfig>,
175
+ bindings?: LoggerBindings,
173
176
  ) {
174
- super(merkleTree, contractsDB, globalVariables, config);
177
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
175
178
  }
176
179
 
177
180
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -199,9 +202,10 @@ export class TelemetryCppPublicTxSimulator extends MeasuredCppPublicTxSimulator
199
202
  globalVariables: GlobalVariables,
200
203
  telemetryClient: TelemetryClient = getTelemetryClient(),
201
204
  config?: Partial<PublicSimulatorConfig>,
205
+ bindings?: LoggerBindings,
202
206
  ) {
203
207
  const metrics = new ExecutorMetrics(telemetryClient, 'CppPublicTxSimulator');
204
- super(merkleTree, contractsDB, globalVariables, metrics, config);
208
+ super(merkleTree, contractsDB, globalVariables, metrics, config, bindings);
205
209
  this.tracer = metrics.tracer;
206
210
  }
207
211
  }
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { avmSimulateWithHintedDbs } from '@aztec/native';
3
3
  import {
4
4
  AvmCircuitInputs,
@@ -34,9 +34,10 @@ export class CppPublicTxSimulatorHintedDbs extends PublicTxSimulator implements
34
34
  contractsDB: PublicContractsDB,
35
35
  globalVariables: GlobalVariables,
36
36
  config?: Partial<PublicSimulatorConfig>,
37
+ bindings?: LoggerBindings,
37
38
  ) {
38
- super(merkleTree, contractsDB, globalVariables, config);
39
- this.log = createLogger(`simulator:cpp_public_tx_simulator_hinted_dbs`);
39
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
40
+ this.log = createLogger(`simulator:cpp_public_tx_simulator_hinted_dbs`, bindings);
40
41
  }
41
42
 
42
43
  /**
@@ -115,8 +116,9 @@ export class MeasuredCppPublicTxSimulatorHintedDbs
115
116
  globalVariables: GlobalVariables,
116
117
  protected readonly metrics: ExecutorMetricsInterface,
117
118
  config?: Partial<PublicSimulatorConfig>,
119
+ bindings?: LoggerBindings,
118
120
  ) {
119
- super(merkleTree, contractsDB, globalVariables, config);
121
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
120
122
  }
121
123
 
122
124
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -1,4 +1,4 @@
1
- import { type Logger, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
2
2
  import { avmSimulate } from '@aztec/native';
3
3
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
4
4
  import {
@@ -37,9 +37,10 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
37
37
  contractsDB: PublicContractsDB,
38
38
  globalVariables: GlobalVariables,
39
39
  config?: Partial<PublicSimulatorConfig>,
40
+ bindings?: LoggerBindings,
40
41
  ) {
41
- super(merkleTree, contractsDB, globalVariables, config);
42
- this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
42
+ super(merkleTree, contractsDB, globalVariables, config, undefined, bindings);
43
+ this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`, bindings);
43
44
  }
44
45
 
45
46
  /**
@@ -103,7 +104,7 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
103
104
  );
104
105
 
105
106
  // Create contract provider for callbacks to TypeScript PublicContractsDB from C++
106
- const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables);
107
+ const contractProvider = new ContractProviderForCpp(this.contractsDB, this.globalVariables, this.bindings);
107
108
 
108
109
  // Serialize to msgpack and call the C++ simulator
109
110
  this.log.debug(`Serializing fast simulation inputs to msgpack...`);
@@ -220,8 +221,9 @@ export class MeasuredCppVsTsPublicTxSimulator
220
221
  globalVariables: GlobalVariables,
221
222
  protected readonly metrics: ExecutorMetricsInterface,
222
223
  config?: Partial<PublicSimulatorConfig>,
224
+ bindings?: LoggerBindings,
223
225
  ) {
224
- super(merkleTree, contractsDB, globalVariables, config);
226
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
225
227
  }
226
228
 
227
229
  public override async simulate(tx: Tx, txLabel: string = 'unlabeledTx'): Promise<PublicTxResult> {
@@ -1,3 +1,4 @@
1
+ import type { LoggerBindings } from '@aztec/foundation/log';
1
2
  import {
2
3
  AvmCircuitInputs,
3
4
  AvmCircuitPublicInputs,
@@ -29,8 +30,9 @@ export class DumpingCppPublicTxSimulator extends CppPublicTxSimulator {
29
30
  globalVariables: GlobalVariables,
30
31
  config: Partial<PublicSimulatorConfig>,
31
32
  outputDir: string,
33
+ bindings?: LoggerBindings,
32
34
  ) {
33
- super(merkleTree, contractsDB, globalVariables, config);
35
+ super(merkleTree, contractsDB, globalVariables, config, bindings);
34
36
  assert(config.collectHints === true, 'collectHints must be enabled to dump AVM circuit inputs');
35
37
  assert(config.collectPublicInputs === true, 'collectPublicInputs must be enabled to dump AVM circuit inputs');
36
38
  this.outputDir = outputDir;
@@ -1,3 +1,4 @@
1
+ import type { LoggerBindings } from '@aztec/foundation/log';
1
2
  import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
2
3
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
3
4
  import type { GlobalVariables } from '@aztec/stdlib/tx';
@@ -17,6 +18,7 @@ export function createPublicTxSimulatorForBlockBuilding(
17
18
  contractsDB: PublicContractsDB,
18
19
  globalVariables: GlobalVariables,
19
20
  telemetryClient: TelemetryClient,
21
+ bindings?: LoggerBindings,
20
22
  ) {
21
23
  const config = PublicSimulatorConfig.from({
22
24
  skipFeeEnforcement: false,
@@ -35,7 +37,7 @@ export function createPublicTxSimulatorForBlockBuilding(
35
37
  collectHints: true,
36
38
  collectPublicInputs: true,
37
39
  };
38
- return new DumpingCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, dumpingConfig, dumpDir);
40
+ return new DumpingCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, dumpingConfig, dumpDir, bindings);
39
41
  }
40
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, telemetryClient, config);
42
+ return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, telemetryClient, config, bindings);
41
43
  }
@@ -7,7 +7,7 @@ import {
7
7
  } from '@aztec/constants';
8
8
  import { padArrayEnd } from '@aztec/foundation/collection';
9
9
  import { Fr } from '@aztec/foundation/curves/bn254';
10
- import { type Logger, createLogger } from '@aztec/foundation/log';
10
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
11
11
  import {
12
12
  AvmAccumulatedData,
13
13
  AvmAccumulatedDataArrayLengths,
@@ -87,8 +87,9 @@ export class PublicTxContext {
87
87
  public readonly revertibleAccumulatedDataFromPrivate: PrivateToPublicAccumulatedData,
88
88
  public readonly feePayer: AztecAddress,
89
89
  private readonly trace: SideEffectTrace,
90
+ bindings?: LoggerBindings,
90
91
  ) {
91
- this.log = createLogger(`simulator:public_tx_context`);
92
+ this.log = createLogger(`simulator:public_tx_context`, bindings);
92
93
  }
93
94
 
94
95
  public static async create(
@@ -98,13 +99,14 @@ export class PublicTxContext {
98
99
  globalVariables: GlobalVariables,
99
100
  protocolContracts: ProtocolContracts,
100
101
  proverId: Fr,
102
+ bindings?: LoggerBindings,
101
103
  ) {
102
104
  const contractDeploymentData = AllContractDeploymentData.fromTx(tx);
103
105
  const nonRevertibleContractDeploymentData = contractDeploymentData.getNonRevertibleContractDeploymentData();
104
106
  const revertibleContractDeploymentData = contractDeploymentData.getRevertibleContractDeploymentData();
105
107
  const nonRevertibleAccumulatedDataFromPrivate = tx.data.forPublic!.nonRevertibleAccumulatedData;
106
108
 
107
- const trace = new SideEffectTrace();
109
+ const trace = new SideEffectTrace(0, bindings);
108
110
 
109
111
  const firstNullifier = nonRevertibleAccumulatedDataFromPrivate.nullifiers[0];
110
112
 
@@ -115,6 +117,7 @@ export class PublicTxContext {
115
117
  trace,
116
118
  firstNullifier,
117
119
  globalVariables.timestamp,
120
+ bindings,
118
121
  );
119
122
 
120
123
  const gasSettings = tx.data.constants.txContext.gasSettings;
@@ -124,7 +127,7 @@ export class PublicTxContext {
124
127
 
125
128
  return new PublicTxContext(
126
129
  tx.getTxHash(),
127
- new PhaseStateManager(txStateManager),
130
+ new PhaseStateManager(txStateManager, bindings),
128
131
  await txStateManager.getTreeSnapshots(),
129
132
  globalVariables,
130
133
  protocolContracts,
@@ -142,6 +145,7 @@ export class PublicTxContext {
142
145
  tx.data.forPublic!.revertibleAccumulatedData,
143
146
  tx.data.feePayer,
144
147
  trace,
148
+ bindings,
145
149
  );
146
150
  }
147
151
 
@@ -441,8 +445,11 @@ class PhaseStateManager {
441
445
 
442
446
  private currentlyActiveStateManager: PublicPersistableStateManager | undefined;
443
447
 
444
- constructor(private readonly txStateManager: PublicPersistableStateManager) {
445
- this.log = createLogger(`simulator:public_phase_state_manager`);
448
+ constructor(
449
+ private readonly txStateManager: PublicPersistableStateManager,
450
+ bindings?: LoggerBindings,
451
+ ) {
452
+ this.log = createLogger(`simulator:public_phase_state_manager`, bindings);
446
453
  }
447
454
 
448
455
  async fork() {