@aztec/simulator 0.66.0 → 0.67.1-devnet

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 (158) hide show
  1. package/dest/acvm/acvm.js +3 -3
  2. package/dest/acvm/oracle/oracle.d.ts +2 -2
  3. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  4. package/dest/acvm/oracle/oracle.js +5 -5
  5. package/dest/acvm/oracle/typed_oracle.d.ts +3 -3
  6. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  7. package/dest/acvm/oracle/typed_oracle.js +5 -5
  8. package/dest/acvm/serialize.js +2 -2
  9. package/dest/avm/avm_context.d.ts +2 -2
  10. package/dest/avm/avm_context.d.ts.map +1 -1
  11. package/dest/avm/avm_context.js +3 -4
  12. package/dest/avm/avm_execution_environment.d.ts +4 -6
  13. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  14. package/dest/avm/avm_execution_environment.js +8 -13
  15. package/dest/avm/avm_memory_types.d.ts +3 -3
  16. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  17. package/dest/avm/avm_memory_types.js +29 -29
  18. package/dest/avm/avm_simulator.d.ts +3 -3
  19. package/dest/avm/avm_simulator.d.ts.map +1 -1
  20. package/dest/avm/avm_simulator.js +27 -15
  21. package/dest/avm/avm_tree.d.ts +2 -1
  22. package/dest/avm/avm_tree.d.ts.map +1 -1
  23. package/dest/avm/avm_tree.js +6 -2
  24. package/dest/avm/errors.d.ts +3 -3
  25. package/dest/avm/errors.d.ts.map +1 -1
  26. package/dest/avm/errors.js +8 -15
  27. package/dest/avm/fixtures/index.d.ts +2 -0
  28. package/dest/avm/fixtures/index.d.ts.map +1 -1
  29. package/dest/avm/fixtures/index.js +7 -7
  30. package/dest/avm/journal/journal.d.ts +31 -8
  31. package/dest/avm/journal/journal.d.ts.map +1 -1
  32. package/dest/avm/journal/journal.js +139 -42
  33. package/dest/avm/opcodes/conversion.d.ts +4 -4
  34. package/dest/avm/opcodes/conversion.d.ts.map +1 -1
  35. package/dest/avm/opcodes/conversion.js +22 -18
  36. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  37. package/dest/avm/opcodes/external_calls.js +4 -11
  38. package/dest/avm/opcodes/misc.d.ts.map +1 -1
  39. package/dest/avm/opcodes/misc.js +3 -3
  40. package/dest/avm/test_utils.d.ts +1 -0
  41. package/dest/avm/test_utils.d.ts.map +1 -1
  42. package/dest/avm/test_utils.js +4 -1
  43. package/dest/client/client_execution_context.d.ts +3 -3
  44. package/dest/client/client_execution_context.d.ts.map +1 -1
  45. package/dest/client/client_execution_context.js +15 -8
  46. package/dest/client/db_oracle.d.ts +9 -5
  47. package/dest/client/db_oracle.d.ts.map +1 -1
  48. package/dest/client/execution_note_cache.d.ts +9 -1
  49. package/dest/client/execution_note_cache.d.ts.map +1 -1
  50. package/dest/client/execution_note_cache.js +10 -3
  51. package/dest/client/index.d.ts +1 -0
  52. package/dest/client/index.d.ts.map +1 -1
  53. package/dest/client/index.js +2 -1
  54. package/dest/client/private_execution.d.ts.map +1 -1
  55. package/dest/client/private_execution.js +4 -4
  56. package/dest/client/simulator.d.ts.map +1 -1
  57. package/dest/client/simulator.js +4 -4
  58. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  59. package/dest/client/unconstrained_execution.js +3 -3
  60. package/dest/client/view_data_oracle.d.ts +4 -4
  61. package/dest/client/view_data_oracle.d.ts.map +1 -1
  62. package/dest/client/view_data_oracle.js +9 -9
  63. package/dest/common/debug_fn_name.d.ts +2 -2
  64. package/dest/common/debug_fn_name.d.ts.map +1 -1
  65. package/dest/common/debug_fn_name.js +8 -14
  66. package/dest/providers/acvm_native.js +4 -4
  67. package/dest/providers/acvm_wasm.js +2 -2
  68. package/dest/providers/factory.d.ts +2 -2
  69. package/dest/providers/factory.d.ts.map +1 -1
  70. package/dest/providers/factory.js +4 -4
  71. package/dest/providers/index.d.ts +0 -1
  72. package/dest/providers/index.d.ts.map +1 -1
  73. package/dest/providers/index.js +1 -2
  74. package/dest/public/enqueued_call_side_effect_trace.d.ts +15 -26
  75. package/dest/public/enqueued_call_side_effect_trace.d.ts.map +1 -1
  76. package/dest/public/enqueued_call_side_effect_trace.js +42 -62
  77. package/dest/public/execution.d.ts +2 -2
  78. package/dest/public/execution.d.ts.map +1 -1
  79. package/dest/public/execution.js +1 -1
  80. package/dest/public/executor_metrics.d.ts.map +1 -1
  81. package/dest/public/executor_metrics.js +2 -5
  82. package/dest/public/fee_payment.d.ts.map +1 -1
  83. package/dest/public/fee_payment.js +4 -3
  84. package/dest/public/fixtures/index.d.ts +24 -1
  85. package/dest/public/fixtures/index.d.ts.map +1 -1
  86. package/dest/public/fixtures/index.js +17 -11
  87. package/dest/public/index.d.ts +0 -1
  88. package/dest/public/index.d.ts.map +1 -1
  89. package/dest/public/index.js +1 -2
  90. package/dest/public/public_db_sources.d.ts.map +1 -1
  91. package/dest/public/public_db_sources.js +10 -9
  92. package/dest/public/public_processor.d.ts +12 -12
  93. package/dest/public/public_processor.d.ts.map +1 -1
  94. package/dest/public/public_processor.js +80 -68
  95. package/dest/public/public_processor_metrics.d.ts +1 -1
  96. package/dest/public/public_processor_metrics.d.ts.map +1 -1
  97. package/dest/public/public_tx_context.d.ts +13 -10
  98. package/dest/public/public_tx_context.d.ts.map +1 -1
  99. package/dest/public/public_tx_context.js +72 -45
  100. package/dest/public/public_tx_simulator.d.ts +2 -2
  101. package/dest/public/public_tx_simulator.d.ts.map +1 -1
  102. package/dest/public/public_tx_simulator.js +54 -23
  103. package/dest/public/side_effect_trace_interface.d.ts +6 -18
  104. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  105. package/dest/public/transitional_adapters.d.ts +2 -2
  106. package/dest/public/transitional_adapters.d.ts.map +1 -1
  107. package/dest/public/transitional_adapters.js +10 -39
  108. package/package.json +16 -9
  109. package/src/acvm/acvm.ts +2 -2
  110. package/src/acvm/oracle/oracle.ts +4 -4
  111. package/src/acvm/oracle/typed_oracle.ts +5 -5
  112. package/src/acvm/serialize.ts +1 -1
  113. package/src/avm/avm_context.ts +2 -3
  114. package/src/avm/avm_execution_environment.ts +6 -31
  115. package/src/avm/avm_memory_types.ts +31 -29
  116. package/src/avm/avm_simulator.ts +28 -22
  117. package/src/avm/avm_tree.ts +6 -1
  118. package/src/avm/errors.ts +12 -14
  119. package/src/avm/fixtures/index.ts +6 -5
  120. package/src/avm/journal/journal.ts +230 -71
  121. package/src/avm/opcodes/conversion.ts +21 -16
  122. package/src/avm/opcodes/external_calls.ts +3 -19
  123. package/src/avm/opcodes/misc.ts +2 -2
  124. package/src/avm/test_utils.ts +4 -0
  125. package/src/client/client_execution_context.ts +19 -9
  126. package/src/client/db_oracle.ts +10 -5
  127. package/src/client/execution_note_cache.ts +13 -3
  128. package/src/client/index.ts +1 -0
  129. package/src/client/private_execution.ts +3 -3
  130. package/src/client/simulator.ts +4 -4
  131. package/src/client/unconstrained_execution.ts +2 -2
  132. package/src/client/view_data_oracle.ts +11 -9
  133. package/src/common/debug_fn_name.ts +7 -13
  134. package/src/providers/acvm_native.ts +3 -3
  135. package/src/providers/acvm_wasm.ts +2 -2
  136. package/src/providers/factory.ts +3 -3
  137. package/src/providers/index.ts +0 -1
  138. package/src/public/enqueued_call_side_effect_trace.ts +62 -86
  139. package/src/public/execution.ts +1 -2
  140. package/src/public/executor_metrics.ts +0 -4
  141. package/src/public/fee_payment.ts +3 -2
  142. package/src/public/fixtures/index.ts +25 -12
  143. package/src/public/index.ts +0 -1
  144. package/src/public/public_db_sources.ts +9 -8
  145. package/src/public/public_processor.ts +109 -105
  146. package/src/public/public_processor_metrics.ts +1 -1
  147. package/src/public/public_tx_context.ts +97 -50
  148. package/src/public/public_tx_simulator.ts +69 -38
  149. package/src/public/side_effect_trace_interface.ts +10 -16
  150. package/src/public/transitional_adapters.ts +12 -48
  151. package/dest/public/dual_side_effect_trace.d.ts +0 -77
  152. package/dest/public/dual_side_effect_trace.d.ts.map +0 -1
  153. package/dest/public/dual_side_effect_trace.js +0 -119
  154. package/dest/public/side_effect_trace.d.ts +0 -96
  155. package/dest/public/side_effect_trace.d.ts.map +0 -1
  156. package/dest/public/side_effect_trace.js +0 -309
  157. package/src/public/dual_side_effect_trace.ts +0 -242
  158. package/src/public/side_effect_trace.ts +0 -536
@@ -1,10 +1,9 @@
1
- import { MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicDataWrite, TreeSnapshots, countAccumulatedItems, mergeAccumulatedData, } from '@aztec/circuits.js';
2
- import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash } from '@aztec/circuits.js/hash';
1
+ import { Fr, MAX_L2_TO_L1_MSGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicDataWrite, TreeSnapshots, countAccumulatedItems, mergeAccumulatedData, } from '@aztec/circuits.js';
3
2
  import { padArrayEnd } from '@aztec/foundation/collection';
4
3
  import { assertLength } from '@aztec/foundation/serialize';
5
- export function generateAvmCircuitPublicInputs(trace, globalVariables, startStateReference, startGasUsed, gasSettings, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, endTreeSnapshots, endGasUsed, transactionFee, revertCode) {
4
+ export function generateAvmCircuitPublicInputs(trace, globalVariables, startStateReference, startGasUsed, gasSettings, feePayer, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, endTreeSnapshots, endGasUsed, transactionFee, revertCode) {
6
5
  const startTreeSnapshots = new TreeSnapshots(startStateReference.l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
7
- const avmCircuitPublicInputs = trace.toAvmCircuitPublicInputs(globalVariables, startTreeSnapshots, startGasUsed, gasSettings, setupCallRequests, appLogicCallRequests, teardownCallRequests.length ? teardownCallRequests[0] : PublicCallRequest.empty(), endTreeSnapshots, endGasUsed, transactionFee, !revertCode.isOK());
6
+ const avmCircuitPublicInputs = trace.toAvmCircuitPublicInputs(globalVariables, startTreeSnapshots, startGasUsed, gasSettings, feePayer, setupCallRequests, appLogicCallRequests, teardownCallRequests.length ? teardownCallRequests[0] : PublicCallRequest.empty(), endTreeSnapshots, endGasUsed, transactionFee, !revertCode.isOK());
8
7
  const getArrayLengths = (from) => new PrivateToAvmAccumulatedDataArrayLengths(countAccumulatedItems(from.noteHashes), countAccumulatedItems(from.nullifiers), countAccumulatedItems(from.l2ToL1Msgs));
9
8
  const convertAccumulatedData = (from) => new PrivateToAvmAccumulatedData(from.noteHashes, from.nullifiers, from.l2ToL1Msgs);
10
9
  // Temporary overrides as these entries aren't yet populated in trace
@@ -12,47 +11,19 @@ export function generateAvmCircuitPublicInputs(trace, globalVariables, startStat
12
11
  avmCircuitPublicInputs.previousRevertibleAccumulatedDataArrayLengths = getArrayLengths(revertibleAccumulatedDataFromPrivate);
13
12
  avmCircuitPublicInputs.previousNonRevertibleAccumulatedData = convertAccumulatedData(nonRevertibleAccumulatedDataFromPrivate);
14
13
  avmCircuitPublicInputs.previousRevertibleAccumulatedData = convertAccumulatedData(revertibleAccumulatedDataFromPrivate);
15
- // merge all revertible & non-revertible side effects into output accumulated data
16
- const noteHashesFromPrivate = revertCode.isOK()
17
- ? mergeAccumulatedData(avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes, avmCircuitPublicInputs.previousRevertibleAccumulatedData.noteHashes)
18
- : avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes;
19
- avmCircuitPublicInputs.accumulatedData.noteHashes = assertLength(mergeAccumulatedData(noteHashesFromPrivate, avmCircuitPublicInputs.accumulatedData.noteHashes), MAX_NOTE_HASHES_PER_TX);
20
- const txHash = avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.nullifiers[0];
21
- const scopedNoteHashesFromPublic = trace.getSideEffects().noteHashes;
22
- for (let i = 0; i < scopedNoteHashesFromPublic.length; i++) {
23
- const scopedNoteHash = scopedNoteHashesFromPublic[i];
24
- const noteHash = scopedNoteHash.value;
25
- if (!noteHash.isZero()) {
26
- const noteHashIndexInTx = i + countAccumulatedItems(noteHashesFromPrivate);
27
- const nonce = computeNoteHashNonce(txHash, noteHashIndexInTx);
28
- const uniqueNoteHash = computeUniqueNoteHash(nonce, noteHash);
29
- const siloedNoteHash = siloNoteHash(scopedNoteHash.contractAddress, uniqueNoteHash);
30
- avmCircuitPublicInputs.accumulatedData.noteHashes[noteHashIndexInTx] = siloedNoteHash;
31
- }
32
- }
33
14
  const msgsFromPrivate = revertCode.isOK()
34
15
  ? mergeAccumulatedData(avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.l2ToL1Msgs, avmCircuitPublicInputs.previousRevertibleAccumulatedData.l2ToL1Msgs)
35
16
  : avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.l2ToL1Msgs;
36
17
  avmCircuitPublicInputs.accumulatedData.l2ToL1Msgs = assertLength(mergeAccumulatedData(msgsFromPrivate, avmCircuitPublicInputs.accumulatedData.l2ToL1Msgs), MAX_L2_TO_L1_MSGS_PER_TX);
37
- const dedupedPublicDataWrites = [];
38
- const leafSlotOccurences = new Map();
39
- for (const publicDataWrite of avmCircuitPublicInputs.accumulatedData.publicDataWrites) {
40
- const slot = publicDataWrite.leafSlot.toBigInt();
41
- const prevOccurrences = leafSlotOccurences.get(slot) || 0;
42
- leafSlotOccurences.set(slot, prevOccurrences + 1);
43
- }
18
+ // Maps slot to value. Maps in TS are iterable in insertion order, which is exactly what we want for
19
+ // squashing "to the left", where the first occurrence of a slot uses the value of the last write to it,
20
+ // and the rest occurrences are omitted
21
+ const squashedPublicDataWrites = new Map();
44
22
  for (const publicDataWrite of avmCircuitPublicInputs.accumulatedData.publicDataWrites) {
45
- const slot = publicDataWrite.leafSlot.toBigInt();
46
- const prevOccurrences = leafSlotOccurences.get(slot) || 0;
47
- if (prevOccurrences === 1) {
48
- dedupedPublicDataWrites.push(publicDataWrite);
49
- }
50
- else {
51
- leafSlotOccurences.set(slot, prevOccurrences - 1);
52
- }
23
+ squashedPublicDataWrites.set(publicDataWrite.leafSlot.toBigInt(), publicDataWrite.value);
53
24
  }
54
- avmCircuitPublicInputs.accumulatedData.publicDataWrites = padArrayEnd(dedupedPublicDataWrites, PublicDataWrite.empty(), MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
25
+ avmCircuitPublicInputs.accumulatedData.publicDataWrites = padArrayEnd(Array.from(squashedPublicDataWrites.entries()).map(([slot, value]) => new PublicDataWrite(new Fr(slot), value)), PublicDataWrite.empty(), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
55
26
  //console.log(`AvmCircuitPublicInputs:\n${inspect(avmCircuitPublicInputs)}`);
56
27
  return avmCircuitPublicInputs;
57
28
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQU1MLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsc0NBQXNDLEVBQ3RDLDJCQUEyQixFQUMzQix1Q0FBdUMsRUFFdkMsaUJBQWlCLEVBQ2pCLGVBQWUsRUFHZixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSTNELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsS0FBd0MsRUFDeEMsZUFBZ0MsRUFDaEMsbUJBQW1DLEVBQ25DLFlBQWlCLEVBQ2pCLFdBQXdCLEVBQ3hCLGlCQUFzQyxFQUN0QyxvQkFBeUMsRUFDekMsb0JBQXlDLEVBQ3pDLHVDQUF1RSxFQUN2RSxvQ0FBb0UsRUFDcEUsZ0JBQStCLEVBQy9CLFVBQWUsRUFDZixjQUFrQixFQUNsQixVQUFzQjtJQUV0QixNQUFNLGtCQUFrQixHQUFHLElBQUksYUFBYSxDQUMxQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFDckMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFlBQVksRUFDeEMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDekMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FDM0MsQ0FBQztJQUVGLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDLHdCQUF3QixDQUMzRCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixXQUFXLEVB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
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLEVBQUUsRUFJRix3QkFBd0IsRUFDeEIsNENBQTRDLEVBQzVDLDJCQUEyQixFQUMzQix1Q0FBdUMsRUFFdkMsaUJBQWlCLEVBQ2pCLGVBQWUsRUFHZixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFJM0QsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxLQUF3QyxFQUN4QyxlQUFnQyxFQUNoQyxtQkFBbUMsRUFDbkMsWUFBaUIsRUFDakIsV0FBd0IsRUFDeEIsUUFBc0IsRUFDdEIsaUJBQXNDLEVBQ3RDLG9CQUF5QyxFQUN6QyxvQkFBeUMsRUFDekMsdUNBQXVFLEVBQ3ZFLG9DQUFvRSxFQUNwRSxnQkFBK0IsRUFDL0IsVUFBZSxFQUNmLGNBQWtCLEVBQ2xCLFVBQXNCO0lBRXRCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxhQUFhLENBQzFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUNyQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUN4QyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN6QyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUMzQyxDQUFDO0lBRUYsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUMsd0JBQXdCLENBQzNELGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLFdBQVcsRUFDWCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixvQkFBb0IsQ0FBQyxNQUFNLENB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
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.66.0",
3
+ "version": "0.67.1-devnet",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
7
+ "./client": "./dest/client/index.js",
8
+ "./acvm": "./dest/acvm/index.js",
9
+ "./errors": "./dest/common/errors.js",
7
10
  "./public/fixtures": "./dest/public/fixtures/index.js"
8
11
  },
9
12
  "typedocOptions": {
@@ -56,17 +59,21 @@
56
59
  "summaryThreshold": 9999
57
60
  }
58
61
  ]
62
+ ],
63
+ "testTimeout": 30000,
64
+ "setupFiles": [
65
+ "../../foundation/src/jest/setup.mjs"
59
66
  ]
60
67
  },
61
68
  "dependencies": {
62
- "@aztec/circuit-types": "0.66.0",
63
- "@aztec/circuits.js": "0.66.0",
64
- "@aztec/foundation": "0.66.0",
65
- "@aztec/noir-protocol-circuits-types": "0.66.0",
66
- "@aztec/protocol-contracts": "0.66.0",
67
- "@aztec/telemetry-client": "0.66.0",
68
- "@aztec/types": "0.66.0",
69
- "@aztec/world-state": "0.66.0",
69
+ "@aztec/circuit-types": "0.67.1-devnet",
70
+ "@aztec/circuits.js": "0.67.1-devnet",
71
+ "@aztec/foundation": "0.67.1-devnet",
72
+ "@aztec/noir-protocol-circuits-types": "0.67.1-devnet",
73
+ "@aztec/protocol-contracts": "0.67.1-devnet",
74
+ "@aztec/telemetry-client": "0.67.1-devnet",
75
+ "@aztec/types": "0.67.1-devnet",
76
+ "@aztec/world-state": "0.67.1-devnet",
70
77
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
71
78
  "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
72
79
  "@noir-lang/types": "portal:../../noir/packages/types",
package/src/acvm/acvm.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type NoirCallStack } from '@aztec/circuit-types';
2
2
  import type { FunctionDebugMetadata } from '@aztec/foundation/abi';
3
- import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { createLogger } from '@aztec/foundation/log';
4
4
 
5
5
  import {
6
6
  type ExecutionError,
@@ -42,7 +42,7 @@ export async function acvm(
42
42
  initialWitness: ACVMWitness,
43
43
  callback: ACIRCallback,
44
44
  ): Promise<ACIRExecutionResult> {
45
- const logger = createDebugLogger('aztec:simulator:acvm');
45
+ const logger = createLogger('simulator:acvm');
46
46
 
47
47
  const solvedAndReturnWitness = await executeCircuitWithReturnWitness(
48
48
  acir,
@@ -146,10 +146,10 @@ export class Oracle {
146
146
  return witness.toFields().map(toACVMField);
147
147
  }
148
148
 
149
- async getHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
149
+ async getBlockHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
150
150
  const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
151
151
 
152
- const header = await this.typedOracle.getHeader(parsedBlockNumber);
152
+ const header = await this.typedOracle.getBlockHeader(parsedBlockNumber);
153
153
  if (!header) {
154
154
  throw new Error(`Block header not found for block ${parsedBlockNumber}.`);
155
155
  }
@@ -375,8 +375,8 @@ export class Oracle {
375
375
  this.typedOracle.notifySetMinRevertibleSideEffectCounter(frToNumber(fromACVMField(minRevertibleSideEffectCounter)));
376
376
  }
377
377
 
378
- async getAppTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
379
- const taggingSecret = await this.typedOracle.getAppTaggingSecretAsSender(
378
+ async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
379
+ const taggingSecret = await this.typedOracle.getIndexedTaggingSecretAsSender(
380
380
  AztecAddress.fromString(sender),
381
381
  AztecAddress.fromString(recipient),
382
382
  );
@@ -9,8 +9,8 @@ import {
9
9
  type UnencryptedL2Log,
10
10
  } from '@aztec/circuit-types';
11
11
  import {
12
+ type BlockHeader,
12
13
  type ContractInstance,
13
- type Header,
14
14
  type IndexedTaggingSecret,
15
15
  type KeyValidationRequest,
16
16
  type L1_TO_L2_MSG_TREE_HEIGHT,
@@ -127,8 +127,8 @@ export abstract class TypedOracle {
127
127
  throw new OracleMethodNotAvailableError('getLowNullifierMembershipWitness');
128
128
  }
129
129
 
130
- getHeader(_blockNumber: number): Promise<Header | undefined> {
131
- throw new OracleMethodNotAvailableError('getHeader');
130
+ getBlockHeader(_blockNumber: number): Promise<BlockHeader | undefined> {
131
+ throw new OracleMethodNotAvailableError('getBlockHeader');
132
132
  }
133
133
 
134
134
  getCompleteAddress(_account: AztecAddress): Promise<CompleteAddress> {
@@ -237,8 +237,8 @@ export abstract class TypedOracle {
237
237
  throw new OracleMethodNotAvailableError('debugLog');
238
238
  }
239
239
 
240
- getAppTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<IndexedTaggingSecret> {
241
- throw new OracleMethodNotAvailableError('getAppTaggingSecretAsSender');
240
+ getIndexedTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<IndexedTaggingSecret> {
241
+ throw new OracleMethodNotAvailableError('getIndexedTaggingSecretAsSender');
242
242
  }
243
243
 
244
244
  incrementAppTaggingSecretIndexAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<void> {
@@ -32,7 +32,7 @@ export function toACVMField(
32
32
  } else if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'bigint') {
33
33
  buffer = new Fr(value).toBuffer();
34
34
  } else if (typeof value === 'string') {
35
- buffer = Fr.fromString(value).toBuffer();
35
+ buffer = Fr.fromHexString(value).toBuffer();
36
36
  } else {
37
37
  buffer = value.toBuffer();
38
38
  }
@@ -1,4 +1,4 @@
1
- import { type AztecAddress, FunctionSelector } from '@aztec/circuits.js';
1
+ import { type AztecAddress } from '@aztec/circuits.js';
2
2
  import { type Fr } from '@aztec/foundation/fields';
3
3
 
4
4
  import { type AvmExecutionEnvironment } from './avm_execution_environment.js';
@@ -43,13 +43,12 @@ export class AvmContext {
43
43
  calldata: Fr[],
44
44
  allocatedGas: Gas,
45
45
  callType: 'CALL' | 'STATICCALL',
46
- functionSelector: FunctionSelector = FunctionSelector.empty(),
47
46
  ): AvmContext {
48
47
  const deriveFn =
49
48
  callType === 'CALL'
50
49
  ? this.environment.deriveEnvironmentForNestedCall
51
50
  : this.environment.deriveEnvironmentForNestedStaticCall;
52
- const newExecutionEnvironment = deriveFn.call(this.environment, address, calldata, functionSelector);
51
+ const newExecutionEnvironment = deriveFn.call(this.environment, address, calldata);
53
52
  const forkedWorldState = this.persistableState.fork();
54
53
  const machineState = AvmMachineState.fromState(gasToGasLeft(allocatedGas));
55
54
  return new AvmContext(forkedWorldState, newExecutionEnvironment, machineState);
@@ -1,4 +1,4 @@
1
- import { FunctionSelector, type GlobalVariables } from '@aztec/circuits.js';
1
+ import { type GlobalVariables } from '@aztec/circuits.js';
2
2
  import { type AztecAddress } from '@aztec/foundation/aztec-address';
3
3
  import { Fr } from '@aztec/foundation/fields';
4
4
 
@@ -10,7 +10,6 @@ export class AvmExecutionEnvironment {
10
10
  constructor(
11
11
  public readonly address: AztecAddress,
12
12
  public readonly sender: AztecAddress,
13
- public readonly functionSelector: FunctionSelector, // may be temporary (#7224)
14
13
  public readonly contractCallDepth: Fr,
15
14
  public readonly transactionFee: Fr,
16
15
  public readonly globals: GlobalVariables,
@@ -18,16 +17,10 @@ export class AvmExecutionEnvironment {
18
17
  public readonly calldata: Fr[],
19
18
  ) {}
20
19
 
21
- private deriveEnvironmentForNestedCallInternal(
22
- targetAddress: AztecAddress,
23
- calldata: Fr[],
24
- functionSelector: FunctionSelector,
25
- isStaticCall: boolean,
26
- ) {
20
+ private deriveEnvironmentForNestedCallInternal(targetAddress: AztecAddress, calldata: Fr[], isStaticCall: boolean) {
27
21
  return new AvmExecutionEnvironment(
28
22
  /*address=*/ targetAddress,
29
23
  /*sender=*/ this.address,
30
- functionSelector,
31
24
  this.contractCallDepth.add(Fr.ONE),
32
25
  this.transactionFee,
33
26
  this.globals,
@@ -36,29 +29,11 @@ export class AvmExecutionEnvironment {
36
29
  );
37
30
  }
38
31
 
39
- public deriveEnvironmentForNestedCall(
40
- targetAddress: AztecAddress,
41
- calldata: Fr[],
42
- functionSelector: FunctionSelector = FunctionSelector.empty(),
43
- ): AvmExecutionEnvironment {
44
- return this.deriveEnvironmentForNestedCallInternal(
45
- targetAddress,
46
- calldata,
47
- functionSelector,
48
- /*isStaticCall=*/ false,
49
- );
32
+ public deriveEnvironmentForNestedCall(targetAddress: AztecAddress, calldata: Fr[]): AvmExecutionEnvironment {
33
+ return this.deriveEnvironmentForNestedCallInternal(targetAddress, calldata, /*isStaticCall=*/ false);
50
34
  }
51
35
 
52
- public deriveEnvironmentForNestedStaticCall(
53
- targetAddress: AztecAddress,
54
- calldata: Fr[],
55
- functionSelector: FunctionSelector,
56
- ): AvmExecutionEnvironment {
57
- return this.deriveEnvironmentForNestedCallInternal(
58
- targetAddress,
59
- calldata,
60
- functionSelector,
61
- /*isStaticCall=*/ true,
62
- );
36
+ public deriveEnvironmentForNestedStaticCall(targetAddress: AztecAddress, calldata: Fr[]): AvmExecutionEnvironment {
37
+ return this.deriveEnvironmentForNestedCallInternal(targetAddress, calldata, /*isStaticCall=*/ true);
63
38
  }
64
39
  }
@@ -10,7 +10,7 @@ import {
10
10
  import { AztecAddress } from '@aztec/foundation/aztec-address';
11
11
  import { toBufferBE } from '@aztec/foundation/bigint-buffer';
12
12
  import { Fr } from '@aztec/foundation/fields';
13
- import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
13
+ import { type Logger, createLogger } from '@aztec/foundation/log';
14
14
  import { type FunctionsOf } from '@aztec/foundation/types';
15
15
 
16
16
  import { strict as assert } from 'assert';
@@ -227,18 +227,19 @@ export enum TypeTag {
227
227
  export type TaggedMemoryInterface = FunctionsOf<TaggedMemory>;
228
228
 
229
229
  export class TaggedMemory implements TaggedMemoryInterface {
230
- static readonly log: DebugLogger = createDebugLogger('aztec:avm_simulator:memory');
230
+ static readonly log: Logger = createLogger('simulator:avm:memory');
231
231
 
232
232
  // Whether to track and validate memory accesses for each instruction.
233
233
  static readonly TRACK_MEMORY_ACCESSES = process.env.NODE_ENV === 'test';
234
234
 
235
- // FIXME: memory should be 2^32, but TS max array size is: 2^32 - 1
236
- static readonly MAX_MEMORY_SIZE = Number((1n << 32n) - 1n);
237
- private _mem: MemoryValue[];
235
+ // Memory is modelled by a map with key type being number.
236
+ // We however restrict the keys to be non-negative integers smaller than
237
+ // MAX_MEMORY_SIZE.
238
+ static readonly MAX_MEMORY_SIZE = Number(1n << 32n);
239
+ private _mem: Map<number, MemoryValue>;
238
240
 
239
241
  constructor() {
240
- // We do not initialize memory size here because otherwise tests blow up when diffing.
241
- this._mem = [];
242
+ this._mem = new Map<number, MemoryValue>();
242
243
  }
243
244
 
244
245
  public getMaxMemorySize(): number {
@@ -257,8 +258,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
257
258
  }
258
259
 
259
260
  public getAs<T>(offset: number): T {
261
+ assert(Number.isInteger(offset));
260
262
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
261
- const word = this._mem[offset];
263
+ const word = this._mem.get(offset);
262
264
  TaggedMemory.log.trace(`get(${offset}) = ${word}`);
263
265
  if (word === undefined) {
264
266
  TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`);
@@ -268,46 +270,46 @@ export class TaggedMemory implements TaggedMemoryInterface {
268
270
  }
269
271
 
270
272
  public getSlice(offset: number, size: number): MemoryValue[] {
273
+ assert(Number.isInteger(offset) && Number.isInteger(size));
271
274
  assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
272
- const value = this._mem.slice(offset, offset + size);
273
- TaggedMemory.log.trace(`getSlice(${offset}, ${size}) = ${value}`);
274
- for (let i = 0; i < value.length; i++) {
275
- if (value[i] === undefined) {
276
- value[i] = new Field(0);
277
- }
275
+ const slice = new Array<MemoryValue>(size);
276
+
277
+ for (let i = 0; i < size; i++) {
278
+ slice[i] = this._mem.get(offset + i) ?? new Field(0);
278
279
  }
279
- assert(value.length === size, `Expected slice of size ${size}, got ${value.length}.`);
280
- return value;
280
+
281
+ TaggedMemory.log.trace(`getSlice(${offset}, ${size}) = ${slice}`);
282
+ return slice;
281
283
  }
282
284
 
283
285
  public getSliceAs<T>(offset: number, size: number): T[] {
284
- assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
285
286
  return this.getSlice(offset, size) as T[];
286
287
  }
287
288
 
288
289
  public getSliceTags(offset: number, size: number): TypeTag[] {
289
- assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
290
- return this._mem.slice(offset, offset + size).map(TaggedMemory.getTag);
290
+ return this.getSlice(offset, size).map(TaggedMemory.getTag);
291
291
  }
292
292
 
293
293
  public set(offset: number, v: MemoryValue) {
294
+ assert(Number.isInteger(offset));
294
295
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
295
- this._mem[offset] = v;
296
+ this._mem.set(offset, v);
296
297
  TaggedMemory.log.trace(`set(${offset}, ${v})`);
297
298
  }
298
299
 
299
- public setSlice(offset: number, vs: MemoryValue[]) {
300
- assert(offset + vs.length <= TaggedMemory.MAX_MEMORY_SIZE);
301
- // We may need to extend the memory size, otherwise splice doesn't insert.
302
- if (offset + vs.length > this._mem.length) {
303
- this._mem.length = offset + vs.length;
304
- }
305
- this._mem.splice(offset, vs.length, ...vs);
306
- TaggedMemory.log.trace(`setSlice(${offset}, ${vs})`);
300
+ public setSlice(offset: number, slice: MemoryValue[]) {
301
+ assert(Number.isInteger(offset));
302
+ assert(offset + slice.length <= TaggedMemory.MAX_MEMORY_SIZE);
303
+ slice.forEach((element, idx) => {
304
+ this._mem.set(offset + idx, element);
305
+ });
306
+ TaggedMemory.log.trace(`setSlice(${offset}, ${slice})`);
307
307
  }
308
308
 
309
309
  public getTag(offset: number): TypeTag {
310
- return TaggedMemory.getTag(this._mem[offset]);
310
+ assert(Number.isInteger(offset));
311
+ assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
312
+ return TaggedMemory.getTag(this._mem.get(offset));
311
313
  }
312
314
 
313
315
  /**
@@ -1,11 +1,5 @@
1
- import {
2
- type AztecAddress,
3
- Fr,
4
- type FunctionSelector,
5
- type GlobalVariables,
6
- MAX_L2_GAS_PER_ENQUEUED_CALL,
7
- } from '@aztec/circuits.js';
8
- import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
1
+ import { type AztecAddress, Fr, type GlobalVariables, MAX_L2_GAS_PER_TX_PUBLIC_PORTION } from '@aztec/circuits.js';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
9
3
 
10
4
  import { strict as assert } from 'assert';
11
5
 
@@ -41,7 +35,7 @@ type PcTally = {
41
35
  };
42
36
 
43
37
  export class AvmSimulator {
44
- private log: DebugLogger;
38
+ private log: Logger;
45
39
  private bytecode: Buffer | undefined;
46
40
  private opcodeTallies: Map<string, OpcodeTally> = new Map();
47
41
  private pcTallies: Map<number, PcTally> = new Map();
@@ -49,12 +43,14 @@ export class AvmSimulator {
49
43
  private tallyPrintFunction = () => {};
50
44
  private tallyInstructionFunction = (_a: number, _b: string, _c: Gas) => {};
51
45
 
46
+ // Test Purposes only: Logger will not have the proper function name. Use this constructor for testing purposes
47
+ // only. Otherwise, use build() below.
52
48
  constructor(private context: AvmContext, private instructionSet: InstructionSet = INSTRUCTION_SET()) {
53
49
  assert(
54
- context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_ENQUEUED_CALL,
55
- `Cannot allocate more than ${MAX_L2_GAS_PER_ENQUEUED_CALL} to the AVM for execution of an enqueued call`,
50
+ context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_TX_PUBLIC_PORTION,
51
+ `Cannot allocate more than ${MAX_L2_GAS_PER_TX_PUBLIC_PORTION} to the AVM for execution.`,
56
52
  );
57
- this.log = createDebugLogger(`aztec:avm_simulator:core(f:${context.environment.functionSelector.toString()})`);
53
+ this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata[0]})`);
58
54
  // TODO(palla/log): Should tallies be printed on debug, or only on trace?
59
55
  if (this.log.isLevelEnabled('debug')) {
60
56
  this.tallyPrintFunction = this.printOpcodeTallies;
@@ -62,11 +58,20 @@ export class AvmSimulator {
62
58
  }
63
59
  }
64
60
 
65
- public static create(
61
+ // Factory to have a proper function name in the logger. Retrieving the name is asynchronous and
62
+ // cannot be done as part of the constructor.
63
+ public static async build(context: AvmContext): Promise<AvmSimulator> {
64
+ const simulator = new AvmSimulator(context);
65
+ const fnName = await context.persistableState.getPublicFunctionDebugName(context.environment);
66
+ simulator.log = createLogger(`simulator:avm(f:${fnName})`);
67
+
68
+ return simulator;
69
+ }
70
+
71
+ public static async create(
66
72
  stateManager: AvmPersistableStateManager,
67
73
  address: AztecAddress,
68
74
  sender: AztecAddress,
69
- functionSelector: FunctionSelector, // may be temporary (#7224)
70
75
  transactionFee: Fr,
71
76
  globals: GlobalVariables,
72
77
  isStaticCall: boolean,
@@ -76,7 +81,6 @@ export class AvmSimulator {
76
81
  const avmExecutionEnv = new AvmExecutionEnvironment(
77
82
  address,
78
83
  sender,
79
- functionSelector,
80
84
  /*contractCallDepth=*/ Fr.zero(),
81
85
  transactionFee,
82
86
  globals,
@@ -86,8 +90,7 @@ export class AvmSimulator {
86
90
 
87
91
  const avmMachineState = new AvmMachineState(allocatedGas);
88
92
  const avmContext = new AvmContext(stateManager, avmExecutionEnv, avmMachineState);
89
- const instructionSet = INSTRUCTION_SET();
90
- return new AvmSimulator(avmContext, instructionSet);
93
+ return await AvmSimulator.build(avmContext);
91
94
  }
92
95
 
93
96
  /**
@@ -98,11 +101,12 @@ export class AvmSimulator {
98
101
  if (!bytecode) {
99
102
  // revert, consuming all gas
100
103
  const message = `No bytecode found at: ${this.context.environment.address}. Reverting...`;
104
+ const fnName = await this.context.persistableState.getPublicFunctionDebugName(this.context.environment);
101
105
  const revertReason = new AvmRevertReason(
102
106
  message,
103
107
  /*failingFunction=*/ {
104
108
  contractAddress: this.context.environment.address,
105
- functionSelector: this.context.environment.functionSelector,
109
+ functionName: fnName,
106
110
  },
107
111
  /*noirCallStack=*/ [],
108
112
  );
@@ -110,7 +114,7 @@ export class AvmSimulator {
110
114
  return new AvmContractCallResult(
111
115
  /*reverted=*/ true,
112
116
  /*output=*/ [],
113
- /*gasLeft=*/ { l2Gas: 0, daGas: 0 },
117
+ /*gasLeft=*/ { l2Gas: 0, daGas: 0 }, // consumes all allocated gas
114
118
  revertReason,
115
119
  );
116
120
  }
@@ -176,7 +180,7 @@ export class AvmSimulator {
176
180
 
177
181
  const output = machineState.getOutput();
178
182
  const reverted = machineState.getReverted();
179
- const revertReason = reverted ? revertReasonFromExplicitRevert(output, this.context) : undefined;
183
+ const revertReason = reverted ? await revertReasonFromExplicitRevert(output, this.context) : undefined;
180
184
  const results = new AvmContractCallResult(reverted, output, machineState.gasLeft, revertReason);
181
185
  this.log.debug(`Context execution results: ${results.toString()}`);
182
186
 
@@ -190,9 +194,11 @@ export class AvmSimulator {
190
194
  throw err;
191
195
  }
192
196
 
193
- const revertReason = revertReasonFromExceptionalHalt(err, this.context);
197
+ const revertReason = await revertReasonFromExceptionalHalt(err, this.context);
198
+ // Exceptional halts consume all allocated gas
199
+ const noGasLeft = { l2Gas: 0, daGas: 0 };
194
200
  // Note: "exceptional halts" cannot return data, hence [].
195
- const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], machineState.gasLeft, revertReason);
201
+ const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], noGasLeft, revertReason);
196
202
  this.log.debug(`Context execution results: ${results.toString()}`);
197
203
 
198
204
  this.tallyPrintFunction();
@@ -1,5 +1,5 @@
1
1
  import { type IndexedTreeId, MerkleTreeId, type MerkleTreeReadOperations, getTreeHeight } from '@aztec/circuit-types';
2
- import { NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/circuits.js';
2
+ import { AppendOnlyTreeSnapshot, NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/circuits.js';
3
3
  import { poseidon2Hash } from '@aztec/foundation/crypto';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
5
  import { type IndexedTreeLeafPreimage, type TreeLeafPreimage } from '@aztec/foundation/trees';
@@ -550,6 +550,11 @@ export class AvmEphemeralForest {
550
550
  const input = preimage.toHashInputs().map(x => Fr.fromBuffer(x));
551
551
  return poseidon2Hash(input);
552
552
  }
553
+
554
+ getTreeSnapshot(id: MerkleTreeId): AppendOnlyTreeSnapshot {
555
+ const tree = this.treeMap.get(id)!;
556
+ return new AppendOnlyTreeSnapshot(tree.getRoot(), Number(tree.leafCount));
557
+ }
553
558
  }
554
559
 
555
560
  /****************************************************/
package/src/avm/errors.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type FailingFunction, type NoirCallStack } from '@aztec/circuit-types';
2
- import { type AztecAddress, Fr, FunctionSelector, PUBLIC_DISPATCH_SELECTOR } from '@aztec/circuits.js';
2
+ import { type AztecAddress, type Fr } from '@aztec/circuits.js';
3
3
 
4
4
  import { ExecutionError } from '../common/errors.js';
5
5
  import { type AvmContext } from './avm_context.js';
@@ -138,16 +138,9 @@ export class AvmRevertReason extends ExecutionError {
138
138
  }
139
139
  }
140
140
 
141
- function createRevertReason(message: string, revertData: Fr[], context: AvmContext): AvmRevertReason {
142
- // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Properly fix this.
143
- // If the function selector is the public dispatch selector, we need to extract the actual function selector from the calldata.
144
- // We should remove this because the AVM (or public protocol) shouldn't be aware of the public dispatch calling convention.
145
- let functionSelector = context.environment.functionSelector;
141
+ async function createRevertReason(message: string, revertData: Fr[], context: AvmContext): Promise<AvmRevertReason> {
146
142
  // We drop the returnPc information.
147
143
  const internalCallStack = context.machineState.internalCallStack.map(entry => entry.callPc);
148
- if (functionSelector.toField().equals(new Fr(PUBLIC_DISPATCH_SELECTOR)) && context.environment.calldata.length > 0) {
149
- functionSelector = FunctionSelector.fromField(context.environment.calldata[0]);
150
- }
151
144
 
152
145
  // If we are reverting due to the same error that we have been tracking, we use the nested error as the cause.
153
146
  let nestedError = undefined;
@@ -160,11 +153,13 @@ function createRevertReason(message: string, revertData: Fr[], context: AvmConte
160
153
  message = context.machineState.collectedRevertInfo.recursiveRevertReason.message;
161
154
  }
162
155
 
156
+ const fnName = await context.persistableState.getPublicFunctionDebugName(context.environment);
157
+
163
158
  return new AvmRevertReason(
164
159
  message,
165
160
  /*failingFunction=*/ {
166
161
  contractAddress: context.environment.address,
167
- functionSelector: functionSelector,
162
+ functionName: fnName,
168
163
  },
169
164
  /*noirCallStack=*/ [...internalCallStack, context.machineState.pc].map(pc => `0.${pc}`),
170
165
  /*options=*/ { cause: nestedError },
@@ -177,8 +172,11 @@ function createRevertReason(message: string, revertData: Fr[], context: AvmConte
177
172
  * @param haltingError - the lower-level error causing the exceptional halt
178
173
  * @param context - the context of the AVM execution used to extract the failingFunction and noirCallStack
179
174
  */
180
- export function revertReasonFromExceptionalHalt(haltingError: AvmExecutionError, context: AvmContext): AvmRevertReason {
181
- return createRevertReason(haltingError.message, [], context);
175
+ export async function revertReasonFromExceptionalHalt(
176
+ haltingError: AvmExecutionError,
177
+ context: AvmContext,
178
+ ): Promise<AvmRevertReason> {
179
+ return await createRevertReason(haltingError.message, [], context);
182
180
  }
183
181
 
184
182
  /**
@@ -187,6 +185,6 @@ export function revertReasonFromExceptionalHalt(haltingError: AvmExecutionError,
187
185
  * @param revertData - output data of the explicit REVERT instruction
188
186
  * @param context - the context of the AVM execution used to extract the failingFunction and noirCallStack
189
187
  */
190
- export function revertReasonFromExplicitRevert(revertData: Fr[], context: AvmContext): AvmRevertReason {
191
- return createRevertReason('Assertion failed: ', revertData, context);
188
+ export async function revertReasonFromExplicitRevert(revertData: Fr[], context: AvmContext): Promise<AvmRevertReason> {
189
+ return await createRevertReason('Assertion failed: ', revertData, context);
192
190
  }