@aztec-labs/prover-client 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 (170) hide show
  1. package/README.md +1 -0
  2. package/dest/config.d.ts +17 -0
  3. package/dest/config.d.ts.map +1 -0
  4. package/dest/config.js +63 -0
  5. package/dest/index.d.ts +4 -0
  6. package/dest/index.d.ts.map +1 -0
  7. package/dest/index.js +2 -0
  8. package/dest/light/index.d.ts +2 -0
  9. package/dest/light/index.d.ts.map +1 -0
  10. package/dest/light/index.js +1 -0
  11. package/dest/light/lightweight_checkpoint_builder.d.ts +58 -0
  12. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
  13. package/dest/light/lightweight_checkpoint_builder.js +243 -0
  14. package/dest/mocks/fixtures.d.ts +20 -0
  15. package/dest/mocks/fixtures.d.ts.map +1 -0
  16. package/dest/mocks/fixtures.js +96 -0
  17. package/dest/mocks/test_context.d.ts +93 -0
  18. package/dest/mocks/test_context.d.ts.map +1 -0
  19. package/dest/mocks/test_context.js +354 -0
  20. package/dest/orchestrator/block-building-helpers.d.ts +67 -0
  21. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
  22. package/dest/orchestrator/block-building-helpers.js +274 -0
  23. package/dest/orchestrator/block-proving-state.d.ts +107 -0
  24. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  25. package/dest/orchestrator/block-proving-state.js +339 -0
  26. package/dest/orchestrator/checkpoint-proving-state.d.ts +67 -0
  27. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  28. package/dest/orchestrator/checkpoint-proving-state.js +175 -0
  29. package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts +169 -0
  30. package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts.map +1 -0
  31. package/dest/orchestrator/checkpoint-sub-tree-orchestrator.js +1047 -0
  32. package/dest/orchestrator/chonk-cache.d.ts +39 -0
  33. package/dest/orchestrator/chonk-cache.d.ts.map +1 -0
  34. package/dest/orchestrator/chonk-cache.js +80 -0
  35. package/dest/orchestrator/index.d.ts +4 -0
  36. package/dest/orchestrator/index.d.ts.map +1 -0
  37. package/dest/orchestrator/index.js +3 -0
  38. package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
  39. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
  40. package/dest/orchestrator/orchestrator_metrics.js +13 -0
  41. package/dest/orchestrator/proving-scheduler.d.ts +81 -0
  42. package/dest/orchestrator/proving-scheduler.d.ts.map +1 -0
  43. package/dest/orchestrator/proving-scheduler.js +120 -0
  44. package/dest/orchestrator/top-tree-orchestrator.d.ts +89 -0
  45. package/dest/orchestrator/top-tree-orchestrator.d.ts.map +1 -0
  46. package/dest/orchestrator/top-tree-orchestrator.js +233 -0
  47. package/dest/orchestrator/top-tree-proving-state.d.ts +61 -0
  48. package/dest/orchestrator/top-tree-proving-state.d.ts.map +1 -0
  49. package/dest/orchestrator/top-tree-proving-state.js +185 -0
  50. package/dest/orchestrator/tx-proving-state.d.ts +37 -0
  51. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
  52. package/dest/orchestrator/tx-proving-state.js +77 -0
  53. package/dest/prover-client/factory.d.ts +6 -0
  54. package/dest/prover-client/factory.d.ts.map +1 -0
  55. package/dest/prover-client/factory.js +5 -0
  56. package/dest/prover-client/index.d.ts +3 -0
  57. package/dest/prover-client/index.d.ts.map +1 -0
  58. package/dest/prover-client/index.js +2 -0
  59. package/dest/prover-client/prover-client.d.ts +99 -0
  60. package/dest/prover-client/prover-client.d.ts.map +1 -0
  61. package/dest/prover-client/prover-client.js +163 -0
  62. package/dest/proving_broker/broker_prover_facade.d.ts +52 -0
  63. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  64. package/dest/proving_broker/broker_prover_facade.js +360 -0
  65. package/dest/proving_broker/config.d.ts +40 -0
  66. package/dest/proving_broker/config.d.ts.map +1 -0
  67. package/dest/proving_broker/config.js +138 -0
  68. package/dest/proving_broker/factory.d.ts +5 -0
  69. package/dest/proving_broker/factory.d.ts.map +1 -0
  70. package/dest/proving_broker/factory.js +13 -0
  71. package/dest/proving_broker/fixtures.d.ts +6 -0
  72. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  73. package/dest/proving_broker/fixtures.js +13 -0
  74. package/dest/proving_broker/index.d.ts +11 -0
  75. package/dest/proving_broker/index.d.ts.map +1 -0
  76. package/dest/proving_broker/index.js +10 -0
  77. package/dest/proving_broker/proof_store/factory.d.ts +3 -0
  78. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  79. package/dest/proving_broker/proof_store/factory.js +13 -0
  80. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
  81. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
  82. package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
  83. package/dest/proving_broker/proof_store/index.d.ts +5 -0
  84. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  85. package/dest/proving_broker/proof_store/index.js +4 -0
  86. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +15 -0
  87. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  88. package/dest/proving_broker/proof_store/inline_proof_store.js +41 -0
  89. package/dest/proving_broker/proof_store/proof_store.d.ts +36 -0
  90. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  91. package/dest/proving_broker/proof_store/proof_store.js +3 -0
  92. package/dest/proving_broker/proving_agent.d.ts +42 -0
  93. package/dest/proving_broker/proving_agent.d.ts.map +1 -0
  94. package/dest/proving_broker/proving_agent.js +155 -0
  95. package/dest/proving_broker/proving_broker.d.ts +77 -0
  96. package/dest/proving_broker/proving_broker.d.ts.map +1 -0
  97. package/dest/proving_broker/proving_broker.js +780 -0
  98. package/dest/proving_broker/proving_broker_database/memory.d.ts +20 -0
  99. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  100. package/dest/proving_broker/proving_broker_database/memory.js +67 -0
  101. package/dest/proving_broker/proving_broker_database/persisted.d.ts +40 -0
  102. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  103. package/dest/proving_broker/proving_broker_database/persisted.js +623 -0
  104. package/dest/proving_broker/proving_broker_database.d.ts +66 -0
  105. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  106. package/dest/proving_broker/proving_broker_database.js +3 -0
  107. package/dest/proving_broker/proving_broker_instrumentation.d.ts +31 -0
  108. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  109. package/dest/proving_broker/proving_broker_instrumentation.js +97 -0
  110. package/dest/proving_broker/proving_job_controller.d.ts +34 -0
  111. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
  112. package/dest/proving_broker/proving_job_controller.js +184 -0
  113. package/dest/proving_broker/rpc.d.ts +38 -0
  114. package/dest/proving_broker/rpc.d.ts.map +1 -0
  115. package/dest/proving_broker/rpc.js +138 -0
  116. package/dest/test/epoch_settlement.d.ts +36 -0
  117. package/dest/test/epoch_settlement.d.ts.map +1 -0
  118. package/dest/test/epoch_settlement.js +52 -0
  119. package/dest/test/index.d.ts +2 -0
  120. package/dest/test/index.d.ts.map +1 -0
  121. package/dest/test/index.js +1 -0
  122. package/dest/test/mock_proof_store.d.ts +9 -0
  123. package/dest/test/mock_proof_store.d.ts.map +1 -0
  124. package/dest/test/mock_proof_store.js +10 -0
  125. package/dest/test/mock_prover.d.ts +38 -0
  126. package/dest/test/mock_prover.d.ts.map +1 -0
  127. package/dest/test/mock_prover.js +91 -0
  128. package/package.json +113 -0
  129. package/src/config.ts +87 -0
  130. package/src/index.ts +4 -0
  131. package/src/light/index.ts +1 -0
  132. package/src/light/lightweight_checkpoint_builder.ts +342 -0
  133. package/src/mocks/fixtures.ts +120 -0
  134. package/src/mocks/test_context.ts +477 -0
  135. package/src/orchestrator/block-building-helpers.ts +486 -0
  136. package/src/orchestrator/block-proving-state.ts +457 -0
  137. package/src/orchestrator/checkpoint-proving-state.ts +247 -0
  138. package/src/orchestrator/checkpoint-sub-tree-orchestrator.ts +1010 -0
  139. package/src/orchestrator/chonk-cache.ts +99 -0
  140. package/src/orchestrator/index.ts +12 -0
  141. package/src/orchestrator/orchestrator_metrics.ts +18 -0
  142. package/src/orchestrator/proving-scheduler.ts +160 -0
  143. package/src/orchestrator/top-tree-orchestrator.ts +394 -0
  144. package/src/orchestrator/top-tree-proving-state.ts +219 -0
  145. package/src/orchestrator/tx-proving-state.ts +121 -0
  146. package/src/prover-client/factory.ts +18 -0
  147. package/src/prover-client/index.ts +2 -0
  148. package/src/prover-client/prover-client.ts +286 -0
  149. package/src/proving_broker/broker_prover_facade.ts +626 -0
  150. package/src/proving_broker/config.ts +178 -0
  151. package/src/proving_broker/factory.ts +19 -0
  152. package/src/proving_broker/fixtures.ts +20 -0
  153. package/src/proving_broker/index.ts +10 -0
  154. package/src/proving_broker/proof_store/factory.ts +20 -0
  155. package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
  156. package/src/proving_broker/proof_store/index.ts +4 -0
  157. package/src/proving_broker/proof_store/inline_proof_store.ts +63 -0
  158. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  159. package/src/proving_broker/proving_agent.ts +210 -0
  160. package/src/proving_broker/proving_broker.ts +888 -0
  161. package/src/proving_broker/proving_broker_database/memory.ts +78 -0
  162. package/src/proving_broker/proving_broker_database/persisted.ts +296 -0
  163. package/src/proving_broker/proving_broker_database.ts +75 -0
  164. package/src/proving_broker/proving_broker_instrumentation.ts +133 -0
  165. package/src/proving_broker/proving_job_controller.ts +199 -0
  166. package/src/proving_broker/rpc.ts +131 -0
  167. package/src/test/epoch_settlement.ts +82 -0
  168. package/src/test/index.ts +1 -0
  169. package/src/test/mock_proof_store.ts +14 -0
  170. package/src/test/mock_prover.ts +304 -0
@@ -0,0 +1,199 @@
1
+ import { EpochNumber } from '@aztec-labs/foundation/branded-types';
2
+ import { randomBytes } from '@aztec-labs/foundation/crypto/random';
3
+ import { AbortError } from '@aztec-labs/foundation/error';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec-labs/foundation/log';
5
+ import type {
6
+ ProvingJobId,
7
+ ProvingJobInputs,
8
+ ProvingJobResultsMap,
9
+ ServerCircuitProver,
10
+ } from '@aztec-labs/stdlib/interfaces/server';
11
+ import { ProvingRequestType } from '@aztec-labs/stdlib/proofs';
12
+
13
+ export enum ProvingJobControllerStatus {
14
+ IDLE = 'idle',
15
+ RUNNING = 'running',
16
+ DONE = 'done',
17
+ }
18
+
19
+ export class ProvingJobController {
20
+ private status: ProvingJobControllerStatus = ProvingJobControllerStatus.IDLE;
21
+ private promise?: Promise<void>;
22
+ private abortController = new AbortController();
23
+ private result?: ProvingJobResultsMap[ProvingRequestType] | Error;
24
+ private log: Logger;
25
+
26
+ constructor(
27
+ private jobId: ProvingJobId,
28
+ private inputs: ProvingJobInputs,
29
+ private epochNumber: EpochNumber,
30
+ private startedAt: number,
31
+ private circuitProver: ServerCircuitProver,
32
+ private onComplete: () => void,
33
+ bindings?: LoggerBindings,
34
+ ) {
35
+ this.log = createLogger('prover-client:proving-agent:job-controller', {
36
+ instanceId: randomBytes(4).toString('hex'),
37
+ ...bindings,
38
+ });
39
+ }
40
+
41
+ public start(): void {
42
+ if (this.status !== ProvingJobControllerStatus.IDLE) {
43
+ this.log.warn(
44
+ `Job controller for jobId=${this.jobId} not starting because it is not idle currentStatus=${this.status}`,
45
+ {
46
+ currentStatus: this.status,
47
+ jobId: this.jobId,
48
+ },
49
+ );
50
+ return;
51
+ }
52
+
53
+ this.promise = this.run();
54
+
55
+ this.log.info(`Job controller started jobId=${this.jobId}`, {
56
+ jobId: this.jobId,
57
+ });
58
+ }
59
+
60
+ public getStatus(): ProvingJobControllerStatus {
61
+ return this.status;
62
+ }
63
+
64
+ public getResult(): ProvingJobResultsMap[ProvingRequestType] | Error | undefined {
65
+ return this.result;
66
+ }
67
+
68
+ public abort(): void {
69
+ if (this.status !== ProvingJobControllerStatus.RUNNING) {
70
+ this.log.warn(`Tried to abort job controller for jobId=${this.jobId} but it is not running`, {
71
+ currentStatus: this.status,
72
+ jobId: this.jobId,
73
+ });
74
+ return;
75
+ }
76
+
77
+ this.abortController.abort();
78
+ this.log.warn(`Aborted job controller for jobId=${this.jobId}`, {
79
+ jobId: this.jobId,
80
+ });
81
+ }
82
+
83
+ public getJobId(): ProvingJobId {
84
+ return this.jobId;
85
+ }
86
+
87
+ public getProofType(): ProvingRequestType {
88
+ return this.inputs.type;
89
+ }
90
+
91
+ public getStartedAt(): number {
92
+ return this.startedAt;
93
+ }
94
+
95
+ public getProofTypeName(): string {
96
+ return ProvingRequestType[this.inputs.type];
97
+ }
98
+
99
+ private run = async () => {
100
+ this.status = ProvingJobControllerStatus.RUNNING;
101
+ let result: ProvingJobResultsMap[ProvingRequestType] | Error;
102
+ try {
103
+ result = await this.generateProof();
104
+ } catch (err) {
105
+ if (err && err instanceof Error) {
106
+ result = err;
107
+ } else {
108
+ result = new Error('Unknown proving error: ' + String(err), { cause: err });
109
+ }
110
+ }
111
+
112
+ if (this.abortController.signal.aborted) {
113
+ this.log.warn(`Job controller for jobId=${this.jobId} completed but job was aborted`, {
114
+ currentStatus: this.status,
115
+ jobId: this.jobId,
116
+ });
117
+ result = new AbortError('Proof was aborted');
118
+ }
119
+
120
+ this.result = result;
121
+ this.status = ProvingJobControllerStatus.DONE;
122
+ try {
123
+ this.onComplete();
124
+ } catch (err) {
125
+ this.log.warn(`On complete handler error: ${err}`, { jobId: this.jobId });
126
+ }
127
+ };
128
+
129
+ private async generateProof(): Promise<ProvingJobResultsMap[ProvingRequestType]> {
130
+ const { type, inputs } = this.inputs;
131
+ const signal = this.abortController.signal;
132
+ switch (type) {
133
+ case ProvingRequestType.PUBLIC_VM: {
134
+ return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
135
+ }
136
+
137
+ case ProvingRequestType.PUBLIC_CHONK_VERIFIER: {
138
+ return await this.circuitProver.getPublicChonkVerifierProof(inputs, signal, this.epochNumber);
139
+ }
140
+
141
+ case ProvingRequestType.PRIVATE_TX_BASE_ROLLUP: {
142
+ return await this.circuitProver.getPrivateTxBaseRollupProof(inputs, signal, this.epochNumber);
143
+ }
144
+
145
+ case ProvingRequestType.PUBLIC_TX_BASE_ROLLUP: {
146
+ return await this.circuitProver.getPublicTxBaseRollupProof(inputs, signal, this.epochNumber);
147
+ }
148
+
149
+ case ProvingRequestType.TX_MERGE_ROLLUP: {
150
+ return await this.circuitProver.getTxMergeRollupProof(inputs, signal, this.epochNumber);
151
+ }
152
+
153
+ case ProvingRequestType.BLOCK_ROOT_NO_TXS_ROLLUP: {
154
+ return await this.circuitProver.getBlockRootNoTxsRollupProof(inputs, signal, this.epochNumber);
155
+ }
156
+
157
+ case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
158
+ return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
159
+ }
160
+
161
+ case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP: {
162
+ return await this.circuitProver.getBlockRootSingleTxRollupProof(inputs, signal, this.epochNumber);
163
+ }
164
+
165
+ case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
166
+ return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
167
+ }
168
+
169
+ case ProvingRequestType.CHECKPOINT_ROOT_ROLLUP: {
170
+ return await this.circuitProver.getCheckpointRootRollupProof(inputs, signal, this.epochNumber);
171
+ }
172
+
173
+ case ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP: {
174
+ return await this.circuitProver.getCheckpointRootSingleBlockRollupProof(inputs, signal, this.epochNumber);
175
+ }
176
+
177
+ case ProvingRequestType.CHECKPOINT_PADDING_ROLLUP: {
178
+ return await this.circuitProver.getCheckpointPaddingRollupProof(inputs, signal, this.epochNumber);
179
+ }
180
+
181
+ case ProvingRequestType.CHECKPOINT_MERGE_ROLLUP: {
182
+ return await this.circuitProver.getCheckpointMergeRollupProof(inputs, signal, this.epochNumber);
183
+ }
184
+
185
+ case ProvingRequestType.ROOT_ROLLUP: {
186
+ return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
187
+ }
188
+
189
+ case ProvingRequestType.INBOX_PARITY: {
190
+ return await this.circuitProver.getInboxParityProof(inputs, signal, this.epochNumber);
191
+ }
192
+
193
+ default: {
194
+ const _exhaustive: never = type;
195
+ return Promise.reject(new Error(`Invalid proof request type: ${type}`));
196
+ }
197
+ }
198
+ }
199
+ }
@@ -0,0 +1,131 @@
1
+ import { EpochNumberSchema } from '@aztec-labs/foundation/branded-types';
2
+ import { createSafeJsonRpcClient } from '@aztec-labs/foundation/json-rpc/client';
3
+ import {
4
+ type GetProvingJobResponse,
5
+ ProofUri,
6
+ ProvingJob,
7
+ type ProvingJobBroker,
8
+ type ProvingJobBrokerDebug,
9
+ type ProvingJobConsumer,
10
+ ProvingJobId,
11
+ type ProvingJobProducer,
12
+ ProvingJobStatus,
13
+ } from '@aztec-labs/stdlib/interfaces/server';
14
+ import { ProvingRequestType } from '@aztec-labs/stdlib/proofs';
15
+ import { type ApiSchemaFor, optional } from '@aztec-labs/stdlib/schemas';
16
+ import { type ComponentsVersions, getVersioningResponseHandler } from '@aztec-labs/stdlib/versioning';
17
+ import { makeTracedFetch } from '@aztec-labs/telemetry-client';
18
+ import { z } from 'zod';
19
+
20
+ /**
21
+ * Max JSON-RPC request body the broker clients will send.
22
+ *
23
+ * Job inputs and proof results travel inline as `data:` URIs on this path, so a single call is routinely larger than
24
+ * the 1 mb the generic JSON-RPC client allows — that default sizes batches of small node requests against the node
25
+ * server's own default. An AVM (`PUBLIC_VM`) result is around 1.3 mb today. This value must stay at or below the
26
+ * broker server's `RPC_MAX_BODY_SIZE`, which deployments set to 50mb.
27
+ */
28
+ export const PROVER_BROKER_MAX_REQUEST_BODY_SIZE = 50 * 1024 * 1024;
29
+
30
+ /** Indefinite backoff for broker communication: 1, 1, 1, 2, 4, 4, 4, ... seconds. */
31
+ export function* proverBrokerBackoff() {
32
+ const v = [1, 1, 1, 2, 4];
33
+ let i = 0;
34
+ while (true) {
35
+ yield v[Math.min(i++, v.length - 1)];
36
+ }
37
+ }
38
+
39
+ const ProvingJobFilterSchema = z.object({
40
+ allowList: z.array(z.nativeEnum(ProvingRequestType)),
41
+ });
42
+
43
+ const GetProvingJobResponse = z.object({
44
+ job: ProvingJob,
45
+ time: z.number(),
46
+ });
47
+
48
+ export const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer> = {
49
+ enqueueProvingJob: z.function({ input: z.tuple([ProvingJob]), output: ProvingJobStatus }),
50
+ getProvingJobStatus: z.function({ input: z.tuple([ProvingJobId]), output: ProvingJobStatus }),
51
+ cancelProvingJob: z.function({ input: z.tuple([ProvingJobId]), output: z.void() }),
52
+ getCompletedJobs: z.function({ input: z.tuple([z.array(ProvingJobId)]), output: z.array(ProvingJobId) }),
53
+ };
54
+
55
+ export const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer> = {
56
+ getProvingJob: z.function({
57
+ input: z.tuple([optional(ProvingJobFilterSchema)]),
58
+ output: GetProvingJobResponse.optional(),
59
+ }),
60
+ reportProvingJobError: z.function({
61
+ input: z.tuple([ProvingJobId, z.string(), optional(z.boolean()), optional(ProvingJobFilterSchema)]),
62
+ output: GetProvingJobResponse.optional(),
63
+ }),
64
+ reportProvingJobProgress: z.function({
65
+ input: z.tuple([ProvingJobId, z.number(), optional(ProvingJobFilterSchema)]),
66
+ output: GetProvingJobResponse.optional(),
67
+ }),
68
+ reportProvingJobSuccess: z.function({
69
+ input: z.tuple([ProvingJobId, ProofUri, optional(ProvingJobFilterSchema)]),
70
+ output: GetProvingJobResponse.optional(),
71
+ }),
72
+ };
73
+
74
+ export const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker> = {
75
+ ...ProvingJobConsumerSchema,
76
+ ...ProvingJobProducerSchema,
77
+ };
78
+
79
+ export const ProvingJobBrokerDebugSchema: ApiSchemaFor<ProvingJobBrokerDebug> = {
80
+ replayProvingJob: z.function({
81
+ input: z.tuple([ProvingJobId, z.nativeEnum(ProvingRequestType), EpochNumberSchema, ProofUri]),
82
+ output: ProvingJobStatus,
83
+ }),
84
+ };
85
+
86
+ export const ProvingJobBrokerSchemaWithDebug: ApiSchemaFor<ProvingJobBroker & ProvingJobBrokerDebug> = {
87
+ ...ProvingJobBrokerSchema,
88
+ ...ProvingJobBrokerDebugSchema,
89
+ };
90
+
91
+ export function createProvingJobBrokerClient(
92
+ url: string,
93
+ versions: Partial<ComponentsVersions>,
94
+ fetch = makeTracedFetch(proverBrokerBackoff, false),
95
+ maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE,
96
+ ): ProvingJobBroker {
97
+ return createSafeJsonRpcClient(url, ProvingJobBrokerSchema, {
98
+ namespaceMethods: 'proverBroker',
99
+ fetch,
100
+ maxRequestBodySize,
101
+ onResponse: getVersioningResponseHandler(versions),
102
+ });
103
+ }
104
+
105
+ export function createProvingJobProducerClient(
106
+ url: string,
107
+ versions: Partial<ComponentsVersions>,
108
+ fetch = makeTracedFetch(proverBrokerBackoff, false),
109
+ maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE,
110
+ ): ProvingJobProducer {
111
+ return createSafeJsonRpcClient(url, ProvingJobProducerSchema, {
112
+ namespaceMethods: 'provingJobProducer',
113
+ fetch,
114
+ maxRequestBodySize,
115
+ onResponse: getVersioningResponseHandler(versions),
116
+ });
117
+ }
118
+
119
+ export function createProvingJobConsumerClient(
120
+ url: string,
121
+ versions: Partial<ComponentsVersions>,
122
+ fetch = makeTracedFetch(proverBrokerBackoff, false),
123
+ maxRequestBodySize = PROVER_BROKER_MAX_REQUEST_BODY_SIZE,
124
+ ): ProvingJobConsumer {
125
+ return createSafeJsonRpcClient(url, ProvingJobConsumerSchema, {
126
+ namespaceMethods: 'provingJobConsumer',
127
+ fetch,
128
+ maxRequestBodySize,
129
+ onResponse: getVersioningResponseHandler(versions),
130
+ });
131
+ }
@@ -0,0 +1,82 @@
1
+ import type { RollupCheatCodes } from '@aztec-labs/ethereum/test';
2
+ import type { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec-labs/foundation/branded-types';
3
+ import type { Fr } from '@aztec-labs/foundation/curves/bn254';
4
+ import type { Logger } from '@aztec-labs/foundation/log';
5
+ import type { L2BlockSource } from '@aztec-labs/stdlib/block';
6
+ import { computeEpochOutHash } from '@aztec-labs/stdlib/messaging';
7
+
8
+ /** Arguments for {@link settleEpochOutbox}. */
9
+ export type SettleEpochOutboxArgs = {
10
+ /** Cheat codes used to write the computed out hash directly into the L1 Outbox storage. */
11
+ rollupCheatCodes: RollupCheatCodes;
12
+ /** Source of checkpointed L2 blocks for the epoch being settled. */
13
+ l2BlockSource: L2BlockSource;
14
+ /** Epoch to settle. */
15
+ epoch: EpochNumber;
16
+ /**
17
+ * When set, only checkpoints up to and including this number are covered. Used to settle a partial
18
+ * epoch (the AZIP-14 Outbox keeps one root per `numCheckpointsInEpoch`, so a prefix of an epoch can
19
+ * be settled and consumed before the epoch completes). When omitted, every checkpointed block in the
20
+ * epoch is covered.
21
+ */
22
+ maxCheckpoint?: CheckpointNumber;
23
+ log: Logger;
24
+ };
25
+
26
+ /**
27
+ * Computes the epoch out hash over the checkpointed blocks of an epoch (optionally only up to
28
+ * `maxCheckpoint`) and writes it into the L1 Outbox via cheat codes. This is the synthetic,
29
+ * no-prover equivalent of an epoch root proof landing on L1: it makes the L2-to-L1 messages in the
30
+ * covered checkpoints consumable. It does NOT advance the rollup's proven tip — callers
31
+ * `markAsProven` separately so a single prove call can settle multiple epochs before marking proven.
32
+ *
33
+ * Used by the test-only proving drivers: the `AutomineSequencer`'s auto-settle loop and the standalone
34
+ * `EpochTestSettler`. Lives here (rather than in either consumer) so both share one implementation.
35
+ *
36
+ * @returns The last checkpoint number covered by the settled range, or `undefined` if the epoch has
37
+ * no checkpointed blocks (within the `maxCheckpoint` bound).
38
+ */
39
+ export async function settleEpochOutbox({
40
+ rollupCheatCodes,
41
+ l2BlockSource,
42
+ epoch,
43
+ maxCheckpoint,
44
+ log,
45
+ }: SettleEpochOutboxArgs): Promise<CheckpointNumber | undefined> {
46
+ let blocks = await l2BlockSource.getBlocks({ epoch, onlyCheckpointed: true });
47
+ if (maxCheckpoint !== undefined) {
48
+ blocks = blocks.filter(block => block.checkpointNumber <= maxCheckpoint);
49
+ }
50
+ if (blocks.length === 0) {
51
+ return undefined;
52
+ }
53
+
54
+ log.info(
55
+ `Settling epoch ${epoch}${maxCheckpoint !== undefined ? ` up to checkpoint ${maxCheckpoint}` : ''} with blocks ${blocks[0]?.header.getBlockNumber()} to ${blocks.at(-1)?.header.getBlockNumber()}`,
56
+ { epoch, maxCheckpoint, blocks: blocks.map(block => block.toBlockInfo()) },
57
+ );
58
+
59
+ const messagesInEpoch: Fr[][][][] = [];
60
+ // Undefined (not SlotNumber.ZERO) so a first checkpointed block at slot 0 still opens checkpoint 0.
61
+ let previousSlotNumber: SlotNumber | undefined;
62
+ let checkpointIndex = -1;
63
+
64
+ for (const block of blocks) {
65
+ const slotNumber = block.header.globalVariables.slotNumber;
66
+ if (slotNumber !== previousSlotNumber) {
67
+ checkpointIndex++;
68
+ messagesInEpoch[checkpointIndex] = [];
69
+ previousSlotNumber = slotNumber;
70
+ }
71
+ messagesInEpoch[checkpointIndex].push(block.body.txEffects.map(txEffect => txEffect.l2ToL1Msgs));
72
+ }
73
+
74
+ const outHash = computeEpochOutHash(messagesInEpoch);
75
+ if (!outHash.isZero()) {
76
+ await rollupCheatCodes.insertOutbox(epoch, messagesInEpoch.length, outHash.toBigInt());
77
+ } else {
78
+ log.info(`No L2 to L1 messages in epoch ${epoch}`, { epoch });
79
+ }
80
+
81
+ return blocks.at(-1)?.checkpointNumber;
82
+ }
@@ -0,0 +1 @@
1
+ export { settleEpochOutbox, type SettleEpochOutboxArgs } from './epoch_settlement.js';
@@ -0,0 +1,14 @@
1
+ import type { ProvingJobId } from '@aztec-labs/stdlib/interfaces/server';
2
+ import { ProvingRequestType } from '@aztec-labs/stdlib/proofs';
3
+
4
+ // Mock ProofStore for faster benchmarks with realistic Cloud Storage URIs
5
+ export class MockProofStore {
6
+ private mockCounter = 0;
7
+ private readonly bucketName = 'aztec-proving-benchmarks';
8
+ private readonly basePath = 'proving-jobs';
9
+
10
+ saveProofInput(jobId: ProvingJobId, type: ProvingRequestType): Promise<string> {
11
+ const uri = `gs://${this.bucketName}/${this.basePath}/inputs/${type}/${jobId}`;
12
+ return Promise.resolve(uri as any);
13
+ }
14
+ }