@aztec/prover-client 0.69.1 → 0.71.0

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 (130) hide show
  1. package/dest/bin/get-proof-inputs.d.ts +2 -0
  2. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  3. package/dest/bin/get-proof-inputs.js +50 -0
  4. package/dest/block_builder/light.d.ts +3 -5
  5. package/dest/block_builder/light.d.ts.map +1 -1
  6. package/dest/block_builder/light.js +9 -22
  7. package/dest/config.d.ts +2 -1
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +3 -2
  10. package/dest/mocks/fixtures.d.ts +1 -1
  11. package/dest/mocks/fixtures.d.ts.map +1 -1
  12. package/dest/mocks/fixtures.js +2 -2
  13. package/dest/mocks/test_context.d.ts +1 -1
  14. package/dest/mocks/test_context.d.ts.map +1 -1
  15. package/dest/mocks/test_context.js +11 -12
  16. package/dest/orchestrator/block-building-helpers.d.ts +15 -29
  17. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  18. package/dest/orchestrator/block-building-helpers.js +51 -58
  19. package/dest/orchestrator/block-proving-state.d.ts +40 -44
  20. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/block-proving-state.js +149 -85
  22. package/dest/orchestrator/epoch-proving-state.d.ts +23 -30
  23. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/epoch-proving-state.js +92 -65
  25. package/dest/orchestrator/orchestrator.d.ts +17 -48
  26. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  27. package/dest/orchestrator/orchestrator.js +208 -351
  28. package/dest/orchestrator/tx-proving-state.d.ts +10 -6
  29. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  30. package/dest/orchestrator/tx-proving-state.js +57 -46
  31. package/dest/prover-agent/memory-proving-queue.d.ts +4 -4
  32. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  33. package/dest/prover-agent/memory-proving-queue.js +5 -5
  34. package/dest/prover-agent/prover-agent.d.ts +0 -2
  35. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  36. package/dest/prover-agent/prover-agent.js +7 -9
  37. package/dest/prover-client/factory.d.ts.map +1 -1
  38. package/dest/prover-client/factory.js +3 -3
  39. package/dest/prover-client/prover-client.d.ts +4 -2
  40. package/dest/prover-client/prover-client.d.ts.map +1 -1
  41. package/dest/prover-client/prover-client.js +16 -15
  42. package/dest/prover-client/server-epoch-prover.d.ts +25 -0
  43. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  44. package/dest/prover-client/server-epoch-prover.js +40 -0
  45. package/dest/proving_broker/broker_prover_facade.d.ts +19 -7
  46. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  47. package/dest/proving_broker/broker_prover_facade.js +271 -49
  48. package/dest/proving_broker/config.d.ts +61 -0
  49. package/dest/proving_broker/config.d.ts.map +1 -0
  50. package/dest/proving_broker/config.js +83 -0
  51. package/dest/proving_broker/factory.d.ts +1 -1
  52. package/dest/proving_broker/factory.d.ts.map +1 -1
  53. package/dest/proving_broker/factory.js +4 -7
  54. package/dest/proving_broker/fixtures.d.ts +5 -0
  55. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  56. package/dest/proving_broker/fixtures.js +12 -0
  57. package/dest/proving_broker/index.d.ts +2 -1
  58. package/dest/proving_broker/index.d.ts.map +1 -1
  59. package/dest/proving_broker/index.js +3 -2
  60. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  61. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  62. package/dest/proving_broker/proof_store/factory.js +39 -0
  63. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
  64. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  65. package/dest/proving_broker/proof_store/gcs_proof_store.js +46 -0
  66. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  67. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  68. package/dest/proving_broker/proof_store/index.js +4 -0
  69. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
  70. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  71. package/dest/proving_broker/proof_store/inline_proof_store.js +37 -0
  72. package/dest/proving_broker/{proof_store.d.ts → proof_store/proof_store.d.ts} +1 -12
  73. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  74. package/dest/proving_broker/proof_store/proof_store.js +2 -0
  75. package/dest/proving_broker/proving_agent.d.ts +4 -4
  76. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  77. package/dest/proving_broker/proving_agent.js +5 -5
  78. package/dest/proving_broker/proving_broker.d.ts +16 -12
  79. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  80. package/dest/proving_broker/proving_broker.js +307 -274
  81. package/dest/proving_broker/proving_broker_database/memory.d.ts +4 -2
  82. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  83. package/dest/proving_broker/proving_broker_database/memory.js +17 -4
  84. package/dest/proving_broker/proving_broker_database/persisted.d.ts +10 -6
  85. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  86. package/dest/proving_broker/proving_broker_database/persisted.js +106 -14
  87. package/dest/proving_broker/proving_broker_database.d.ts +7 -3
  88. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  89. package/dest/proving_broker/proving_job_controller.js +4 -4
  90. package/dest/proving_broker/rpc.d.ts.map +1 -1
  91. package/dest/proving_broker/rpc.js +4 -4
  92. package/dest/test/mock_prover.d.ts +8 -8
  93. package/dest/test/mock_prover.d.ts.map +1 -1
  94. package/dest/test/mock_prover.js +9 -10
  95. package/package.json +14 -12
  96. package/src/bin/get-proof-inputs.ts +60 -0
  97. package/src/block_builder/light.ts +7 -31
  98. package/src/config.ts +4 -4
  99. package/src/mocks/fixtures.ts +1 -1
  100. package/src/mocks/test_context.ts +9 -11
  101. package/src/orchestrator/block-building-helpers.ts +360 -402
  102. package/src/orchestrator/block-proving-state.ts +251 -121
  103. package/src/orchestrator/epoch-proving-state.ts +159 -88
  104. package/src/orchestrator/orchestrator.ts +262 -542
  105. package/src/orchestrator/tx-proving-state.ts +30 -18
  106. package/src/prover-agent/memory-proving-queue.ts +12 -16
  107. package/src/prover-agent/prover-agent.ts +14 -8
  108. package/src/prover-client/factory.ts +2 -3
  109. package/src/prover-client/prover-client.ts +17 -20
  110. package/src/prover-client/server-epoch-prover.ts +44 -0
  111. package/src/proving_broker/broker_prover_facade.ts +347 -67
  112. package/src/proving_broker/config.ts +93 -0
  113. package/src/proving_broker/factory.ts +11 -10
  114. package/src/proving_broker/fixtures.ts +14 -0
  115. package/src/proving_broker/index.ts +2 -1
  116. package/src/proving_broker/proof_store/factory.ts +42 -0
  117. package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
  118. package/src/proving_broker/proof_store/index.ts +3 -0
  119. package/src/proving_broker/{proof_store.ts → proof_store/inline_proof_store.ts} +1 -44
  120. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  121. package/src/proving_broker/proving_agent.ts +11 -5
  122. package/src/proving_broker/proving_broker.ts +122 -73
  123. package/src/proving_broker/proving_broker_database/memory.ts +24 -4
  124. package/src/proving_broker/proving_broker_database/persisted.ts +142 -20
  125. package/src/proving_broker/proving_broker_database.ts +8 -3
  126. package/src/proving_broker/proving_job_controller.ts +5 -5
  127. package/src/proving_broker/rpc.ts +2 -3
  128. package/src/test/mock_prover.ts +12 -18
  129. package/dest/proving_broker/proof_store.d.ts.map +0 -1
  130. package/dest/proving_broker/proof_store.js +0 -37
@@ -1,19 +1,36 @@
1
- import { type MerkleTreeId } from '@aztec/circuit-types';
2
1
  import {
3
- type ARCHIVE_HEIGHT,
4
- type AppendOnlyTreeSnapshot,
2
+ type MerkleTreeId,
3
+ type ProofAndVerificationKey,
4
+ type PublicInputsAndRecursiveProof,
5
+ } from '@aztec/circuit-types';
6
+ import {
7
+ ARCHIVE_HEIGHT,
8
+ AppendOnlyTreeSnapshot,
9
+ type BlockHeader,
5
10
  Fr,
6
11
  type GlobalVariables,
7
- type L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
12
+ L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH,
13
+ MembershipWitness,
8
14
  type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
9
15
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
10
- type Proof,
11
- type RecursiveProof,
12
- type VerificationKeyAsFields,
16
+ type TUBE_PROOF_LENGTH,
17
+ VK_TREE_HEIGHT,
13
18
  } from '@aztec/circuits.js';
14
- import { type BlockRootOrBlockMergePublicInputs, type RootRollupPublicInputs } from '@aztec/circuits.js/rollup';
19
+ import {
20
+ BlockMergeRollupInputs,
21
+ type BlockRootOrBlockMergePublicInputs,
22
+ ConstantRollupData,
23
+ EmptyBlockRootRollupInputs,
24
+ PreviousRollupBlockData,
25
+ RootRollupInputs,
26
+ type RootRollupPublicInputs,
27
+ } from '@aztec/circuits.js/rollup';
28
+ import { makeTuple } from '@aztec/foundation/array';
15
29
  import { padArrayEnd } from '@aztec/foundation/collection';
16
30
  import { type Tuple } from '@aztec/foundation/serialize';
31
+ import { type TreeNodeLocation, UnbalancedTreeStore } from '@aztec/foundation/trees';
32
+ import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vks';
33
+ import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
17
34
 
18
35
  import { BlockProvingState } from './block-proving-state.js';
19
36
 
@@ -26,15 +43,6 @@ enum PROVING_STATE_LIFECYCLE {
26
43
  PROVING_STATE_REJECTED,
27
44
  }
28
45
 
29
- export type BlockMergeRollupInputData = {
30
- inputs: [BlockRootOrBlockMergePublicInputs | undefined, BlockRootOrBlockMergePublicInputs | undefined];
31
- proofs: [
32
- RecursiveProof<typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH> | undefined,
33
- RecursiveProof<typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH> | undefined,
34
- ];
35
- verificationKeys: [VerificationKeyAsFields | undefined, VerificationKeyAsFields | undefined];
36
- };
37
-
38
46
  export type ProvingResult = { status: 'success' } | { status: 'failure'; reason: string };
39
47
 
40
48
  /**
@@ -44,11 +52,18 @@ export type ProvingResult = { status: 'success' } | { status: 'failure'; reason:
44
52
  * Captures resolve and reject callbacks to provide a promise base interface to the consumer of our proving.
45
53
  */
46
54
  export class EpochProvingState {
55
+ private blockRootOrMergeProvingOutputs: UnbalancedTreeStore<
56
+ PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
57
+ >;
58
+ private paddingBlockRootProvingOutput:
59
+ | PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
60
+ | undefined;
61
+ private rootRollupProvingOutput: PublicInputsAndRecursiveProof<RootRollupPublicInputs> | undefined;
47
62
  private provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
48
63
 
49
- private mergeRollupInputs: BlockMergeRollupInputData[] = [];
50
- public rootRollupPublicInputs: RootRollupPublicInputs | undefined;
51
- public finalProof: Proof | undefined;
64
+ // Map from tx hash to tube proof promise. Used when kickstarting tube proofs before tx processing.
65
+ public readonly cachedTubeProofs = new Map<string, Promise<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>>>();
66
+
52
67
  public blocks: (BlockProvingState | undefined)[] = [];
53
68
 
54
69
  constructor(
@@ -57,40 +72,8 @@ export class EpochProvingState {
57
72
  public readonly totalNumBlocks: number,
58
73
  private completionCallback: (result: ProvingResult) => void,
59
74
  private rejectionCallback: (reason: string) => void,
60
- ) {}
61
-
62
- // Returns the number of levels of merge rollups
63
- public get numMergeLevels() {
64
- const totalLeaves = Math.max(2, this.totalNumBlocks);
65
- return BigInt(Math.ceil(Math.log2(totalLeaves)) - 1);
66
- }
67
-
68
- // Calculates the index and level of the parent rollup circuit
69
- // Based on tree implementation in unbalanced_tree.ts -> batchInsert()
70
- // REFACTOR: This is repeated from the block orchestrator
71
- public findMergeLevel(currentLevel: bigint, currentIndex: bigint) {
72
- const totalLeaves = Math.max(2, this.totalNumBlocks);
73
- const moveUpMergeLevel = (levelSize: number, index: bigint, nodeToShift: boolean) => {
74
- levelSize /= 2;
75
- if (levelSize & 1) {
76
- [levelSize, nodeToShift] = nodeToShift ? [levelSize + 1, false] : [levelSize - 1, true];
77
- }
78
- index >>= 1n;
79
- return { thisLevelSize: levelSize, thisIndex: index, shiftUp: nodeToShift };
80
- };
81
- let [thisLevelSize, shiftUp] = totalLeaves & 1 ? [totalLeaves - 1, true] : [totalLeaves, false];
82
- const maxLevel = this.numMergeLevels + 1n;
83
- let placeholder = currentIndex;
84
- for (let i = 0; i < maxLevel - currentLevel; i++) {
85
- ({ thisLevelSize, thisIndex: placeholder, shiftUp } = moveUpMergeLevel(thisLevelSize, placeholder, shiftUp));
86
- }
87
- let thisIndex = currentIndex;
88
- let mergeLevel = currentLevel;
89
- while (thisIndex >= thisLevelSize && mergeLevel != 0n) {
90
- mergeLevel -= 1n;
91
- ({ thisLevelSize, thisIndex, shiftUp } = moveUpMergeLevel(thisLevelSize, thisIndex, shiftUp));
92
- }
93
- return [mergeLevel - 1n, thisIndex >> 1n, thisIndex & 1n];
75
+ ) {
76
+ this.blockRootOrMergeProvingOutputs = new UnbalancedTreeStore(totalNumBlocks);
94
77
  }
95
78
 
96
79
  // Adds a block to the proving state, returns its index
@@ -103,6 +86,7 @@ export class EpochProvingState {
103
86
  messageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
104
87
  archiveTreeSnapshot: AppendOnlyTreeSnapshot,
105
88
  archiveTreeRootSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
89
+ previousBlockHeader: BlockHeader,
106
90
  previousBlockHash: Fr,
107
91
  ): BlockProvingState {
108
92
  const index = globalVariables.blockNumber.toNumber() - this.firstBlockNumber;
@@ -115,6 +99,7 @@ export class EpochProvingState {
115
99
  messageTreeSnapshotAfterInsertion,
116
100
  archiveTreeSnapshot,
117
101
  archiveTreeRootSiblingPath,
102
+ previousBlockHeader,
118
103
  previousBlockHash,
119
104
  this,
120
105
  );
@@ -138,39 +123,89 @@ export class EpochProvingState {
138
123
  return this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
139
124
  }
140
125
 
141
- /**
142
- * Stores the inputs to a merge circuit and determines if the circuit is ready to be executed
143
- * @param mergeInputs - The inputs to store
144
- * @param indexWithinMerge - The index in the set of inputs to this merge circuit
145
- * @param indexOfMerge - The global index of this merge circuit
146
- * @returns True if the merge circuit is ready to be executed, false otherwise
147
- */
148
- public storeMergeInputs(
149
- mergeInputs: [
126
+ public setBlockRootRollupProof(
127
+ blockIndex: number,
128
+ proof: PublicInputsAndRecursiveProof<
129
+ BlockRootOrBlockMergePublicInputs,
130
+ typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
131
+ >,
132
+ ): TreeNodeLocation {
133
+ return this.blockRootOrMergeProvingOutputs.setLeaf(blockIndex, proof);
134
+ }
135
+
136
+ public setBlockMergeRollupProof(
137
+ location: TreeNodeLocation,
138
+ proof: PublicInputsAndRecursiveProof<
150
139
  BlockRootOrBlockMergePublicInputs,
151
- RecursiveProof<typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>,
152
- VerificationKeyAsFields,
153
- ],
154
- indexWithinMerge: number,
155
- indexOfMerge: number,
140
+ typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
141
+ >,
156
142
  ) {
157
- if (!this.mergeRollupInputs[indexOfMerge]) {
158
- const mergeInputData: BlockMergeRollupInputData = {
159
- inputs: [undefined, undefined],
160
- proofs: [undefined, undefined],
161
- verificationKeys: [undefined, undefined],
162
- };
163
- mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
164
- mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
165
- mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
166
- this.mergeRollupInputs[indexOfMerge] = mergeInputData;
167
- return false;
143
+ this.blockRootOrMergeProvingOutputs.setNode(location, proof);
144
+ }
145
+
146
+ public setRootRollupProof(proof: PublicInputsAndRecursiveProof<RootRollupPublicInputs>) {
147
+ this.rootRollupProvingOutput = proof;
148
+ }
149
+
150
+ public setPaddingBlockRootProof(
151
+ proof: PublicInputsAndRecursiveProof<
152
+ BlockRootOrBlockMergePublicInputs,
153
+ typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
154
+ >,
155
+ ) {
156
+ this.paddingBlockRootProvingOutput = proof;
157
+ }
158
+
159
+ public getParentLocation(location: TreeNodeLocation) {
160
+ return this.blockRootOrMergeProvingOutputs.getParentLocation(location);
161
+ }
162
+
163
+ public getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation) {
164
+ const [left, right] = this.blockRootOrMergeProvingOutputs.getChildren(mergeLocation);
165
+ if (!left || !right) {
166
+ throw new Error('At lease one child is not ready.');
168
167
  }
169
- const mergeInputData = this.mergeRollupInputs[indexOfMerge];
170
- mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
171
- mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
172
- mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
173
- return true;
168
+
169
+ return new BlockMergeRollupInputs([this.#getPreviousRollupData(left), this.#getPreviousRollupData(right)]);
170
+ }
171
+
172
+ public getRootRollupInputs(proverId: Fr) {
173
+ const [left, right] = this.#getChildProofsForRoot();
174
+ if (!left || !right) {
175
+ throw new Error('At lease one child is not ready.');
176
+ }
177
+
178
+ return RootRollupInputs.from({
179
+ previousRollupData: [this.#getPreviousRollupData(left), this.#getPreviousRollupData(right)],
180
+ proverId,
181
+ });
182
+ }
183
+
184
+ public getPaddingBlockRootInputs(proverId: Fr) {
185
+ const { block } = this.blocks[0] ?? {};
186
+ const l1ToL2Roots = this.blocks[0]?.getL1ToL2Roots();
187
+ if (!block || !l1ToL2Roots) {
188
+ throw new Error('Epoch needs one completed block in order to be padded.');
189
+ }
190
+
191
+ const constants = ConstantRollupData.from({
192
+ lastArchive: block.archive,
193
+ globalVariables: block.header.globalVariables,
194
+ vkTreeRoot: getVKTreeRoot(),
195
+ protocolContractTreeRoot,
196
+ });
197
+
198
+ return EmptyBlockRootRollupInputs.from({
199
+ l1ToL2Roots,
200
+ newL1ToL2MessageTreeRootSiblingPath: makeTuple(L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, Fr.zero),
201
+ startL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot.zero(),
202
+ newArchiveSiblingPath: makeTuple(ARCHIVE_HEIGHT, Fr.zero),
203
+ previousBlockHash: block.header.hash(),
204
+ previousPartialState: block.header.state.partial,
205
+ constants,
206
+ proverId,
207
+ isPadding: true,
208
+ });
174
209
  }
175
210
 
176
211
  // Returns a specific transaction proving state
@@ -178,14 +213,25 @@ export class EpochProvingState {
178
213
  return this.blocks.find(block => block?.blockNumber === blockNumber);
179
214
  }
180
215
 
181
- // Returns a set of merge rollup inputs
182
- public getMergeInputs(indexOfMerge: number) {
183
- return this.mergeRollupInputs[indexOfMerge];
216
+ public getEpochProofResult() {
217
+ if (!this.rootRollupProvingOutput) {
218
+ throw new Error('Unable to get epoch proof result. Root rollup is not ready.');
219
+ }
220
+
221
+ return {
222
+ proof: this.rootRollupProvingOutput.proof.binaryProof,
223
+ publicInputs: this.rootRollupProvingOutput.inputs,
224
+ };
225
+ }
226
+
227
+ public isReadyForBlockMerge(location: TreeNodeLocation) {
228
+ return this.blockRootOrMergeProvingOutputs.getSibling(location) !== undefined;
184
229
  }
185
230
 
186
231
  // Returns true if we have sufficient inputs to execute the block root rollup
187
232
  public isReadyForRootRollup() {
188
- return !(this.mergeRollupInputs[0] === undefined || this.mergeRollupInputs[0].inputs.findIndex(p => !p) !== -1);
233
+ const childProofs = this.#getChildProofsForRoot();
234
+ return childProofs.every(p => !!p);
189
235
  }
190
236
 
191
237
  // Attempts to reject the proving state promise with a reason of 'cancelled'
@@ -212,4 +258,29 @@ export class EpochProvingState {
212
258
  this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_RESOLVED;
213
259
  this.completionCallback(result);
214
260
  }
261
+
262
+ #getChildProofsForRoot() {
263
+ const rootLocation = { level: 0, index: 0 };
264
+ // If there's only 1 block, its block root proof will be stored at the root.
265
+ return this.totalNumBlocks === 1
266
+ ? [this.blockRootOrMergeProvingOutputs.getNode(rootLocation), this.paddingBlockRootProvingOutput]
267
+ : this.blockRootOrMergeProvingOutputs.getChildren(rootLocation);
268
+ }
269
+
270
+ #getPreviousRollupData({
271
+ inputs,
272
+ proof,
273
+ verificationKey,
274
+ }: PublicInputsAndRecursiveProof<
275
+ BlockRootOrBlockMergePublicInputs,
276
+ typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
277
+ >) {
278
+ const leafIndex = getVKIndex(verificationKey.keyAsFields);
279
+ return new PreviousRollupBlockData(
280
+ inputs,
281
+ proof,
282
+ verificationKey.keyAsFields,
283
+ new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)),
284
+ );
285
+ }
215
286
  }