@aztec/prover-node 0.0.1-commit.04852196a → 0.0.1-commit.04d373f

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 (39) hide show
  1. package/dest/actions/download-epoch-proving-job.js +1 -1
  2. package/dest/actions/rerun-epoch-proving-job.d.ts +3 -2
  3. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  4. package/dest/actions/rerun-epoch-proving-job.js +8 -8
  5. package/dest/bin/run-failed-epoch.js +1 -3
  6. package/dest/config.js +1 -1
  7. package/dest/factory.d.ts +1 -1
  8. package/dest/factory.d.ts.map +1 -1
  9. package/dest/factory.js +26 -6
  10. package/dest/job/epoch-proving-job.d.ts +6 -2
  11. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  12. package/dest/job/epoch-proving-job.js +198 -38
  13. package/dest/metrics.d.ts +21 -1
  14. package/dest/metrics.d.ts.map +1 -1
  15. package/dest/metrics.js +47 -0
  16. package/dest/monitors/epoch-monitor.d.ts +1 -1
  17. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  18. package/dest/monitors/epoch-monitor.js +11 -9
  19. package/dest/prover-node-publisher.d.ts +20 -1
  20. package/dest/prover-node-publisher.d.ts.map +1 -1
  21. package/dest/prover-node-publisher.js +200 -5
  22. package/dest/prover-node.d.ts +1 -2
  23. package/dest/prover-node.d.ts.map +1 -1
  24. package/dest/prover-node.js +21 -19
  25. package/dest/prover-publisher-factory.d.ts +2 -2
  26. package/dest/prover-publisher-factory.d.ts.map +1 -1
  27. package/dest/prover-publisher-factory.js +3 -3
  28. package/package.json +23 -22
  29. package/src/actions/download-epoch-proving-job.ts +1 -1
  30. package/src/actions/rerun-epoch-proving-job.ts +16 -5
  31. package/src/bin/run-failed-epoch.ts +1 -2
  32. package/src/config.ts +1 -1
  33. package/src/factory.ts +21 -4
  34. package/src/job/epoch-proving-job.ts +120 -38
  35. package/src/metrics.ts +71 -0
  36. package/src/monitors/epoch-monitor.ts +5 -6
  37. package/src/prover-node-publisher.ts +232 -9
  38. package/src/prover-node.ts +17 -23
  39. package/src/prover-publisher-factory.ts +3 -3
@@ -25,7 +25,7 @@ import { deserializeEpochProvingJobData } from '../job/epoch-proving-job-data.js
25
25
  }, log, {
26
26
  ...config,
27
27
  ...metadata,
28
- snapshotsUrl: location
28
+ fileStore
29
29
  });
30
30
  const dataPath = urlJoin(location, 'data.bin');
31
31
  const localPath = config.jobDataDownloadPath;
@@ -3,10 +3,11 @@ import type { Logger } from '@aztec/foundation/log';
3
3
  import { type ProverClientConfig } from '@aztec/prover-client';
4
4
  import { ProverBrokerConfig } from '@aztec/prover-client/broker';
5
5
  import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
6
+ import type { GenesisData } from '@aztec/stdlib/world-state';
6
7
  /**
7
8
  * Given a local folder where `downloadEpochProvingJob` was called, creates a new archiver and world state
8
9
  * using the state snapshots, and creates a new epoch proving job to prove the downloaded proving job.
9
10
  * Proving is done with a local proving broker and agents as specified by the config.
10
11
  */
11
- export declare function rerunEpochProvingJob(localPath: string, log: Logger, config: DataStoreConfig & ProverBrokerConfig & ProverClientConfig & Pick<L1ContractsConfig, 'aztecEpochDuration'>): Promise<"awaiting-prover" | "completed" | "failed" | "initialized" | "processing" | "publishing-proof" | "reorg" | "stopped" | "timed-out">;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVydW4tZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3JlcnVuLWVwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXNCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUErQixNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBVTlEOzs7O0dBSUc7QUFDSCx3QkFBc0Isb0JBQW9CLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsTUFBTSxFQUFFLGVBQWUsR0FBRyxrQkFBa0IsR0FBRyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsK0lBc0NsSCJ9
12
+ export declare function rerunEpochProvingJob(localPath: string, log: Logger, config: DataStoreConfig & ProverBrokerConfig & ProverClientConfig & Pick<L1ContractsConfig, 'aztecEpochDuration'>, genesis?: GenesisData): Promise<"awaiting-prover" | "completed" | "failed" | "initialized" | "processing" | "publishing-proof" | "reorg" | "stopped" | "timed-out">;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVydW4tZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3JlcnVuLWVwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXNCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGtCQUFrQixFQUErQixNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVTdEOzs7O0dBSUc7QUFDSCx3QkFBc0Isb0JBQW9CLENBQ3hDLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLEdBQUcsRUFBRSxNQUFNLEVBQ1gsTUFBTSxFQUFFLGVBQWUsR0FBRyxrQkFBa0IsR0FBRyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsRUFDakgsT0FBTyxDQUFDLEVBQUUsV0FBVywrSUErQ3RCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"rerun-epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/actions/rerun-epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,6BAA6B,CAAC;AAE9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAU9D;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,+IAsClH"}
1
+ {"version":3,"file":"rerun-epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/actions/rerun-epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,6BAA6B,CAAC;AAE9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAU7D;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,EACjH,OAAO,CAAC,EAAE,WAAW,+IA+CtB"}
@@ -1,4 +1,4 @@
1
- import { createArchiverStore } from '@aztec/archiver';
1
+ import { createArchiverStore, createContractDataSource } from '@aztec/archiver';
2
2
  import { createProverClient } from '@aztec/prover-client';
3
3
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
4
4
  import { PublicProcessorFactory } from '@aztec/simulator/server';
@@ -12,18 +12,18 @@ import { ProverNodeJobMetrics } from '../metrics.js';
12
12
  * Given a local folder where `downloadEpochProvingJob` was called, creates a new archiver and world state
13
13
  * using the state snapshots, and creates a new epoch proving job to prove the downloaded proving job.
14
14
  * Proving is done with a local proving broker and agents as specified by the config.
15
- */ export async function rerunEpochProvingJob(localPath, log, config) {
15
+ */ export async function rerunEpochProvingJob(localPath, log, config, genesis) {
16
16
  const jobData = deserializeEpochProvingJobData(readFileSync(localPath));
17
17
  log.info(`Loaded proving job data for epoch ${jobData.epochNumber}`);
18
18
  const telemetry = getTelemetryClient();
19
19
  const metrics = new ProverNodeJobMetrics(telemetry.getMeter('prover-job'), telemetry.getTracer('prover-job'));
20
- const worldState = await createWorldState(config);
21
- const archiver = await createArchiverStore(config, {
22
- epochDuration: config.aztecEpochDuration
23
- });
24
- const publicProcessorFactory = new PublicProcessorFactory(archiver, undefined, undefined, log.getBindings());
20
+ const worldState = await createWorldState(config, genesis);
21
+ const initialBlockHash = await worldState.getInitialHeader().hash();
22
+ const archiver = await createArchiverStore(config, initialBlockHash);
23
+ const publicProcessorFactory = new PublicProcessorFactory(createContractDataSource(archiver), undefined, undefined, log.getBindings());
25
24
  const publisher = {
26
- submitEpochProof: ()=>Promise.resolve(true)
25
+ submitEpochProof: ()=>Promise.resolve(true),
26
+ analyzeEpochProofSubmission: ()=>Promise.resolve()
27
27
  };
28
28
  const l2BlockSourceForReorgDetection = undefined;
29
29
  const deadline = undefined;
@@ -41,9 +41,7 @@ async function rerunFailedEpoch(provingJobUrl, baseLocalDir) {
41
41
  logger.info(`Rerunning proving job from ${jobPath} with state from ${dataDir}`, metadata);
42
42
  const result = await rerunEpochProvingJob(jobPath, logger, {
43
43
  ...config,
44
- l1Contracts: {
45
- rollupAddress: metadata.rollupAddress
46
- },
44
+ rollupAddress: metadata.rollupAddress,
47
45
  rollupVersion: metadata.rollupVersion
48
46
  });
49
47
  console.error(`Epoch proving job complete with result ${result}`);
package/dest/config.js CHANGED
@@ -20,7 +20,7 @@ export const specificProverNodeConfigMappings = {
20
20
  proverNodeMaxParallelBlocksPerEpoch: {
21
21
  env: 'PROVER_NODE_MAX_PARALLEL_BLOCKS_PER_EPOCH',
22
22
  description: 'The Maximum number of blocks to process in parallel while proving an epoch',
23
- ...numberConfigHelper(32)
23
+ ...numberConfigHelper(0)
24
24
  },
25
25
  proverNodeFailedEpochStore: {
26
26
  env: 'PROVER_NODE_FAILED_EPOCH_STORE',
package/dest/factory.d.ts CHANGED
@@ -30,4 +30,4 @@ export type ProverNodeDeps = {
30
30
  };
31
31
  /** Creates a new prover node subsystem given a config and dependencies */
32
32
  export declare function createProverNode(userConfig: SpecificProverNodeConfig & ProverConfig & ProverClientUserConfig & ProverPublisherConfig & ProverTxSenderConfig, deps: ProverNodeDeps): Promise<ProverNode>;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQTJCLEtBQUssc0JBQXNCLEVBQXNCLE1BQU0sc0JBQXNCLENBQUM7QUFFaEgsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssb0JBQW9CLEVBRTFCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBYSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUk5RixPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdkUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2IsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQzFCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUM7SUFDL0MsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSxtQkFBbUIsQ0FBQztJQUNoQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsZUFBZSxDQUFDLEVBQUUsZUFBZSxDQUFDO0NBQ25DLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsd0JBQXNCLGdCQUFnQixDQUNwQyxVQUFVLEVBQUUsd0JBQXdCLEdBQ2xDLFlBQVksR0FDWixzQkFBc0IsR0FDdEIscUJBQXFCLEdBQ3JCLG9CQUFvQixFQUN0QixJQUFJLEVBQUUsY0FBYyx1QkF1SHJCIn0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQTJCLEtBQUssc0JBQXNCLEVBQXNCLE1BQU0sc0JBQXNCLENBQUM7QUFFaEgsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssb0JBQW9CLEVBRTFCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBYSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUk5RixPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdkUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2IsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQzFCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUM7SUFDL0MsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSxtQkFBbUIsQ0FBQztJQUNoQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsZUFBZSxDQUFDLEVBQUUsZUFBZSxDQUFDO0NBQ25DLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsd0JBQXNCLGdCQUFnQixDQUNwQyxVQUFVLEVBQUUsd0JBQXdCLEdBQ2xDLFlBQVksR0FDWixzQkFBc0IsR0FDdEIscUJBQXFCLEdBQ3JCLG9CQUFvQixFQUN0QixJQUFJLEVBQUUsY0FBYyx1QkF1SXJCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAA2B,KAAK,sBAAsB,EAAsB,MAAM,sBAAsB,CAAC;AAEhH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAI9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,wBAAwB,GAClC,YAAY,GACZ,sBAAsB,GACtB,qBAAqB,GACrB,oBAAoB,EACtB,IAAI,EAAE,cAAc,uBAuHrB"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAA2B,KAAK,sBAAsB,EAAsB,MAAM,sBAAsB,CAAC;AAEhH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAI9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,wBAAwB,GAClC,YAAY,GACZ,sBAAsB,GACtB,qBAAqB,GACrB,oBAAoB,EACtB,IAAI,EAAE,cAAc,uBAuIrB"}
package/dest/factory.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Blob } from '@aztec/blob-lib';
2
2
  import { createEthereumChain } from '@aztec/ethereum/chain';
3
+ import { makeL1HttpTransport } from '@aztec/ethereum/client';
3
4
  import { RollupContract } from '@aztec/ethereum/contracts';
4
5
  import { PublisherManager } from '@aztec/ethereum/publisher-manager';
5
6
  import { pick } from '@aztec/foundation/collection';
@@ -10,7 +11,7 @@ import { createProverClient } from '@aztec/prover-client';
10
11
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
11
12
  import { getPublisherConfigFromProverConfig } from '@aztec/sequencer-client';
12
13
  import { L1Metrics, getTelemetryClient } from '@aztec/telemetry-client';
13
- import { createPublicClient, fallback, http } from 'viem';
14
+ import { createPublicClient } from 'viem';
14
15
  import { EpochMonitor } from './monitors/epoch-monitor.js';
15
16
  import { ProverNode } from './prover-node.js';
16
17
  import { ProverPublisherFactory } from './prover-publisher-factory.js';
@@ -46,12 +47,12 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
46
47
  const chain = createEthereumChain(rpcUrls, chainId);
47
48
  const publicClient = createPublicClient({
48
49
  chain: chain.chainInfo,
49
- transport: fallback(config.l1RpcUrls.map((url)=>http(url, {
50
- batch: false
51
- }))),
50
+ transport: makeL1HttpTransport(config.l1RpcUrls, {
51
+ timeout: config.l1HttpTimeoutMS
52
+ }),
52
53
  pollingInterval: config.viemPollingIntervalMS
53
54
  });
54
- const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
55
+ const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
55
56
  const l1TxUtils = deps.l1TxUtils ? [
56
57
  deps.l1TxUtils
57
58
  ] : config.proverPublisherForwarderAddress ? await createForwarderL1TxUtilsFromSigners(publicClient, proverSigners.signers, config.proverPublisherForwarderAddress, {
@@ -70,9 +71,28 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
70
71
  logger: log.createChild('l1-tx-utils'),
71
72
  dateProvider
72
73
  });
74
+ // Create a funder L1TxUtils from the keystore funding account (if configured)
75
+ const fundingSigner = keyStoreManager?.createFundingSigner();
76
+ let funderL1TxUtils;
77
+ if (fundingSigner) {
78
+ const [funder] = await createL1TxUtilsFromSigners(publicClient, [
79
+ fundingSigner
80
+ ], {
81
+ ...config,
82
+ scope: 'prover'
83
+ }, {
84
+ telemetry,
85
+ logger: log.createChild('l1-tx-utils:funder'),
86
+ dateProvider
87
+ });
88
+ funderL1TxUtils = funder;
89
+ }
73
90
  const publisherFactory = deps.publisherFactory ?? new ProverPublisherFactory(config, {
74
91
  rollupContract,
75
- publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), log.getBindings()),
92
+ publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), {
93
+ bindings: log.getBindings(),
94
+ funder: funderL1TxUtils
95
+ }),
76
96
  telemetry
77
97
  });
78
98
  const proverNodeConfig = {
@@ -31,10 +31,11 @@ export declare class EpochProvingJob implements Traceable {
31
31
  private log;
32
32
  private uuid;
33
33
  private runPromise;
34
+ private abortController;
34
35
  private epochCheckPromise;
35
36
  private deadlineTimeoutHandler;
36
37
  readonly tracer: Tracer;
37
- constructor(data: EpochProvingJobData, dbProvider: Pick<ForkMerkleTreeOperations, 'fork'>, prover: EpochProver, publicProcessorFactory: PublicProcessorFactory, publisher: Pick<ProverNodePublisher, 'submitEpochProof'>, l2BlockSource: L2BlockSource | undefined, metrics: ProverNodeJobMetrics, deadline: Date | undefined, config: EpochProvingJobOptions, bindings?: LoggerBindings);
38
+ constructor(data: EpochProvingJobData, dbProvider: Pick<ForkMerkleTreeOperations, 'fork'>, prover: EpochProver, publicProcessorFactory: PublicProcessorFactory, publisher: Pick<ProverNodePublisher, 'submitEpochProof' | 'analyzeEpochProofSubmission'>, l2BlockSource: L2BlockSource | undefined, metrics: ProverNodeJobMetrics, deadline: Date | undefined, config: EpochProvingJobOptions, bindings?: LoggerBindings);
38
39
  getId(): string;
39
40
  getState(): EpochProvingJobState;
40
41
  getEpochNumber(): EpochNumber;
@@ -49,9 +50,12 @@ export declare class EpochProvingJob implements Traceable {
49
50
  */
50
51
  run(): Promise<void>;
51
52
  private createFork;
53
+ private processCheckpoints;
52
54
  private progressState;
53
55
  private checkState;
54
56
  stop(state?: EpochProvingJobTerminalState): Promise<void>;
57
+ private failProcessing;
58
+ private interruptProcessing;
55
59
  private scheduleDeadlineStop;
56
60
  private scheduleEpochCheck;
57
61
  private gatherPreviousBlockHeaders;
@@ -60,4 +64,4 @@ export declare class EpochProvingJob implements Traceable {
60
64
  private processTxs;
61
65
  }
62
66
  export { type EpochProvingJobState };
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvZXBvY2gtcHJvdmluZy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzNFLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQU12RixPQUFPLEtBQUssRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RixPQUFPLEtBQUssRUFBVyxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRSxPQUFPLEVBQ0wsS0FBSyxXQUFXLEVBQ2hCLEtBQUssb0JBQW9CLEVBQ3pCLDRCQUE0QixFQUM1QixLQUFLLHdCQUF3QixFQUM5QixNQUFNLGlDQUFpQyxDQUFDO0FBSXpDLE9BQU8sRUFBYyxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBSTdGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQStCLE1BQU0sNkJBQTZCLENBQUM7QUFFcEcsTUFBTSxNQUFNLHNCQUFzQixHQUFHO0lBQ25DLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzVCLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN6QixlQUFlLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDM0IsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxxQkFBYSxlQUFnQixZQUFXLFNBQVM7SUFZN0MsT0FBTyxDQUFDLElBQUk7SUFDWixPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxzQkFBc0I7SUFDOUIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLE9BQU87SUFDZixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQW5CaEIsT0FBTyxDQUFDLEtBQUssQ0FBdUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBUztJQUNwQixPQUFPLENBQUMsSUFBSSxDQUFTO0lBRXJCLE9BQU8sQ0FBQyxVQUFVLENBQTRCO0lBQzlDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBNkI7SUFDdEQsT0FBTyxDQUFDLHNCQUFzQixDQUE2QjtJQUUzRCxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ1UsSUFBSSxFQUFFLG1CQUFtQixFQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxFQUNsRCxNQUFNLEVBQUUsV0FBVyxFQUNuQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxFQUN4RCxhQUFhLEVBQUUsYUFBYSxHQUFHLFNBQVMsRUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUM3QixRQUFRLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFDMUIsTUFBTSxFQUFFLHNCQUFzQixFQUN0QyxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0sS0FBSyxJQUFJLE1BQU0sQ0FFckI7SUFFTSxRQUFRLElBQUksb0JBQW9CLENBRXRDO0lBRU0sY0FBYyxJQUFJLFdBQVcsQ0FFbkM7SUFFTSxXQUFXLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FFckM7SUFFTSxjQUFjLElBQUksbUJBQW1CLENBRTNDO0lBRUQsT0FBTyxLQUFLLFdBQVcsR0FFdEI7SUFFRCxPQUFPLEtBQUssV0FBVyxHQUV0QjtJQUVELE9BQU8sS0FBSyxHQUFHLEdBRWQ7SUFFRCxPQUFPLEtBQUssWUFBWSxHQUV2QjtJQUVEOztPQUVHO0lBSVUsR0FBRyxrQkF3TGY7WUFRYSxVQUFVO0lBcUJ4QixPQUFPLENBQUMsYUFBYTtJQUtyQixPQUFPLENBQUMsVUFBVTtJQU1MLElBQUksQ0FBQyxLQUFLLEdBQUUsNEJBQXdDLGlCQU1oRTtJQUVELE9BQU8sQ0FBQyxvQkFBb0I7WUF3QmQsa0JBQWtCO0lBa0NoQyxPQUFPLENBQUMsMEJBQTBCO0lBS2xDLE9BQU8sQ0FBQyxNQUFNO0lBSWQsT0FBTyxDQUFDLGlCQUFpQjtZQUlYLFVBQVU7Q0FtQnpCO0FBU0QsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQUUsQ0FBQyJ9
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qb2IvZXBvY2gtcHJvdmluZy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTNFLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQU92RixPQUFPLEtBQUssRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RixPQUFPLEtBQUssRUFBVyxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRSxPQUFPLEVBQ0wsS0FBSyxXQUFXLEVBQ2hCLEtBQUssb0JBQW9CLEVBQ3pCLDRCQUE0QixFQUM1QixLQUFLLHdCQUF3QixFQUM5QixNQUFNLGlDQUFpQyxDQUFDO0FBSXpDLE9BQU8sRUFBYyxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBSTdGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQStCLE1BQU0sNkJBQTZCLENBQUM7QUFFcEcsTUFBTSxNQUFNLHNCQUFzQixHQUFHO0lBQ25DLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzVCLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUN6QixlQUFlLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDM0IsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxxQkFBYSxlQUFnQixZQUFXLFNBQVM7SUFhN0MsT0FBTyxDQUFDLElBQUk7SUFDWixPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxzQkFBc0I7SUFDOUIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLE9BQU87SUFDZixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQXBCaEIsT0FBTyxDQUFDLEtBQUssQ0FBdUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBUztJQUNwQixPQUFPLENBQUMsSUFBSSxDQUFTO0lBRXJCLE9BQU8sQ0FBQyxVQUFVLENBQTRCO0lBQzlDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBNkI7SUFDdEQsT0FBTyxDQUFDLHNCQUFzQixDQUE2QjtJQUUzRCxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ1UsSUFBSSxFQUFFLG1CQUFtQixFQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxFQUNsRCxNQUFNLEVBQUUsV0FBVyxFQUNuQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQyxFQUN4RixhQUFhLEVBQUUsYUFBYSxHQUFHLFNBQVMsRUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUM3QixRQUFRLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFDMUIsTUFBTSxFQUFFLHNCQUFzQixFQUN0QyxRQUFRLENBQUMsRUFBRSxjQUFjLEVBUzFCO0lBRU0sS0FBSyxJQUFJLE1BQU0sQ0FFckI7SUFFTSxRQUFRLElBQUksb0JBQW9CLENBRXRDO0lBRU0sY0FBYyxJQUFJLFdBQVcsQ0FFbkM7SUFFTSxXQUFXLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FFckM7SUFFTSxjQUFjLElBQUksbUJBQW1CLENBRTNDO0lBRUQsT0FBTyxLQUFLLFdBQVcsR0FFdEI7SUFFRCxPQUFPLEtBQUssV0FBVyxHQUV0QjtJQUVELE9BQU8sS0FBSyxHQUFHLEdBRWQ7SUFFRCxPQUFPLEtBQUssWUFBWSxHQUV2QjtJQUVEOztPQUVHO0lBSVUsR0FBRyxrQkF5TmY7WUFRYSxVQUFVO1lBbUJWLGtCQUFrQjtJQWlDaEMsT0FBTyxDQUFDLGFBQWE7SUFLckIsT0FBTyxDQUFDLFVBQVU7SUFNTCxJQUFJLENBQUMsS0FBSyxHQUFFLDRCQUF3QyxpQkFNaEU7SUFFRCxPQUFPLENBQUMsY0FBYztJQU90QixPQUFPLENBQUMsbUJBQW1CO0lBSzNCLE9BQU8sQ0FBQyxvQkFBb0I7WUF3QmQsa0JBQWtCO0lBb0NoQyxPQUFPLENBQUMsMEJBQTBCO0lBS2xDLE9BQU8sQ0FBQyxNQUFNO0lBSWQsT0FBTyxDQUFDLGlCQUFpQjtZQUlYLFVBQVU7Q0F1QnpCO0FBU0QsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQUUsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG3E,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAMvF,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAY7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACU,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE,sBAAsB,EACtC,QAAQ,CAAC,EAAE,cAAc,EAS1B;IAEM,KAAK,IAAI,MAAM,CAErB;IAEM,QAAQ,IAAI,oBAAoB,CAEtC;IAEM,cAAc,IAAI,WAAW,CAEnC;IAEM,WAAW,IAAI,IAAI,GAAG,SAAS,CAErC;IAEM,cAAc,IAAI,mBAAmB,CAE3C;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG,kBAwLf;YAQa,UAAU;IAqBxB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC,iBAMhE;IAED,OAAO,CAAC,oBAAoB;YAwBd,kBAAkB;IAkChC,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAmBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAOvF,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAa7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IApBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACU,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,6BAA6B,CAAC,EACxF,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE,sBAAsB,EACtC,QAAQ,CAAC,EAAE,cAAc,EAS1B;IAEM,KAAK,IAAI,MAAM,CAErB;IAEM,QAAQ,IAAI,oBAAoB,CAEtC;IAEM,cAAc,IAAI,WAAW,CAEnC;IAEM,WAAW,IAAI,IAAI,GAAG,SAAS,CAErC;IAEM,cAAc,IAAI,mBAAmB,CAE3C;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG,kBAyNf;YAQa,UAAU;YAmBV,kBAAkB;IAiChC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC,iBAMhE;IAED,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,oBAAoB;YAwBd,kBAAkB;IAoChC,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAuBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
@@ -1,3 +1,68 @@
1
+ function _ts_add_disposable_resource(env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() {
16
+ try {
17
+ inner.call(this);
18
+ } catch (e) {
19
+ return Promise.reject(e);
20
+ }
21
+ };
22
+ env.stack.push({
23
+ value: value,
24
+ dispose: dispose,
25
+ async: async
26
+ });
27
+ } else if (async) {
28
+ env.stack.push({
29
+ async: true
30
+ });
31
+ }
32
+ return value;
33
+ }
34
+ function _ts_dispose_resources(env) {
35
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
36
+ var e = new Error(message);
37
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
38
+ };
39
+ return (_ts_dispose_resources = function _ts_dispose_resources(env) {
40
+ function fail(e) {
41
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
42
+ env.hasError = true;
43
+ }
44
+ var r, s = 0;
45
+ function next() {
46
+ while(r = env.stack.pop()){
47
+ try {
48
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
49
+ if (r.dispose) {
50
+ var result = r.dispose.call(r.value);
51
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
52
+ fail(e);
53
+ return next();
54
+ });
55
+ } else s |= 1;
56
+ } catch (e) {
57
+ fail(e);
58
+ }
59
+ }
60
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
61
+ if (env.hasError) throw env.error;
62
+ }
63
+ return next();
64
+ })(env);
65
+ }
1
66
  function applyDecs2203RFactory() {
2
67
  function createAddInitializerMethod(initializers, decoratorFinishedRef) {
3
68
  return function addInitializer(initializer) {
@@ -371,21 +436,19 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
436
  return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
372
437
  }
373
438
  var _dec, _initProto;
374
- import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
375
439
  import { asyncPool } from '@aztec/foundation/async-pool';
376
440
  import { BlockNumber } from '@aztec/foundation/branded-types';
377
- import { padArrayEnd } from '@aztec/foundation/collection';
378
- import { Fr } from '@aztec/foundation/curves/bn254';
379
441
  import { createLogger } from '@aztec/foundation/log';
380
442
  import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
381
443
  import { Timer } from '@aztec/foundation/timer';
444
+ import { AVM_MAX_CONCURRENT_SIMULATIONS } from '@aztec/native';
382
445
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
383
446
  import { protocolContractsHash } from '@aztec/protocol-contracts';
384
447
  import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
385
448
  import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
386
449
  import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
450
+ import { appendL1ToL2MessagesToTree } from '@aztec/stdlib/messaging';
387
451
  import { CheckpointConstantData } from '@aztec/stdlib/rollup';
388
- import { MerkleTreeId } from '@aztec/stdlib/trees';
389
452
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
390
453
  import * as crypto from 'node:crypto';
391
454
  import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
@@ -421,6 +484,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
421
484
  log;
422
485
  uuid;
423
486
  runPromise;
487
+ abortController;
424
488
  epochCheckPromise;
425
489
  deadlineTimeoutHandler;
426
490
  tracer;
@@ -435,6 +499,7 @@ _dec = trackSpan('EpochProvingJob.run', function() {
435
499
  this.deadline = deadline;
436
500
  this.config = config;
437
501
  this.state = (_initProto(this), 'initialized');
502
+ this.abortController = new AbortController();
438
503
  validateEpochProvingJobData(data);
439
504
  this.uuid = crypto.randomUUID();
440
505
  this.log = createLogger('prover-node:epoch-proving-job', {
@@ -498,17 +563,22 @@ _dec = trackSpan('EpochProvingJob.run', function() {
498
563
  const { promise, resolve } = promiseWithResolvers();
499
564
  this.runPromise = promise;
500
565
  try {
566
+ const blobTimer = new Timer();
501
567
  const blobFieldsPerCheckpoint = this.checkpoints.map((checkpoint)=>checkpoint.toBlobFields());
502
- this.log.info(`Blob fields per checkpoint: ${timer.ms()}ms`);
503
568
  const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
504
- this.log.info(`Final blob batching challeneger: ${timer.ms()}ms`);
569
+ this.metrics.recordBlobProcessing(blobTimer.ms());
505
570
  this.prover.startNewEpoch(epochNumber, epochSizeCheckpoints, finalBlobBatchingChallenges);
571
+ const chonkTimer = new Timer();
506
572
  await this.prover.startChonkVerifierCircuits(Array.from(this.txs.values()));
573
+ this.metrics.recordChonkVerifier(chonkTimer.ms());
507
574
  // Everything in the epoch should have the same chainId and version.
508
575
  const { chainId, version } = this.checkpoints[0].blocks[0].header.globalVariables;
509
576
  const previousBlockHeaders = this.gatherPreviousBlockHeaders();
510
- await asyncPool(this.config.parallelBlockLimit ?? 32, this.checkpoints, async (checkpoint)=>{
577
+ const allCheckpointsTimer = new Timer();
578
+ const parallelism = this.config.parallelBlockLimit ? this.config.parallelBlockLimit : AVM_MAX_CONCURRENT_SIMULATIONS > 0 ? AVM_MAX_CONCURRENT_SIMULATIONS : this.checkpoints.length;
579
+ await this.processCheckpoints(parallelism, async (checkpoint)=>{
511
580
  this.checkState();
581
+ const checkpointTimer = new Timer();
512
582
  const checkpointIndex = checkpoint.number - fromCheckpoint;
513
583
  const checkpointConstants = CheckpointConstantData.from({
514
584
  chainId,
@@ -523,15 +593,17 @@ _dec = trackSpan('EpochProvingJob.run', function() {
523
593
  });
524
594
  const previousHeader = previousBlockHeaders[checkpointIndex];
525
595
  const l1ToL2Messages = this.getL1ToL2Messages(checkpoint);
526
- this.log.verbose(`Starting processing checkpoint ${checkpoint.number}`, {
596
+ this.log.debug(`Starting processing checkpoint ${checkpoint.number}`, {
527
597
  number: checkpoint.number,
528
598
  checkpointHash: checkpoint.hash().toString(),
529
- lastArchive: checkpoint.header.lastArchiveRoot,
530
- previousHeader: previousHeader.hash(),
599
+ headerHash: checkpoint.header.hash().toString(),
600
+ numL1ToL2Messages: l1ToL2Messages.length,
601
+ previousBlockNumber: previousHeader.globalVariables.blockNumber,
531
602
  uuid: this.uuid
532
603
  });
533
604
  await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, checkpoint.blocks.length, previousHeader);
534
605
  for(let blockIndex = 0; blockIndex < checkpoint.blocks.length; blockIndex++){
606
+ const blockTimer = new Timer();
535
607
  const block = checkpoint.blocks[blockIndex];
536
608
  const globalVariables = block.header.globalVariables;
537
609
  const txs = this.getTxs(block);
@@ -549,19 +621,36 @@ _dec = trackSpan('EpochProvingJob.run', function() {
549
621
  await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
550
622
  // Process public fns. L1 to L2 messages are only inserted for the first block of a checkpoint,
551
623
  // as the fork for subsequent blocks already includes them from the previous block's synced state.
552
- const db = await this.createFork(BlockNumber(block.number - 1), blockIndex === 0 ? l1ToL2Messages : undefined);
553
- const config = PublicSimulatorConfig.from({
554
- proverId: this.prover.getProverId().toField(),
555
- skipFeeEnforcement: false,
556
- collectDebugLogs: false,
557
- collectHints: true,
558
- collectPublicInputs: true,
559
- collectStatistics: false
560
- });
561
- const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
562
- const processed = await this.processTxs(publicProcessor, txs);
563
- await this.prover.addTxs(processed);
564
- await db.close();
624
+ {
625
+ const env = {
626
+ stack: [],
627
+ error: void 0,
628
+ hasError: false
629
+ };
630
+ try {
631
+ const db = _ts_add_disposable_resource(env, await this.createFork(BlockNumber(block.number - 1), blockIndex === 0 ? l1ToL2Messages : undefined), true);
632
+ this.checkState();
633
+ const config = PublicSimulatorConfig.from({
634
+ proverId: this.prover.getProverId().toField(),
635
+ skipFeeEnforcement: false,
636
+ collectDebugLogs: false,
637
+ collectHints: true,
638
+ collectPublicInputs: true,
639
+ collectStatistics: false
640
+ });
641
+ const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
642
+ const processed = await this.processTxs(publicProcessor, txs);
643
+ this.checkState();
644
+ await this.prover.addTxs(processed);
645
+ } catch (e) {
646
+ env.error = e;
647
+ env.hasError = true;
648
+ } finally{
649
+ const result = _ts_dispose_resources(env);
650
+ if (result) await result;
651
+ }
652
+ }
653
+ this.checkState();
565
654
  this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
566
655
  blockNumber: block.number,
567
656
  blockHash: (await block.hash()).toString(),
@@ -570,8 +659,11 @@ _dec = trackSpan('EpochProvingJob.run', function() {
570
659
  // Mark block as completed to pad it
571
660
  const expectedBlockHeader = block.header;
572
661
  await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
662
+ this.metrics.recordBlockProcessing(blockTimer.ms());
573
663
  }
664
+ this.metrics.recordCheckpointProcessing(checkpointTimer.ms());
574
665
  });
666
+ this.metrics.recordAllCheckpointsProcessing(allCheckpointsTimer.ms());
575
667
  const executionTime = timer.ms();
576
668
  this.progressState('awaiting-prover');
577
669
  const { publicInputs, proof, batchedBlobInputs } = await this.prover.finalizeEpoch();
@@ -582,7 +674,20 @@ _dec = trackSpan('EpochProvingJob.run', function() {
582
674
  });
583
675
  this.progressState('publishing-proof');
584
676
  if (this.config.skipSubmitProof) {
585
- this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
677
+ this.log.info(`Proof publishing is disabled. Analyzing estimated L1 fees for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
678
+ try {
679
+ await this.publisher.analyzeEpochProofSubmission({
680
+ fromCheckpoint,
681
+ toCheckpoint,
682
+ epochNumber,
683
+ publicInputs,
684
+ proof,
685
+ batchedBlobInputs,
686
+ attestations
687
+ });
688
+ } catch (err) {
689
+ this.log.warn(`Failed to analyze estimated L1 fees for epoch ${epochNumber}`, err);
690
+ }
586
691
  this.state = 'completed';
587
692
  this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
588
693
  return;
@@ -634,19 +739,59 @@ _dec = trackSpan('EpochProvingJob.run', function() {
634
739
  * as subsequent blocks' synced state already includes them.
635
740
  * REFACTOR: The prover already spawns a db fork of its own for each block, so we may be able to do away with just one fork.
636
741
  */ async createFork(blockNumber, l1ToL2Messages) {
637
- this.log.verbose(`Creating fork at ${blockNumber}`, {
638
- blockNumber
639
- });
640
- const db = await this.dbProvider.fork(blockNumber);
641
- if (l1ToL2Messages !== undefined) {
642
- this.log.verbose(`Inserting ${l1ToL2Messages.length} L1 to L2 messages in fork`, {
643
- blockNumber,
644
- l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
742
+ const env = {
743
+ stack: [],
744
+ error: void 0,
745
+ hasError: false
746
+ };
747
+ try {
748
+ this.log.verbose(`Creating fork at ${blockNumber}`, {
749
+ blockNumber
645
750
  });
646
- const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
647
- await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
751
+ const cleanup = _ts_add_disposable_resource(env, new AsyncDisposableStack(), true);
752
+ const db = cleanup.use(await this.dbProvider.fork(blockNumber));
753
+ if (l1ToL2Messages !== undefined) {
754
+ this.log.verbose(`Inserting ${l1ToL2Messages.length} L1 to L2 messages in fork`, {
755
+ blockNumber,
756
+ l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
757
+ });
758
+ await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
759
+ }
760
+ // everything run succesfully so we can release this stack and give control of the fork's lifetime to the caller
761
+ cleanup.move();
762
+ return db;
763
+ } catch (e) {
764
+ env.error = e;
765
+ env.hasError = true;
766
+ } finally{
767
+ const result = _ts_dispose_resources(env);
768
+ if (result) await result;
769
+ }
770
+ }
771
+ async processCheckpoints(parallelism, processCheckpoint) {
772
+ let hasError = false;
773
+ let firstError;
774
+ await asyncPool(Math.max(parallelism, 1), this.checkpoints, async (checkpoint)=>{
775
+ if (hasError || this.abortController.signal.aborted) {
776
+ return;
777
+ }
778
+ try {
779
+ this.checkState();
780
+ await processCheckpoint(checkpoint);
781
+ } catch (err) {
782
+ if (!hasError) {
783
+ hasError = true;
784
+ firstError = err;
785
+ this.failProcessing();
786
+ }
787
+ }
788
+ });
789
+ if (hasError) {
790
+ throw firstError;
791
+ }
792
+ if (this.abortController.signal.aborted) {
793
+ this.checkState();
648
794
  }
649
- return db;
650
795
  }
651
796
  progressState(state) {
652
797
  this.checkState();
@@ -659,11 +804,21 @@ _dec = trackSpan('EpochProvingJob.run', function() {
659
804
  }
660
805
  async stop(state = 'stopped') {
661
806
  this.state = state;
662
- this.prover.cancel();
807
+ this.interruptProcessing();
663
808
  if (this.runPromise) {
664
809
  await this.runPromise;
665
810
  }
666
811
  }
812
+ failProcessing() {
813
+ if (!EpochProvingJobTerminalState.includes(this.state)) {
814
+ this.state = 'failed';
815
+ }
816
+ this.interruptProcessing();
817
+ }
818
+ interruptProcessing() {
819
+ this.abortController.abort();
820
+ this.prover.cancel();
821
+ }
667
822
  scheduleDeadlineStop() {
668
823
  const deadline = this.deadline;
669
824
  if (deadline) {
@@ -699,7 +854,10 @@ _dec = trackSpan('EpochProvingJob.run', function() {
699
854
  }
700
855
  const intervalMs = Math.ceil((await l2BlockSource.getL1Constants()).ethereumSlotDuration / 2) * 1000;
701
856
  this.epochCheckPromise = new RunningPromise(async ()=>{
702
- const blockHeaders = await l2BlockSource.getCheckpointedBlockHeadersForEpoch(this.epochNumber);
857
+ const blockHeaders = (await l2BlockSource.getBlocksData({
858
+ epoch: this.epochNumber,
859
+ onlyCheckpointed: true
860
+ })).map((d)=>d.header);
703
861
  const blockHashes = await Promise.all(blockHeaders.map((header)=>header.hash()));
704
862
  const thisBlocks = this.checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
705
863
  const thisBlockHashes = await Promise.all(thisBlocks.map((block)=>block.hash()));
@@ -731,8 +889,10 @@ _dec = trackSpan('EpochProvingJob.run', function() {
731
889
  async processTxs(publicProcessor, txs) {
732
890
  const { deadline } = this;
733
891
  const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
734
- deadline
892
+ deadline,
893
+ signal: this.abortController.signal
735
894
  });
895
+ this.checkState();
736
896
  if (failedTxs.length) {
737
897
  const failedTxHashes = await Promise.all(failedTxs.map(({ tx })=>tx.getTxHash()));
738
898
  throw new Error(`Txs failed processing: ${failedTxs.map(({ error }, index)=>`${failedTxHashes[index]} (${error})`).join(', ')}`);