@aztec/sequencer-client 0.51.0 → 0.51.1

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.
@@ -1,12 +1,13 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
2
  import { Signature, Tx, } from '@aztec/circuit-types';
3
3
  import { BlockProofError, PROVING_STATUS } from '@aztec/circuit-types/interfaces';
4
- import { AztecAddress, EthAddress, IS_DEV_NET } from '@aztec/circuits.js';
4
+ import { AppendOnlyTreeSnapshot, AztecAddress, ContentCommitment, EthAddress, GENESIS_ARCHIVE_ROOT, Header, IS_DEV_NET, StateReference, } from '@aztec/circuits.js';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
6
  import { createDebugLogger } from '@aztec/foundation/log';
7
7
  import { RunningPromise } from '@aztec/foundation/running-promise';
8
8
  import { Timer, elapsed } from '@aztec/foundation/timer';
9
9
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
10
+ import { BaseError, ContractFunctionRevertedError } from 'viem';
10
11
  import { SequencerMetrics } from './metrics.js';
11
12
  /**
12
13
  * Sequencer client
@@ -153,46 +154,34 @@ let Sequencer = (() => {
153
154
  this.log.debug(`Block has been synced`);
154
155
  this.state = SequencerState.IDLE;
155
156
  }
156
- const historicalHeader = (await this.l2BlockSource.getBlock(-1))?.header;
157
+ const chainTip = await this.l2BlockSource.getBlock(-1);
158
+ const historicalHeader = chainTip?.header;
157
159
  const newBlockNumber = (historicalHeader === undefined
158
160
  ? await this.l2BlockSource.getBlockNumber()
159
161
  : Number(historicalHeader.globalVariables.blockNumber.toBigInt())) + 1;
160
- // Do not go forward with new block if not my turn
161
- if (!(await this.publisher.isItMyTurnToSubmit())) {
162
- this.log.debug('Not my turn to submit block');
163
- return;
162
+ // If we cannot find a tip archive, assume genesis.
163
+ const chainTipArchive = chainTip == undefined ? new Fr(GENESIS_ARCHIVE_ROOT).toBuffer() : chainTip?.archive.root.toBuffer();
164
+ let slot;
165
+ try {
166
+ slot = await this.mayProposeBlock(chainTipArchive, BigInt(newBlockNumber));
164
167
  }
165
- if (this.isFlushing) {
166
- this.log.verbose(`Flushing all pending txs in new block`);
168
+ catch (err) {
169
+ this.log.debug(`Cannot propose for block ${newBlockNumber}`);
170
+ return;
167
171
  }
168
- // Compute time elapsed since the previous block
169
- const lastBlockTime = historicalHeader?.globalVariables.timestamp.toNumber() || 0;
170
- const currentTime = Math.floor(Date.now() / 1000);
171
- const elapsedSinceLastBlock = currentTime - lastBlockTime;
172
- this.log.debug(`Last block mined at ${lastBlockTime} current time is ${currentTime} (elapsed ${elapsedSinceLastBlock})`);
173
- // Do not go forward with new block if not enough time has passed since last block
174
- if (!this.isFlushing &&
175
- this.minSecondsBetweenBlocks > 0 &&
176
- elapsedSinceLastBlock < this.minSecondsBetweenBlocks) {
177
- this.log.debug(`Not creating block because not enough time ${this.minSecondsBetweenBlocks} has passed since last block`);
172
+ if (!this.shouldProposeBlock(historicalHeader, {})) {
178
173
  return;
179
174
  }
180
175
  this.state = SequencerState.WAITING_FOR_TXS;
181
176
  // Get txs to build the new block.
182
177
  const pendingTxs = this.p2pClient.getTxs('pending');
183
- // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs.
184
- if (!this.isFlushing && pendingTxs.length < this.minTxsPerBLock) {
185
- if (this.skipMinTxsPerBlockCheck(elapsedSinceLastBlock)) {
186
- this.log.debug(`Creating block with only ${pendingTxs.length} txs as more than ${this.maxSecondsBetweenBlocks}s have passed since last block`);
187
- }
188
- else {
189
- this.log.debug(`Not creating block because not enough txs in the pool (got ${pendingTxs.length} min ${this.minTxsPerBLock})`);
190
- return;
191
- }
178
+ if (!this.shouldProposeBlock(historicalHeader, { pendingTxsCount: pendingTxs.length })) {
179
+ return;
192
180
  }
193
181
  this.log.debug(`Retrieved ${pendingTxs.length} txs from P2P pool`);
194
- const newGlobalVariables = await this.globalsBuilder.buildGlobalVariables(new Fr(newBlockNumber), this._coinbase, this._feeRecipient);
195
- // @todo @LHerskind Include some logic to consider slots
182
+ const newGlobalVariables = await this.globalsBuilder.buildGlobalVariables(new Fr(newBlockNumber), this._coinbase, this._feeRecipient, slot);
183
+ // If I created a "partial" header here that should make our job much easier.
184
+ const proposalHeader = new Header(new AppendOnlyTreeSnapshot(Fr.fromBuffer(chainTipArchive), 1), ContentCommitment.empty(), StateReference.empty(), newGlobalVariables, Fr.ZERO);
196
185
  // TODO: It should be responsibility of the P2P layer to validate txs before passing them on here
197
186
  const allValidTxs = await this.takeValidTxs(pendingTxs, this.txValidatorFactory.validatorForNewTxs(newGlobalVariables, this.allowedInSetup));
198
187
  // TODO: We are taking the size of the tx from private-land, but we should be doing this after running
@@ -202,13 +191,10 @@ let Sequencer = (() => {
202
191
  // may break if we start emitting lots of log data from public-land.
203
192
  const validTxs = this.takeTxsWithinMaxSize(allValidTxs);
204
193
  // Bail if we don't have enough valid txs
205
- if (!this.isFlushing &&
206
- !this.skipMinTxsPerBlockCheck(elapsedSinceLastBlock) &&
207
- validTxs.length < this.minTxsPerBLock) {
208
- this.log.debug(`Not creating block because not enough valid txs loaded from the pool (got ${validTxs.length} min ${this.minTxsPerBLock})`);
194
+ if (!this.shouldProposeBlock(historicalHeader, { validTxsCount: validTxs.length })) {
209
195
  return;
210
196
  }
211
- await this.buildBlockAndPublish(validTxs, newGlobalVariables, historicalHeader, elapsedSinceLastBlock);
197
+ await this.buildBlockAndPublish(validTxs, proposalHeader, historicalHeader);
212
198
  }
213
199
  catch (err) {
214
200
  if (BlockProofError.isBlockProofError(err)) {
@@ -221,25 +207,94 @@ let Sequencer = (() => {
221
207
  }
222
208
  }
223
209
  /** Whether to skip the check of min txs per block if more than maxSecondsBetweenBlocks has passed since the previous block. */
224
- skipMinTxsPerBlockCheck(elapsed) {
210
+ skipMinTxsPerBlockCheck(historicalHeader) {
211
+ const lastBlockTime = historicalHeader?.globalVariables.timestamp.toNumber() || 0;
212
+ const currentTime = Math.floor(Date.now() / 1000);
213
+ const elapsed = currentTime - lastBlockTime;
225
214
  return this.maxSecondsBetweenBlocks > 0 && elapsed >= this.maxSecondsBetweenBlocks;
226
215
  }
227
- async buildBlockAndPublish(validTxs, newGlobalVariables, historicalHeader, elapsedSinceLastBlock) {
216
+ async mayProposeBlock(tipArchive, proposalBlockNumber) {
217
+ // This checks that we can propose, and gives us the slot that we are to propose for
218
+ try {
219
+ const [slot, blockNumber] = await this.publisher.canProposeAtNextEthBlock(tipArchive);
220
+ if (proposalBlockNumber !== blockNumber) {
221
+ const msg = `Block number mismatch. Expected ${proposalBlockNumber} but got ${blockNumber}`;
222
+ this.log.debug(msg);
223
+ throw new Error(msg);
224
+ }
225
+ return slot;
226
+ }
227
+ catch (err) {
228
+ if (err instanceof BaseError) {
229
+ const revertError = err.walk(err => err instanceof ContractFunctionRevertedError);
230
+ if (revertError instanceof ContractFunctionRevertedError) {
231
+ const errorName = revertError.data?.errorName ?? '';
232
+ this.log.debug(`canProposeAtTime failed with "${errorName}"`);
233
+ }
234
+ }
235
+ throw err;
236
+ }
237
+ }
238
+ shouldProposeBlock(historicalHeader, args) {
239
+ if (this.isFlushing) {
240
+ this.log.verbose(`Flushing all pending txs in new block`);
241
+ return true;
242
+ }
243
+ if (IS_DEV_NET) {
244
+ // Compute time elapsed since the previous block
245
+ const lastBlockTime = historicalHeader?.globalVariables.timestamp.toNumber() || 0;
246
+ const currentTime = Math.floor(Date.now() / 1000);
247
+ const elapsedSinceLastBlock = currentTime - lastBlockTime;
248
+ this.log.debug(`Last block mined at ${lastBlockTime} current time is ${currentTime} (elapsed ${elapsedSinceLastBlock})`);
249
+ // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs.
250
+ // Do not go forward with new block if not enough time has passed since last block
251
+ if (this.minSecondsBetweenBlocks > 0 && elapsedSinceLastBlock < this.minSecondsBetweenBlocks) {
252
+ this.log.debug(`Not creating block because not enough time ${this.minSecondsBetweenBlocks} has passed since last block`);
253
+ return false;
254
+ }
255
+ }
256
+ const skipCheck = this.skipMinTxsPerBlockCheck(historicalHeader);
257
+ // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs.
258
+ if (args.pendingTxsCount != undefined) {
259
+ if (args.pendingTxsCount < this.minTxsPerBLock) {
260
+ if (skipCheck) {
261
+ this.log.debug(`Creating block with only ${args.pendingTxsCount} txs as more than ${this.maxSecondsBetweenBlocks}s have passed since last block`);
262
+ }
263
+ else {
264
+ this.log.debug(`Not creating block because not enough txs in the pool (got ${args.pendingTxsCount} min ${this.minTxsPerBLock})`);
265
+ return false;
266
+ }
267
+ }
268
+ }
269
+ // Bail if we don't have enough valid txs
270
+ if (args.validTxsCount != undefined) {
271
+ // Bail if we don't have enough valid txs
272
+ if (!skipCheck && args.validTxsCount < this.minTxsPerBLock) {
273
+ this.log.debug(`Not creating block because not enough valid txs loaded from the pool (got ${args.validTxsCount} min ${this.minTxsPerBLock})`);
274
+ return false;
275
+ }
276
+ }
277
+ // TODO: This check should be processedTxs.length < this.minTxsPerBLock, so we don't publish a block with
278
+ // less txs than the minimum. But that'd cause the entire block to be aborted and retried. Instead, we should
279
+ // go back to the p2p pool and load more txs until we hit our minTxsPerBLock target. Only if there are no txs
280
+ // we should bail.
281
+ if (args.processedTxsCount != undefined) {
282
+ if (args.processedTxsCount === 0 && !skipCheck && this.minTxsPerBLock > 0) {
283
+ this.log.verbose('No txs processed correctly to build block. Exiting');
284
+ return false;
285
+ }
286
+ }
287
+ return true;
288
+ }
289
+ async buildBlockAndPublish(validTxs, proposalHeader, historicalHeader) {
290
+ if (!(await this.publisher.validateBlockForSubmission(proposalHeader))) {
291
+ return;
292
+ }
293
+ const newGlobalVariables = proposalHeader.globalVariables;
228
294
  this.metrics.recordNewBlock(newGlobalVariables.blockNumber.toNumber(), validTxs.length);
229
295
  const workTimer = new Timer();
230
296
  this.state = SequencerState.CREATING_BLOCK;
231
297
  this.log.info(`Building block ${newGlobalVariables.blockNumber.toNumber()} with ${validTxs.length} transactions`);
232
- const assertBlockHeight = async () => {
233
- const currentBlockNumber = await this.l2BlockSource.getBlockNumber();
234
- if (currentBlockNumber + 1 !== newGlobalVariables.blockNumber.toNumber()) {
235
- this.metrics.recordCancelledBlock();
236
- throw new Error('New block was emitted while building block');
237
- }
238
- if (!(await this.publisher.isItMyTurnToSubmit())) {
239
- throw new Error(`Not this sequencer turn to submit block`);
240
- }
241
- // @todo @LHerskind Should take into account, block number, proposer and slot number
242
- };
243
298
  // Get l1 to l2 messages from the contract
244
299
  this.log.debug('Requesting L1 to L2 messages from contract');
245
300
  const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(newGlobalVariables.blockNumber.toBigInt());
@@ -257,32 +312,28 @@ let Sequencer = (() => {
257
312
  this.log.debug(`Dropping failed txs ${Tx.getHashes(failedTxData).join(', ')}`);
258
313
  await this.p2pClient.deleteTxs(Tx.getHashes(failedTxData));
259
314
  }
260
- // TODO: This check should be processedTxs.length < this.minTxsPerBLock, so we don't publish a block with
261
- // less txs than the minimum. But that'd cause the entire block to be aborted and retried. Instead, we should
262
- // go back to the p2p pool and load more txs until we hit our minTxsPerBLock target. Only if there are no txs
263
- // we should bail.
264
- if (!this.isFlushing &&
265
- processedTxs.length === 0 &&
266
- !this.skipMinTxsPerBlockCheck(elapsedSinceLastBlock) &&
267
- this.minTxsPerBLock > 0) {
268
- this.log.verbose('No txs processed correctly to build block. Exiting');
315
+ if (!(await this.publisher.validateBlockForSubmission(proposalHeader)) ||
316
+ !this.shouldProposeBlock(historicalHeader, {
317
+ validTxsCount: validTxs.length,
318
+ processedTxsCount: processedTxs.length,
319
+ })) {
269
320
  blockBuilder.cancelBlock();
270
321
  return;
271
322
  }
272
- await assertBlockHeight();
273
323
  // All real transactions have been added, set the block as full and complete the proving.
274
324
  await blockBuilder.setBlockCompleted();
275
- // Here we are now waiting for the block to be proven.
325
+ // Here we are now waiting for the block to be proven (using simulated[fake] proofs).
276
326
  // TODO(@PhilWindle) We should probably periodically check for things like another
277
327
  // block being published before ours instead of just waiting on our block
278
328
  const result = await blockTicket.provingPromise;
279
329
  if (result.status === PROVING_STATUS.FAILURE) {
280
330
  throw new Error(`Block proving failed, reason: ${result.reason}`);
281
331
  }
282
- await assertBlockHeight();
283
- // Block is ready, now finalise and publish!
332
+ // Block is ready, now finalise
284
333
  const { block } = await blockBuilder.finaliseBlock();
285
- await assertBlockHeight();
334
+ if (!(await this.publisher.validateBlockForSubmission(block.header))) {
335
+ return;
336
+ }
286
337
  const workDuration = workTimer.ms();
287
338
  this.log.verbose(`Assembled block ${block.number} (txEffectsHash: ${block.header.contentCommitment.txsEffectsHash.toString('hex')})`, {
288
339
  eventName: 'l2-block-built',
@@ -295,8 +346,8 @@ let Sequencer = (() => {
295
346
  this.log.verbose(`Flushing completed`);
296
347
  }
297
348
  this.isFlushing = false;
349
+ const attestations = await this.collectAttestations(block);
298
350
  try {
299
- const attestations = await this.collectAttestations(block);
300
351
  await this.publishL2Block(block, attestations);
301
352
  this.metrics.recordPublishedBlock(workDuration);
302
353
  this.log.info(`Submitted rollup block ${block.number} with ${processedTxs.length} transactions duration=${workDuration}ms (Submitter: ${await this.publisher.getSenderAddress()})`);
@@ -329,6 +380,9 @@ let Sequencer = (() => {
329
380
  }
330
381
  // TODO(https://github.com/AztecProtocol/aztec-packages/issues/7962): inefficient to have a round trip in here - this should be cached
331
382
  const committee = await this.publisher.getCurrentEpochCommittee();
383
+ if (committee.length === 0) {
384
+ return undefined;
385
+ }
332
386
  const numberOfRequiredAttestations = Math.floor((committee.length * 2) / 3) + 1;
333
387
  // TODO(https://github.com/AztecProtocol/aztec-packages/issues/7974): we do not have transaction[] lists in the block for now
334
388
  // Dont do anything with the proposals for now - just collect them
@@ -336,7 +390,7 @@ let Sequencer = (() => {
336
390
  this.state = SequencerState.PUBLISHING_BLOCK_TO_PEERS;
337
391
  this.validatorClient.broadcastBlockProposal(proposal);
338
392
  this.state = SequencerState.WAITING_FOR_ATTESTATIONS;
339
- const attestations = await this.validatorClient.collectAttestations(proposal.header.globalVariables.slotNumber.toBigInt(), numberOfRequiredAttestations);
393
+ const attestations = await this.validatorClient.collectAttestations(proposal, numberOfRequiredAttestations);
340
394
  // note: the smart contract requires that the signatures are provided in the order of the committee
341
395
  return await orderAttestations(attestations, committee);
342
396
  }
@@ -409,8 +463,8 @@ let Sequencer = (() => {
409
463
  },
410
464
  (() => {
411
465
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
412
- _buildBlockAndPublish_decorators = [trackSpan('Sequencer.buildBlockAndPublish', (_validTxs, newGlobalVariables, _historicalHeader) => ({
413
- [Attributes.BLOCK_NUMBER]: newGlobalVariables.blockNumber.toNumber(),
466
+ _buildBlockAndPublish_decorators = [trackSpan('Sequencer.buildBlockAndPublish', (_validTxs, proposalHeader, _historicalHeader) => ({
467
+ [Attributes.BLOCK_NUMBER]: proposalHeader.globalVariables.blockNumber.toNumber(),
414
468
  }))];
415
469
  _publishL2Block_decorators = [trackSpan('Sequencer.publishL2Block', block => ({
416
470
  [Attributes.BLOCK_NUMBER]: block.number,
@@ -483,4 +537,4 @@ async function orderAttestations(attestations, orderAddresses) {
483
537
  });
484
538
  return orderedAttestations;
485
539
  }
486
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxTQUFTLEVBQ1QsRUFBRSxHQUVILE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUF1QixlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkcsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQXFDLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsVUFBVSxFQUFxQyxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVNuRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFaEQ7Ozs7Ozs7O0dBUUc7SUFDVSxTQUFTOzs7OztzQkFBVCxTQUFTO1lBa0JwQixZQUNVLFNBQXNCLEVBQ3RCLGVBQTRDLEVBQUUsd0RBQXdEO1lBQ3RHLGNBQXFDLEVBQ3JDLFNBQWMsRUFDZCxVQUFrQyxFQUNsQyxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxrQkFBc0MsRUFDOUMsU0FBMEIsRUFDbEIsU0FBMEIsRUFBRSxFQUM1QixNQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDO2dCQVoxQyxjQUFTLElBbkJSLG1EQUFTLEVBbUJWLFNBQVMsRUFBYTtnQkFDdEIsb0JBQWUsR0FBZixlQUFlLENBQTZCO2dCQUM1QyxtQkFB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
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxTQUFTLEVBQ1QsRUFBRSxHQUVILE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUF1QixlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkcsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEdBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFVBQVUsRUFBcUMsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU9oRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRaEQ7Ozs7Ozs7O0dBUUc7SUFDVSxTQUFTOzs7OztzQkFBVCxTQUFTO1lBa0JwQixZQUNVLFNBQXNCLEVBQ3RCLGVBQTRDLEVBQUUsd0RBQXdEO1lBQ3RHLGNBQXFDLEVBQ3JDLFNBQWMsRUFDZCxVQUFrQyxFQUNsQyxtQkFBd0MsRUFDeEMsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxrQkFBc0MsRUFDOUMsU0FBMEIsRUFDbEIsU0FBMEIsRUFBRSxFQUM1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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.51.0",
3
+ "version": "0.51.1",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -24,23 +24,24 @@
24
24
  "test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
25
25
  },
26
26
  "dependencies": {
27
- "@aztec/bb-prover": "0.51.0",
28
- "@aztec/circuit-types": "0.51.0",
29
- "@aztec/circuits.js": "0.51.0",
30
- "@aztec/ethereum": "0.51.0",
31
- "@aztec/foundation": "0.51.0",
32
- "@aztec/l1-artifacts": "0.51.0",
33
- "@aztec/merkle-tree": "0.51.0",
34
- "@aztec/noir-contracts.js": "0.51.0",
35
- "@aztec/noir-protocol-circuits-types": "0.51.0",
36
- "@aztec/p2p": "0.51.0",
37
- "@aztec/protocol-contracts": "0.51.0",
38
- "@aztec/prover-client": "0.51.0",
39
- "@aztec/simulator": "0.51.0",
40
- "@aztec/telemetry-client": "0.51.0",
41
- "@aztec/types": "0.51.0",
42
- "@aztec/validator-client": "0.51.0",
43
- "@aztec/world-state": "0.51.0",
27
+ "@aztec/aztec.js": "0.51.1",
28
+ "@aztec/bb-prover": "0.51.1",
29
+ "@aztec/circuit-types": "0.51.1",
30
+ "@aztec/circuits.js": "0.51.1",
31
+ "@aztec/ethereum": "0.51.1",
32
+ "@aztec/foundation": "0.51.1",
33
+ "@aztec/l1-artifacts": "0.51.1",
34
+ "@aztec/merkle-tree": "0.51.1",
35
+ "@aztec/noir-contracts.js": "0.51.1",
36
+ "@aztec/noir-protocol-circuits-types": "0.51.1",
37
+ "@aztec/p2p": "0.51.1",
38
+ "@aztec/protocol-contracts": "0.51.1",
39
+ "@aztec/prover-client": "0.51.1",
40
+ "@aztec/simulator": "0.51.1",
41
+ "@aztec/telemetry-client": "0.51.1",
42
+ "@aztec/types": "0.51.1",
43
+ "@aztec/validator-client": "0.51.1",
44
+ "@aztec/world-state": "0.51.1",
44
45
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
45
46
  "@noir-lang/types": "portal:../../noir/packages/types",
46
47
  "lodash.chunk": "^4.2.0",
@@ -52,23 +52,26 @@ export class GlobalVariableBuilder {
52
52
  * @param blockNumber - The block number to build global variables for.
53
53
  * @param coinbase - The address to receive block reward.
54
54
  * @param feeRecipient - The address to receive fees.
55
+ * @param slotNumber - The slot number to use for the global variables, if undefined it will be calculated.
55
56
  * @returns The global variables for the given block number.
56
57
  */
57
58
  public async buildGlobalVariables(
58
59
  blockNumber: Fr,
59
60
  coinbase: EthAddress,
60
61
  feeRecipient: AztecAddress,
62
+ slotNumber?: bigint,
61
63
  ): Promise<GlobalVariables> {
62
64
  const version = new Fr(await this.rollupContract.read.VERSION());
63
65
  const chainId = new Fr(this.publicClient.chain.id);
64
66
 
65
- const ts = (await this.publicClient.getBlock()).timestamp;
67
+ if (slotNumber === undefined) {
68
+ const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(ETHEREUM_SLOT_DURATION));
69
+ slotNumber = await this.rollupContract.read.getSlotAt([ts]);
70
+ }
66
71
 
67
- // Not just the current slot, the slot of the next block.
68
- const slot = await this.rollupContract.read.getSlotAt([ts + BigInt(ETHEREUM_SLOT_DURATION)]);
69
- const timestamp = await this.rollupContract.read.getTimestampForSlot([slot]);
72
+ const timestamp = await this.rollupContract.read.getTimestampForSlot([slotNumber]);
70
73
 
71
- const slotFr = new Fr(slot);
74
+ const slotFr = new Fr(slotNumber);
72
75
  const timestampFr = new Fr(timestamp);
73
76
 
74
77
  const gasFees = GasFees.default();