@aztec/sequencer-client 0.72.1 → 0.74.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 (70) hide show
  1. package/dest/client/sequencer-client.d.ts +11 -6
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +46 -10
  4. package/dest/config.d.ts +1 -1
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +3 -4
  7. package/dest/publisher/config.d.ts +5 -0
  8. package/dest/publisher/config.d.ts.map +1 -1
  9. package/dest/publisher/config.js +9 -2
  10. package/dest/publisher/index.d.ts +1 -1
  11. package/dest/publisher/index.d.ts.map +1 -1
  12. package/dest/publisher/index.js +2 -2
  13. package/dest/publisher/{l1-publisher-metrics.d.ts → sequencer-publisher-metrics.d.ts} +6 -2
  14. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -0
  15. package/dest/publisher/sequencer-publisher-metrics.js +111 -0
  16. package/dest/publisher/sequencer-publisher.d.ts +163 -0
  17. package/dest/publisher/sequencer-publisher.d.ts.map +1 -0
  18. package/dest/publisher/sequencer-publisher.js +528 -0
  19. package/dest/sequencer/allowed.d.ts +1 -1
  20. package/dest/sequencer/allowed.d.ts.map +1 -1
  21. package/dest/sequencer/allowed.js +4 -4
  22. package/dest/sequencer/metrics.d.ts +1 -1
  23. package/dest/sequencer/metrics.d.ts.map +1 -1
  24. package/dest/sequencer/metrics.js +3 -4
  25. package/dest/sequencer/sequencer.d.ts +17 -10
  26. package/dest/sequencer/sequencer.d.ts.map +1 -1
  27. package/dest/sequencer/sequencer.js +103 -109
  28. package/dest/sequencer/utils.d.ts +1 -1
  29. package/dest/sequencer/utils.d.ts.map +1 -1
  30. package/dest/sequencer/utils.js +3 -3
  31. package/dest/slasher/factory.d.ts +2 -2
  32. package/dest/slasher/factory.d.ts.map +1 -1
  33. package/dest/slasher/factory.js +2 -2
  34. package/dest/slasher/slasher_client.d.ts +4 -4
  35. package/dest/slasher/slasher_client.d.ts.map +1 -1
  36. package/dest/slasher/slasher_client.js +38 -26
  37. package/dest/test/index.d.ts +3 -3
  38. package/dest/test/index.d.ts.map +1 -1
  39. package/dest/test/index.js +1 -2
  40. package/dest/tx_validator/gas_validator.d.ts.map +1 -1
  41. package/dest/tx_validator/gas_validator.js +4 -3
  42. package/dest/tx_validator/test_utils.d.ts +4 -4
  43. package/dest/tx_validator/test_utils.d.ts.map +1 -1
  44. package/dest/tx_validator/test_utils.js +3 -3
  45. package/package.json +21 -20
  46. package/src/client/sequencer-client.ts +81 -14
  47. package/src/config.ts +3 -3
  48. package/src/publisher/config.ts +13 -1
  49. package/src/publisher/index.ts +1 -1
  50. package/src/publisher/{l1-publisher-metrics.ts → sequencer-publisher-metrics.ts} +41 -2
  51. package/src/publisher/sequencer-publisher.ts +710 -0
  52. package/src/sequencer/allowed.ts +3 -3
  53. package/src/sequencer/metrics.ts +2 -3
  54. package/src/sequencer/sequencer.ts +138 -125
  55. package/src/sequencer/utils.ts +5 -2
  56. package/src/slasher/factory.ts +3 -3
  57. package/src/slasher/slasher_client.ts +44 -30
  58. package/src/test/index.ts +2 -4
  59. package/src/tx_validator/gas_validator.ts +5 -4
  60. package/src/tx_validator/test_utils.ts +5 -5
  61. package/dest/publisher/l1-publisher-metrics.d.ts.map +0 -1
  62. package/dest/publisher/l1-publisher-metrics.js +0 -85
  63. package/dest/publisher/l1-publisher.d.ts +0 -195
  64. package/dest/publisher/l1-publisher.d.ts.map +0 -1
  65. package/dest/publisher/l1-publisher.js +0 -930
  66. package/dest/test/test-l1-publisher.d.ts +0 -9
  67. package/dest/test/test-l1-publisher.d.ts.map +0 -1
  68. package/dest/test/test-l1-publisher.js +0 -11
  69. package/src/publisher/l1-publisher.ts +0 -1288
  70. package/src/test/test-l1-publisher.ts +0 -20
@@ -1,7 +1,6 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
2
  import { SequencerConfigSchema, Tx, } from '@aztec/circuit-types';
3
3
  import { AppendOnlyTreeSnapshot, BlockHeader, ContentCommitment, GENESIS_ARCHIVE_ROOT, Gas, StateReference, } from '@aztec/circuits.js';
4
- import { prettyLogViemErrorMsg } from '@aztec/ethereum';
5
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
6
5
  import { omit } from '@aztec/foundation/collection';
7
6
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -11,7 +10,7 @@ import { RunningPromise } from '@aztec/foundation/running-promise';
11
10
  import { pickFromSchema } from '@aztec/foundation/schemas';
12
11
  import { Timer, elapsed } from '@aztec/foundation/timer';
13
12
  import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
14
- import { VoteType } from '../publisher/l1-publisher.js';
13
+ import { VoteType } from '../publisher/sequencer-publisher.js';
15
14
  import { createValidatorsForBlockBuilding } from '../tx_validator/tx_validator_factory.js';
16
15
  import { getDefaultAllowedSetupFunctions } from './allowed.js';
17
16
  import { SequencerMetrics } from './metrics.js';
@@ -31,9 +30,9 @@ let Sequencer = (() => {
31
30
  var _a;
32
31
  let _instanceExtraInitializers = [];
33
32
  let _work_decorators;
34
- let _buildBlockAndAttemptToPublish_decorators;
33
+ let _buildBlockAndEnqueuePublish_decorators;
35
34
  let _collectAttestations_decorators;
36
- let _publishL2Block_decorators;
35
+ let _enqueuePublishL2Block_decorators;
37
36
  let _claimEpochProofRightIfAvailable_decorators;
38
37
  return _a = class Sequencer {
39
38
  constructor(publisher, validatorClient, // During migration the validator client can be inactive
@@ -61,12 +60,11 @@ let Sequencer = (() => {
61
60
  this._coinbase = EthAddress.ZERO;
62
61
  this._feeRecipient = AztecAddress.ZERO;
63
62
  this.state = SequencerState.STOPPED;
64
- this.allowedInSetup = getDefaultAllowedSetupFunctions();
63
+ this.allowedInSetup = [];
65
64
  this.maxBlockSizeInBytes = 1024 * 1024;
66
65
  this.maxBlockGas = new Gas(100e9, 100e9);
67
66
  this.isFlushing = false;
68
67
  this.enforceTimeTable = false;
69
- this.updateConfig(config);
70
68
  this.metrics = new SequencerMetrics(telemetry, () => this.state, 'Sequencer');
71
69
  // Register the block builder with the validator client for re-execution
72
70
  this.validatorClient?.registerBlockBuilder(this.buildBlock.bind(this));
@@ -80,7 +78,7 @@ let Sequencer = (() => {
80
78
  * Updates sequencer config.
81
79
  * @param config - New parameters.
82
80
  */
83
- updateConfig(config) {
81
+ async updateConfig(config) {
84
82
  this.log.info(`Sequencer config set`, omit(pickFromSchema(config, SequencerConfigSchema), 'allowedInSetup'));
85
83
  if (config.transactionPollingIntervalMS !== undefined) {
86
84
  this.pollingIntervalMs = config.transactionPollingIntervalMS;
@@ -106,6 +104,9 @@ let Sequencer = (() => {
106
104
  if (config.allowedInSetup) {
107
105
  this.allowedInSetup = config.allowedInSetup;
108
106
  }
107
+ else {
108
+ this.allowedInSetup = await getDefaultAllowedSetupFunctions();
109
+ }
109
110
  if (config.maxBlockSizeInBytes !== undefined) {
110
111
  this.maxBlockSizeInBytes = config.maxBlockSizeInBytes;
111
112
  }
@@ -129,12 +130,12 @@ let Sequencer = (() => {
129
130
  /**
130
131
  * Starts the sequencer and moves to IDLE state.
131
132
  */
132
- start() {
133
+ async start() {
134
+ await this.updateConfig(this.config);
133
135
  this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollingIntervalMs);
134
136
  this.setState(SequencerState.IDLE, 0n, true /** force */);
135
137
  this.runningPromise.start();
136
138
  this.log.info(`Sequencer started with address ${this.publisher.getSenderAddress().toString()}`);
137
- return Promise.resolve();
138
139
  }
139
140
  /**
140
141
  * Stops the sequencer from processing txs and moves to STOPPED state.
@@ -164,6 +165,10 @@ let Sequencer = (() => {
164
165
  status() {
165
166
  return { state: this.state };
166
167
  }
168
+ /** Forces the sequencer to bypass all time and tx count checks for the next block and build anyway. */
169
+ flush() {
170
+ this.isFlushing = true;
171
+ }
167
172
  /**
168
173
  * @notice Performs most of the sequencer duties:
169
174
  * - Checks if we are up to date
@@ -185,49 +190,53 @@ let Sequencer = (() => {
185
190
  const newBlockNumber = (chainTip?.header.globalVariables.blockNumber.toNumber() ?? 0) + 1;
186
191
  // If we cannot find a tip archive, assume genesis.
187
192
  const chainTipArchive = chainTip?.archive.root ?? new Fr(GENESIS_ARCHIVE_ROOT);
188
- let slot;
189
- try {
190
- slot = await this.mayProposeBlock(chainTipArchive.toBuffer(), BigInt(newBlockNumber));
191
- }
192
- catch (err) {
193
- this.log.debug(`Cannot propose for block ${newBlockNumber}`);
193
+ const slot = await this.slotForProposal(chainTipArchive.toBuffer(), BigInt(newBlockNumber));
194
+ if (!slot) {
195
+ this.log.debug(`Cannot propose block ${newBlockNumber}`);
194
196
  return;
195
197
  }
198
+ this.log.info(`Can propose block ${newBlockNumber} at slot ${slot}`);
196
199
  const newGlobalVariables = await this.globalsBuilder.buildGlobalVariables(new Fr(newBlockNumber), this._coinbase, this._feeRecipient, slot);
197
- void this.publisher.castVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.GOVERNANCE);
198
- void this.publisher.castVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.SLASHING);
199
- // Check the pool has enough txs to build a block
200
- const pendingTxCount = this.p2pClient.getPendingTxCount();
201
- if (pendingTxCount < this.minTxsPerBlock && !this.isFlushing) {
202
- this.log.verbose(`Not enough txs to propose block. Got ${pendingTxCount} min ${this.minTxsPerBlock}.`, {
203
- slot,
204
- blockNumber: newBlockNumber,
205
- });
206
- await this.claimEpochProofRightIfAvailable(slot);
207
- return;
208
- }
200
+ const enqueueGovernanceVotePromise = this.publisher.enqueueCastVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.GOVERNANCE);
201
+ const enqueueSlashingVotePromise = this.publisher.enqueueCastVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.SLASHING);
202
+ // Start collecting proof quotes for the previous epoch if needed in the background
203
+ const createProofQuotePromise = this.createProofClaimForPreviousEpoch(slot);
209
204
  this.setState(SequencerState.INITIALIZING_PROPOSAL, slot);
210
205
  this.log.verbose(`Preparing proposal for block ${newBlockNumber} at slot ${slot}`, {
211
206
  chainTipArchive,
212
207
  blockNumber: newBlockNumber,
213
208
  slot,
214
209
  });
215
- // We don't fetch exactly maxTxsPerBlock txs here because we may not need all of them if we hit a limit before,
216
- // and also we may need to fetch more if we don't have enough valid txs.
217
- const pendingTxs = this.p2pClient.iteratePendingTxs();
218
210
  // If I created a "partial" header here that should make our job much easier.
219
211
  const proposalHeader = new BlockHeader(new AppendOnlyTreeSnapshot(chainTipArchive, 1), ContentCommitment.empty(), StateReference.empty(), newGlobalVariables, Fr.ZERO, Fr.ZERO);
220
- try {
221
- // TODO(palla/txs) Is the note below still valid? We don't seem to be doing any rollback in there.
222
- // @note It is very important that the following function will FAIL and not just return early
223
- // if it have made any state changes. If not, we won't rollback the state, and you will
224
- // be in for a world of pain.
225
- await this.buildBlockAndAttemptToPublish(pendingTxs, proposalHeader);
212
+ let finishedFlushing = false;
213
+ const pendingTxCount = await this.p2pClient.getPendingTxCount();
214
+ if (pendingTxCount >= this.minTxsPerBlock || this.isFlushing) {
215
+ // We don't fetch exactly maxTxsPerBlock txs here because we may not need all of them if we hit a limit before,
216
+ // and also we may need to fetch more if we don't have enough valid txs.
217
+ const pendingTxs = this.p2pClient.iteratePendingTxs();
218
+ await this.buildBlockAndEnqueuePublish(pendingTxs, proposalHeader).catch(err => {
219
+ this.log.error(`Error building/enqueuing block`, err, { blockNumber: newBlockNumber, slot });
220
+ });
221
+ finishedFlushing = true;
226
222
  }
227
- catch (err) {
228
- this.log.error(`Error assembling block`, err, { blockNumber: newBlockNumber, slot });
229
- // If the block failed to build, we might still want to claim the proving rights
230
- await this.claimEpochProofRightIfAvailable(slot);
223
+ else {
224
+ this.log.debug(`Not enough txs to build block ${newBlockNumber} at slot ${slot}: got ${pendingTxCount} txs, need ${this.minTxsPerBlock}`);
225
+ }
226
+ await enqueueGovernanceVotePromise.catch(err => {
227
+ this.log.error(`Error enqueuing governance vote`, err, { blockNumber: newBlockNumber, slot });
228
+ });
229
+ await enqueueSlashingVotePromise.catch(err => {
230
+ this.log.error(`Error enqueuing slashing vote`, err, { blockNumber: newBlockNumber, slot });
231
+ });
232
+ await createProofQuotePromise
233
+ .then(quote => (quote ? this.publisher.enqueueClaimEpochProofRight(quote) : undefined))
234
+ .catch(err => {
235
+ this.log.error(`Error creating proof quote`, err, { blockNumber: newBlockNumber, slot });
236
+ });
237
+ await this.publisher.sendRequests();
238
+ if (finishedFlushing) {
239
+ this.isFlushing = false;
231
240
  }
232
241
  this.setState(SequencerState.IDLE, 0n);
233
242
  }
@@ -248,22 +257,27 @@ let Sequencer = (() => {
248
257
  this.setState(SequencerState.IDLE, 0n);
249
258
  }
250
259
  }
251
- async mayProposeBlock(tipArchive, proposalBlockNumber) {
252
- // This checks that we can propose, and gives us the slot that we are to propose for
253
- try {
254
- const [slot, blockNumber] = await this.publisher.canProposeAtNextEthBlock(tipArchive);
255
- if (proposalBlockNumber !== blockNumber) {
256
- const msg = `Sequencer block number mismatch. Expected ${proposalBlockNumber} but got ${blockNumber}.`;
257
- this.log.warn(msg);
258
- throw new Error(msg);
259
- }
260
- return slot;
260
+ getForwarderAddress() {
261
+ return this.publisher.getForwarderAddress();
262
+ }
263
+ /**
264
+ * Checks if we can propose at the next block and returns the slot number if we can.
265
+ * @param tipArchive - The archive of the previous block.
266
+ * @param proposalBlockNumber - The block number of the proposal.
267
+ * @returns The slot number if we can propose at the next block, otherwise undefined.
268
+ */
269
+ async slotForProposal(tipArchive, proposalBlockNumber) {
270
+ const result = await this.publisher.canProposeAtNextEthBlock(tipArchive);
271
+ if (!result) {
272
+ return undefined;
261
273
  }
262
- catch (err) {
263
- const msg = prettyLogViemErrorMsg(err);
264
- this.log.debug(`Rejected from being able to propose at next block with ${tipArchive.toString('hex')}: ${msg ? `${msg}` : ''}`);
265
- throw err;
274
+ const [slot, blockNumber] = result;
275
+ if (proposalBlockNumber !== blockNumber) {
276
+ const msg = `Sequencer block number mismatch. Expected ${proposalBlockNumber} but got ${blockNumber}.`;
277
+ this.log.warn(msg);
278
+ throw new Error(msg);
266
279
  }
280
+ return slot;
267
281
  }
268
282
  /**
269
283
  * Sets the sequencer state and checks if we have enough time left in the slot to transition to the new state.
@@ -346,8 +360,9 @@ let Sequencer = (() => {
346
360
  const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() => processor.process(pendingTxs, limits, validators));
347
361
  if (!opts.validateOnly && failedTxs.length > 0) {
348
362
  const failedTxData = failedTxs.map(fail => fail.tx);
349
- this.log.verbose(`Dropping failed txs ${Tx.getHashes(failedTxData).join(', ')}`);
350
- await this.p2pClient.deleteTxs(Tx.getHashes(failedTxData));
363
+ const failedTxHashes = await Tx.getHashes(failedTxData);
364
+ this.log.verbose(`Dropping failed txs ${failedTxHashes.join(', ')}`);
365
+ await this.p2pClient.deleteTxs(failedTxHashes);
351
366
  }
352
367
  if (!opts.validateOnly && // We check for minTxCount only if we are proposing a block, not if we are validating it
353
368
  !this.isFlushing && // And we skip the check when flushing, since we want all pending txs to go out, no matter if too few
@@ -379,6 +394,7 @@ let Sequencer = (() => {
379
394
  // We create a fresh processor each time to reset any cached state (eg storage writes)
380
395
  // We wait a bit to close the forks since the processor may still be working on a dangling tx
381
396
  // which was interrupted due to the processingDeadline being hit.
397
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
382
398
  setTimeout(async () => {
383
399
  try {
384
400
  await publicProcessorFork.close();
@@ -400,7 +416,7 @@ let Sequencer = (() => {
400
416
  * @param pendingTxs - Iterable of pending transactions to construct the block from
401
417
  * @param proposalHeader - The partial header constructed for the proposal
402
418
  */
403
- async buildBlockAndAttemptToPublish(pendingTxs, proposalHeader) {
419
+ async buildBlockAndEnqueuePublish(pendingTxs, proposalHeader) {
404
420
  await this.publisher.validateBlockForSubmission(proposalHeader);
405
421
  const newGlobalVariables = proposalHeader.globalVariables;
406
422
  const blockNumber = newGlobalVariables.blockNumber.toNumber();
@@ -408,35 +424,29 @@ let Sequencer = (() => {
408
424
  // this.metrics.recordNewBlock(blockNumber, validTxs.length);
409
425
  const workTimer = new Timer();
410
426
  this.setState(SequencerState.CREATING_BLOCK, slot);
411
- // Start collecting proof quotes for the previous epoch if needed in the background
412
- const proofQuotePromise = this.createProofClaimForPreviousEpoch(slot);
413
427
  try {
414
428
  const buildBlockRes = await this.buildBlock(pendingTxs, newGlobalVariables);
415
429
  const { publicGas, block, publicProcessorDuration, numTxs, numMsgs, blockBuildingTimer } = buildBlockRes;
430
+ this.metrics.recordBuiltBlock(workTimer.ms(), publicGas.l2Gas);
416
431
  // TODO(@PhilWindle) We should probably periodically check for things like another
417
432
  // block being published before ours instead of just waiting on our block
418
433
  await this.publisher.validateBlockForSubmission(block.header);
419
- const workDuration = workTimer.ms();
420
434
  const blockStats = {
421
435
  eventName: 'l2-block-built',
422
436
  creator: this.publisher.getSenderAddress().toString(),
423
- duration: workDuration,
437
+ duration: workTimer.ms(),
424
438
  publicProcessDuration: publicProcessorDuration,
425
439
  rollupCircuitsDuration: blockBuildingTimer.ms(),
426
440
  ...block.getStats(),
427
441
  };
428
- const blockHash = block.hash();
442
+ const blockHash = await block.hash();
429
443
  const txHashes = block.body.txEffects.map(tx => tx.txHash);
430
- this.log.info(`Built block ${block.number} for slot ${slot} with ${numTxs} txs`, {
444
+ this.log.info(`Built block ${block.number} for slot ${slot} with ${numTxs} txs and ${numMsgs} messages. ${publicGas.l2Gas / workTimer.s()} mana/s`, {
431
445
  blockHash,
432
446
  globalVariables: block.header.globalVariables.toInspect(),
433
447
  txHashes,
434
448
  ...blockStats,
435
449
  });
436
- if (this.isFlushing) {
437
- this.log.verbose(`Sequencer flushing completed`);
438
- }
439
- this.isFlushing = false;
440
450
  this.log.debug('Collecting attestations');
441
451
  const stopCollectingAttestationsTimer = this.metrics.startCollectingAttestationsTimer();
442
452
  const attestations = await this.collectAttestations(block, txHashes);
@@ -444,32 +454,13 @@ let Sequencer = (() => {
444
454
  this.log.verbose(`Collected ${attestations.length} attestations`, { blockHash, blockNumber });
445
455
  }
446
456
  stopCollectingAttestationsTimer();
447
- // Get the proof quote for the previous epoch, if any
448
- const proofQuote = await proofQuotePromise;
449
- await this.publishL2Block(block, attestations, txHashes, proofQuote);
450
- this.metrics.recordPublishedBlock(workDuration, publicGas.l2Gas);
451
- const duration = Math.ceil(workDuration);
452
- const manaPerSecond = Math.ceil((publicGas.l2Gas * 1000) / duration);
453
- this.log.info(`Published block ${block.number} with ${numTxs} txs and ${numMsgs} messages in ${duration} ms at ${manaPerSecond} mana/s`, {
454
- publicGas,
455
- blockNumber: block.number,
456
- blockHash: blockHash,
457
- slot,
458
- txCount: txHashes.length,
459
- msgCount: numMsgs,
460
- duration,
461
- submitter: this.publisher.getSenderAddress().toString(),
462
- });
457
+ return this.enqueuePublishL2Block(block, attestations, txHashes);
463
458
  }
464
459
  catch (err) {
465
460
  this.metrics.recordFailedBlock();
466
461
  throw err;
467
462
  }
468
463
  }
469
- /** Forces the sequencer to bypass all time and tx count checks for the next block and build anyway. */
470
- flush() {
471
- this.isFlushing = true;
472
- }
473
464
  async collectAttestations(block, txHashes) {
474
465
  // TODO(https://github.com/AztecProtocol/aztec-packages/issues/7962): inefficient to have a round trip in here - this should be cached
475
466
  const committee = await this.publisher.getCurrentEpochCommittee();
@@ -509,23 +500,26 @@ let Sequencer = (() => {
509
500
  // Find out which epoch we are currently in
510
501
  const epochToProve = await this.publisher.getClaimableEpoch();
511
502
  if (epochToProve === undefined) {
512
- this.log.trace(`No epoch to prove at slot ${slotNumber}`);
503
+ this.log.trace(`No epoch to claim at slot ${slotNumber}`);
513
504
  return undefined;
514
505
  }
515
506
  // Get quotes for the epoch to be proven
516
507
  this.log.debug(`Collecting proof quotes for epoch ${epochToProve}`);
517
- const quotes = await this.p2pClient.getEpochProofQuotes(epochToProve);
518
- this.log.verbose(`Retrieved ${quotes.length} quotes for slot ${slotNumber} epoch ${epochToProve}`, {
508
+ const p2pQuotes = await this.p2pClient
509
+ .getEpochProofQuotes(epochToProve)
510
+ .then(quotes => quotes
511
+ .filter(x => x.payload.validUntilSlot >= slotNumber)
512
+ .filter(x => x.payload.epochToProve === epochToProve));
513
+ this.log.verbose(`Retrieved ${p2pQuotes.length} quotes for slot ${slotNumber} epoch ${epochToProve}`, {
519
514
  epochToProve,
520
515
  slotNumber,
521
- quotes: quotes.map(q => q.payload),
516
+ quotes: p2pQuotes.map(q => q.payload),
522
517
  });
518
+ if (!p2pQuotes.length) {
519
+ return undefined;
520
+ }
523
521
  // ensure these quotes are still valid for the slot and have the contract validate them
524
- const validQuotesPromise = Promise.all(quotes
525
- .filter(x => x.payload.validUntilSlot >= slotNumber)
526
- .filter(x => x.payload.epochToProve === epochToProve)
527
- .map(x => this.publisher.validateProofQuote(x)));
528
- const validQuotes = (await validQuotesPromise).filter((q) => !!q);
522
+ const validQuotes = await this.publisher.filterValidQuotes(p2pQuotes);
529
523
  if (!validQuotes.length) {
530
524
  this.log.warn(`Failed to find any valid proof quotes`);
531
525
  return undefined;
@@ -545,17 +539,17 @@ let Sequencer = (() => {
545
539
  * Publishes the L2Block to the rollup contract.
546
540
  * @param block - The L2Block to be published.
547
541
  */
548
- async publishL2Block(block, attestations, txHashes, proofQuote) {
542
+ async enqueuePublishL2Block(block, attestations, txHashes) {
549
543
  // Publishes new block to the network and awaits the tx to be mined
550
544
  this.setState(SequencerState.PUBLISHING_BLOCK, block.header.globalVariables.slotNumber.toBigInt());
551
545
  // Time out tx at the end of the slot
552
546
  const slot = block.header.globalVariables.slotNumber.toNumber();
553
547
  const txTimeoutAt = new Date((this.getSlotStartTimestamp(slot) + this.aztecSlotDuration) * 1000);
554
- const publishedL2Block = await this.publisher.proposeL2Block(block, attestations, txHashes, proofQuote, {
548
+ const enqueued = await this.publisher.enqueueProposeL2Block(block, attestations, txHashes, {
555
549
  txTimeoutAt,
556
550
  });
557
- if (!publishedL2Block) {
558
- throw new Error(`Failed to publish block ${block.number}`);
551
+ if (!enqueued) {
552
+ throw new Error(`Failed to enqueue publish of block ${block.number}`);
559
553
  }
560
554
  }
561
555
  async claimEpochProofRightIfAvailable(slotNumber) {
@@ -566,11 +560,11 @@ let Sequencer = (() => {
566
560
  const epoch = proofQuote.payload.epochToProve;
567
561
  const ctx = { slotNumber, epoch, quote: proofQuote.toInspect() };
568
562
  this.log.verbose(`Claiming proof right for epoch ${epoch}`, ctx);
569
- const success = await this.publisher.claimEpochProofRight(proofQuote);
570
- if (!success) {
571
- throw new Error(`Failed to claim proof right for epoch ${epoch}`);
563
+ const enqueued = this.publisher.enqueueClaimEpochProofRight(proofQuote);
564
+ if (!enqueued) {
565
+ throw new Error(`Failed to enqueue claim of proof right for epoch ${epoch}`);
572
566
  }
573
- this.log.info(`Claimed proof right for epoch ${epoch}`, ctx);
567
+ this.log.info(`Enqueued claim of proof right for epoch ${epoch}`, ctx);
574
568
  return epoch;
575
569
  }
576
570
  /**
@@ -627,7 +621,7 @@ let Sequencer = (() => {
627
621
  (() => {
628
622
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
629
623
  _work_decorators = [trackSpan('Sequencer.work')];
630
- _buildBlockAndAttemptToPublish_decorators = [trackSpan('Sequencer.buildBlockAndAttemptToPublish', (_validTxs, proposalHeader) => ({
624
+ _buildBlockAndEnqueuePublish_decorators = [trackSpan('Sequencer.buildBlockAndEnqueuePublish', (_validTxs, proposalHeader) => ({
631
625
  [Attributes.BLOCK_NUMBER]: proposalHeader.globalVariables.blockNumber.toNumber(),
632
626
  }))];
633
627
  _collectAttestations_decorators = [trackSpan('Sequencer.collectAttestations', (block, txHashes) => ({
@@ -635,18 +629,18 @@ let Sequencer = (() => {
635
629
  [Attributes.BLOCK_ARCHIVE]: block.archive.toString(),
636
630
  [Attributes.BLOCK_TXS_COUNT]: txHashes.length,
637
631
  }))];
638
- _publishL2Block_decorators = [trackSpan('Sequencer.publishL2Block', block => ({
632
+ _enqueuePublishL2Block_decorators = [trackSpan('Sequencer.enqueuePublishL2Block', block => ({
639
633
  [Attributes.BLOCK_NUMBER]: block.number,
640
634
  }))];
641
635
  _claimEpochProofRightIfAvailable_decorators = [trackSpan('Sequencer.claimEpochProofRightIfAvailable', slotNumber => ({ [Attributes.SLOT_NUMBER]: Number(slotNumber) }), epoch => ({ [Attributes.EPOCH_NUMBER]: Number(epoch) }))];
642
636
  __esDecorate(_a, null, _work_decorators, { kind: "method", name: "work", static: false, private: false, access: { has: obj => "work" in obj, get: obj => obj.work }, metadata: _metadata }, null, _instanceExtraInitializers);
643
- __esDecorate(_a, null, _buildBlockAndAttemptToPublish_decorators, { kind: "method", name: "buildBlockAndAttemptToPublish", static: false, private: false, access: { has: obj => "buildBlockAndAttemptToPublish" in obj, get: obj => obj.buildBlockAndAttemptToPublish }, metadata: _metadata }, null, _instanceExtraInitializers);
637
+ __esDecorate(_a, null, _buildBlockAndEnqueuePublish_decorators, { kind: "method", name: "buildBlockAndEnqueuePublish", static: false, private: false, access: { has: obj => "buildBlockAndEnqueuePublish" in obj, get: obj => obj.buildBlockAndEnqueuePublish }, metadata: _metadata }, null, _instanceExtraInitializers);
644
638
  __esDecorate(_a, null, _collectAttestations_decorators, { kind: "method", name: "collectAttestations", static: false, private: false, access: { has: obj => "collectAttestations" in obj, get: obj => obj.collectAttestations }, metadata: _metadata }, null, _instanceExtraInitializers);
645
- __esDecorate(_a, null, _publishL2Block_decorators, { kind: "method", name: "publishL2Block", static: false, private: false, access: { has: obj => "publishL2Block" in obj, get: obj => obj.publishL2Block }, metadata: _metadata }, null, _instanceExtraInitializers);
639
+ __esDecorate(_a, null, _enqueuePublishL2Block_decorators, { kind: "method", name: "enqueuePublishL2Block", static: false, private: false, access: { has: obj => "enqueuePublishL2Block" in obj, get: obj => obj.enqueuePublishL2Block }, metadata: _metadata }, null, _instanceExtraInitializers);
646
640
  __esDecorate(_a, null, _claimEpochProofRightIfAvailable_decorators, { kind: "method", name: "claimEpochProofRightIfAvailable", static: false, private: false, access: { has: obj => "claimEpochProofRightIfAvailable" in obj, get: obj => obj.claimEpochProofRightIfAvailable }, metadata: _metadata }, null, _instanceExtraInitializers);
647
641
  if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
648
642
  })(),
649
643
  _a;
650
644
  })();
651
645
  export { Sequencer };
652
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIsRUFBRSxHQUdILE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBRWpCLG9CQUFvQixFQUNwQixHQUFHLEVBRUgsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBcUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTVFLE9BQU8sRUFBRSxVQUFVLEVBQXFDLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZILE9BQU8sRUFBb0IsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0Is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
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIsRUFBRSxHQUdILE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBRWpCLG9CQUFvQixFQUNwQixHQUFHLEVBRUgsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBcUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTVFLE9BQU8sRUFBRSxVQUFVLEVBQXFDLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZILE9BQU8sRUFBMkIsUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFeEYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0YsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVB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
@@ -43,5 +43,5 @@ export declare function sequencerStateToNumber(state: SequencerState): number;
43
43
  *
44
44
  * @todo: perform this logic within the memory attestation store instead?
45
45
  */
46
- export declare function orderAttestations(attestations: BlockAttestation[], orderAddresses: EthAddress[]): Signature[];
46
+ export declare function orderAttestations(attestations: BlockAttestation[], orderAddresses: EthAddress[]): Promise<Signature[]>;
47
47
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/sequencer/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,oBAAY,cAAc;IACxB;;OAEG;IACH,OAAO,YAAY;IACnB;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,aAAa,kBAAkB;IAC/B;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,qBAAqB,0BAA0B;IAC/C;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,uBAAuB,4BAA4B;IACnD;;OAEG;IACH,gBAAgB,qBAAqB;CACtC;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,cAAc,CAAC;AAE1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,CAkB7G"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/sequencer/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAE5D,oBAAY,cAAc;IACxB;;OAEG;IACH,OAAO,YAAY;IACnB;;OAEG;IACH,IAAI,SAAS;IACb;;OAEG;IACH,aAAa,kBAAkB;IAC/B;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,qBAAqB,0BAA0B;IAC/C;;OAEG;IACH,cAAc,mBAAmB;IACjC;;OAEG;IACH,uBAAuB,4BAA4B;IACnD;;OAEG;IACH,gBAAgB,qBAAqB;CACtC;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,cAAc,CAAC;AAE1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEpE;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,gBAAgB,EAAE,EAChC,cAAc,EAAE,UAAU,EAAE,GAC3B,OAAO,CAAC,SAAS,EAAE,CAAC,CAkBtB"}
@@ -44,11 +44,11 @@ export function sequencerStateToNumber(state) {
44
44
  *
45
45
  * @todo: perform this logic within the memory attestation store instead?
46
46
  */
47
- export function orderAttestations(attestations, orderAddresses) {
47
+ export async function orderAttestations(attestations, orderAddresses) {
48
48
  // Create a map of sender addresses to BlockAttestations
49
49
  const attestationMap = new Map();
50
50
  for (const attestation of attestations) {
51
- const sender = attestation.getSender();
51
+ const sender = await attestation.getSender();
52
52
  if (sender) {
53
53
  attestationMap.set(sender.toString(), attestation);
54
54
  }
@@ -60,4 +60,4 @@ export function orderAttestations(attestations, orderAddresses) {
60
60
  });
61
61
  return orderedAttestations;
62
62
  }
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RCxNQUFNLENBQU4sSUFBWSxjQWlDWDtBQWpDRCxXQUFZLGNBQWM7SUFDeEI7O09BRUc7SUFDSCxxQ0FBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILCtCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILGlEQUErQixDQUFBO0lBQy9COztPQUVHO0lBQ0gsbURBQWlDLENBQUE7SUFDakM7O09BRUc7SUFDSCxpRUFBK0MsQ0FBQTtJQUMvQzs7T0FFRztJQUNILG1EQUFpQyxDQUFBO0lBQ2pDOztPQUVHO0lBQ0gscUVBQW1ELENBQUE7SUFDbkQ7O09BRUc7SUFDSCx1REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBakNXLGNBQWMsS0FBZCxjQUFjLFFBaUN6QjtBQUlELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFxQjtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsWUFBZ0MsRUFBRSxjQUE0QjtJQUM5Rix3REFBd0Q7SUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFFM0QsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN2RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUMifQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RCxNQUFNLENBQU4sSUFBWSxjQWlDWDtBQWpDRCxXQUFZLGNBQWM7SUFDeEI7O09BRUc7SUFDSCxxQ0FBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILCtCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILGlEQUErQixDQUFBO0lBQy9COztPQUVHO0lBQ0gsbURBQWlDLENBQUE7SUFDakM7O09BRUc7SUFDSCxpRUFBK0MsQ0FBQTtJQUMvQzs7T0FFRztJQUNILG1EQUFpQyxDQUFBO0lBQ2pDOztPQUVHO0lBQ0gscUVBQW1ELENBQUE7SUFDbkQ7O09BRUc7SUFDSCx1REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBakNXLGNBQWMsS0FBZCxjQUFjLFFBaUN6QjtBQUlELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFxQjtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxZQUFnQyxFQUNoQyxjQUE0QjtJQUU1Qix3REFBd0Q7SUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFFM0QsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQyJ9