@aztec/sequencer-client 0.47.0 → 0.48.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 (78) hide show
  1. package/dest/client/sequencer-client.d.ts +2 -2
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +2 -2
  4. package/dest/config.d.ts +6 -2
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +96 -29
  7. package/dest/global_variable_builder/global_builder.d.ts +14 -8
  8. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  9. package/dest/global_variable_builder/global_builder.js +10 -16
  10. package/dest/global_variable_builder/index.d.ts +2 -3
  11. package/dest/global_variable_builder/index.d.ts.map +1 -1
  12. package/dest/global_variable_builder/index.js +1 -1
  13. package/dest/global_variable_builder/viem-reader.d.ts +5 -4
  14. package/dest/global_variable_builder/viem-reader.d.ts.map +1 -1
  15. package/dest/global_variable_builder/viem-reader.js +11 -8
  16. package/dest/index.d.ts +2 -0
  17. package/dest/index.d.ts.map +1 -1
  18. package/dest/index.js +3 -1
  19. package/dest/publisher/config.d.ts +7 -15
  20. package/dest/publisher/config.d.ts.map +1 -1
  21. package/dest/publisher/config.js +38 -11
  22. package/dest/publisher/index.d.ts +3 -2
  23. package/dest/publisher/index.d.ts.map +1 -1
  24. package/dest/publisher/index.js +4 -4
  25. package/dest/publisher/l1-publisher-metrics.d.ts +17 -0
  26. package/dest/publisher/l1-publisher-metrics.d.ts.map +1 -0
  27. package/dest/publisher/l1-publisher-metrics.js +75 -0
  28. package/dest/publisher/l1-publisher.d.ts +34 -6
  29. package/dest/publisher/l1-publisher.d.ts.map +1 -1
  30. package/dest/publisher/l1-publisher.js +45 -37
  31. package/dest/publisher/viem-tx-sender.d.ts +9 -2
  32. package/dest/publisher/viem-tx-sender.d.ts.map +1 -1
  33. package/dest/publisher/viem-tx-sender.js +86 -17
  34. package/dest/receiver.d.ts +2 -8
  35. package/dest/receiver.d.ts.map +1 -1
  36. package/dest/sequencer/metrics.d.ts +17 -0
  37. package/dest/sequencer/metrics.d.ts.map +1 -0
  38. package/dest/sequencer/metrics.js +56 -0
  39. package/dest/sequencer/sequencer.d.ts +11 -5
  40. package/dest/sequencer/sequencer.d.ts.map +1 -1
  41. package/dest/sequencer/sequencer.js +104 -34
  42. package/dest/tx_validator/data_validator.d.ts +6 -0
  43. package/dest/tx_validator/data_validator.d.ts.map +1 -0
  44. package/dest/tx_validator/data_validator.js +47 -0
  45. package/dest/tx_validator/gas_validator.d.ts +1 -1
  46. package/dest/tx_validator/gas_validator.d.ts.map +1 -1
  47. package/dest/tx_validator/gas_validator.js +12 -12
  48. package/dest/tx_validator/phases_validator.d.ts +2 -3
  49. package/dest/tx_validator/phases_validator.d.ts.map +1 -1
  50. package/dest/tx_validator/phases_validator.js +4 -4
  51. package/dest/tx_validator/test_utils.d.ts.map +1 -1
  52. package/dest/tx_validator/test_utils.js +10 -4
  53. package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
  54. package/dest/tx_validator/tx_validator_factory.js +4 -3
  55. package/package.json +15 -15
  56. package/src/client/sequencer-client.ts +3 -3
  57. package/src/config.ts +111 -50
  58. package/src/global_variable_builder/global_builder.ts +35 -25
  59. package/src/global_variable_builder/index.ts +3 -3
  60. package/src/global_variable_builder/viem-reader.ts +14 -11
  61. package/src/index.ts +2 -0
  62. package/src/publisher/config.ts +43 -31
  63. package/src/publisher/index.ts +5 -3
  64. package/src/publisher/l1-publisher-metrics.ts +108 -0
  65. package/src/publisher/l1-publisher.ts +79 -44
  66. package/src/publisher/viem-tx-sender.ts +90 -15
  67. package/src/receiver.ts +3 -8
  68. package/src/sequencer/metrics.ts +86 -0
  69. package/src/sequencer/sequencer.ts +144 -45
  70. package/src/tx_validator/data_validator.ts +61 -0
  71. package/src/tx_validator/gas_validator.ts +11 -9
  72. package/src/tx_validator/phases_validator.ts +13 -5
  73. package/src/tx_validator/test_utils.ts +10 -3
  74. package/src/tx_validator/tx_validator_factory.ts +4 -2
  75. package/dest/global_variable_builder/config.d.ts +0 -19
  76. package/dest/global_variable_builder/config.d.ts.map +0 -1
  77. package/dest/global_variable_builder/config.js +0 -2
  78. package/src/global_variable_builder/config.ts +0 -20
@@ -1,3 +1,4 @@
1
+ import { computeVarArgsHash } from '@aztec/circuits.js/hash';
1
2
  export function patchNonRevertibleFn(tx, index, overrides) {
2
3
  return patchFn('endNonRevertibleData', tx, index, overrides);
3
4
  }
@@ -7,13 +8,18 @@ export function patchRevertibleFn(tx, index, overrides) {
7
8
  function patchFn(where, tx, index, overrides) {
8
9
  const fn = tx.enqueuedPublicFunctionCalls.at(-1 * index - 1);
9
10
  fn.contractAddress = overrides.address ?? fn.contractAddress;
10
- fn.functionSelector = overrides.selector;
11
+ fn.callContext.functionSelector = overrides.selector;
11
12
  fn.args = overrides.args ?? fn.args;
12
13
  fn.callContext.msgSender = overrides.msgSender ?? fn.callContext.msgSender;
13
- tx.data.forPublic[where].publicCallStack[index] = fn.toCallRequest();
14
+ tx.enqueuedPublicFunctionCalls[index] = fn;
15
+ const request = tx.data.forPublic[where].publicCallStack[index];
16
+ request.item.contractAddress = fn.contractAddress;
17
+ request.item.callContext = fn.callContext;
18
+ request.item.argsHash = computeVarArgsHash(fn.args);
19
+ tx.data.forPublic[where].publicCallStack[index] = request;
14
20
  return {
15
21
  address: fn.contractAddress,
16
- selector: fn.functionSelector,
22
+ selector: fn.callContext.functionSelector,
17
23
  };
18
24
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FDZCxLQUFxQyxFQUNyQyxFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBRSxDQUFDO0lBQzlELEVBQUUsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQzdELEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ3pDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3BDLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDM0UsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUV0RSxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlO1FBQzNCLFFBQVEsRUFBRSxFQUFFLENBQUMsZ0JBQWdCO0tBQzlCLENBQUM7QUFDSixDQUFDIn0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FDZCxLQUFxQyxFQUNyQyxFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBRSxDQUFDO0lBQzlELEVBQUUsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQzdELEVBQUUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNyRCxFQUFFLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztJQUNwQyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQzNFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFM0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUUzRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlO1FBQzNCLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,WAAW;gBAFX,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,WAAW,EAAE,OAAO;IAG9B,kBAAkB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;IASvG,wBAAwB,IAAI,WAAW,CAAC,WAAW,CAAC;CAGrD"}
1
+ {"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS/D,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,WAAW;gBAFX,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,WAAW,EAAE,OAAO;IAG9B,kBAAkB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;IAUvG,wBAAwB,IAAI,WAAW,CAAC,WAAW,CAAC;CAGrD"}
@@ -1,6 +1,7 @@
1
- import { GasTokenAddress } from '@aztec/protocol-contracts/gas-token';
1
+ import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice';
2
2
  import { WorldStateDB, WorldStatePublicDB } from '@aztec/simulator';
3
3
  import { AggregateTxValidator } from './aggregate_tx_validator.js';
4
+ import { DataTxValidator } from './data_validator.js';
4
5
  import { DoubleSpendTxValidator } from './double_spend_validator.js';
5
6
  import { GasTxValidator } from './gas_validator.js';
6
7
  import { MetadataTxValidator } from './metadata_validator.js';
@@ -12,10 +13,10 @@ export class TxValidatorFactory {
12
13
  this.enforceFees = enforceFees;
13
14
  }
14
15
  validatorForNewTxs(globalVariables, setupAllowList) {
15
- return new AggregateTxValidator(new MetadataTxValidator(globalVariables), new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb)), new PhasesTxValidator(this.contractDataSource, setupAllowList), new GasTxValidator(new WorldStatePublicDB(this.merkleTreeDb), GasTokenAddress, this.enforceFees));
16
+ return new AggregateTxValidator(new DataTxValidator(), new MetadataTxValidator(globalVariables), new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb)), new PhasesTxValidator(this.contractDataSource, setupAllowList), new GasTxValidator(new WorldStatePublicDB(this.merkleTreeDb), FeeJuiceAddress, this.enforceFees));
16
17
  }
17
18
  validatorForProcessedTxs() {
18
19
  return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb));
19
20
  }
20
21
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDVSxZQUFrQyxFQUNsQyxrQkFBc0MsRUFDdEMsV0FBb0I7UUFGcEIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZ0JBQVcsR0FBWCxXQUFXLENBQVM7SUFDM0IsQ0FBQztJQUVKLGtCQUFrQixDQUFDLGVBQWdDLEVBQUUsY0FBZ0M7UUFDbkYsT0FBTyxJQUFJLG9CQUFvQixDQUM3QixJQUFJLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxFQUN4QyxJQUFJLHNCQUFzQixDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUMvRCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsRUFDOUQsSUFBSSxjQUFjLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDakcsQ0FBQztJQUNKLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiJ9
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQ1UsWUFBa0MsRUFDbEMsa0JBQXNDLEVBQ3RDLFdBQW9CO1FBRnBCLGlCQUFZLEdBQVosWUFBWSxDQUFzQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGdCQUFXLEdBQVgsV0FBVyxDQUFTO0lBQzNCLENBQUM7SUFFSixrQkFBa0IsQ0FBQyxlQUFnQyxFQUFFLGNBQWdDO1FBQ25GLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxlQUFlLEVBQUUsRUFDckIsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFDeEMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEVBQzlELElBQUksY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ2pHLENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.47.0",
3
+ "version": "0.48.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -24,20 +24,20 @@
24
24
  "test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
25
25
  },
26
26
  "dependencies": {
27
- "@aztec/circuit-types": "0.47.0",
28
- "@aztec/circuits.js": "0.47.0",
29
- "@aztec/ethereum": "0.47.0",
30
- "@aztec/foundation": "0.47.0",
31
- "@aztec/l1-artifacts": "0.47.0",
32
- "@aztec/merkle-tree": "0.47.0",
33
- "@aztec/noir-contracts.js": "0.47.0",
34
- "@aztec/noir-protocol-circuits-types": "0.47.0",
35
- "@aztec/p2p": "0.47.0",
36
- "@aztec/protocol-contracts": "0.47.0",
37
- "@aztec/simulator": "0.47.0",
38
- "@aztec/telemetry-client": "0.47.0",
39
- "@aztec/types": "0.47.0",
40
- "@aztec/world-state": "0.47.0",
27
+ "@aztec/circuit-types": "0.48.0",
28
+ "@aztec/circuits.js": "0.48.0",
29
+ "@aztec/ethereum": "0.48.0",
30
+ "@aztec/foundation": "0.48.0",
31
+ "@aztec/l1-artifacts": "0.48.0",
32
+ "@aztec/merkle-tree": "0.48.0",
33
+ "@aztec/noir-contracts.js": "0.48.0",
34
+ "@aztec/noir-protocol-circuits-types": "0.48.0",
35
+ "@aztec/p2p": "0.48.0",
36
+ "@aztec/protocol-contracts": "0.48.0",
37
+ "@aztec/simulator": "0.48.0",
38
+ "@aztec/telemetry-client": "0.48.0",
39
+ "@aztec/types": "0.48.0",
40
+ "@aztec/world-state": "0.48.0",
41
41
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
42
42
  "@noir-lang/types": "portal:../../noir/packages/types",
43
43
  "lodash.chunk": "^4.2.0",
@@ -1,5 +1,5 @@
1
1
  import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
2
- import { type BlockProver } from '@aztec/circuit-types/interfaces';
2
+ import { type ProverClient } from '@aztec/circuit-types/interfaces';
3
3
  import { type P2P } from '@aztec/p2p';
4
4
  import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
5
5
  import { type TelemetryClient } from '@aztec/telemetry-client';
@@ -37,11 +37,11 @@ export class SequencerClient {
37
37
  contractDataSource: ContractDataSource,
38
38
  l2BlockSource: L2BlockSource,
39
39
  l1ToL2MessageSource: L1ToL2MessageSource,
40
- prover: BlockProver,
40
+ prover: ProverClient,
41
41
  simulationProvider: SimulationProvider,
42
42
  telemetryClient: TelemetryClient,
43
43
  ) {
44
- const publisher = getL1Publisher(config);
44
+ const publisher = getL1Publisher(config, telemetryClient);
45
45
  const globalsBuilder = getGlobalVariableBuilder(config);
46
46
  const merkleTreeDb = worldStateSynchronizer.getLatest();
47
47
 
package/src/config.ts CHANGED
@@ -1,14 +1,24 @@
1
1
  import { type AllowedElement } from '@aztec/circuit-types';
2
2
  import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
3
- import { getL1ContractAddressesFromEnv } from '@aztec/ethereum';
3
+ import { type L1ReaderConfig, l1ReaderConfigMappings } from '@aztec/ethereum';
4
+ import {
5
+ type ConfigMappingsType,
6
+ booleanConfigHelper,
7
+ getConfigFromMappings,
8
+ numberConfigHelper,
9
+ } from '@aztec/foundation/config';
4
10
  import { EthAddress } from '@aztec/foundation/eth-address';
5
11
  import { FPCContract } from '@aztec/noir-contracts.js/FPC';
6
12
  import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
7
13
  import { AuthRegistryAddress } from '@aztec/protocol-contracts/auth-registry';
8
- import { GasTokenAddress } from '@aztec/protocol-contracts/gas-token';
14
+ import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice';
9
15
 
10
- import { type GlobalReaderConfig } from './global_variable_builder/index.js';
11
- import { type PublisherConfig, type TxSenderConfig, getTxSenderConfigFromEnv } from './publisher/config.js';
16
+ import {
17
+ type PublisherConfig,
18
+ type TxSenderConfig,
19
+ getPublisherConfigMappings,
20
+ getTxSenderConfigMappings,
21
+ } from './publisher/config.js';
12
22
  import { type SequencerConfig } from './sequencer/config.js';
13
23
 
14
24
  /** Chain configuration. */
@@ -22,56 +32,107 @@ type ChainConfig = {
22
32
  /**
23
33
  * Configuration settings for the SequencerClient.
24
34
  */
25
- export type SequencerClientConfig = PublisherConfig &
26
- TxSenderConfig &
27
- SequencerConfig &
28
- GlobalReaderConfig &
29
- ChainConfig;
35
+ export type SequencerClientConfig = PublisherConfig & TxSenderConfig & SequencerConfig & L1ReaderConfig & ChainConfig;
36
+
37
+ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
38
+ transactionPollingIntervalMS: {
39
+ env: 'SEQ_TX_POLLING_INTERVAL_MS',
40
+ description: 'The number of ms to wait between polling for pending txs.',
41
+ ...numberConfigHelper(1_000),
42
+ },
43
+ maxTxsPerBlock: {
44
+ env: 'SEQ_MAX_TX_PER_BLOCK',
45
+ description: 'The maximum number of txs to include in a block.',
46
+ ...numberConfigHelper(32),
47
+ },
48
+ minTxsPerBlock: {
49
+ env: 'SEQ_MIN_TX_PER_BLOCK',
50
+ description: 'The minimum number of txs to include in a block.',
51
+ ...numberConfigHelper(1),
52
+ },
53
+ minSecondsBetweenBlocks: {
54
+ env: 'SEQ_MIN_SECONDS_BETWEEN_BLOCKS',
55
+ description: 'The minimum number of seconds in-between consecutive blocks.',
56
+ ...numberConfigHelper(0),
57
+ },
58
+ maxSecondsBetweenBlocks: {
59
+ env: 'SEQ_MAX_SECONDS_BETWEEN_BLOCKS',
60
+ description:
61
+ 'The maximum number of seconds in-between consecutive blocks. Sequencer will produce a block with less than minTxsPerBlock once this threshold is reached.',
62
+ ...numberConfigHelper(0),
63
+ },
64
+ coinbase: {
65
+ env: 'COINBASE',
66
+ parseEnv: (val: string) => EthAddress.fromString(val),
67
+ description: 'Recipient of block reward.',
68
+ },
69
+ feeRecipient: {
70
+ env: 'FEE_RECIPIENT',
71
+ parseEnv: (val: string) => AztecAddress.fromString(val),
72
+ description: 'Address to receive fees.',
73
+ },
74
+ acvmWorkingDirectory: {
75
+ env: 'ACVM_WORKING_DIRECTORY',
76
+ description: 'The working directory to use for simulation/proving',
77
+ },
78
+ acvmBinaryPath: {
79
+ env: 'ACVM_BINARY_PATH',
80
+ description: 'The path to the ACVM binary',
81
+ },
82
+ allowedInSetup: {
83
+ env: 'SEQ_ALLOWED_SETUP_FN',
84
+ parseEnv: (val: string) => parseSequencerAllowList(val),
85
+ defaultValue: getDefaultAllowedSetupFunctions(),
86
+ description: 'The list of functions calls allowed to run in setup',
87
+ printDefault: () =>
88
+ 'AuthRegistry, FeeJuice.increase_public_balance, Token.increase_public_balance, FPC.prepare_fee',
89
+ },
90
+ allowedInTeardown: {
91
+ env: 'SEQ_ALLOWED_TEARDOWN_FN',
92
+ parseEnv: (val: string) => parseSequencerAllowList(val),
93
+ defaultValue: getDefaultAllowedTeardownFunctions(),
94
+ description: 'The list of functions calls allowed to run teardown',
95
+ printDefault: () => 'FPC.pay_refund, FPC.pay_refund_with_shielded_rebate',
96
+ },
97
+ maxBlockSizeInBytes: {
98
+ env: 'SEQ_MAX_BLOCK_SIZE_IN_BYTES',
99
+ description: 'Max block size',
100
+ ...numberConfigHelper(1024 * 1024),
101
+ },
102
+ enforceFees: {
103
+ env: 'ENFORCE_FEES',
104
+ description: 'Whether to require every tx to have a fee payer',
105
+ ...booleanConfigHelper(),
106
+ },
107
+ sequencerSkipSubmitProofs: {
108
+ env: 'SEQ_SKIP_SUBMIT_PROOFS',
109
+ description: 'Temporary flag to skip submitting proofs, so a prover-node takes care of it.',
110
+ ...booleanConfigHelper(),
111
+ },
112
+ };
113
+
114
+ export const chainConfigMappings: ConfigMappingsType<ChainConfig> = {
115
+ l1ChainId: l1ReaderConfigMappings.l1ChainId,
116
+ version: {
117
+ env: 'VERSION',
118
+ description: 'The version of the rollup.',
119
+ ...numberConfigHelper(1),
120
+ },
121
+ };
122
+
123
+ export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientConfig> = {
124
+ ...sequencerConfigMappings,
125
+ ...getTxSenderConfigMappings('SEQ'),
126
+ ...getPublisherConfigMappings('SEQ'),
127
+ ...l1ReaderConfigMappings,
128
+ ...chainConfigMappings,
129
+ };
30
130
 
31
131
  /**
32
132
  * Creates an instance of SequencerClientConfig out of environment variables using sensible defaults for integration testing if not set.
33
133
  */
34
134
  export function getConfigEnvVars(): SequencerClientConfig {
35
- const {
36
- VERSION,
37
- SEQ_PUBLISH_RETRY_INTERVAL_MS,
38
- SEQ_TX_POLLING_INTERVAL_MS,
39
- SEQ_MAX_TX_PER_BLOCK,
40
- SEQ_MIN_TX_PER_BLOCK,
41
- SEQ_ALLOWED_SETUP_FN,
42
- SEQ_ALLOWED_TEARDOWN_FN,
43
- SEQ_MAX_BLOCK_SIZE_IN_BYTES,
44
- SEQ_SKIP_SUBMIT_PROOFS,
45
- COINBASE,
46
- FEE_RECIPIENT,
47
- ACVM_WORKING_DIRECTORY,
48
- ACVM_BINARY_PATH,
49
- ENFORCE_FEES = '',
50
- } = process.env;
51
-
52
- return {
53
- enforceFees: ['1', 'true'].includes(ENFORCE_FEES),
54
- version: VERSION ? +VERSION : 1, // 1 is our default version
55
- l1PublishRetryIntervalMS: SEQ_PUBLISH_RETRY_INTERVAL_MS ? +SEQ_PUBLISH_RETRY_INTERVAL_MS : 1_000,
56
- transactionPollingIntervalMS: SEQ_TX_POLLING_INTERVAL_MS ? +SEQ_TX_POLLING_INTERVAL_MS : 1_000,
57
- maxBlockSizeInBytes: SEQ_MAX_BLOCK_SIZE_IN_BYTES ? +SEQ_MAX_BLOCK_SIZE_IN_BYTES : undefined,
58
- l1Contracts: getL1ContractAddressesFromEnv(),
59
- maxTxsPerBlock: SEQ_MAX_TX_PER_BLOCK ? +SEQ_MAX_TX_PER_BLOCK : 32,
60
- minTxsPerBlock: SEQ_MIN_TX_PER_BLOCK ? +SEQ_MIN_TX_PER_BLOCK : 1,
61
- sequencerSkipSubmitProofs: ['1', 'true'].includes(SEQ_SKIP_SUBMIT_PROOFS ?? ''),
62
- // TODO: undefined should not be allowed for the following 2 values in PROD
63
- coinbase: COINBASE ? EthAddress.fromString(COINBASE) : undefined,
64
- feeRecipient: FEE_RECIPIENT ? AztecAddress.fromString(FEE_RECIPIENT) : undefined,
65
- acvmWorkingDirectory: ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : undefined,
66
- acvmBinaryPath: ACVM_BINARY_PATH ? ACVM_BINARY_PATH : undefined,
67
- allowedInSetup: SEQ_ALLOWED_SETUP_FN
68
- ? parseSequencerAllowList(SEQ_ALLOWED_SETUP_FN)
69
- : getDefaultAllowedSetupFunctions(),
70
- allowedInTeardown: SEQ_ALLOWED_TEARDOWN_FN
71
- ? parseSequencerAllowList(SEQ_ALLOWED_TEARDOWN_FN)
72
- : getDefaultAllowedTeardownFunctions(),
73
- ...getTxSenderConfigFromEnv('SEQ'),
74
- };
135
+ return getConfigFromMappings<SequencerClientConfig>(sequencerClientConfigMappings);
75
136
  }
76
137
 
77
138
  /**
@@ -132,7 +193,7 @@ function getDefaultAllowedSetupFunctions(): AllowedElement[] {
132
193
  },
133
194
  // needed for claiming on the same tx as a spend
134
195
  {
135
- address: GasTokenAddress,
196
+ address: FeeJuiceAddress,
136
197
  selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
137
198
  },
138
199
  // needed for private transfers via FPC
@@ -1,4 +1,10 @@
1
- import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
1
+ import {
2
+ type AztecAddress,
3
+ ETHEREUM_SLOT_DURATION,
4
+ type EthAddress,
5
+ GasFees,
6
+ GlobalVariables,
7
+ } from '@aztec/circuits.js';
2
8
  import { Fr } from '@aztec/foundation/fields';
3
9
  import { createDebugLogger } from '@aztec/foundation/log';
4
10
 
@@ -6,11 +12,6 @@ import { createDebugLogger } from '@aztec/foundation/log';
6
12
  * Reads values from L1 state that is used for the global values.
7
13
  */
8
14
  export interface L1GlobalReader {
9
- /**
10
- * Fetches the last timestamp that a block was processed by the contract.
11
- * @returns The last timestamp that a block was processed by the contract.
12
- */
13
- getLastTimestamp(): Promise<bigint>;
14
15
  /**
15
16
  * Fetches the version of the rollup contract.
16
17
  * @returns The version of the rollup contract.
@@ -29,10 +30,23 @@ export interface L1GlobalReader {
29
30
  getL1CurrentTime(): Promise<bigint>;
30
31
 
31
32
  /**
32
- * Gets the last time L2 was warped as tracked by the rollup contract.
33
- * @returns The warped time.
33
+ * Gets the current slot.
34
+ * @returns The current slot.
34
35
  */
35
- getLastWarpedBlockTs(): Promise<bigint>;
36
+ getCurrentSlot(): Promise<bigint>;
37
+
38
+ /**
39
+ * Get the slot for a specific timestamp.
40
+ * @param timestamp - The timestamp to get the slot for.
41
+ */
42
+ getSlotAt(timestamp: readonly [bigint]): Promise<bigint>;
43
+
44
+ /**
45
+ * Gets the timestamp for a slot
46
+ * @param slot - The slot to get the timestamp for.
47
+ * @returns The timestamp for the slot.
48
+ */
49
+ getTimestampForSlot(slot: readonly [bigint]): Promise<bigint>;
36
50
  }
37
51
 
38
52
  /**
@@ -69,34 +83,30 @@ export class SimpleTestGlobalVariableBuilder implements GlobalVariableBuilder {
69
83
  coinbase: EthAddress,
70
84
  feeRecipient: AztecAddress,
71
85
  ): Promise<GlobalVariables> {
72
- let lastTimestamp = new Fr(await this.reader.getLastTimestamp());
73
- const version = new Fr(await this.reader.getVersion());
74
- const chainId = new Fr(await this.reader.getChainId());
86
+ // Not just the current slot, the slot of the next block.
87
+ const ts = (await this.reader.getL1CurrentTime()) + BigInt(ETHEREUM_SLOT_DURATION);
75
88
 
76
- // TODO(rahul) - fix #1614. By using the cheatcode warp to modify L2 time,
77
- // txs in the next rollup would have same time as the txs in the current rollup (i.e. the rollup that was warped).
78
- // So, for now you check if L2 time was warped and if so, serve warpedTime + 1 to txs in the new rollup.
79
- // Check if L2 time was warped in the last rollup by checking if current L1 time is same as the warpedTime (stored on the rollup contract).
80
- // more details at https://github.com/AztecProtocol/aztec-packages/issues/1614
89
+ const slot = await this.reader.getSlotAt([ts]);
90
+ const timestamp = await this.reader.getTimestampForSlot([slot]);
81
91
 
82
- const currTimestamp = await this.reader.getL1CurrentTime();
83
- const rollupWarpTime = await this.reader.getLastWarpedBlockTs();
84
- const isLastBlockWarped = rollupWarpTime === currTimestamp;
85
- if (isLastBlockWarped) {
86
- lastTimestamp = new Fr(lastTimestamp.value + 1n);
87
- }
92
+ const slotFr = new Fr(slot);
93
+ const timestampFr = new Fr(timestamp);
94
+
95
+ const version = new Fr(await this.reader.getVersion());
96
+ const chainId = new Fr(await this.reader.getChainId());
88
97
 
89
98
  const gasFees = GasFees.default();
90
99
  const globalVariables = new GlobalVariables(
91
100
  chainId,
92
101
  version,
93
102
  blockNumber,
94
- lastTimestamp,
103
+ slotFr,
104
+ timestampFr,
95
105
  coinbase,
96
106
  feeRecipient,
97
107
  gasFees,
98
108
  );
99
109
  this.log.debug(`Built global variables for block ${blockNumber}`, globalVariables.toJSON());
100
- return new GlobalVariables(chainId, version, blockNumber, lastTimestamp, coinbase, feeRecipient, gasFees);
110
+ return globalVariables;
101
111
  }
102
112
  }
@@ -1,9 +1,9 @@
1
- import { type GlobalReaderConfig } from './config.js';
1
+ import { type L1ReaderConfig } from '@aztec/ethereum';
2
+
2
3
  import { type GlobalVariableBuilder, SimpleTestGlobalVariableBuilder } from './global_builder.js';
3
4
  import { ViemReader } from './viem-reader.js';
4
5
 
5
6
  export { SimpleTestGlobalVariableBuilder as SimpleGlobalVariableBuilder } from './global_builder.js';
6
- export { GlobalReaderConfig } from './config.js';
7
7
  export { GlobalVariableBuilder } from './global_builder.js';
8
8
 
9
9
  /**
@@ -11,6 +11,6 @@ export { GlobalVariableBuilder } from './global_builder.js';
11
11
  * @param config - Configuration to initialize the builder.
12
12
  * @returns A new instance of the global variable builder.
13
13
  */
14
- export function getGlobalVariableBuilder(config: GlobalReaderConfig): GlobalVariableBuilder {
14
+ export function getGlobalVariableBuilder(config: L1ReaderConfig): GlobalVariableBuilder {
15
15
  return new SimpleTestGlobalVariableBuilder(new ViemReader(config));
16
16
  }
@@ -1,4 +1,4 @@
1
- import { createEthereumChain } from '@aztec/ethereum';
1
+ import { type L1ReaderConfig, createEthereumChain } from '@aztec/ethereum';
2
2
  import { RollupAbi } from '@aztec/l1-artifacts';
3
3
 
4
4
  import {
@@ -12,7 +12,6 @@ import {
12
12
  } from 'viem';
13
13
  import type * as chains from 'viem/chains';
14
14
 
15
- import { type GlobalReaderConfig } from './config.js';
16
15
  import { type L1GlobalReader } from './global_builder.js';
17
16
 
18
17
  /**
@@ -22,10 +21,10 @@ export class ViemReader implements L1GlobalReader {
22
21
  private rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, chains.Chain>>;
23
22
  private publicClient: PublicClient<HttpTransport, chains.Chain>;
24
23
 
25
- constructor(config: GlobalReaderConfig) {
26
- const { rpcUrl, l1ChainId: chainId, l1Contracts } = config;
24
+ constructor(config: L1ReaderConfig) {
25
+ const { l1RpcUrl, l1ChainId: chainId, l1Contracts } = config;
27
26
 
28
- const chain = createEthereumChain(rpcUrl, chainId);
27
+ const chain = createEthereumChain(l1RpcUrl, chainId);
29
28
 
30
29
  this.publicClient = createPublicClient({
31
30
  chain: chain.chainInfo,
@@ -39,10 +38,6 @@ export class ViemReader implements L1GlobalReader {
39
38
  });
40
39
  }
41
40
 
42
- public async getLastTimestamp(): Promise<bigint> {
43
- return BigInt(await this.rollupContract.read.lastBlockTs());
44
- }
45
-
46
41
  public async getVersion(): Promise<bigint> {
47
42
  return BigInt(await this.rollupContract.read.VERSION());
48
43
  }
@@ -55,7 +50,15 @@ export class ViemReader implements L1GlobalReader {
55
50
  return await Promise.resolve((await this.publicClient.getBlock()).timestamp);
56
51
  }
57
52
 
58
- public async getLastWarpedBlockTs(): Promise<bigint> {
59
- return BigInt(await this.rollupContract.read.lastWarpedBlockTs());
53
+ public async getCurrentSlot(): Promise<bigint> {
54
+ return BigInt(await this.rollupContract.read.getCurrentSlot());
55
+ }
56
+
57
+ public async getSlotAt(timestamp: readonly [bigint]): Promise<bigint> {
58
+ return BigInt(await this.rollupContract.read.getSlotAt(timestamp));
59
+ }
60
+
61
+ public async getTimestampForSlot(slot: readonly [bigint]): Promise<bigint> {
62
+ return BigInt(await this.rollupContract.read.getTimestampForSlot(slot));
60
63
  }
61
64
  }
package/src/index.ts CHANGED
@@ -2,6 +2,8 @@ export * from './client/index.js';
2
2
  export * from './config.js';
3
3
  export * from './publisher/index.js';
4
4
  export * from './sequencer/index.js';
5
+ export * from './tx_validator/aggregate_tx_validator.js';
6
+ export * from './tx_validator/data_validator.js';
5
7
 
6
8
  // Used by the node to simulate public parts of transactions. Should these be moved to a shared library?
7
9
  export * from './global_variable_builder/index.js';
@@ -1,36 +1,20 @@
1
- import { type L1ContractAddresses, NULL_KEY } from '@aztec/ethereum';
2
-
3
- import { type Hex } from 'viem';
1
+ import { type L1ReaderConfig, NULL_KEY } from '@aztec/ethereum';
2
+ import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
4
3
 
5
4
  /**
6
5
  * The configuration of the rollup transaction publisher.
7
6
  */
8
- export interface TxSenderConfig {
7
+ export type TxSenderConfig = L1ReaderConfig & {
9
8
  /**
10
9
  * The private key to be used by the publisher.
11
10
  */
12
11
  publisherPrivateKey: `0x${string}`;
13
12
 
14
- /**
15
- * The RPC Url of the ethereum host.
16
- */
17
- rpcUrl: string;
18
-
19
- /**
20
- * The chain ID of the ethereum host.
21
- */
22
- l1ChainId: number;
23
-
24
13
  /**
25
14
  * The number of confirmations required.
26
15
  */
27
16
  requiredConfirmations: number;
28
-
29
- /**
30
- * The deployed l1 contract addresses
31
- */
32
- l1Contracts: L1ContractAddresses;
33
- }
17
+ };
34
18
 
35
19
  /**
36
20
  * Configuration of the L1Publisher.
@@ -42,18 +26,46 @@ export interface PublisherConfig {
42
26
  l1PublishRetryIntervalMS: number;
43
27
  }
44
28
 
45
- export function getTxSenderConfigFromEnv(scope: 'PROVER' | 'SEQ'): Omit<TxSenderConfig, 'l1Contracts'> {
46
- const { ETHEREUM_HOST, L1_CHAIN_ID } = process.env;
29
+ export const getTxSenderConfigMappings: (
30
+ scope: 'PROVER' | 'SEQ',
31
+ ) => ConfigMappingsType<Omit<TxSenderConfig, 'l1Contracts'>> = (scope: 'PROVER' | 'SEQ') => ({
32
+ l1RpcUrl: {
33
+ env: 'ETHEREUM_HOST',
34
+ description: 'The RPC Url of the ethereum host.',
35
+ },
36
+ l1ChainId: {
37
+ env: 'L1_CHAIN_ID',
38
+ parseEnv: (val: string) => +val,
39
+ defaultValue: 31337,
40
+ description: 'The chain ID of the ethereum host.',
41
+ },
42
+ publisherPrivateKey: {
43
+ env: `${scope}_PUBLISHER_PRIVATE_KEY`,
44
+ description: 'The private key to be used by the publisher.',
45
+ parseEnv: (val: string) => (val ? `0x${val.replace('0x', '')}` : NULL_KEY),
46
+ defaultValue: NULL_KEY,
47
+ },
48
+ requiredConfirmations: {
49
+ env: `${scope}_REQUIRED_CONFIRMATIONS`,
50
+ parseEnv: (val: string) => +val,
51
+ defaultValue: 1,
52
+ description: 'The number of confirmations required.',
53
+ },
54
+ });
47
55
 
48
- const PUBLISHER_PRIVATE_KEY = process.env[`${scope}_PUBLISHER_PRIVATE_KEY`];
49
- const REQUIRED_CONFIRMATIONS = process.env[`${scope}_REQUIRED_CONFIRMATIONS`];
56
+ export function getTxSenderConfigFromEnv(scope: 'PROVER' | 'SEQ'): Omit<TxSenderConfig, 'l1Contracts'> {
57
+ return getConfigFromMappings(getTxSenderConfigMappings(scope));
58
+ }
50
59
 
51
- const publisherPrivateKey: Hex = PUBLISHER_PRIVATE_KEY ? `0x${PUBLISHER_PRIVATE_KEY.replace('0x', '')}` : NULL_KEY;
60
+ export const getPublisherConfigMappings: (scope: 'PROVER' | 'SEQ') => ConfigMappingsType<PublisherConfig> = scope => ({
61
+ l1PublishRetryIntervalMS: {
62
+ env: `${scope}_PUBLISH_RETRY_INTERVAL_MS`,
63
+ parseEnv: (val: string) => +val,
64
+ defaultValue: 1000,
65
+ description: 'The interval to wait between publish retries.',
66
+ },
67
+ });
52
68
 
53
- return {
54
- rpcUrl: ETHEREUM_HOST ? ETHEREUM_HOST : '',
55
- requiredConfirmations: REQUIRED_CONFIRMATIONS ? +REQUIRED_CONFIRMATIONS : 1,
56
- publisherPrivateKey,
57
- l1ChainId: L1_CHAIN_ID ? +L1_CHAIN_ID : 31337,
58
- };
69
+ export function getPublisherConfigFromEnv(scope: 'PROVER' | 'SEQ'): PublisherConfig {
70
+ return getConfigFromMappings(getPublisherConfigMappings(scope));
59
71
  }
@@ -1,14 +1,16 @@
1
+ import { type TelemetryClient } from '@aztec/telemetry-client';
2
+
1
3
  import { type PublisherConfig, type TxSenderConfig } from './config.js';
2
4
  import { L1Publisher } from './l1-publisher.js';
3
5
  import { ViemTxSender } from './viem-tx-sender.js';
4
6
 
5
7
  export { L1Publisher } from './l1-publisher.js';
6
- export { PublisherConfig, TxSenderConfig, getTxSenderConfigFromEnv } from './config.js';
8
+ export * from './config.js';
7
9
 
8
10
  /**
9
11
  * Returns a new instance of the L1Publisher.
10
12
  * @param config - Configuration to initialize the new instance.
11
13
  */
12
- export function getL1Publisher(config: PublisherConfig & TxSenderConfig): L1Publisher {
13
- return new L1Publisher(new ViemTxSender(config), config);
14
+ export function getL1Publisher(config: PublisherConfig & TxSenderConfig, client: TelemetryClient): L1Publisher {
15
+ return new L1Publisher(new ViemTxSender(config), client, config);
14
16
  }