@aztec/sequencer-client 0.69.0 → 0.69.1-devnet
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.
- package/dest/client/sequencer-client.d.ts +4 -0
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +4 -5
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -1
- package/dest/index.d.ts +3 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +4 -2
- package/dest/publisher/config.d.ts +4 -0
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +6 -1
- package/dest/publisher/index.d.ts +0 -1
- package/dest/publisher/index.d.ts.map +1 -1
- package/dest/publisher/index.js +1 -2
- package/dest/publisher/l1-publisher.d.ts +43 -12
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +184 -132
- package/dest/sequencer/index.d.ts +1 -0
- package/dest/sequencer/index.d.ts.map +1 -1
- package/dest/sequencer/index.js +2 -1
- package/dest/sequencer/sequencer.d.ts +22 -29
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +68 -132
- package/dest/sequencer/utils.d.ts +2 -2
- package/dest/sequencer/utils.d.ts.map +1 -1
- package/dest/sequencer/utils.js +3 -3
- package/dest/slasher/factory.d.ts +11 -0
- package/dest/slasher/factory.d.ts.map +1 -0
- package/dest/slasher/factory.js +10 -0
- package/dest/slasher/index.d.ts +3 -0
- package/dest/slasher/index.d.ts.map +1 -0
- package/dest/slasher/index.js +3 -0
- package/dest/slasher/slasher_client.d.ts +127 -0
- package/dest/slasher/slasher_client.d.ts.map +1 -0
- package/dest/slasher/slasher_client.js +305 -0
- package/dest/test/index.d.ts +18 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +8 -0
- package/dest/{publisher → test}/test-l1-publisher.d.ts +1 -1
- package/dest/test/test-l1-publisher.d.ts.map +1 -0
- package/dest/test/test-l1-publisher.js +11 -0
- package/dest/tx_validator/archive_cache.d.ts +14 -0
- package/dest/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/tx_validator/archive_cache.js +22 -0
- package/dest/tx_validator/gas_validator.d.ts +2 -3
- package/dest/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/tx_validator/gas_validator.js +9 -22
- package/dest/tx_validator/nullifier_cache.d.ts +16 -0
- package/dest/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/tx_validator/nullifier_cache.js +24 -0
- package/dest/tx_validator/phases_validator.d.ts +2 -3
- package/dest/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/tx_validator/phases_validator.js +15 -24
- package/dest/tx_validator/tx_validator_factory.d.ts +15 -14
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +41 -24
- package/package.json +24 -20
- package/src/client/sequencer-client.ts +9 -3
- package/src/config.ts +10 -0
- package/src/index.ts +3 -1
- package/src/publisher/config.ts +10 -0
- package/src/publisher/index.ts +0 -1
- package/src/publisher/l1-publisher.ts +222 -137
- package/src/sequencer/index.ts +1 -0
- package/src/sequencer/sequencer.ts +91 -195
- package/src/sequencer/utils.ts +2 -2
- package/src/slasher/factory.ts +22 -0
- package/src/slasher/index.ts +2 -0
- package/src/slasher/slasher_client.ts +402 -0
- package/src/test/index.ts +23 -0
- package/src/{publisher → test}/test-l1-publisher.ts +1 -1
- package/src/tx_validator/archive_cache.ts +27 -0
- package/src/tx_validator/gas_validator.ts +11 -24
- package/src/tx_validator/nullifier_cache.ts +29 -0
- package/src/tx_validator/phases_validator.ts +22 -33
- package/src/tx_validator/tx_validator_factory.ts +89 -40
- package/dest/publisher/test-l1-publisher.d.ts.map +0 -1
- package/dest/publisher/test-l1-publisher.js +0 -11
- package/dest/publisher/utils.d.ts +0 -2
- package/dest/publisher/utils.d.ts.map +0 -1
- package/dest/publisher/utils.js +0 -13
- package/src/publisher/utils.ts +0 -14
|
@@ -17,24 +17,10 @@ export class GasTxValidator {
|
|
|
17
17
|
__classPrivateFieldSet(this, _GasTxValidator_enforceFees, enforceFees, "f");
|
|
18
18
|
__classPrivateFieldSet(this, _GasTxValidator_gasFees, gasFees, "f");
|
|
19
19
|
}
|
|
20
|
-
async validateTxs(txs) {
|
|
21
|
-
const validTxs = [];
|
|
22
|
-
const invalidTxs = [];
|
|
23
|
-
const skippedTxs = [];
|
|
24
|
-
for (const tx of txs) {
|
|
25
|
-
if (__classPrivateFieldGet(this, _GasTxValidator_instances, "m", _GasTxValidator_shouldSkip).call(this, tx)) {
|
|
26
|
-
skippedTxs.push(tx);
|
|
27
|
-
}
|
|
28
|
-
else if (await __classPrivateFieldGet(this, _GasTxValidator_instances, "m", _GasTxValidator_validateTxFee).call(this, tx)) {
|
|
29
|
-
validTxs.push(tx);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
invalidTxs.push(tx);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return [validTxs, invalidTxs, skippedTxs];
|
|
36
|
-
}
|
|
37
20
|
validateTx(tx) {
|
|
21
|
+
if (__classPrivateFieldGet(this, _GasTxValidator_instances, "m", _GasTxValidator_shouldSkip).call(this, tx)) {
|
|
22
|
+
return Promise.resolve({ result: 'skipped', reason: ['Insufficient fee per gas'] });
|
|
23
|
+
}
|
|
38
24
|
return __classPrivateFieldGet(this, _GasTxValidator_instances, "m", _GasTxValidator_validateTxFee).call(this, tx);
|
|
39
25
|
}
|
|
40
26
|
}
|
|
@@ -54,9 +40,10 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
54
40
|
if (feePayer.isZero()) {
|
|
55
41
|
if (__classPrivateFieldGet(this, _GasTxValidator_enforceFees, "f")) {
|
|
56
42
|
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting transaction ${tx.getTxHash()} due to missing fee payer`);
|
|
43
|
+
return { result: 'invalid', reason: ['Missing fee payer'] };
|
|
57
44
|
}
|
|
58
45
|
else {
|
|
59
|
-
return
|
|
46
|
+
return { result: 'valid' };
|
|
60
47
|
}
|
|
61
48
|
}
|
|
62
49
|
// Compute the maximum fee that this tx may pay, based on its gasLimits and maxFeePerGas
|
|
@@ -74,13 +61,13 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
74
61
|
!fn.callContext.isStaticCall);
|
|
75
62
|
const balance = claimFunctionCall ? initialBalance.add(claimFunctionCall.args[2]) : initialBalance;
|
|
76
63
|
if (balance.lt(feeLimit)) {
|
|
77
|
-
__classPrivateFieldGet(this, _GasTxValidator_log, "f").
|
|
64
|
+
__classPrivateFieldGet(this, _GasTxValidator_log, "f").warn(`Rejecting transaction due to not enough fee payer balance`, {
|
|
78
65
|
feePayer,
|
|
79
66
|
balance: balance.toBigInt(),
|
|
80
67
|
feeLimit: feeLimit.toBigInt(),
|
|
81
68
|
});
|
|
82
|
-
return
|
|
69
|
+
return { result: 'invalid', reason: ['Insufficient fee payer balance'] };
|
|
83
70
|
}
|
|
84
|
-
return
|
|
71
|
+
return { result: 'valid' };
|
|
85
72
|
};
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZ2FzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxnQkFBZ0IsRUFBNkMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RyxPQUFPLEVBQThCLGdCQUFnQixFQUFnQixNQUFNLG9CQUFvQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU9sRyxNQUFNLE9BQU8sY0FBYztJQU96QixZQUNFLGdCQUFtQyxFQUNuQyxlQUE2QixFQUM3QixXQUFvQixFQUNwQixPQUFnQjs7UUFWbEIsOEJBQU8sWUFBWSxDQUFDLCtCQUErQixDQUFDLEVBQUM7UUFDckQsbURBQXFDO1FBQ3JDLGtEQUErQjtRQUMvQiw4Q0FBc0I7UUFDdEIsMENBQWtCO1FBUWhCLHVCQUFBLElBQUksb0NBQXFCLGdCQUFnQixNQUFBLENBQUM7UUFDMUMsdUJBQUEsSUFBSSxtQ0FBb0IsZUFBZSxNQUFBLENBQUM7UUFDeEMsdUJBQUEsSUFBSSwrQkFBZ0IsV0FBVyxNQUFBLENBQUM7UUFDaEMsdUJBQUEsSUFBSSwyQkFBWSxPQUFPLE1BQUEsQ0FBQztJQUMxQixDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQU07UUFDZixJQUFJLHVCQUFBLElBQUksNkRBQVksTUFBaEIsSUFBSSxFQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsT0FBTyx1QkFBQSxJQUFJLGdFQUFlLE1BQW5CLElBQUksRUFBZ0IsRUFB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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type MerkleTreeReadOperations } from '@aztec/circuit-types';
|
|
4
|
+
import { type NullifierSource } from '@aztec/p2p';
|
|
5
|
+
/**
|
|
6
|
+
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
7
|
+
* Intended for validating transactions as they are added to a block.
|
|
8
|
+
*/
|
|
9
|
+
export declare class NullifierCache implements NullifierSource {
|
|
10
|
+
private db;
|
|
11
|
+
nullifiers: Set<string>;
|
|
12
|
+
constructor(db: MerkleTreeReadOperations);
|
|
13
|
+
nullifiersExist(nullifiers: Buffer[]): Promise<boolean[]>;
|
|
14
|
+
addNullifiers(nullifiers: Buffer[]): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=nullifier_cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullifier_cache.d.ts","sourceRoot":"","sources":["../../src/tx_validator/nullifier_cache.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAgB,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,qBAAa,cAAe,YAAW,eAAe;IAGxC,OAAO,CAAC,EAAE;IAFtB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAEJ,EAAE,EAAE,wBAAwB;IAInC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAS/D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE;CAK1C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
+
/**
|
|
3
|
+
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
4
|
+
* Intended for validating transactions as they are added to a block.
|
|
5
|
+
*/
|
|
6
|
+
export class NullifierCache {
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.nullifiers = new Set();
|
|
10
|
+
}
|
|
11
|
+
async nullifiersExist(nullifiers) {
|
|
12
|
+
const cacheResults = nullifiers.map(n => this.nullifiers.has(n.toString()));
|
|
13
|
+
const toCheckDb = nullifiers.filter((_n, index) => !cacheResults[index]);
|
|
14
|
+
const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
|
|
15
|
+
let dbIndex = 0;
|
|
16
|
+
return nullifiers.map((_n, index) => cacheResults[index] || dbHits[dbIndex++] !== undefined);
|
|
17
|
+
}
|
|
18
|
+
addNullifiers(nullifiers) {
|
|
19
|
+
for (const nullifier of nullifiers) {
|
|
20
|
+
this.nullifiers.add(nullifier.toString());
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVyX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9udWxsaWZpZXJfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBaUMsTUFBTSxzQkFBc0IsQ0FBQztBQUduRjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixFQUE0QjtRQUE1QixPQUFFLEdBQUYsRUFBRSxDQUEwQjtRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBb0I7UUFDL0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUFvQjtRQUN2QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { type AllowedElement, type PublicExecutionRequest, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
1
|
+
import { type AllowedElement, type PublicExecutionRequest, Tx, type TxValidationResult, type TxValidator } from '@aztec/circuit-types';
|
|
2
2
|
import { type ContractDataSource } from '@aztec/circuits.js';
|
|
3
3
|
export declare class PhasesTxValidator implements TxValidator<Tx> {
|
|
4
4
|
#private;
|
|
5
5
|
private setupAllowList;
|
|
6
6
|
private contractDataSource;
|
|
7
7
|
constructor(contracts: ContractDataSource, setupAllowList: AllowedElement[]);
|
|
8
|
-
|
|
9
|
-
validateTx(tx: Tx): Promise<boolean>;
|
|
8
|
+
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
10
9
|
isOnAllowList(publicCall: PublicExecutionRequest, allowList: AllowedElement[]): Promise<boolean>;
|
|
11
10
|
}
|
|
12
11
|
//# sourceMappingURL=phases_validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,EAAE,EAEF,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIZ,OAAO,CAAC,cAAc;IAFjE,OAAO,CAAC,kBAAkB,CAA8B;gBAE5C,SAAS,EAAE,kBAAkB,EAAU,cAAc,EAAE,cAAc,EAAE;IAI7E,
|
|
1
|
+
{"version":3,"file":"phases_validator.d.ts","sourceRoot":"","sources":["../../src/tx_validator/phases_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,EAAE,EAEF,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D,qBAAa,iBAAkB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAIZ,OAAO,CAAC,cAAc;IAFjE,OAAO,CAAC,kBAAkB,CAA8B;gBAE5C,SAAS,EAAE,kBAAkB,EAAU,cAAc,EAAE,cAAc,EAAE;IAI7E,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgC/C,aAAa,CAAC,UAAU,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA6CvG"}
|
|
@@ -9,37 +9,28 @@ export class PhasesTxValidator {
|
|
|
9
9
|
_PhasesTxValidator_log.set(this, createLogger('sequencer:tx_validator:tx_phases'));
|
|
10
10
|
this.contractDataSource = new ContractsDataSourcePublicDB(contracts);
|
|
11
11
|
}
|
|
12
|
-
async
|
|
13
|
-
|
|
14
|
-
const invalidTxs = [];
|
|
15
|
-
for (const tx of txs) {
|
|
12
|
+
async validateTx(tx) {
|
|
13
|
+
try {
|
|
16
14
|
// TODO(@spalladino): We add this just to handle public authwit-check calls during setup
|
|
17
15
|
// which are needed for public FPC flows, but fail if the account contract hasnt been deployed yet,
|
|
18
16
|
// which is what we're trying to do as part of the current txs.
|
|
19
17
|
await this.contractDataSource.addNewContracts(tx);
|
|
20
|
-
if (
|
|
21
|
-
|
|
18
|
+
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' };
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
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'] };
|
|
27
|
+
}
|
|
25
28
|
}
|
|
26
|
-
|
|
29
|
+
return { result: 'valid' };
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
async validateTx(tx) {
|
|
31
|
-
if (!tx.data.forPublic) {
|
|
32
|
-
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
36
|
-
for (const setupFn of setupFns) {
|
|
37
|
-
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
38
|
-
__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}`);
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
31
|
+
finally {
|
|
32
|
+
await this.contractDataSource.removeNewContracts(tx);
|
|
41
33
|
}
|
|
42
|
-
return true;
|
|
43
34
|
}
|
|
44
35
|
async isOnAllowList(publicCall, allowList) {
|
|
45
36
|
if (publicCall.isEmpty()) {
|
|
@@ -78,4 +69,4 @@ export class PhasesTxValidator {
|
|
|
78
69
|
}
|
|
79
70
|
}
|
|
80
71
|
_PhasesTxValidator_log = new WeakMap();
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBR2pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVGLE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBWSxTQUE2QixFQUFVLGNBQWdDO1FBQWhDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUhuRixpQ0FBTyxZQUFZLENBQUMsa0NBQWtDLENBQUMsRUFBQztRQUl0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFNO1FBQ3JCLElBQUksQ0FBQztZQUNILHdGQUF3RjtZQUN4RixtR0FBbUc7WUFDbkcsK0RBQStEO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7Z0JBQ2hILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RSxLQUFL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
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { type AllowedElement, type MerkleTreeReadOperations, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
-
import { type ContractDataSource, type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { type AllowedElement, type ClientProtocolCircuitVerifier, type MerkleTreeReadOperations, type ProcessedTx, type Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { type ContractDataSource, type GasFees, type GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { NullifierCache } from './nullifier_cache.js';
|
|
4
|
+
export declare function createValidatorForAcceptingTxs(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, verifier: ClientProtocolCircuitVerifier | undefined, data: {
|
|
5
|
+
blockNumber: number;
|
|
6
|
+
l1ChainId: number;
|
|
7
|
+
enforceFees: boolean;
|
|
8
|
+
setupAllowList: AllowedElement[];
|
|
9
|
+
gasFees: GasFees;
|
|
10
|
+
}): TxValidator<Tx>;
|
|
11
|
+
export declare function createValidatorsForBlockBuilding(db: MerkleTreeReadOperations, contractDataSource: ContractDataSource, globalVariables: GlobalVariables, enforceFees: boolean, setupAllowList: AllowedElement[]): {
|
|
12
|
+
preprocessValidator: TxValidator<Tx>;
|
|
13
|
+
postprocessValidator: TxValidator<ProcessedTx>;
|
|
14
|
+
nullifierCache: NullifierCache;
|
|
15
|
+
};
|
|
15
16
|
//# sourceMappingURL=tx_validator_factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"tx_validator_factory.d.ts","sourceRoot":"","sources":["../../src/tx_validator/tx_validator_factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAChB,KAAK,EAAE,EACP,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAqB,KAAK,kBAAkB,EAAM,KAAK,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAcxH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,wBAAwB,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,6BAA6B,GAAG,SAAS,EACnD,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB,GACA,WAAW,CAAC,EAAE,CAAC,CAgBjB;AAED,wBAAgB,gCAAgC,CAC9C,EAAE,EAAE,wBAAwB,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,OAAO,EACpB,cAAc,EAAE,cAAc,EAAE,GAC/B;IACD,mBAAmB,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACrC,oBAAoB,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,cAAc,EAAE,cAAc,CAAC;CAChC,CAkBA"}
|
|
@@ -1,32 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AggregateTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, } from '@aztec/p2p';
|
|
1
|
+
import { Fr } from '@aztec/circuits.js';
|
|
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';
|
|
5
|
+
import { ArchiveCache } from './archive_cache.js';
|
|
5
6
|
import { GasTxValidator } from './gas_validator.js';
|
|
7
|
+
import { NullifierCache } from './nullifier_cache.js';
|
|
6
8
|
import { PhasesTxValidator } from './phases_validator.js';
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return readPublicState(this.committedDb, contractAddress, slot);
|
|
20
|
-
},
|
|
21
|
-
};
|
|
9
|
+
export function createValidatorForAcceptingTxs(db, contractDataSource, verifier, data) {
|
|
10
|
+
const { blockNumber, l1ChainId, enforceFees, setupAllowList, gasFees } = data;
|
|
11
|
+
const validators = [
|
|
12
|
+
new DataTxValidator(),
|
|
13
|
+
new MetadataTxValidator(new Fr(l1ChainId), new Fr(blockNumber)),
|
|
14
|
+
new DoubleSpendTxValidator(new NullifierCache(db)),
|
|
15
|
+
new PhasesTxValidator(contractDataSource, setupAllowList),
|
|
16
|
+
new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, enforceFees, gasFees),
|
|
17
|
+
new BlockHeaderTxValidator(new ArchiveCache(db)),
|
|
18
|
+
];
|
|
19
|
+
if (verifier) {
|
|
20
|
+
validators.push(new TxProofValidator(verifier));
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
return new AggregateTxValidator(...validators);
|
|
23
|
+
}
|
|
24
|
+
export function createValidatorsForBlockBuilding(db, contractDataSource, globalVariables, enforceFees, setupAllowList) {
|
|
25
|
+
const nullifierCache = new NullifierCache(db);
|
|
26
|
+
const archiveCache = new ArchiveCache(db);
|
|
27
|
+
const publicStateSource = new DatabasePublicStateSource(db);
|
|
28
|
+
return {
|
|
29
|
+
preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, enforceFees, globalVariables, setupAllowList),
|
|
30
|
+
postprocessValidator: postprocessValidator(nullifierCache),
|
|
31
|
+
nullifierCache,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
class DatabasePublicStateSource {
|
|
35
|
+
constructor(db) {
|
|
36
|
+
this.db = db;
|
|
25
37
|
}
|
|
26
|
-
|
|
27
|
-
return
|
|
28
|
-
getNullifierIndices: nullifiers => fork.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers),
|
|
29
|
-
});
|
|
38
|
+
storageRead(contractAddress, slot) {
|
|
39
|
+
return readPublicState(this.db, contractAddress, slot);
|
|
30
40
|
}
|
|
31
41
|
}
|
|
32
|
-
|
|
42
|
+
function preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, enforceFees, globalVariables, setupAllowList) {
|
|
43
|
+
// We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building.
|
|
44
|
+
return new AggregateTxValidator(new MetadataTxValidator(globalVariables.chainId, globalVariables.blockNumber), new DoubleSpendTxValidator(nullifierCache), new PhasesTxValidator(contractDataSource, setupAllowList), new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, enforceFees, globalVariables.gasFees), new BlockHeaderTxValidator(archiveCache));
|
|
45
|
+
}
|
|
46
|
+
function postprocessValidator(nullifierCache) {
|
|
47
|
+
return new DoubleSpendTxValidator(nullifierCache);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBOEMsRUFBRSxFQUFzQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3hILE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGdCQUFnQixHQUNqQixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQTBCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsRUFBNEIsRUFDNUIsa0JBQXNDLEVBQ3RDLFFBQW1ELEVBQ25ELElBTUM7SUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUM5RSxNQUFNLFVBQVUsR0FBc0I7UUFDcEMsSUFBSSxlQUFlLEVBQUU7UUFDckIsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLHNCQUFzQixDQUFDLElBQUksY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDO1FBQ3pELElBQUksY0FBYyxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNqRCxDQUFDO0lBRUYsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxFQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsV0FBb0IsRUFDcEIsY0FBZ0M7SUFNaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTVELE9BQU87UUFDTCxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FDdEMsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsY0FBYyxDQUNmO1FBQ0Qsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO1FBQzFELGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0seUJBQXlCO0lBQzdCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO0lBQUcsQ0FBQztJQUVwRCxXQUFXLENBQUMsZUFBNkIsRUFBRSxJQUFRO1FBQ2pELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELFNBQVMsbUJBQW1CLENBQzFCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsV0FBb0IsRUFDcEIsZUFBZ0MsRUFDaEMsY0FBZ0M7SUFFaEMsNElBQTRJO0lBQzVJLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFDN0UsSUFBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsRUFDMUMsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsRUFDekQsSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQzdHLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUE4QjtJQUMxRCxPQUFPLElBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.69.
|
|
3
|
+
"version": "0.69.1-devnet",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./config": "./dest/config.js"
|
|
7
|
+
"./config": "./dest/config.js",
|
|
8
|
+
"./test": "./dest/test/index.js"
|
|
8
9
|
},
|
|
9
10
|
"typedocOptions": {
|
|
10
11
|
"entryPoints": [
|
|
@@ -27,24 +28,25 @@
|
|
|
27
28
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
28
29
|
},
|
|
29
30
|
"dependencies": {
|
|
30
|
-
"@aztec/aztec.js": "0.69.
|
|
31
|
-
"@aztec/bb-prover": "0.69.
|
|
32
|
-
"@aztec/
|
|
33
|
-
"@aztec/
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
39
|
-
"@aztec/noir-
|
|
40
|
-
"@aztec/
|
|
41
|
-
"@aztec/
|
|
42
|
-
"@aztec/
|
|
43
|
-
"@aztec/
|
|
44
|
-
"@aztec/
|
|
45
|
-
"@aztec/
|
|
46
|
-
"@aztec/
|
|
47
|
-
"@aztec/
|
|
31
|
+
"@aztec/aztec.js": "0.69.1-devnet",
|
|
32
|
+
"@aztec/bb-prover": "0.69.1-devnet",
|
|
33
|
+
"@aztec/blob-sink": "0.69.1-devnet",
|
|
34
|
+
"@aztec/circuit-types": "0.69.1-devnet",
|
|
35
|
+
"@aztec/circuits.js": "0.69.1-devnet",
|
|
36
|
+
"@aztec/ethereum": "0.69.1-devnet",
|
|
37
|
+
"@aztec/foundation": "0.69.1-devnet",
|
|
38
|
+
"@aztec/l1-artifacts": "0.69.1-devnet",
|
|
39
|
+
"@aztec/merkle-tree": "0.69.1-devnet",
|
|
40
|
+
"@aztec/noir-contracts.js": "0.69.1-devnet",
|
|
41
|
+
"@aztec/noir-protocol-circuits-types": "0.69.1-devnet",
|
|
42
|
+
"@aztec/p2p": "0.69.1-devnet",
|
|
43
|
+
"@aztec/protocol-contracts": "0.69.1-devnet",
|
|
44
|
+
"@aztec/prover-client": "0.69.1-devnet",
|
|
45
|
+
"@aztec/simulator": "0.69.1-devnet",
|
|
46
|
+
"@aztec/telemetry-client": "0.69.1-devnet",
|
|
47
|
+
"@aztec/types": "0.69.1-devnet",
|
|
48
|
+
"@aztec/validator-client": "0.69.1-devnet",
|
|
49
|
+
"@aztec/world-state": "0.69.1-devnet",
|
|
48
50
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
49
51
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
50
52
|
"lodash.chunk": "^4.2.0",
|
|
@@ -53,6 +55,7 @@
|
|
|
53
55
|
"viem": "^2.7.15"
|
|
54
56
|
},
|
|
55
57
|
"devDependencies": {
|
|
58
|
+
"@aztec/archiver": "workspace:^",
|
|
56
59
|
"@aztec/kv-store": "workspace:^",
|
|
57
60
|
"@jest/globals": "^29.5.0",
|
|
58
61
|
"@types/jest": "^29.5.0",
|
|
@@ -63,6 +66,7 @@
|
|
|
63
66
|
"@types/node": "^18.7.23",
|
|
64
67
|
"concurrently": "^7.6.0",
|
|
65
68
|
"eslint": "^8.37.0",
|
|
69
|
+
"express": "^4.21.1",
|
|
66
70
|
"jest": "^29.5.0",
|
|
67
71
|
"jest-mock-extended": "^3.0.3",
|
|
68
72
|
"levelup": "^5.1.1",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
1
2
|
import { type L1ToL2MessageSource, type L2BlockSource, type WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
2
3
|
import { type ContractDataSource } from '@aztec/circuits.js';
|
|
3
4
|
import { isAnvilTestChain } from '@aztec/ethereum';
|
|
@@ -13,7 +14,7 @@ import { type SequencerClientConfig } from '../config.js';
|
|
|
13
14
|
import { GlobalVariableBuilder } from '../global_variable_builder/index.js';
|
|
14
15
|
import { L1Publisher } from '../publisher/index.js';
|
|
15
16
|
import { Sequencer, type SequencerConfig } from '../sequencer/index.js';
|
|
16
|
-
import {
|
|
17
|
+
import { type SlasherClient } from '../slasher/index.js';
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Encapsulates the full sequencer and publisher.
|
|
@@ -40,11 +41,13 @@ export class SequencerClient {
|
|
|
40
41
|
validatorClient: ValidatorClient | undefined; // allowed to be undefined while we migrate
|
|
41
42
|
p2pClient: P2P;
|
|
42
43
|
worldStateSynchronizer: WorldStateSynchronizer;
|
|
44
|
+
slasherClient: SlasherClient;
|
|
43
45
|
contractDataSource: ContractDataSource;
|
|
44
46
|
l2BlockSource: L2BlockSource;
|
|
45
47
|
l1ToL2MessageSource: L1ToL2MessageSource;
|
|
46
48
|
telemetry: TelemetryClient;
|
|
47
49
|
publisher?: L1Publisher;
|
|
50
|
+
blobSinkClient?: BlobSinkClientInterface;
|
|
48
51
|
dateProvider: DateProvider;
|
|
49
52
|
},
|
|
50
53
|
) {
|
|
@@ -52,12 +55,14 @@ export class SequencerClient {
|
|
|
52
55
|
validatorClient,
|
|
53
56
|
p2pClient,
|
|
54
57
|
worldStateSynchronizer,
|
|
58
|
+
slasherClient,
|
|
55
59
|
contractDataSource,
|
|
56
60
|
l2BlockSource,
|
|
57
61
|
l1ToL2MessageSource,
|
|
58
62
|
telemetry: telemetryClient,
|
|
59
63
|
} = deps;
|
|
60
|
-
const publisher =
|
|
64
|
+
const publisher =
|
|
65
|
+
deps.publisher ?? new L1Publisher(config, { telemetry: telemetryClient, blobSinkClient: deps.blobSinkClient });
|
|
61
66
|
const globalsBuilder = new GlobalVariableBuilder(config);
|
|
62
67
|
|
|
63
68
|
const publicProcessorFactory = new PublicProcessorFactory(contractDataSource, deps.dateProvider, telemetryClient);
|
|
@@ -91,11 +96,12 @@ export class SequencerClient {
|
|
|
91
96
|
globalsBuilder,
|
|
92
97
|
p2pClient,
|
|
93
98
|
worldStateSynchronizer,
|
|
99
|
+
slasherClient,
|
|
94
100
|
new LightweightBlockBuilderFactory(telemetryClient),
|
|
95
101
|
l2BlockSource,
|
|
96
102
|
l1ToL2MessageSource,
|
|
97
103
|
publicProcessorFactory,
|
|
98
|
-
|
|
104
|
+
contractDataSource,
|
|
99
105
|
l1Constants,
|
|
100
106
|
deps.dateProvider,
|
|
101
107
|
telemetryClient,
|
package/src/config.ts
CHANGED
|
@@ -59,6 +59,16 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
59
59
|
description: 'The minimum number of txs to include in a block.',
|
|
60
60
|
...numberConfigHelper(1),
|
|
61
61
|
},
|
|
62
|
+
maxL2BlockGas: {
|
|
63
|
+
env: 'SEQ_MAX_L2_BLOCK_GAS',
|
|
64
|
+
description: 'The maximum L2 block gas.',
|
|
65
|
+
...numberConfigHelper(10e9),
|
|
66
|
+
},
|
|
67
|
+
maxDABlockGas: {
|
|
68
|
+
env: 'SEQ_MAX_DA_BLOCK_GAS',
|
|
69
|
+
description: 'The maximum DA block gas.',
|
|
70
|
+
...numberConfigHelper(10e9),
|
|
71
|
+
},
|
|
62
72
|
coinbase: {
|
|
63
73
|
env: 'COINBASE',
|
|
64
74
|
parseEnv: (val: string) => EthAddress.fromString(val),
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export * from './client/index.js';
|
|
2
2
|
export * from './config.js';
|
|
3
3
|
export * from './publisher/index.js';
|
|
4
|
-
export
|
|
4
|
+
export * from './tx_validator/tx_validator_factory.js';
|
|
5
|
+
export * from './slasher/index.js';
|
|
6
|
+
export { Sequencer, SequencerState, getDefaultAllowedSetupFunctions } from './sequencer/index.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
|
// ISSUE(#9832)
|
package/src/publisher/config.ts
CHANGED
|
@@ -24,6 +24,11 @@ export type PublisherConfig = L1TxUtilsConfig & {
|
|
|
24
24
|
* The interval to wait between publish retries.
|
|
25
25
|
*/
|
|
26
26
|
l1PublishRetryIntervalMS: number;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The URL of the blob sink.
|
|
30
|
+
*/
|
|
31
|
+
blobSinkUrl?: string;
|
|
27
32
|
};
|
|
28
33
|
|
|
29
34
|
export const getTxSenderConfigMappings: (
|
|
@@ -72,6 +77,11 @@ export const getPublisherConfigMappings: (
|
|
|
72
77
|
description: 'The interval to wait between publish retries.',
|
|
73
78
|
},
|
|
74
79
|
...l1TxUtilsConfigMappings,
|
|
80
|
+
blobSinkUrl: {
|
|
81
|
+
env: `${scope}_BLOB_SINK_URL`,
|
|
82
|
+
description: 'The URL of the blob sink.',
|
|
83
|
+
parseEnv: (val?: string) => val,
|
|
84
|
+
},
|
|
75
85
|
});
|
|
76
86
|
|
|
77
87
|
export function getPublisherConfigFromEnv(scope: 'PROVER' | 'SEQ'): PublisherConfig {
|
package/src/publisher/index.ts
CHANGED