@aztec/bb-prover 0.0.1-commit.c31f2472 → 0.0.1-commit.c52d6e7

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 (66) hide show
  1. package/dest/avm_proving_tests/avm_proving_tester.d.ts +16 -10
  2. package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
  3. package/dest/avm_proving_tests/avm_proving_tester.js +179 -115
  4. package/dest/bb/bb_js_backend.d.ts +196 -0
  5. package/dest/bb/bb_js_backend.d.ts.map +1 -0
  6. package/dest/bb/bb_js_backend.js +385 -0
  7. package/dest/bb/bb_js_debug.d.ts +52 -0
  8. package/dest/bb/bb_js_debug.d.ts.map +1 -0
  9. package/dest/bb/bb_js_debug.js +176 -0
  10. package/dest/bb/file_names.d.ts +4 -0
  11. package/dest/bb/file_names.d.ts.map +1 -0
  12. package/dest/bb/file_names.js +5 -0
  13. package/dest/config.d.ts +17 -1
  14. package/dest/config.d.ts.map +1 -1
  15. package/dest/index.d.ts +3 -2
  16. package/dest/index.d.ts.map +1 -1
  17. package/dest/index.js +2 -1
  18. package/dest/instrumentation.d.ts +1 -1
  19. package/dest/instrumentation.d.ts.map +1 -1
  20. package/dest/instrumentation.js +12 -4
  21. package/dest/prover/client/bb_private_kernel_prover.d.ts +21 -5
  22. package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
  23. package/dest/prover/client/bb_private_kernel_prover.js +79 -15
  24. package/dest/prover/proof_utils.d.ts +11 -1
  25. package/dest/prover/proof_utils.d.ts.map +1 -1
  26. package/dest/prover/proof_utils.js +24 -1
  27. package/dest/prover/server/bb_prover.d.ts +6 -7
  28. package/dest/prover/server/bb_prover.d.ts.map +1 -1
  29. package/dest/prover/server/bb_prover.js +210 -79
  30. package/dest/test/test_circuit_prover.d.ts +3 -3
  31. package/dest/test/test_circuit_prover.d.ts.map +1 -1
  32. package/dest/test/test_circuit_prover.js +2 -2
  33. package/dest/verification_key/verification_key_data.js +1 -1
  34. package/dest/verifier/batch_chonk_verifier.d.ts +56 -0
  35. package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
  36. package/dest/verifier/batch_chonk_verifier.js +384 -0
  37. package/dest/verifier/bb_verifier.d.ts +4 -1
  38. package/dest/verifier/bb_verifier.d.ts.map +1 -1
  39. package/dest/verifier/bb_verifier.js +134 -45
  40. package/dest/verifier/index.d.ts +2 -1
  41. package/dest/verifier/index.d.ts.map +1 -1
  42. package/dest/verifier/index.js +1 -0
  43. package/dest/verifier/queued_chonk_verifier.d.ts +2 -3
  44. package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -1
  45. package/dest/verifier/queued_chonk_verifier.js +6 -5
  46. package/package.json +19 -17
  47. package/src/avm_proving_tests/avm_proving_tester.ts +86 -131
  48. package/src/bb/bb_js_backend.ts +441 -0
  49. package/src/bb/bb_js_debug.ts +227 -0
  50. package/src/bb/file_names.ts +6 -0
  51. package/src/config.ts +16 -0
  52. package/src/index.ts +2 -1
  53. package/src/instrumentation.ts +12 -4
  54. package/src/prover/client/bb_private_kernel_prover.ts +242 -21
  55. package/src/prover/proof_utils.ts +41 -1
  56. package/src/prover/server/bb_prover.ts +130 -141
  57. package/src/test/test_circuit_prover.ts +3 -5
  58. package/src/verification_key/verification_key_data.ts +1 -1
  59. package/src/verifier/batch_chonk_verifier.ts +415 -0
  60. package/src/verifier/bb_verifier.ts +66 -76
  61. package/src/verifier/index.ts +1 -0
  62. package/src/verifier/queued_chonk_verifier.ts +6 -7
  63. package/dest/bb/execute.d.ts +0 -107
  64. package/dest/bb/execute.d.ts.map +0 -1
  65. package/dest/bb/execute.js +0 -647
  66. package/src/bb/execute.ts +0 -678
@@ -1,15 +1,14 @@
1
1
  import type { ClientProtocolCircuitVerifier, IVCProofVerificationResult } from '@aztec/stdlib/interfaces/server';
2
2
  import type { Tx } from '@aztec/stdlib/tx';
3
3
  import { type TelemetryClient } from '@aztec/telemetry-client';
4
- import type { BBConfig } from '../config.js';
5
4
  export declare class QueuedIVCVerifier implements ClientProtocolCircuitVerifier {
6
5
  private verifier;
7
6
  private telemetry;
8
7
  private logger;
9
8
  private queue;
10
9
  private metrics;
11
- constructor(config: BBConfig, verifier: ClientProtocolCircuitVerifier, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger);
10
+ constructor(verifier: ClientProtocolCircuitVerifier, concurrency: number, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger);
12
11
  verifyProof(tx: Tx): Promise<IVCProofVerificationResult>;
13
12
  stop(): Promise<void>;
14
13
  }
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWVkX2Nob25rX3ZlcmlmaWVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVyaWZpZXIvcXVldWVkX2Nob25rX3ZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakgsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQU1MLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBSWpDLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWlFN0MscUJBQWEsaUJBQWtCLFlBQVcsNkJBQTZCO0lBTW5FLE9BQU8sQ0FBQyxRQUFRO0lBQ2hCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxNQUFNO0lBUGhCLE9BQU8sQ0FBQyxLQUFLLENBQWM7SUFDM0IsT0FBTyxDQUFDLE9BQU8sQ0FBcUI7SUFFcEMsWUFDRSxNQUFNLEVBQUUsUUFBUSxFQUNSLFFBQVEsRUFBRSw2QkFBNkIsRUFDdkMsU0FBUyxHQUFFLGVBQXNDLEVBQ2pELE1BQU0seUNBQWtELEVBTWpFO0lBRVksV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBSXBFO0lBRUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFcEI7Q0FDRiJ9
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWVkX2Nob25rX3ZlcmlmaWVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVyaWZpZXIvcXVldWVkX2Nob25rX3ZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakgsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQU1MLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBbUVqQyxxQkFBYSxpQkFBa0IsWUFBVyw2QkFBNkI7SUFLbkUsT0FBTyxDQUFDLFFBQVE7SUFFaEIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLE1BQU07SUFQaEIsT0FBTyxDQUFDLEtBQUssQ0FBYztJQUMzQixPQUFPLENBQUMsT0FBTyxDQUFxQjtJQUVwQyxZQUNVLFFBQVEsRUFBRSw2QkFBNkIsRUFDL0MsV0FBVyxFQUFFLE1BQU0sRUFDWCxTQUFTLEdBQUUsZUFBc0MsRUFDakQsTUFBTSx5Q0FBa0QsRUFNakU7SUFFWSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FJcEU7SUFFSyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUcxQjtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"queued_chonk_verifier.d.ts","sourceRoot":"","sources":["../../src/verifier/queued_chonk_verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAML,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAiE7C,qBAAa,iBAAkB,YAAW,6BAA6B;IAMnE,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAqB;IAEpC,YACE,MAAM,EAAE,QAAQ,EACR,QAAQ,EAAE,6BAA6B,EACvC,SAAS,GAAE,eAAsC,EACjD,MAAM,yCAAkD,EAMjE;IAEY,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAIpE;IAED,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpB;CACF"}
1
+ {"version":3,"file":"queued_chonk_verifier.d.ts","sourceRoot":"","sources":["../../src/verifier/queued_chonk_verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAML,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAmEjC,qBAAa,iBAAkB,YAAW,6BAA6B;IAKnE,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAqB;IAEpC,YACU,QAAQ,EAAE,6BAA6B,EAC/C,WAAW,EAAE,MAAM,EACX,SAAS,GAAE,eAAsC,EACjD,MAAM,yCAAkD,EAMjE;IAEY,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAIpE;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAG1B;CACF"}
@@ -81,21 +81,22 @@ export class QueuedIVCVerifier {
81
81
  logger;
82
82
  queue;
83
83
  metrics;
84
- constructor(config, verifier, telemetry = getTelemetryClient(), logger = createLogger('bb-prover:queued_chonk_verifier')){
84
+ constructor(verifier, concurrency, telemetry = getTelemetryClient(), logger = createLogger('bb-prover:queued_chonk_verifier')){
85
85
  this.verifier = verifier;
86
86
  this.telemetry = telemetry;
87
87
  this.logger = logger;
88
88
  this.metrics = new IVCVerifierMetrics(this.telemetry, 'QueuedIVCVerifier');
89
89
  this.queue = new SerialQueue();
90
- this.logger.info(`Starting QueuedIVCVerifier with ${config.numConcurrentIVCVerifiers} concurrent verifiers`);
91
- this.queue.start(config.numConcurrentIVCVerifiers);
90
+ this.logger.info(`Starting QueuedIVCVerifier with ${concurrency} concurrent verifiers`);
91
+ this.queue.start(concurrency);
92
92
  }
93
93
  async verifyProof(tx) {
94
94
  const result = await this.queue.put(()=>this.verifier.verifyProof(tx));
95
95
  this.metrics.recordIVCVerification(result);
96
96
  return result;
97
97
  }
98
- stop() {
99
- return this.queue.end();
98
+ async stop() {
99
+ await this.queue.end();
100
+ await this.verifier.stop();
100
101
  }
101
102
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/bb-prover",
3
- "version": "0.0.1-commit.c31f2472",
3
+ "version": "0.0.1-commit.c52d6e7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -9,7 +9,8 @@
9
9
  "./client": "./dest/prover/client/bb_private_kernel_prover.js",
10
10
  "./verifier": "./dest/verifier/index.js",
11
11
  "./test": "./dest/test/index.js",
12
- "./config": "./dest/config.js"
12
+ "./config": "./dest/config.js",
13
+ "./debug": "./dest/bb/bb_js_debug.js"
13
14
  },
14
15
  "bin": {
15
16
  "bb-cli": "./dest/bb/index.js"
@@ -69,27 +70,28 @@
69
70
  ]
70
71
  },
71
72
  "dependencies": {
72
- "@aztec/bb.js": "0.0.1-commit.c31f2472",
73
- "@aztec/constants": "0.0.1-commit.c31f2472",
74
- "@aztec/foundation": "0.0.1-commit.c31f2472",
75
- "@aztec/noir-noirc_abi": "0.0.1-commit.c31f2472",
76
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.c31f2472",
77
- "@aztec/noir-types": "0.0.1-commit.c31f2472",
78
- "@aztec/simulator": "0.0.1-commit.c31f2472",
79
- "@aztec/stdlib": "0.0.1-commit.c31f2472",
80
- "@aztec/telemetry-client": "0.0.1-commit.c31f2472",
81
- "@aztec/world-state": "0.0.1-commit.c31f2472",
73
+ "@aztec/bb.js": "6.0.0-nightly.20260807",
74
+ "@aztec/constants": "0.0.1-commit.c52d6e7",
75
+ "@aztec/foundation": "0.0.1-commit.c52d6e7",
76
+ "@aztec/noir-noirc_abi": "6.0.0-nightly.20260807",
77
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.c52d6e7",
78
+ "@aztec/noir-types": "6.0.0-nightly.20260807",
79
+ "@aztec/simulator": "0.0.1-commit.c52d6e7",
80
+ "@aztec/stdlib": "0.0.1-commit.c52d6e7",
81
+ "@aztec/telemetry-client": "0.0.1-commit.c52d6e7",
82
+ "@aztec/world-state": "0.0.1-commit.c52d6e7",
82
83
  "commander": "^12.1.0",
84
+ "msgpackr": "^1.11.2",
83
85
  "pako": "^2.1.0",
84
86
  "source-map-support": "^0.5.21",
85
87
  "tslib": "^2.4.0"
86
88
  },
87
89
  "devDependencies": {
88
- "@aztec/ethereum": "0.0.1-commit.c31f2472",
89
- "@aztec/kv-store": "0.0.1-commit.c31f2472",
90
- "@aztec/noir-contracts.js": "0.0.1-commit.c31f2472",
91
- "@aztec/noir-test-contracts.js": "0.0.1-commit.c31f2472",
92
- "@aztec/protocol-contracts": "0.0.1-commit.c31f2472",
90
+ "@aztec/ethereum": "0.0.1-commit.c52d6e7",
91
+ "@aztec/kv-store": "0.0.1-commit.c52d6e7",
92
+ "@aztec/noir-contracts.js": "0.0.1-commit.c52d6e7",
93
+ "@aztec/noir-test-contracts.js": "0.0.1-commit.c52d6e7",
94
+ "@aztec/protocol-contracts": "0.0.1-commit.c52d6e7",
93
95
  "@jest/globals": "^30.0.0",
94
96
  "@types/jest": "^30.0.0",
95
97
  "@types/node": "^22.15.17",
@@ -1,89 +1,28 @@
1
- import type { LogFn, LogLevel, Logger } from '@aztec/foundation/log';
1
+ import type { AvmStat } from '@aztec/bb.js';
2
+ import { createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
3
4
  import {
5
+ type MeasuredSimulatorFactory,
4
6
  PublicTxSimulationTester,
5
7
  SimpleContractDataSource,
6
8
  type TestEnqueuedCall,
7
9
  type TestExecutorMetrics,
8
10
  type TestPrivateInsertions,
9
11
  } from '@aztec/simulator/public/fixtures';
12
+ import { AvmSimulatorPool, MeasuredPublicTxSimulator } from '@aztec/simulator/server';
10
13
  import type { PublicTxResult } from '@aztec/simulator/server';
11
14
  import { AvmCircuitInputs, AvmCircuitPublicInputs, PublicSimulatorConfig } from '@aztec/stdlib/avm';
12
15
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
16
+ import type { Gas } from '@aztec/stdlib/gas';
13
17
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
14
18
  import type { GlobalVariables } from '@aztec/stdlib/tx';
15
19
  import { NativeWorldStateService } from '@aztec/world-state';
16
20
 
17
- import fs from 'node:fs/promises';
18
- import { tmpdir } from 'node:os';
19
21
  import path from 'path';
20
22
 
21
- import { type BBResult, type BBSuccess, BB_RESULT, generateAvmProof, verifyAvmProof } from '../bb/execute.js';
23
+ import { BBJsFactory } from '../bb/bb_js_backend.js';
22
24
 
23
- const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
24
-
25
- // An InterceptingLogger that records all log messages and forwards them to a wrapped logger.
26
- class InterceptingLogger implements Logger {
27
- public readonly logs: string[] = [];
28
- public level: LogLevel;
29
- public module: string;
30
-
31
- private logger: Logger;
32
-
33
- constructor(logger: Logger) {
34
- this.logger = logger;
35
- this.level = logger.level;
36
- this.module = logger.module;
37
- }
38
-
39
- isLevelEnabled(level: LogLevel): boolean {
40
- return this.logger.isLevelEnabled(level);
41
- }
42
-
43
- createChild(_childModule: string): Logger {
44
- throw new Error('Not implemented');
45
- }
46
-
47
- getBindings() {
48
- return this.logger.getBindings();
49
- }
50
-
51
- private intercept(level: LogLevel, msg: string, ...args: any[]) {
52
- this.logs.push(...msg.split('\n'));
53
- // Forward to the wrapped logger
54
- (this.logger[level] as LogFn)(msg, ...args);
55
- }
56
-
57
- // Log methods for each level
58
- silent(msg: string, ...args: any[]) {
59
- this.intercept('silent', msg, ...args);
60
- }
61
- fatal(msg: string, ...args: any[]) {
62
- this.intercept('fatal', msg, ...args);
63
- }
64
- warn(msg: string, ...args: any[]) {
65
- this.intercept('warn', msg, ...args);
66
- }
67
- info(msg: string, ...args: any[]) {
68
- this.intercept('info', msg, ...args);
69
- }
70
- verbose(msg: string, ...args: any[]) {
71
- this.intercept('verbose', msg, ...args);
72
- }
73
- debug(msg: string, ...args: any[]) {
74
- this.intercept('debug', msg, ...args);
75
- }
76
- trace(msg: string, ...args: any[]) {
77
- this.intercept('trace', msg, ...args);
78
- }
79
-
80
- // Error log function can be string or Error
81
- error(err: Error | string, ...args: any[]) {
82
- const msg = typeof err === 'string' ? err : err.message;
83
- this.logs.push(msg);
84
- this.logger.error(msg, err, ...args);
85
- }
86
- }
25
+ const BB_PATH = path.resolve('../../labs-aztec-toolchain/bin/bb-avm');
87
26
 
88
27
  // Config with collectHints enabled for proving tests
89
28
  const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
@@ -96,7 +35,10 @@ const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
96
35
  });
97
36
 
98
37
  export class AvmProvingTester extends PublicTxSimulationTester {
99
- private bbWorkingDirectory: string = '';
38
+ private readonly bbJsFactory = new BBJsFactory(BB_PATH, {
39
+ debugDir: process.env.BB_DEBUG_OUTPUT_DIR,
40
+ logger: createLogger('bb-prover:avm-proving-tester'),
41
+ });
100
42
 
101
43
  constructor(
102
44
  private checkCircuitOnly: boolean,
@@ -104,9 +46,9 @@ export class AvmProvingTester extends PublicTxSimulationTester {
104
46
  merkleTrees: MerkleTreeWriteOperations,
105
47
  globals?: GlobalVariables,
106
48
  metrics?: TestExecutorMetrics,
49
+ simulatorFactory?: MeasuredSimulatorFactory,
107
50
  ) {
108
- // simulator factory is undefined because for proving, we use the default C++ simulator
109
- super(merkleTrees, contractDataSource, globals, metrics, /*simulatorFactory=*/ undefined, provingConfig);
51
+ super(merkleTrees, contractDataSource, globals, metrics, simulatorFactory, provingConfig);
110
52
  }
111
53
 
112
54
  static async new(
@@ -117,56 +59,82 @@ export class AvmProvingTester extends PublicTxSimulationTester {
117
59
  ) {
118
60
  const contractDataSource = new SimpleContractDataSource();
119
61
  const merkleTrees = await worldStateService.fork();
120
- return new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics);
62
+
63
+ const avmSimulator = await AvmSimulatorPool.spawn({ wsdbIpcPath: worldStateService.getIpcPath() });
64
+ const simulatorFactory: MeasuredSimulatorFactory = (mt, cdb, g, m, c) =>
65
+ new MeasuredPublicTxSimulator(avmSimulator, g, cdb, mt.getRevision().forkId, m, c, undefined);
66
+
67
+ const tester = new AvmProvingTester(
68
+ checkCircuitOnly,
69
+ contractDataSource,
70
+ merkleTrees,
71
+ globals,
72
+ metrics,
73
+ simulatorFactory,
74
+ );
75
+ tester.avmSimulator = avmSimulator;
76
+ return tester;
77
+ }
78
+
79
+ public override async close(): Promise<void> {
80
+ const results = await Promise.allSettled([super.close(), this.bbJsFactory.destroy()]);
81
+ const errors = results.flatMap(result => (result.status === 'rejected' ? [result.reason] : []));
82
+ if (errors.length > 0) {
83
+ throw new AggregateError(errors, `Failed to close AVM proving tester`);
84
+ }
121
85
  }
122
86
 
123
- async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<BBResult> {
124
- // We use a new working directory for each proof.
125
- this.bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
87
+ /**
88
+ * Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
89
+ * Returns the in-memory proof fields on success; throws via jest expect() on failure.
90
+ */
91
+ async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<Uint8Array[]> {
92
+ const inputsBuffer = avmCircuitInputs.serializeWithMessagePack();
126
93
 
127
- const interceptingLogger = new InterceptingLogger(this.logger);
94
+ if (this.checkCircuitOnly) {
95
+ await using instance = await this.bbJsFactory.getInstance();
96
+ const { passed, stats } = await instance.checkAvmCircuit(inputsBuffer);
97
+ this.recordProverMetrics(stats, txLabel);
98
+ expect(passed).toBe(true);
99
+ return [];
100
+ }
128
101
 
129
- // Then we prove.
130
- const proofRes = await generateAvmProof(
131
- BB_PATH,
132
- this.bbWorkingDirectory,
133
- avmCircuitInputs,
134
- interceptingLogger,
135
- this.checkCircuitOnly,
136
- );
137
- if (proofRes.status === BB_RESULT.FAILURE) {
138
- this.logger.error(`Proof generation failed: ${proofRes.reason}`);
102
+ await using instance = await this.bbJsFactory.getInstance();
103
+ const { proof, stats } = await instance.generateAvmProof(inputsBuffer);
104
+ this.recordProverMetrics(stats, txLabel);
105
+ return proof;
106
+ }
107
+
108
+ async verify(proof: Uint8Array[], publicInputs: AvmCircuitPublicInputs): Promise<void> {
109
+ if (this.checkCircuitOnly) {
110
+ // Check-circuit did not generate a proof; nothing to verify.
111
+ return;
139
112
  }
140
- expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
113
+ const piBuffer = publicInputs.serializeWithMessagePack();
114
+ await using instance = await this.bbJsFactory.getInstance();
115
+ const { verified } = await instance.verifyAvmProof(proof, piBuffer);
116
+ expect(verified).toBe(true);
117
+ }
141
118
 
142
- // Parse the logs into a structured format.
143
- const logs = interceptingLogger.logs;
144
- // const traceSizes: { name: string; size: number }[] = [];
145
- // logs.forEach(log => {
146
- // const match = log.match(/\b(\w+): (\d+) \(~2/);
147
- // if (match) {
148
- // traceSizes.push({
149
- // name: match[1],
150
- // size: parseInt(match[2]),
151
- // });
152
- // }
153
- // });
154
- const times: { [key: string]: number } = {};
155
- logs.forEach(log => {
156
- const match = log.match(/\b([\w/]+)_ms: (\d+)/);
157
- if (match) {
158
- times[match[1]] = parseInt(match[2]);
159
- }
160
- });
119
+ public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
120
+ const proof = await this.prove(avmCircuitInputs, txLabel);
121
+ await this.verify(proof, avmCircuitInputs.publicInputs);
122
+ }
161
123
 
162
- // Throw if logs did not contain any times.
124
+ private recordProverMetrics(stats: AvmStat[], txLabel: string) {
125
+ // Build a lookup keyed on the stage name with the `_ms` suffix stripped, matching the legacy
126
+ // stdout-scraped shape. bb::avm2::Stats::time() stores keys with `_ms` appended.
127
+ const times: { [key: string]: number } = {};
128
+ for (const { name, valueMs } of stats) {
129
+ const key = name.endsWith('_ms') ? name.slice(0, -'_ms'.length) : name;
130
+ times[key] = valueMs;
131
+ }
163
132
  if (Object.keys(times).length === 0) {
164
- throw new Error('AVM stdout did not contain any proving times in the stats!');
133
+ throw new Error('AVM response did not contain any proving-stage timings!');
165
134
  }
166
-
167
135
  // Hack to make labels match.
168
136
  const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
169
- // I need to cast because TS doesnt realize metrics is protected not private.
137
+ // Cast because TS doesn't realize `metrics` is protected, not private on the parent class.
170
138
  (this as any).metrics?.recordProverMetrics(txLabelWithCount, {
171
139
  proverSimulationStepMs: times['simulation/all'],
172
140
  proverProvingStepMs: times['proving/all'],
@@ -179,26 +147,6 @@ export class AvmProvingTester extends PublicTxSimulationTester {
179
147
  provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
180
148
  provingWireCommitmentsMs: times['prove/wire_commitments_round'],
181
149
  });
182
-
183
- return proofRes as BBSuccess;
184
- }
185
-
186
- async verify(proofRes: BBSuccess, publicInputs: AvmCircuitPublicInputs): Promise<BBResult> {
187
- if (this.checkCircuitOnly) {
188
- // Skip verification if we are only checking the circuit.
189
- // Check-circuit does not generate a proof to verify.
190
- return proofRes;
191
- }
192
-
193
- return await verifyAvmProof(BB_PATH, this.bbWorkingDirectory, proofRes.proofPath!, publicInputs, this.logger);
194
- }
195
-
196
- public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
197
- const provingRes = await this.prove(avmCircuitInputs, txLabel);
198
- expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
199
-
200
- const verificationRes = await this.verify(provingRes as BBSuccess, avmCircuitInputs.publicInputs);
201
- expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
202
150
  }
203
151
 
204
152
  public async simProveVerify(
@@ -211,6 +159,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
211
159
  privateInsertions?: TestPrivateInsertions,
212
160
  txLabel: string = 'unlabeledTx',
213
161
  disableRevertCheck: boolean = false,
162
+ gasLimits?: Gas,
214
163
  ): Promise<PublicTxResult> {
215
164
  const simTimer = new Timer();
216
165
  const simRes = await this.simulateTx(
@@ -221,6 +170,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
221
170
  feePayer,
222
171
  privateInsertions,
223
172
  txLabel,
173
+ gasLimits,
224
174
  );
225
175
  const simDuration = simTimer.ms();
226
176
  this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
@@ -247,6 +197,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
247
197
  teardownCall?: TestEnqueuedCall,
248
198
  feePayer?: AztecAddress,
249
199
  privateInsertions?: TestPrivateInsertions,
200
+ gasLimits?: Gas,
250
201
  ) {
251
202
  return await this.simProveVerify(
252
203
  sender,
@@ -258,6 +209,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
258
209
  privateInsertions,
259
210
  txLabel,
260
211
  true,
212
+ gasLimits,
261
213
  );
262
214
  }
263
215
 
@@ -265,9 +217,10 @@ export class AvmProvingTester extends PublicTxSimulationTester {
265
217
  appCall: TestEnqueuedCall,
266
218
  expectRevert?: boolean,
267
219
  txLabel: string = 'unlabeledTx',
220
+ gasLimits?: Gas,
268
221
  ) {
269
222
  await this.simProveVerify(
270
- /*sender=*/ AztecAddress.fromNumber(42),
223
+ /*sender=*/ AztecAddress.fromNumberUnsafe(42),
271
224
  /*setupCalls=*/ [],
272
225
  [appCall],
273
226
  undefined,
@@ -275,6 +228,8 @@ export class AvmProvingTester extends PublicTxSimulationTester {
275
228
  /*feePayer=*/ undefined,
276
229
  /*privateInsertions=*/ undefined,
277
230
  txLabel,
231
+ /*disableRevertCheck=*/ false,
232
+ gasLimits,
278
233
  );
279
234
  }
280
235
  }