@aztec-labs/simulator 6.0.0-nightly.20260829

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 (215) hide show
  1. package/README.md +57 -0
  2. package/dest/client.d.ts +6 -0
  3. package/dest/client.d.ts.map +1 -0
  4. package/dest/client.js +3 -0
  5. package/dest/common/errors.d.ts +51 -0
  6. package/dest/common/errors.d.ts.map +1 -0
  7. package/dest/common/errors.js +154 -0
  8. package/dest/common/index.d.ts +3 -0
  9. package/dest/common/index.d.ts.map +1 -0
  10. package/dest/common/index.js +2 -0
  11. package/dest/common/stats/index.d.ts +2 -0
  12. package/dest/common/stats/index.d.ts.map +1 -0
  13. package/dest/common/stats/index.js +1 -0
  14. package/dest/common/stats/stats.d.ts +4 -0
  15. package/dest/common/stats/stats.d.ts.map +1 -0
  16. package/dest/common/stats/stats.js +10 -0
  17. package/dest/private/acvm/acvm.d.ts +43 -0
  18. package/dest/private/acvm/acvm.d.ts.map +1 -0
  19. package/dest/private/acvm/acvm.js +65 -0
  20. package/dest/private/acvm/acvm_types.d.ts +10 -0
  21. package/dest/private/acvm/acvm_types.d.ts.map +1 -0
  22. package/dest/private/acvm/acvm_types.js +3 -0
  23. package/dest/private/acvm/deserialize.d.ts +35 -0
  24. package/dest/private/acvm/deserialize.d.ts.map +1 -0
  25. package/dest/private/acvm/deserialize.js +50 -0
  26. package/dest/private/acvm/index.d.ts +5 -0
  27. package/dest/private/acvm/index.d.ts.map +1 -0
  28. package/dest/private/acvm/index.js +4 -0
  29. package/dest/private/acvm/serialize.d.ts +41 -0
  30. package/dest/private/acvm/serialize.d.ts.map +1 -0
  31. package/dest/private/acvm/serialize.js +99 -0
  32. package/dest/private/acvm_native.d.ts +41 -0
  33. package/dest/private/acvm_native.d.ts.map +1 -0
  34. package/dest/private/acvm_native.js +147 -0
  35. package/dest/private/acvm_wasm.d.ts +16 -0
  36. package/dest/private/acvm_wasm.d.ts.map +1 -0
  37. package/dest/private/acvm_wasm.js +67 -0
  38. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  39. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  40. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  41. package/dest/private/circuit_simulator.d.ts +35 -0
  42. package/dest/private/circuit_simulator.d.ts.map +1 -0
  43. package/dest/private/circuit_simulator.js +43 -0
  44. package/dest/private/factory.d.ts +12 -0
  45. package/dest/private/factory.d.ts.map +1 -0
  46. package/dest/private/factory.js +30 -0
  47. package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
  48. package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
  49. package/dest/public/avm/testing/account_proof_fetcher.js +152 -0
  50. package/dest/public/avm/testing/base_avm_simulation_tester.d.ts +39 -0
  51. package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
  52. package/dest/public/avm/testing/base_avm_simulation_tester.js +121 -0
  53. package/dest/public/avm/testing/utils.d.ts +32 -0
  54. package/dest/public/avm/testing/utils.d.ts.map +1 -0
  55. package/dest/public/avm/testing/utils.js +66 -0
  56. package/dest/public/avm_simulator.d.ts +28 -0
  57. package/dest/public/avm_simulator.d.ts.map +1 -0
  58. package/dest/public/avm_simulator.js +4 -0
  59. package/dest/public/avm_simulator_pool.d.ts +84 -0
  60. package/dest/public/avm_simulator_pool.d.ts.map +1 -0
  61. package/dest/public/avm_simulator_pool.js +311 -0
  62. package/dest/public/cdb_ipc_server.d.ts +40 -0
  63. package/dest/public/cdb_ipc_server.d.ts.map +1 -0
  64. package/dest/public/cdb_ipc_server.js +153 -0
  65. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  66. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  67. package/dest/public/contracts_db_checkpoint.js +30 -0
  68. package/dest/public/db_interfaces.d.ts +68 -0
  69. package/dest/public/db_interfaces.d.ts.map +1 -0
  70. package/dest/public/db_interfaces.js +3 -0
  71. package/dest/public/executor_metrics.d.ts +21 -0
  72. package/dest/public/executor_metrics.d.ts.map +1 -0
  73. package/dest/public/executor_metrics.js +64 -0
  74. package/dest/public/executor_metrics_interface.d.ts +10 -0
  75. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  76. package/dest/public/executor_metrics_interface.js +1 -0
  77. package/dest/public/fixtures/amm_test.d.ts +10 -0
  78. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  79. package/dest/public/fixtures/amm_test.js +213 -0
  80. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  81. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  82. package/dest/public/fixtures/bulk_test.js +289 -0
  83. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  84. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  85. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  86. package/dest/public/fixtures/index.d.ts +10 -0
  87. package/dest/public/fixtures/index.d.ts.map +1 -0
  88. package/dest/public/fixtures/index.js +9 -0
  89. package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
  90. package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
  91. package/dest/public/fixtures/public_processor_test_env.js +73 -0
  92. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +77 -0
  93. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
  94. package/dest/public/fixtures/public_tx_simulation_tester.js +176 -0
  95. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  96. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  97. package/dest/public/fixtures/simple_contract_data_source.js +95 -0
  98. package/dest/public/fixtures/token_test.d.ts +12 -0
  99. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  100. package/dest/public/fixtures/token_test.js +96 -0
  101. package/dest/public/fixtures/utils.d.ts +26 -0
  102. package/dest/public/fixtures/utils.d.ts.map +1 -0
  103. package/dest/public/fixtures/utils.js +170 -0
  104. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +65 -0
  105. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  106. package/dest/public/fuzzing/avm_fuzzer_simulator.js +181 -0
  107. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  108. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  109. package/dest/public/fuzzing/avm_simulator_bin.js +108 -0
  110. package/dest/public/index.d.ts +10 -0
  111. package/dest/public/index.d.ts.map +1 -0
  112. package/dest/public/index.js +6 -0
  113. package/dest/public/public_db_sources.d.ts +83 -0
  114. package/dest/public/public_db_sources.d.ts.map +1 -0
  115. package/dest/public/public_db_sources.js +297 -0
  116. package/dest/public/public_errors.d.ts +12 -0
  117. package/dest/public/public_errors.d.ts.map +1 -0
  118. package/dest/public/public_errors.js +13 -0
  119. package/dest/public/public_processor/guarded_merkle_tree.d.ts +52 -0
  120. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  121. package/dest/public/public_processor/guarded_merkle_tree.js +116 -0
  122. package/dest/public/public_processor/public_processor.d.ts +71 -0
  123. package/dest/public/public_processor/public_processor.d.ts.map +1 -0
  124. package/dest/public/public_processor/public_processor.js +858 -0
  125. package/dest/public/public_processor/public_processor_metrics.d.ts +30 -0
  126. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
  127. package/dest/public/public_processor/public_processor_metrics.js +116 -0
  128. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
  129. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
  130. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.js +39 -0
  131. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  132. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  133. package/dest/public/public_tx_simulator/factories.js +28 -0
  134. package/dest/public/public_tx_simulator/index.d.ts +6 -0
  135. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  136. package/dest/public/public_tx_simulator/index.js +3 -0
  137. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +53 -0
  138. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
  139. package/dest/public/public_tx_simulator/public_tx_simulator.js +127 -0
  140. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
  141. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
  142. package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
  143. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  144. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  145. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  146. package/dest/public/side_effect_errors.d.ts +44 -0
  147. package/dest/public/side_effect_errors.d.ts.map +1 -0
  148. package/dest/public/side_effect_errors.js +75 -0
  149. package/dest/public/test_executor_metrics.d.ts +56 -0
  150. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  151. package/dest/public/test_executor_metrics.js +305 -0
  152. package/dest/public/unique_class_ids.d.ts +37 -0
  153. package/dest/public/unique_class_ids.d.ts.map +1 -0
  154. package/dest/public/unique_class_ids.js +61 -0
  155. package/dest/public/utils.d.ts +3 -0
  156. package/dest/public/utils.d.ts.map +1 -0
  157. package/dest/public/utils.js +18 -0
  158. package/dest/server.d.ts +7 -0
  159. package/dest/server.d.ts.map +1 -0
  160. package/dest/server.js +5 -0
  161. package/package.json +109 -0
  162. package/src/client.ts +5 -0
  163. package/src/common/errors.ts +219 -0
  164. package/src/common/index.ts +2 -0
  165. package/src/common/stats/index.ts +1 -0
  166. package/src/common/stats/stats.ts +20 -0
  167. package/src/private/acvm/acvm.ts +114 -0
  168. package/src/private/acvm/acvm_types.ts +11 -0
  169. package/src/private/acvm/deserialize.ts +58 -0
  170. package/src/private/acvm/index.ts +4 -0
  171. package/src/private/acvm/serialize.ts +123 -0
  172. package/src/private/acvm_native.ts +200 -0
  173. package/src/private/acvm_wasm.ts +80 -0
  174. package/src/private/acvm_wasm_with_blobs.ts +55 -0
  175. package/src/private/circuit_simulator.ts +91 -0
  176. package/src/private/factory.ts +40 -0
  177. package/src/public/avm/testing/account_proof.json +553 -0
  178. package/src/public/avm/testing/account_proof_fetcher.ts +166 -0
  179. package/src/public/avm/testing/base_avm_simulation_tester.ts +162 -0
  180. package/src/public/avm/testing/utils.ts +114 -0
  181. package/src/public/avm_simulator.ts +29 -0
  182. package/src/public/avm_simulator_pool.ts +355 -0
  183. package/src/public/cdb_ipc_server.ts +198 -0
  184. package/src/public/contracts_db_checkpoint.ts +41 -0
  185. package/src/public/db_interfaces.ts +76 -0
  186. package/src/public/executor_metrics.ts +102 -0
  187. package/src/public/executor_metrics_interface.ts +20 -0
  188. package/src/public/fixtures/amm_test.ts +331 -0
  189. package/src/public/fixtures/bulk_test.ts +194 -0
  190. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  191. package/src/public/fixtures/index.ts +13 -0
  192. package/src/public/fixtures/public_processor_test_env.ts +88 -0
  193. package/src/public/fixtures/public_tx_simulation_tester.ts +315 -0
  194. package/src/public/fixtures/simple_contract_data_source.ts +122 -0
  195. package/src/public/fixtures/token_test.ts +148 -0
  196. package/src/public/fixtures/utils.ts +269 -0
  197. package/src/public/fuzzing/avm_fuzzer_simulator.ts +302 -0
  198. package/src/public/fuzzing/avm_simulator_bin.ts +156 -0
  199. package/src/public/index.ts +16 -0
  200. package/src/public/public_db_sources.ts +405 -0
  201. package/src/public/public_errors.ts +14 -0
  202. package/src/public/public_processor/guarded_merkle_tree.ts +161 -0
  203. package/src/public/public_processor/public_processor.ts +657 -0
  204. package/src/public/public_processor/public_processor_metrics.ts +138 -0
  205. package/src/public/public_tx_simulator/dumping_public_tx_simulator.ts +66 -0
  206. package/src/public/public_tx_simulator/factories.ts +61 -0
  207. package/src/public/public_tx_simulator/index.ts +8 -0
  208. package/src/public/public_tx_simulator/public_tx_simulator.ts +190 -0
  209. package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
  210. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  211. package/src/public/side_effect_errors.ts +96 -0
  212. package/src/public/test_executor_metrics.ts +399 -0
  213. package/src/public/unique_class_ids.ts +79 -0
  214. package/src/public/utils.ts +16 -0
  215. package/src/server.ts +6 -0
@@ -0,0 +1,399 @@
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec-labs/foundation/log';
2
+ import { Timer } from '@aztec-labs/foundation/timer';
3
+ import type { RevertCode } from '@aztec-labs/stdlib/avm';
4
+ import type { GasUsed } from '@aztec-labs/stdlib/gas';
5
+ import { strict as assert } from 'assert';
6
+
7
+ import type { ExecutorMetricsInterface } from './executor_metrics_interface.js';
8
+
9
+ export interface PublicEnqueuedCallMetrics {
10
+ fnName: string;
11
+ durationMs: number;
12
+ manaUsed: number;
13
+ totalInstructionsExecuted: number;
14
+ reverted: boolean;
15
+ }
16
+
17
+ export interface PublicTxMetrics {
18
+ // TS simulation
19
+ totalDurationMs: number;
20
+ manaUsed: number | undefined;
21
+ totalInstructionsExecuted: number;
22
+ nonRevertiblePrivateInsertionsUs: number | undefined;
23
+ revertiblePrivateInsertionsUs: number | undefined;
24
+ enqueuedCalls: PublicEnqueuedCallMetrics[];
25
+ revertedCode: RevertCode | undefined;
26
+ // Proving
27
+ proverSimulationStepMs: number | undefined;
28
+ proverProvingStepMs: number | undefined;
29
+ proverTraceGenerationStepMs: number | undefined;
30
+ // Proving (detail)
31
+ traceGenerationInteractionsMs: number | undefined;
32
+ traceGenerationTracesMs: number | undefined;
33
+ provingSumcheckMs: number | undefined;
34
+ provingPcsMs: number | undefined;
35
+ provingLogDerivativeInverseMs: number | undefined;
36
+ provingLogDerivativeInverseCommitmentsMs: number | undefined;
37
+ provingWireCommitmentsMs: number | undefined;
38
+ }
39
+
40
+ const NUM_SPACES = 4;
41
+ const H1 = '# ';
42
+ const H2 = '\n## ';
43
+ const INDENT = ' '.repeat(NUM_SPACES);
44
+ const INDENT0 = '- ';
45
+ const INDENT1 = INDENT + '- ';
46
+ const INDENT2 = INDENT + INDENT + '- ';
47
+ const H_LINE = '\n---------------------------------------------------------------------';
48
+
49
+ export enum PublicTxMetricsFilter {
50
+ ALL,
51
+ TOTALS,
52
+ DURATIONS,
53
+ INSTRUCTIONS,
54
+ PROVING,
55
+ }
56
+
57
+ function createEmptyTxMetrics(): PublicTxMetrics {
58
+ return {
59
+ // TS simulation
60
+ totalDurationMs: 0,
61
+ manaUsed: 0,
62
+ totalInstructionsExecuted: 0,
63
+ nonRevertiblePrivateInsertionsUs: undefined,
64
+ revertiblePrivateInsertionsUs: undefined,
65
+ enqueuedCalls: [],
66
+ revertedCode: undefined,
67
+ // Proving
68
+ proverSimulationStepMs: undefined,
69
+ proverProvingStepMs: undefined,
70
+ proverTraceGenerationStepMs: undefined,
71
+ // Proving (detail)
72
+ traceGenerationInteractionsMs: undefined,
73
+ traceGenerationTracesMs: undefined,
74
+ provingSumcheckMs: undefined,
75
+ provingPcsMs: undefined,
76
+ provingLogDerivativeInverseMs: undefined,
77
+ provingLogDerivativeInverseCommitmentsMs: undefined,
78
+ provingWireCommitmentsMs: undefined,
79
+ };
80
+ }
81
+
82
+ export class TestExecutorMetrics implements ExecutorMetricsInterface {
83
+ private logger: Logger;
84
+ // tx label -> tx metrics
85
+ private txMetrics: Map<string, PublicTxMetrics> = new Map();
86
+ private currentTxLabel: string | undefined;
87
+ private txTimer: Timer | undefined;
88
+
89
+ constructor(bindings?: LoggerBindings) {
90
+ this.logger = createLogger(`simulator:test_executor_metrics`, bindings);
91
+ }
92
+
93
+ startRecordingTxSimulation(txLabel: string) {
94
+ assert(!this.currentTxLabel, 'Cannot start recording tx simulation when another is live');
95
+ assert(!this.txMetrics.has(txLabel), 'Cannot start recording metrics for tx with duplicate label');
96
+ this.txMetrics.set(txLabel, createEmptyTxMetrics());
97
+ this.currentTxLabel = txLabel;
98
+ this.txTimer = new Timer();
99
+ }
100
+
101
+ stopRecordingTxSimulation(
102
+ txLabel: string,
103
+ gasUsed?: GasUsed,
104
+ revertedCode?: RevertCode,
105
+ stats?: Record<string, string>,
106
+ ) {
107
+ assert(this.currentTxLabel === txLabel, 'Cannot stop recording metrics for tx when another is live');
108
+
109
+ const txMetrics = this.txMetrics.get(txLabel)!;
110
+
111
+ // total duration of tx
112
+ txMetrics.totalDurationMs = this.txTimer!.ms();
113
+ this.logger.debug(`Public TX simulation of ${txLabel} took ${txMetrics.totalDurationMs}ms`);
114
+
115
+ // manaUsed and totalInstructionsExecuted are tx-level totals reported by the simulator.
116
+ txMetrics.manaUsed = gasUsed?.publicGas.l2Gas;
117
+ txMetrics.totalInstructionsExecuted = Number(stats?.['total_instructions_executed'] ?? 0);
118
+ txMetrics.revertedCode = revertedCode;
119
+
120
+ this.currentTxLabel = undefined;
121
+ }
122
+
123
+ recordEnqueuedCallSimulation(
124
+ fnName: string,
125
+ durationMs: number,
126
+ manaUsed: number,
127
+ totalInstructionsExecuted: number,
128
+ ) {
129
+ this.#recordEnqueuedCallSimulation(fnName, durationMs, manaUsed, totalInstructionsExecuted, false);
130
+ }
131
+
132
+ recordEnqueuedCallSimulationFailure(
133
+ fnName: string,
134
+ durationMs: number,
135
+ manaUsed: number,
136
+ totalInstructionsExecuted: number,
137
+ ) {
138
+ this.#recordEnqueuedCallSimulation(fnName, durationMs, manaUsed, totalInstructionsExecuted, true);
139
+ }
140
+
141
+ #recordEnqueuedCallSimulation(
142
+ fnName: string,
143
+ durationMs: number,
144
+ manaUsed: number,
145
+ totalInstructionsExecuted: number,
146
+ reverted: boolean,
147
+ ) {
148
+ assert(this.currentTxLabel, 'Cannot record enqueued call simulation when no tx is live');
149
+ const txMetrics = this.txMetrics.get(this.currentTxLabel)!;
150
+ txMetrics.enqueuedCalls.push({
151
+ fnName,
152
+ durationMs,
153
+ manaUsed,
154
+ totalInstructionsExecuted: totalInstructionsExecuted,
155
+ reverted,
156
+ });
157
+ }
158
+
159
+ recordPrivateEffectsInsertion(durationUs: number, type: 'revertible' | 'non-revertible') {
160
+ assert(this.currentTxLabel, 'Cannot record private effects insertion when no tx is live');
161
+ const txMetrics = this.txMetrics.get(this.currentTxLabel)!;
162
+ if (type === 'revertible') {
163
+ assert(
164
+ txMetrics.revertiblePrivateInsertionsUs === undefined,
165
+ 'Cannot RE-record revertible insertions of private effects',
166
+ );
167
+ txMetrics.revertiblePrivateInsertionsUs = durationUs;
168
+ } else {
169
+ assert(
170
+ txMetrics.nonRevertiblePrivateInsertionsUs === undefined,
171
+ 'Cannot RE-record non-revertible insertions of private effects',
172
+ );
173
+ txMetrics.nonRevertiblePrivateInsertionsUs = durationUs;
174
+ }
175
+ }
176
+
177
+ recordProverMetrics(txLabel: string, metrics: Partial<PublicTxMetrics>) {
178
+ if (!this.txMetrics.has(txLabel)) {
179
+ this.txMetrics.set(txLabel, createEmptyTxMetrics());
180
+ }
181
+ const txMetrics = this.txMetrics.get(txLabel)!;
182
+ for (const [key, value] of Object.entries(metrics)) {
183
+ if (key in txMetrics) {
184
+ txMetrics[key as keyof PublicTxMetrics] = value as any;
185
+ }
186
+ }
187
+ }
188
+
189
+ prettyPrint(filter: PublicTxMetricsFilter = PublicTxMetricsFilter.ALL) {
190
+ this.logger.info(this.toPrettyString(filter));
191
+ }
192
+
193
+ toPrettyString(filter: PublicTxMetricsFilter = PublicTxMetricsFilter.ALL) {
194
+ let pretty = '';
195
+ //pretty += H_LINE + '\n';
196
+ pretty += `${H1}Public TX Simulation Metrics (${PublicTxMetricsFilter[filter]})\n`;
197
+ for (const [txLabel, txMetrics] of this.txMetrics.entries()) {
198
+ //pretty += H_LINE + '\n';
199
+ pretty += `${H2}TX Label: ${txLabel}\n`;
200
+ if (
201
+ filter == PublicTxMetricsFilter.DURATIONS ||
202
+ filter === PublicTxMetricsFilter.TOTALS ||
203
+ filter === PublicTxMetricsFilter.ALL
204
+ ) {
205
+ pretty += `${INDENT0}Total duration: ${fmtNum(txMetrics.totalDurationMs, 'ms')}\n`;
206
+ }
207
+ if (filter === PublicTxMetricsFilter.TOTALS || filter === PublicTxMetricsFilter.ALL) {
208
+ const manaUsed = txMetrics.manaUsed || 0;
209
+ pretty += `${INDENT0}Total mana used: ${fmtNum(manaUsed)}\n`;
210
+ const manaPerSecond = Math.round((manaUsed * 1000) / txMetrics.totalDurationMs);
211
+ pretty += `${INDENT0}Mana per second: ${fmtNum(manaPerSecond)}\n`;
212
+ }
213
+
214
+ if (
215
+ filter === PublicTxMetricsFilter.INSTRUCTIONS ||
216
+ filter === PublicTxMetricsFilter.TOTALS ||
217
+ filter === PublicTxMetricsFilter.ALL
218
+ ) {
219
+ pretty += `${INDENT0}Total instructions executed: ${fmtNum(txMetrics.totalInstructionsExecuted)}\n`;
220
+ }
221
+ if (filter === PublicTxMetricsFilter.DURATIONS || filter === PublicTxMetricsFilter.ALL) {
222
+ pretty += `${INDENT0}Private insertions:\n`;
223
+ pretty += `${INDENT1}Non-revertible: ${fmtNum(txMetrics.nonRevertiblePrivateInsertionsUs! / 1_000, 'ms')}\n`;
224
+ pretty += `${INDENT1}Revertible: ${fmtNum(txMetrics.revertiblePrivateInsertionsUs! / 1_000, 'ms')}\n`;
225
+ }
226
+ if (filter === PublicTxMetricsFilter.PROVING || filter === PublicTxMetricsFilter.ALL) {
227
+ let provingPretty = '';
228
+ if (txMetrics.proverSimulationStepMs !== undefined) {
229
+ provingPretty += `${INDENT1}Simulation (all): ${fmtNum(txMetrics.proverSimulationStepMs, 'ms')}\n`;
230
+ }
231
+ if (txMetrics.proverProvingStepMs !== undefined) {
232
+ provingPretty += `${INDENT1}Proving (all): ${fmtNum(txMetrics.proverProvingStepMs, 'ms')}\n`;
233
+ }
234
+ if (txMetrics.proverTraceGenerationStepMs !== undefined) {
235
+ provingPretty += `${INDENT1}Trace generation (all): ${fmtNum(txMetrics.proverTraceGenerationStepMs, 'ms')}\n`;
236
+ }
237
+ if (txMetrics.traceGenerationInteractionsMs !== undefined) {
238
+ provingPretty += `${INDENT1}Trace generation interactions: ${fmtNum(txMetrics.traceGenerationInteractionsMs, 'ms')}\n`;
239
+ }
240
+ if (txMetrics.traceGenerationTracesMs !== undefined) {
241
+ provingPretty += `${INDENT1}Trace generation traces: ${fmtNum(txMetrics.traceGenerationTracesMs, 'ms')}\n`;
242
+ }
243
+ if (txMetrics.provingSumcheckMs !== undefined) {
244
+ provingPretty += `${INDENT1}Sumcheck: ${fmtNum(txMetrics.provingSumcheckMs, 'ms')}\n`;
245
+ }
246
+ if (txMetrics.provingPcsMs !== undefined) {
247
+ provingPretty += `${INDENT1}PCS: ${fmtNum(txMetrics.provingPcsMs, 'ms')}\n`;
248
+ }
249
+ if (txMetrics.provingLogDerivativeInverseMs !== undefined) {
250
+ provingPretty += `${INDENT1}Log derivative inverse: ${fmtNum(txMetrics.provingLogDerivativeInverseMs, 'ms')}\n`;
251
+ }
252
+ if (txMetrics.provingLogDerivativeInverseCommitmentsMs !== undefined) {
253
+ provingPretty += `${INDENT1}Log derivative inverse commitments: ${fmtNum(txMetrics.provingLogDerivativeInverseCommitmentsMs, 'ms')}\n`;
254
+ }
255
+ if (txMetrics.provingWireCommitmentsMs !== undefined) {
256
+ provingPretty += `${INDENT1}Wire commitments: ${fmtNum(txMetrics.provingWireCommitmentsMs, 'ms')}\n`;
257
+ }
258
+ if (provingPretty.length > 0) {
259
+ pretty += `${INDENT0}Proving:\n${provingPretty}`;
260
+ }
261
+ }
262
+ if (filter !== PublicTxMetricsFilter.TOTALS) {
263
+ // totals exclude enqueued calls
264
+ pretty += this.#enqueuedCallsToPrettyString(txMetrics, filter);
265
+ }
266
+ if (txMetrics.revertedCode !== undefined && !txMetrics.revertedCode.isOK()) {
267
+ pretty += `${INDENT0}Reverted code: ${txMetrics.revertedCode?.getDescription()}\n`;
268
+ }
269
+ pretty += H_LINE + '\n';
270
+ }
271
+ return pretty;
272
+ }
273
+
274
+ #enqueuedCallsToPrettyString(txMetrics: PublicTxMetrics, filter: PublicTxMetricsFilter) {
275
+ let pretty = '';
276
+ pretty += `${INDENT0}Enqueued public calls:\n`;
277
+ for (const enqueuedCall of txMetrics.enqueuedCalls) {
278
+ pretty += `${INDENT1}**Fn: ${enqueuedCall.fnName}**\n`;
279
+ if (filter === PublicTxMetricsFilter.DURATIONS || filter === PublicTxMetricsFilter.ALL) {
280
+ pretty += `${INDENT2}Duration: ${fmtNum(enqueuedCall.durationMs, 'ms')}\n`;
281
+ }
282
+ if (filter === PublicTxMetricsFilter.ALL) {
283
+ pretty += `${INDENT2}Mana used: ${fmtNum(enqueuedCall.manaUsed)}\n`;
284
+ const manaPerSecond = Math.round((enqueuedCall.manaUsed * 1000) / enqueuedCall.durationMs);
285
+ pretty += `${INDENT2}Mana per second: ${fmtNum(manaPerSecond)}\n`;
286
+ }
287
+
288
+ if (filter === PublicTxMetricsFilter.INSTRUCTIONS || filter === PublicTxMetricsFilter.ALL) {
289
+ pretty += `${INDENT2}Instructions executed: ${fmtNum(enqueuedCall.totalInstructionsExecuted)}\n`;
290
+ }
291
+ if (enqueuedCall.reverted) {
292
+ pretty += `${INDENT2}Reverted!\n`;
293
+ }
294
+ }
295
+ return pretty;
296
+ }
297
+
298
+ toJSON(indent = 2) {
299
+ return JSON.stringify(Object.fromEntries(this.txMetrics.entries()), null, indent);
300
+ }
301
+
302
+ toGithubActionBenchmarkJSON(indent = 2) {
303
+ const metricsInfo = {
304
+ totalInstructionsExecuted: {
305
+ name: 'totalInstructionsExecuted',
306
+ unit: '#instructions',
307
+ category: PublicTxMetricsFilter.INSTRUCTIONS,
308
+ },
309
+ totalDurationMs: {
310
+ name: 'totalDurationMs',
311
+ unit: 'ms',
312
+ category: PublicTxMetricsFilter.DURATIONS,
313
+ },
314
+ manaUsed: {
315
+ name: 'manaUsed',
316
+ unit: 'mana',
317
+ category: PublicTxMetricsFilter.TOTALS,
318
+ },
319
+ nonRevertiblePrivateInsertionsUs: {
320
+ name: 'nonRevertiblePrivateInsertionsUs',
321
+ unit: 'us',
322
+ category: PublicTxMetricsFilter.DURATIONS,
323
+ },
324
+ revertiblePrivateInsertionsUs: {
325
+ name: 'revertiblePrivateInsertionsUs',
326
+ unit: 'us',
327
+ category: PublicTxMetricsFilter.DURATIONS,
328
+ },
329
+ proverSimulationStepMs: {
330
+ name: 'proverSimulationStepMs',
331
+ unit: 'ms',
332
+ category: PublicTxMetricsFilter.PROVING,
333
+ },
334
+ proverProvingStepMs: {
335
+ name: 'proverProvingStepMs',
336
+ unit: 'ms',
337
+ category: PublicTxMetricsFilter.PROVING,
338
+ },
339
+ proverTraceGenerationStepMs: {
340
+ name: 'proverTraceGenerationStepMs',
341
+ unit: 'ms',
342
+ category: PublicTxMetricsFilter.PROVING,
343
+ },
344
+ traceGenerationInteractionsMs: {
345
+ name: 'traceGenerationInteractionsMs',
346
+ unit: 'ms',
347
+ category: PublicTxMetricsFilter.PROVING,
348
+ },
349
+ traceGenerationTracesMs: {
350
+ name: 'traceGenerationTracesMs',
351
+ unit: 'ms',
352
+ category: PublicTxMetricsFilter.PROVING,
353
+ },
354
+ provingSumcheckMs: {
355
+ name: 'provingSumcheckMs',
356
+ unit: 'ms',
357
+ category: PublicTxMetricsFilter.PROVING,
358
+ },
359
+ provingPcsMs: {
360
+ name: 'provingPcsMs',
361
+ unit: 'ms',
362
+ category: PublicTxMetricsFilter.PROVING,
363
+ },
364
+ provingLogDerivativeInverseMs: {
365
+ name: 'provingLogDerivativeInverseMs',
366
+ unit: 'ms',
367
+ category: PublicTxMetricsFilter.PROVING,
368
+ },
369
+ provingLogDerivativeInverseCommitmentsMs: {
370
+ name: 'provingLogDerivativeInverseCommitmentsMs',
371
+ unit: 'ms',
372
+ category: PublicTxMetricsFilter.PROVING,
373
+ },
374
+ provingWireCommitmentsMs: {
375
+ name: 'provingWireCommitmentsMs',
376
+ unit: 'ms',
377
+ category: PublicTxMetricsFilter.PROVING,
378
+ },
379
+ };
380
+
381
+ const data = [];
382
+ for (const [txLabel, txMetrics] of this.txMetrics.entries()) {
383
+ for (const [key, value] of Object.entries(txMetrics)) {
384
+ if (value !== undefined && key in metricsInfo) {
385
+ data.push({
386
+ name: `${txLabel}/${metricsInfo[key as keyof typeof metricsInfo].name}`,
387
+ value: value,
388
+ unit: metricsInfo[key as keyof typeof metricsInfo].unit,
389
+ });
390
+ }
391
+ }
392
+ }
393
+ return JSON.stringify(data, null, indent);
394
+ }
395
+ }
396
+
397
+ function fmtNum(num: number, unit?: string) {
398
+ return `\`${num.toLocaleString()}${unit ? ` ${unit}` : ''}\``;
399
+ }
@@ -0,0 +1,79 @@
1
+ import { MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS } from '@aztec-labs/constants';
2
+ import { strict as assert } from 'assert';
3
+
4
+ /**
5
+ * A class manage a de-duplicated set of class IDs that errors if you try to add a duplicate.
6
+ * Useful for bytecode retrieval hints to avoid duplicates in parent trace & grandparent trace....
7
+ */
8
+ export class UniqueClassIds {
9
+ private readonly classIds: Set<string> = new Set();
10
+
11
+ constructor(private readonly parent?: UniqueClassIds) {}
12
+
13
+ /**
14
+ * Create a fork that references this one as its parent
15
+ */
16
+ public fork() {
17
+ return new UniqueClassIds(/*parent=*/ this);
18
+ }
19
+
20
+ /**
21
+ * Check for a class ID here or in parent's (recursively).
22
+ *
23
+ * @param classId - the contract class ID (as a string) to check
24
+ * @returns boolean: whether the class ID is here
25
+ */
26
+ public has(classId: string): boolean {
27
+ // First try check this' classIds
28
+ let here = this.classIds.has(classId);
29
+ // Then try parent's
30
+ if (!here && this.parent) {
31
+ // Note: this will recurse to grandparent/etc until we reach top or find it
32
+ here = this.parent.has(classId);
33
+ }
34
+ return here;
35
+ }
36
+
37
+ /**
38
+ * Get the total number of classIds
39
+ */
40
+ public size(): number {
41
+ return this.classIds.size + (this.parent ? this.parent.size() : 0);
42
+ }
43
+
44
+ /**
45
+ * Add a class ID (if not already present) to the set.
46
+ *
47
+ * @param classId - the contract class ID (as a string)
48
+ */
49
+ public add(classId: string) {
50
+ assert(!this.has(classId), `Bug! Tried to add duplicate classId ${classId} to set of unique classIds.`);
51
+ if (!this.has(classId)) {
52
+ this.classIds.add(classId);
53
+ assert(
54
+ this.size() <= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
55
+ `Bug! Surpassed limit (${MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS}) of unique contract class IDs used for bytecode retrievals.`,
56
+ );
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Merge in another set of unique class IDs into this one, but fail on duplicates.
62
+ *
63
+ * @param incoming: other unique class IDs
64
+ */
65
+ public acceptAndMerge(incoming: UniqueClassIds) {
66
+ for (const classId of incoming.classIds.keys()) {
67
+ assert(
68
+ !this.has(classId),
69
+ `Bug! Cannot merge classId ${classId} into set of unique classIds as it already exists.`,
70
+ );
71
+ this.classIds.add(classId);
72
+ }
73
+ // since set() has an assertion, and size() always checks parent, this should be impossible
74
+ assert(
75
+ this.size() <= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
76
+ `Bug! Merging unique class Ids should never exceed the limit of ${MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS}.`,
77
+ );
78
+ }
79
+ }
@@ -0,0 +1,16 @@
1
+ import { PublicCallRequestWithCalldata, type Tx, TxExecutionPhase } from '@aztec-labs/stdlib/tx';
2
+
3
+ export function getCallRequestsWithCalldataByPhase(tx: Tx, phase: TxExecutionPhase): PublicCallRequestWithCalldata[] {
4
+ switch (phase) {
5
+ case TxExecutionPhase.SETUP:
6
+ return tx.getNonRevertiblePublicCallRequestsWithCalldata();
7
+ case TxExecutionPhase.APP_LOGIC:
8
+ return tx.getRevertiblePublicCallRequestsWithCalldata();
9
+ case TxExecutionPhase.TEARDOWN: {
10
+ const request = tx.getTeardownPublicCallRequestWithCalldata();
11
+ return request ? [request] : [];
12
+ }
13
+ default:
14
+ throw new Error(`Unknown phase: ${phase}`);
15
+ }
16
+ }
package/src/server.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './public/index.js';
2
+ export * from './private/acvm/index.js';
3
+ export { WASMSimulatorWithBlobs } from './private/acvm_wasm_with_blobs.js';
4
+ export { NativeACVMSimulator } from './private/acvm_native.js';
5
+ export { type CircuitSimulator, type DecodedError } from './private/circuit_simulator.js';
6
+ export * from './common/index.js';