@aztec/prover-client 0.0.1-fake-ceab37513c → 0.0.6-commit.a2d1860fe9

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 (148) hide show
  1. package/dest/config.d.ts +2 -2
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +2 -2
  4. package/dest/index.d.ts +1 -1
  5. package/dest/light/index.d.ts +2 -0
  6. package/dest/light/index.d.ts.map +1 -0
  7. package/dest/light/index.js +1 -0
  8. package/dest/light/lightweight_checkpoint_builder.d.ts +48 -0
  9. package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
  10. package/dest/light/lightweight_checkpoint_builder.js +202 -0
  11. package/dest/mocks/fixtures.d.ts +5 -5
  12. package/dest/mocks/fixtures.d.ts.map +1 -1
  13. package/dest/mocks/fixtures.js +35 -16
  14. package/dest/mocks/test_context.d.ts +39 -33
  15. package/dest/mocks/test_context.d.ts.map +1 -1
  16. package/dest/mocks/test_context.js +141 -82
  17. package/dest/orchestrator/block-building-helpers.d.ts +34 -34
  18. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  19. package/dest/orchestrator/block-building-helpers.js +151 -187
  20. package/dest/orchestrator/block-proving-state.d.ts +71 -55
  21. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/block-proving-state.js +280 -185
  23. package/dest/orchestrator/checkpoint-proving-state.d.ts +76 -0
  24. package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
  25. package/dest/orchestrator/checkpoint-proving-state.js +243 -0
  26. package/dest/orchestrator/epoch-proving-state.d.ts +40 -32
  27. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  28. package/dest/orchestrator/epoch-proving-state.js +165 -85
  29. package/dest/orchestrator/index.d.ts +1 -1
  30. package/dest/orchestrator/orchestrator.d.ts +51 -35
  31. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  32. package/dest/orchestrator/orchestrator.js +847 -329
  33. package/dest/orchestrator/orchestrator_metrics.d.ts +1 -3
  34. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
  35. package/dest/orchestrator/orchestrator_metrics.js +2 -15
  36. package/dest/orchestrator/tx-proving-state.d.ts +15 -12
  37. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  38. package/dest/orchestrator/tx-proving-state.js +27 -33
  39. package/dest/prover-client/factory.d.ts +3 -3
  40. package/dest/prover-client/factory.d.ts.map +1 -1
  41. package/dest/prover-client/index.d.ts +1 -1
  42. package/dest/prover-client/prover-client.d.ts +5 -5
  43. package/dest/prover-client/prover-client.d.ts.map +1 -1
  44. package/dest/prover-client/prover-client.js +15 -10
  45. package/dest/prover-client/server-epoch-prover.d.ts +13 -11
  46. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
  47. package/dest/prover-client/server-epoch-prover.js +9 -9
  48. package/dest/proving_broker/broker_prover_facade.d.ts +28 -21
  49. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  50. package/dest/proving_broker/broker_prover_facade.js +45 -36
  51. package/dest/proving_broker/config.d.ts +24 -8
  52. package/dest/proving_broker/config.d.ts.map +1 -1
  53. package/dest/proving_broker/config.js +26 -3
  54. package/dest/proving_broker/factory.d.ts +1 -1
  55. package/dest/proving_broker/fixtures.d.ts +3 -2
  56. package/dest/proving_broker/fixtures.d.ts.map +1 -1
  57. package/dest/proving_broker/fixtures.js +3 -2
  58. package/dest/proving_broker/index.d.ts +1 -1
  59. package/dest/proving_broker/proof_store/factory.d.ts +2 -5
  60. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
  61. package/dest/proving_broker/proof_store/factory.js +7 -30
  62. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
  63. package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
  64. package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
  65. package/dest/proving_broker/proof_store/index.d.ts +2 -1
  66. package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
  67. package/dest/proving_broker/proof_store/index.js +1 -0
  68. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
  69. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
  70. package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
  71. package/dest/proving_broker/proving_agent.d.ts +5 -9
  72. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  73. package/dest/proving_broker/proving_agent.js +4 -19
  74. package/dest/proving_broker/proving_broker.d.ts +7 -4
  75. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  76. package/dest/proving_broker/proving_broker.js +64 -30
  77. package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
  78. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  79. package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
  80. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  81. package/dest/proving_broker/proving_broker_database/persisted.js +392 -3
  82. package/dest/proving_broker/proving_broker_database.d.ts +3 -2
  83. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  84. package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
  85. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
  86. package/dest/proving_broker/proving_broker_instrumentation.js +15 -35
  87. package/dest/proving_broker/proving_job_controller.d.ts +5 -3
  88. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  89. package/dest/proving_broker/proving_job_controller.js +46 -24
  90. package/dest/proving_broker/rpc.d.ts +7 -5
  91. package/dest/proving_broker/rpc.d.ts.map +1 -1
  92. package/dest/proving_broker/rpc.js +8 -0
  93. package/dest/test/mock_proof_store.d.ts +1 -1
  94. package/dest/test/mock_proof_store.d.ts.map +1 -1
  95. package/dest/test/mock_prover.d.ts +23 -19
  96. package/dest/test/mock_prover.d.ts.map +1 -1
  97. package/dest/test/mock_prover.js +38 -23
  98. package/package.json +21 -20
  99. package/src/config.ts +2 -2
  100. package/src/light/index.ts +1 -0
  101. package/src/light/lightweight_checkpoint_builder.ts +294 -0
  102. package/src/mocks/fixtures.ts +43 -37
  103. package/src/mocks/test_context.ts +201 -114
  104. package/src/orchestrator/block-building-helpers.ts +233 -313
  105. package/src/orchestrator/block-proving-state.ts +324 -247
  106. package/src/orchestrator/checkpoint-proving-state.ts +349 -0
  107. package/src/orchestrator/epoch-proving-state.ts +229 -132
  108. package/src/orchestrator/orchestrator.ts +630 -385
  109. package/src/orchestrator/orchestrator_metrics.ts +2 -25
  110. package/src/orchestrator/tx-proving-state.ts +49 -60
  111. package/src/prover-client/factory.ts +6 -2
  112. package/src/prover-client/prover-client.ts +31 -23
  113. package/src/prover-client/server-epoch-prover.ts +30 -21
  114. package/src/proving_broker/broker_prover_facade.ts +183 -118
  115. package/src/proving_broker/config.ts +30 -1
  116. package/src/proving_broker/fixtures.ts +8 -3
  117. package/src/proving_broker/proof_store/factory.ts +10 -32
  118. package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
  119. package/src/proving_broker/proof_store/index.ts +1 -0
  120. package/src/proving_broker/proving_agent.ts +6 -19
  121. package/src/proving_broker/proving_broker.ts +72 -28
  122. package/src/proving_broker/proving_broker_database/memory.ts +2 -1
  123. package/src/proving_broker/proving_broker_database/persisted.ts +20 -5
  124. package/src/proving_broker/proving_broker_database.ts +2 -1
  125. package/src/proving_broker/proving_broker_instrumentation.ts +14 -35
  126. package/src/proving_broker/proving_job_controller.ts +51 -25
  127. package/src/proving_broker/rpc.ts +14 -0
  128. package/src/test/mock_prover.ts +144 -74
  129. package/dest/bin/get-proof-inputs.d.ts +0 -2
  130. package/dest/bin/get-proof-inputs.d.ts.map +0 -1
  131. package/dest/bin/get-proof-inputs.js +0 -51
  132. package/dest/block-factory/index.d.ts +0 -2
  133. package/dest/block-factory/index.d.ts.map +0 -1
  134. package/dest/block-factory/index.js +0 -1
  135. package/dest/block-factory/light.d.ts +0 -36
  136. package/dest/block-factory/light.d.ts.map +0 -1
  137. package/dest/block-factory/light.js +0 -87
  138. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
  139. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
  140. package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -52
  141. package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
  142. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
  143. package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
  144. package/src/bin/get-proof-inputs.ts +0 -59
  145. package/src/block-factory/index.ts +0 -1
  146. package/src/block-factory/light.ts +0 -114
  147. package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -76
  148. package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
@@ -1,268 +1,349 @@
1
- import { BatchedBlobAccumulator, BlobAccumulatorPublicInputs, SpongeBlob } from '@aztec/blob-lib';
2
- import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
3
- import { padArrayEnd } from '@aztec/foundation/collection';
4
- import { BLS12Point, Fr } from '@aztec/foundation/fields';
1
+ import { encodeBlockEndBlobData } from '@aztec/blob-lib';
2
+ import { NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { assertLength } from '@aztec/foundation/serialize';
5
5
  import { UnbalancedTreeStore } from '@aztec/foundation/trees';
6
- import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
7
- import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
8
- import { RootParityInput, RootParityInputs } from '@aztec/stdlib/parity';
9
- import { BlockConstantData, BlockRootRollupBlobData, BlockRootRollupData, BlockRootRollupInputs, EmptyBlockRootRollupInputs, EpochConstantData, MergeRollupInputs, PaddingBlockRootRollupInputs, PreviousRollupData, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
10
- import { StateReference } from '@aztec/stdlib/tx';
11
- import { VkData } from '@aztec/stdlib/vks';
12
- import { accumulateBlobs, buildBlobHints, buildHeaderFromCircuitOutputs, getEmptyBlockBlobsHash } from './block-building-helpers.js';
6
+ import { ParityRootPrivateInputs } from '@aztec/stdlib/parity';
7
+ import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, TxMergeRollupPrivateInputs } from '@aztec/stdlib/rollup';
8
+ import { BlockHeader, GlobalVariables } from '@aztec/stdlib/tx';
9
+ import { buildHeaderFromCircuitOutputs, toProofData } from './block-building-helpers.js';
13
10
  /**
14
11
  * The current state of the proving schedule for a given block. Managed by ProvingState.
15
12
  * Contains the raw inputs and intermediate state to generate every constituent proof in the tree.
16
13
  */ export class BlockProvingState {
17
14
  index;
18
- globalVariables;
19
- newL1ToL2Messages;
20
- l1ToL2MessageTreeSnapshot;
21
- l1ToL2MessageSubtreeSiblingPath;
22
- l1ToL2MessageTreeSnapshotAfterInsertion;
23
- lastArchiveSnapshot;
24
- lastArchiveSiblingPath;
25
- newArchiveSiblingPath;
26
- previousBlockHeader;
27
- proverId;
28
- parentEpoch;
29
- baseOrMergeProvingOutputs;
30
- baseParityProvingOutputs;
31
- rootParityProvingOutput;
32
- blockRootProvingOutput;
33
- blockRootRollupStarted;
34
- block;
35
- spongeBlobState;
36
- startBlobAccumulator;
37
- endBlobAccumulator;
38
- blobsHash;
15
+ blockNumber;
39
16
  totalNumTxs;
17
+ constants;
18
+ timestamp;
19
+ lastArchiveTreeSnapshot;
20
+ lastArchiveSiblingPath;
21
+ lastL1ToL2MessageTreeSnapshot;
22
+ lastL1ToL2MessageSubtreeRootSiblingPath;
23
+ newL1ToL2MessageTreeSnapshot;
24
+ headerOfLastBlockInPreviousCheckpoint;
25
+ startSpongeBlob;
26
+ parentCheckpoint;
27
+ baseOrMergeProofs;
28
+ baseParityProofs;
29
+ rootParityProof;
30
+ blockRootProof;
31
+ builtBlockHeader;
32
+ builtArchive;
33
+ endState;
34
+ endSpongeBlob;
40
35
  txs;
36
+ isFirstBlock;
41
37
  error;
42
- constructor(index, globalVariables, newL1ToL2Messages, l1ToL2MessageTreeSnapshot, l1ToL2MessageSubtreeSiblingPath, l1ToL2MessageTreeSnapshotAfterInsertion, lastArchiveSnapshot, lastArchiveSiblingPath, newArchiveSiblingPath, previousBlockHeader, proverId, parentEpoch){
38
+ constructor(index, blockNumber, totalNumTxs, constants, timestamp, lastArchiveTreeSnapshot, lastArchiveSiblingPath, lastL1ToL2MessageTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath, newL1ToL2MessageTreeSnapshot, headerOfLastBlockInPreviousCheckpoint, startSpongeBlob, parentCheckpoint){
43
39
  this.index = index;
44
- this.globalVariables = globalVariables;
45
- this.newL1ToL2Messages = newL1ToL2Messages;
46
- this.l1ToL2MessageTreeSnapshot = l1ToL2MessageTreeSnapshot;
47
- this.l1ToL2MessageSubtreeSiblingPath = l1ToL2MessageSubtreeSiblingPath;
48
- this.l1ToL2MessageTreeSnapshotAfterInsertion = l1ToL2MessageTreeSnapshotAfterInsertion;
49
- this.lastArchiveSnapshot = lastArchiveSnapshot;
40
+ this.blockNumber = blockNumber;
41
+ this.totalNumTxs = totalNumTxs;
42
+ this.constants = constants;
43
+ this.timestamp = timestamp;
44
+ this.lastArchiveTreeSnapshot = lastArchiveTreeSnapshot;
50
45
  this.lastArchiveSiblingPath = lastArchiveSiblingPath;
51
- this.newArchiveSiblingPath = newArchiveSiblingPath;
52
- this.previousBlockHeader = previousBlockHeader;
53
- this.proverId = proverId;
54
- this.parentEpoch = parentEpoch;
55
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(0);
56
- this.blockRootRollupStarted = false;
57
- this.txs = [];
58
- this.baseParityProvingOutputs = Array.from({
46
+ this.lastL1ToL2MessageTreeSnapshot = lastL1ToL2MessageTreeSnapshot;
47
+ this.lastL1ToL2MessageSubtreeRootSiblingPath = lastL1ToL2MessageSubtreeRootSiblingPath;
48
+ this.newL1ToL2MessageTreeSnapshot = newL1ToL2MessageTreeSnapshot;
49
+ this.headerOfLastBlockInPreviousCheckpoint = headerOfLastBlockInPreviousCheckpoint;
50
+ this.startSpongeBlob = startSpongeBlob;
51
+ this.parentCheckpoint = parentCheckpoint;
52
+ this.baseOrMergeProofs = new UnbalancedTreeStore(0);
53
+ this.baseParityProofs = Array.from({
59
54
  length: NUM_BASE_PARITY_PER_ROOT_PARITY
60
55
  }).map((_)=>undefined);
61
- this.totalNumTxs = 0;
62
- if (this.blockNumber == parentEpoch.firstBlockNumber) {
63
- this.startBlobAccumulator = BatchedBlobAccumulator.newWithChallenges(parentEpoch.finalBlobBatchingChallenges);
56
+ this.txs = [];
57
+ this.isFirstBlock = index === 0;
58
+ if (!totalNumTxs && !this.isFirstBlock) {
59
+ throw new Error(`Cannot create a block with 0 txs, unless it's the first block.`);
64
60
  }
61
+ this.baseOrMergeProofs = new UnbalancedTreeStore(totalNumTxs);
65
62
  }
66
- get blockNumber() {
67
- return this.globalVariables.blockNumber;
68
- }
69
- startNewBlock(numTxs, numBlobFields) {
70
- if (this.spongeBlobState) {
71
- throw new Error(`Block ${this.blockNumber} already initalised.`);
72
- }
73
- this.baseOrMergeProvingOutputs = new UnbalancedTreeStore(numTxs);
74
- // Initialize the sponge which will eventually absorb all tx effects to be added to the blob.
75
- // Like l1 to l2 messages, we need to know beforehand how many effects will be absorbed.
76
- this.spongeBlobState = SpongeBlob.init(numBlobFields);
77
- this.totalNumTxs = numTxs;
63
+ get epochNumber() {
64
+ return this.parentCheckpoint.epochNumber;
78
65
  }
79
66
  // Adds a transaction to the proving state, returns it's index
80
67
  addNewTx(tx) {
81
- if (!this.spongeBlobState) {
82
- throw new Error(`Invalid block proving state, call startNewBlock before adding transactions.`);
68
+ if (!this.isAcceptingTxs()) {
69
+ throw new Error(`Cannot add more txs to block ${this.blockNumber}.`);
83
70
  }
84
71
  const txIndex = this.txs.length;
85
72
  this.txs[txIndex] = tx;
86
73
  return txIndex;
87
74
  }
75
+ isAcceptingTxs() {
76
+ return this.txs.length < this.totalNumTxs;
77
+ }
78
+ getProcessedTxs() {
79
+ return this.txs.map((t)=>t.processedTx);
80
+ }
81
+ tryStartProvingBase(txIndex) {
82
+ if (this.baseOrMergeProofs.getLeaf(txIndex)?.isProving) {
83
+ return false;
84
+ } else {
85
+ this.baseOrMergeProofs.setLeaf(txIndex, {
86
+ isProving: true
87
+ });
88
+ return true;
89
+ }
90
+ }
88
91
  setBaseRollupProof(txIndex, provingOutput) {
89
- return this.baseOrMergeProvingOutputs.setLeaf(txIndex, provingOutput);
92
+ return this.baseOrMergeProofs.setLeaf(txIndex, {
93
+ provingOutput
94
+ });
95
+ }
96
+ tryStartProvingMerge(location) {
97
+ if (this.baseOrMergeProofs.getNode(location)?.isProving) {
98
+ return false;
99
+ } else {
100
+ this.baseOrMergeProofs.setNode(location, {
101
+ isProving: true
102
+ });
103
+ return true;
104
+ }
90
105
  }
91
106
  setMergeRollupProof(location, provingOutput) {
92
- this.baseOrMergeProvingOutputs.setNode(location, provingOutput);
107
+ this.baseOrMergeProofs.setNode(location, {
108
+ provingOutput
109
+ });
110
+ }
111
+ tryStartProvingBaseParity(index) {
112
+ if (this.baseParityProofs[index]?.isProving) {
113
+ return false;
114
+ } else {
115
+ this.baseParityProofs[index] = {
116
+ isProving: true
117
+ };
118
+ return true;
119
+ }
93
120
  }
94
121
  // Stores a set of root parity inputs at the given index
95
122
  setBaseParityProof(index, provingOutput) {
96
123
  if (index >= NUM_BASE_PARITY_PER_ROOT_PARITY) {
97
124
  throw new Error(`Unable to set a base parity proofs at index ${index}. Expected at most ${NUM_BASE_PARITY_PER_ROOT_PARITY} proofs.`);
98
125
  }
99
- this.baseParityProvingOutputs[index] = provingOutput;
126
+ this.baseParityProofs[index] = {
127
+ provingOutput
128
+ };
129
+ }
130
+ tryStartProvingRootParity() {
131
+ if (this.rootParityProof?.isProving) {
132
+ return false;
133
+ } else {
134
+ this.rootParityProof = {
135
+ isProving: true
136
+ };
137
+ return true;
138
+ }
100
139
  }
101
140
  setRootParityProof(provingOutput) {
102
- this.rootParityProvingOutput = provingOutput;
141
+ this.rootParityProof = {
142
+ provingOutput
143
+ };
144
+ }
145
+ tryStartProvingBlockRoot() {
146
+ if (this.blockRootProof?.isProving) {
147
+ return false;
148
+ } else {
149
+ this.blockRootProof = {
150
+ isProving: true
151
+ };
152
+ return true;
153
+ }
103
154
  }
104
155
  setBlockRootRollupProof(provingOutput) {
105
- this.blockRootProvingOutput = provingOutput;
156
+ this.blockRootProof = {
157
+ provingOutput
158
+ };
159
+ return this.parentCheckpoint.setBlockRootRollupProof(this.index, provingOutput);
106
160
  }
107
- setBlock(block) {
108
- this.block = block;
161
+ getBlockRootRollupOutput() {
162
+ return this.blockRootProof?.provingOutput?.inputs;
109
163
  }
110
- setStartBlobAccumulator(accumulator) {
111
- this.startBlobAccumulator = accumulator;
164
+ async buildBlockHeader() {
165
+ if (this.isAcceptingTxs()) {
166
+ throw new Error('All txs must be added to the block before building the header.');
167
+ }
168
+ if (!this.endState) {
169
+ throw new Error('Call `setEndState` first.');
170
+ }
171
+ if (!this.endSpongeBlob) {
172
+ throw new Error('Call `setEndSpongeBlob` first.');
173
+ }
174
+ const endSpongeBlob = this.endSpongeBlob.clone();
175
+ const endSpongeBlobHash = await endSpongeBlob.squeeze();
176
+ this.builtBlockHeader = new BlockHeader(this.lastArchiveTreeSnapshot, this.endState, endSpongeBlobHash, this.#getGlobalVariables(), this.#getTotalFees(), new Fr(this.#getTotalManaUsed()));
177
+ return this.builtBlockHeader;
178
+ }
179
+ getBuiltBlockHeader() {
180
+ return this.builtBlockHeader;
181
+ }
182
+ setBuiltArchive(archive) {
183
+ this.builtArchive = archive;
184
+ }
185
+ getBuiltArchive() {
186
+ return this.builtArchive;
187
+ }
188
+ getStartSpongeBlob() {
189
+ return this.startSpongeBlob;
190
+ }
191
+ setEndSpongeBlob(endSpongeBlob) {
192
+ this.endSpongeBlob = endSpongeBlob;
193
+ }
194
+ getEndSpongeBlob() {
195
+ return this.endSpongeBlob;
196
+ }
197
+ setEndState(endState) {
198
+ this.endState = endState;
112
199
  }
113
- setEndBlobAccumulator(accumulator) {
114
- this.endBlobAccumulator = accumulator;
200
+ hasEndState() {
201
+ return !!this.endState;
115
202
  }
116
- async accumulateBlobs() {
117
- if (!this.block || !this.startBlobAccumulator) {
118
- // We only want to accumulate once we have all txs, so we wait until the block is set.
119
- return;
203
+ getBlockEndBlobFields() {
204
+ return encodeBlockEndBlobData(this.getBlockEndBlobData());
205
+ }
206
+ getBlockEndBlobData() {
207
+ if (!this.endState) {
208
+ throw new Error('Call `setEndState` first.');
120
209
  }
121
- const endBlobAccumulator = await accumulateBlobs(this.allTxs.map((t)=>t.processedTx), this.startBlobAccumulator);
122
- this.setEndBlobAccumulator(endBlobAccumulator);
210
+ const partial = this.endState.partial;
211
+ return {
212
+ blockEndMarker: {
213
+ numTxs: this.totalNumTxs,
214
+ timestamp: this.timestamp,
215
+ blockNumber: this.blockNumber
216
+ },
217
+ blockEndStateField: {
218
+ l1ToL2MessageNextAvailableLeafIndex: this.newL1ToL2MessageTreeSnapshot.nextAvailableLeafIndex,
219
+ noteHashNextAvailableLeafIndex: partial.noteHashTree.nextAvailableLeafIndex,
220
+ nullifierNextAvailableLeafIndex: partial.nullifierTree.nextAvailableLeafIndex,
221
+ publicDataNextAvailableLeafIndex: partial.publicDataTree.nextAvailableLeafIndex,
222
+ totalManaUsed: this.#getTotalManaUsed()
223
+ },
224
+ lastArchiveRoot: this.lastArchiveTreeSnapshot.root,
225
+ noteHashRoot: partial.noteHashTree.root,
226
+ nullifierRoot: partial.nullifierTree.root,
227
+ publicDataRoot: partial.publicDataTree.root,
228
+ l1ToL2MessageRoot: this.isFirstBlock ? this.newL1ToL2MessageTreeSnapshot.root : undefined
229
+ };
123
230
  }
124
- // Returns the complete set of transaction proving state objects
125
- get allTxs() {
126
- return this.txs;
231
+ getBlockBlobData() {
232
+ return {
233
+ ...this.getBlockEndBlobData(),
234
+ txs: this.getTxEffects().map((t)=>t.toTxBlobData())
235
+ };
127
236
  }
128
- /** Returns the block number as an epoch number. Used for prioritizing proof requests. */ get epochNumber() {
129
- return this.parentEpoch.epochNumber;
237
+ getTxEffects() {
238
+ return this.txs.map((t)=>t.processedTx.txEffect);
130
239
  }
131
240
  getParentLocation(location) {
132
- return this.baseOrMergeProvingOutputs.getParentLocation(location);
241
+ return this.baseOrMergeProofs.getParentLocation(location);
133
242
  }
134
243
  getMergeRollupInputs(mergeLocation) {
135
- const [left, right] = this.baseOrMergeProvingOutputs.getChildren(mergeLocation);
244
+ const [left, right] = this.baseOrMergeProofs.getChildren(mergeLocation).map((c)=>c?.provingOutput);
136
245
  if (!left || !right) {
137
- throw new Error('At lease one child is not ready.');
246
+ throw new Error('At least one child is not ready for the merge rollup.');
138
247
  }
139
- return new MergeRollupInputs([
140
- this.#getPreviousRollupData(left),
141
- this.#getPreviousRollupData(right)
248
+ return new TxMergeRollupPrivateInputs([
249
+ toProofData(left),
250
+ toProofData(right)
142
251
  ]);
143
252
  }
144
- async getBlockRootRollupTypeAndInputs() {
145
- if (!this.rootParityProvingOutput) {
146
- throw new Error('Root parity is not ready.');
253
+ getBlockRootRollupTypeAndInputs() {
254
+ const provingOutputs = this.#getChildProvingOutputsForBlockRoot();
255
+ if (!provingOutputs.every((p)=>!!p)) {
256
+ throw new Error('At least one child is not ready for the block root rollup.');
147
257
  }
148
- const proofs = this.#getChildProofsForBlockRoot();
149
- const nonEmptyProofs = proofs.filter((p)=>!!p);
150
- if (proofs.length !== nonEmptyProofs.length) {
151
- throw new Error('At lease one child is not ready for the block root.');
258
+ const previousRollups = provingOutputs.map((p)=>toProofData(p));
259
+ if (this.isFirstBlock) {
260
+ return this.#getFirstBlockRootRollupTypeAndInputs(previousRollups);
152
261
  }
153
- const data = this.#getBlockRootRollupData();
154
- if (this.totalNumTxs === 0) {
155
- const constants = BlockConstantData.from({
156
- lastArchive: this.lastArchiveSnapshot,
157
- newL1ToL2: this.l1ToL2MessageTreeSnapshotAfterInsertion,
158
- globalVariables: this.globalVariables,
159
- vkTreeRoot: getVKTreeRoot(),
160
- protocolContractTreeRoot
161
- });
162
- this.blobsHash = await getEmptyBlockBlobsHash();
262
+ const [leftRollup, rightRollup] = previousRollups;
263
+ if (!rightRollup) {
163
264
  return {
164
- rollupType: 'empty-block-root-rollup',
165
- inputs: EmptyBlockRootRollupInputs.from({
166
- data,
167
- constants
168
- })
265
+ rollupType: 'rollup-block-root-single-tx',
266
+ inputs: new BlockRootSingleTxRollupPrivateInputs(leftRollup, this.lastArchiveSiblingPath)
169
267
  };
268
+ } else {
269
+ return {
270
+ rollupType: 'rollup-block-root',
271
+ inputs: new BlockRootRollupPrivateInputs([
272
+ leftRollup,
273
+ rightRollup
274
+ ], this.lastArchiveSiblingPath)
275
+ };
276
+ }
277
+ }
278
+ #getFirstBlockRootRollupTypeAndInputs([leftRollup, rightRollup]) {
279
+ if (!this.rootParityProof?.provingOutput) {
280
+ throw new Error('Root parity is not ready.');
170
281
  }
171
- const previousRollupData = await Promise.all(nonEmptyProofs.map((p)=>this.#getPreviousRollupData(p)));
172
- const blobData = await this.#getBlockRootRollupBlobData();
173
- this.blobsHash = blobData.blobsHash;
174
- if (previousRollupData.length === 1) {
282
+ const l1ToL2Roots = toProofData(this.rootParityProof.provingOutput);
283
+ if (!leftRollup) {
175
284
  return {
176
- rollupType: 'single-tx-block-root-rollup',
177
- inputs: new SingleTxBlockRootRollupInputs(previousRollupData, data, blobData)
285
+ rollupType: 'rollup-block-root-first-empty-tx',
286
+ inputs: new BlockRootEmptyTxFirstRollupPrivateInputs(l1ToL2Roots, this.lastArchiveTreeSnapshot, this.headerOfLastBlockInPreviousCheckpoint.state, this.constants, this.timestamp, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
287
+ };
288
+ } else if (!rightRollup) {
289
+ return {
290
+ rollupType: 'rollup-block-root-first-single-tx',
291
+ inputs: new BlockRootSingleTxFirstRollupPrivateInputs(l1ToL2Roots, leftRollup, this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
178
292
  };
179
293
  } else {
180
294
  return {
181
- rollupType: 'block-root-rollup',
182
- inputs: new BlockRootRollupInputs(previousRollupData, data, blobData)
295
+ rollupType: 'rollup-block-root-first',
296
+ inputs: new BlockRootFirstRollupPrivateInputs(l1ToL2Roots, [
297
+ leftRollup,
298
+ rightRollup
299
+ ], this.lastL1ToL2MessageTreeSnapshot, this.lastL1ToL2MessageSubtreeRootSiblingPath, this.lastArchiveSiblingPath)
183
300
  };
184
301
  }
185
302
  }
186
- getPaddingBlockRootInputs() {
187
- const constants = EpochConstantData.from({
188
- vkTreeRoot: getVKTreeRoot(),
189
- protocolContractTreeRoot,
190
- proverId: this.proverId.toField()
191
- });
192
- return PaddingBlockRootRollupInputs.from({
193
- constants
194
- });
195
- }
196
- getRootParityInputs() {
197
- if (!this.baseParityProvingOutputs.every((p)=>!!p)) {
303
+ getParityRootInputs() {
304
+ const baseParityProvingOutputs = this.baseParityProofs.filter((p)=>!!p?.provingOutput).map((p)=>p.provingOutput);
305
+ if (baseParityProvingOutputs.length !== this.baseParityProofs.length) {
198
306
  throw new Error('At lease one base parity is not ready.');
199
307
  }
200
- const children = this.baseParityProvingOutputs.map((p)=>this.#getRootParityData(p));
201
- return new RootParityInputs(children);
308
+ const children = baseParityProvingOutputs.map((p)=>toProofData(p));
309
+ return new ParityRootPrivateInputs(assertLength(children, NUM_BASE_PARITY_PER_ROOT_PARITY));
202
310
  }
203
311
  // Returns a specific transaction proving state
204
312
  getTxProvingState(txIndex) {
205
313
  return this.txs[txIndex];
206
314
  }
207
315
  async buildHeaderFromProvingOutputs() {
208
- const previousRollupData = this.totalNumTxs === 0 ? [] : await Promise.all(this.#getChildProofsForBlockRoot().map((p)=>this.#getPreviousRollupData(p)));
209
- let endPartialState = this.previousBlockHeader.state.partial;
210
- if (this.totalNumTxs !== 0) {
211
- const previousRollupData = this.#getChildProofsForBlockRoot();
212
- const lastRollup = previousRollupData[previousRollupData.length - 1];
213
- if (!lastRollup) {
214
- throw new Error('End state of the block is not available. Last rollup is not ready yet.');
215
- }
216
- endPartialState = lastRollup.inputs.end;
316
+ if (!this.blockRootProof?.provingOutput) {
317
+ throw new Error('Block root rollup is not ready.');
217
318
  }
218
- const endState = new StateReference(this.l1ToL2MessageTreeSnapshotAfterInsertion, endPartialState);
219
- return buildHeaderFromCircuitOutputs(previousRollupData.map((d)=>d.baseOrMergeRollupPublicInputs), this.rootParityProvingOutput.inputs, this.blockRootProvingOutput.inputs, this.blobsHash, endState);
319
+ return await buildHeaderFromCircuitOutputs(this.blockRootProof.provingOutput.inputs);
220
320
  }
221
321
  isReadyForMergeRollup(location) {
222
- return this.baseOrMergeProvingOutputs.getSibling(location) !== undefined;
322
+ return !!this.baseOrMergeProofs.getSibling(location)?.provingOutput;
223
323
  }
224
324
  // Returns true if we have sufficient inputs to execute the block root rollup
225
325
  isReadyForBlockRootRollup() {
226
- const childProofs = this.#getChildProofsForBlockRoot();
227
- return this.block !== undefined && this.rootParityProvingOutput !== undefined && this.endBlobAccumulator !== undefined && childProofs.every((p)=>!!p);
326
+ const childProofs = this.#getChildProvingOutputsForBlockRoot();
327
+ return (!this.isFirstBlock || !!this.rootParityProof?.provingOutput) && childProofs.every((p)=>!!p);
228
328
  }
229
329
  // Returns true if we have sufficient root parity inputs to execute the root parity circuit
230
330
  isReadyForRootParity() {
231
- return this.baseParityProvingOutputs.every((p)=>!!p);
331
+ return this.baseParityProofs.every((p)=>!!p?.provingOutput);
232
332
  }
233
333
  isComplete() {
234
- return !!this.blockRootProvingOutput;
334
+ return !!this.blockRootProof;
235
335
  }
236
- // Returns whether the proving state is still valid
237
336
  verifyState() {
238
- return this.parentEpoch.verifyState();
337
+ return this.parentCheckpoint.verifyState();
338
+ }
339
+ getError() {
340
+ return this.error;
239
341
  }
240
342
  reject(reason) {
241
343
  this.error = reason;
242
- this.parentEpoch.reject(reason);
243
- }
244
- #getBlockRootRollupData() {
245
- return BlockRootRollupData.from({
246
- l1ToL2Roots: this.#getRootParityData(this.rootParityProvingOutput),
247
- l1ToL2MessageSubtreeSiblingPath: this.l1ToL2MessageSubtreeSiblingPath,
248
- previousArchiveSiblingPath: this.lastArchiveSiblingPath,
249
- newArchiveSiblingPath: this.newArchiveSiblingPath,
250
- previousBlockHeader: this.previousBlockHeader,
251
- startBlobAccumulator: BlobAccumulatorPublicInputs.fromBatchedBlobAccumulator(this.startBlobAccumulator),
252
- finalBlobChallenges: this.startBlobAccumulator.finalBlobChallenges,
253
- proverId: this.proverId.toField()
254
- });
255
- }
256
- async #getBlockRootRollupBlobData() {
257
- const txEffects = this.txs.map((txProvingState)=>txProvingState.processedTx.txEffect);
258
- const { blobFields, blobCommitments, blobsHash } = await buildBlobHints(txEffects);
259
- return BlockRootRollupBlobData.from({
260
- blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK),
261
- blobCommitments: padArrayEnd(blobCommitments, BLS12Point.ZERO, BLOBS_PER_BLOCK),
262
- blobsHash
263
- });
344
+ this.parentCheckpoint.reject(reason);
264
345
  }
265
- #getChildProofsForBlockRoot() {
346
+ #getChildProvingOutputsForBlockRoot() {
266
347
  if (this.totalNumTxs === 0) {
267
348
  return [];
268
349
  }
@@ -272,15 +353,29 @@ import { accumulateBlobs, buildBlobHints, buildHeaderFromCircuitOutputs, getEmpt
272
353
  };
273
354
  // If there's only 1 tx, its base rollup proof will be stored at the root.
274
355
  return this.totalNumTxs === 1 ? [
275
- this.baseOrMergeProvingOutputs.getNode(rootLocation)
276
- ] : this.baseOrMergeProvingOutputs.getChildren(rootLocation);
356
+ this.baseOrMergeProofs.getNode(rootLocation)?.provingOutput
357
+ ] : this.baseOrMergeProofs.getChildren(rootLocation).map((c)=>c?.provingOutput);
358
+ }
359
+ #getGlobalVariables() {
360
+ if (this.txs.length) {
361
+ return this.txs[0].processedTx.globalVariables;
362
+ }
363
+ const constants = this.constants;
364
+ return GlobalVariables.from({
365
+ chainId: constants.chainId,
366
+ version: constants.version,
367
+ blockNumber: this.blockNumber,
368
+ slotNumber: constants.slotNumber,
369
+ timestamp: this.timestamp,
370
+ coinbase: constants.coinbase,
371
+ feeRecipient: constants.feeRecipient,
372
+ gasFees: constants.gasFees
373
+ });
277
374
  }
278
- #getPreviousRollupData({ inputs, proof, verificationKey }) {
279
- const leafIndex = getVKIndex(verificationKey.keyAsFields);
280
- const vkData = new VkData(verificationKey, leafIndex, getVKSiblingPath(leafIndex));
281
- return new PreviousRollupData(inputs, proof, vkData);
375
+ #getTotalFees() {
376
+ return this.txs.reduce((acc, tx)=>acc.add(tx.processedTx.txEffect.transactionFee), Fr.ZERO);
282
377
  }
283
- #getRootParityData({ inputs, proof, verificationKey }) {
284
- return new RootParityInput(proof, verificationKey.keyAsFields, getVKSiblingPath(getVKIndex(verificationKey)), inputs);
378
+ #getTotalManaUsed() {
379
+ return this.txs.reduce((acc, tx)=>acc + BigInt(tx.processedTx.gasUsed.billedGas.l2Gas), 0n);
285
380
  }
286
381
  }
@@ -0,0 +1,76 @@
1
+ import { BatchedBlobAccumulator, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
2
+ import { type ARCHIVE_HEIGHT, type L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, OUT_HASH_TREE_HEIGHT } from '@aztec/constants';
3
+ import { BlockNumber } from '@aztec/foundation/branded-types';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
5
+ import type { Tuple } from '@aztec/foundation/serialize';
6
+ import { type TreeNodeLocation } from '@aztec/foundation/trees';
7
+ import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
8
+ import { ParityBasePrivateInputs } from '@aztec/stdlib/parity';
9
+ import { BlockMergeRollupPrivateInputs, BlockRollupPublicInputs, CheckpointConstantData, CheckpointRollupPublicInputs, CheckpointRootRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs } from '@aztec/stdlib/rollup';
10
+ import type { CircuitName } from '@aztec/stdlib/stats';
11
+ import type { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
12
+ import type { BlockHeader } from '@aztec/stdlib/tx';
13
+ import type { UInt64 } from '@aztec/stdlib/types';
14
+ import { BlockProvingState } from './block-proving-state.js';
15
+ import type { EpochProvingState } from './epoch-proving-state.js';
16
+ type OutHashHint = {
17
+ treeSnapshot: AppendOnlyTreeSnapshot;
18
+ siblingPath: Tuple<Fr, typeof OUT_HASH_TREE_HEIGHT>;
19
+ };
20
+ export declare class CheckpointProvingState {
21
+ #private;
22
+ readonly index: number;
23
+ readonly constants: CheckpointConstantData;
24
+ readonly totalNumBlocks: number;
25
+ private readonly finalBlobBatchingChallenges;
26
+ private readonly headerOfLastBlockInPreviousCheckpoint;
27
+ private readonly lastArchiveSiblingPath;
28
+ private readonly l1ToL2Messages;
29
+ private readonly lastL1ToL2MessageTreeSnapshot;
30
+ private readonly lastL1ToL2MessageSubtreeRootSiblingPath;
31
+ private readonly newL1ToL2MessageTreeSnapshot;
32
+ private readonly newL1ToL2MessageSubtreeRootSiblingPath;
33
+ parentEpoch: EpochProvingState;
34
+ private onBlobAccumulatorSet;
35
+ private blockProofs;
36
+ private checkpointRootProof;
37
+ private blocks;
38
+ private previousOutHashHint;
39
+ private outHash;
40
+ private newOutHashHint;
41
+ private startBlobAccumulator;
42
+ private endBlobAccumulator;
43
+ private blobFields;
44
+ private error;
45
+ readonly firstBlockNumber: BlockNumber;
46
+ constructor(index: number, constants: CheckpointConstantData, totalNumBlocks: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges, headerOfLastBlockInPreviousCheckpoint: BlockHeader, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>, l1ToL2Messages: Fr[], lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, lastL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot, newL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>, parentEpoch: EpochProvingState, onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => Promise<void>);
47
+ get epochNumber(): number;
48
+ startNewBlock(blockNumber: BlockNumber, timestamp: UInt64, totalNumTxs: number, lastArchiveTreeSnapshot: AppendOnlyTreeSnapshot, lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>): BlockProvingState;
49
+ isAcceptingBlocks(): boolean;
50
+ setBlockRootRollupProof(blockIndex: number, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
51
+ tryStartProvingBlockMerge(location: TreeNodeLocation): boolean;
52
+ setBlockMergeRollupProof(location: TreeNodeLocation, provingOutput: PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): void;
53
+ tryStartProvingCheckpointRoot(): boolean;
54
+ setCheckpointRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>): TreeNodeLocation;
55
+ getBaseParityInputs(baseParityIndex: number): ParityBasePrivateInputs;
56
+ setOutHashHint(hint: OutHashHint): void;
57
+ getOutHashHint(): OutHashHint | undefined;
58
+ accumulateBlockOutHashes(): Fr | undefined;
59
+ setOutHashHintForNextCheckpoint(hint: OutHashHint): void;
60
+ getOutHashHintForNextCheckpoint(): OutHashHint | undefined;
61
+ accumulateBlobs(startBlobAccumulator: BatchedBlobAccumulator): Promise<BatchedBlobAccumulator | undefined>;
62
+ getEndBlobAccumulator(): BatchedBlobAccumulator | undefined;
63
+ getParentLocation(location: TreeNodeLocation): TreeNodeLocation;
64
+ getBlockMergeRollupInputs(mergeLocation: TreeNodeLocation): BlockMergeRollupPrivateInputs;
65
+ getCheckpointRootRollupType(): CircuitName;
66
+ getCheckpointRootRollupInputs(): Promise<CheckpointRootRollupPrivateInputs | CheckpointRootSingleBlockRollupPrivateInputs>;
67
+ getBlockProvingStateByBlockNumber(blockNumber: BlockNumber): BlockProvingState | undefined;
68
+ isReadyForBlockMerge(location: TreeNodeLocation): boolean;
69
+ isReadyForCheckpointRoot(): boolean;
70
+ verifyState(): boolean;
71
+ getError(): string | undefined;
72
+ cancel(): void;
73
+ reject(reason: string): void;
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC1wcm92aW5nLXN0YXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JjaGVzdHJhdG9yL2NoZWNrcG9pbnQtcHJvdmluZy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLEtBQUssMkJBQTJCLEVBR2pDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLEtBQUssY0FBYyxFQUduQixLQUFLLDZDQUE2QyxFQUNsRCxLQUFLLHlDQUF5QyxFQUU5QyxvQkFBb0IsRUFDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUF1QixNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUU1QixpQ0FBaUMsRUFDakMsNENBQTRDLEVBQzdDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FB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