@aztec/sequencer-client 0.62.0 → 0.63.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.
- package/dest/block_builder/light.d.ts.map +1 -1
- package/dest/block_builder/light.js +3 -5
- package/dest/client/sequencer-client.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +9 -4
- package/dest/config.d.ts +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +14 -10
- package/dest/global_variable_builder/global_builder.d.ts +3 -2
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +4 -3
- package/dest/publisher/l1-publisher.d.ts +6 -4
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +22 -18
- package/dest/sequencer/metrics.d.ts +3 -2
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +16 -2
- package/dest/sequencer/sequencer.d.ts +23 -38
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +104 -94
- package/dest/sequencer/utils.d.ts +52 -0
- package/dest/sequencer/utils.d.ts.map +1 -0
- package/dest/sequencer/utils.js +70 -0
- package/dest/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/tx_validator/gas_validator.js +5 -5
- package/dest/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/tx_validator/phases_validator.js +4 -4
- package/dest/tx_validator/test_utils.js +9 -7
- package/package.json +19 -19
- package/src/block_builder/light.ts +1 -4
- package/src/client/sequencer-client.ts +10 -2
- package/src/config.ts +24 -10
- package/src/global_variable_builder/global_builder.ts +7 -10
- package/src/publisher/l1-publisher.ts +29 -21
- package/src/sequencer/metrics.ts +18 -2
- package/src/sequencer/sequencer.ts +130 -100
- package/src/sequencer/utils.ts +78 -0
- package/src/tx_validator/gas_validator.ts +4 -4
- package/src/tx_validator/phases_validator.ts +3 -3
- package/src/tx_validator/test_utils.ts +9 -7
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var _GasTxValidator_instances, _GasTxValidator_log, _GasTxValidator_publicDataSource, _GasTxValidator_feeJuiceAddress, _GasTxValidator_validateTxFee;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import {
|
|
3
|
+
import { TxExecutionPhase } from '@aztec/circuit-types';
|
|
4
4
|
import { FunctionSelector } from '@aztec/circuits.js';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
-
import {
|
|
6
|
+
import { computeFeePayerBalanceStorageSlot, getExecutionRequestsByPhase } from '@aztec/simulator';
|
|
7
7
|
export class GasTxValidator {
|
|
8
8
|
constructor(publicDataSource, feeJuiceAddress, enforceFees) {
|
|
9
9
|
_GasTxValidator_instances.add(this);
|
|
@@ -47,13 +47,13 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
47
47
|
// Read current balance of the feePayer
|
|
48
48
|
const initialBalance = await __classPrivateFieldGet(this, _GasTxValidator_publicDataSource, "f").storageRead(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f"), computeFeePayerBalanceStorageSlot(feePayer));
|
|
49
49
|
// If there is a claim in this tx that increases the fee payer balance in Fee Juice, add it to balance
|
|
50
|
-
const setupFns =
|
|
50
|
+
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
51
51
|
const claimFunctionCall = setupFns.find(fn => fn.callContext.contractAddress.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
52
52
|
fn.callContext.msgSender.equals(__classPrivateFieldGet(this, _GasTxValidator_feeJuiceAddress, "f")) &&
|
|
53
53
|
fn.args.length > 2 &&
|
|
54
54
|
// Public functions get routed through the dispatch function, whose first argument is the target function selector.
|
|
55
55
|
fn.args[0].equals(FunctionSelector.fromSignature('_increase_public_balance((Field),Field)').toField()) &&
|
|
56
|
-
fn.args[1].equals(feePayer) &&
|
|
56
|
+
fn.args[1].equals(feePayer.toField()) &&
|
|
57
57
|
!fn.callContext.isStaticCall);
|
|
58
58
|
const balance = claimFunctionCall ? initialBalance.add(claimFunctionCall.args[2]) : initialBalance;
|
|
59
59
|
if (balance.lt(feeLimit)) {
|
|
@@ -62,4 +62,4 @@ _GasTxValidator_log = new WeakMap(), _GasTxValidator_publicDataSource = new Weak
|
|
|
62
62
|
}
|
|
63
63
|
return true;
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvZ2FzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxnQkFBZ0IsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRixPQUFPLEVBQThCLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPbEcsTUFBTSxPQUFPLGNBQWM7SUFLekIsWUFBWSxnQkFBbUMsRUFBRSxlQUE2QixFQUFTLFdBQW9COztRQUFwQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUozRyw4QkFBTyxpQkFBaUIsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFDO1FBQ2hFLG1EQUFxQztRQUNyQyxrREFBK0I7UUFHN0IsdUJBQUEsSUFBSSxvQ0FBcUIsZ0JBQWdCLE1BQUEsQ0FBQztRQUMxQyx1QkFBQSxJQUFJLG1DQUFvQixlQUFlLE1BQUEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLFVBQVUsR0FBUyxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sdUJBQUEsSUFBSSxnRUFBZSxNQUFuQixJQUFJLEVBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENB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
|
|
@@ -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,
|
|
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,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAsBnE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBpC,aAAa,CAAC,UAAU,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA6CvG"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var _PhasesTxValidator_log;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import {
|
|
3
|
+
import { Tx, TxExecutionPhase, } from '@aztec/circuit-types';
|
|
4
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
-
import { ContractsDataSourcePublicDB,
|
|
5
|
+
import { ContractsDataSourcePublicDB, getExecutionRequestsByPhase } from '@aztec/simulator';
|
|
6
6
|
export class PhasesTxValidator {
|
|
7
7
|
constructor(contracts, setupAllowList) {
|
|
8
8
|
this.setupAllowList = setupAllowList;
|
|
@@ -32,7 +32,7 @@ export class PhasesTxValidator {
|
|
|
32
32
|
__classPrivateFieldGet(this, _PhasesTxValidator_log, "f").debug(`Tx ${Tx.getHash(tx)} does not contain enqueued public functions. Skipping phases validation.`);
|
|
33
33
|
return true;
|
|
34
34
|
}
|
|
35
|
-
const setupFns =
|
|
35
|
+
const setupFns = getExecutionRequestsByPhase(tx, TxExecutionPhase.SETUP);
|
|
36
36
|
for (const setupFn of setupFns) {
|
|
37
37
|
if (!(await this.isOnAllowList(setupFn, this.setupAllowList))) {
|
|
38
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}`);
|
|
@@ -78,4 +78,4 @@ export class PhasesTxValidator {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
_PhasesTxValidator_log = new WeakMap();
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvcGhhc2VzX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxFQUFFLEVBQ0YsZ0JBQWdCLEdBRWpCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUYsTUFBTSxPQUFPLGlCQUFpQjtJQUk1QixZQUFZLFNBQTZCLEVBQVUsY0FBZ0M7UUFBaEMsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBSG5GLGlDQUFPLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLEVBQUM7UUFJakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBUztRQUN6QixNQUFNLFFBQVEsR0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQVMsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsd0ZBQXdGO1lBQ3hGLG1HQUFtRztZQUNuRywrREFBK0Q7WUFDL0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWxELElBQUksTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFNO1FBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLHVCQUFBLElBQUksOEJBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1lBQ2hILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsdUJBQUEsSUFBSSw4QkFBSyxDQUFDLElBQUksQ0FDWixnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsdURBQzVCLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFDdEIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQzNDLENBQUM7Z0JBRUYsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBa0MsRUFBRSxTQUEyQjtRQUNqRixJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBRXJFLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUM5QyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztvQkFDckYsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELElBQUksYUFBYSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ3hELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFVBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDOUMsSUFDRSxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUNuRCxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFDekUsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiJ9
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { computeVarArgsHash } from '@aztec/circuits.js/hash';
|
|
2
2
|
export function patchNonRevertibleFn(tx, index, overrides) {
|
|
3
|
-
return patchFn('
|
|
3
|
+
return patchFn('nonRevertibleAccumulatedData', tx, index, overrides);
|
|
4
4
|
}
|
|
5
5
|
export function patchRevertibleFn(tx, index, overrides) {
|
|
6
|
-
return patchFn('
|
|
6
|
+
return patchFn('revertibleAccumulatedData', tx, index, overrides);
|
|
7
7
|
}
|
|
8
8
|
function patchFn(where, tx, index, overrides) {
|
|
9
9
|
const fn = tx.enqueuedPublicFunctionCalls.at(-1 * index - 1);
|
|
@@ -12,14 +12,16 @@ function patchFn(where, tx, index, overrides) {
|
|
|
12
12
|
fn.args = overrides.args ?? fn.args;
|
|
13
13
|
fn.callContext.msgSender = overrides.msgSender ?? fn.callContext.msgSender;
|
|
14
14
|
tx.enqueuedPublicFunctionCalls[index] = fn;
|
|
15
|
-
const request = tx.data.forPublic[where].
|
|
16
|
-
request.
|
|
17
|
-
request.
|
|
15
|
+
const request = tx.data.forPublic[where].publicCallRequests[index];
|
|
16
|
+
request.contractAddress = fn.callContext.contractAddress;
|
|
17
|
+
request.msgSender = fn.callContext.msgSender;
|
|
18
|
+
request.functionSelector = fn.callContext.functionSelector;
|
|
19
|
+
request.isStaticCall = fn.callContext.isStaticCall;
|
|
18
20
|
request.argsHash = computeVarArgsHash(fn.args);
|
|
19
|
-
tx.data.forPublic[where].
|
|
21
|
+
tx.data.forPublic[where].publicCallRequests[index] = request;
|
|
20
22
|
return {
|
|
21
23
|
address: fn.callContext.contractAddress,
|
|
22
24
|
selector: fn.callContext.functionSelector,
|
|
23
25
|
};
|
|
24
26
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eF92YWxpZGF0b3IvdGVzdF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsT0FBTyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixFQUFNLEVBQ04sS0FBYSxFQUNiLFNBQXdHO0lBRXhHLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUNkLEtBQW1FLEVBQ25FLEVBQU0sRUFDTixLQUFhLEVBQ2IsU0FBd0c7SUFFeEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFFLENBQUM7SUFDOUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztJQUNyRixFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDckQsRUFBRSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7SUFDekQsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzRCxPQUFPLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUU5RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZTtRQUN2QyxRQUFRLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7S0FDMUMsQ0FBQztBQUNKLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.63.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -24,24 +24,24 @@
|
|
|
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/aztec.js": "0.
|
|
28
|
-
"@aztec/bb-prover": "0.
|
|
29
|
-
"@aztec/circuit-types": "0.
|
|
30
|
-
"@aztec/circuits.js": "0.
|
|
31
|
-
"@aztec/ethereum": "0.
|
|
32
|
-
"@aztec/foundation": "0.
|
|
33
|
-
"@aztec/l1-artifacts": "0.
|
|
34
|
-
"@aztec/merkle-tree": "0.
|
|
35
|
-
"@aztec/noir-contracts.js": "0.
|
|
36
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
37
|
-
"@aztec/p2p": "0.
|
|
38
|
-
"@aztec/protocol-contracts": "0.
|
|
39
|
-
"@aztec/prover-client": "0.
|
|
40
|
-
"@aztec/simulator": "0.
|
|
41
|
-
"@aztec/telemetry-client": "0.
|
|
42
|
-
"@aztec/types": "0.
|
|
43
|
-
"@aztec/validator-client": "0.
|
|
44
|
-
"@aztec/world-state": "0.
|
|
27
|
+
"@aztec/aztec.js": "0.63.0",
|
|
28
|
+
"@aztec/bb-prover": "0.63.0",
|
|
29
|
+
"@aztec/circuit-types": "0.63.0",
|
|
30
|
+
"@aztec/circuits.js": "0.63.0",
|
|
31
|
+
"@aztec/ethereum": "0.63.0",
|
|
32
|
+
"@aztec/foundation": "0.63.0",
|
|
33
|
+
"@aztec/l1-artifacts": "0.63.0",
|
|
34
|
+
"@aztec/merkle-tree": "0.63.0",
|
|
35
|
+
"@aztec/noir-contracts.js": "0.63.0",
|
|
36
|
+
"@aztec/noir-protocol-circuits-types": "0.63.0",
|
|
37
|
+
"@aztec/p2p": "0.63.0",
|
|
38
|
+
"@aztec/protocol-contracts": "0.63.0",
|
|
39
|
+
"@aztec/prover-client": "0.63.0",
|
|
40
|
+
"@aztec/simulator": "0.63.0",
|
|
41
|
+
"@aztec/telemetry-client": "0.63.0",
|
|
42
|
+
"@aztec/types": "0.63.0",
|
|
43
|
+
"@aztec/validator-client": "0.63.0",
|
|
44
|
+
"@aztec/world-state": "0.63.0",
|
|
45
45
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
46
46
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
47
47
|
"lodash.chunk": "^4.2.0",
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
type ProcessedTx,
|
|
9
9
|
type TxEffect,
|
|
10
10
|
makeEmptyProcessedTx,
|
|
11
|
-
toTxEffect,
|
|
12
11
|
} from '@aztec/circuit-types';
|
|
13
12
|
import { Fr, type GlobalVariables, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js';
|
|
14
13
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
@@ -68,9 +67,7 @@ export class LightweightBlockBuilder implements BlockBuilder {
|
|
|
68
67
|
|
|
69
68
|
private async buildBlock(): Promise<L2Block> {
|
|
70
69
|
this.logger.verbose(`Finalising block`);
|
|
71
|
-
const nonEmptyTxEffects: TxEffect[] = this.txs
|
|
72
|
-
.map(tx => toTxEffect(tx, this.globalVariables!.gasFees))
|
|
73
|
-
.filter(txEffect => !txEffect.isEmpty());
|
|
70
|
+
const nonEmptyTxEffects: TxEffect[] = this.txs.map(tx => tx.txEffect).filter(txEffect => !txEffect.isEmpty());
|
|
74
71
|
const body = new Body(nonEmptyTxEffects);
|
|
75
72
|
const header = await buildHeaderFromTxEffects(body, this.globalVariables!, this.l1ToL2Messages!, this.db);
|
|
76
73
|
|
|
@@ -40,13 +40,19 @@ export class SequencerClient {
|
|
|
40
40
|
contractDataSource: ContractDataSource,
|
|
41
41
|
l2BlockSource: L2BlockSource,
|
|
42
42
|
l1ToL2MessageSource: L1ToL2MessageSource,
|
|
43
|
-
|
|
43
|
+
_simulationProvider: SimulationProvider,
|
|
44
44
|
telemetryClient: TelemetryClient,
|
|
45
45
|
) {
|
|
46
46
|
const publisher = new L1Publisher(config, telemetryClient);
|
|
47
47
|
const globalsBuilder = new GlobalVariableBuilder(config);
|
|
48
48
|
|
|
49
|
-
const publicProcessorFactory = new PublicProcessorFactory(contractDataSource,
|
|
49
|
+
const publicProcessorFactory = new PublicProcessorFactory(contractDataSource, telemetryClient);
|
|
50
|
+
|
|
51
|
+
const rollup = publisher.getRollupContract();
|
|
52
|
+
const [l1GenesisTime, slotDuration] = await Promise.all([
|
|
53
|
+
rollup.read.GENESIS_TIME(),
|
|
54
|
+
rollup.read.SLOT_DURATION(),
|
|
55
|
+
] as const);
|
|
50
56
|
|
|
51
57
|
const sequencer = new Sequencer(
|
|
52
58
|
publisher,
|
|
@@ -59,6 +65,8 @@ export class SequencerClient {
|
|
|
59
65
|
l1ToL2MessageSource,
|
|
60
66
|
publicProcessorFactory,
|
|
61
67
|
new TxValidatorFactory(worldStateSynchronizer.getCommitted(), contractDataSource, !!config.enforceFees),
|
|
68
|
+
Number(l1GenesisTime),
|
|
69
|
+
Number(slotDuration),
|
|
62
70
|
telemetryClient,
|
|
63
71
|
config,
|
|
64
72
|
);
|
package/src/config.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { type AllowedElement } from '@aztec/circuit-types';
|
|
2
2
|
import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
type L1ContractsConfig,
|
|
5
|
+
type L1ReaderConfig,
|
|
6
|
+
l1ContractsConfigMappings,
|
|
7
|
+
l1ReaderConfigMappings,
|
|
8
|
+
} from '@aztec/ethereum';
|
|
4
9
|
import {
|
|
5
10
|
type ConfigMappingsType,
|
|
6
11
|
booleanConfigHelper,
|
|
7
12
|
getConfigFromMappings,
|
|
8
13
|
numberConfigHelper,
|
|
9
14
|
} from '@aztec/foundation/config';
|
|
15
|
+
import { pickConfigMappings } from '@aztec/foundation/config';
|
|
10
16
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
17
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
12
18
|
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
|
|
@@ -31,7 +37,12 @@ type ChainConfig = {
|
|
|
31
37
|
/**
|
|
32
38
|
* Configuration settings for the SequencerClient.
|
|
33
39
|
*/
|
|
34
|
-
export type SequencerClientConfig = PublisherConfig &
|
|
40
|
+
export type SequencerClientConfig = PublisherConfig &
|
|
41
|
+
TxSenderConfig &
|
|
42
|
+
SequencerConfig &
|
|
43
|
+
L1ReaderConfig &
|
|
44
|
+
ChainConfig &
|
|
45
|
+
Pick<L1ContractsConfig, 'ethereumSlotDuration'>;
|
|
35
46
|
|
|
36
47
|
export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
37
48
|
transactionPollingIntervalMS: {
|
|
@@ -91,7 +102,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
91
102
|
parseEnv: (val: string) => parseSequencerAllowList(val),
|
|
92
103
|
defaultValue: getDefaultAllowedTeardownFunctions(),
|
|
93
104
|
description: 'The list of functions calls allowed to run teardown',
|
|
94
|
-
printDefault: () => 'FPC.pay_refund
|
|
105
|
+
printDefault: () => 'FPC.pay_refund',
|
|
95
106
|
},
|
|
96
107
|
maxBlockSizeInBytes: {
|
|
97
108
|
env: 'SEQ_MAX_BLOCK_SIZE_IN_BYTES',
|
|
@@ -103,9 +114,15 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
103
114
|
description: 'Whether to require every tx to have a fee payer',
|
|
104
115
|
...booleanConfigHelper(),
|
|
105
116
|
},
|
|
106
|
-
|
|
107
|
-
env: '
|
|
108
|
-
description: '
|
|
117
|
+
enforceTimeTable: {
|
|
118
|
+
env: 'SEQ_ENFORCE_TIME_TABLE',
|
|
119
|
+
description: 'Whether to enforce the time table when building blocks',
|
|
120
|
+
...booleanConfigHelper(),
|
|
121
|
+
defaultValue: false,
|
|
122
|
+
},
|
|
123
|
+
governanceProposerPayload: {
|
|
124
|
+
env: 'GOVERNANCE_PROPOSER_PAYLOAD_ADDRESS',
|
|
125
|
+
description: 'The address of the payload for the governanceProposer',
|
|
109
126
|
parseEnv: (val: string) => EthAddress.fromString(val),
|
|
110
127
|
defaultValue: EthAddress.ZERO,
|
|
111
128
|
},
|
|
@@ -126,6 +143,7 @@ export const sequencerClientConfigMappings: ConfigMappingsType<SequencerClientCo
|
|
|
126
143
|
...getTxSenderConfigMappings('SEQ'),
|
|
127
144
|
...getPublisherConfigMappings('SEQ'),
|
|
128
145
|
...chainConfigMappings,
|
|
146
|
+
...pickConfigMappings(l1ContractsConfigMappings, ['ethereumSlotDuration']),
|
|
129
147
|
};
|
|
130
148
|
|
|
131
149
|
/**
|
|
@@ -217,9 +235,5 @@ function getDefaultAllowedTeardownFunctions(): AllowedElement[] {
|
|
|
217
235
|
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
218
236
|
selector: FunctionSelector.fromSignature('pay_refund((Field),Field,(Field))'),
|
|
219
237
|
},
|
|
220
|
-
{
|
|
221
|
-
classId: getContractClassFromArtifact(FPCContract.artifact).id,
|
|
222
|
-
selector: FunctionSelector.fromSignature('pay_refund_with_shielded_rebate(Field,(Field),Field)'),
|
|
223
|
-
},
|
|
224
238
|
];
|
|
225
239
|
}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { type GlobalVariableBuilder as GlobalVariableBuilderInterface } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
ETHEREUM_SLOT_DURATION,
|
|
5
|
-
type EthAddress,
|
|
6
|
-
GasFees,
|
|
7
|
-
GlobalVariables,
|
|
8
|
-
} from '@aztec/circuits.js';
|
|
9
|
-
import { type L1ReaderConfig, createEthereumChain } from '@aztec/ethereum';
|
|
2
|
+
import { type AztecAddress, type EthAddress, GasFees, GlobalVariables } from '@aztec/circuits.js';
|
|
3
|
+
import { type L1ContractsConfig, type L1ReaderConfig, createEthereumChain } from '@aztec/ethereum';
|
|
10
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
11
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
12
6
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
@@ -30,12 +24,15 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
30
24
|
|
|
31
25
|
private rollupContract: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, chains.Chain>>;
|
|
32
26
|
private publicClient: PublicClient<HttpTransport, chains.Chain>;
|
|
27
|
+
private ethereumSlotDuration: number;
|
|
33
28
|
|
|
34
|
-
constructor(config: L1ReaderConfig) {
|
|
29
|
+
constructor(config: L1ReaderConfig & Pick<L1ContractsConfig, 'ethereumSlotDuration'>) {
|
|
35
30
|
const { l1RpcUrl, l1ChainId: chainId, l1Contracts } = config;
|
|
36
31
|
|
|
37
32
|
const chain = createEthereumChain(l1RpcUrl, chainId);
|
|
38
33
|
|
|
34
|
+
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
35
|
+
|
|
39
36
|
this.publicClient = createPublicClient({
|
|
40
37
|
chain: chain.chainInfo,
|
|
41
38
|
transport: http(chain.rpcUrl),
|
|
@@ -67,7 +64,7 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
67
64
|
const chainId = new Fr(this.publicClient.chain.id);
|
|
68
65
|
|
|
69
66
|
if (slotNumber === undefined) {
|
|
70
|
-
const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(
|
|
67
|
+
const ts = BigInt((await this.publicClient.getBlock()).timestamp + BigInt(this.ethereumSlotDuration));
|
|
71
68
|
slotNumber = await this.rollupContract.read.getSlotAt([ts]);
|
|
72
69
|
}
|
|
73
70
|
|
|
@@ -3,21 +3,21 @@ import {
|
|
|
3
3
|
type EpochProofClaim,
|
|
4
4
|
type EpochProofQuote,
|
|
5
5
|
type L2Block,
|
|
6
|
+
SignatureDomainSeperator,
|
|
6
7
|
type TxHash,
|
|
7
8
|
getHashedSignaturePayload,
|
|
8
9
|
} from '@aztec/circuit-types';
|
|
9
10
|
import { type L1PublishBlockStats, type L1PublishProofStats } from '@aztec/circuit-types/stats';
|
|
10
11
|
import {
|
|
11
12
|
AGGREGATION_OBJECT_LENGTH,
|
|
12
|
-
|
|
13
|
-
ETHEREUM_SLOT_DURATION,
|
|
13
|
+
AZTEC_MAX_EPOCH_DURATION,
|
|
14
14
|
EthAddress,
|
|
15
15
|
type FeeRecipient,
|
|
16
16
|
type Header,
|
|
17
17
|
type Proof,
|
|
18
18
|
type RootRollupPublicInputs,
|
|
19
19
|
} from '@aztec/circuits.js';
|
|
20
|
-
import { createEthereumChain } from '@aztec/ethereum';
|
|
20
|
+
import { type L1ContractsConfig, createEthereumChain } from '@aztec/ethereum';
|
|
21
21
|
import { makeTuple } from '@aztec/foundation/array';
|
|
22
22
|
import { areArraysEqual, compactArray, times } from '@aztec/foundation/collection';
|
|
23
23
|
import { type Signature } from '@aztec/foundation/eth-signature';
|
|
@@ -26,7 +26,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
26
26
|
import { type Tuple, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
27
27
|
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
28
28
|
import { Timer } from '@aztec/foundation/timer';
|
|
29
|
-
import {
|
|
29
|
+
import { GovernanceProposerAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
30
30
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
31
31
|
|
|
32
32
|
import pick from 'lodash.pick';
|
|
@@ -122,7 +122,7 @@ export type L1SubmitEpochProofArgs = {
|
|
|
122
122
|
endTimestamp: Fr;
|
|
123
123
|
outHash: Fr;
|
|
124
124
|
proverId: Fr;
|
|
125
|
-
fees: Tuple<FeeRecipient, typeof
|
|
125
|
+
fees: Tuple<FeeRecipient, typeof AZTEC_MAX_EPOCH_DURATION>;
|
|
126
126
|
proof: Proof;
|
|
127
127
|
};
|
|
128
128
|
|
|
@@ -149,20 +149,25 @@ export class L1Publisher {
|
|
|
149
149
|
typeof RollupAbi,
|
|
150
150
|
WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>
|
|
151
151
|
>;
|
|
152
|
-
private
|
|
153
|
-
typeof
|
|
152
|
+
private governanceProposerContract?: GetContractReturnType<
|
|
153
|
+
typeof GovernanceProposerAbi,
|
|
154
154
|
WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>
|
|
155
155
|
> = undefined;
|
|
156
156
|
|
|
157
157
|
private publicClient: PublicClient<HttpTransport, chains.Chain>;
|
|
158
158
|
private walletClient: WalletClient<HttpTransport, chains.Chain, PrivateKeyAccount>;
|
|
159
159
|
private account: PrivateKeyAccount;
|
|
160
|
+
private ethereumSlotDuration: bigint;
|
|
160
161
|
|
|
161
162
|
public static PROPOSE_GAS_GUESS: bigint = 12_000_000n;
|
|
162
163
|
public static PROPOSE_AND_CLAIM_GAS_GUESS: bigint = this.PROPOSE_GAS_GUESS + 100_000n;
|
|
163
164
|
|
|
164
|
-
constructor(
|
|
165
|
+
constructor(
|
|
166
|
+
config: TxSenderConfig & PublisherConfig & Pick<L1ContractsConfig, 'ethereumSlotDuration'>,
|
|
167
|
+
client: TelemetryClient,
|
|
168
|
+
) {
|
|
165
169
|
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
170
|
+
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
166
171
|
this.metrics = new L1PublisherMetrics(client, 'L1Publisher');
|
|
167
172
|
|
|
168
173
|
const { l1RpcUrl: rpcUrl, l1ChainId: chainId, publisherPrivateKey, l1Contracts } = config;
|
|
@@ -188,10 +193,10 @@ export class L1Publisher {
|
|
|
188
193
|
client: this.walletClient,
|
|
189
194
|
});
|
|
190
195
|
|
|
191
|
-
if (l1Contracts.
|
|
192
|
-
this.
|
|
193
|
-
address: getAddress(l1Contracts.
|
|
194
|
-
abi:
|
|
196
|
+
if (l1Contracts.governanceProposerAddress) {
|
|
197
|
+
this.governanceProposerContract = getContract({
|
|
198
|
+
address: getAddress(l1Contracts.governanceProposerAddress.toString()),
|
|
199
|
+
abi: GovernanceProposerAbi,
|
|
195
200
|
client: this.walletClient,
|
|
196
201
|
});
|
|
197
202
|
}
|
|
@@ -239,7 +244,7 @@ export class L1Publisher {
|
|
|
239
244
|
// FIXME: This should not throw if unable to propose but return a falsey value, so
|
|
240
245
|
// we can differentiate between errors when hitting the L1 rollup contract (eg RPC error)
|
|
241
246
|
// which may require a retry, vs actually not being the turn for proposing.
|
|
242
|
-
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp +
|
|
247
|
+
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
243
248
|
const [slot, blockNumber] = await this.rollupContract.read.canProposeAtTime([
|
|
244
249
|
timeOfNextL1Slot,
|
|
245
250
|
`0x${archive.toString('hex')}`,
|
|
@@ -305,7 +310,7 @@ export class L1Publisher {
|
|
|
305
310
|
}
|
|
306
311
|
|
|
307
312
|
public async validateProofQuote(quote: EpochProofQuote): Promise<EpochProofQuote | undefined> {
|
|
308
|
-
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp +
|
|
313
|
+
const timeOfNextL1Slot = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
309
314
|
const args = [timeOfNextL1Slot, quote.toViemArgs()] as const;
|
|
310
315
|
try {
|
|
311
316
|
await this.rollupContract.read.validateEpochProofRightClaimAtTime(args, { account: this.account });
|
|
@@ -333,7 +338,7 @@ export class L1Publisher {
|
|
|
333
338
|
signatures: [],
|
|
334
339
|
},
|
|
335
340
|
): Promise<void> {
|
|
336
|
-
const ts = BigInt((await this.publicClient.getBlock()).timestamp +
|
|
341
|
+
const ts = BigInt((await this.publicClient.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
337
342
|
|
|
338
343
|
const formattedSignatures = attestationData.signatures.map(attest => attest.toViemSignature());
|
|
339
344
|
const flags = { ignoreDA: true, ignoreSignatures: formattedSignatures.length == 0 };
|
|
@@ -385,7 +390,7 @@ export class L1Publisher {
|
|
|
385
390
|
return false;
|
|
386
391
|
}
|
|
387
392
|
|
|
388
|
-
if (!this.
|
|
393
|
+
if (!this.governanceProposerContract) {
|
|
389
394
|
return false;
|
|
390
395
|
}
|
|
391
396
|
|
|
@@ -398,14 +403,17 @@ export class L1Publisher {
|
|
|
398
403
|
|
|
399
404
|
const [proposer, roundNumber] = await Promise.all([
|
|
400
405
|
this.rollupContract.read.getProposerAt([timestamp]),
|
|
401
|
-
this.
|
|
406
|
+
this.governanceProposerContract.read.computeRound([slotNumber]),
|
|
402
407
|
]);
|
|
403
408
|
|
|
404
409
|
if (proposer != this.account.address) {
|
|
405
410
|
return false;
|
|
406
411
|
}
|
|
407
412
|
|
|
408
|
-
const [slotForLastVote] = await this.
|
|
413
|
+
const [slotForLastVote] = await this.governanceProposerContract.read.rounds([
|
|
414
|
+
this.rollupContract.address,
|
|
415
|
+
roundNumber,
|
|
416
|
+
]);
|
|
409
417
|
|
|
410
418
|
if (slotForLastVote >= slotNumber) {
|
|
411
419
|
return false;
|
|
@@ -418,7 +426,7 @@ export class L1Publisher {
|
|
|
418
426
|
|
|
419
427
|
let txHash;
|
|
420
428
|
try {
|
|
421
|
-
txHash = await this.
|
|
429
|
+
txHash = await this.governanceProposerContract.write.vote([this.payload.toString()], {
|
|
422
430
|
account: this.account,
|
|
423
431
|
});
|
|
424
432
|
} catch (err) {
|
|
@@ -461,7 +469,7 @@ export class L1Publisher {
|
|
|
461
469
|
|
|
462
470
|
const consensusPayload = new ConsensusPayload(block.header, block.archive.root, txHashes ?? []);
|
|
463
471
|
|
|
464
|
-
const digest = getHashedSignaturePayload(consensusPayload);
|
|
472
|
+
const digest = getHashedSignaturePayload(consensusPayload, SignatureDomainSeperator.blockAttestation);
|
|
465
473
|
const proposeTxArgs = {
|
|
466
474
|
header: block.header.toBuffer(),
|
|
467
475
|
archive: block.archive.root.toBuffer(),
|
|
@@ -752,7 +760,7 @@ export class L1Publisher {
|
|
|
752
760
|
args.publicInputs.outHash.toString(),
|
|
753
761
|
args.publicInputs.proverId.toString(),
|
|
754
762
|
],
|
|
755
|
-
makeTuple(
|
|
763
|
+
makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, i =>
|
|
756
764
|
i % 2 === 0
|
|
757
765
|
? args.publicInputs.fees[i / 2].recipient.toField().toString()
|
|
758
766
|
: args.publicInputs.fees[(i - 1) / 2].value.toString(),
|
package/src/sequencer/metrics.ts
CHANGED
|
@@ -10,13 +10,14 @@ import {
|
|
|
10
10
|
millisecondBuckets,
|
|
11
11
|
} from '@aztec/telemetry-client';
|
|
12
12
|
|
|
13
|
-
type SequencerStateCallback
|
|
13
|
+
import { type SequencerState, type SequencerStateCallback, sequencerStateToNumber } from './utils.js';
|
|
14
14
|
|
|
15
15
|
export class SequencerMetrics {
|
|
16
16
|
public readonly tracer: Tracer;
|
|
17
17
|
|
|
18
18
|
private blockCounter: UpDownCounter;
|
|
19
19
|
private blockBuildDuration: Histogram;
|
|
20
|
+
private stateTransitionBufferDuration: Histogram;
|
|
20
21
|
private currentBlockNumber: Gauge;
|
|
21
22
|
private currentBlockSize: Gauge;
|
|
22
23
|
|
|
@@ -33,13 +34,22 @@ export class SequencerMetrics {
|
|
|
33
34
|
explicitBucketBoundaries: millisecondBuckets(2),
|
|
34
35
|
},
|
|
35
36
|
});
|
|
37
|
+
this.stateTransitionBufferDuration = meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION, {
|
|
38
|
+
unit: 'ms',
|
|
39
|
+
description:
|
|
40
|
+
'The time difference between when the sequencer needed to transition to a new state and when it actually did.',
|
|
41
|
+
valueType: ValueType.INT,
|
|
42
|
+
advice: {
|
|
43
|
+
explicitBucketBoundaries: millisecondBuckets(2),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
36
46
|
|
|
37
47
|
const currentState = meter.createObservableGauge(Metrics.SEQUENCER_CURRENT_STATE, {
|
|
38
48
|
description: 'Current state of the sequencer',
|
|
39
49
|
});
|
|
40
50
|
|
|
41
51
|
currentState.addCallback(observer => {
|
|
42
|
-
observer.observe(getState());
|
|
52
|
+
observer.observe(sequencerStateToNumber(getState()));
|
|
43
53
|
});
|
|
44
54
|
|
|
45
55
|
this.currentBlockNumber = meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_NUMBER, {
|
|
@@ -79,6 +89,12 @@ export class SequencerMetrics {
|
|
|
79
89
|
this.setCurrentBlock(blockNumber, txCount);
|
|
80
90
|
}
|
|
81
91
|
|
|
92
|
+
recordStateTransitionBufferMs(durationMs: number, state: SequencerState) {
|
|
93
|
+
this.stateTransitionBufferDuration.record(durationMs, {
|
|
94
|
+
[Attributes.SEQUENCER_STATE]: state,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
82
98
|
private setCurrentBlock(blockNumber: number, txCount: number) {
|
|
83
99
|
this.currentBlockNumber.record(blockNumber);
|
|
84
100
|
this.currentBlockSize.record(txCount);
|