@aztec/sequencer-client 0.73.0 → 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.
@@ -109,22 +109,22 @@ export class SlasherClient extends WithTracer {
109
109
  return EthAddress.fromString(payloadAddress);
110
110
  }
111
111
  getL2BlockHash(number) {
112
- return Promise.resolve(this.synchedBlockHashes.get(number));
112
+ return this.synchedBlockHashes.getAsync(number);
113
113
  }
114
- getL2Tips() {
115
- const latestBlockNumber = this.getSyncedLatestBlockNum();
114
+ async getL2Tips() {
115
+ const latestBlockNumber = await this.getSyncedLatestBlockNum();
116
116
  let latestBlockHash;
117
- const provenBlockNumber = this.getSyncedProvenBlockNum();
117
+ const provenBlockNumber = await this.getSyncedProvenBlockNum();
118
118
  let provenBlockHash;
119
119
  if (latestBlockNumber > 0) {
120
- latestBlockHash = this.synchedBlockHashes.get(latestBlockNumber);
120
+ latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
121
121
  if (typeof latestBlockHash === 'undefined') {
122
122
  this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
123
123
  throw new Error();
124
124
  }
125
125
  }
126
126
  if (provenBlockNumber > 0) {
127
- provenBlockHash = this.synchedBlockHashes.get(provenBlockNumber);
127
+ provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
128
128
  if (typeof provenBlockHash === 'undefined') {
129
129
  this.log.warn(`Block hash for proven block ${provenBlockNumber} not found`);
130
130
  throw new Error();
@@ -146,7 +146,7 @@ export class SlasherClient extends WithTracer {
146
146
  // TODO (alexg): I think we can prune the block hashes map here
147
147
  break;
148
148
  case 'chain-proven': {
149
- const from = this.getSyncedProvenBlockNum() + 1;
149
+ const from = (await this.getSyncedProvenBlockNum()) + 1;
150
150
  const limit = event.blockNumber - from + 1;
151
151
  await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
152
152
  break;
@@ -170,8 +170,8 @@ export class SlasherClient extends WithTracer {
170
170
  // get the current latest block numbers
171
171
  this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
172
172
  this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
173
- const syncedLatestBlock = this.getSyncedLatestBlockNum() + 1;
174
- const syncedProvenBlock = this.getSyncedProvenBlockNum() + 1;
173
+ const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
174
+ const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
175
175
  // if there are blocks to be retrieved, go to a synching state
176
176
  if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
177
177
  this.setCurrentState(SlasherClientState.SYNCHING);
@@ -198,6 +198,8 @@ export class SlasherClient extends WithTracer {
198
198
  this.log.debug('Stopping Slasher client...');
199
199
  await this.blockStream.stop();
200
200
  this.log.debug('Stopped block downloader');
201
+ await this.store.close();
202
+ this.log.debug('Stopped slasher store');
201
203
  this.setCurrentState(SlasherClientState.STOPPED);
202
204
  this.log.info('Slasher client stopped.');
203
205
  }
@@ -212,22 +214,22 @@ export class SlasherClient extends WithTracer {
212
214
  * Public function to check the latest block number that the slasher client is synced to.
213
215
  * @returns Block number of latest L2 Block we've synced with.
214
216
  */
215
- getSyncedLatestBlockNum() {
216
- return this.synchedLatestBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
217
+ async getSyncedLatestBlockNum() {
218
+ return (await this.synchedLatestBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
217
219
  }
218
220
  /**
219
221
  * Public function to check the latest proven block number that the slasher client is synced to.
220
222
  * @returns Block number of latest proven L2 Block we've synced with.
221
223
  */
222
- getSyncedProvenBlockNum() {
223
- return this.synchedProvenBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
224
+ async getSyncedProvenBlockNum() {
225
+ return (await this.synchedProvenBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
224
226
  }
225
227
  /**
226
228
  * Method to check the status of the slasher client.
227
229
  * @returns Information about slasher client status: state & syncedToBlockNum.
228
230
  */
229
231
  async getStatus() {
230
- const blockNumber = this.getSyncedLatestBlockNum();
232
+ const blockNumber = await this.getSyncedLatestBlockNum();
231
233
  const blockHash = blockNumber == 0
232
234
  ? ''
233
235
  : await this.l2BlockSource
@@ -246,13 +248,16 @@ export class SlasherClient extends WithTracer {
246
248
  */
247
249
  async handleLatestL2Blocks(blocks) {
248
250
  if (!blocks.length) {
249
- return Promise.resolve();
251
+ return;
250
252
  }
251
- const lastBlockNum = blocks[blocks.length - 1].number;
252
- await Promise.all(blocks.map(async (block) => this.synchedBlockHashes.set(block.number, (await block.hash()).toString())));
253
- await this.synchedLatestBlockNumber.set(lastBlockNum);
254
- this.log.debug(`Synched to latest block ${lastBlockNum}`);
255
- this.startServiceIfSynched();
253
+ await this.store.transactionAsync(async () => {
254
+ for (const block of blocks) {
255
+ await this.synchedBlockHashes.set(block.number, (await block.hash()).toString());
256
+ }
257
+ const lastBlockNum = blocks[blocks.length - 1].number;
258
+ await this.synchedLatestBlockNumber.set(lastBlockNum);
259
+ });
260
+ await this.startServiceIfSynched();
256
261
  }
257
262
  /**
258
263
  * Handles new proven blocks by updating the proven block number
@@ -266,7 +271,7 @@ export class SlasherClient extends WithTracer {
266
271
  const lastBlockNum = blocks[blocks.length - 1].number;
267
272
  await this.synchedProvenBlockNumber.set(lastBlockNum);
268
273
  this.log.debug(`Synched to proven block ${lastBlockNum}`);
269
- this.startServiceIfSynched();
274
+ await this.startServiceIfSynched();
270
275
  }
271
276
  async handlePruneL2Blocks(latestBlock) {
272
277
  const blockHeader = await this.l2BlockSource.getBlockHeader(latestBlock);
@@ -284,10 +289,14 @@ export class SlasherClient extends WithTracer {
284
289
  });
285
290
  await this.synchedLatestBlockNumber.set(latestBlock);
286
291
  }
287
- startServiceIfSynched() {
292
+ async startServiceIfSynched() {
293
+ const [latestBlock, provenBlock] = await Promise.all([
294
+ this.getSyncedLatestBlockNum(),
295
+ this.getSyncedProvenBlockNum(),
296
+ ]);
288
297
  if (this.currentState === SlasherClientState.SYNCHING &&
289
- this.getSyncedLatestBlockNum() >= this.latestBlockNumberAtStart &&
290
- this.getSyncedProvenBlockNum() >= this.provenBlockNumberAtStart) {
298
+ latestBlock >= this.latestBlockNumberAtStart &&
299
+ provenBlock >= this.provenBlockNumberAtStart) {
291
300
  this.log.debug(`Synched to blocks at start`);
292
301
  this.setCurrentState(SlasherClientState.RUNNING);
293
302
  if (this.syncResolve !== undefined) {
@@ -304,4 +313,4 @@ export class SlasherClient extends WithTracer {
304
313
  this.log.debug(`Moved to state ${SlasherClientState[this.currentState]}`);
305
314
  }
306
315
  }
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0YsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUFtQixFQUNuQixhQUE0QixFQUNwQyxZQUE2QixrQkFBa0IsRUFBRSxFQUN6QyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFckMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU5wQixXQUFNLEdBQU4s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
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0YsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUF3QixFQUN4QixhQUE0QixFQUNwQyxZQUE2QixrQkFBa0IsRUFBRSxFQUN6QyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFckMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU5wQixXQUFNLEdBQU4s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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.73.0",
3
+ "version": "0.74.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -28,26 +28,26 @@
28
28
  "test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
29
29
  },
30
30
  "dependencies": {
31
- "@aztec/aztec.js": "0.73.0",
32
- "@aztec/bb-prover": "0.73.0",
33
- "@aztec/blob-sink": "0.73.0",
34
- "@aztec/circuit-types": "0.73.0",
35
- "@aztec/circuits.js": "0.73.0",
36
- "@aztec/epoch-cache": "0.73.0",
37
- "@aztec/ethereum": "0.73.0",
38
- "@aztec/foundation": "0.73.0",
39
- "@aztec/l1-artifacts": "0.73.0",
40
- "@aztec/merkle-tree": "0.73.0",
41
- "@aztec/noir-contracts.js": "0.73.0",
42
- "@aztec/noir-protocol-circuits-types": "0.73.0",
43
- "@aztec/p2p": "0.73.0",
44
- "@aztec/protocol-contracts": "0.73.0",
45
- "@aztec/prover-client": "0.73.0",
46
- "@aztec/simulator": "0.73.0",
47
- "@aztec/telemetry-client": "0.73.0",
48
- "@aztec/types": "0.73.0",
49
- "@aztec/validator-client": "0.73.0",
50
- "@aztec/world-state": "0.73.0",
31
+ "@aztec/aztec.js": "0.74.0",
32
+ "@aztec/bb-prover": "0.74.0",
33
+ "@aztec/blob-sink": "0.74.0",
34
+ "@aztec/circuit-types": "0.74.0",
35
+ "@aztec/circuits.js": "0.74.0",
36
+ "@aztec/epoch-cache": "0.74.0",
37
+ "@aztec/ethereum": "0.74.0",
38
+ "@aztec/foundation": "0.74.0",
39
+ "@aztec/l1-artifacts": "0.74.0",
40
+ "@aztec/merkle-tree": "0.74.0",
41
+ "@aztec/noir-contracts.js": "0.74.0",
42
+ "@aztec/noir-protocol-circuits-types": "0.74.0",
43
+ "@aztec/p2p": "0.74.0",
44
+ "@aztec/protocol-contracts": "0.74.0",
45
+ "@aztec/prover-client": "0.74.0",
46
+ "@aztec/simulator": "0.74.0",
47
+ "@aztec/telemetry-client": "0.74.0",
48
+ "@aztec/types": "0.74.0",
49
+ "@aztec/validator-client": "0.74.0",
50
+ "@aztec/world-state": "0.74.0",
51
51
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
52
52
  "@noir-lang/types": "portal:../../noir/packages/types",
53
53
  "lodash.chunk": "^4.2.0",
@@ -4,8 +4,10 @@ import { type AztecAddress, type ContractDataSource } from '@aztec/circuits.js';
4
4
  import { EpochCache } from '@aztec/epoch-cache';
5
5
  import {
6
6
  ForwarderContract,
7
+ GovernanceProposerContract,
7
8
  L1TxUtilsWithBlobs,
8
9
  RollupContract,
10
+ SlashingProposerContract,
9
11
  createEthereumChain,
10
12
  createL1Clients,
11
13
  isAnvilTestChain,
@@ -84,8 +86,25 @@ export class SequencerClient {
84
86
  ] as const);
85
87
  const forwarderContract =
86
88
  config.customForwarderContractAddress && config.customForwarderContractAddress !== EthAddress.ZERO
87
- ? new ForwarderContract(publicClient, config.customForwarderContractAddress.toString())
88
- : await ForwarderContract.create(walletClient.account.address, walletClient, publicClient, log);
89
+ ? new ForwarderContract(
90
+ publicClient,
91
+ config.customForwarderContractAddress.toString(),
92
+ config.l1Contracts.rollupAddress.toString(),
93
+ )
94
+ : await ForwarderContract.create(
95
+ walletClient.account.address,
96
+ walletClient,
97
+ publicClient,
98
+ log,
99
+ config.l1Contracts.rollupAddress.toString(),
100
+ );
101
+
102
+ const governanceProposerContract = new GovernanceProposerContract(
103
+ publicClient,
104
+ config.l1Contracts.governanceProposerAddress.toString(),
105
+ );
106
+ const slashingProposerAddress = await rollupContract.getSlashingProposerAddress();
107
+ const slashingProposerContract = new SlashingProposerContract(publicClient, slashingProposerAddress.toString());
89
108
  const epochCache =
90
109
  deps.epochCache ??
91
110
  (await EpochCache.create(
@@ -110,6 +129,8 @@ export class SequencerClient {
110
129
  rollupContract,
111
130
  epochCache,
112
131
  forwarderContract,
132
+ governanceProposerContract,
133
+ slashingProposerContract,
113
134
  });
114
135
  const globalsBuilder = new GlobalVariableBuilder(config);
115
136
 
@@ -14,25 +14,28 @@ import {
14
14
  FormattedViemError,
15
15
  type ForwarderContract,
16
16
  type GasPrice,
17
+ type GovernanceProposerContract,
18
+ type IEmpireBase,
17
19
  type L1BlobInputs,
18
20
  type L1ContractsConfig,
19
21
  type L1GasConfig,
20
22
  type L1TxRequest,
21
23
  type L1TxUtilsWithBlobs,
22
- type RollupContract,
24
+ RollupContract,
25
+ type SlashingProposerContract,
23
26
  type TransactionStats,
24
27
  formatViemError,
25
28
  } from '@aztec/ethereum';
26
29
  import { toHex } from '@aztec/foundation/bigint-buffer';
27
30
  import { Blob } from '@aztec/foundation/blob';
28
31
  import { type Signature } from '@aztec/foundation/eth-signature';
29
- import { type Logger, createLogger } from '@aztec/foundation/log';
32
+ import { createLogger } from '@aztec/foundation/log';
30
33
  import { Timer } from '@aztec/foundation/timer';
31
- import { EmpireBaseAbi, ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
34
+ import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
32
35
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
33
36
 
34
37
  import pick from 'lodash.pick';
35
- import { type TransactionReceipt, encodeFunctionData, getAddress, getContract } from 'viem';
38
+ import { type TransactionReceipt, encodeFunctionData } from 'viem';
36
39
 
37
40
  import { type PublisherConfig, type TxSenderConfig } from './config.js';
38
41
  import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
@@ -106,6 +109,8 @@ export class SequencerPublisher {
106
109
 
107
110
  public l1TxUtils: L1TxUtilsWithBlobs;
108
111
  public rollupContract: RollupContract;
112
+ public govProposerContract: GovernanceProposerContract;
113
+ public slashingProposerContract: SlashingProposerContract;
109
114
 
110
115
  protected requests: RequestWithExpiry[] = [];
111
116
 
@@ -117,15 +122,14 @@ export class SequencerPublisher {
117
122
  forwarderContract: ForwarderContract;
118
123
  l1TxUtils: L1TxUtilsWithBlobs;
119
124
  rollupContract: RollupContract;
125
+ slashingProposerContract: SlashingProposerContract;
126
+ governanceProposerContract: GovernanceProposerContract;
120
127
  epochCache: EpochCache;
121
128
  },
122
129
  ) {
123
130
  this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
124
131
  this.epochCache = deps.epochCache;
125
132
 
126
- if (config.l1Contracts.governanceProposerAddress) {
127
- this.governanceProposerAddress = EthAddress.fromString(config.l1Contracts.governanceProposerAddress.toString());
128
- }
129
133
  this.blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
130
134
 
131
135
  const telemetry = deps.telemetry ?? getTelemetryClient();
@@ -134,6 +138,9 @@ export class SequencerPublisher {
134
138
 
135
139
  this.rollupContract = deps.rollupContract;
136
140
  this.forwarderContract = deps.forwarderContract;
141
+
142
+ this.govProposerContract = deps.governanceProposerContract;
143
+ this.slashingProposerContract = deps.slashingProposerContract;
137
144
  }
138
145
 
139
146
  public registerSlashPayloadGetter(callback: GetSlashPayloadCallBack) {
@@ -221,12 +228,13 @@ export class SequencerPublisher {
221
228
  this.l1TxUtils,
222
229
  gasConfig,
223
230
  blobConfig,
231
+ this.log,
224
232
  );
225
233
  this.callbackBundledTransactions(validRequests, result);
226
234
  return result;
227
235
  } catch (err) {
228
- const { message, metaMessages } = formatViemError(err);
229
- this.log.error(`Failed to publish bundled transactions`, message, { metaMessages });
236
+ const viemError = formatViemError(err);
237
+ this.log.error(`Failed to publish bundled transactions`, viemError);
230
238
  return undefined;
231
239
  }
232
240
  }
@@ -249,7 +257,7 @@ export class SequencerPublisher {
249
257
  * @returns The slot and block number if it is possible to propose, undefined otherwise
250
258
  */
251
259
  public canProposeAtNextEthBlock(tipArchive: Buffer) {
252
- const ignoredErrors = ['SlotAlreadyInChain', 'InvalidProposer'];
260
+ const ignoredErrors = ['SlotAlreadyInChain', 'InvalidProposer', 'InvalidArchive'];
253
261
  return this.rollupContract
254
262
  .canProposeAtNextEthBlock(tipArchive, this.getForwarderAddress().toString(), this.ethereumSlotDuration)
255
263
  .catch(err => {
@@ -335,114 +343,85 @@ export class SequencerPublisher {
335
343
  return committee.map(EthAddress.fromString);
336
344
  }
337
345
 
338
- /**
339
- * Enqueues a castVote transaction to cast a vote for a given slot number.
340
- * @param slotNumber - The slot number to cast a vote for.
341
- * @param timestamp - The timestamp of the slot to cast a vote for.
342
- * @param voteType - The type of vote to cast.
343
- * @returns True if the vote was successfully enqueued, false otherwise.
344
- */
345
- public async enqueueCastVote(slotNumber: bigint, timestamp: bigint, voteType: VoteType): Promise<boolean> {
346
- // @todo This function can be optimized by doing some of the computations locally instead of calling the L1 contracts
346
+ private async enqueueCastVoteHelper(
347
+ slotNumber: bigint,
348
+ timestamp: bigint,
349
+ voteType: VoteType,
350
+ payload: EthAddress,
351
+ base: IEmpireBase,
352
+ ): Promise<boolean> {
347
353
  if (this.myLastVotes[voteType] >= slotNumber) {
348
354
  return false;
349
355
  }
350
-
351
- const voteConfig = async (): Promise<
352
- { payload: EthAddress; voteContractAddress: EthAddress; logger: Logger } | undefined
353
- > => {
354
- if (voteType === VoteType.GOVERNANCE) {
355
- if (this.governancePayload.equals(EthAddress.ZERO)) {
356
- return undefined;
357
- }
358
- if (!this.governanceProposerAddress) {
359
- return undefined;
360
- }
361
- return {
362
- payload: this.governancePayload,
363
- voteContractAddress: this.governanceProposerAddress,
364
- logger: this.governanceLog,
365
- };
366
- } else if (voteType === VoteType.SLASHING) {
367
- if (!this.getSlashPayload) {
368
- return undefined;
369
- }
370
- const slashingProposerAddress = await this.rollupContract.getSlashingProposerAddress();
371
- if (!slashingProposerAddress) {
372
- return undefined;
373
- }
374
-
375
- const slashPayload = await this.getSlashPayload(slotNumber);
376
-
377
- if (!slashPayload) {
378
- return undefined;
379
- }
380
-
381
- return {
382
- payload: slashPayload,
383
- voteContractAddress: slashingProposerAddress,
384
- logger: this.slashingLog,
385
- };
386
- } else {
387
- throw new Error('Invalid vote type');
388
- }
389
- };
390
-
391
- const vConfig = await voteConfig();
392
-
393
- if (!vConfig) {
356
+ if (payload.equals(EthAddress.ZERO)) {
394
357
  return false;
395
358
  }
396
-
397
- const { payload, voteContractAddress } = vConfig;
398
-
399
- const voteContract = getContract({
400
- address: getAddress(voteContractAddress.toString()),
401
- abi: EmpireBaseAbi,
402
- client: this.l1TxUtils.walletClient,
403
- });
404
-
405
- const [proposer, roundNumber] = await Promise.all([
359
+ const round = await base.computeRound(slotNumber);
360
+ const [proposer, roundInfo] = await Promise.all([
406
361
  this.rollupContract.getProposerAt(timestamp),
407
- voteContract.read.computeRound([slotNumber]),
362
+ base.getRoundInfo(this.rollupContract.address, round),
408
363
  ]);
409
364
 
410
365
  if (proposer.toLowerCase() !== this.getForwarderAddress().toString().toLowerCase()) {
411
366
  return false;
412
367
  }
413
-
414
- const [slotForLastVote] = await voteContract.read.rounds([this.rollupContract.address, roundNumber]);
415
-
416
- if (slotForLastVote >= slotNumber) {
368
+ if (roundInfo.lastVote >= slotNumber) {
417
369
  return false;
418
370
  }
419
371
 
420
372
  const cachedLastVote = this.myLastVotes[voteType];
421
-
422
373
  this.myLastVotes[voteType] = slotNumber;
423
374
 
424
375
  this.addRequest({
425
376
  action: voteType === VoteType.GOVERNANCE ? 'governance-vote' : 'slashing-vote',
426
- request: {
427
- to: voteContractAddress.toString(),
428
- data: encodeFunctionData({
429
- abi: EmpireBaseAbi,
430
- functionName: 'vote',
431
- args: [payload.toString()],
432
- }),
433
- },
377
+ request: base.createVoteRequest(payload.toString()),
434
378
  lastValidL2Slot: slotNumber,
435
379
  onResult: (_request, result) => {
436
380
  if (!result || result.receipt.status !== 'success') {
437
381
  this.myLastVotes[voteType] = cachedLastVote;
438
382
  } else {
439
- this.log.info(`Cast ${voteType} vote for slot ${slotNumber}`);
383
+ this.log.info(`Cast [${voteType}] vote for slot ${slotNumber}`);
440
384
  }
441
385
  },
442
386
  });
443
387
  return true;
444
388
  }
445
389
 
390
+ private async getVoteConfig(
391
+ slotNumber: bigint,
392
+ voteType: VoteType,
393
+ ): Promise<{ payload: EthAddress; base: IEmpireBase } | undefined> {
394
+ if (voteType === VoteType.GOVERNANCE) {
395
+ return { payload: this.governancePayload, base: this.govProposerContract };
396
+ } else if (voteType === VoteType.SLASHING) {
397
+ if (!this.getSlashPayload) {
398
+ return undefined;
399
+ }
400
+ const slashPayload = await this.getSlashPayload(slotNumber);
401
+ if (!slashPayload) {
402
+ return undefined;
403
+ }
404
+ return { payload: slashPayload, base: this.slashingProposerContract };
405
+ }
406
+ throw new Error('Unreachable: Invalid vote type');
407
+ }
408
+
409
+ /**
410
+ * Enqueues a castVote transaction to cast a vote for a given slot number.
411
+ * @param slotNumber - The slot number to cast a vote for.
412
+ * @param timestamp - The timestamp of the slot to cast a vote for.
413
+ * @param voteType - The type of vote to cast.
414
+ * @returns True if the vote was successfully enqueued, false otherwise.
415
+ */
416
+ public async enqueueCastVote(slotNumber: bigint, timestamp: bigint, voteType: VoteType): Promise<boolean> {
417
+ const voteConfig = await this.getVoteConfig(slotNumber, voteType);
418
+ if (!voteConfig) {
419
+ return false;
420
+ }
421
+ const { payload, base } = voteConfig;
422
+ return this.enqueueCastVoteHelper(slotNumber, timestamp, voteType, payload, base);
423
+ }
424
+
446
425
  /**
447
426
  * Proposes a L2 block on L1.
448
427
  *
@@ -627,7 +606,7 @@ export class SequencerPublisher {
627
606
  // @note we override checkBlob to false since blobs are not part simulate()
628
607
  stateDiff: [
629
608
  {
630
- slot: toHex(9n, true),
609
+ slot: toHex(RollupContract.checkBlobStorageSlot, true),
631
610
  value: toHex(0n, true),
632
611
  },
633
612
  ],
@@ -657,6 +636,7 @@ export class SequencerPublisher {
657
636
  const kzg = Blob.getViemKzgInstance();
658
637
  const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, timestamp);
659
638
  const startBlock = await this.l1TxUtils.getBlockNumber();
639
+ const blockHash = await block.hash();
660
640
 
661
641
  return this.addRequest({
662
642
  action: 'propose',
@@ -708,7 +688,7 @@ export class SequencerPublisher {
708
688
  this.log.error(`Rollup process tx reverted. ${errorMsg ?? 'No error message'}`, undefined, {
709
689
  ...block.getStats(),
710
690
  txHash: receipt.transactionHash,
711
- blockHash: block.hash().toString(),
691
+ blockHash,
712
692
  slotNumber: block.header.globalVariables.slotNumber.toBigInt(),
713
693
  });
714
694
  }
@@ -1,9 +1,9 @@
1
1
  import type { L2BlockSource } from '@aztec/circuit-types';
2
2
  import { type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
- import { type AztecKVStore } from '@aztec/kv-store';
4
+ import { type AztecAsyncKVStore } from '@aztec/kv-store';
5
5
  import { type DataStoreConfig } from '@aztec/kv-store/config';
6
- import { createStore } from '@aztec/kv-store/lmdb';
6
+ import { createStore } from '@aztec/kv-store/lmdb-v2';
7
7
  import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
8
8
 
9
9
  import { SlasherClient } from './slasher_client.js';
@@ -13,7 +13,7 @@ export const createSlasherClient = async (
13
13
  _config: SlasherConfig & DataStoreConfig & L1ContractsConfig & L1ReaderConfig,
14
14
  l2BlockSource: L2BlockSource,
15
15
  telemetry: TelemetryClient = getTelemetryClient(),
16
- deps: { store?: AztecKVStore } = {},
16
+ deps: { store?: AztecAsyncKVStore } = {},
17
17
  ) => {
18
18
  const config = { ..._config };
19
19
  const store = deps.store ?? (await createStore('slasher', config, createLogger('slasher:lmdb')));