@aztec/simulator 0.37.0 → 0.39.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 (181) hide show
  1. package/dest/acvm/acvm.d.ts +1 -1
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +2 -2
  4. package/dest/acvm/oracle/oracle.d.ts +6 -5
  5. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/oracle.js +26 -30
  7. package/dest/acvm/oracle/typed_oracle.d.ts +5 -5
  8. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/typed_oracle.js +9 -9
  10. package/dest/avm/avm_execution_environment.d.ts +4 -3
  11. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  12. package/dest/avm/avm_execution_environment.js +17 -11
  13. package/dest/avm/avm_gas.d.ts.map +1 -1
  14. package/dest/avm/avm_gas.js +4 -1
  15. package/dest/avm/avm_machine_state.d.ts +5 -8
  16. package/dest/avm/avm_machine_state.d.ts.map +1 -1
  17. package/dest/avm/avm_machine_state.js +10 -22
  18. package/dest/avm/avm_memory_types.d.ts +1 -1
  19. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  20. package/dest/avm/avm_message_call_result.d.ts +5 -8
  21. package/dest/avm/avm_message_call_result.d.ts.map +1 -1
  22. package/dest/avm/avm_message_call_result.js +1 -4
  23. package/dest/avm/avm_simulator.d.ts.map +1 -1
  24. package/dest/avm/avm_simulator.js +19 -13
  25. package/dest/avm/errors.d.ts +43 -2
  26. package/dest/avm/errors.d.ts.map +1 -1
  27. package/dest/avm/errors.js +86 -4
  28. package/dest/avm/journal/journal.d.ts +20 -1
  29. package/dest/avm/journal/journal.d.ts.map +1 -1
  30. package/dest/avm/journal/journal.js +70 -9
  31. package/dest/avm/journal/nullifiers.d.ts +3 -1
  32. package/dest/avm/journal/nullifiers.d.ts.map +1 -1
  33. package/dest/avm/journal/nullifiers.js +14 -6
  34. package/dest/avm/journal/public_storage.d.ts +10 -1
  35. package/dest/avm/journal/public_storage.d.ts.map +1 -1
  36. package/dest/avm/journal/public_storage.js +17 -2
  37. package/dest/avm/journal/trace.d.ts +1 -4
  38. package/dest/avm/journal/trace.d.ts.map +1 -1
  39. package/dest/avm/journal/trace.js +4 -5
  40. package/dest/avm/journal/trace_types.d.ts +1 -0
  41. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  42. package/dest/avm/journal/trace_types.js +1 -1
  43. package/dest/avm/opcodes/bitwise.d.ts +4 -1
  44. package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
  45. package/dest/avm/opcodes/bitwise.js +14 -2
  46. package/dest/avm/opcodes/conversion.d.ts +16 -0
  47. package/dest/avm/opcodes/conversion.d.ts.map +1 -0
  48. package/dest/avm/opcodes/conversion.js +48 -0
  49. package/dest/avm/opcodes/environment_getters.d.ts +16 -12
  50. package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
  51. package/dest/avm/opcodes/environment_getters.js +19 -48
  52. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  53. package/dest/avm/opcodes/external_calls.js +24 -13
  54. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  55. package/dest/avm/serialization/bytecode_serialization.js +6 -2
  56. package/dest/avm/serialization/instruction_serialization.d.ts +40 -38
  57. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  58. package/dest/avm/serialization/instruction_serialization.js +42 -39
  59. package/dest/client/client_execution_context.d.ts +59 -19
  60. package/dest/client/client_execution_context.d.ts.map +1 -1
  61. package/dest/client/client_execution_context.js +97 -45
  62. package/dest/client/db_oracle.d.ts +4 -11
  63. package/dest/client/db_oracle.d.ts.map +1 -1
  64. package/dest/client/execution_result.d.ts +22 -15
  65. package/dest/client/execution_result.d.ts.map +1 -1
  66. package/dest/client/execution_result.js +59 -13
  67. package/dest/client/logs_cache.d.ts +33 -0
  68. package/dest/client/logs_cache.d.ts.map +1 -0
  69. package/dest/client/logs_cache.js +59 -0
  70. package/dest/client/private_execution.d.ts +2 -2
  71. package/dest/client/private_execution.d.ts.map +1 -1
  72. package/dest/client/private_execution.js +5 -7
  73. package/dest/client/simulator.d.ts +4 -34
  74. package/dest/client/simulator.d.ts.map +1 -1
  75. package/dest/client/simulator.js +5 -43
  76. package/dest/client/unconstrained_execution.d.ts +2 -2
  77. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  78. package/dest/client/unconstrained_execution.js +1 -1
  79. package/dest/client/view_data_oracle.d.ts +0 -7
  80. package/dest/client/view_data_oracle.d.ts.map +1 -1
  81. package/dest/client/view_data_oracle.js +1 -10
  82. package/dest/common/errors.d.ts +5 -0
  83. package/dest/common/errors.d.ts.map +1 -1
  84. package/dest/common/errors.js +6 -1
  85. package/dest/index.d.ts +1 -0
  86. package/dest/index.d.ts.map +1 -1
  87. package/dest/index.js +2 -1
  88. package/dest/mocks/fixtures.d.ts.map +1 -1
  89. package/dest/mocks/fixtures.js +3 -1
  90. package/dest/public/abstract_phase_manager.d.ts +10 -4
  91. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  92. package/dest/public/abstract_phase_manager.js +50 -19
  93. package/dest/public/app_logic_phase_manager.d.ts +1 -0
  94. package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
  95. package/dest/public/app_logic_phase_manager.js +3 -3
  96. package/dest/public/execution.d.ts +9 -0
  97. package/dest/public/execution.d.ts.map +1 -1
  98. package/dest/public/execution.js +1 -1
  99. package/dest/public/executor.d.ts +2 -2
  100. package/dest/public/executor.d.ts.map +1 -1
  101. package/dest/public/executor.js +34 -17
  102. package/dest/public/hints_builder.d.ts +3 -3
  103. package/dest/public/hints_builder.d.ts.map +1 -1
  104. package/dest/public/hints_builder.js +3 -3
  105. package/dest/public/public_execution_context.d.ts +10 -4
  106. package/dest/public/public_execution_context.d.ts.map +1 -1
  107. package/dest/public/public_execution_context.js +19 -6
  108. package/dest/public/public_processor.d.ts.map +1 -1
  109. package/dest/public/public_processor.js +5 -3
  110. package/dest/public/setup_phase_manager.d.ts +1 -0
  111. package/dest/public/setup_phase_manager.d.ts.map +1 -1
  112. package/dest/public/setup_phase_manager.js +3 -2
  113. package/dest/public/tail_phase_manager.d.ts +1 -1
  114. package/dest/public/tail_phase_manager.d.ts.map +1 -1
  115. package/dest/public/tail_phase_manager.js +4 -26
  116. package/dest/public/teardown_phase_manager.d.ts +1 -0
  117. package/dest/public/teardown_phase_manager.d.ts.map +1 -1
  118. package/dest/public/teardown_phase_manager.js +3 -2
  119. package/dest/public/transitional_adaptors.d.ts +4 -17
  120. package/dest/public/transitional_adaptors.d.ts.map +1 -1
  121. package/dest/public/transitional_adaptors.js +27 -119
  122. package/dest/rollup/index.d.ts +2 -0
  123. package/dest/rollup/index.d.ts.map +1 -0
  124. package/dest/rollup/index.js +2 -0
  125. package/dest/rollup/rollup.d.ts +77 -0
  126. package/dest/rollup/rollup.d.ts.map +1 -0
  127. package/dest/rollup/rollup.js +78 -0
  128. package/dest/stats/index.d.ts +2 -0
  129. package/dest/stats/index.d.ts.map +1 -0
  130. package/dest/stats/index.js +2 -0
  131. package/dest/stats/stats.d.ts +4 -0
  132. package/dest/stats/stats.d.ts.map +1 -0
  133. package/dest/stats/stats.js +11 -0
  134. package/package.json +8 -8
  135. package/src/acvm/acvm.ts +2 -2
  136. package/src/acvm/oracle/oracle.ts +62 -36
  137. package/src/acvm/oracle/typed_oracle.ts +19 -11
  138. package/src/avm/avm_execution_environment.ts +34 -42
  139. package/src/avm/avm_gas.ts +3 -0
  140. package/src/avm/avm_machine_state.ts +14 -25
  141. package/src/avm/avm_memory_types.ts +1 -1
  142. package/src/avm/avm_message_call_result.ts +3 -14
  143. package/src/avm/avm_simulator.ts +24 -12
  144. package/src/avm/errors.ts +94 -4
  145. package/src/avm/journal/journal.ts +134 -9
  146. package/src/avm/journal/nullifiers.ts +19 -8
  147. package/src/avm/journal/public_storage.ts +23 -2
  148. package/src/avm/journal/trace.ts +3 -4
  149. package/src/avm/journal/trace_types.ts +1 -0
  150. package/src/avm/opcodes/bitwise.ts +18 -7
  151. package/src/avm/opcodes/conversion.ts +59 -0
  152. package/src/avm/opcodes/environment_getters.ts +21 -65
  153. package/src/avm/opcodes/external_calls.ts +32 -16
  154. package/src/avm/serialization/bytecode_serialization.ts +5 -0
  155. package/src/avm/serialization/instruction_serialization.ts +3 -0
  156. package/src/client/client_execution_context.ts +142 -46
  157. package/src/client/db_oracle.ts +4 -18
  158. package/src/client/execution_result.ts +75 -25
  159. package/src/client/logs_cache.ts +65 -0
  160. package/src/client/private_execution.ts +6 -10
  161. package/src/client/simulator.ts +8 -84
  162. package/src/client/unconstrained_execution.ts +2 -2
  163. package/src/client/view_data_oracle.ts +0 -10
  164. package/src/common/errors.ts +5 -0
  165. package/src/index.ts +1 -0
  166. package/src/mocks/fixtures.ts +2 -0
  167. package/src/public/abstract_phase_manager.ts +59 -23
  168. package/src/public/app_logic_phase_manager.ts +2 -1
  169. package/src/public/execution.ts +9 -0
  170. package/src/public/executor.ts +47 -14
  171. package/src/public/hints_builder.ts +5 -5
  172. package/src/public/public_execution_context.ts +18 -4
  173. package/src/public/public_processor.ts +8 -2
  174. package/src/public/setup_phase_manager.ts +16 -8
  175. package/src/public/tail_phase_manager.ts +8 -35
  176. package/src/public/teardown_phase_manager.ts +16 -8
  177. package/src/public/transitional_adaptors.ts +39 -177
  178. package/src/rollup/index.ts +1 -0
  179. package/src/rollup/rollup.ts +160 -0
  180. package/src/stats/index.ts +1 -0
  181. package/src/stats/stats.ts +20 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -45,13 +45,13 @@
45
45
  ]
46
46
  },
47
47
  "dependencies": {
48
- "@aztec/circuit-types": "0.37.0",
49
- "@aztec/circuits.js": "0.37.0",
50
- "@aztec/foundation": "0.37.0",
51
- "@aztec/noir-protocol-circuits-types": "0.37.0",
52
- "@aztec/protocol-contracts": "0.37.0",
53
- "@aztec/types": "0.37.0",
54
- "@aztec/world-state": "0.37.0",
48
+ "@aztec/circuit-types": "0.39.0",
49
+ "@aztec/circuits.js": "0.39.0",
50
+ "@aztec/foundation": "0.39.0",
51
+ "@aztec/noir-protocol-circuits-types": "0.39.0",
52
+ "@aztec/protocol-contracts": "0.39.0",
53
+ "@aztec/types": "0.39.0",
54
+ "@aztec/world-state": "0.39.0",
55
55
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
56
56
  "@noir-lang/types": "portal:../../noir/packages/types",
57
57
  "levelup": "^5.1.1",
package/src/acvm/acvm.ts CHANGED
@@ -19,7 +19,7 @@ import { type ORACLE_NAMES } from './oracle/index.js';
19
19
  */
20
20
  type ACIRCallback = Record<
21
21
  ORACLE_NAMES,
22
- (...args: ForeignCallInput[]) => ForeignCallOutput | Promise<ForeignCallOutput>
22
+ (...args: ForeignCallInput[]) => void | ForeignCallOutput | Promise<ForeignCallOutput>
23
23
  >;
24
24
 
25
25
  /**
@@ -105,7 +105,7 @@ export async function acvm(
105
105
  }
106
106
 
107
107
  const result = await oracleFunction.call(callback, ...args);
108
- return [result];
108
+ return typeof result === 'undefined' ? [] : [result];
109
109
  } catch (err) {
110
110
  let typedError: Error;
111
111
  if (err instanceof Error) {
@@ -1,5 +1,5 @@
1
1
  import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
- import { type PartialAddress, acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
2
+ import { acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
3
3
  import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
5
5
  import { Fr, Point } from '@aztec/foundation/fields';
@@ -53,14 +53,6 @@ export class Oracle {
53
53
  ];
54
54
  }
55
55
 
56
- // TODO: #5834 Nuke this
57
- async getPublicKeyAndPartialAddress([address]: ACVMField[]) {
58
- const { publicKey, partialAddress } = await this.typedOracle.getCompleteAddress(
59
- AztecAddress.fromField(fromACVMField(address)),
60
- );
61
- return [publicKey.x, publicKey.y, partialAddress].map(toACVMField);
62
- }
63
-
64
56
  async getContractInstance([address]: ACVMField[]) {
65
57
  const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(fromACVMField(address)));
66
58
 
@@ -173,25 +165,10 @@ export class Oracle {
173
165
  }
174
166
 
175
167
  async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
176
- let publicKeys: Point[] | undefined;
177
- let partialAddress: PartialAddress;
178
-
179
- // TODO #5834: This should be reworked to return the public keys as well
180
- try {
181
- ({ partialAddress } = await this.typedOracle.getCompleteAddress(AztecAddress.fromField(fromACVMField(address))));
182
- } catch (err) {
183
- partialAddress = Fr.ZERO;
184
- }
185
-
186
- try {
187
- publicKeys = await this.typedOracle.getPublicKeysForAddress(AztecAddress.fromField(fromACVMField(address)));
188
- } catch (err) {
189
- publicKeys = Array(4).fill(Point.ZERO);
190
- }
168
+ const parsedAddress = AztecAddress.fromField(fromACVMField(address));
169
+ const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
191
170
 
192
- const acvmPublicKeys = publicKeys.flatMap(key => key.toFields());
193
-
194
- return [...acvmPublicKeys, partialAddress].map(toACVMField);
171
+ return [...publicKeys.toFields(), partialAddress].map(toACVMField);
195
172
  }
196
173
 
197
174
  async getNotes(
@@ -317,19 +294,34 @@ export class Oracle {
317
294
  [publicKeyX]: ACVMField[],
318
295
  [publicKeyY]: ACVMField[],
319
296
  log: ACVMField[],
320
- ): ACVMField {
297
+ [counter]: ACVMField[],
298
+ ): ACVMField[] {
321
299
  const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
322
- const logHash = this.typedOracle.emitEncryptedLog(
300
+ const encLog = this.typedOracle.emitEncryptedLog(
323
301
  AztecAddress.fromString(contractAddress),
324
302
  Fr.fromString(storageSlot),
325
303
  Fr.fromString(noteTypeId),
326
304
  publicKey,
327
305
  log.map(fromACVMField),
306
+ +counter,
328
307
  );
329
- return toACVMField(logHash);
308
+ // TODO(1139): We should encrypt in the circuit, but instead we inject here
309
+ // encryption output is 112 + 32 * (N + 3) bytes, for log len N
310
+ // so split into N + 7 fields (gross but avoids 300+ ACVMFields)
311
+ const encLogFields = [];
312
+ for (let i = 0; i < Math.ceil(encLog.length / 31); i++) {
313
+ encLogFields.push(toACVMField(encLog.subarray(31 * i, Math.min(31 * (i + 1), encLog.length))));
314
+ }
315
+
316
+ return encLogFields;
330
317
  }
331
318
 
332
- emitUnencryptedLog([contractAddress]: ACVMField[], [eventSelector]: ACVMField[], message: ACVMField[]): ACVMField {
319
+ emitUnencryptedLog(
320
+ [contractAddress]: ACVMField[],
321
+ [eventSelector]: ACVMField[],
322
+ message: ACVMField[],
323
+ [counter]: ACVMField[],
324
+ ): ACVMField {
333
325
  const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
334
326
  const log = new UnencryptedL2Log(
335
327
  AztecAddress.fromString(contractAddress),
@@ -337,18 +329,33 @@ export class Oracle {
337
329
  logPayload,
338
330
  );
339
331
 
340
- const logHash = this.typedOracle.emitUnencryptedLog(log);
332
+ this.typedOracle.emitUnencryptedLog(log, +counter);
333
+ return toACVMField(0);
334
+ }
335
+
336
+ emitContractClassUnencryptedLog(
337
+ [contractAddress]: ACVMField[],
338
+ [eventSelector]: ACVMField[],
339
+ message: ACVMField[],
340
+ [counter]: ACVMField[],
341
+ ): ACVMField {
342
+ const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
343
+ const log = new UnencryptedL2Log(
344
+ AztecAddress.fromString(contractAddress),
345
+ EventSelector.fromField(fromACVMField(eventSelector)),
346
+ logPayload,
347
+ );
348
+
349
+ const logHash = this.typedOracle.emitContractClassUnencryptedLog(log, +counter);
341
350
  return toACVMField(logHash);
342
351
  }
343
352
 
344
- debugLog(...args: ACVMField[][]): ACVMField {
353
+ debugLog(...args: ACVMField[][]): void {
345
354
  this.log.verbose(oracleDebugCallToFormattedStr(args));
346
- return toACVMField(0);
347
355
  }
348
356
 
349
- debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
357
+ debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): void {
350
358
  this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
351
- return toACVMField(0);
352
359
  }
353
360
 
354
361
  async callPrivateFunction(
@@ -408,6 +415,25 @@ export class Oracle {
408
415
  return toAcvmEnqueuePublicFunctionResult(enqueuedRequest);
409
416
  }
410
417
 
418
+ async setPublicTeardownFunctionCall(
419
+ [contractAddress]: ACVMField[],
420
+ [functionSelector]: ACVMField[],
421
+ [argsHash]: ACVMField[],
422
+ [sideEffectCounter]: ACVMField[],
423
+ [isStaticCall]: ACVMField[],
424
+ [isDelegateCall]: ACVMField[],
425
+ ) {
426
+ const teardownRequest = await this.typedOracle.setPublicTeardownFunctionCall(
427
+ AztecAddress.fromString(contractAddress),
428
+ FunctionSelector.fromField(fromACVMField(functionSelector)),
429
+ fromACVMField(argsHash),
430
+ frToNumber(fromACVMField(sideEffectCounter)),
431
+ frToBoolean(fromACVMField(isStaticCall)),
432
+ frToBoolean(fromACVMField(isDelegateCall)),
433
+ );
434
+ return toAcvmEnqueuePublicFunctionResult(teardownRequest);
435
+ }
436
+
411
437
  aes128Encrypt(input: ACVMField[], initializationVector: ACVMField[], key: ACVMField[]): ACVMField[] {
412
438
  // Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
413
439
  const processedInput = Buffer.from(input.map(fromACVMField).map(f => f.toNumber()));
@@ -17,7 +17,7 @@ import {
17
17
  } from '@aztec/circuits.js';
18
18
  import { type FunctionSelector } from '@aztec/foundation/abi';
19
19
  import { type AztecAddress } from '@aztec/foundation/aztec-address';
20
- import { Fr, type Point } from '@aztec/foundation/fields';
20
+ import { Fr } from '@aztec/foundation/fields';
21
21
  import { type ContractInstance } from '@aztec/types/contracts';
22
22
 
23
23
  /** Nullifier keys which both correspond to the same master nullifier secret key. */
@@ -93,10 +93,6 @@ export abstract class TypedOracle {
93
93
  throw new OracleMethodNotAvailableError('getNullifierKeys');
94
94
  }
95
95
 
96
- getPublicKeyAndPartialAddress(_address: AztecAddress): Promise<Fr[] | undefined> {
97
- throw new OracleMethodNotAvailableError('getPublicKeyAndPartialAddress');
98
- }
99
-
100
96
  getContractInstance(_address: AztecAddress): Promise<ContractInstance> {
101
97
  throw new OracleMethodNotAvailableError('getContractInstance');
102
98
  }
@@ -140,10 +136,6 @@ export abstract class TypedOracle {
140
136
  throw new OracleMethodNotAvailableError('popCapsule');
141
137
  }
142
138
 
143
- getPublicKeysForAddress(_address: AztecAddress): Promise<Point[]> {
144
- throw new OracleMethodNotAvailableError('getPublicKeysForAddress');
145
- }
146
-
147
139
  getNotes(
148
140
  _storageSlot: Fr,
149
141
  _numSelects: number,
@@ -197,14 +189,19 @@ export abstract class TypedOracle {
197
189
  _noteTypeId: Fr,
198
190
  _publicKey: PublicKey,
199
191
  _log: Fr[],
200
- ): Fr {
192
+ _counter: number,
193
+ ): Buffer {
201
194
  throw new OracleMethodNotAvailableError('emitEncryptedLog');
202
195
  }
203
196
 
204
- emitUnencryptedLog(_log: UnencryptedL2Log): Fr {
197
+ emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
205
198
  throw new OracleMethodNotAvailableError('emitUnencryptedLog');
206
199
  }
207
200
 
201
+ emitContractClassUnencryptedLog(_log: UnencryptedL2Log, _counter: number): Fr {
202
+ throw new OracleMethodNotAvailableError('emitContractClassUnencryptedLog');
203
+ }
204
+
208
205
  callPrivateFunction(
209
206
  _targetContractAddress: AztecAddress,
210
207
  _functionSelector: FunctionSelector,
@@ -238,6 +235,17 @@ export abstract class TypedOracle {
238
235
  throw new OracleMethodNotAvailableError('enqueuePublicFunctionCall');
239
236
  }
240
237
 
238
+ setPublicTeardownFunctionCall(
239
+ _targetContractAddress: AztecAddress,
240
+ _functionSelector: FunctionSelector,
241
+ _argsHash: Fr,
242
+ _sideEffectCounter: number,
243
+ _isStaticCall: boolean,
244
+ _isDelegateCall: boolean,
245
+ ): Promise<PublicCallRequest> {
246
+ throw new OracleMethodNotAvailableError('setPublicTeardownFunctionCall');
247
+ }
248
+
241
249
  aes128Encrypt(_input: Buffer, _initializationVector: Buffer, _key: Buffer): Buffer {
242
250
  throw new OracleMethodNotAvailableError('encrypt');
243
251
  }
@@ -45,72 +45,64 @@ export class AvmExecutionEnvironment {
45
45
  this.calldata = [...inputs.toFields(), ...calldata];
46
46
  }
47
47
 
48
- public deriveEnvironmentForNestedCall(
48
+ private deriveEnvironmentForNestedCallInternal(
49
49
  targetAddress: AztecAddress,
50
50
  calldata: Fr[],
51
- temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
52
- ): AvmExecutionEnvironment {
51
+ functionSelector: FunctionSelector,
52
+ isStaticCall: boolean,
53
+ isDelegateCall: boolean,
54
+ ) {
53
55
  return new AvmExecutionEnvironment(
54
- targetAddress,
56
+ /*address=*/ targetAddress,
55
57
  /*storageAddress=*/ targetAddress,
56
- this.address,
58
+ /*sender=*/ this.address,
57
59
  this.feePerL2Gas,
58
60
  this.feePerDaGas,
59
61
  this.contractCallDepth,
60
62
  this.header,
61
63
  this.globals,
62
- this.isStaticCall,
63
- this.isDelegateCall,
64
+ isStaticCall,
65
+ isDelegateCall,
64
66
  calldata,
65
67
  this.gasSettings,
66
68
  this.transactionFee,
67
- temporaryFunctionSelector,
69
+ functionSelector,
68
70
  );
69
71
  }
70
72
 
71
- public deriveEnvironmentForNestedStaticCall(
72
- address: AztecAddress,
73
+ public deriveEnvironmentForNestedCall(
74
+ targetAddress: AztecAddress,
73
75
  calldata: Fr[],
74
- temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
76
+ functionSelector: FunctionSelector = FunctionSelector.empty(),
75
77
  ): AvmExecutionEnvironment {
76
- return new AvmExecutionEnvironment(
77
- address,
78
- /*storageAddress=*/ address,
79
- this.sender,
80
- this.feePerL2Gas,
81
- this.feePerDaGas,
82
- this.contractCallDepth,
83
- this.header,
84
- this.globals,
85
- /*isStaticCall=*/ true,
86
- this.isDelegateCall,
78
+ return this.deriveEnvironmentForNestedCallInternal(
79
+ targetAddress,
87
80
  calldata,
88
- this.gasSettings,
89
- this.transactionFee,
90
- temporaryFunctionSelector,
81
+ functionSelector,
82
+ /*isStaticCall=*/ false,
83
+ /*isDelegateCall=*/ false,
91
84
  );
92
85
  }
93
86
 
94
- public newDelegateCall(
95
- address: AztecAddress,
87
+ public deriveEnvironmentForNestedStaticCall(
88
+ targetAddress: AztecAddress,
96
89
  calldata: Fr[],
97
- temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
90
+ functionSelector: FunctionSelector,
98
91
  ): AvmExecutionEnvironment {
99
- return new AvmExecutionEnvironment(
100
- address,
101
- this.storageAddress,
102
- this.sender,
103
- this.feePerL2Gas,
104
- this.feePerDaGas,
105
- this.contractCallDepth,
106
- this.header,
107
- this.globals,
108
- this.isStaticCall,
109
- /*isDelegateCall=*/ true,
92
+ return this.deriveEnvironmentForNestedCallInternal(
93
+ targetAddress,
110
94
  calldata,
111
- this.gasSettings,
112
- this.transactionFee,
113
- temporaryFunctionSelector,
95
+ functionSelector,
96
+ /*isStaticCall=*/ true,
97
+ /*isDelegateCall=*/ false,
114
98
  );
115
99
  }
100
+
101
+ public newDelegateCall(
102
+ _targetAddress: AztecAddress,
103
+ _calldata: Fr[],
104
+ _functionSelector: FunctionSelector,
105
+ ): AvmExecutionEnvironment {
106
+ throw new Error('Delegate calls not supported!');
107
+ }
116
108
  }
@@ -78,6 +78,7 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
78
78
  [Opcode.SENDER]: TemporaryDefaultGasCost,
79
79
  [Opcode.FEEPERL2GAS]: TemporaryDefaultGasCost,
80
80
  [Opcode.FEEPERDAGAS]: TemporaryDefaultGasCost,
81
+ [Opcode.TRANSACTIONFEE]: TemporaryDefaultGasCost,
81
82
  [Opcode.CONTRACTCALLDEPTH]: TemporaryDefaultGasCost,
82
83
  [Opcode.CHAINID]: TemporaryDefaultGasCost,
83
84
  [Opcode.VERSION]: TemporaryDefaultGasCost,
@@ -122,6 +123,8 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
122
123
  [Opcode.POSEIDON2]: TemporaryDefaultGasCost,
123
124
  [Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
124
125
  [Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
126
+ // Conversions
127
+ [Opcode.TORADIXLE]: TemporaryDefaultGasCost,
125
128
  };
126
129
 
127
130
  /** Returns the fixed base gas cost for a given opcode, or throws if set to dynamic. */
@@ -2,7 +2,6 @@ import { type Fr } from '@aztec/circuits.js';
2
2
 
3
3
  import { type Gas, GasDimensions } from './avm_gas.js';
4
4
  import { TaggedMemory } from './avm_memory_types.js';
5
- import { AvmContractCallResults } from './avm_message_call_result.js';
6
5
  import { OutOfGasError } from './errors.js';
7
6
 
8
7
  /**
@@ -36,7 +35,7 @@ export class AvmMachineState {
36
35
  * Signals that execution should end.
37
36
  * AvmContext execution continues executing instructions until the machine state signals "halted"
38
37
  */
39
- public halted: boolean = false;
38
+ private halted: boolean = false;
40
39
  /** Signals that execution has reverted normally (this does not cover exceptional halts) */
41
40
  private reverted: boolean = false;
42
41
  /** Output data must NOT be modified once it is set */
@@ -118,34 +117,24 @@ export class AvmMachineState {
118
117
  this.output = output;
119
118
  }
120
119
 
120
+ public getHalted(): boolean {
121
+ return this.halted;
122
+ }
123
+
124
+ public getReverted(): boolean {
125
+ return this.reverted;
126
+ }
127
+
128
+ public getOutput(): Fr[] {
129
+ return this.output;
130
+ }
131
+
121
132
  /**
122
133
  * Flag an exceptional halt. Clears gas left and sets the reverted flag. No output data.
123
134
  */
124
- protected exceptionalHalt() {
135
+ private exceptionalHalt() {
125
136
  GasDimensions.forEach(dimension => (this[`${dimension}Left`] = 0));
126
137
  this.reverted = true;
127
138
  this.halted = true;
128
139
  }
129
-
130
- /**
131
- * Get a summary of execution results for a halted machine state
132
- * @returns summary of execution results
133
- */
134
- public getResults(): AvmContractCallResults {
135
- if (!this.halted) {
136
- throw new Error('Execution results are not ready! Execution is ongoing.');
137
- }
138
- let revertReason = undefined;
139
- if (this.reverted && this.output.length > 0) {
140
- try {
141
- // Try to interpret the output as a text string.
142
- revertReason = new Error(
143
- 'Reverted with output: ' + String.fromCharCode(...this.output.slice(1).map(fr => fr.toNumber())),
144
- );
145
- } catch (e) {
146
- revertReason = new Error('Reverted with non-string output');
147
- }
148
- }
149
- return new AvmContractCallResults(this.reverted, this.output, revertReason);
150
- }
151
140
  }
@@ -225,7 +225,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
225
225
  }
226
226
 
227
227
  /** Returns a MeteredTaggedMemory instance to track the number of reads and writes if TRACK_MEMORY_ACCESSES is set. */
228
- public track(type: string = 'instruction') {
228
+ public track(type: string = 'instruction'): TaggedMemoryInterface {
229
229
  return TaggedMemory.TRACK_MEMORY_ACCESSES ? new MeteredTaggedMemory(this, type) : this;
230
230
  }
231
231
 
@@ -1,24 +1,13 @@
1
1
  import { type Fr } from '@aztec/foundation/fields';
2
2
 
3
+ import { type AvmRevertReason } from './errors.js';
4
+
3
5
  /**
4
6
  * Results of an contract call's execution in the AVM.
5
7
  */
6
8
  export class AvmContractCallResults {
7
- public readonly reverted: boolean;
8
- public readonly output: Fr[];
9
-
10
- /** For exceptional halts */
11
- public readonly revertReason: Error | undefined;
12
-
13
- constructor(reverted: boolean, output: Fr[], revertReason?: Error) {
14
- this.reverted = reverted;
15
- this.output = output;
16
- this.revertReason = revertReason;
17
- }
9
+ constructor(public reverted: boolean, public output: Fr[], public revertReason?: AvmRevertReason) {}
18
10
 
19
- /**
20
- * Generate a string representation of call results.
21
- */
22
11
  toString(): string {
23
12
  let resultsStr = `reverted: ${this.reverted}, output: ${this.output}`;
24
13
  if (this.revertReason) {
@@ -2,9 +2,16 @@ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
2
2
 
3
3
  import { strict as assert } from 'assert';
4
4
 
5
+ import { isAvmBytecode } from '../public/transitional_adaptors.js';
5
6
  import type { AvmContext } from './avm_context.js';
6
7
  import { AvmContractCallResults } from './avm_message_call_result.js';
7
- import { AvmExecutionError, InvalidProgramCounterError, NoBytecodeForContractError } from './errors.js';
8
+ import {
9
+ AvmExecutionError,
10
+ InvalidProgramCounterError,
11
+ NoBytecodeForContractError,
12
+ revertReasonFromExceptionalHalt,
13
+ revertReasonFromExplicitRevert,
14
+ } from './errors.js';
8
15
  import type { Instruction } from './opcodes/index.js';
9
16
  import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
10
17
 
@@ -32,6 +39,7 @@ export class AvmSimulator {
32
39
  if (!bytecode) {
33
40
  throw new NoBytecodeForContractError(this.context.environment.address);
34
41
  }
42
+ assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
35
43
 
36
44
  return await this.executeBytecode(bytecode);
37
45
  }
@@ -54,7 +62,7 @@ export class AvmSimulator {
54
62
  try {
55
63
  // Execute instruction pointed to by the current program counter
56
64
  // continuing until the machine state signifies a halt
57
- while (!machineState.halted) {
65
+ while (!machineState.getHalted()) {
58
66
  const instruction = instructions[machineState.pc];
59
67
  assert(
60
68
  !!instruction,
@@ -74,21 +82,25 @@ export class AvmSimulator {
74
82
  }
75
83
  }
76
84
 
77
- // Return results for processing by calling context
78
- const results = machineState.getResults();
85
+ const output = machineState.getOutput();
86
+ const reverted = machineState.getReverted();
87
+ const revertReason = reverted ? revertReasonFromExplicitRevert(output, this.context) : undefined;
88
+ const results = new AvmContractCallResults(reverted, output, revertReason);
79
89
  this.log.debug(`Context execution results: ${results.toString()}`);
90
+ // Return results for processing by calling context
80
91
  return results;
81
- } catch (e) {
82
- this.log.verbose('Exceptional halt');
83
- if (!(e instanceof AvmExecutionError)) {
84
- this.log.verbose(`Unknown error thrown by avm: ${e}`);
85
- throw e;
92
+ } catch (err: any) {
93
+ this.log.verbose('Exceptional halt (revert by something other than REVERT opcode)');
94
+ if (!(err instanceof AvmExecutionError)) {
95
+ this.log.verbose(`Unknown error thrown by AVM: ${err}`);
96
+ throw err;
86
97
  }
87
98
 
88
- // Return results for processing by calling context
89
- // Note: "exceptional halts" cannot return data
90
- const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], /*revertReason=*/ e);
99
+ const revertReason = revertReasonFromExceptionalHalt(err, this.context);
100
+ // Note: "exceptional halts" cannot return data, hence []
101
+ const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], revertReason);
91
102
  this.log.debug(`Context execution results: ${results.toString()}`);
103
+ // Return results for processing by calling context
92
104
  return results;
93
105
  }
94
106
  }