@aztec/sequencer-client 0.73.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/client/index.js +0 -1
- package/dest/client/sequencer-client.js +55 -55
- package/dest/config.js +40 -42
- package/dest/global_variable_builder/global_builder.js +39 -26
- package/dest/global_variable_builder/index.js +0 -1
- package/dest/index.js +0 -1
- package/dest/publisher/config.js +49 -50
- package/dest/publisher/index.js +0 -1
- package/dest/publisher/sequencer-publisher-metrics.js +32 -23
- package/dest/publisher/sequencer-publisher.js +251 -253
- package/dest/sequencer/allowed.js +5 -12
- package/dest/sequencer/config.js +1 -2
- package/dest/sequencer/index.js +0 -1
- package/dest/sequencer/metrics.js +26 -18
- package/dest/sequencer/sequencer.js +648 -607
- package/dest/sequencer/timetable.js +33 -19
- package/dest/sequencer/utils.js +22 -32
- package/dest/slasher/factory.js +6 -5
- package/dest/slasher/index.js +0 -1
- package/dest/slasher/slasher_client.js +128 -122
- package/dest/test/index.js +4 -1
- package/dest/tx_validator/archive_cache.js +7 -7
- package/dest/tx_validator/gas_validator.js +76 -64
- package/dest/tx_validator/nullifier_cache.js +8 -8
- package/dest/tx_validator/phases_validator.js +27 -19
- package/dest/tx_validator/test_utils.js +1 -2
- package/dest/tx_validator/tx_validator_factory.js +5 -5
- package/package.json +23 -22
- package/src/client/sequencer-client.ts +23 -2
- package/src/config.ts +1 -1
- package/src/publisher/sequencer-publisher.ts +71 -91
- package/src/sequencer/sequencer.ts +29 -13
- package/src/slasher/factory.ts +3 -3
- package/src/slasher/slasher_client.ts +40 -31
- package/dest/client/index.d.ts +0 -2
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/sequencer-client.d.ts +0 -68
- package/dest/client/sequencer-client.d.ts.map +0 -1
- package/dest/config.d.ts +0 -37
- package/dest/config.d.ts.map +0 -1
- package/dest/global_variable_builder/global_builder.d.ts +0 -29
- package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
- package/dest/global_variable_builder/index.d.ts +0 -2
- package/dest/global_variable_builder/index.d.ts.map +0 -1
- package/dest/index.d.ts +0 -8
- package/dest/index.d.ts.map +0 -1
- package/dest/publisher/config.d.ts +0 -38
- package/dest/publisher/config.d.ts.map +0 -1
- package/dest/publisher/index.d.ts +0 -2
- package/dest/publisher/index.d.ts.map +0 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +0 -24
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +0 -1
- package/dest/publisher/sequencer-publisher.d.ts +0 -158
- package/dest/publisher/sequencer-publisher.d.ts.map +0 -1
- package/dest/sequencer/allowed.d.ts +0 -3
- package/dest/sequencer/allowed.d.ts.map +0 -1
- package/dest/sequencer/config.d.ts +0 -2
- package/dest/sequencer/config.d.ts.map +0 -1
- package/dest/sequencer/index.d.ts +0 -4
- package/dest/sequencer/index.d.ts.map +0 -1
- package/dest/sequencer/metrics.d.ts +0 -24
- package/dest/sequencer/metrics.d.ts.map +0 -1
- package/dest/sequencer/sequencer.d.ts +0 -172
- package/dest/sequencer/sequencer.d.ts.map +0 -1
- package/dest/sequencer/timetable.d.ts +0 -38
- package/dest/sequencer/timetable.d.ts.map +0 -1
- package/dest/sequencer/utils.d.ts +0 -47
- package/dest/sequencer/utils.d.ts.map +0 -1
- package/dest/slasher/factory.d.ts +0 -11
- package/dest/slasher/factory.d.ts.map +0 -1
- package/dest/slasher/index.d.ts +0 -3
- package/dest/slasher/index.d.ts.map +0 -1
- package/dest/slasher/slasher_client.d.ts +0 -127
- package/dest/slasher/slasher_client.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -17
- package/dest/test/index.d.ts.map +0 -1
- package/dest/tx_validator/archive_cache.d.ts +0 -14
- package/dest/tx_validator/archive_cache.d.ts.map +0 -1
- package/dest/tx_validator/gas_validator.d.ts +0 -12
- package/dest/tx_validator/gas_validator.d.ts.map +0 -1
- package/dest/tx_validator/nullifier_cache.d.ts +0 -16
- package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
- package/dest/tx_validator/phases_validator.d.ts +0 -11
- package/dest/tx_validator/phases_validator.d.ts.map +0 -1
- package/dest/tx_validator/test_utils.d.ts +0 -21
- package/dest/tx_validator/test_utils.d.ts.map +0 -1
- package/dest/tx_validator/tx_validator_factory.d.ts +0 -16
- package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
|
@@ -2,23 +2,23 @@ import { MerkleTreeId } from '@aztec/circuit-types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
4
4
|
* Intended for validating transactions as they are added to a block.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
*/ export class NullifierCache {
|
|
6
|
+
db;
|
|
7
|
+
nullifiers;
|
|
8
|
+
constructor(db){
|
|
8
9
|
this.db = db;
|
|
9
10
|
this.nullifiers = new Set();
|
|
10
11
|
}
|
|
11
12
|
async nullifiersExist(nullifiers) {
|
|
12
|
-
const cacheResults = nullifiers.map(n
|
|
13
|
-
const toCheckDb = nullifiers.filter((_n, index)
|
|
13
|
+
const cacheResults = nullifiers.map((n)=>this.nullifiers.has(n.toString()));
|
|
14
|
+
const toCheckDb = nullifiers.filter((_n, index)=>!cacheResults[index]);
|
|
14
15
|
const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
|
|
15
16
|
let dbIndex = 0;
|
|
16
|
-
return nullifiers.map((_n, index)
|
|
17
|
+
return nullifiers.map((_n, index)=>cacheResults[index] || dbHits[dbIndex++] !== undefined);
|
|
17
18
|
}
|
|
18
19
|
addNullifiers(nullifiers) {
|
|
19
|
-
for (const nullifier of nullifiers)
|
|
20
|
+
for (const nullifier of nullifiers){
|
|
20
21
|
this.nullifiers.add(nullifier.toString());
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVyX2NhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4X3ZhbGlkYXRvci9udWxsaWZpZXJfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBaUMsTUFBTSxzQkFBc0IsQ0FBQztBQUduRjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixFQUE0QjtRQUE1QixPQUFFLEdBQUYsRUFBRSxDQUEwQjtRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBb0I7UUFDL0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUFvQjtRQUN2QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Tx, TxExecutionPhase, } from '@aztec/circuit-types';
|
|
1
|
+
import { Tx, TxExecutionPhase } from '@aztec/circuit-types';
|
|
4
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
3
|
import { ContractsDataSourcePublicDB, getExecutionRequestsByPhase } from '@aztec/simulator/server';
|
|
6
4
|
export class PhasesTxValidator {
|
|
7
|
-
|
|
5
|
+
setupAllowList;
|
|
6
|
+
#log;
|
|
7
|
+
contractDataSource;
|
|
8
|
+
constructor(contracts, setupAllowList){
|
|
8
9
|
this.setupAllowList = setupAllowList;
|
|
9
|
-
|
|
10
|
+
this.#log = createLogger('sequencer:tx_validator:tx_phases');
|
|
10
11
|
this.contractDataSource = new ContractsDataSourcePublicDB(contracts);
|
|
11
12
|
}
|
|
12
13
|
async validateTx(tx) {
|
|
@@ -16,19 +17,29 @@ export class PhasesTxValidator {
|
|
|
16
17
|
// which is what we're trying to do as part of the current txs.
|
|
17
18
|
await this.contractDataSource.addNewContracts(tx);
|
|
18
19
|
if (!tx.data.forPublic) {
|
|
19
|
-
|
|
20
|
-
return {
|
|
20
|
+
this.#log.debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
21
|
+
return {
|
|
22
|
+
result: 'valid'
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
23
|
-
for (const setupFn of setupFns)
|
|
24
|
-
if (!
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
for (const setupFn of setupFns){
|
|
27
|
+
if (!await this.isOnAllowList(setupFn, this.setupAllowList)) {
|
|
28
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because it calls setup function not on allow list: ${setupFn.callContext.contractAddress}:${setupFn.callContext.functionSelector}`, {
|
|
29
|
+
allowList: this.setupAllowList
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
result: 'invalid',
|
|
33
|
+
reason: [
|
|
34
|
+
'Setup function not on allow list'
|
|
35
|
+
]
|
|
36
|
+
};
|
|
27
37
|
}
|
|
28
38
|
}
|
|
29
|
-
return {
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
return {
|
|
40
|
+
result: 'valid'
|
|
41
|
+
};
|
|
42
|
+
} finally{
|
|
32
43
|
await this.contractDataSource.removeNewContracts(tx);
|
|
33
44
|
}
|
|
34
45
|
}
|
|
@@ -38,7 +49,7 @@ export class PhasesTxValidator {
|
|
|
38
49
|
}
|
|
39
50
|
const { contractAddress, functionSelector } = publicCall.callContext;
|
|
40
51
|
// do these checks first since they don't require the contract class
|
|
41
|
-
for (const entry of allowList)
|
|
52
|
+
for (const entry of allowList){
|
|
42
53
|
if ('address' in entry && !('selector' in entry)) {
|
|
43
54
|
if (contractAddress.equals(entry.address)) {
|
|
44
55
|
return true;
|
|
@@ -59,8 +70,7 @@ export class PhasesTxValidator {
|
|
|
59
70
|
}
|
|
60
71
|
}
|
|
61
72
|
if ('classId' in entry && 'selector' in entry) {
|
|
62
|
-
if (contractClass.contractClassId.equals(entry.classId) &&
|
|
63
|
-
(entry.selector === undefined || entry.selector.equals(functionSelector))) {
|
|
73
|
+
if (contractClass.contractClassId.equals(entry.classId) && (entry.selector === undefined || entry.selector.equals(functionSelector))) {
|
|
64
74
|
return true;
|
|
65
75
|
}
|
|
66
76
|
}
|
|
@@ -68,5 +78,3 @@ export class PhasesTxValidator {
|
|
|
68
78
|
return false;
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
|
-
_PhasesTxValidator_log = new WeakMap();
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBR2pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5HLE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBWSxTQUE2QixFQUFVLGNBQWdDO1FBQWhDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUhuRixpQ0FBTyxZQUFZLENBQUMsa0NBQWtDLENBQUMsRUFBQztRQUl0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFNO1FBQ3JCLElBQUksQ0FBQztZQUNILHdGQUF3RjtZQUN4RixtR0FBbUc7WUFDbkcsK0RBQStEO1lBQy9ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdkIsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLDBFQUEwRSxDQUFDLENBQUM7Z0JBQ2hILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RSxLQUFL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
|
|
@@ -21,7 +21,6 @@ async function patchFn(where, tx, index, overrides) {
|
|
|
21
21
|
tx.data.forPublic[where].publicCallRequests[index] = request;
|
|
22
22
|
return {
|
|
23
23
|
address: fn.callContext.contractAddress,
|
|
24
|
-
selector: fn.callContext.functionSelector
|
|
24
|
+
selector: fn.callContext.functionSelector
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELEtBQUssVUFBVSxPQUFPLENBQ3BCLEtBQW1FLEVBQ25FLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7SUFDOUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUNyRixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7SUFDekQsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzRCxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBRTlELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlO1FBQ3ZDLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/circuits.js';
|
|
2
|
-
import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator
|
|
2
|
+
import { AggregateTxValidator, BlockHeaderTxValidator, DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator } from '@aztec/p2p';
|
|
3
3
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
4
|
import { readPublicState } from '@aztec/simulator/server';
|
|
5
5
|
import { ArchiveCache } from './archive_cache.js';
|
|
@@ -14,7 +14,7 @@ export function createValidatorForAcceptingTxs(db, contractDataSource, verifier,
|
|
|
14
14
|
new DoubleSpendTxValidator(new NullifierCache(db)),
|
|
15
15
|
new PhasesTxValidator(contractDataSource, setupAllowList),
|
|
16
16
|
new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, enforceFees, gasFees),
|
|
17
|
-
new BlockHeaderTxValidator(new ArchiveCache(db))
|
|
17
|
+
new BlockHeaderTxValidator(new ArchiveCache(db))
|
|
18
18
|
];
|
|
19
19
|
if (verifier) {
|
|
20
20
|
validators.push(new TxProofValidator(verifier));
|
|
@@ -28,11 +28,12 @@ export function createValidatorsForBlockBuilding(db, contractDataSource, globalV
|
|
|
28
28
|
return {
|
|
29
29
|
preprocessValidator: preprocessValidator(nullifierCache, archiveCache, publicStateSource, contractDataSource, enforceFees, globalVariables, setupAllowList),
|
|
30
30
|
postprocessValidator: postprocessValidator(nullifierCache),
|
|
31
|
-
nullifierCache
|
|
31
|
+
nullifierCache
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
class DatabasePublicStateSource {
|
|
35
|
-
|
|
35
|
+
db;
|
|
36
|
+
constructor(db){
|
|
36
37
|
this.db = db;
|
|
37
38
|
}
|
|
38
39
|
storageRead(contractAddress, slot) {
|
|
@@ -46,4 +47,3 @@ function preprocessValidator(nullifierCache, archiveCache, publicStateSource, co
|
|
|
46
47
|
function postprocessValidator(nullifierCache) {
|
|
47
48
|
return new DoubleSpendTxValidator(nullifierCache);
|
|
48
49
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdG9yX2ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhfdmFsaWRhdG9yL3R4X3ZhbGlkYXRvcl9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBOEMsRUFBRSxFQUFzQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3hILE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGdCQUFnQixHQUNqQixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQTBCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsRUFBNEIsRUFDNUIsa0JBQXNDLEVBQ3RDLFFBQW1ELEVBQ25ELElBTUM7SUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUM5RSxNQUFNLFVBQVUsR0FBc0I7UUFDcEMsSUFBSSxlQUFlLEVBQUU7UUFDckIsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLHNCQUFzQixDQUFDLElBQUksY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDO1FBQ3pELElBQUksY0FBYyxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNqRCxDQUFDO0lBRUYsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxFQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsV0FBb0IsRUFDcEIsY0FBZ0M7SUFNaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTVELE9BQU87UUFDTCxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FDdEMsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsY0FBYyxDQUNmO1FBQ0Qsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO1FBQzFELGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0seUJBQXlCO0lBQzdCLFlBQW9CLEVBQTRCO1FBQTVCLE9BQUUsR0FBRixFQUFFLENBQTBCO0lBQUcsQ0FBQztJQUVwRCxXQUFXLENBQUMsZUFBNkIsRUFBRSxJQUFRO1FBQ2pELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELFNBQVMsbUJBQW1CLENBQzFCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsV0FBb0IsRUFDcEIsZUFBZ0MsRUFDaEMsY0FBZ0M7SUFFaEMsNElBQTRJO0lBQzVJLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFDN0UsSUFBSSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsRUFDMUMsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsRUFDekQsSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQzdHLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUE4QjtJQUMxRCxPQUFPLElBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -23,31 +23,32 @@
|
|
|
23
23
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
24
24
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
25
25
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
26
|
-
"test": "
|
|
26
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
|
|
27
27
|
"test:integration": "concurrently -k -s first -c reset,dim -n test,anvil \"yarn test:integration:run\" \"anvil\"",
|
|
28
28
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@aztec/aztec.js": "0.
|
|
32
|
-
"@aztec/bb-prover": "0.
|
|
33
|
-
"@aztec/blob-
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
39
|
-
"@aztec/
|
|
40
|
-
"@aztec/
|
|
41
|
-
"@aztec/
|
|
42
|
-
"@aztec/noir-
|
|
43
|
-
"@aztec/
|
|
44
|
-
"@aztec/
|
|
45
|
-
"@aztec/
|
|
46
|
-
"@aztec/
|
|
47
|
-
"@aztec/
|
|
48
|
-
"@aztec/
|
|
49
|
-
"@aztec/
|
|
50
|
-
"@aztec/
|
|
31
|
+
"@aztec/aztec.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
32
|
+
"@aztec/bb-prover": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
33
|
+
"@aztec/blob-lib": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
34
|
+
"@aztec/blob-sink": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
35
|
+
"@aztec/circuit-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
36
|
+
"@aztec/circuits.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
37
|
+
"@aztec/epoch-cache": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
38
|
+
"@aztec/ethereum": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
39
|
+
"@aztec/foundation": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
40
|
+
"@aztec/l1-artifacts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
41
|
+
"@aztec/merkle-tree": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
42
|
+
"@aztec/noir-contracts.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
43
|
+
"@aztec/noir-protocol-circuits-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
44
|
+
"@aztec/p2p": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
45
|
+
"@aztec/protocol-contracts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
46
|
+
"@aztec/prover-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
47
|
+
"@aztec/simulator": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
48
|
+
"@aztec/telemetry-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
49
|
+
"@aztec/types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
50
|
+
"@aztec/validator-client": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
51
|
+
"@aztec/world-state": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
51
52
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
52
53
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
53
54
|
"lodash.chunk": "^4.2.0",
|
|
@@ -4,8 +4,10 @@ import { type AztecAddress, type ContractDataSource } from '@aztec/circuits.js';
|
|
|
4
4
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
5
5
|
import {
|
|
6
6
|
ForwarderContract,
|
|
7
|
+
GovernanceProposerContract,
|
|
7
8
|
L1TxUtilsWithBlobs,
|
|
8
9
|
RollupContract,
|
|
10
|
+
SlashingProposerContract,
|
|
9
11
|
createEthereumChain,
|
|
10
12
|
createL1Clients,
|
|
11
13
|
isAnvilTestChain,
|
|
@@ -84,8 +86,25 @@ export class SequencerClient {
|
|
|
84
86
|
] as const);
|
|
85
87
|
const forwarderContract =
|
|
86
88
|
config.customForwarderContractAddress && config.customForwarderContractAddress !== EthAddress.ZERO
|
|
87
|
-
? new ForwarderContract(
|
|
88
|
-
|
|
89
|
+
? new ForwarderContract(
|
|
90
|
+
publicClient,
|
|
91
|
+
config.customForwarderContractAddress.toString(),
|
|
92
|
+
config.l1Contracts.rollupAddress.toString(),
|
|
93
|
+
)
|
|
94
|
+
: await ForwarderContract.create(
|
|
95
|
+
walletClient.account.address,
|
|
96
|
+
walletClient,
|
|
97
|
+
publicClient,
|
|
98
|
+
log,
|
|
99
|
+
config.l1Contracts.rollupAddress.toString(),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const governanceProposerContract = new GovernanceProposerContract(
|
|
103
|
+
publicClient,
|
|
104
|
+
config.l1Contracts.governanceProposerAddress.toString(),
|
|
105
|
+
);
|
|
106
|
+
const slashingProposerAddress = await rollupContract.getSlashingProposerAddress();
|
|
107
|
+
const slashingProposerContract = new SlashingProposerContract(publicClient, slashingProposerAddress.toString());
|
|
89
108
|
const epochCache =
|
|
90
109
|
deps.epochCache ??
|
|
91
110
|
(await EpochCache.create(
|
|
@@ -110,6 +129,8 @@ export class SequencerClient {
|
|
|
110
129
|
rollupContract,
|
|
111
130
|
epochCache,
|
|
112
131
|
forwarderContract,
|
|
132
|
+
governanceProposerContract,
|
|
133
|
+
slashingProposerContract,
|
|
113
134
|
});
|
|
114
135
|
const globalsBuilder = new GlobalVariableBuilder(config);
|
|
115
136
|
|
package/src/config.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Blob } from '@aztec/blob-lib';
|
|
1
2
|
import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
2
3
|
import {
|
|
3
4
|
ConsensusPayload,
|
|
@@ -14,25 +15,27 @@ import {
|
|
|
14
15
|
FormattedViemError,
|
|
15
16
|
type ForwarderContract,
|
|
16
17
|
type GasPrice,
|
|
18
|
+
type GovernanceProposerContract,
|
|
19
|
+
type IEmpireBase,
|
|
17
20
|
type L1BlobInputs,
|
|
18
21
|
type L1ContractsConfig,
|
|
19
22
|
type L1GasConfig,
|
|
20
23
|
type L1TxRequest,
|
|
21
24
|
type L1TxUtilsWithBlobs,
|
|
22
|
-
|
|
25
|
+
RollupContract,
|
|
26
|
+
type SlashingProposerContract,
|
|
23
27
|
type TransactionStats,
|
|
24
28
|
formatViemError,
|
|
25
29
|
} from '@aztec/ethereum';
|
|
26
30
|
import { toHex } from '@aztec/foundation/bigint-buffer';
|
|
27
|
-
import { Blob } from '@aztec/foundation/blob';
|
|
28
31
|
import { type Signature } from '@aztec/foundation/eth-signature';
|
|
29
|
-
import {
|
|
32
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
30
33
|
import { Timer } from '@aztec/foundation/timer';
|
|
31
|
-
import {
|
|
34
|
+
import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
32
35
|
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
33
36
|
|
|
34
37
|
import pick from 'lodash.pick';
|
|
35
|
-
import { type TransactionReceipt, encodeFunctionData
|
|
38
|
+
import { type TransactionReceipt, encodeFunctionData } from 'viem';
|
|
36
39
|
|
|
37
40
|
import { type PublisherConfig, type TxSenderConfig } from './config.js';
|
|
38
41
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
@@ -106,6 +109,8 @@ export class SequencerPublisher {
|
|
|
106
109
|
|
|
107
110
|
public l1TxUtils: L1TxUtilsWithBlobs;
|
|
108
111
|
public rollupContract: RollupContract;
|
|
112
|
+
public govProposerContract: GovernanceProposerContract;
|
|
113
|
+
public slashingProposerContract: SlashingProposerContract;
|
|
109
114
|
|
|
110
115
|
protected requests: RequestWithExpiry[] = [];
|
|
111
116
|
|
|
@@ -117,15 +122,14 @@ export class SequencerPublisher {
|
|
|
117
122
|
forwarderContract: ForwarderContract;
|
|
118
123
|
l1TxUtils: L1TxUtilsWithBlobs;
|
|
119
124
|
rollupContract: RollupContract;
|
|
125
|
+
slashingProposerContract: SlashingProposerContract;
|
|
126
|
+
governanceProposerContract: GovernanceProposerContract;
|
|
120
127
|
epochCache: EpochCache;
|
|
121
128
|
},
|
|
122
129
|
) {
|
|
123
130
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
124
131
|
this.epochCache = deps.epochCache;
|
|
125
132
|
|
|
126
|
-
if (config.l1Contracts.governanceProposerAddress) {
|
|
127
|
-
this.governanceProposerAddress = EthAddress.fromString(config.l1Contracts.governanceProposerAddress.toString());
|
|
128
|
-
}
|
|
129
133
|
this.blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
|
|
130
134
|
|
|
131
135
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
@@ -134,6 +138,9 @@ export class SequencerPublisher {
|
|
|
134
138
|
|
|
135
139
|
this.rollupContract = deps.rollupContract;
|
|
136
140
|
this.forwarderContract = deps.forwarderContract;
|
|
141
|
+
|
|
142
|
+
this.govProposerContract = deps.governanceProposerContract;
|
|
143
|
+
this.slashingProposerContract = deps.slashingProposerContract;
|
|
137
144
|
}
|
|
138
145
|
|
|
139
146
|
public registerSlashPayloadGetter(callback: GetSlashPayloadCallBack) {
|
|
@@ -221,12 +228,13 @@ export class SequencerPublisher {
|
|
|
221
228
|
this.l1TxUtils,
|
|
222
229
|
gasConfig,
|
|
223
230
|
blobConfig,
|
|
231
|
+
this.log,
|
|
224
232
|
);
|
|
225
233
|
this.callbackBundledTransactions(validRequests, result);
|
|
226
234
|
return result;
|
|
227
235
|
} catch (err) {
|
|
228
|
-
const
|
|
229
|
-
this.log.error(`Failed to publish bundled transactions`,
|
|
236
|
+
const viemError = formatViemError(err);
|
|
237
|
+
this.log.error(`Failed to publish bundled transactions`, viemError);
|
|
230
238
|
return undefined;
|
|
231
239
|
}
|
|
232
240
|
}
|
|
@@ -249,7 +257,7 @@ export class SequencerPublisher {
|
|
|
249
257
|
* @returns The slot and block number if it is possible to propose, undefined otherwise
|
|
250
258
|
*/
|
|
251
259
|
public canProposeAtNextEthBlock(tipArchive: Buffer) {
|
|
252
|
-
const ignoredErrors = ['SlotAlreadyInChain', 'InvalidProposer'];
|
|
260
|
+
const ignoredErrors = ['SlotAlreadyInChain', 'InvalidProposer', 'InvalidArchive'];
|
|
253
261
|
return this.rollupContract
|
|
254
262
|
.canProposeAtNextEthBlock(tipArchive, this.getForwarderAddress().toString(), this.ethereumSlotDuration)
|
|
255
263
|
.catch(err => {
|
|
@@ -335,114 +343,85 @@ export class SequencerPublisher {
|
|
|
335
343
|
return committee.map(EthAddress.fromString);
|
|
336
344
|
}
|
|
337
345
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
public async enqueueCastVote(slotNumber: bigint, timestamp: bigint, voteType: VoteType): Promise<boolean> {
|
|
346
|
-
// @todo This function can be optimized by doing some of the computations locally instead of calling the L1 contracts
|
|
346
|
+
private async enqueueCastVoteHelper(
|
|
347
|
+
slotNumber: bigint,
|
|
348
|
+
timestamp: bigint,
|
|
349
|
+
voteType: VoteType,
|
|
350
|
+
payload: EthAddress,
|
|
351
|
+
base: IEmpireBase,
|
|
352
|
+
): Promise<boolean> {
|
|
347
353
|
if (this.myLastVotes[voteType] >= slotNumber) {
|
|
348
354
|
return false;
|
|
349
355
|
}
|
|
350
|
-
|
|
351
|
-
const voteConfig = async (): Promise<
|
|
352
|
-
{ payload: EthAddress; voteContractAddress: EthAddress; logger: Logger } | undefined
|
|
353
|
-
> => {
|
|
354
|
-
if (voteType === VoteType.GOVERNANCE) {
|
|
355
|
-
if (this.governancePayload.equals(EthAddress.ZERO)) {
|
|
356
|
-
return undefined;
|
|
357
|
-
}
|
|
358
|
-
if (!this.governanceProposerAddress) {
|
|
359
|
-
return undefined;
|
|
360
|
-
}
|
|
361
|
-
return {
|
|
362
|
-
payload: this.governancePayload,
|
|
363
|
-
voteContractAddress: this.governanceProposerAddress,
|
|
364
|
-
logger: this.governanceLog,
|
|
365
|
-
};
|
|
366
|
-
} else if (voteType === VoteType.SLASHING) {
|
|
367
|
-
if (!this.getSlashPayload) {
|
|
368
|
-
return undefined;
|
|
369
|
-
}
|
|
370
|
-
const slashingProposerAddress = await this.rollupContract.getSlashingProposerAddress();
|
|
371
|
-
if (!slashingProposerAddress) {
|
|
372
|
-
return undefined;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const slashPayload = await this.getSlashPayload(slotNumber);
|
|
376
|
-
|
|
377
|
-
if (!slashPayload) {
|
|
378
|
-
return undefined;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
return {
|
|
382
|
-
payload: slashPayload,
|
|
383
|
-
voteContractAddress: slashingProposerAddress,
|
|
384
|
-
logger: this.slashingLog,
|
|
385
|
-
};
|
|
386
|
-
} else {
|
|
387
|
-
throw new Error('Invalid vote type');
|
|
388
|
-
}
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
const vConfig = await voteConfig();
|
|
392
|
-
|
|
393
|
-
if (!vConfig) {
|
|
356
|
+
if (payload.equals(EthAddress.ZERO)) {
|
|
394
357
|
return false;
|
|
395
358
|
}
|
|
396
|
-
|
|
397
|
-
const
|
|
398
|
-
|
|
399
|
-
const voteContract = getContract({
|
|
400
|
-
address: getAddress(voteContractAddress.toString()),
|
|
401
|
-
abi: EmpireBaseAbi,
|
|
402
|
-
client: this.l1TxUtils.walletClient,
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
const [proposer, roundNumber] = await Promise.all([
|
|
359
|
+
const round = await base.computeRound(slotNumber);
|
|
360
|
+
const [proposer, roundInfo] = await Promise.all([
|
|
406
361
|
this.rollupContract.getProposerAt(timestamp),
|
|
407
|
-
|
|
362
|
+
base.getRoundInfo(this.rollupContract.address, round),
|
|
408
363
|
]);
|
|
409
364
|
|
|
410
365
|
if (proposer.toLowerCase() !== this.getForwarderAddress().toString().toLowerCase()) {
|
|
411
366
|
return false;
|
|
412
367
|
}
|
|
413
|
-
|
|
414
|
-
const [slotForLastVote] = await voteContract.read.rounds([this.rollupContract.address, roundNumber]);
|
|
415
|
-
|
|
416
|
-
if (slotForLastVote >= slotNumber) {
|
|
368
|
+
if (roundInfo.lastVote >= slotNumber) {
|
|
417
369
|
return false;
|
|
418
370
|
}
|
|
419
371
|
|
|
420
372
|
const cachedLastVote = this.myLastVotes[voteType];
|
|
421
|
-
|
|
422
373
|
this.myLastVotes[voteType] = slotNumber;
|
|
423
374
|
|
|
424
375
|
this.addRequest({
|
|
425
376
|
action: voteType === VoteType.GOVERNANCE ? 'governance-vote' : 'slashing-vote',
|
|
426
|
-
request:
|
|
427
|
-
to: voteContractAddress.toString(),
|
|
428
|
-
data: encodeFunctionData({
|
|
429
|
-
abi: EmpireBaseAbi,
|
|
430
|
-
functionName: 'vote',
|
|
431
|
-
args: [payload.toString()],
|
|
432
|
-
}),
|
|
433
|
-
},
|
|
377
|
+
request: base.createVoteRequest(payload.toString()),
|
|
434
378
|
lastValidL2Slot: slotNumber,
|
|
435
379
|
onResult: (_request, result) => {
|
|
436
380
|
if (!result || result.receipt.status !== 'success') {
|
|
437
381
|
this.myLastVotes[voteType] = cachedLastVote;
|
|
438
382
|
} else {
|
|
439
|
-
this.log.info(`Cast ${voteType} vote for slot ${slotNumber}`);
|
|
383
|
+
this.log.info(`Cast [${voteType}] vote for slot ${slotNumber}`);
|
|
440
384
|
}
|
|
441
385
|
},
|
|
442
386
|
});
|
|
443
387
|
return true;
|
|
444
388
|
}
|
|
445
389
|
|
|
390
|
+
private async getVoteConfig(
|
|
391
|
+
slotNumber: bigint,
|
|
392
|
+
voteType: VoteType,
|
|
393
|
+
): Promise<{ payload: EthAddress; base: IEmpireBase } | undefined> {
|
|
394
|
+
if (voteType === VoteType.GOVERNANCE) {
|
|
395
|
+
return { payload: this.governancePayload, base: this.govProposerContract };
|
|
396
|
+
} else if (voteType === VoteType.SLASHING) {
|
|
397
|
+
if (!this.getSlashPayload) {
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
const slashPayload = await this.getSlashPayload(slotNumber);
|
|
401
|
+
if (!slashPayload) {
|
|
402
|
+
return undefined;
|
|
403
|
+
}
|
|
404
|
+
return { payload: slashPayload, base: this.slashingProposerContract };
|
|
405
|
+
}
|
|
406
|
+
throw new Error('Unreachable: Invalid vote type');
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Enqueues a castVote transaction to cast a vote for a given slot number.
|
|
411
|
+
* @param slotNumber - The slot number to cast a vote for.
|
|
412
|
+
* @param timestamp - The timestamp of the slot to cast a vote for.
|
|
413
|
+
* @param voteType - The type of vote to cast.
|
|
414
|
+
* @returns True if the vote was successfully enqueued, false otherwise.
|
|
415
|
+
*/
|
|
416
|
+
public async enqueueCastVote(slotNumber: bigint, timestamp: bigint, voteType: VoteType): Promise<boolean> {
|
|
417
|
+
const voteConfig = await this.getVoteConfig(slotNumber, voteType);
|
|
418
|
+
if (!voteConfig) {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
const { payload, base } = voteConfig;
|
|
422
|
+
return this.enqueueCastVoteHelper(slotNumber, timestamp, voteType, payload, base);
|
|
423
|
+
}
|
|
424
|
+
|
|
446
425
|
/**
|
|
447
426
|
* Proposes a L2 block on L1.
|
|
448
427
|
*
|
|
@@ -627,7 +606,7 @@ export class SequencerPublisher {
|
|
|
627
606
|
// @note we override checkBlob to false since blobs are not part simulate()
|
|
628
607
|
stateDiff: [
|
|
629
608
|
{
|
|
630
|
-
slot: toHex(
|
|
609
|
+
slot: toHex(RollupContract.checkBlobStorageSlot, true),
|
|
631
610
|
value: toHex(0n, true),
|
|
632
611
|
},
|
|
633
612
|
],
|
|
@@ -657,6 +636,7 @@ export class SequencerPublisher {
|
|
|
657
636
|
const kzg = Blob.getViemKzgInstance();
|
|
658
637
|
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, timestamp);
|
|
659
638
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
639
|
+
const blockHash = await block.hash();
|
|
660
640
|
|
|
661
641
|
return this.addRequest({
|
|
662
642
|
action: 'propose',
|
|
@@ -708,7 +688,7 @@ export class SequencerPublisher {
|
|
|
708
688
|
this.log.error(`Rollup process tx reverted. ${errorMsg ?? 'No error message'}`, undefined, {
|
|
709
689
|
...block.getStats(),
|
|
710
690
|
txHash: receipt.transactionHash,
|
|
711
|
-
blockHash
|
|
691
|
+
blockHash,
|
|
712
692
|
slotNumber: block.header.globalVariables.slotNumber.toBigInt(),
|
|
713
693
|
});
|
|
714
694
|
}
|