@aztec/simulator 0.41.0 → 0.43.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 (243) hide show
  1. package/dest/acvm/acvm.d.ts +2 -2
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +3 -3
  4. package/dest/acvm/oracle/oracle.d.ts +7 -4
  5. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/oracle.js +32 -12
  7. package/dest/acvm/oracle/typed_oracle.d.ts +6 -3
  8. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/typed_oracle.js +15 -6
  10. package/dest/acvm/serialize.js +2 -2
  11. package/dest/avm/avm_gas.d.ts +1 -5
  12. package/dest/avm/avm_gas.d.ts.map +1 -1
  13. package/dest/avm/avm_gas.js +69 -73
  14. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  15. package/dest/avm/avm_memory_types.js +2 -4
  16. package/dest/avm/avm_simulator.d.ts +5 -0
  17. package/dest/avm/avm_simulator.d.ts.map +1 -1
  18. package/dest/avm/avm_simulator.js +8 -1
  19. package/dest/avm/fixtures/index.d.ts +6 -0
  20. package/dest/avm/fixtures/index.d.ts.map +1 -1
  21. package/dest/avm/fixtures/index.js +18 -1
  22. package/dest/avm/index.d.ts +2 -0
  23. package/dest/avm/index.d.ts.map +1 -0
  24. package/dest/avm/index.js +2 -0
  25. package/dest/avm/journal/host_storage.d.ts +1 -1
  26. package/dest/avm/journal/host_storage.d.ts.map +1 -1
  27. package/dest/avm/journal/journal.d.ts +5 -3
  28. package/dest/avm/journal/journal.d.ts.map +1 -1
  29. package/dest/avm/journal/journal.js +23 -14
  30. package/dest/avm/journal/trace.d.ts +3 -1
  31. package/dest/avm/journal/trace.d.ts.map +1 -1
  32. package/dest/avm/journal/trace.js +8 -1
  33. package/dest/avm/journal/trace_types.d.ts +5 -0
  34. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  35. package/dest/avm/journal/trace_types.js +1 -5
  36. package/dest/avm/opcodes/accrued_substate.d.ts +2 -2
  37. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  38. package/dest/avm/opcodes/accrued_substate.js +36 -21
  39. package/dest/avm/opcodes/arithmetic.d.ts +1 -7
  40. package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
  41. package/dest/avm/opcodes/arithmetic.js +12 -20
  42. package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
  43. package/dest/avm/opcodes/bitwise.js +11 -8
  44. package/dest/avm/opcodes/comparators.d.ts.map +1 -1
  45. package/dest/avm/opcodes/comparators.js +7 -5
  46. package/dest/avm/opcodes/contract.d.ts.map +1 -1
  47. package/dest/avm/opcodes/contract.js +20 -24
  48. package/dest/avm/opcodes/control_flow.d.ts.map +1 -1
  49. package/dest/avm/opcodes/control_flow.js +4 -2
  50. package/dest/avm/opcodes/conversion.js +2 -2
  51. package/dest/avm/opcodes/ec_add.d.ts +19 -0
  52. package/dest/avm/opcodes/ec_add.d.ts.map +1 -0
  53. package/dest/avm/opcodes/ec_add.js +78 -0
  54. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  55. package/dest/avm/opcodes/external_calls.js +11 -5
  56. package/dest/avm/opcodes/hashing.d.ts.map +1 -1
  57. package/dest/avm/opcodes/hashing.js +10 -2
  58. package/dest/avm/opcodes/instruction.d.ts +1 -1
  59. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  60. package/dest/avm/opcodes/instruction.js +6 -4
  61. package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
  62. package/dest/avm/opcodes/instruction_impl.js +4 -2
  63. package/dest/avm/opcodes/memory.d.ts +1 -5
  64. package/dest/avm/opcodes/memory.d.ts.map +1 -1
  65. package/dest/avm/opcodes/memory.js +14 -18
  66. package/dest/avm/opcodes/multi_scalar_mul.d.ts +16 -0
  67. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -0
  68. package/dest/avm/opcodes/multi_scalar_mul.js +95 -0
  69. package/dest/avm/opcodes/storage.d.ts +1 -6
  70. package/dest/avm/opcodes/storage.d.ts.map +1 -1
  71. package/dest/avm/opcodes/storage.js +11 -14
  72. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  73. package/dest/avm/serialization/bytecode_serialization.js +6 -2
  74. package/dest/avm/serialization/instruction_serialization.d.ts +3 -1
  75. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  76. package/dest/avm/serialization/instruction_serialization.js +4 -2
  77. package/dest/client/client_execution_context.d.ts +24 -20
  78. package/dest/client/client_execution_context.d.ts.map +1 -1
  79. package/dest/client/client_execution_context.js +52 -55
  80. package/dest/client/db_oracle.d.ts +7 -1
  81. package/dest/client/db_oracle.d.ts.map +1 -1
  82. package/dest/client/execution_note_cache.d.ts +0 -17
  83. package/dest/client/execution_note_cache.d.ts.map +1 -1
  84. package/dest/client/execution_note_cache.js +1 -24
  85. package/dest/client/execution_result.d.ts +8 -4
  86. package/dest/client/execution_result.d.ts.map +1 -1
  87. package/dest/client/execution_result.js +16 -6
  88. package/dest/client/private_execution.d.ts +2 -3
  89. package/dest/client/private_execution.d.ts.map +1 -1
  90. package/dest/client/private_execution.js +20 -9
  91. package/dest/client/simulator.d.ts +2 -17
  92. package/dest/client/simulator.d.ts.map +1 -1
  93. package/dest/client/simulator.js +24 -33
  94. package/dest/client/unconstrained_execution.d.ts +2 -3
  95. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  96. package/dest/client/unconstrained_execution.js +5 -7
  97. package/dest/client/view_data_oracle.d.ts +2 -0
  98. package/dest/client/view_data_oracle.d.ts.map +1 -1
  99. package/dest/client/view_data_oracle.js +7 -1
  100. package/dest/index.d.ts +3 -1
  101. package/dest/index.d.ts.map +1 -1
  102. package/dest/index.js +4 -2
  103. package/dest/mocks/fixtures.d.ts +14 -10
  104. package/dest/mocks/fixtures.d.ts.map +1 -1
  105. package/dest/mocks/fixtures.js +22 -16
  106. package/dest/{simulator → providers}/acvm_native.d.ts.map +1 -1
  107. package/dest/{simulator → providers}/acvm_native.js +13 -14
  108. package/dest/providers/acvm_wasm.d.ts.map +1 -0
  109. package/dest/providers/acvm_wasm.js +15 -0
  110. package/dest/providers/index.d.ts.map +1 -0
  111. package/dest/{simulator → providers}/index.js +1 -1
  112. package/dest/{simulator → providers}/simulation_provider.d.ts.map +1 -1
  113. package/dest/{simulator → providers}/simulation_provider.js +1 -1
  114. package/dest/public/abstract_phase_manager.d.ts +53 -53
  115. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  116. package/dest/public/abstract_phase_manager.js +146 -153
  117. package/dest/public/app_logic_phase_manager.d.ts +8 -9
  118. package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
  119. package/dest/public/app_logic_phase_manager.js +15 -15
  120. package/dest/public/{db.d.ts → db_interfaces.d.ts} +4 -3
  121. package/dest/public/db_interfaces.d.ts.map +1 -0
  122. package/dest/public/db_interfaces.js +2 -0
  123. package/dest/public/execution.d.ts +16 -23
  124. package/dest/public/execution.d.ts.map +1 -1
  125. package/dest/public/execution.js +1 -51
  126. package/dest/public/executor.d.ts +4 -31
  127. package/dest/public/executor.d.ts.map +1 -1
  128. package/dest/public/executor.js +40 -283
  129. package/dest/public/fee_payment.d.ts +11 -0
  130. package/dest/public/fee_payment.d.ts.map +1 -0
  131. package/dest/public/fee_payment.js +24 -0
  132. package/dest/public/hints_builder.d.ts +2 -1
  133. package/dest/public/hints_builder.d.ts.map +1 -1
  134. package/dest/public/hints_builder.js +6 -2
  135. package/dest/public/index.d.ts +8 -6
  136. package/dest/public/index.d.ts.map +1 -1
  137. package/dest/public/index.js +9 -7
  138. package/dest/public/phase_manager_factory.d.ts +4 -4
  139. package/dest/public/phase_manager_factory.d.ts.map +1 -1
  140. package/dest/public/phase_manager_factory.js +5 -5
  141. package/dest/public/{public_executor.d.ts → public_db_sources.d.ts} +6 -3
  142. package/dest/public/public_db_sources.d.ts.map +1 -0
  143. package/dest/public/public_db_sources.js +244 -0
  144. package/dest/public/public_kernel.js +14 -14
  145. package/dest/public/public_processor.d.ts +6 -4
  146. package/dest/public/public_processor.d.ts.map +1 -1
  147. package/dest/public/public_processor.js +48 -30
  148. package/dest/public/setup_phase_manager.d.ts +8 -10
  149. package/dest/public/setup_phase_manager.d.ts.map +1 -1
  150. package/dest/public/setup_phase_manager.js +12 -21
  151. package/dest/public/tail_phase_manager.d.ts +7 -13
  152. package/dest/public/tail_phase_manager.d.ts.map +1 -1
  153. package/dest/public/tail_phase_manager.js +17 -37
  154. package/dest/public/teardown_phase_manager.d.ts +8 -10
  155. package/dest/public/teardown_phase_manager.d.ts.map +1 -1
  156. package/dest/public/teardown_phase_manager.js +16 -22
  157. package/dest/public/transitional_adaptors.d.ts +2 -2
  158. package/dest/public/transitional_adaptors.d.ts.map +1 -1
  159. package/dest/public/transitional_adaptors.js +14 -6
  160. package/package.json +12 -9
  161. package/src/acvm/acvm.ts +0 -3
  162. package/src/acvm/oracle/oracle.ts +68 -16
  163. package/src/acvm/oracle/typed_oracle.ts +31 -6
  164. package/src/acvm/serialize.ts +1 -1
  165. package/src/avm/avm_gas.ts +68 -73
  166. package/src/avm/avm_memory_types.ts +1 -3
  167. package/src/avm/avm_simulator.ts +9 -0
  168. package/src/avm/fixtures/index.ts +24 -0
  169. package/src/avm/index.ts +1 -0
  170. package/src/avm/journal/host_storage.ts +1 -1
  171. package/src/avm/journal/journal.ts +32 -22
  172. package/src/avm/journal/trace.ts +9 -0
  173. package/src/avm/journal/trace_types.ts +4 -0
  174. package/src/avm/opcodes/accrued_substate.ts +53 -20
  175. package/src/avm/opcodes/arithmetic.ts +18 -22
  176. package/src/avm/opcodes/bitwise.ts +13 -8
  177. package/src/avm/opcodes/comparators.ts +9 -4
  178. package/src/avm/opcodes/contract.ts +22 -26
  179. package/src/avm/opcodes/control_flow.ts +3 -1
  180. package/src/avm/opcodes/conversion.ts +1 -1
  181. package/src/avm/opcodes/ec_add.ts +92 -0
  182. package/src/avm/opcodes/external_calls.ts +11 -3
  183. package/src/avm/opcodes/hashing.ts +11 -1
  184. package/src/avm/opcodes/instruction.ts +5 -3
  185. package/src/avm/opcodes/instruction_impl.ts +4 -1
  186. package/src/avm/opcodes/memory.ts +19 -19
  187. package/src/avm/opcodes/multi_scalar_mul.ts +114 -0
  188. package/src/avm/opcodes/storage.ts +10 -17
  189. package/src/avm/serialization/bytecode_serialization.ts +5 -1
  190. package/src/avm/serialization/instruction_serialization.ts +2 -0
  191. package/src/client/client_execution_context.ts +76 -60
  192. package/src/client/db_oracle.ts +8 -1
  193. package/src/client/execution_note_cache.ts +0 -28
  194. package/src/client/execution_result.ts +21 -7
  195. package/src/client/private_execution.ts +36 -21
  196. package/src/client/simulator.ts +25 -35
  197. package/src/client/unconstrained_execution.ts +9 -12
  198. package/src/client/view_data_oracle.ts +8 -0
  199. package/src/index.ts +3 -1
  200. package/src/mocks/fixtures.ts +30 -32
  201. package/src/{simulator → providers}/acvm_native.ts +21 -19
  202. package/src/{simulator → providers}/acvm_wasm.ts +2 -16
  203. package/src/public/abstract_phase_manager.ts +209 -258
  204. package/src/public/app_logic_phase_manager.ts +24 -40
  205. package/src/public/{db.ts → db_interfaces.ts} +4 -2
  206. package/src/public/execution.ts +15 -77
  207. package/src/public/executor.ts +61 -399
  208. package/src/public/fee_payment.ts +26 -0
  209. package/src/public/hints_builder.ts +6 -0
  210. package/src/public/index.ts +8 -12
  211. package/src/public/phase_manager_factory.ts +7 -7
  212. package/src/public/{public_executor.ts → public_db_sources.ts} +65 -9
  213. package/src/public/public_kernel.ts +24 -24
  214. package/src/public/public_processor.ts +81 -40
  215. package/src/public/setup_phase_manager.ts +21 -46
  216. package/src/public/tail_phase_manager.ts +19 -67
  217. package/src/public/teardown_phase_manager.ts +23 -42
  218. package/src/public/transitional_adaptors.ts +41 -5
  219. package/dest/public/db.d.ts.map +0 -1
  220. package/dest/public/db.js +0 -2
  221. package/dest/public/public_execution_context.d.ts +0 -121
  222. package/dest/public/public_execution_context.d.ts.map +0 -1
  223. package/dest/public/public_execution_context.js +0 -214
  224. package/dest/public/public_executor.d.ts.map +0 -1
  225. package/dest/public/public_executor.js +0 -197
  226. package/dest/public/state_actions.d.ts +0 -39
  227. package/dest/public/state_actions.d.ts.map +0 -1
  228. package/dest/public/state_actions.js +0 -80
  229. package/dest/public/utils.d.ts +0 -8
  230. package/dest/public/utils.d.ts.map +0 -1
  231. package/dest/public/utils.js +0 -31
  232. package/dest/simulator/acvm_wasm.d.ts.map +0 -1
  233. package/dest/simulator/acvm_wasm.js +0 -22
  234. package/dest/simulator/index.d.ts.map +0 -1
  235. package/src/public/public_execution_context.ts +0 -289
  236. package/src/public/state_actions.ts +0 -102
  237. package/src/public/utils.ts +0 -33
  238. /package/dest/{simulator → providers}/acvm_native.d.ts +0 -0
  239. /package/dest/{simulator → providers}/acvm_wasm.d.ts +0 -0
  240. /package/dest/{simulator → providers}/index.d.ts +0 -0
  241. /package/dest/{simulator → providers}/simulation_provider.d.ts +0 -0
  242. /package/src/{simulator → providers}/index.ts +0 -0
  243. /package/src/{simulator → providers}/simulation_provider.ts +0 -0
@@ -1,4 +1,5 @@
1
1
  import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
+ import { KeyValidationRequest } from '@aztec/circuits.js';
2
3
  import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
3
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
5
  import { Fr, Point } from '@aztec/foundation/fields';
@@ -40,12 +41,18 @@ export class Oracle {
40
41
  return unpacked.map(toACVMField);
41
42
  }
42
43
 
43
- async getKeyValidationRequest([masterPublicKeyHash]: ACVMField[]): Promise<ACVMField[]> {
44
- const { masterPublicKey, appSecretKey } = await this.typedOracle.getKeyValidationRequest(
45
- fromACVMField(masterPublicKeyHash),
46
- );
44
+ async getBlockNumber(): Promise<ACVMField> {
45
+ return toACVMField(await this.typedOracle.getBlockNumber());
46
+ }
47
+
48
+ async getContractAddress(): Promise<ACVMField> {
49
+ return toACVMField(await this.typedOracle.getContractAddress());
50
+ }
51
+
52
+ async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
53
+ const { pkM, skApp } = await this.typedOracle.getKeyValidationRequest(fromACVMField(pkMHash));
47
54
 
48
- return [toACVMField(masterPublicKey.x), toACVMField(masterPublicKey.y), toACVMField(appSecretKey)];
55
+ return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(skApp)];
49
56
  }
50
57
 
51
58
  async getContractInstance([address]: ACVMField[]) {
@@ -282,32 +289,77 @@ export class Oracle {
282
289
  return newValues.map(toACVMField);
283
290
  }
284
291
 
285
- emitEncryptedLog(encryptedLog: ACVMField[], [counter]: ACVMField[]): void {
292
+ emitEncryptedEventLog(
293
+ [contractAddress]: ACVMField[],
294
+ [randomness]: ACVMField[],
295
+ encryptedEvent: ACVMField[],
296
+ [counter]: ACVMField[],
297
+ ): void {
286
298
  // Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
287
- const processedInput = Buffer.from(encryptedLog.map(fromACVMField).map(f => f.toNumber()));
288
- this.typedOracle.emitEncryptedLog(processedInput, +counter);
299
+ const processedInput = Buffer.from(encryptedEvent.map(fromACVMField).map(f => f.toNumber()));
300
+ this.typedOracle.emitEncryptedEventLog(
301
+ AztecAddress.fromString(contractAddress),
302
+ Fr.fromString(randomness),
303
+ processedInput,
304
+ +counter,
305
+ );
289
306
  }
290
307
 
291
- emitEncryptedNoteLog([noteHash]: ACVMField[], encryptedNote: ACVMField[], [counter]: ACVMField[]): void {
308
+ emitEncryptedNoteLog([noteHashCounter]: ACVMField[], encryptedNote: ACVMField[], [counter]: ACVMField[]): void {
292
309
  // Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
293
310
  const processedInput = Buffer.from(encryptedNote.map(fromACVMField).map(f => f.toNumber()));
294
- this.typedOracle.emitEncryptedNoteLog(fromACVMField(noteHash), processedInput, +counter);
311
+ this.typedOracle.emitEncryptedNoteLog(+noteHashCounter, processedInput, +counter);
312
+ }
313
+
314
+ computeEncryptedEventLog(
315
+ [contractAddress]: ACVMField[],
316
+ [randomness]: ACVMField[],
317
+ [eventTypeId]: ACVMField[],
318
+ [ovskApp]: ACVMField[],
319
+ [ovpkMX]: ACVMField[],
320
+ [ovpkMY]: ACVMField[],
321
+ [ivpkMX]: ACVMField[],
322
+ [ivpkMY]: ACVMField[],
323
+ preimage: ACVMField[],
324
+ ): ACVMField[] {
325
+ const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
326
+ const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
327
+ const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
328
+ const encLog = this.typedOracle.computeEncryptedEventLog(
329
+ AztecAddress.fromString(contractAddress),
330
+ Fr.fromString(randomness),
331
+ Fr.fromString(eventTypeId),
332
+ ovKeys,
333
+ ivpkM,
334
+ preimage.map(fromACVMField),
335
+ );
336
+ const bytes: ACVMField[] = [];
337
+ encLog.forEach(v => {
338
+ bytes.push(toACVMField(v));
339
+ });
340
+ return bytes;
295
341
  }
296
342
 
297
- computeEncryptedLog(
343
+ computeEncryptedNoteLog(
298
344
  [contractAddress]: ACVMField[],
299
345
  [storageSlot]: ACVMField[],
300
346
  [noteTypeId]: ACVMField[],
301
- [publicKeyX]: ACVMField[],
302
- [publicKeyY]: ACVMField[],
347
+ [ovskApp]: ACVMField[],
348
+ [ovpkMX]: ACVMField[],
349
+ [ovpkMY]: ACVMField[],
350
+ [ivpkMX]: ACVMField[],
351
+ [ivpkMY]: ACVMField[],
303
352
  preimage: ACVMField[],
304
353
  ): ACVMField[] {
305
- const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
306
- const encLog = this.typedOracle.computeEncryptedLog(
354
+ const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
355
+ const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
356
+ const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
357
+ const encLog = this.typedOracle.computeEncryptedNoteLog(
307
358
  AztecAddress.fromString(contractAddress),
308
359
  Fr.fromString(storageSlot),
309
360
  Fr.fromString(noteTypeId),
310
- publicKey,
361
+ ovKeys,
362
+ ivpkM,
311
363
  preimage.map(fromACVMField),
312
364
  );
313
365
  const bytes: ACVMField[] = [];
@@ -82,6 +82,14 @@ export abstract class TypedOracle {
82
82
  throw new OracleMethodNotAvailableError('unpackReturns');
83
83
  }
84
84
 
85
+ getBlockNumber(): Promise<number> {
86
+ throw new OracleMethodNotAvailableError('getBlockNumber');
87
+ }
88
+
89
+ getContractAddress(): Promise<AztecAddress> {
90
+ throw new OracleMethodNotAvailableError('getContractAddress');
91
+ }
92
+
85
93
  getKeyValidationRequest(_pkMHash: Fr): Promise<KeyValidationRequest> {
86
94
  throw new OracleMethodNotAvailableError('getKeyValidationRequest');
87
95
  }
@@ -176,22 +184,39 @@ export abstract class TypedOracle {
176
184
  throw new OracleMethodNotAvailableError('storageWrite');
177
185
  }
178
186
 
179
- emitEncryptedLog(_encryptedNote: Buffer, _counter: number): void {
180
- throw new OracleMethodNotAvailableError('emitEncryptedLog');
187
+ emitEncryptedEventLog(
188
+ _contractAddress: AztecAddress,
189
+ _randomness: Fr,
190
+ _encryptedEvent: Buffer,
191
+ _counter: number,
192
+ ): void {
193
+ throw new OracleMethodNotAvailableError('emitEncryptedEventLog');
181
194
  }
182
195
 
183
- emitEncryptedNoteLog(_noteHash: Fr, _encryptedNote: Buffer, _counter: number): void {
196
+ emitEncryptedNoteLog(_noteHashCounter: number, _encryptedNote: Buffer, _counter: number): void {
184
197
  throw new OracleMethodNotAvailableError('emitEncryptedNoteLog');
185
198
  }
186
199
 
187
- computeEncryptedLog(
200
+ computeEncryptedEventLog(
201
+ _contractAddress: AztecAddress,
202
+ _randomness: Fr,
203
+ _eventTypeId: Fr,
204
+ _ovKeys: KeyValidationRequest,
205
+ _ivpkM: PublicKey,
206
+ _preimage: Fr[],
207
+ ): Buffer {
208
+ throw new OracleMethodNotAvailableError('computeEncryptedEventLog');
209
+ }
210
+
211
+ computeEncryptedNoteLog(
188
212
  _contractAddress: AztecAddress,
189
213
  _storageSlot: Fr,
190
214
  _noteTypeId: Fr,
191
- _publicKey: PublicKey,
215
+ _ovKeys: KeyValidationRequest,
216
+ _ivpkM: PublicKey,
192
217
  _preimage: Fr[],
193
218
  ): Buffer {
194
- throw new OracleMethodNotAvailableError('computeEncryptedLog');
219
+ throw new OracleMethodNotAvailableError('computeEncryptedNoteLog');
195
220
  }
196
221
 
197
222
  emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
@@ -55,7 +55,7 @@ export function toACVMField(
55
55
  export function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): ACVMField[] {
56
56
  const fields = [
57
57
  item.contractAddress.toField(),
58
- ...item.functionData.toFields(),
58
+ item.functionSelector.toField(),
59
59
  ...item.callContext.toFields(),
60
60
  item.getArgsHash(),
61
61
  ];
@@ -49,93 +49,88 @@ export const EmptyGas: Gas = {
49
49
  /** Dimensions of gas usage: L1, L2, and DA. */
50
50
  export const GasDimensions = ['l2Gas', 'daGas'] as const;
51
51
 
52
- /** Null object to represent a gas cost that's dynamic instead of fixed for a given instruction. */
53
- export const DynamicGasCost = Symbol('DynamicGasCost');
54
-
55
- /** Temporary default gas cost. We should eventually remove all usage of this variable in favor of actual gas for each opcode. */
56
- const TemporaryDefaultGasCost = { l2Gas: 10, daGas: 0 };
52
+ /** Default gas cost for an opcode. */
53
+ const DefaultBaseGasCost: Gas = { l2Gas: 10, daGas: 0 };
57
54
 
58
55
  /** Base gas costs for each instruction. Additional gas cost may be added on top due to memory or storage accesses, etc. */
59
- export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
60
- [Opcode.ADD]: TemporaryDefaultGasCost,
61
- [Opcode.SUB]: TemporaryDefaultGasCost,
62
- [Opcode.MUL]: TemporaryDefaultGasCost,
63
- [Opcode.DIV]: TemporaryDefaultGasCost,
64
- [Opcode.FDIV]: TemporaryDefaultGasCost,
65
- [Opcode.EQ]: TemporaryDefaultGasCost,
66
- [Opcode.LT]: TemporaryDefaultGasCost,
67
- [Opcode.LTE]: TemporaryDefaultGasCost,
68
- [Opcode.AND]: TemporaryDefaultGasCost,
69
- [Opcode.OR]: TemporaryDefaultGasCost,
70
- [Opcode.XOR]: TemporaryDefaultGasCost,
71
- [Opcode.NOT]: TemporaryDefaultGasCost,
72
- [Opcode.SHL]: TemporaryDefaultGasCost,
73
- [Opcode.SHR]: TemporaryDefaultGasCost,
74
- [Opcode.CAST]: TemporaryDefaultGasCost,
56
+ const BaseGasCosts: Record<Opcode, Gas> = {
57
+ [Opcode.ADD]: DefaultBaseGasCost,
58
+ [Opcode.SUB]: DefaultBaseGasCost,
59
+ [Opcode.MUL]: DefaultBaseGasCost,
60
+ [Opcode.DIV]: DefaultBaseGasCost,
61
+ [Opcode.FDIV]: DefaultBaseGasCost,
62
+ [Opcode.EQ]: DefaultBaseGasCost,
63
+ [Opcode.LT]: DefaultBaseGasCost,
64
+ [Opcode.LTE]: DefaultBaseGasCost,
65
+ [Opcode.AND]: DefaultBaseGasCost,
66
+ [Opcode.OR]: DefaultBaseGasCost,
67
+ [Opcode.XOR]: DefaultBaseGasCost,
68
+ [Opcode.NOT]: DefaultBaseGasCost,
69
+ [Opcode.SHL]: DefaultBaseGasCost,
70
+ [Opcode.SHR]: DefaultBaseGasCost,
71
+ [Opcode.CAST]: DefaultBaseGasCost,
75
72
  // Execution environment
76
- [Opcode.ADDRESS]: TemporaryDefaultGasCost,
77
- [Opcode.STORAGEADDRESS]: TemporaryDefaultGasCost,
78
- [Opcode.SENDER]: TemporaryDefaultGasCost,
79
- [Opcode.FEEPERL2GAS]: TemporaryDefaultGasCost,
80
- [Opcode.FEEPERDAGAS]: TemporaryDefaultGasCost,
81
- [Opcode.TRANSACTIONFEE]: TemporaryDefaultGasCost,
82
- [Opcode.CONTRACTCALLDEPTH]: TemporaryDefaultGasCost,
83
- [Opcode.CHAINID]: TemporaryDefaultGasCost,
84
- [Opcode.VERSION]: TemporaryDefaultGasCost,
85
- [Opcode.BLOCKNUMBER]: TemporaryDefaultGasCost,
86
- [Opcode.TIMESTAMP]: TemporaryDefaultGasCost,
87
- [Opcode.COINBASE]: TemporaryDefaultGasCost,
88
- [Opcode.BLOCKL2GASLIMIT]: TemporaryDefaultGasCost,
89
- [Opcode.BLOCKDAGASLIMIT]: TemporaryDefaultGasCost,
90
- [Opcode.CALLDATACOPY]: TemporaryDefaultGasCost,
73
+ [Opcode.ADDRESS]: DefaultBaseGasCost,
74
+ [Opcode.STORAGEADDRESS]: DefaultBaseGasCost,
75
+ [Opcode.SENDER]: DefaultBaseGasCost,
76
+ [Opcode.FEEPERL2GAS]: DefaultBaseGasCost,
77
+ [Opcode.FEEPERDAGAS]: DefaultBaseGasCost,
78
+ [Opcode.TRANSACTIONFEE]: DefaultBaseGasCost,
79
+ [Opcode.CONTRACTCALLDEPTH]: DefaultBaseGasCost,
80
+ [Opcode.CHAINID]: DefaultBaseGasCost,
81
+ [Opcode.VERSION]: DefaultBaseGasCost,
82
+ [Opcode.BLOCKNUMBER]: DefaultBaseGasCost,
83
+ [Opcode.TIMESTAMP]: DefaultBaseGasCost,
84
+ [Opcode.COINBASE]: DefaultBaseGasCost,
85
+ [Opcode.BLOCKL2GASLIMIT]: DefaultBaseGasCost,
86
+ [Opcode.BLOCKDAGASLIMIT]: DefaultBaseGasCost,
87
+ [Opcode.CALLDATACOPY]: DefaultBaseGasCost,
91
88
  // Gas
92
- [Opcode.L2GASLEFT]: TemporaryDefaultGasCost,
93
- [Opcode.DAGASLEFT]: TemporaryDefaultGasCost,
89
+ [Opcode.L2GASLEFT]: DefaultBaseGasCost,
90
+ [Opcode.DAGASLEFT]: DefaultBaseGasCost,
94
91
  // Control flow
95
- [Opcode.JUMP]: TemporaryDefaultGasCost,
96
- [Opcode.JUMPI]: TemporaryDefaultGasCost,
97
- [Opcode.INTERNALCALL]: TemporaryDefaultGasCost,
98
- [Opcode.INTERNALRETURN]: TemporaryDefaultGasCost,
92
+ [Opcode.JUMP]: DefaultBaseGasCost,
93
+ [Opcode.JUMPI]: DefaultBaseGasCost,
94
+ [Opcode.INTERNALCALL]: DefaultBaseGasCost,
95
+ [Opcode.INTERNALRETURN]: DefaultBaseGasCost,
99
96
  // Memory
100
- [Opcode.SET]: TemporaryDefaultGasCost,
101
- [Opcode.MOV]: TemporaryDefaultGasCost,
102
- [Opcode.CMOV]: TemporaryDefaultGasCost,
97
+ [Opcode.SET]: DefaultBaseGasCost,
98
+ [Opcode.MOV]: DefaultBaseGasCost,
99
+ [Opcode.CMOV]: DefaultBaseGasCost,
103
100
  // World state
104
- [Opcode.SLOAD]: TemporaryDefaultGasCost,
105
- [Opcode.SSTORE]: TemporaryDefaultGasCost,
106
- [Opcode.NOTEHASHEXISTS]: TemporaryDefaultGasCost,
107
- [Opcode.EMITNOTEHASH]: TemporaryDefaultGasCost,
108
- [Opcode.NULLIFIEREXISTS]: TemporaryDefaultGasCost,
109
- [Opcode.EMITNULLIFIER]: TemporaryDefaultGasCost,
110
- [Opcode.L1TOL2MSGEXISTS]: TemporaryDefaultGasCost,
111
- [Opcode.HEADERMEMBER]: TemporaryDefaultGasCost,
112
- [Opcode.EMITUNENCRYPTEDLOG]: TemporaryDefaultGasCost,
113
- [Opcode.SENDL2TOL1MSG]: TemporaryDefaultGasCost,
114
- [Opcode.GETCONTRACTINSTANCE]: TemporaryDefaultGasCost,
101
+ [Opcode.SLOAD]: DefaultBaseGasCost,
102
+ [Opcode.SSTORE]: DefaultBaseGasCost,
103
+ [Opcode.NOTEHASHEXISTS]: DefaultBaseGasCost,
104
+ [Opcode.EMITNOTEHASH]: DefaultBaseGasCost,
105
+ [Opcode.NULLIFIEREXISTS]: DefaultBaseGasCost,
106
+ [Opcode.EMITNULLIFIER]: DefaultBaseGasCost,
107
+ [Opcode.L1TOL2MSGEXISTS]: DefaultBaseGasCost,
108
+ [Opcode.HEADERMEMBER]: DefaultBaseGasCost,
109
+ [Opcode.EMITUNENCRYPTEDLOG]: DefaultBaseGasCost,
110
+ [Opcode.SENDL2TOL1MSG]: DefaultBaseGasCost,
111
+ [Opcode.GETCONTRACTINSTANCE]: DefaultBaseGasCost,
115
112
  // External calls
116
- [Opcode.CALL]: TemporaryDefaultGasCost,
117
- [Opcode.STATICCALL]: TemporaryDefaultGasCost,
118
- [Opcode.DELEGATECALL]: TemporaryDefaultGasCost,
119
- [Opcode.RETURN]: TemporaryDefaultGasCost,
120
- [Opcode.REVERT]: TemporaryDefaultGasCost,
113
+ [Opcode.CALL]: DefaultBaseGasCost,
114
+ [Opcode.STATICCALL]: DefaultBaseGasCost,
115
+ [Opcode.DELEGATECALL]: DefaultBaseGasCost,
116
+ [Opcode.RETURN]: DefaultBaseGasCost,
117
+ [Opcode.REVERT]: DefaultBaseGasCost,
121
118
  // Misc
122
- [Opcode.DEBUGLOG]: TemporaryDefaultGasCost,
119
+ [Opcode.DEBUGLOG]: DefaultBaseGasCost,
123
120
  // Gadgets
124
- [Opcode.KECCAK]: TemporaryDefaultGasCost,
125
- [Opcode.POSEIDON2]: TemporaryDefaultGasCost,
126
- [Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
127
- [Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
121
+ [Opcode.KECCAK]: DefaultBaseGasCost,
122
+ [Opcode.POSEIDON2]: DefaultBaseGasCost,
123
+ [Opcode.SHA256]: DefaultBaseGasCost,
124
+ [Opcode.PEDERSEN]: DefaultBaseGasCost,
125
+ [Opcode.ECADD]: DefaultBaseGasCost,
126
+ [Opcode.MSM]: DefaultBaseGasCost,
128
127
  // Conversions
129
- [Opcode.TORADIXLE]: TemporaryDefaultGasCost,
128
+ [Opcode.TORADIXLE]: DefaultBaseGasCost,
130
129
  };
131
130
 
132
- /** Returns the fixed base gas cost for a given opcode, or throws if set to dynamic. */
131
+ /** Returns the fixed base gas cost for a given opcode. */
133
132
  export function getBaseGasCost(opcode: Opcode): Gas {
134
- const cost = GasCosts[opcode];
135
- if (cost === DynamicGasCost) {
136
- throw new Error(`Opcode ${Opcode[opcode]} has dynamic gas cost`);
137
- }
138
- return cost;
133
+ return BaseGasCosts[opcode];
139
134
  }
140
135
 
141
136
  /** Returns the gas cost associated with the memory operations performed. */
@@ -298,9 +298,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
298
298
  }
299
299
 
300
300
  public checkIsValidMemoryOffsetTag(offset: number) {
301
- if (this.getTag(offset) > TypeTag.UINT64) {
302
- throw TagCheckError.forOffset(offset, TypeTag[this.getTag(offset)], 'UINT64');
303
- }
301
+ this.checkTag(TypeTag.UINT32, offset);
304
302
  }
305
303
 
306
304
  public static checkIsIntegralTag(tag: TypeTag) {
@@ -17,6 +17,7 @@ import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
17
17
 
18
18
  export class AvmSimulator {
19
19
  private log: DebugLogger;
20
+ private bytecode: Buffer | undefined;
20
21
 
21
22
  constructor(private context: AvmContext) {
22
23
  this.log = createDebugLogger(
@@ -43,6 +44,13 @@ export class AvmSimulator {
43
44
  return await this.executeBytecode(bytecode);
44
45
  }
45
46
 
47
+ /**
48
+ * Return the bytecode used for execution, if any.
49
+ */
50
+ public getBytecode(): Buffer | undefined {
51
+ return this.bytecode;
52
+ }
53
+
46
54
  /**
47
55
  * Executes the provided bytecode in the current context.
48
56
  * This method is useful for testing and debugging.
@@ -51,6 +59,7 @@ export class AvmSimulator {
51
59
  const decompressedBytecode = await decompressBytecodeIfCompressed(bytecode);
52
60
  assert(isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
53
61
 
62
+ this.bytecode = decompressedBytecode;
54
63
  return await this.executeInstructions(decodeFromBytecode(decompressedBytecode));
55
64
  }
56
65
 
@@ -3,7 +3,10 @@ import { FunctionSelector } from '@aztec/foundation/abi';
3
3
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
+ import { AvmTestContractArtifact } from '@aztec/noir-contracts.js';
7
+ import { SerializableContractInstance } from '@aztec/types/contracts';
6
8
 
9
+ import { strict as assert } from 'assert';
7
10
  import { mock } from 'jest-mock-extended';
8
11
  import merge from 'lodash.merge';
9
12
 
@@ -14,6 +17,7 @@ import { AvmMachineState } from '../avm_machine_state.js';
14
17
  import { Field, Uint8 } from '../avm_memory_types.js';
15
18
  import { HostStorage } from '../journal/host_storage.js';
16
19
  import { AvmPersistableStateManager } from '../journal/journal.js';
20
+ import { type TracedContractInstance } from '../journal/trace_types.js';
17
21
 
18
22
  /**
19
23
  * Create a new AVM context with default values.
@@ -125,3 +129,23 @@ export function randomMemoryBytes(length: number): Uint8[] {
125
129
  export function randomMemoryFields(length: number): Field[] {
126
130
  return [...Array(length)].map(_ => new Field(Fr.random()));
127
131
  }
132
+
133
+ export function getAvmTestContractBytecode(functionName: string): Buffer {
134
+ const artifact = AvmTestContractArtifact.functions.find(f => f.name === functionName)!;
135
+ assert(
136
+ !!artifact?.bytecode,
137
+ `No bytecode found for function ${functionName}. Try re-running bootstrap.sh on the repository root.`,
138
+ );
139
+ return artifact.bytecode;
140
+ }
141
+
142
+ export function randomTracedContractInstance(): TracedContractInstance {
143
+ const instance = SerializableContractInstance.random();
144
+ const address = AztecAddress.random();
145
+ return { exists: true, ...instance, address };
146
+ }
147
+
148
+ export function emptyTracedContractInstance(withAddress?: AztecAddress): TracedContractInstance {
149
+ const instance = SerializableContractInstance.empty().withAddress(withAddress ?? AztecAddress.zero());
150
+ return { exists: false, ...instance };
151
+ }
@@ -0,0 +1 @@
1
+ export * from './avm_simulator.js';
@@ -1,4 +1,4 @@
1
- import { type CommitmentsDB, type PublicContractsDB, type PublicStateDB } from '../../public/db.js';
1
+ import { type CommitmentsDB, type PublicContractsDB, type PublicStateDB } from '../../public/db_interfaces.js';
2
2
 
3
3
  /**
4
4
  * Host storage
@@ -14,6 +14,7 @@ import {
14
14
  import { EventSelector } from '@aztec/foundation/abi';
15
15
  import { Fr } from '@aztec/foundation/fields';
16
16
  import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
17
+ import { SerializableContractInstance } from '@aztec/types/contracts';
17
18
 
18
19
  import { type PublicExecutionResult } from '../../index.js';
19
20
  import { type HostStorage } from './host_storage.js';
@@ -21,6 +22,7 @@ import { Nullifiers } from './nullifiers.js';
21
22
  import { PublicStorage } from './public_storage.js';
22
23
  import { WorldStateAccessTrace } from './trace.js';
23
24
  import {
25
+ type TracedContractInstance,
24
26
  type TracedL1toL2MessageCheck,
25
27
  type TracedNoteHash,
26
28
  type TracedNoteHashCheck,
@@ -55,9 +57,11 @@ export type JournalData = {
55
57
  };
56
58
 
57
59
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
58
- type PartialPublicExecutionResult = {
60
+ export type PartialPublicExecutionResult = {
61
+ noteHashReadRequests: ReadRequest[];
59
62
  nullifierReadRequests: ReadRequest[];
60
63
  nullifierNonExistentReadRequests: ReadRequest[];
64
+ l1ToL2MsgReadRequests: ReadRequest[];
61
65
  newNoteHashes: NoteHash[];
62
66
  newL2ToL1Messages: L2ToL1Message[];
63
67
  startSideEffectCounter: number;
@@ -108,8 +112,10 @@ export class AvmPersistableStateManager {
108
112
  this.trace = new WorldStateAccessTrace(parent?.trace);
109
113
 
110
114
  this.transitionalExecutionResult = {
115
+ noteHashReadRequests: [],
111
116
  nullifierReadRequests: [],
112
117
  nullifierNonExistentReadRequests: [],
118
+ l1ToL2MsgReadRequests: [],
113
119
  newNoteHashes: [],
114
120
  newL2ToL1Messages: [],
115
121
  startSideEffectCounter: this.trace.accessCounter,
@@ -143,15 +149,6 @@ export class AvmPersistableStateManager {
143
149
  this.publicStorage.write(storageAddress, slot, value);
144
150
 
145
151
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
146
- // The current info to the kernel clears any previous read or write request.
147
- this.transitionalExecutionResult.contractStorageReads =
148
- this.transitionalExecutionResult.contractStorageReads.filter(
149
- read => !read.storageSlot.equals(slot) || !read.contractAddress!.equals(storageAddress),
150
- );
151
- this.transitionalExecutionResult.contractStorageUpdateRequests =
152
- this.transitionalExecutionResult.contractStorageUpdateRequests.filter(
153
- update => !update.storageSlot.equals(slot) || !update.contractAddress!.equals(storageAddress),
154
- );
155
152
  this.transitionalExecutionResult.contractStorageUpdateRequests.push(
156
153
  new ContractStorageUpdateRequest(slot, value, this.trace.accessCounter, storageAddress),
157
154
  );
@@ -174,17 +171,9 @@ export class AvmPersistableStateManager {
174
171
  );
175
172
 
176
173
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
177
- // The current info to the kernel kernel does not consider cached reads.
178
- if (!cached) {
179
- // The current info to the kernel removes any previous reads to the same slot.
180
- this.transitionalExecutionResult.contractStorageReads =
181
- this.transitionalExecutionResult.contractStorageReads.filter(
182
- read => !read.storageSlot.equals(slot) || !read.contractAddress!.equals(storageAddress),
183
- );
184
- this.transitionalExecutionResult.contractStorageReads.push(
185
- new ContractStorageRead(slot, value, this.trace.accessCounter, storageAddress),
186
- );
187
- }
174
+ this.transitionalExecutionResult.contractStorageReads.push(
175
+ new ContractStorageRead(slot, value, this.trace.accessCounter, storageAddress),
176
+ );
188
177
 
189
178
  // We want to keep track of all performed reads (even reverted ones)
190
179
  this.trace.tracePublicStorageRead(storageAddress, slot, value, exists, cached);
@@ -204,6 +193,10 @@ export class AvmPersistableStateManager {
204
193
  const gotLeafIndex = await this.hostStorage.commitmentsDb.getCommitmentIndex(noteHash);
205
194
  const exists = gotLeafIndex === leafIndex.toBigInt();
206
195
  this.log.debug(`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex}, exists: ${exists}.`);
196
+
197
+ // TODO: include exists here also - This can for sure come from the trace???
198
+ this.transitionalExecutionResult.noteHashReadRequests.push(new ReadRequest(noteHash, this.trace.accessCounter));
199
+
207
200
  this.trace.traceNoteHashCheck(storageAddress, noteHash, exists, leafIndex);
208
201
  return Promise.resolve(exists);
209
202
  }
@@ -275,6 +268,9 @@ export class AvmPersistableStateManager {
275
268
  this.log.debug(
276
269
  `l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
277
270
  );
271
+
272
+ this.transitionalExecutionResult.l1ToL2MsgReadRequests.push(new ReadRequest(msgHash, this.trace.accessCounter));
273
+
278
274
  this.trace.traceL1ToL2MessageCheck(msgHash, msgLeafIndex, exists);
279
275
  return Promise.resolve(exists);
280
276
  }
@@ -308,7 +304,8 @@ export class AvmPersistableStateManager {
308
304
  this.transitionalExecutionResult.allUnencryptedLogs.push(ulog);
309
305
  // this duplicates exactly what happens in the trace just for the purpose of transitional integration with the kernel
310
306
  this.transitionalExecutionResult.unencryptedLogsHashes.push(
311
- new LogHash(logHash, this.trace.accessCounter, new Fr(ulog.length)),
307
+ // TODO(6578): explain magic number 4 here
308
+ new LogHash(logHash, this.trace.accessCounter, new Fr(ulog.length + 4)),
312
309
  );
313
310
  // TODO(6206): likely need to track this here and not just in the transitional logic.
314
311
 
@@ -317,6 +314,19 @@ export class AvmPersistableStateManager {
317
314
  this.trace.traceNewLog(logHash);
318
315
  }
319
316
 
317
+ public async getContractInstance(contractAddress: Fr): Promise<TracedContractInstance> {
318
+ let exists = true;
319
+ const aztecAddress = AztecAddress.fromField(contractAddress);
320
+ let instance = await this.hostStorage.contractsDb.getContractInstance(aztecAddress);
321
+ if (instance === undefined) {
322
+ instance = SerializableContractInstance.empty().withAddress(aztecAddress);
323
+ exists = false;
324
+ }
325
+ const tracedInstance = { ...instance, exists };
326
+ this.trace.traceGetContractInstance(tracedInstance);
327
+ return Promise.resolve(tracedInstance);
328
+ }
329
+
320
330
  /**
321
331
  * Accept nested world state modifications, merging in its trace and accrued substate
322
332
  */
@@ -1,6 +1,7 @@
1
1
  import { Fr } from '@aztec/foundation/fields';
2
2
 
3
3
  import {
4
+ type TracedContractInstance,
4
5
  type TracedL1toL2MessageCheck,
5
6
  type TracedNoteHash,
6
7
  type TracedNoteHashCheck,
@@ -23,6 +24,7 @@ export class WorldStateAccessTrace {
23
24
  public newNullifiers: TracedNullifier[] = [];
24
25
  public l1ToL2MessageChecks: TracedL1toL2MessageCheck[] = [];
25
26
  public newLogsHashes: TracedUnencryptedL2Log[] = [];
27
+ public gotContractInstances: TracedContractInstance[] = [];
26
28
 
27
29
  //public contractCalls: TracedContractCall[] = [];
28
30
  //public archiveChecks: TracedArchiveLeafCheck[] = [];
@@ -131,6 +133,7 @@ export class WorldStateAccessTrace {
131
133
  leafIndex: msgLeafIndex,
132
134
  msgHash: msgHash,
133
135
  exists: exists,
136
+ counter: new Fr(this.accessCounter),
134
137
  //endLifetime: Fr.ZERO, // FIXME
135
138
  };
136
139
  this.l1ToL2MessageChecks.push(traced);
@@ -146,6 +149,11 @@ export class WorldStateAccessTrace {
146
149
  this.incrementAccessCounter();
147
150
  }
148
151
 
152
+ public traceGetContractInstance(instance: TracedContractInstance) {
153
+ this.gotContractInstances.push(instance);
154
+ this.incrementAccessCounter();
155
+ }
156
+
149
157
  private incrementAccessCounter() {
150
158
  this.accessCounter++;
151
159
  }
@@ -166,6 +174,7 @@ export class WorldStateAccessTrace {
166
174
  this.newNullifiers.push(...incomingTrace.newNullifiers);
167
175
  this.l1ToL2MessageChecks.push(...incomingTrace.l1ToL2MessageChecks);
168
176
  this.newLogsHashes.push(...incomingTrace.newLogsHashes);
177
+ this.gotContractInstances.push(...incomingTrace.gotContractInstances);
169
178
  // it is assumed that the incoming trace was initialized with this as parent, so accept counter
170
179
  this.accessCounter = incomingTrace.accessCounter;
171
180
  }
@@ -1,4 +1,5 @@
1
1
  import { type Fr } from '@aztec/foundation/fields';
2
+ import { type ContractInstanceWithAddress } from '@aztec/types/contracts';
2
3
 
3
4
  //export type TracedContractCall = {
4
5
  // callPointer: Fr;
@@ -71,6 +72,7 @@ export type TracedL1toL2MessageCheck = {
71
72
  leafIndex: Fr;
72
73
  msgHash: Fr;
73
74
  exists: boolean;
75
+ counter: Fr;
74
76
  //endLifetime: Fr;
75
77
  };
76
78
 
@@ -85,3 +87,5 @@ export type TracedUnencryptedL2Log = {
85
87
  // leafIndex: Fr;
86
88
  // leaf: Fr;
87
89
  //};
90
+
91
+ export type TracedContractInstance = { exists: boolean } & ContractInstanceWithAddress;