@aztec/sequencer-client 0.34.0 → 0.35.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 (98) hide show
  1. package/dest/client/sequencer-client.d.ts.map +1 -1
  2. package/dest/client/sequencer-client.js +3 -3
  3. package/dest/config.d.ts.map +1 -1
  4. package/dest/config.js +84 -7
  5. package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
  6. package/dest/global_variable_builder/global_builder.js +4 -3
  7. package/dest/index.d.ts +0 -1
  8. package/dest/index.d.ts.map +1 -1
  9. package/dest/index.js +1 -2
  10. package/dest/sequencer/sequencer.d.ts +6 -7
  11. package/dest/sequencer/sequencer.d.ts.map +1 -1
  12. package/dest/sequencer/sequencer.js +10 -11
  13. package/dest/tx_validator/aggregate_tx_validator.d.ts +7 -0
  14. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  15. package/dest/tx_validator/aggregate_tx_validator.js +23 -0
  16. package/dest/tx_validator/double_spend_validator.d.ts +11 -0
  17. package/dest/tx_validator/double_spend_validator.d.ts.map +1 -0
  18. package/dest/tx_validator/double_spend_validator.js +50 -0
  19. package/dest/tx_validator/gas_validator.d.ts +12 -0
  20. package/dest/tx_validator/gas_validator.d.ts.map +1 -0
  21. package/dest/tx_validator/gas_validator.js +62 -0
  22. package/dest/tx_validator/metadata_validator.d.ts +8 -0
  23. package/dest/tx_validator/metadata_validator.d.ts.map +1 -0
  24. package/dest/tx_validator/metadata_validator.js +50 -0
  25. package/dest/tx_validator/phases_validator.d.ts +13 -0
  26. package/dest/tx_validator/phases_validator.d.ts.map +1 -0
  27. package/dest/tx_validator/phases_validator.js +73 -0
  28. package/dest/tx_validator/tx_validator_factory.d.ts +13 -0
  29. package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -0
  30. package/dest/tx_validator/tx_validator_factory.js +21 -0
  31. package/package.json +14 -13
  32. package/src/client/sequencer-client.ts +2 -3
  33. package/src/config.ts +93 -7
  34. package/src/global_variable_builder/global_builder.ts +3 -2
  35. package/src/index.ts +0 -1
  36. package/src/sequencer/sequencer.ts +27 -20
  37. package/src/tx_validator/aggregate_tx_validator.ts +24 -0
  38. package/src/tx_validator/double_spend_validator.ts +65 -0
  39. package/src/tx_validator/gas_validator.ts +81 -0
  40. package/src/tx_validator/metadata_validator.ts +60 -0
  41. package/src/tx_validator/phases_validator.ts +101 -0
  42. package/src/tx_validator/tx_validator_factory.ts +37 -0
  43. package/dest/sequencer/abstract_phase_manager.d.ts +0 -77
  44. package/dest/sequencer/abstract_phase_manager.d.ts.map +0 -1
  45. package/dest/sequencer/abstract_phase_manager.js +0 -307
  46. package/dest/sequencer/app_logic_phase_manager.d.ts +0 -28
  47. package/dest/sequencer/app_logic_phase_manager.d.ts.map +0 -1
  48. package/dest/sequencer/app_logic_phase_manager.js +0 -41
  49. package/dest/sequencer/hints_builder.d.ts +0 -23
  50. package/dest/sequencer/hints_builder.d.ts.map +0 -1
  51. package/dest/sequencer/hints_builder.js +0 -62
  52. package/dest/sequencer/phase_manager_factory.d.ts +0 -18
  53. package/dest/sequencer/phase_manager_factory.d.ts.map +0 -1
  54. package/dest/sequencer/phase_manager_factory.js +0 -56
  55. package/dest/sequencer/public_processor.d.ts +0 -54
  56. package/dest/sequencer/public_processor.d.ts.map +0 -1
  57. package/dest/sequencer/public_processor.js +0 -142
  58. package/dest/sequencer/setup_phase_manager.d.ts +0 -28
  59. package/dest/sequencer/setup_phase_manager.d.ts.map +0 -1
  60. package/dest/sequencer/setup_phase_manager.js +0 -30
  61. package/dest/sequencer/tail_phase_manager.d.ts +0 -29
  62. package/dest/sequencer/tail_phase_manager.d.ts.map +0 -1
  63. package/dest/sequencer/tail_phase_manager.js +0 -52
  64. package/dest/sequencer/teardown_phase_manager.d.ts +0 -28
  65. package/dest/sequencer/teardown_phase_manager.d.ts.map +0 -1
  66. package/dest/sequencer/teardown_phase_manager.js +0 -30
  67. package/dest/sequencer/tx_validator.d.ts +0 -29
  68. package/dest/sequencer/tx_validator.d.ts.map +0 -1
  69. package/dest/sequencer/tx_validator.js +0 -174
  70. package/dest/sequencer/tx_validator_factory.d.ts +0 -12
  71. package/dest/sequencer/tx_validator_factory.d.ts.map +0 -1
  72. package/dest/sequencer/tx_validator_factory.js +0 -17
  73. package/dest/sequencer/utils.d.ts +0 -8
  74. package/dest/sequencer/utils.d.ts.map +0 -1
  75. package/dest/sequencer/utils.js +0 -29
  76. package/dest/simulator/index.d.ts +0 -31
  77. package/dest/simulator/index.d.ts.map +0 -1
  78. package/dest/simulator/index.js +0 -2
  79. package/dest/simulator/public_executor.d.ts +0 -79
  80. package/dest/simulator/public_executor.d.ts.map +0 -1
  81. package/dest/simulator/public_executor.js +0 -198
  82. package/dest/simulator/public_kernel.d.ts +0 -37
  83. package/dest/simulator/public_kernel.d.ts.map +0 -1
  84. package/dest/simulator/public_kernel.js +0 -97
  85. package/src/sequencer/abstract_phase_manager.ts +0 -549
  86. package/src/sequencer/app_logic_phase_manager.ts +0 -62
  87. package/src/sequencer/hints_builder.ts +0 -119
  88. package/src/sequencer/phase_manager_factory.ts +0 -126
  89. package/src/sequencer/public_processor.ts +0 -209
  90. package/src/sequencer/setup_phase_manager.ts +0 -50
  91. package/src/sequencer/tail_phase_manager.ts +0 -111
  92. package/src/sequencer/teardown_phase_manager.ts +0 -50
  93. package/src/sequencer/tx_validator.ts +0 -265
  94. package/src/sequencer/tx_validator_factory.ts +0 -32
  95. package/src/sequencer/utils.ts +0 -31
  96. package/src/simulator/index.ts +0 -36
  97. package/src/simulator/public_executor.ts +0 -267
  98. package/src/simulator/public_kernel.ts +0 -139
@@ -0,0 +1,50 @@
1
+ var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_globalVariables, _MetadataTxValidator_hasCorrectChainId, _MetadataTxValidator_isValidForBlockNumber;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Tx } from '@aztec/circuit-types';
4
+ import { createDebugLogger } from '@aztec/foundation/log';
5
+ export class MetadataTxValidator {
6
+ constructor(globalVariables) {
7
+ _MetadataTxValidator_instances.add(this);
8
+ _MetadataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_metadata'));
9
+ _MetadataTxValidator_globalVariables.set(this, void 0);
10
+ __classPrivateFieldSet(this, _MetadataTxValidator_globalVariables, globalVariables, "f");
11
+ }
12
+ validateTxs(txs) {
13
+ const validTxs = [];
14
+ const invalidTxs = [];
15
+ for (const tx of txs) {
16
+ if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_hasCorrectChainId).call(this, tx)) {
17
+ invalidTxs.push(tx);
18
+ continue;
19
+ }
20
+ if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_isValidForBlockNumber).call(this, tx)) {
21
+ invalidTxs.push(tx);
22
+ continue;
23
+ }
24
+ validTxs.push(tx);
25
+ }
26
+ return Promise.resolve([validTxs, invalidTxs]);
27
+ }
28
+ }
29
+ _MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_globalVariables = new WeakMap(), _MetadataTxValidator_instances = new WeakSet(), _MetadataTxValidator_hasCorrectChainId = function _MetadataTxValidator_hasCorrectChainId(tx) {
30
+ if (!tx.data.constants.txContext.chainId.equals(__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId)) {
31
+ __classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${__classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").chainId.toNumber()}`);
32
+ return false;
33
+ }
34
+ else {
35
+ return true;
36
+ }
37
+ }, _MetadataTxValidator_isValidForBlockNumber = function _MetadataTxValidator_isValidForBlockNumber(tx) {
38
+ const target = tx instanceof Tx
39
+ ? tx.data.forRollup?.rollupValidationRequests || tx.data.forPublic.validationRequests.forRollup
40
+ : tx.data.rollupValidationRequests;
41
+ const maxBlockNumber = target.maxBlockNumber;
42
+ if (maxBlockNumber.isSome && maxBlockNumber.value < __classPrivateFieldGet(this, _MetadataTxValidator_globalVariables, "f").blockNumber) {
43
+ __classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for low max block number`);
44
+ return false;
45
+ }
46
+ else {
47
+ return true;
48
+ }
49
+ };
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9tZXRhZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxlQUFnQzs7UUFINUMsbUNBQU8saUJBQWlCLENBQUMsMENBQTBDLENBQUMsRUFBQztRQUNyRSx1REFBa0M7UUFHaEMsdUJBQUEsSUFBSSx3Q0FBb0IsZUFBZSxNQUFBLENBQUM7SUFDMUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFRO1FBQ2xCLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsdUJBQUEsSUFBSSw4RUFBbUIsTUFBdkIsSUFBSSxFQUFvQixFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyx1QkFBQSxJQUFJLGtGQUF1QixNQUEzQixJQUFJLEVBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQTZCRjt5T0EzQm9CLEVBQUs7SUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHVCQUFBLElBQUksNENBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSx1QkFBQSxJQUFJLGdDQUFLLENBQUMsSUFBSSxDQUNaLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUN4QixFQUFFLENBQ0gsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sdUJBQUEsSUFBSSw0Q0FBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDaEksQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLG1HQUVzQixFQUFLO0lBQzFCLE1BQU0sTUFBTSxHQUNWLEVBQUUsWUFBWSxFQUFFO1FBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7UUFDaEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUU3QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEtBQUssR0FBRyx1QkFBQSxJQUFJLDRDQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RGLHVCQUFBLElBQUksZ0NBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ import { type AllowedFunction, Tx, type TxValidator } from '@aztec/circuit-types';
2
+ import { type PublicCallRequest } from '@aztec/circuits.js';
3
+ import { type ContractDataSource } from '@aztec/types/contracts';
4
+ export declare class PhasesTxValidator implements TxValidator<Tx> {
5
+ #private;
6
+ private contractDataSource;
7
+ private setupAllowList;
8
+ private teardownAllowList;
9
+ constructor(contractDataSource: ContractDataSource, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]);
10
+ validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
11
+ isOnAllowList(publicCall: PublicCallRequest, allowList: AllowedFunction[]): Promise<boolean>;
12
+ }
13
+ //# sourceMappingURL=phases_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIrD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBAFjB,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE;IAGxC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAmDnE,aAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAkCnG"}
@@ -0,0 +1,73 @@
1
+ var _PhasesTxValidator_instances, _PhasesTxValidator_log, _PhasesTxValidator_validateTx;
2
+ import { __classPrivateFieldGet } from "tslib";
3
+ import { Tx } from '@aztec/circuit-types';
4
+ import { createDebugLogger } from '@aztec/foundation/log';
5
+ import { AbstractPhaseManager, PublicKernelPhase } from '@aztec/simulator';
6
+ export class PhasesTxValidator {
7
+ constructor(contractDataSource, setupAllowList, teardownAllowList) {
8
+ _PhasesTxValidator_instances.add(this);
9
+ this.contractDataSource = contractDataSource;
10
+ this.setupAllowList = setupAllowList;
11
+ this.teardownAllowList = teardownAllowList;
12
+ _PhasesTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_phases'));
13
+ }
14
+ async validateTxs(txs) {
15
+ const validTxs = [];
16
+ const invalidTxs = [];
17
+ for (const tx of txs) {
18
+ if (await __classPrivateFieldGet(this, _PhasesTxValidator_instances, "m", _PhasesTxValidator_validateTx).call(this, tx)) {
19
+ validTxs.push(tx);
20
+ }
21
+ else {
22
+ invalidTxs.push(tx);
23
+ }
24
+ }
25
+ return Promise.resolve([validTxs, invalidTxs]);
26
+ }
27
+ async isOnAllowList(publicCall, allowList) {
28
+ const { contractAddress, functionData: { selector }, } = publicCall;
29
+ // do these checks first since they don't require the contract class
30
+ for (const entry of allowList) {
31
+ if (!('address' in entry)) {
32
+ continue;
33
+ }
34
+ if (contractAddress.equals(entry.address) && entry.selector.equals(selector)) {
35
+ return true;
36
+ }
37
+ }
38
+ const contractClass = await this.contractDataSource.getContract(contractAddress);
39
+ if (!contractClass) {
40
+ throw new Error(`Contract not found: ${publicCall.contractAddress.toString()}`);
41
+ }
42
+ for (const entry of allowList) {
43
+ if (!('classId' in entry)) {
44
+ continue;
45
+ }
46
+ if (contractClass.contractClassId.equals(entry.classId) && entry.selector.equals(selector)) {
47
+ return true;
48
+ }
49
+ }
50
+ return false;
51
+ }
52
+ }
53
+ _PhasesTxValidator_log = new WeakMap(), _PhasesTxValidator_instances = new WeakSet(), _PhasesTxValidator_validateTx = async function _PhasesTxValidator_validateTx(tx) {
54
+ if (!tx.data.forPublic) {
55
+ __classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
56
+ return true;
57
+ }
58
+ const { [PublicKernelPhase.SETUP]: setupFns, [PublicKernelPhase.TEARDOWN]: teardownFns } = AbstractPhaseManager.extractEnqueuedPublicCallsByPhase(tx.data, tx.enqueuedPublicFunctionCalls);
59
+ for (const setupFn of setupFns) {
60
+ if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
61
+ __classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.contractAddress}:${setupFn.functionData.selector}`);
62
+ return false;
63
+ }
64
+ }
65
+ for (const teardownFn of teardownFns) {
66
+ if (!(await this.isOnAllowList(teardownFn, this.teardownAllowList))) {
67
+ __classPrivateFieldGet(this, _PhasesTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because it calls teardown function not on allowlist: ${teardownFn.contractAddress}:${teardownFn.functionData.selector}`);
68
+ return false;
69
+ }
70
+ }
71
+ return true;
72
+ };
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBd0IsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzNFLE1BQU0sT0FBTyxpQkFBaUI7SUFHNUIsWUFDVSxrQkFBc0MsRUFDdEMsY0FBaUMsRUFDakMsaUJBQW9DOztRQUZwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBTDlDLGlDQUFPLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLEVBQUM7SUFNaEUsQ0FBQztJQUVKLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLHVCQUFBLElBQUksbUVBQVksTUFBaEIsSUFBSSxFQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFD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
@@ -0,0 +1,13 @@
1
+ import { type AllowedFunction, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
2
+ import { type EthAddress, type GlobalVariables } from '@aztec/circuits.js';
3
+ import { type ContractDataSource } from '@aztec/types/contracts';
4
+ import { type MerkleTreeOperations } from '@aztec/world-state';
5
+ export declare class TxValidatorFactory {
6
+ private merkleTreeDb;
7
+ private contractDataSource;
8
+ private gasPortalAddress;
9
+ constructor(merkleTreeDb: MerkleTreeOperations, contractDataSource: ContractDataSource, gasPortalAddress: EthAddress);
10
+ validatorForNewTxs(globalVariables: GlobalVariables, setupAllowList: AllowedFunction[], teardownAllowList: AllowedFunction[]): TxValidator<Tx>;
11
+ validatorForProcessedTxs(): TxValidator<ProcessedTx>;
12
+ }
13
+ //# sourceMappingURL=tx_validator_factory.d.ts.map
@@ -0,0 +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,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG3E,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,gBAAgB;gBAFhB,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,UAAU;IAGtC,kBAAkB,CAChB,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,eAAe,EAAE,EACjC,iBAAiB,EAAE,eAAe,EAAE,GACnC,WAAW,CAAC,EAAE,CAAC;IASlB,wBAAwB,IAAI,WAAW,CAAC,WAAW,CAAC;CAGrD"}
@@ -0,0 +1,21 @@
1
+ import { getCanonicalGasTokenAddress } from '@aztec/protocol-contracts/gas-token';
2
+ import { WorldStateDB, WorldStatePublicDB } from '@aztec/simulator';
3
+ import { AggregateTxValidator } from './aggregate_tx_validator.js';
4
+ import { DoubleSpendTxValidator } from './double_spend_validator.js';
5
+ import { GasTxValidator } from './gas_validator.js';
6
+ import { MetadataTxValidator } from './metadata_validator.js';
7
+ import { PhasesTxValidator } from './phases_validator.js';
8
+ export class TxValidatorFactory {
9
+ constructor(merkleTreeDb, contractDataSource, gasPortalAddress) {
10
+ this.merkleTreeDb = merkleTreeDb;
11
+ this.contractDataSource = contractDataSource;
12
+ this.gasPortalAddress = gasPortalAddress;
13
+ }
14
+ validatorForNewTxs(globalVariables, setupAllowList, teardownAllowList) {
15
+ return new AggregateTxValidator(new MetadataTxValidator(globalVariables), new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb)), new PhasesTxValidator(this.contractDataSource, setupAllowList, teardownAllowList), new GasTxValidator(new WorldStatePublicDB(this.merkleTreeDb), getCanonicalGasTokenAddress(this.gasPortalAddress)));
16
+ }
17
+ validatorForProcessedTxs() {
18
+ return new DoubleSpendTxValidator(new WorldStateDB(this.merkleTreeDb));
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLFlBQWtDLEVBQ2xDLGtCQUFzQyxFQUN0QyxnQkFBNEI7UUFGNUIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO0lBQ25DLENBQUM7SUFFSixrQkFBa0IsQ0FDaEIsZUFBZ0MsRUFDaEMsY0FBaUMsRUFDakMsaUJBQW9DO1FBRXBDLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFDeEMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDL0QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEVBQ2pGLElBQUksY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQ2xILENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/sequencer-client",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -24,18 +24,19 @@
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.34.0",
28
- "@aztec/circuits.js": "0.34.0",
29
- "@aztec/ethereum": "0.34.0",
30
- "@aztec/foundation": "0.34.0",
31
- "@aztec/l1-artifacts": "0.34.0",
32
- "@aztec/merkle-tree": "0.34.0",
33
- "@aztec/noir-protocol-circuits-types": "0.34.0",
34
- "@aztec/p2p": "0.34.0",
35
- "@aztec/protocol-contracts": "0.34.0",
36
- "@aztec/simulator": "0.34.0",
37
- "@aztec/types": "0.34.0",
38
- "@aztec/world-state": "0.34.0",
27
+ "@aztec/circuit-types": "0.35.0",
28
+ "@aztec/circuits.js": "0.35.0",
29
+ "@aztec/ethereum": "0.35.0",
30
+ "@aztec/foundation": "0.35.0",
31
+ "@aztec/l1-artifacts": "0.35.0",
32
+ "@aztec/merkle-tree": "0.35.0",
33
+ "@aztec/noir-contracts.js": "0.35.0",
34
+ "@aztec/noir-protocol-circuits-types": "0.35.0",
35
+ "@aztec/p2p": "0.35.0",
36
+ "@aztec/protocol-contracts": "0.35.0",
37
+ "@aztec/simulator": "0.35.0",
38
+ "@aztec/types": "0.35.0",
39
+ "@aztec/world-state": "0.35.0",
39
40
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
40
41
  "@noir-lang/types": "portal:../../noir/packages/types",
41
42
  "lodash.chunk": "^4.2.0",
@@ -1,7 +1,7 @@
1
1
  import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
2
2
  import { type BlockProver } from '@aztec/circuit-types/interfaces';
3
3
  import { type P2P } from '@aztec/p2p';
4
- import { type SimulationProvider } from '@aztec/simulator';
4
+ import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
5
5
  import { type ContractDataSource } from '@aztec/types/contracts';
6
6
  import { type WorldStateSynchronizer } from '@aztec/world-state';
7
7
 
@@ -9,8 +9,7 @@ import { type SequencerClientConfig } from '../config.js';
9
9
  import { getGlobalVariableBuilder } from '../global_variable_builder/index.js';
10
10
  import { getL1Publisher } from '../publisher/index.js';
11
11
  import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
12
- import { PublicProcessorFactory } from '../sequencer/public_processor.js';
13
- import { TxValidatorFactory } from '../sequencer/tx_validator_factory.js';
12
+ import { TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
14
13
 
15
14
  /**
16
15
  * Encapsulates the full sequencer and publisher.
package/src/config.ts CHANGED
@@ -1,6 +1,14 @@
1
- import { AztecAddress, Fr } from '@aztec/circuits.js';
1
+ import { type AllowedFunction } from '@aztec/circuit-types';
2
+ import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
2
3
  import { type L1ContractAddresses, NULL_KEY } from '@aztec/ethereum';
3
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { EcdsaAccountContractArtifact } from '@aztec/noir-contracts.js/EcdsaAccount';
6
+ import { FPCContract } from '@aztec/noir-contracts.js/FPC';
7
+ import { GasTokenContract } from '@aztec/noir-contracts.js/GasToken';
8
+ import { SchnorrAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrAccount';
9
+ import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount';
10
+ import { SchnorrSingleKeyAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrSingleKeyAccount';
11
+ import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
4
12
 
5
13
  import { type Hex } from 'viem';
6
14
 
@@ -40,8 +48,8 @@ export function getConfigEnvVars(): SequencerClientConfig {
40
48
  SEQ_TX_POLLING_INTERVAL_MS,
41
49
  SEQ_MAX_TX_PER_BLOCK,
42
50
  SEQ_MIN_TX_PER_BLOCK,
43
- SEQ_FPC_CLASSES,
44
- SEQ_FPC_INSTANCES,
51
+ SEQ_ALLOWED_SETUP_FN,
52
+ SEQ_ALLOWED_TEARDOWN_FN,
45
53
  AVAILABILITY_ORACLE_CONTRACT_ADDRESS,
46
54
  ROLLUP_CONTRACT_ADDRESS,
47
55
  REGISTRY_CONTRACT_ADDRESS,
@@ -90,9 +98,87 @@ export function getConfigEnvVars(): SequencerClientConfig {
90
98
  feeRecipient: FEE_RECIPIENT ? AztecAddress.fromString(FEE_RECIPIENT) : undefined,
91
99
  acvmWorkingDirectory: ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : undefined,
92
100
  acvmBinaryPath: ACVM_BINARY_PATH ? ACVM_BINARY_PATH : undefined,
93
- allowedFeePaymentContractClasses: SEQ_FPC_CLASSES ? SEQ_FPC_CLASSES.split(',').map(Fr.fromString) : [],
94
- allowedFeePaymentContractInstances: SEQ_FPC_INSTANCES
95
- ? SEQ_FPC_INSTANCES.split(',').map(AztecAddress.fromString)
96
- : [],
101
+ allowedFunctionsInSetup: SEQ_ALLOWED_SETUP_FN
102
+ ? parseSequencerAllowList(SEQ_ALLOWED_SETUP_FN)
103
+ : getDefaultAllowedSetupFunctions(),
104
+ allowedFunctionsInTeardown: SEQ_ALLOWED_TEARDOWN_FN
105
+ ? parseSequencerAllowList(SEQ_ALLOWED_TEARDOWN_FN)
106
+ : getDefaultAllowedTeardownFunctions(),
97
107
  };
98
108
  }
109
+
110
+ function parseSequencerAllowList(value: string): AllowedFunction[] {
111
+ const entries: AllowedFunction[] = [];
112
+
113
+ if (!value) {
114
+ return entries;
115
+ }
116
+
117
+ for (const val of value.split(',')) {
118
+ const [identifierString, selectorString] = val.split(':');
119
+ const selector = FunctionSelector.fromString(selectorString);
120
+
121
+ if (identifierString.startsWith('0x')) {
122
+ entries.push({
123
+ address: AztecAddress.fromString(identifierString),
124
+ selector,
125
+ });
126
+ } else {
127
+ entries.push({
128
+ classId: Fr.fromString(identifierString),
129
+ selector,
130
+ });
131
+ }
132
+ }
133
+
134
+ return entries;
135
+ }
136
+
137
+ function getDefaultAllowedSetupFunctions(): AllowedFunction[] {
138
+ return [
139
+ {
140
+ classId: getContractClassFromArtifact(SchnorrAccountContractArtifact).id,
141
+ selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
142
+ },
143
+ {
144
+ classId: getContractClassFromArtifact(SchnorrHardcodedAccountContractArtifact).id,
145
+ selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
146
+ },
147
+ {
148
+ classId: getContractClassFromArtifact(SchnorrSingleKeyAccountContractArtifact).id,
149
+ selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
150
+ },
151
+ {
152
+ classId: getContractClassFromArtifact(EcdsaAccountContractArtifact).id,
153
+ selector: FunctionSelector.fromSignature('approve_public_authwit(Field)'),
154
+ },
155
+
156
+ // needed for private transfers via FPC
157
+ {
158
+ classId: getContractClassFromArtifact(TokenContractArtifact).id,
159
+ selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'),
160
+ },
161
+
162
+ {
163
+ classId: getContractClassFromArtifact(FPCContract.artifact).id,
164
+ selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
165
+ },
166
+ ];
167
+ }
168
+
169
+ function getDefaultAllowedTeardownFunctions(): AllowedFunction[] {
170
+ return [
171
+ {
172
+ classId: getContractClassFromArtifact(GasTokenContract.artifact).id,
173
+ selector: FunctionSelector.fromSignature('pay_fee(Field)'),
174
+ },
175
+ {
176
+ classId: getContractClassFromArtifact(FPCContract.artifact).id,
177
+ selector: FunctionSelector.fromSignature('pay_fee((Field),Field,(Field))'),
178
+ },
179
+ {
180
+ classId: getContractClassFromArtifact(FPCContract.artifact).id,
181
+ selector: FunctionSelector.fromSignature('pay_fee_with_shielded_rebate(Field,(Field),Field)'),
182
+ },
183
+ ];
184
+ }
@@ -1,4 +1,4 @@
1
- import { type AztecAddress, type EthAddress, GlobalVariables } from '@aztec/circuits.js';
1
+ import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
2
2
  import { Fr } from '@aztec/foundation/fields';
3
3
  import { createDebugLogger } from '@aztec/foundation/log';
4
4
 
@@ -90,6 +90,7 @@ export class SimpleTestGlobalVariableBuilder implements GlobalVariableBuilder {
90
90
  `Built global variables for block ${blockNumber}: (${chainId}, ${version}, ${blockNumber}, ${lastTimestamp}, ${coinbase}, ${feeRecipient})`,
91
91
  );
92
92
 
93
- return new GlobalVariables(chainId, version, blockNumber, lastTimestamp, coinbase, feeRecipient);
93
+ const gasFees = GasFees.default();
94
+ return new GlobalVariables(chainId, version, blockNumber, lastTimestamp, coinbase, feeRecipient, gasFees);
94
95
  }
95
96
  }
package/src/index.ts CHANGED
@@ -5,4 +5,3 @@ export * from './sequencer/index.js';
5
5
 
6
6
  // Used by the node to simulate public parts of transactions. Should these be moved to a shared library?
7
7
  export * from './global_variable_builder/index.js';
8
- export * from './sequencer/public_processor.js';
@@ -1,5 +1,12 @@
1
- import { type L1ToL2MessageSource, type L2Block, type L2BlockSource, type ProcessedTx, Tx } from '@aztec/circuit-types';
2
- import { type BlockProver, PROVING_STATUS } from '@aztec/circuit-types/interfaces';
1
+ import {
2
+ type L1ToL2MessageSource,
3
+ type L2Block,
4
+ type L2BlockSource,
5
+ type ProcessedTx,
6
+ Tx,
7
+ type TxValidator,
8
+ } from '@aztec/circuit-types';
9
+ import { type AllowedFunction, type BlockProver, PROVING_STATUS } from '@aztec/circuit-types/interfaces';
3
10
  import { type L2BlockBuiltStats } from '@aztec/circuit-types/stats';
4
11
  import { AztecAddress, EthAddress } from '@aztec/circuits.js';
5
12
  import { Fr } from '@aztec/foundation/fields';
@@ -7,14 +14,13 @@ import { createDebugLogger } from '@aztec/foundation/log';
7
14
  import { RunningPromise } from '@aztec/foundation/running-promise';
8
15
  import { Timer, elapsed } from '@aztec/foundation/timer';
9
16
  import { type P2P } from '@aztec/p2p';
17
+ import { type PublicProcessorFactory } from '@aztec/simulator';
10
18
  import { type WorldStateStatus, type WorldStateSynchronizer } from '@aztec/world-state';
11
19
 
12
20
  import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
13
21
  import { type L1Publisher } from '../publisher/l1-publisher.js';
22
+ import { type TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
14
23
  import { type SequencerConfig } from './config.js';
15
- import { type PublicProcessorFactory } from './public_processor.js';
16
- import { type TxValidator } from './tx_validator.js';
17
- import { type TxValidatorFactory } from './tx_validator_factory.js';
18
24
 
19
25
  /**
20
26
  * Sequencer client
@@ -35,8 +41,8 @@ export class Sequencer {
35
41
  private _feeRecipient = AztecAddress.ZERO;
36
42
  private lastPublishedBlock = 0;
37
43
  private state = SequencerState.STOPPED;
38
- private allowedFeePaymentContractClasses: Fr[] = [];
39
- private allowedFeePaymentContractInstances: AztecAddress[] = [];
44
+ private allowedFunctionsInSetup: AllowedFunction[] = [];
45
+ private allowedFunctionsInTeardown: AllowedFunction[] = [];
40
46
 
41
47
  constructor(
42
48
  private publisher: L1Publisher,
@@ -75,11 +81,11 @@ export class Sequencer {
75
81
  if (config.feeRecipient) {
76
82
  this._feeRecipient = config.feeRecipient;
77
83
  }
78
- if (config.allowedFeePaymentContractClasses) {
79
- this.allowedFeePaymentContractClasses = config.allowedFeePaymentContractClasses;
84
+ if (config.allowedFunctionsInSetup) {
85
+ this.allowedFunctionsInSetup = config.allowedFunctionsInSetup;
80
86
  }
81
- if (config.allowedFeePaymentContractInstances) {
82
- this.allowedFeePaymentContractInstances = config.allowedFeePaymentContractInstances;
87
+ if (config.allowedFunctionsInTeardown) {
88
+ this.allowedFunctionsInTeardown = config.allowedFunctionsInTeardown;
83
89
  }
84
90
  }
85
91
 
@@ -178,14 +184,15 @@ export class Sequencer {
178
184
  this._feeRecipient,
179
185
  );
180
186
 
181
- const txValidator = this.txValidatorFactory.buildTxValidator(
182
- newGlobalVariables,
183
- this.allowedFeePaymentContractClasses,
184
- this.allowedFeePaymentContractInstances,
185
- );
186
-
187
187
  // TODO: It should be responsibility of the P2P layer to validate txs before passing them on here
188
- const validTxs = await this.takeValidTxs(pendingTxs, txValidator);
188
+ const validTxs = await this.takeValidTxs(
189
+ pendingTxs,
190
+ this.txValidatorFactory.validatorForNewTxs(
191
+ newGlobalVariables,
192
+ this.allowedFunctionsInSetup,
193
+ this.allowedFunctionsInTeardown,
194
+ ),
195
+ );
189
196
  if (validTxs.length < this.minTxsPerBLock) {
190
197
  return;
191
198
  }
@@ -213,7 +220,7 @@ export class Sequencer {
213
220
  const blockTicket = await this.prover.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages, emptyTx);
214
221
 
215
222
  const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() =>
216
- processor.process(validTxs, blockSize, this.prover, txValidator),
223
+ processor.process(validTxs, blockSize, this.prover, this.txValidatorFactory.validatorForProcessedTxs()),
217
224
  );
218
225
  if (failedTxs.length > 0) {
219
226
  const failedTxData = failedTxs.map(fail => fail.tx);
@@ -281,7 +288,7 @@ export class Sequencer {
281
288
  }
282
289
  }
283
290
 
284
- protected async takeValidTxs<T extends Tx | ProcessedTx>(txs: T[], validator: TxValidator): Promise<T[]> {
291
+ protected async takeValidTxs<T extends Tx | ProcessedTx>(txs: T[], validator: TxValidator<T>): Promise<T[]> {
285
292
  const [valid, invalid] = await validator.validateTxs(txs);
286
293
  if (invalid.length > 0) {
287
294
  this.log.debug(`Dropping invalid txs from the p2p pool ${Tx.getHashes(invalid).join(', ')}`);
@@ -0,0 +1,24 @@
1
+ import { type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
2
+
3
+ export class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
4
+ #validators: TxValidator<T>[];
5
+ constructor(...validators: TxValidator<T>[]) {
6
+ if (validators.length === 0) {
7
+ throw new Error('At least one validator must be provided');
8
+ }
9
+
10
+ this.#validators = validators;
11
+ }
12
+
13
+ async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> {
14
+ const invalidTxs: T[] = [];
15
+ let txPool = txs;
16
+ for (const validator of this.#validators) {
17
+ const [valid, invalid] = await validator.validateTxs(txPool);
18
+ invalidTxs.push(...invalid);
19
+ txPool = valid;
20
+ }
21
+
22
+ return [txPool, invalidTxs];
23
+ }
24
+ }
@@ -0,0 +1,65 @@
1
+ import { type AnyTx, Tx, type TxValidator } from '@aztec/circuit-types';
2
+ import { Fr } from '@aztec/circuits.js';
3
+ import { createDebugLogger } from '@aztec/foundation/log';
4
+
5
+ export interface NullifierSource {
6
+ getNullifierIndex: (nullifier: Fr) => Promise<bigint | undefined>;
7
+ }
8
+
9
+ export class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
10
+ #log = createDebugLogger('aztec:sequencer:tx_validator:tx_double_spend');
11
+ #nullifierSource: NullifierSource;
12
+
13
+ constructor(nullifierSource: NullifierSource) {
14
+ this.#nullifierSource = nullifierSource;
15
+ }
16
+
17
+ async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> {
18
+ const validTxs: T[] = [];
19
+ const invalidTxs: T[] = [];
20
+ const thisBlockNullifiers = new Set<bigint>();
21
+
22
+ for (const tx of txs) {
23
+ if (!(await this.#uniqueNullifiers(tx, thisBlockNullifiers))) {
24
+ invalidTxs.push(tx);
25
+ continue;
26
+ }
27
+
28
+ validTxs.push(tx);
29
+ }
30
+
31
+ return [validTxs, invalidTxs];
32
+ }
33
+
34
+ async #uniqueNullifiers(tx: AnyTx, thisBlockNullifiers: Set<bigint>): Promise<boolean> {
35
+ const newNullifiers = tx.data.getNonEmptyNullifiers().map(x => x.toBigInt());
36
+
37
+ // Ditch this tx if it has repeated nullifiers
38
+ const uniqueNullifiers = new Set(newNullifiers);
39
+ if (uniqueNullifiers.size !== newNullifiers.length) {
40
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for emitting duplicate nullifiers`);
41
+ return false;
42
+ }
43
+
44
+ for (const nullifier of newNullifiers) {
45
+ if (thisBlockNullifiers.has(nullifier)) {
46
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
47
+ return false;
48
+ }
49
+
50
+ thisBlockNullifiers.add(nullifier);
51
+ }
52
+
53
+ const nullifierIndexes = await Promise.all(
54
+ newNullifiers.map(n => this.#nullifierSource.getNullifierIndex(new Fr(n))),
55
+ );
56
+
57
+ const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
58
+ if (hasDuplicates) {
59
+ this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating nullifiers present in state trees`);
60
+ return false;
61
+ }
62
+
63
+ return true;
64
+ }
65
+ }