@aztec/sequencer-client 0.71.0 → 0.73.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 (66) 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 +41 -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 +158 -0
  17. package/dest/publisher/sequencer-publisher.d.ts.map +1 -0
  18. package/dest/publisher/sequencer-publisher.js +555 -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 +6 -6
  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 +18 -12
  26. package/dest/sequencer/sequencer.d.ts.map +1 -1
  27. package/dest/sequencer/sequencer.js +118 -125
  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/slasher_client.d.ts.map +1 -1
  32. package/dest/slasher/slasher_client.js +6 -3
  33. package/dest/test/index.d.ts +3 -3
  34. package/dest/test/index.d.ts.map +1 -1
  35. package/dest/test/index.js +1 -2
  36. package/dest/tx_validator/gas_validator.d.ts +1 -1
  37. package/dest/tx_validator/gas_validator.d.ts.map +1 -1
  38. package/dest/tx_validator/gas_validator.js +10 -5
  39. package/dest/tx_validator/test_utils.d.ts +4 -4
  40. package/dest/tx_validator/test_utils.d.ts.map +1 -1
  41. package/dest/tx_validator/test_utils.js +3 -3
  42. package/package.json +22 -21
  43. package/src/client/sequencer-client.ts +60 -14
  44. package/src/config.ts +3 -3
  45. package/src/publisher/config.ts +13 -1
  46. package/src/publisher/index.ts +1 -1
  47. package/src/publisher/{l1-publisher-metrics.ts → sequencer-publisher-metrics.ts} +41 -2
  48. package/src/publisher/sequencer-publisher.ts +730 -0
  49. package/src/sequencer/allowed.ts +5 -5
  50. package/src/sequencer/metrics.ts +2 -3
  51. package/src/sequencer/sequencer.ts +153 -150
  52. package/src/sequencer/utils.ts +5 -2
  53. package/src/slasher/slasher_client.ts +7 -2
  54. package/src/test/index.ts +2 -4
  55. package/src/tx_validator/gas_validator.ts +17 -4
  56. package/src/tx_validator/test_utils.ts +5 -5
  57. package/dest/publisher/l1-publisher-metrics.d.ts.map +0 -1
  58. package/dest/publisher/l1-publisher-metrics.js +0 -85
  59. package/dest/publisher/l1-publisher.d.ts +0 -195
  60. package/dest/publisher/l1-publisher.d.ts.map +0 -1
  61. package/dest/publisher/l1-publisher.js +0 -864
  62. package/dest/test/test-l1-publisher.d.ts +0 -9
  63. package/dest/test/test-l1-publisher.d.ts.map +0 -1
  64. package/dest/test/test-l1-publisher.js +0 -11
  65. package/src/publisher/l1-publisher.ts +0 -1208
  66. package/src/test/test-l1-publisher.ts +0 -20
@@ -0,0 +1,555 @@
1
+ var _a;
2
+ import { createBlobSinkClient } from '@aztec/blob-sink/client';
3
+ import { ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayload, } from '@aztec/circuit-types';
4
+ import { EthAddress } from '@aztec/circuits.js';
5
+ import { FormattedViemError, formatViemError, } from '@aztec/ethereum';
6
+ import { toHex } from '@aztec/foundation/bigint-buffer';
7
+ import { Blob } from '@aztec/foundation/blob';
8
+ import { createLogger } from '@aztec/foundation/log';
9
+ import { Timer } from '@aztec/foundation/timer';
10
+ import { EmpireBaseAbi, ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
11
+ import { getTelemetryClient } from '@aztec/telemetry-client';
12
+ import pick from 'lodash.pick';
13
+ import { encodeFunctionData, getAddress, getContract } from 'viem';
14
+ import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
15
+ export var VoteType;
16
+ (function (VoteType) {
17
+ VoteType[VoteType["GOVERNANCE"] = 0] = "GOVERNANCE";
18
+ VoteType[VoteType["SLASHING"] = 1] = "SLASHING";
19
+ })(VoteType || (VoteType = {}));
20
+ export class SequencerPublisher {
21
+ constructor(config, deps) {
22
+ this.interrupted = false;
23
+ this.governanceLog = createLogger('sequencer:publisher:governance');
24
+ this.governancePayload = EthAddress.ZERO;
25
+ this.slashingLog = createLogger('sequencer:publisher:slashing');
26
+ this.getSlashPayload = undefined;
27
+ this.myLastVotes = {
28
+ [VoteType.GOVERNANCE]: 0n,
29
+ [VoteType.SLASHING]: 0n,
30
+ };
31
+ this.log = createLogger('sequencer:publisher');
32
+ this.requests = [];
33
+ this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
34
+ this.epochCache = deps.epochCache;
35
+ if (config.l1Contracts.governanceProposerAddress) {
36
+ this.governanceProposerAddress = EthAddress.fromString(config.l1Contracts.governanceProposerAddress.toString());
37
+ }
38
+ this.blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
39
+ const telemetry = deps.telemetry ?? getTelemetryClient();
40
+ this.metrics = new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
41
+ this.l1TxUtils = deps.l1TxUtils;
42
+ this.rollupContract = deps.rollupContract;
43
+ this.forwarderContract = deps.forwarderContract;
44
+ }
45
+ registerSlashPayloadGetter(callback) {
46
+ this.getSlashPayload = callback;
47
+ }
48
+ getForwarderAddress() {
49
+ return EthAddress.fromString(this.forwarderContract.getAddress());
50
+ }
51
+ getSenderAddress() {
52
+ return EthAddress.fromString(this.l1TxUtils.getSenderAddress());
53
+ }
54
+ getGovernancePayload() {
55
+ return this.governancePayload;
56
+ }
57
+ setGovernancePayload(payload) {
58
+ this.governancePayload = payload;
59
+ }
60
+ addRequest(request) {
61
+ this.requests.push(request);
62
+ }
63
+ getCurrentL2Slot() {
64
+ return this.epochCache.getEpochAndSlotNow().slot;
65
+ }
66
+ /**
67
+ * Sends all requests that are still valid.
68
+ * @returns one of:
69
+ * - A receipt and stats if the tx succeeded
70
+ * - a receipt and errorMsg if it failed on L1
71
+ * - undefined if no valid requests are found OR the tx failed to send.
72
+ */
73
+ async sendRequests() {
74
+ const requestsToProcess = [...this.requests];
75
+ this.requests = [];
76
+ if (this.interrupted) {
77
+ return undefined;
78
+ }
79
+ const currentL2Slot = this.getCurrentL2Slot();
80
+ this.log.debug(`Current L2 slot: ${currentL2Slot}`);
81
+ const validRequests = requestsToProcess.filter(request => request.lastValidL2Slot >= currentL2Slot);
82
+ if (validRequests.length !== requestsToProcess.length) {
83
+ this.log.warn(`Some requests were expired for slot ${currentL2Slot}`, {
84
+ validRequests: validRequests.map(request => ({
85
+ action: request.action,
86
+ lastValidL2Slot: request.lastValidL2Slot,
87
+ })),
88
+ requests: requestsToProcess.map(request => ({
89
+ action: request.action,
90
+ lastValidL2Slot: request.lastValidL2Slot,
91
+ })),
92
+ });
93
+ }
94
+ if (validRequests.length === 0) {
95
+ this.log.debug(`No valid requests to send`);
96
+ return undefined;
97
+ }
98
+ // @note - we can only have one gas config and one blob config per bundle
99
+ // find requests with gas and blob configs
100
+ // See https://github.com/AztecProtocol/aztec-packages/issues/11513
101
+ const gasConfigs = requestsToProcess.filter(request => request.gasConfig);
102
+ const blobConfigs = requestsToProcess.filter(request => request.blobConfig);
103
+ if (gasConfigs.length > 1 || blobConfigs.length > 1) {
104
+ throw new Error('Multiple gas or blob configs found');
105
+ }
106
+ const gasConfig = gasConfigs[0]?.gasConfig;
107
+ const blobConfig = blobConfigs[0]?.blobConfig;
108
+ try {
109
+ this.log.debug('Forwarding transactions', {
110
+ validRequests: validRequests.map(request => request.action),
111
+ });
112
+ const result = await this.forwarderContract.forward(validRequests.map(request => request.request), this.l1TxUtils, gasConfig, blobConfig);
113
+ this.callbackBundledTransactions(validRequests, result);
114
+ return result;
115
+ }
116
+ catch (err) {
117
+ const { message, metaMessages } = formatViemError(err);
118
+ this.log.error(`Failed to publish bundled transactions`, message, { metaMessages });
119
+ return undefined;
120
+ }
121
+ }
122
+ callbackBundledTransactions(requests, result) {
123
+ const success = result?.receipt.status === 'success';
124
+ const logger = success ? this.log.info : this.log.error;
125
+ for (const request of requests) {
126
+ logger(`Bundled [${request.action}] transaction [${success ? 'succeeded' : 'failed'}]`);
127
+ request.onResult?.(request.request, result);
128
+ }
129
+ }
130
+ /**
131
+ * @notice Will call `canProposeAtNextEthBlock` to make sure that it is possible to propose
132
+ * @param tipArchive - The archive to check
133
+ * @returns The slot and block number if it is possible to propose, undefined otherwise
134
+ */
135
+ canProposeAtNextEthBlock(tipArchive) {
136
+ const ignoredErrors = ['SlotAlreadyInChain', 'InvalidProposer'];
137
+ return this.rollupContract
138
+ .canProposeAtNextEthBlock(tipArchive, this.getForwarderAddress().toString(), this.ethereumSlotDuration)
139
+ .catch(err => {
140
+ if (err instanceof FormattedViemError && ignoredErrors.find(e => err.message.includes(e))) {
141
+ this.log.debug(err.message);
142
+ }
143
+ else {
144
+ this.log.error(err.name, err);
145
+ }
146
+ return undefined;
147
+ });
148
+ }
149
+ /**
150
+ * @returns The epoch that is currently claimable, undefined otherwise
151
+ */
152
+ getClaimableEpoch() {
153
+ const acceptedErrors = ['Rollup__NoEpochToProve', 'Rollup__ProofRightAlreadyClaimed'];
154
+ return this.rollupContract.getClaimableEpoch().catch(err => {
155
+ if (acceptedErrors.find(e => err.message.includes(e))) {
156
+ return undefined;
157
+ }
158
+ throw err;
159
+ });
160
+ }
161
+ /**
162
+ * @notice Will filter out invalid quotes according to L1
163
+ * @param quotes - The quotes to filter
164
+ * @returns The filtered quotes
165
+ */
166
+ filterValidQuotes(quotes) {
167
+ return Promise.all(quotes.map(x => this.rollupContract
168
+ // validate throws if the quote is not valid
169
+ // else returns void
170
+ .validateProofQuote(x.toViemArgs(), this.getForwarderAddress().toString(), this.ethereumSlotDuration)
171
+ .then(() => x)
172
+ .catch(err => {
173
+ this.log.error(`Failed to validate proof quote`, err, { quote: x.toInspect() });
174
+ return undefined;
175
+ }))).then(quotes => quotes.filter((q) => !!q));
176
+ }
177
+ /**
178
+ * @notice Will call `validateHeader` to make sure that it is possible to propose
179
+ *
180
+ * @dev Throws if unable to propose
181
+ *
182
+ * @param header - The header to propose
183
+ * @param digest - The digest that attestations are signing over
184
+ *
185
+ */
186
+ async validateBlockForSubmission(header, attestationData = {
187
+ digest: Buffer.alloc(32),
188
+ signatures: [],
189
+ }) {
190
+ const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
191
+ const formattedSignatures = attestationData.signatures.map(attest => attest.toViemSignature());
192
+ const flags = { ignoreDA: true, ignoreSignatures: formattedSignatures.length == 0 };
193
+ const args = [
194
+ `0x${header.toBuffer().toString('hex')}`,
195
+ formattedSignatures,
196
+ `0x${attestationData.digest.toString('hex')}`,
197
+ ts,
198
+ `0x${header.contentCommitment.blobsHash.toString('hex')}`,
199
+ flags,
200
+ ];
201
+ await this.rollupContract.validateHeader(args, this.getForwarderAddress().toString());
202
+ return ts;
203
+ }
204
+ async getCurrentEpochCommittee() {
205
+ const committee = await this.rollupContract.getCurrentEpochCommittee();
206
+ return committee.map(EthAddress.fromString);
207
+ }
208
+ /**
209
+ * Enqueues a castVote transaction to cast a vote for a given slot number.
210
+ * @param slotNumber - The slot number to cast a vote for.
211
+ * @param timestamp - The timestamp of the slot to cast a vote for.
212
+ * @param voteType - The type of vote to cast.
213
+ * @returns True if the vote was successfully enqueued, false otherwise.
214
+ */
215
+ async enqueueCastVote(slotNumber, timestamp, voteType) {
216
+ // @todo This function can be optimized by doing some of the computations locally instead of calling the L1 contracts
217
+ if (this.myLastVotes[voteType] >= slotNumber) {
218
+ return false;
219
+ }
220
+ const voteConfig = async () => {
221
+ if (voteType === VoteType.GOVERNANCE) {
222
+ if (this.governancePayload.equals(EthAddress.ZERO)) {
223
+ return undefined;
224
+ }
225
+ if (!this.governanceProposerAddress) {
226
+ return undefined;
227
+ }
228
+ return {
229
+ payload: this.governancePayload,
230
+ voteContractAddress: this.governanceProposerAddress,
231
+ logger: this.governanceLog,
232
+ };
233
+ }
234
+ else if (voteType === VoteType.SLASHING) {
235
+ if (!this.getSlashPayload) {
236
+ return undefined;
237
+ }
238
+ const slashingProposerAddress = await this.rollupContract.getSlashingProposerAddress();
239
+ if (!slashingProposerAddress) {
240
+ return undefined;
241
+ }
242
+ const slashPayload = await this.getSlashPayload(slotNumber);
243
+ if (!slashPayload) {
244
+ return undefined;
245
+ }
246
+ return {
247
+ payload: slashPayload,
248
+ voteContractAddress: slashingProposerAddress,
249
+ logger: this.slashingLog,
250
+ };
251
+ }
252
+ else {
253
+ throw new Error('Invalid vote type');
254
+ }
255
+ };
256
+ const vConfig = await voteConfig();
257
+ if (!vConfig) {
258
+ return false;
259
+ }
260
+ const { payload, voteContractAddress } = vConfig;
261
+ const voteContract = getContract({
262
+ address: getAddress(voteContractAddress.toString()),
263
+ abi: EmpireBaseAbi,
264
+ client: this.l1TxUtils.walletClient,
265
+ });
266
+ const [proposer, roundNumber] = await Promise.all([
267
+ this.rollupContract.getProposerAt(timestamp),
268
+ voteContract.read.computeRound([slotNumber]),
269
+ ]);
270
+ if (proposer.toLowerCase() !== this.getForwarderAddress().toString().toLowerCase()) {
271
+ return false;
272
+ }
273
+ const [slotForLastVote] = await voteContract.read.rounds([this.rollupContract.address, roundNumber]);
274
+ if (slotForLastVote >= slotNumber) {
275
+ return false;
276
+ }
277
+ const cachedLastVote = this.myLastVotes[voteType];
278
+ this.myLastVotes[voteType] = slotNumber;
279
+ this.addRequest({
280
+ action: voteType === VoteType.GOVERNANCE ? 'governance-vote' : 'slashing-vote',
281
+ request: {
282
+ to: voteContractAddress.toString(),
283
+ data: encodeFunctionData({
284
+ abi: EmpireBaseAbi,
285
+ functionName: 'vote',
286
+ args: [payload.toString()],
287
+ }),
288
+ },
289
+ lastValidL2Slot: slotNumber,
290
+ onResult: (_request, result) => {
291
+ if (!result || result.receipt.status !== 'success') {
292
+ this.myLastVotes[voteType] = cachedLastVote;
293
+ }
294
+ else {
295
+ this.log.info(`Cast ${voteType} vote for slot ${slotNumber}`);
296
+ }
297
+ },
298
+ });
299
+ return true;
300
+ }
301
+ /**
302
+ * Proposes a L2 block on L1.
303
+ *
304
+ * @param block - L2 block to propose.
305
+ * @returns True if the tx has been enqueued, throws otherwise. See #9315
306
+ */
307
+ async enqueueProposeL2Block(block, attestations, txHashes, opts = {}) {
308
+ const consensusPayload = new ConsensusPayload(block.header, block.archive.root, txHashes ?? []);
309
+ const digest = await getHashedSignaturePayload(consensusPayload, SignatureDomainSeparator.blockAttestation);
310
+ const blobs = await Blob.getBlobs(block.body.toBlobFields());
311
+ const proposeTxArgs = {
312
+ header: block.header.toBuffer(),
313
+ archive: block.archive.root.toBuffer(),
314
+ blockHash: (await block.header.hash()).toBuffer(),
315
+ body: block.body.toBuffer(),
316
+ blobs,
317
+ attestations,
318
+ txHashes: txHashes ?? [],
319
+ };
320
+ // @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available
321
+ // This means that we can avoid the simulation issues in later checks.
322
+ // By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
323
+ // make time consistency checks break.
324
+ const ts = await this.validateBlockForSubmission(block.header, {
325
+ digest: digest.toBuffer(),
326
+ signatures: attestations ?? [],
327
+ });
328
+ this.log.debug(`Submitting propose transaction`);
329
+ await this.addProposeTx(block, proposeTxArgs, opts, ts);
330
+ return true;
331
+ }
332
+ /** Enqueues a claimEpochProofRight transaction to submit a chosen prover quote for the previous epoch. */
333
+ enqueueClaimEpochProofRight(proofQuote) {
334
+ const timer = new Timer();
335
+ this.addRequest({
336
+ action: 'claim',
337
+ request: {
338
+ to: this.rollupContract.address,
339
+ data: encodeFunctionData({
340
+ abi: RollupAbi,
341
+ functionName: 'claimEpochProofRight',
342
+ args: [proofQuote.toViemArgs()],
343
+ }),
344
+ },
345
+ lastValidL2Slot: this.getCurrentL2Slot(),
346
+ onResult: (_request, result) => {
347
+ if (!result) {
348
+ return;
349
+ }
350
+ const { receipt, stats } = result;
351
+ if (receipt.status === 'success') {
352
+ const publishStats = {
353
+ gasPrice: receipt.effectiveGasPrice,
354
+ gasUsed: receipt.gasUsed,
355
+ transactionHash: receipt.transactionHash,
356
+ blobDataGas: 0n,
357
+ blobGasUsed: 0n,
358
+ ...pick(stats, 'calldataGas', 'calldataSize', 'sender'),
359
+ };
360
+ this.log.verbose(`Submitted claim epoch proof right to L1 rollup contract`, {
361
+ ...publishStats,
362
+ ...proofQuote.toInspect(),
363
+ });
364
+ this.metrics.recordClaimEpochProofRightTx(timer.ms(), publishStats);
365
+ }
366
+ else {
367
+ this.metrics.recordFailedTx('claimEpochProofRight');
368
+ // TODO: Get the error message from the reverted tx
369
+ this.log.error(`Claim epoch proof right tx reverted`, {
370
+ txHash: receipt.transactionHash,
371
+ ...proofQuote.toInspect(),
372
+ });
373
+ }
374
+ },
375
+ });
376
+ return true;
377
+ }
378
+ /**
379
+ * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
380
+ * Be warned, the call may return false even if the tx subsequently gets successfully mined.
381
+ * In practice this shouldn't matter, as we'll only ever be calling `interrupt` when we know it's going to fail.
382
+ * A call to `restart` is required before you can continue publishing.
383
+ */
384
+ interrupt() {
385
+ this.interrupted = true;
386
+ this.l1TxUtils.interrupt();
387
+ }
388
+ /** Restarts the publisher after calling `interrupt`. */
389
+ restart() {
390
+ this.interrupted = false;
391
+ this.l1TxUtils.restart();
392
+ }
393
+ async prepareProposeTx(encodedData, timestamp) {
394
+ const kzg = Blob.getViemKzgInstance();
395
+ const blobInput = Blob.getEthBlobEvaluationInputs(encodedData.blobs);
396
+ this.log.debug('Validating blob input', { blobInput });
397
+ const blobEvaluationGas = await this.l1TxUtils
398
+ .estimateGas(this.l1TxUtils.walletClient.account, {
399
+ to: this.rollupContract.address,
400
+ data: encodeFunctionData({
401
+ abi: RollupAbi,
402
+ functionName: 'validateBlobs',
403
+ args: [blobInput],
404
+ }),
405
+ }, {}, {
406
+ blobs: encodedData.blobs.map(b => b.data),
407
+ kzg,
408
+ })
409
+ .catch(err => {
410
+ const { message, metaMessages } = formatViemError(err);
411
+ this.log.error(`Failed to validate blobs`, message, { metaMessages });
412
+ throw new Error('Failed to validate blobs');
413
+ });
414
+ const attestations = encodedData.attestations
415
+ ? encodedData.attestations.map(attest => attest.toViemSignature())
416
+ : [];
417
+ const txHashes = encodedData.txHashes ? encodedData.txHashes.map(txHash => txHash.toString()) : [];
418
+ const args = [
419
+ {
420
+ header: `0x${encodedData.header.toString('hex')}`,
421
+ archive: `0x${encodedData.archive.toString('hex')}`,
422
+ oracleInput: {
423
+ // We are currently not modifying these. See #9963
424
+ feeAssetPriceModifier: 0n,
425
+ provingCostModifier: 0n,
426
+ },
427
+ blockHash: `0x${encodedData.blockHash.toString('hex')}`,
428
+ txHashes,
429
+ },
430
+ attestations,
431
+ // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob and body input can be removed
432
+ `0x${encodedData.body.toString('hex')}`,
433
+ blobInput,
434
+ ];
435
+ const rollupData = encodeFunctionData({
436
+ abi: RollupAbi,
437
+ functionName: 'propose',
438
+ args,
439
+ });
440
+ const forwarderData = encodeFunctionData({
441
+ abi: ForwarderAbi,
442
+ functionName: 'forward',
443
+ args: [[this.rollupContract.address], [rollupData]],
444
+ });
445
+ const simulationResult = await this.l1TxUtils
446
+ .simulateGasUsed({
447
+ to: this.getForwarderAddress().toString(),
448
+ data: forwarderData,
449
+ gas: _a.PROPOSE_GAS_GUESS,
450
+ }, {
451
+ // @note we add 1n to the timestamp because geth implementation doesn't like simulation timestamp to be equal to the current block timestamp
452
+ time: timestamp + 1n,
453
+ // @note reth should have a 30m gas limit per block but throws errors that this tx is beyond limit
454
+ gasLimit: _a.PROPOSE_GAS_GUESS * 2n,
455
+ }, [
456
+ {
457
+ address: this.rollupContract.address,
458
+ // @note we override checkBlob to false since blobs are not part simulate()
459
+ stateDiff: [
460
+ {
461
+ slot: toHex(9n, true),
462
+ value: toHex(0n, true),
463
+ },
464
+ ],
465
+ },
466
+ ], {
467
+ // @note fallback gas estimate to use if the node doesn't support simulation API
468
+ fallbackGasEstimate: _a.PROPOSE_GAS_GUESS,
469
+ })
470
+ .catch(err => {
471
+ const { message, metaMessages } = formatViemError(err);
472
+ this.log.error(`Failed to simulate gas used`, message, { metaMessages });
473
+ throw new Error('Failed to simulate gas used');
474
+ });
475
+ return { args, blobEvaluationGas, rollupData, simulationResult };
476
+ }
477
+ async addProposeTx(block, encodedData, opts = {}, timestamp) {
478
+ const timer = new Timer();
479
+ const kzg = Blob.getViemKzgInstance();
480
+ const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, timestamp);
481
+ const startBlock = await this.l1TxUtils.getBlockNumber();
482
+ return this.addRequest({
483
+ action: 'propose',
484
+ request: {
485
+ to: this.rollupContract.address,
486
+ data: rollupData,
487
+ },
488
+ lastValidL2Slot: block.header.globalVariables.slotNumber.toBigInt(),
489
+ gasConfig: {
490
+ ...opts,
491
+ gasLimit: this.l1TxUtils.bumpGasLimit(simulationResult + blobEvaluationGas),
492
+ },
493
+ blobConfig: {
494
+ blobs: encodedData.blobs.map(b => b.data),
495
+ kzg,
496
+ },
497
+ onResult: (request, result) => {
498
+ if (!result) {
499
+ return;
500
+ }
501
+ const { receipt, stats, errorMsg } = result;
502
+ if (receipt.status === 'success') {
503
+ const endBlock = receipt.blockNumber;
504
+ const inclusionBlocks = Number(endBlock - startBlock);
505
+ const publishStats = {
506
+ gasPrice: receipt.effectiveGasPrice,
507
+ gasUsed: receipt.gasUsed,
508
+ blobGasUsed: receipt.blobGasUsed ?? 0n,
509
+ blobDataGas: receipt.blobGasPrice ?? 0n,
510
+ transactionHash: receipt.transactionHash,
511
+ ...pick(stats, 'calldataGas', 'calldataSize', 'sender'),
512
+ ...block.getStats(),
513
+ eventName: 'rollup-published-to-l1',
514
+ blobCount: encodedData.blobs.length,
515
+ inclusionBlocks,
516
+ };
517
+ this.log.verbose(`Published L2 block to L1 rollup contract`, { ...stats, ...block.getStats() });
518
+ this.metrics.recordProcessBlockTx(timer.ms(), publishStats);
519
+ // Send the blobs to the blob sink
520
+ this.sendBlobsToBlobSink(receipt.blockHash, encodedData.blobs).catch(_err => {
521
+ this.log.error('Failed to send blobs to blob sink');
522
+ });
523
+ return true;
524
+ }
525
+ else {
526
+ this.metrics.recordFailedTx('process');
527
+ this.log.error(`Rollup process tx reverted. ${errorMsg ?? 'No error message'}`, undefined, {
528
+ ...block.getStats(),
529
+ txHash: receipt.transactionHash,
530
+ blockHash: block.hash().toString(),
531
+ slotNumber: block.header.globalVariables.slotNumber.toBigInt(),
532
+ });
533
+ }
534
+ },
535
+ });
536
+ }
537
+ /**
538
+ * Send blobs to the blob sink
539
+ *
540
+ * If a blob sink url is configured, then we send blobs to the blob sink
541
+ * - for now we use the blockHash as the identifier for the blobs;
542
+ * In the future this will move to be the beacon block id - which takes a bit more work
543
+ * to calculate and will need to be mocked in e2e tests
544
+ */
545
+ sendBlobsToBlobSink(blockHash, blobs) {
546
+ return this.blobSinkClient.sendBlobsToBlobSink(blockHash, blobs);
547
+ }
548
+ }
549
+ _a = SequencerPublisher;
550
+ // @note - with blobs, the below estimate seems too large.
551
+ // Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob)
552
+ // Total used for emptier block from above test: 429k (of which 84k is 1x blob)
553
+ SequencerPublisher.PROPOSE_GAS_GUESS = 12000000n;
554
+ SequencerPublisher.PROPOSE_AND_CLAIM_GAS_GUESS = _a.PROPOSE_GAS_GUESS + 100000n;
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaXNoZXIvc2VxdWVuY2VyLXB1Ymxpc2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFnQyxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdGLE9BQU8sRUFDTCxnQkFBZ0IsRUFHaEIsd0JBQXdCLEVBRXhCLHlCQUF5QixHQUMxQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUNMLGtCQUFrQixFQVVsQixlQUFlLEdBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdFLE9BQU8sRUFBd0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUEyQixrQkFBa0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBb0I3RSxNQUFNLENBQU4sSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLG1EQUFVLENBQUE7SUFDViwrQ0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBaUJELE1B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
@@ -1,3 +1,3 @@
1
1
  import { type AllowedElement } from '@aztec/circuit-types';
2
- export declare function getDefaultAllowedSetupFunctions(): AllowedElement[];
2
+ export declare function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[]>;
3
3
  //# sourceMappingURL=allowed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"allowed.d.ts","sourceRoot":"","sources":["../../src/sequencer/allowed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,wBAAgB,+BAA+B,IAAI,cAAc,EAAE,CA2BlE"}
1
+ {"version":3,"file":"allowed.d.ts","sourceRoot":"","sources":["../../src/sequencer/allowed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CA2BjF"}
@@ -3,7 +3,7 @@ import { FPCContract } from '@aztec/noir-contracts.js/FPC';
3
3
  import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
4
4
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
5
5
  let defaultAllowedSetupFunctions = undefined;
6
- export function getDefaultAllowedSetupFunctions() {
6
+ export async function getDefaultAllowedSetupFunctions() {
7
7
  if (defaultAllowedSetupFunctions === undefined) {
8
8
  defaultAllowedSetupFunctions = [
9
9
  // needed for authwit support
@@ -14,16 +14,16 @@ export function getDefaultAllowedSetupFunctions() {
14
14
  {
15
15
  address: ProtocolContractAddress.FeeJuice,
16
16
  // We can't restrict the selector because public functions get routed via dispatch.
17
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
17
+ // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))'),
18
18
  },
19
19
  // needed for private transfers via FPC
20
20
  {
21
- classId: getContractClassFromArtifact(TokenContractArtifact).id,
21
+ classId: (await getContractClassFromArtifact(TokenContractArtifact)).id,
22
22
  // We can't restrict the selector because public functions get routed via dispatch.
23
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
23
+ // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))'),
24
24
  },
25
25
  {
26
- classId: getContractClassFromArtifact(FPCContract.artifact).id,
26
+ classId: (await getContractClassFromArtifact(FPCContract.artifact)).id,
27
27
  // We can't restrict the selector because public functions get routed via dispatch.
28
28
  // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
29
29
  },
@@ -31,4 +31,4 @@ export function getDefaultAllowedSetupFunctions() {
31
31
  }
32
32
  return defaultAllowedSetupFunctions;
33
33
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3dlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvYWxsb3dlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFcEUsSUFBSSw0QkFBNEIsR0FBaUMsU0FBUyxDQUFDO0FBRTNFLE1BQU0sVUFBVSwrQkFBK0I7SUFDN0MsSUFBSSw0QkFBNEIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQyw0QkFBNEIsR0FBRztZQUM3Qiw2QkFBNkI7WUFDN0I7Z0JBQ0UsT0FBTyxFQUFFLHVCQUF1QixDQUFDLFlBQVk7YUFDOUM7WUFDRCxnREFBZ0Q7WUFDaEQ7Z0JBQ0UsT0FBTyxFQUFFLHVCQUF1QixDQUFDLFFBQVE7Z0JBQ3pDLG1GQUFtRjtnQkFDbkYsdUZBQXVGO2FBQ3hGO1lBQ0QsdUNBQXVDO1lBQ3ZDO2dCQUNFLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9ELG1GQUFtRjtnQkFDbkYsdUZBQXVGO2FBQ3hGO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO2dCQUM5RCxtRkFBbUY7Z0JBQ25GLHdGQUF3RjthQUN6RjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyw0QkFBNEIsQ0FBQztBQUN0QyxDQUFDIn0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3dlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvYWxsb3dlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFcEUsSUFBSSw0QkFBNEIsR0FBaUMsU0FBUyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsK0JBQStCO0lBQ25ELElBQUksNEJBQTRCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0MsNEJBQTRCLEdBQUc7WUFDN0IsNkJBQTZCO1lBQzdCO2dCQUNFLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxZQUFZO2FBQzlDO1lBQ0QsZ0RBQWdEO1lBQ2hEO2dCQUNFLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxRQUFRO2dCQUN6QyxtRkFBbUY7Z0JBQ25GLCtGQUErRjthQUNoRztZQUNELHVDQUF1QztZQUN2QztnQkFDRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLDRCQUE0QixDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2RSxtRkFBbUY7Z0JBQ25GLCtGQUErRjthQUNoRztZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDLE1BQU0sNEJBQTRCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEUsbUZBQW1GO2dCQUNuRix3RkFBd0Y7YUFDekY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sNEJBQTRCLENBQUM7QUFDdEMsQ0FBQyJ9
@@ -15,7 +15,7 @@ export declare class SequencerMetrics {
15
15
  recordTimeToCollectAttestations(time: number): void;
16
16
  recordBlockBuilderTreeInsertions(timeUs: number): void;
17
17
  recordCancelledBlock(): void;
18
- recordPublishedBlock(buildDurationMs: number, totalMana: number): void;
18
+ recordBuiltBlock(buildDurationMs: number, totalMana: number): void;
19
19
  recordFailedBlock(): void;
20
20
  recordNewBlock(blockNumber: number, txCount: number): void;
21
21
  recordStateTransitionBufferMs(durationMs: number, state: SequencerState): void;