@aztec/sequencer-client 0.73.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (88) hide show
  1. package/dest/client/index.js +0 -1
  2. package/dest/client/sequencer-client.js +55 -55
  3. package/dest/config.js +40 -42
  4. package/dest/global_variable_builder/global_builder.js +39 -26
  5. package/dest/global_variable_builder/index.js +0 -1
  6. package/dest/index.js +0 -1
  7. package/dest/publisher/config.js +49 -50
  8. package/dest/publisher/index.js +0 -1
  9. package/dest/publisher/sequencer-publisher-metrics.js +32 -23
  10. package/dest/publisher/sequencer-publisher.js +251 -253
  11. package/dest/sequencer/allowed.js +5 -12
  12. package/dest/sequencer/config.js +1 -2
  13. package/dest/sequencer/index.js +0 -1
  14. package/dest/sequencer/metrics.js +26 -18
  15. package/dest/sequencer/sequencer.js +648 -607
  16. package/dest/sequencer/timetable.js +33 -19
  17. package/dest/sequencer/utils.js +22 -32
  18. package/dest/slasher/factory.js +6 -5
  19. package/dest/slasher/index.js +0 -1
  20. package/dest/slasher/slasher_client.js +128 -122
  21. package/dest/test/index.js +4 -1
  22. package/dest/tx_validator/archive_cache.js +7 -7
  23. package/dest/tx_validator/gas_validator.js +76 -64
  24. package/dest/tx_validator/nullifier_cache.js +8 -8
  25. package/dest/tx_validator/phases_validator.js +27 -19
  26. package/dest/tx_validator/test_utils.js +1 -2
  27. package/dest/tx_validator/tx_validator_factory.js +5 -5
  28. package/package.json +23 -22
  29. package/src/client/sequencer-client.ts +23 -2
  30. package/src/config.ts +1 -1
  31. package/src/publisher/sequencer-publisher.ts +71 -91
  32. package/src/sequencer/sequencer.ts +29 -13
  33. package/src/slasher/factory.ts +3 -3
  34. package/src/slasher/slasher_client.ts +40 -31
  35. package/dest/client/index.d.ts +0 -2
  36. package/dest/client/index.d.ts.map +0 -1
  37. package/dest/client/sequencer-client.d.ts +0 -68
  38. package/dest/client/sequencer-client.d.ts.map +0 -1
  39. package/dest/config.d.ts +0 -37
  40. package/dest/config.d.ts.map +0 -1
  41. package/dest/global_variable_builder/global_builder.d.ts +0 -29
  42. package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
  43. package/dest/global_variable_builder/index.d.ts +0 -2
  44. package/dest/global_variable_builder/index.d.ts.map +0 -1
  45. package/dest/index.d.ts +0 -8
  46. package/dest/index.d.ts.map +0 -1
  47. package/dest/publisher/config.d.ts +0 -38
  48. package/dest/publisher/config.d.ts.map +0 -1
  49. package/dest/publisher/index.d.ts +0 -2
  50. package/dest/publisher/index.d.ts.map +0 -1
  51. package/dest/publisher/sequencer-publisher-metrics.d.ts +0 -24
  52. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +0 -1
  53. package/dest/publisher/sequencer-publisher.d.ts +0 -158
  54. package/dest/publisher/sequencer-publisher.d.ts.map +0 -1
  55. package/dest/sequencer/allowed.d.ts +0 -3
  56. package/dest/sequencer/allowed.d.ts.map +0 -1
  57. package/dest/sequencer/config.d.ts +0 -2
  58. package/dest/sequencer/config.d.ts.map +0 -1
  59. package/dest/sequencer/index.d.ts +0 -4
  60. package/dest/sequencer/index.d.ts.map +0 -1
  61. package/dest/sequencer/metrics.d.ts +0 -24
  62. package/dest/sequencer/metrics.d.ts.map +0 -1
  63. package/dest/sequencer/sequencer.d.ts +0 -172
  64. package/dest/sequencer/sequencer.d.ts.map +0 -1
  65. package/dest/sequencer/timetable.d.ts +0 -38
  66. package/dest/sequencer/timetable.d.ts.map +0 -1
  67. package/dest/sequencer/utils.d.ts +0 -47
  68. package/dest/sequencer/utils.d.ts.map +0 -1
  69. package/dest/slasher/factory.d.ts +0 -11
  70. package/dest/slasher/factory.d.ts.map +0 -1
  71. package/dest/slasher/index.d.ts +0 -3
  72. package/dest/slasher/index.d.ts.map +0 -1
  73. package/dest/slasher/slasher_client.d.ts +0 -127
  74. package/dest/slasher/slasher_client.d.ts.map +0 -1
  75. package/dest/test/index.d.ts +0 -17
  76. package/dest/test/index.d.ts.map +0 -1
  77. package/dest/tx_validator/archive_cache.d.ts +0 -14
  78. package/dest/tx_validator/archive_cache.d.ts.map +0 -1
  79. package/dest/tx_validator/gas_validator.d.ts +0 -12
  80. package/dest/tx_validator/gas_validator.d.ts.map +0 -1
  81. package/dest/tx_validator/nullifier_cache.d.ts +0 -16
  82. package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
  83. package/dest/tx_validator/phases_validator.d.ts +0 -11
  84. package/dest/tx_validator/phases_validator.d.ts.map +0 -1
  85. package/dest/tx_validator/test_utils.d.ts +0 -21
  86. package/dest/tx_validator/test_utils.d.ts.map +0 -1
  87. package/dest/tx_validator/tx_validator_factory.d.ts +0 -16
  88. package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
@@ -2,23 +2,23 @@ import { MerkleTreeId } from '@aztec/circuit-types';
2
2
  /**
3
3
  * Implements a nullifier source by checking a DB and an in-memory collection.
4
4
  * Intended for validating transactions as they are added to a block.
5
- */
6
- export class NullifierCache {
7
- constructor(db) {
5
+ */ export class NullifierCache {
6
+ db;
7
+ nullifiers;
8
+ constructor(db){
8
9
  this.db = db;
9
10
  this.nullifiers = new Set();
10
11
  }
11
12
  async nullifiersExist(nullifiers) {
12
- const cacheResults = nullifiers.map(n => this.nullifiers.has(n.toString()));
13
- const toCheckDb = nullifiers.filter((_n, index) => !cacheResults[index]);
13
+ const cacheResults = nullifiers.map((n)=>this.nullifiers.has(n.toString()));
14
+ const toCheckDb = nullifiers.filter((_n, index)=>!cacheResults[index]);
14
15
  const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
15
16
  let dbIndex = 0;
16
- return nullifiers.map((_n, index) => cacheResults[index] || dbHits[dbIndex++] !== undefined);
17
+ return nullifiers.map((_n, index)=>cacheResults[index] || dbHits[dbIndex++] !== undefined);
17
18
  }
18
19
  addNullifiers(nullifiers) {
19
- for (const nullifier of nullifiers) {
20
+ for (const nullifier of nullifiers){
20
21
  this.nullifiers.add(nullifier.toString());
21
22
  }
22
23
  }
23
24
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVyX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9udWxsaWZpZXJfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBaUMsTUFBTSxzQkFBc0IsQ0FBQztBQUduRjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixFQUE0QjtRQUE1QixPQUFFLEdBQUYsRUFBRSxDQUEwQjtRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBb0I7UUFDL0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUFvQjtRQUN2QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -1,12 +1,13 @@
1
- var _PhasesTxValidator_log;
2
- import { __classPrivateFieldGet } from "tslib";
3
- import { Tx, TxExecutionPhase, } from '@aztec/circuit-types';
1
+ import { Tx, TxExecutionPhase } from '@aztec/circuit-types';
4
2
  import { createLogger } from '@aztec/foundation/log';
5
3
  import { ContractsDataSourcePublicDB, getExecutionRequestsByPhase } from '@aztec/simulator/server';
6
4
  export class PhasesTxValidator {
7
- constructor(contracts, setupAllowList) {
5
+ setupAllowList;
6
+ #log;
7
+ contractDataSource;
8
+ constructor(contracts, setupAllowList){
8
9
  this.setupAllowList = setupAllowList;
9
- _PhasesTxValidator_log.set(this, createLogger('sequencer:tx_validator:tx_phases'));
10
+ this.#log = createLogger('sequencer:tx_validator:tx_phases');
10
11
  this.contractDataSource = new ContractsDataSourcePublicDB(contracts);
11
12
  }
12
13
  async validateTx(tx) {
@@ -16,19 +17,29 @@ export class PhasesTxValidator {
16
17
  // which is what we're trying to do as part of the current txs.
17
18
  await this.contractDataSource.addNewContracts(tx);
18
19
  if (!tx.data.forPublic) {
19
- __classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
20
- return { result: 'valid' };
20
+ this.#log.debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
21
+ return {
22
+ result: 'valid'
23
+ };
21
24
  }
22
25
  const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
23
- for (const setupFn of setupFns) {
24
- if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
25
- __classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.callContext.contractAddress}:${setupFn.callContext.functionSelector}`, { allowList: this.setupAllowList });
26
- return { result: 'invalid', reason: ['Setup function not on allow list'] };
26
+ for (const setupFn of setupFns){
27
+ if (!await this.isOnAllowList(setupFn, this.setupAllowList)) {
28
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.callContext.contractAddress}:${setupFn.callContext.functionSelector}`, {
29
+ allowList: this.setupAllowList
30
+ });
31
+ return {
32
+ result: 'invalid',
33
+ reason: [
34
+ 'Setup function not on allow list'
35
+ ]
36
+ };
27
37
  }
28
38
  }
29
- return { result: 'valid' };
30
- }
31
- finally {
39
+ return {
40
+ result: 'valid'
41
+ };
42
+ } finally{
32
43
  await this.contractDataSource.removeNewContracts(tx);
33
44
  }
34
45
  }
@@ -38,7 +49,7 @@ export class PhasesTxValidator {
38
49
  }
39
50
  const { contractAddress, functionSelector } = publicCall.callContext;
40
51
  // do these checks first since they don't require the contract class
41
- for (const entry of allowList) {
52
+ for (const entry of allowList){
42
53
  if ('address' in entry && !('selector' in entry)) {
43
54
  if (contractAddress.equals(entry.address)) {
44
55
  return true;
@@ -59,8 +70,7 @@ export class PhasesTxValidator {
59
70
  }
60
71
  }
61
72
  if ('classId' in entry && 'selector' in entry) {
62
- if (contractClass.contractClassId.equals(entry.classId) &&
63
- (entry.selector === undefined || entry.selector.equals(functionSelector))) {
73
+ if (contractClass.contractClassId.equals(entry.classId) && (entry.selector === undefined || entry.selector.equals(functionSelector))) {
64
74
  return true;
65
75
  }
66
76
  }
@@ -68,5 +78,3 @@ export class PhasesTxValidator {
68
78
  return false;
69
79
  }
70
80
  }
71
- _PhasesTxValidator_log = new WeakMap();
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBR2pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5HLE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBWSxTQUE2QixFQUFVLGNBQWdDO1FBQWhDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUhuRixpQ0FBTyxZQUFZLENBQUMsa0NBQWtDLENBQUMsRUFBQztRQUl0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFNO1FBQ3JCLElBQUksQ0FBQztZQUNILHdGQUF3RjtZQUN4RixtR0FBbUc7WUFDbkcsK0RBQStEO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7Z0JBQ2hILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RSxLQUFL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
@@ -21,7 +21,6 @@ async function patchFn(where, tx, index, overrides) {
21
21
  tx.data.forPublic[where].publicCallRequests[index] = request;
22
22
  return {
23
23
  address: fn.callContext.contractAddress,
24
- selector: fn.callContext.functionSelector,
24
+ selector: fn.callContext.functionSelector
25
25
  };
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELEtBQUssVUFBVSxPQUFPLENBQ3BCLEtBQW1FLEVBQ25FLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7SUFDOUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUNyRixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7SUFDekQsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzRCxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBRTlELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlO1FBQ3ZDLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -1,5 +1,5 @@
1
1
  import { Fr } from '@aztec/circuits.js';
2
- import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator, } from '@aztec/p2p';
2
+ import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator } from '@aztec/p2p';
3
3
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
4
  import { readPublicState } from '@aztec/simulator/server';
5
5
  import { ArchiveCache } from './archive_cache.js';
@@ -14,7 +14,7 @@ export function createValidatorForAcceptingTxs(db, contractDataSource, verifier,
14
14
  new DoubleSpendTxValidator(new NullifierCache(db)),
15
15
  new PhasesTxValidator(contractDataSource, setupAllowList),
16
16
  new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, enforceFees, gasFees),
17
- new BlockHeaderTxValidator(new ArchiveCache(db)),
17
+ new BlockHeaderTxValidator(new ArchiveCache(db))
18
18
  ];
19
19
  if (verifier) {
20
20
  validators.push(new TxProofValidator(verifier));
@@ -28,11 +28,12 @@ export function createValidatorsForBlockBuilding(db, contractDataSource, globalV
28
28
  return {
29
29
  preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, enforceFees, globalVariables, setupAllowList),
30
30
  postprocessValidator: postprocessValidator(nullifierCache),
31
- nullifierCache,
31
+ nullifierCache
32
32
  };
33
33
  }
34
34
  class DatabasePublicStateSource {
35
- constructor(db) {
35
+ db;
36
+ constructor(db){
36
37
  this.db = db;
37
38
  }
38
39
  storageRead(contractAddress, slot) {
@@ -46,4 +47,3 @@ function preprocessValidator(nullifierCache, archiveCache, publicStateSource, co
46
47
  function postprocessValidator(nullifierCache) {
47
48
  return new DoubleSpendTxValidator(nullifierCache);
48
49
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBOEMsRUFBRSxFQUFzQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3hILE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGdCQUFnQixHQUNqQixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQTBCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsRUFBNEIsRUFDNUIsa0JBQXNDLEVBQ3RDLFFBQW1ELEVBQ25ELElBTUM7SUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUM5RSxNQUFNLFVBQVUsR0FBc0I7UUFDcEMsSUFBSSxlQUFlLEVBQUU7UUFDckIsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLHNCQUFzQixDQUFDLElBQUksY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDO1FBQ3pELElBQUksY0FBYyxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNqRCxDQUFDO0lBRUYsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxFQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsV0FBb0IsRUFDcEIsY0FBZ0M7SUFNaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTVELE9BQU87UUFDTCxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FDdEMsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsY0FBYyxDQUNmO1FBQ0Qsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO1FBQzFELGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0seUJBQXlCO0lBQzdCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO0lBQUcsQ0FBQztJQUVwRCxXQUFXLENBQUMsZUFBNkIsRUFBRSxJQUFRO1FBQ2pELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELFNBQVMsbUJBQW1CLENBQzFCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsV0FBb0IsRUFDcEIsZUFBZ0MsRUFDaEMsY0FBZ0M7SUFFaEMsNElBQTRJO0lBQzVJLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFDN0UsSUFBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsRUFDMUMsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsRUFDekQsSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQzdHLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUE4QjtJQUMxRCxPQUFPLElBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.73.0",
3
+ "version": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -23,31 +23,32 @@
23
23
  "clean": "rm -rf ./dest .tsbuildinfo",
24
24
  "formatting": "run -T prettier --check ./src && run -T eslint ./src",
25
25
  "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
26
- "test": "HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-16} RAYON_NUM_THREADS=${RAYON_NUM_THREADS:-4} NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
26
+ "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
27
27
  "test:integration": "concurrently -k -s first -c reset,dim -n test,anvil \"yarn test:integration:run\" \"anvil\"",
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.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
32
+ "@aztec/bb-prover": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
33
+ "@aztec/blob-lib": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
34
+ "@aztec/blob-sink": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
35
+ "@aztec/circuit-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
36
+ "@aztec/circuits.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
37
+ "@aztec/epoch-cache": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
38
+ "@aztec/ethereum": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
39
+ "@aztec/foundation": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
40
+ "@aztec/l1-artifacts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
41
+ "@aztec/merkle-tree": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
42
+ "@aztec/noir-contracts.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
43
+ "@aztec/noir-protocol-circuits-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
44
+ "@aztec/p2p": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
45
+ "@aztec/protocol-contracts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
46
+ "@aztec/prover-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
47
+ "@aztec/simulator": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
48
+ "@aztec/telemetry-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
49
+ "@aztec/types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
50
+ "@aztec/validator-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
51
+ "@aztec/world-state": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
51
52
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
52
53
  "@noir-lang/types": "portal:../../noir/packages/types",
53
54
  "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
 
package/src/config.ts CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  } from './publisher/config.js';
24
24
 
25
25
  export * from './publisher/config.js';
26
- export { SequencerConfig };
26
+ export type { SequencerConfig };
27
27
 
28
28
  /** Chain configuration. */
29
29
  type ChainConfig = {
@@ -1,3 +1,4 @@
1
+ import { Blob } from '@aztec/blob-lib';
1
2
  import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-sink/client';
2
3
  import {
3
4
  ConsensusPayload,
@@ -14,25 +15,27 @@ import {
14
15
  FormattedViemError,
15
16
  type ForwarderContract,
16
17
  type GasPrice,
18
+ type GovernanceProposerContract,
19
+ type IEmpireBase,
17
20
  type L1BlobInputs,
18
21
  type L1ContractsConfig,
19
22
  type L1GasConfig,
20
23
  type L1TxRequest,
21
24
  type L1TxUtilsWithBlobs,
22
- type RollupContract,
25
+ RollupContract,
26
+ type SlashingProposerContract,
23
27
  type TransactionStats,
24
28
  formatViemError,
25
29
  } from '@aztec/ethereum';
26
30
  import { toHex } from '@aztec/foundation/bigint-buffer';
27
- 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
  }