@aztec/sequencer-client 3.0.0-nightly.20251216 → 3.0.0-nightly.20251218
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/publisher/sequencer-publisher.d.ts +16 -1
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +54 -3
- package/dest/sequencer/metrics.d.ts +17 -1
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +136 -0
- package/dest/sequencer/sequencer.d.ts +7 -1
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +46 -4
- package/package.json +27 -27
- package/src/publisher/sequencer-publisher.ts +81 -3
- package/src/sequencer/metrics.ts +180 -0
- package/src/sequencer/sequencer.ts +52 -2
|
@@ -3,6 +3,7 @@ import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
|
3
3
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
4
4
|
import type { L1ContractsConfig } from '@aztec/ethereum/config';
|
|
5
5
|
import { type EmpireSlashingProposerContract, type GovernanceProposerContract, RollupContract, type TallySlashingProposerContract } from '@aztec/ethereum/contracts';
|
|
6
|
+
import { type L1FeeAnalysisResult, L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
6
7
|
import { type L1BlobInputs, type L1TxConfig, type L1TxRequest, type TransactionStats } from '@aztec/ethereum/l1-tx-utils';
|
|
7
8
|
import type { L1TxUtilsWithBlobs } from '@aztec/ethereum/l1-tx-utils-with-blobs';
|
|
8
9
|
import { FormattedViemError } from '@aztec/ethereum/utils';
|
|
@@ -55,6 +56,8 @@ export declare class SequencerPublisher {
|
|
|
55
56
|
private blobSinkClient;
|
|
56
57
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */
|
|
57
58
|
private proposerAddressForSimulation?;
|
|
59
|
+
/** L1 fee analyzer for fisherman mode */
|
|
60
|
+
private l1FeeAnalyzer?;
|
|
58
61
|
static PROPOSE_GAS_GUESS: bigint;
|
|
59
62
|
static MULTICALL_OVERHEAD_GAS_GUESS: bigint;
|
|
60
63
|
static VOTE_GAS_GUESS: bigint;
|
|
@@ -80,6 +83,10 @@ export declare class SequencerPublisher {
|
|
|
80
83
|
});
|
|
81
84
|
getRollupContract(): RollupContract;
|
|
82
85
|
getSenderAddress(): EthAddress;
|
|
86
|
+
/**
|
|
87
|
+
* Gets the L1 fee analyzer instance (only available in fisherman mode)
|
|
88
|
+
*/
|
|
89
|
+
getL1FeeAnalyzer(): L1FeeAnalyzer | undefined;
|
|
83
90
|
/**
|
|
84
91
|
* Sets the proposer address to use for simulations in fisherman mode.
|
|
85
92
|
* @param proposerAddress - The actual proposer's address to use for balance lookups in simulations
|
|
@@ -91,6 +98,14 @@ export declare class SequencerPublisher {
|
|
|
91
98
|
* Clears all pending requests without sending them.
|
|
92
99
|
*/
|
|
93
100
|
clearPendingRequests(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Analyzes L1 fees for the pending requests without sending them.
|
|
103
|
+
* This is used in fisherman mode to validate fee calculations.
|
|
104
|
+
* @param l2SlotNumber - The L2 slot number for this analysis
|
|
105
|
+
* @param onComplete - Optional callback to invoke when analysis completes (after block is mined)
|
|
106
|
+
* @returns The analysis result (incomplete until block mines), or undefined if no requests
|
|
107
|
+
*/
|
|
108
|
+
analyzeL1Fees(l2SlotNumber: bigint, onComplete?: (analysis: L1FeeAnalysisResult) => void): Promise<L1FeeAnalysisResult | undefined>;
|
|
94
109
|
/**
|
|
95
110
|
* Sends all requests that are still valid.
|
|
96
111
|
* @returns one of:
|
|
@@ -191,4 +206,4 @@ export declare class SequencerPublisher {
|
|
|
191
206
|
private addProposeTx;
|
|
192
207
|
}
|
|
193
208
|
export {};
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1Ymxpc2hlci9zZXF1ZW5jZXItcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsS0FBSyx1QkFBdUIsRUFBd0IsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxLQUFLLDhCQUE4QixFQUNuQyxLQUFLLDBCQUEwQixFQUkvQixjQUFjLEVBQ2QsS0FBSyw2QkFBNkIsRUFHbkMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRixPQUFPLEVBQ0wsS0FBSyxZQUFZLEVBQ2pCLEtBQUssVUFBVSxFQUNmLEtBQUssV0FBVyxFQUNoQixLQUFLLGdCQUFnQixFQUV0QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLGtCQUFrQixFQUFvQyxNQUFNLHVCQUF1QixDQUFDO0FBRzdGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUYsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,0BAA0B,EAI/B,cAAc,EACd,KAAK,6BAA6B,EAGnC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAoC,MAAM,uBAAuB,CAAC;AAG7F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAsB,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAwB,+BAA+B,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACtH,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAA6B,MAAM,MAAM,CAAC;AAExH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAgB7E,eAAO,MAAM,OAAO,0OAUV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAK9C,eAAO,MAAM,cAAc,geAAoE,CAAC;AAEhG,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,qBAAqB,GAAG,2BAA2B,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,uBAAuB,EAAE,WAAW,CAAC;CACtC,CAAC;AAEF,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,eAAe,EAAE,UAAU,CAAC;IAC5B,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,YAAY,EAAE,CACZ,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAClF,OAAO,CAAC;CACd;AAED,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Blob, getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
2
2
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
3
3
|
import { MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } from '@aztec/ethereum/contracts';
|
|
4
|
+
import { L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
4
5
|
import { WEI_CONST } from '@aztec/ethereum/l1-tx-utils';
|
|
5
6
|
import { FormattedViemError, formatViemError, tryExtractEvent } from '@aztec/ethereum/utils';
|
|
6
7
|
import { sumBigint } from '@aztec/foundation/bigint';
|
|
@@ -42,6 +43,7 @@ export class SequencerPublisher {
|
|
|
42
43
|
ethereumSlotDuration;
|
|
43
44
|
blobSinkClient;
|
|
44
45
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
46
|
+
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
45
47
|
// @note - with blobs, the below estimate seems too large.
|
|
46
48
|
// Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob)
|
|
47
49
|
// Total used for emptier block from above test: 429k (of which 84k is 1x blob)
|
|
@@ -82,6 +84,10 @@ export class SequencerPublisher {
|
|
|
82
84
|
this.slashingProposerContract = newSlashingProposer;
|
|
83
85
|
});
|
|
84
86
|
this.slashFactoryContract = deps.slashFactoryContract;
|
|
87
|
+
// Initialize L1 fee analyzer for fisherman mode
|
|
88
|
+
if (config.fishermanMode) {
|
|
89
|
+
this.l1FeeAnalyzer = new L1FeeAnalyzer(this.l1TxUtils.client, deps.dateProvider, createLogger('sequencer:publisher:fee-analyzer'));
|
|
90
|
+
}
|
|
85
91
|
}
|
|
86
92
|
getRollupContract() {
|
|
87
93
|
return this.rollupContract;
|
|
@@ -90,6 +96,11 @@ export class SequencerPublisher {
|
|
|
90
96
|
return this.l1TxUtils.getSenderAddress();
|
|
91
97
|
}
|
|
92
98
|
/**
|
|
99
|
+
* Gets the L1 fee analyzer instance (only available in fisherman mode)
|
|
100
|
+
*/ getL1FeeAnalyzer() {
|
|
101
|
+
return this.l1FeeAnalyzer;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
93
104
|
* Sets the proposer address to use for simulations in fisherman mode.
|
|
94
105
|
* @param proposerAddress - The actual proposer's address to use for balance lookups in simulations
|
|
95
106
|
*/ setProposerAddressForSimulation(proposerAddress) {
|
|
@@ -111,6 +122,46 @@ export class SequencerPublisher {
|
|
|
111
122
|
}
|
|
112
123
|
}
|
|
113
124
|
/**
|
|
125
|
+
* Analyzes L1 fees for the pending requests without sending them.
|
|
126
|
+
* This is used in fisherman mode to validate fee calculations.
|
|
127
|
+
* @param l2SlotNumber - The L2 slot number for this analysis
|
|
128
|
+
* @param onComplete - Optional callback to invoke when analysis completes (after block is mined)
|
|
129
|
+
* @returns The analysis result (incomplete until block mines), or undefined if no requests
|
|
130
|
+
*/ async analyzeL1Fees(l2SlotNumber, onComplete) {
|
|
131
|
+
if (!this.l1FeeAnalyzer) {
|
|
132
|
+
this.log.warn('L1 fee analyzer not available (not in fisherman mode)');
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
const requestsToAnalyze = [
|
|
136
|
+
...this.requests
|
|
137
|
+
];
|
|
138
|
+
if (requestsToAnalyze.length === 0) {
|
|
139
|
+
this.log.debug('No requests to analyze for L1 fees');
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
// Extract blob config from requests (if any)
|
|
143
|
+
const blobConfigs = requestsToAnalyze.filter((request)=>request.blobConfig).map((request)=>request.blobConfig);
|
|
144
|
+
const blobConfig = blobConfigs[0];
|
|
145
|
+
// Get gas configs
|
|
146
|
+
const gasConfigs = requestsToAnalyze.filter((request)=>request.gasConfig).map((request)=>request.gasConfig);
|
|
147
|
+
const gasLimits = gasConfigs.map((g)=>g?.gasLimit).filter((g)=>g !== undefined);
|
|
148
|
+
const gasLimit = gasLimits.length > 0 ? gasLimits.reduce((sum, g)=>sum + g, 0n) : 0n;
|
|
149
|
+
// Get the transaction requests
|
|
150
|
+
const l1Requests = requestsToAnalyze.map((r)=>r.request);
|
|
151
|
+
// Start the analysis
|
|
152
|
+
const analysisId = await this.l1FeeAnalyzer.startAnalysis(l2SlotNumber, gasLimit > 0n ? gasLimit : SequencerPublisher.PROPOSE_GAS_GUESS, l1Requests, blobConfig, onComplete);
|
|
153
|
+
this.log.info('Started L1 fee analysis', {
|
|
154
|
+
analysisId,
|
|
155
|
+
l2SlotNumber: l2SlotNumber.toString(),
|
|
156
|
+
requestCount: requestsToAnalyze.length,
|
|
157
|
+
hasBlobConfig: !!blobConfig,
|
|
158
|
+
gasLimit: gasLimit.toString(),
|
|
159
|
+
actions: requestsToAnalyze.map((r)=>r.action)
|
|
160
|
+
});
|
|
161
|
+
// Return the analysis result (will be incomplete until block mines)
|
|
162
|
+
return this.l1FeeAnalyzer.getAnalysis(analysisId);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
114
165
|
* Sends all requests that are still valid.
|
|
115
166
|
* @returns one of:
|
|
116
167
|
* - A receipt and stats if the tx succeeded
|
|
@@ -865,9 +916,9 @@ export class SequencerPublisher {
|
|
|
865
916
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
866
917
|
// Send the blobs to the blob sink preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
867
918
|
// tx fails but it does get mined. We make sure that the blobs are sent to the blob sink regardless of the tx outcome.
|
|
868
|
-
void this.blobSinkClient.sendBlobsToBlobSink(encodedData.blobs).catch((_err)=>{
|
|
869
|
-
|
|
870
|
-
|
|
919
|
+
void Promise.resolve().then(()=>this.blobSinkClient.sendBlobsToBlobSink(encodedData.blobs).catch((_err)=>{
|
|
920
|
+
this.log.error('Failed to send blobs to blob sink');
|
|
921
|
+
}));
|
|
871
922
|
return this.addRequest({
|
|
872
923
|
action: 'propose',
|
|
873
924
|
request: {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
3
|
+
import type { L1FeeAnalysisResult } from '@aztec/ethereum/l1-fee-analysis';
|
|
3
4
|
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
5
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
5
6
|
import { type Hex } from 'viem';
|
|
@@ -23,6 +24,16 @@ export declare class SequencerMetrics {
|
|
|
23
24
|
private blockProposalSuccess;
|
|
24
25
|
private blockProposalPrecheckFailed;
|
|
25
26
|
private slashingAttempts;
|
|
27
|
+
private fishermanWouldBeIncluded;
|
|
28
|
+
private fishermanTimeBeforeBlock;
|
|
29
|
+
private fishermanPendingBlobTxCount;
|
|
30
|
+
private fishermanIncludedBlobTxCount;
|
|
31
|
+
private fishermanCalculatedPriorityFee;
|
|
32
|
+
private fishermanPriorityFeeDelta;
|
|
33
|
+
private fishermanEstimatedCost;
|
|
34
|
+
private fishermanEstimatedOverpayment;
|
|
35
|
+
private fishermanMinedBlobTxPriorityFee;
|
|
36
|
+
private fishermanMinedBlobTxTotalCost;
|
|
26
37
|
private lastSeenSlot?;
|
|
27
38
|
constructor(client: TelemetryClient, rollup: RollupContract, name?: string);
|
|
28
39
|
recordRequiredAttestations(requiredAttestationsCount: number, allowanceMs: number): void;
|
|
@@ -36,5 +47,10 @@ export declare class SequencerMetrics {
|
|
|
36
47
|
recordBlockProposalSuccess(): void;
|
|
37
48
|
recordBlockProposalPrecheckFailed(checkType: string): void;
|
|
38
49
|
recordSlashingAttempt(actionCount: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* Records metrics for a completed fisherman fee analysis
|
|
52
|
+
* @param analysis - The completed fee analysis result
|
|
53
|
+
*/
|
|
54
|
+
recordFishermanFeeAnalysis(analysis: L1FeeAnalysisResult): void;
|
|
39
55
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFNTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBR1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELHFCQUFhLGdCQUFnQjtJQXlDekIsT0FBTyxDQUFDLE1BQU07SUF4Q2hCLFNBQWdCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixPQUFPLENBQUMsWUFBWSxDQUFnQjtJQUNwQyxPQUFPLENBQUMsa0JBQWtCLENBQVk7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFRO0lBQ3ZDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBWTtJQUdqRCxPQUFPLENBQUMseUJBQXlCLENBQVE7SUFDekMsT0FBTyxDQUFDLDhCQUE4QixDQUFRO0lBQzlDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBUTtJQUNsQyxPQUFPLENBQUMsbUJBQW1CLENBQVE7SUFFbkMsT0FBTyxDQUFDLE9BQU8sQ0FBUTtJQUV2QixPQUFPLENBQUMsS0FBSyxDQUFnQjtJQUM3QixPQUFPLENBQUMsV0FBVyxDQUFnQjtJQUVuQyxPQUFPLENBQUMsbUJBQW1CLENBQWdCO0lBQzNDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBZ0I7SUFDNUMsT0FBTyxDQUFDLDJCQUEyQixDQUFnQjtJQUNuRCxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBR3hDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBZ0I7SUFDaEQsT0FBTyxDQUFDLHdCQUF3QixDQUFZO0lBQzVDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBWTtJQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQVk7SUFDaEQsT0FBTyxDQUFDLDhCQUE4QixDQUFZO0lBQ2xELE9BQU8sQ0FBQyx5QkFBeUIsQ0FBWTtJQUM3QyxPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLDZCQUE2QixDQUFZO0lBQ2pELE9BQU8sQ0FBQywrQkFBK0IsQ0FBWTtJQUNuRCxPQUFPLENBQUMsNkJBQTZCLENBQVk7SUFFakQsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFhO0lBRWxDLFlBQ0UsTUFBTSxFQUFFLGVBQWUsRUFDZixNQUFNLEVBQUUsY0FBYyxFQUM5QixJQUFJLFNBQWMsRUFtTG5CO0lBRU0sMEJBQTBCLENBQUMseUJBQXlCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBT3ZGO0lBRU0sMkJBQTJCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUduRTtJQUVELGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFNMUQ7SUFFRCxpQkFBaUIsU0FJaEI7SUFFRCw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxjQUFjLFFBSXRFO0lBRUQsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFXN0M7SUFFSyxhQUFhLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLFVBQVUsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWlCM0Y7SUFFRCx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLFFBSXhDO0lBRUQsMEJBQTBCLFNBRXpCO0lBRUQsaUNBQWlDLENBQUMsU0FBUyxFQUFFLE1BQU0sUUFJbEQ7SUFFRCxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxRQUV4QztJQUVEOzs7T0FHRztJQUNILDBCQUEwQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsUUFxRnZEO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,gBAAgB;IAyCzB,OAAO,CAAC,MAAM;IAxChB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,6BAA6B,CAAY;IAGjD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,gBAAgB,CAAgB;IAGxC,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,wBAAwB,CAAY;IAC5C,OAAO,CAAC,2BAA2B,CAAY;IAC/C,OAAO,CAAC,4BAA4B,CAAY;IAChD,OAAO,CAAC,8BAA8B,CAAY;IAClD,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,6BAA6B,CAAY;IACjD,OAAO,CAAC,+BAA+B,CAAY;IACnD,OAAO,CAAC,6BAA6B,CAAY;IAEjD,OAAO,CAAC,YAAY,CAAC,CAAa;IAElC,YACE,MAAM,EAAE,eAAe,EACf,MAAM,EAAE,cAAc,EAC9B,IAAI,SAAc,EAmLnB;IAEM,0BAA0B,CAAC,yBAAyB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAOvF;IAEM,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAGnE;IAED,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAM1D;IAED,iBAAiB,SAIhB;IAED,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,QAItE;IAED,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAW7C;IAEK,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F;IAED,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,QAIxC;IAED,0BAA0B,SAEzB;IAED,iCAAiC,CAAC,SAAS,EAAE,MAAM,QAIlD;IAED,qBAAqB,CAAC,WAAW,EAAE,MAAM,QAExC;IAED;;;OAGG;IACH,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,QAqFvD;CACF"}
|
|
@@ -20,6 +20,17 @@ export class SequencerMetrics {
|
|
|
20
20
|
blockProposalSuccess;
|
|
21
21
|
blockProposalPrecheckFailed;
|
|
22
22
|
slashingAttempts;
|
|
23
|
+
// Fisherman fee analysis metrics
|
|
24
|
+
fishermanWouldBeIncluded;
|
|
25
|
+
fishermanTimeBeforeBlock;
|
|
26
|
+
fishermanPendingBlobTxCount;
|
|
27
|
+
fishermanIncludedBlobTxCount;
|
|
28
|
+
fishermanCalculatedPriorityFee;
|
|
29
|
+
fishermanPriorityFeeDelta;
|
|
30
|
+
fishermanEstimatedCost;
|
|
31
|
+
fishermanEstimatedOverpayment;
|
|
32
|
+
fishermanMinedBlobTxPriorityFee;
|
|
33
|
+
fishermanMinedBlobTxTotalCost;
|
|
23
34
|
lastSeenSlot;
|
|
24
35
|
constructor(client, rollup, name = 'Sequencer'){
|
|
25
36
|
this.rollup = rollup;
|
|
@@ -97,6 +108,54 @@ export class SequencerMetrics {
|
|
|
97
108
|
valueType: ValueType.INT,
|
|
98
109
|
description: 'The number of slashing action attempts'
|
|
99
110
|
});
|
|
111
|
+
// Fisherman fee analysis metrics
|
|
112
|
+
this.fishermanWouldBeIncluded = this.meter.createUpDownCounter(Metrics.FISHERMAN_FEE_ANALYSIS_WOULD_BE_INCLUDED, {
|
|
113
|
+
valueType: ValueType.INT,
|
|
114
|
+
description: 'Whether the transaction would have been included in the block'
|
|
115
|
+
});
|
|
116
|
+
this.fishermanTimeBeforeBlock = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_TIME_BEFORE_BLOCK, {
|
|
117
|
+
unit: 'ms',
|
|
118
|
+
description: 'Time in ms between fee analysis and block being mined',
|
|
119
|
+
valueType: ValueType.INT
|
|
120
|
+
});
|
|
121
|
+
this.fishermanPendingBlobTxCount = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_PENDING_BLOB_TX_COUNT, {
|
|
122
|
+
description: 'Number of blob transactions seen in the pending block',
|
|
123
|
+
valueType: ValueType.INT
|
|
124
|
+
});
|
|
125
|
+
this.fishermanIncludedBlobTxCount = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_INCLUDED_BLOB_TX_COUNT, {
|
|
126
|
+
description: 'Number of blob transactions that got included in the mined block',
|
|
127
|
+
valueType: ValueType.INT
|
|
128
|
+
});
|
|
129
|
+
this.fishermanCalculatedPriorityFee = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_CALCULATED_PRIORITY_FEE, {
|
|
130
|
+
unit: 'gwei',
|
|
131
|
+
description: 'Priority fee calculated by each strategy',
|
|
132
|
+
valueType: ValueType.DOUBLE
|
|
133
|
+
});
|
|
134
|
+
this.fishermanPriorityFeeDelta = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_PRIORITY_FEE_DELTA, {
|
|
135
|
+
unit: 'gwei',
|
|
136
|
+
description: 'Difference between our priority fee and minimum included priority fee',
|
|
137
|
+
valueType: ValueType.DOUBLE
|
|
138
|
+
});
|
|
139
|
+
this.fishermanEstimatedCost = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_ESTIMATED_COST, {
|
|
140
|
+
unit: 'eth',
|
|
141
|
+
description: 'Estimated total cost in ETH for the transaction with this strategy',
|
|
142
|
+
valueType: ValueType.DOUBLE
|
|
143
|
+
});
|
|
144
|
+
this.fishermanEstimatedOverpayment = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_ESTIMATED_OVERPAYMENT, {
|
|
145
|
+
unit: 'eth',
|
|
146
|
+
description: 'Estimated overpayment in ETH vs minimum required for inclusion',
|
|
147
|
+
valueType: ValueType.DOUBLE
|
|
148
|
+
});
|
|
149
|
+
this.fishermanMinedBlobTxPriorityFee = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_MINED_BLOB_TX_PRIORITY_FEE, {
|
|
150
|
+
unit: 'gwei',
|
|
151
|
+
description: 'Priority fee per gas for blob transactions in mined blocks',
|
|
152
|
+
valueType: ValueType.DOUBLE
|
|
153
|
+
});
|
|
154
|
+
this.fishermanMinedBlobTxTotalCost = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_MINED_BLOB_TX_TOTAL_COST, {
|
|
155
|
+
unit: 'eth',
|
|
156
|
+
description: 'Total cost in ETH for blob transactions in mined blocks',
|
|
157
|
+
valueType: ValueType.DOUBLE
|
|
158
|
+
});
|
|
100
159
|
}
|
|
101
160
|
recordRequiredAttestations(requiredAttestationsCount, allowanceMs) {
|
|
102
161
|
this.requiredAttestions.record(requiredAttestationsCount);
|
|
@@ -171,4 +230,81 @@ export class SequencerMetrics {
|
|
|
171
230
|
recordSlashingAttempt(actionCount) {
|
|
172
231
|
this.slashingAttempts.add(actionCount);
|
|
173
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Records metrics for a completed fisherman fee analysis
|
|
235
|
+
* @param analysis - The completed fee analysis result
|
|
236
|
+
*/ recordFishermanFeeAnalysis(analysis) {
|
|
237
|
+
// In fisherman mode, we should always have strategy results
|
|
238
|
+
if (!analysis.computedPrices.strategyResults || analysis.computedPrices.strategyResults.length === 0) {
|
|
239
|
+
// This should never happen in fisherman mode - log an error
|
|
240
|
+
// We don't record metrics without strategy IDs as that defeats the purpose
|
|
241
|
+
throw new Error(`No strategy results found in fisherman fee analysis ${analysis.id}. This indicates a bug in the fee analysis.`);
|
|
242
|
+
}
|
|
243
|
+
// Record metrics for each strategy separately
|
|
244
|
+
for (const strategyResult of analysis.computedPrices.strategyResults){
|
|
245
|
+
const strategyAttributes = {
|
|
246
|
+
[Attributes.FISHERMAN_FEE_STRATEGY_ID]: strategyResult.strategyId
|
|
247
|
+
};
|
|
248
|
+
// Record pending block snapshot data (once per strategy for comparison)
|
|
249
|
+
this.fishermanPendingBlobTxCount.record(analysis.pendingSnapshot.pendingBlobTxCount, strategyAttributes);
|
|
250
|
+
// Record mined block data if available
|
|
251
|
+
if (analysis.minedBlock) {
|
|
252
|
+
this.fishermanIncludedBlobTxCount.record(analysis.minedBlock.includedBlobTxCount, strategyAttributes);
|
|
253
|
+
// Record actual fees from blob transactions in the mined block
|
|
254
|
+
for (const blobTx of analysis.minedBlock.includedBlobTxs){
|
|
255
|
+
// Record priority fee per gas in Gwei
|
|
256
|
+
const priorityFeeGwei = Number(blobTx.maxPriorityFeePerGas) / 1e9;
|
|
257
|
+
this.fishermanMinedBlobTxPriorityFee.record(priorityFeeGwei, strategyAttributes);
|
|
258
|
+
// Calculate total cost in ETH
|
|
259
|
+
// Cost = (gas * (baseFee + priorityFee)) + (blobCount * blobGasPerBlob * blobBaseFee)
|
|
260
|
+
const baseFee = analysis.minedBlock.baseFeePerGas;
|
|
261
|
+
const effectiveGasPrice = baseFee + blobTx.maxPriorityFeePerGas;
|
|
262
|
+
// Calculate execution cost using actual gas limit from the transaction
|
|
263
|
+
const executionCost = blobTx.gas * effectiveGasPrice;
|
|
264
|
+
// Calculate blob cost using maxFeePerBlobGas * blobCount * GAS_PER_BLOB
|
|
265
|
+
const blobCost = blobTx.maxFeePerBlobGas * BigInt(blobTx.blobCount) * 131072n; // 128KB per blob
|
|
266
|
+
const totalCostWei = executionCost + blobCost;
|
|
267
|
+
const totalCostEth = Number(totalCostWei) / 1e18;
|
|
268
|
+
this.fishermanMinedBlobTxTotalCost.record(totalCostEth, strategyAttributes);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Record the calculated priority fee for this strategy
|
|
272
|
+
const calculatedPriorityFeeGwei = Number(strategyResult.calculatedPriorityFee) / 1e9;
|
|
273
|
+
this.fishermanCalculatedPriorityFee.record(calculatedPriorityFeeGwei, strategyAttributes);
|
|
274
|
+
// Record analysis results if available
|
|
275
|
+
if (analysis.analysis) {
|
|
276
|
+
this.fishermanTimeBeforeBlock.record(Math.ceil(analysis.analysis.timeBeforeBlockMs), strategyAttributes);
|
|
277
|
+
// Record strategy-specific inclusion result
|
|
278
|
+
if (strategyResult.wouldBeIncluded !== undefined) {
|
|
279
|
+
if (strategyResult.wouldBeIncluded) {
|
|
280
|
+
this.fishermanWouldBeIncluded.add(1, {
|
|
281
|
+
...strategyAttributes,
|
|
282
|
+
[Attributes.OK]: true
|
|
283
|
+
});
|
|
284
|
+
} else {
|
|
285
|
+
this.fishermanWouldBeIncluded.add(1, {
|
|
286
|
+
...strategyAttributes,
|
|
287
|
+
[Attributes.OK]: false,
|
|
288
|
+
...strategyResult.exclusionReason && {
|
|
289
|
+
[Attributes.ERROR_TYPE]: strategyResult.exclusionReason
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Record strategy-specific priority fee delta
|
|
295
|
+
if (strategyResult.priorityFeeDelta !== undefined) {
|
|
296
|
+
const priorityFeeDeltaGwei = Number(strategyResult.priorityFeeDelta) / 1e9;
|
|
297
|
+
this.fishermanPriorityFeeDelta.record(priorityFeeDeltaGwei, strategyAttributes);
|
|
298
|
+
}
|
|
299
|
+
// Record estimated cost if available
|
|
300
|
+
if (strategyResult.estimatedCostEth !== undefined) {
|
|
301
|
+
this.fishermanEstimatedCost.record(strategyResult.estimatedCostEth, strategyAttributes);
|
|
302
|
+
}
|
|
303
|
+
// Record estimated overpayment if available
|
|
304
|
+
if (strategyResult.estimatedOverpaymentEth !== undefined) {
|
|
305
|
+
this.fishermanEstimatedOverpayment.record(strategyResult.estimatedOverpaymentEth, strategyAttributes);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
174
310
|
}
|
|
@@ -94,6 +94,8 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
94
94
|
private lastSlotForVoteWhenSyncFailed;
|
|
95
95
|
/** The last slot for which we built a validation block in fisherman mode, to prevent duplicate attempts. */
|
|
96
96
|
private lastSlotForValidationBlock;
|
|
97
|
+
/** The last epoch for which we logged strategy comparison in fisherman mode. */
|
|
98
|
+
private lastEpochForStrategyComparison;
|
|
97
99
|
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */
|
|
98
100
|
protected timetable: SequencerTimetable;
|
|
99
101
|
protected enforceTimeTable: boolean;
|
|
@@ -204,8 +206,12 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
204
206
|
protected considerInvalidatingBlock(syncedTo: NonNullable<Awaited<ReturnType<Sequencer['checkSync']>>>, currentSlot: SlotNumber): Promise<void>;
|
|
205
207
|
private getSlotStartBuildTimestamp;
|
|
206
208
|
private getSecondsIntoSlot;
|
|
209
|
+
/**
|
|
210
|
+
* Logs strategy comparison statistics at the end of each epoch in fisherman mode
|
|
211
|
+
*/
|
|
212
|
+
private logStrategyComparison;
|
|
207
213
|
get aztecSlotDuration(): number;
|
|
208
214
|
get maxL2BlockGas(): number | undefined;
|
|
209
215
|
getSlasherClient(): SlasherClientInterface | undefined;
|
|
210
216
|
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFvQixLQUFLLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxXQUFXLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3pHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzVELE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFZLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUVMLCtCQUErQixFQUMvQixLQUFLLGFBQWEsRUFFbEIsS0FBSyxtQkFBbUIsRUFDekIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBa0QsTUFBTSw2QkFBNkIsQ0FBQztBQUVySCxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxxQkFBcUIsRUFFMUIsS0FBSyxzQkFBc0IsRUFDNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,6 +73,7 @@ export { SequencerState };
|
|
|
73
73
|
governanceProposerPayload;
|
|
74
74
|
/** The last slot for which we attempted to vote when sync failed, to prevent duplicate attempts. */ lastSlotForVoteWhenSyncFailed;
|
|
75
75
|
/** The last slot for which we built a validation block in fisherman mode, to prevent duplicate attempts. */ lastSlotForValidationBlock;
|
|
76
|
+
/** The last epoch for which we logged strategy comparison in fisherman mode. */ lastEpochForStrategyComparison;
|
|
76
77
|
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */ timetable;
|
|
77
78
|
enforceTimeTable;
|
|
78
79
|
// This shouldn't be here as this gets re-created each time we build/propose a block.
|
|
@@ -325,16 +326,28 @@ export { SequencerState };
|
|
|
325
326
|
const block = await this.tryBuildBlockAndEnqueuePublish(slot, proposer, newBlockNumber, publisher, newGlobalVariables, chainTipArchive, invalidateBlock);
|
|
326
327
|
// Wait until the voting promises have resolved, so all requests are enqueued
|
|
327
328
|
await Promise.all(votesPromises);
|
|
328
|
-
// In fisherman mode, we don't publish to L1
|
|
329
|
+
// In fisherman mode, we don't publish to L1 but analyze the fees
|
|
329
330
|
if (this.config.fishermanMode) {
|
|
330
|
-
//
|
|
331
|
+
// Perform L1 fee analysis before clearing requests
|
|
332
|
+
// The callback is invoked asynchronously after the next block is mined
|
|
333
|
+
const feeAnalysis = await publisher.analyzeL1Fees(BigInt(slot), (analysis)=>{
|
|
334
|
+
this.metrics.recordFishermanFeeAnalysis(analysis);
|
|
335
|
+
});
|
|
336
|
+
// Check if we've moved to a new epoch and log strategy comparison
|
|
337
|
+
const currentEpoch = this.epochCache.getEpochAndSlotNow().epoch;
|
|
338
|
+
if (this.lastEpochForStrategyComparison === undefined || currentEpoch > this.lastEpochForStrategyComparison) {
|
|
339
|
+
this.logStrategyComparison(currentEpoch, publisher);
|
|
340
|
+
this.lastEpochForStrategyComparison = currentEpoch;
|
|
341
|
+
}
|
|
342
|
+
// Clear pending requests (we're not sending them)
|
|
331
343
|
publisher.clearPendingRequests();
|
|
332
344
|
if (block) {
|
|
333
345
|
this.log.info(`Validation block building SUCCEEDED for slot ${slot}`, {
|
|
334
346
|
blockNumber: newBlockNumber,
|
|
335
347
|
slot: Number(slot),
|
|
336
348
|
archive: block.archive.toString(),
|
|
337
|
-
txCount: block.body.txEffects.length
|
|
349
|
+
txCount: block.body.txEffects.length,
|
|
350
|
+
feeAnalysisId: feeAnalysis?.id
|
|
338
351
|
});
|
|
339
352
|
this.lastBlockPublished = block;
|
|
340
353
|
this.metrics.recordBlockProposalSuccess();
|
|
@@ -342,7 +355,8 @@ export { SequencerState };
|
|
|
342
355
|
// Block building failed in fisherman mode
|
|
343
356
|
this.log.warn(`Validation block building FAILED for slot ${slot}`, {
|
|
344
357
|
blockNumber: newBlockNumber,
|
|
345
|
-
slot: Number(slot)
|
|
358
|
+
slot: Number(slot),
|
|
359
|
+
feeAnalysisId: feeAnalysis?.id
|
|
346
360
|
});
|
|
347
361
|
this.metrics.recordBlockProposalFailed('block_build_failed');
|
|
348
362
|
}
|
|
@@ -964,6 +978,34 @@ export { SequencerState };
|
|
|
964
978
|
const slotStartTimestamp = this.getSlotStartBuildTimestamp(slotNumber);
|
|
965
979
|
return Number((this.dateProvider.now() / 1000 - slotStartTimestamp).toFixed(3));
|
|
966
980
|
}
|
|
981
|
+
/**
|
|
982
|
+
* Logs strategy comparison statistics at the end of each epoch in fisherman mode
|
|
983
|
+
*/ logStrategyComparison(epoch, publisher) {
|
|
984
|
+
const feeAnalyzer = publisher.getL1FeeAnalyzer();
|
|
985
|
+
if (!feeAnalyzer) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
const comparison = feeAnalyzer.getStrategyComparison();
|
|
989
|
+
if (comparison.length === 0) {
|
|
990
|
+
this.log.debug(`No strategy data available yet for epoch ${epoch}`);
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
this.log.info(`L1 Fee Strategy Performance Report - End of Epoch ${epoch}`, {
|
|
994
|
+
epoch: Number(epoch),
|
|
995
|
+
totalAnalyses: comparison[0]?.totalAnalyses,
|
|
996
|
+
strategies: comparison.map((s)=>({
|
|
997
|
+
id: s.strategyId,
|
|
998
|
+
name: s.strategyName,
|
|
999
|
+
inclusionRate: `${(s.inclusionRate * 100).toFixed(1)}%`,
|
|
1000
|
+
inclusionCount: `${s.inclusionCount}/${s.totalAnalyses}`,
|
|
1001
|
+
avgCostEth: s.avgEstimatedCostEth.toFixed(6),
|
|
1002
|
+
totalCostEth: s.totalEstimatedCostEth.toFixed(6),
|
|
1003
|
+
avgOverpaymentEth: s.avgOverpaymentEth.toFixed(6),
|
|
1004
|
+
totalOverpaymentEth: s.totalOverpaymentEth.toFixed(6),
|
|
1005
|
+
avgPriorityFeeDeltaGwei: s.avgPriorityFeeDeltaGwei.toFixed(2)
|
|
1006
|
+
}))
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
967
1009
|
get aztecSlotDuration() {
|
|
968
1010
|
return this.l1Constants.slotDuration;
|
|
969
1011
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251218",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -26,37 +26,37 @@
|
|
|
26
26
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@aztec/aztec.js": "3.0.0-nightly.
|
|
30
|
-
"@aztec/bb-prover": "3.0.0-nightly.
|
|
31
|
-
"@aztec/blob-lib": "3.0.0-nightly.
|
|
32
|
-
"@aztec/blob-sink": "3.0.0-nightly.
|
|
33
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
34
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
35
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
36
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
37
|
-
"@aztec/l1-artifacts": "3.0.0-nightly.
|
|
38
|
-
"@aztec/merkle-tree": "3.0.0-nightly.
|
|
39
|
-
"@aztec/node-keystore": "3.0.0-nightly.
|
|
40
|
-
"@aztec/noir-acvm_js": "3.0.0-nightly.
|
|
41
|
-
"@aztec/noir-contracts.js": "3.0.0-nightly.
|
|
42
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
43
|
-
"@aztec/noir-types": "3.0.0-nightly.
|
|
44
|
-
"@aztec/p2p": "3.0.0-nightly.
|
|
45
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
46
|
-
"@aztec/prover-client": "3.0.0-nightly.
|
|
47
|
-
"@aztec/simulator": "3.0.0-nightly.
|
|
48
|
-
"@aztec/slasher": "3.0.0-nightly.
|
|
49
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
50
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
51
|
-
"@aztec/validator-client": "3.0.0-nightly.
|
|
52
|
-
"@aztec/world-state": "3.0.0-nightly.
|
|
29
|
+
"@aztec/aztec.js": "3.0.0-nightly.20251218",
|
|
30
|
+
"@aztec/bb-prover": "3.0.0-nightly.20251218",
|
|
31
|
+
"@aztec/blob-lib": "3.0.0-nightly.20251218",
|
|
32
|
+
"@aztec/blob-sink": "3.0.0-nightly.20251218",
|
|
33
|
+
"@aztec/constants": "3.0.0-nightly.20251218",
|
|
34
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251218",
|
|
35
|
+
"@aztec/ethereum": "3.0.0-nightly.20251218",
|
|
36
|
+
"@aztec/foundation": "3.0.0-nightly.20251218",
|
|
37
|
+
"@aztec/l1-artifacts": "3.0.0-nightly.20251218",
|
|
38
|
+
"@aztec/merkle-tree": "3.0.0-nightly.20251218",
|
|
39
|
+
"@aztec/node-keystore": "3.0.0-nightly.20251218",
|
|
40
|
+
"@aztec/noir-acvm_js": "3.0.0-nightly.20251218",
|
|
41
|
+
"@aztec/noir-contracts.js": "3.0.0-nightly.20251218",
|
|
42
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251218",
|
|
43
|
+
"@aztec/noir-types": "3.0.0-nightly.20251218",
|
|
44
|
+
"@aztec/p2p": "3.0.0-nightly.20251218",
|
|
45
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251218",
|
|
46
|
+
"@aztec/prover-client": "3.0.0-nightly.20251218",
|
|
47
|
+
"@aztec/simulator": "3.0.0-nightly.20251218",
|
|
48
|
+
"@aztec/slasher": "3.0.0-nightly.20251218",
|
|
49
|
+
"@aztec/stdlib": "3.0.0-nightly.20251218",
|
|
50
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251218",
|
|
51
|
+
"@aztec/validator-client": "3.0.0-nightly.20251218",
|
|
52
|
+
"@aztec/world-state": "3.0.0-nightly.20251218",
|
|
53
53
|
"lodash.chunk": "^4.2.0",
|
|
54
54
|
"tslib": "^2.4.0",
|
|
55
55
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@aztec/archiver": "3.0.0-nightly.
|
|
59
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
58
|
+
"@aztec/archiver": "3.0.0-nightly.20251218",
|
|
59
|
+
"@aztec/kv-store": "3.0.0-nightly.20251218",
|
|
60
60
|
"@jest/globals": "^30.0.0",
|
|
61
61
|
"@types/jest": "^30.0.0",
|
|
62
62
|
"@types/lodash.chunk": "^4.2.7",
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
type ViemCommitteeAttestations,
|
|
15
15
|
type ViemHeader,
|
|
16
16
|
} from '@aztec/ethereum/contracts';
|
|
17
|
+
import { type L1FeeAnalysisResult, L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
17
18
|
import {
|
|
18
19
|
type L1BlobInputs,
|
|
19
20
|
type L1TxConfig,
|
|
@@ -115,6 +116,9 @@ export class SequencerPublisher {
|
|
|
115
116
|
|
|
116
117
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */
|
|
117
118
|
private proposerAddressForSimulation?: EthAddress;
|
|
119
|
+
|
|
120
|
+
/** L1 fee analyzer for fisherman mode */
|
|
121
|
+
private l1FeeAnalyzer?: L1FeeAnalyzer;
|
|
118
122
|
// @note - with blobs, the below estimate seems too large.
|
|
119
123
|
// Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob)
|
|
120
124
|
// Total used for emptier block from above test: 429k (of which 84k is 1x blob)
|
|
@@ -174,6 +178,15 @@ export class SequencerPublisher {
|
|
|
174
178
|
this.slashingProposerContract = newSlashingProposer;
|
|
175
179
|
});
|
|
176
180
|
this.slashFactoryContract = deps.slashFactoryContract;
|
|
181
|
+
|
|
182
|
+
// Initialize L1 fee analyzer for fisherman mode
|
|
183
|
+
if (config.fishermanMode) {
|
|
184
|
+
this.l1FeeAnalyzer = new L1FeeAnalyzer(
|
|
185
|
+
this.l1TxUtils.client,
|
|
186
|
+
deps.dateProvider,
|
|
187
|
+
createLogger('sequencer:publisher:fee-analyzer'),
|
|
188
|
+
);
|
|
189
|
+
}
|
|
177
190
|
}
|
|
178
191
|
|
|
179
192
|
public getRollupContract(): RollupContract {
|
|
@@ -184,6 +197,13 @@ export class SequencerPublisher {
|
|
|
184
197
|
return this.l1TxUtils.getSenderAddress();
|
|
185
198
|
}
|
|
186
199
|
|
|
200
|
+
/**
|
|
201
|
+
* Gets the L1 fee analyzer instance (only available in fisherman mode)
|
|
202
|
+
*/
|
|
203
|
+
public getL1FeeAnalyzer(): L1FeeAnalyzer | undefined {
|
|
204
|
+
return this.l1FeeAnalyzer;
|
|
205
|
+
}
|
|
206
|
+
|
|
187
207
|
/**
|
|
188
208
|
* Sets the proposer address to use for simulations in fisherman mode.
|
|
189
209
|
* @param proposerAddress - The actual proposer's address to use for balance lookups in simulations
|
|
@@ -211,6 +231,62 @@ export class SequencerPublisher {
|
|
|
211
231
|
}
|
|
212
232
|
}
|
|
213
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Analyzes L1 fees for the pending requests without sending them.
|
|
236
|
+
* This is used in fisherman mode to validate fee calculations.
|
|
237
|
+
* @param l2SlotNumber - The L2 slot number for this analysis
|
|
238
|
+
* @param onComplete - Optional callback to invoke when analysis completes (after block is mined)
|
|
239
|
+
* @returns The analysis result (incomplete until block mines), or undefined if no requests
|
|
240
|
+
*/
|
|
241
|
+
public async analyzeL1Fees(
|
|
242
|
+
l2SlotNumber: bigint,
|
|
243
|
+
onComplete?: (analysis: L1FeeAnalysisResult) => void,
|
|
244
|
+
): Promise<L1FeeAnalysisResult | undefined> {
|
|
245
|
+
if (!this.l1FeeAnalyzer) {
|
|
246
|
+
this.log.warn('L1 fee analyzer not available (not in fisherman mode)');
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const requestsToAnalyze = [...this.requests];
|
|
251
|
+
if (requestsToAnalyze.length === 0) {
|
|
252
|
+
this.log.debug('No requests to analyze for L1 fees');
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Extract blob config from requests (if any)
|
|
257
|
+
const blobConfigs = requestsToAnalyze.filter(request => request.blobConfig).map(request => request.blobConfig);
|
|
258
|
+
const blobConfig = blobConfigs[0];
|
|
259
|
+
|
|
260
|
+
// Get gas configs
|
|
261
|
+
const gasConfigs = requestsToAnalyze.filter(request => request.gasConfig).map(request => request.gasConfig);
|
|
262
|
+
const gasLimits = gasConfigs.map(g => g?.gasLimit).filter((g): g is bigint => g !== undefined);
|
|
263
|
+
const gasLimit = gasLimits.length > 0 ? gasLimits.reduce((sum, g) => sum + g, 0n) : 0n;
|
|
264
|
+
|
|
265
|
+
// Get the transaction requests
|
|
266
|
+
const l1Requests = requestsToAnalyze.map(r => r.request);
|
|
267
|
+
|
|
268
|
+
// Start the analysis
|
|
269
|
+
const analysisId = await this.l1FeeAnalyzer.startAnalysis(
|
|
270
|
+
l2SlotNumber,
|
|
271
|
+
gasLimit > 0n ? gasLimit : SequencerPublisher.PROPOSE_GAS_GUESS,
|
|
272
|
+
l1Requests,
|
|
273
|
+
blobConfig,
|
|
274
|
+
onComplete,
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
this.log.info('Started L1 fee analysis', {
|
|
278
|
+
analysisId,
|
|
279
|
+
l2SlotNumber: l2SlotNumber.toString(),
|
|
280
|
+
requestCount: requestsToAnalyze.length,
|
|
281
|
+
hasBlobConfig: !!blobConfig,
|
|
282
|
+
gasLimit: gasLimit.toString(),
|
|
283
|
+
actions: requestsToAnalyze.map(r => r.action),
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// Return the analysis result (will be incomplete until block mines)
|
|
287
|
+
return this.l1FeeAnalyzer.getAnalysis(analysisId);
|
|
288
|
+
}
|
|
289
|
+
|
|
214
290
|
/**
|
|
215
291
|
* Sends all requests that are still valid.
|
|
216
292
|
* @returns one of:
|
|
@@ -1127,9 +1203,11 @@ export class SequencerPublisher {
|
|
|
1127
1203
|
|
|
1128
1204
|
// Send the blobs to the blob sink preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
1129
1205
|
// tx fails but it does get mined. We make sure that the blobs are sent to the blob sink regardless of the tx outcome.
|
|
1130
|
-
void
|
|
1131
|
-
this.
|
|
1132
|
-
|
|
1206
|
+
void Promise.resolve().then(() =>
|
|
1207
|
+
this.blobSinkClient.sendBlobsToBlobSink(encodedData.blobs).catch(_err => {
|
|
1208
|
+
this.log.error('Failed to send blobs to blob sink');
|
|
1209
|
+
}),
|
|
1210
|
+
);
|
|
1133
1211
|
|
|
1134
1212
|
return this.addRequest({
|
|
1135
1213
|
action: 'propose',
|
package/src/sequencer/metrics.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
3
|
+
import type { L1FeeAnalysisResult } from '@aztec/ethereum/l1-fee-analysis';
|
|
3
4
|
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
5
|
import {
|
|
5
6
|
Attributes,
|
|
@@ -42,6 +43,18 @@ export class SequencerMetrics {
|
|
|
42
43
|
private blockProposalPrecheckFailed: UpDownCounter;
|
|
43
44
|
private slashingAttempts: UpDownCounter;
|
|
44
45
|
|
|
46
|
+
// Fisherman fee analysis metrics
|
|
47
|
+
private fishermanWouldBeIncluded: UpDownCounter;
|
|
48
|
+
private fishermanTimeBeforeBlock: Histogram;
|
|
49
|
+
private fishermanPendingBlobTxCount: Histogram;
|
|
50
|
+
private fishermanIncludedBlobTxCount: Histogram;
|
|
51
|
+
private fishermanCalculatedPriorityFee: Histogram;
|
|
52
|
+
private fishermanPriorityFeeDelta: Histogram;
|
|
53
|
+
private fishermanEstimatedCost: Histogram;
|
|
54
|
+
private fishermanEstimatedOverpayment: Histogram;
|
|
55
|
+
private fishermanMinedBlobTxPriorityFee: Histogram;
|
|
56
|
+
private fishermanMinedBlobTxTotalCost: Histogram;
|
|
57
|
+
|
|
45
58
|
private lastSeenSlot?: SlotNumber;
|
|
46
59
|
|
|
47
60
|
constructor(
|
|
@@ -150,6 +163,82 @@ export class SequencerMetrics {
|
|
|
150
163
|
valueType: ValueType.INT,
|
|
151
164
|
description: 'The number of slashing action attempts',
|
|
152
165
|
});
|
|
166
|
+
|
|
167
|
+
// Fisherman fee analysis metrics
|
|
168
|
+
this.fishermanWouldBeIncluded = this.meter.createUpDownCounter(Metrics.FISHERMAN_FEE_ANALYSIS_WOULD_BE_INCLUDED, {
|
|
169
|
+
valueType: ValueType.INT,
|
|
170
|
+
description: 'Whether the transaction would have been included in the block',
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
this.fishermanTimeBeforeBlock = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_TIME_BEFORE_BLOCK, {
|
|
174
|
+
unit: 'ms',
|
|
175
|
+
description: 'Time in ms between fee analysis and block being mined',
|
|
176
|
+
valueType: ValueType.INT,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
this.fishermanPendingBlobTxCount = this.meter.createHistogram(
|
|
180
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_PENDING_BLOB_TX_COUNT,
|
|
181
|
+
{
|
|
182
|
+
description: 'Number of blob transactions seen in the pending block',
|
|
183
|
+
valueType: ValueType.INT,
|
|
184
|
+
},
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
this.fishermanIncludedBlobTxCount = this.meter.createHistogram(
|
|
188
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_INCLUDED_BLOB_TX_COUNT,
|
|
189
|
+
{
|
|
190
|
+
description: 'Number of blob transactions that got included in the mined block',
|
|
191
|
+
valueType: ValueType.INT,
|
|
192
|
+
},
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
this.fishermanCalculatedPriorityFee = this.meter.createHistogram(
|
|
196
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_CALCULATED_PRIORITY_FEE,
|
|
197
|
+
{
|
|
198
|
+
unit: 'gwei',
|
|
199
|
+
description: 'Priority fee calculated by each strategy',
|
|
200
|
+
valueType: ValueType.DOUBLE,
|
|
201
|
+
},
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
this.fishermanPriorityFeeDelta = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_PRIORITY_FEE_DELTA, {
|
|
205
|
+
unit: 'gwei',
|
|
206
|
+
description: 'Difference between our priority fee and minimum included priority fee',
|
|
207
|
+
valueType: ValueType.DOUBLE,
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
this.fishermanEstimatedCost = this.meter.createHistogram(Metrics.FISHERMAN_FEE_ANALYSIS_ESTIMATED_COST, {
|
|
211
|
+
unit: 'eth',
|
|
212
|
+
description: 'Estimated total cost in ETH for the transaction with this strategy',
|
|
213
|
+
valueType: ValueType.DOUBLE,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
this.fishermanEstimatedOverpayment = this.meter.createHistogram(
|
|
217
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_ESTIMATED_OVERPAYMENT,
|
|
218
|
+
{
|
|
219
|
+
unit: 'eth',
|
|
220
|
+
description: 'Estimated overpayment in ETH vs minimum required for inclusion',
|
|
221
|
+
valueType: ValueType.DOUBLE,
|
|
222
|
+
},
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
this.fishermanMinedBlobTxPriorityFee = this.meter.createHistogram(
|
|
226
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_MINED_BLOB_TX_PRIORITY_FEE,
|
|
227
|
+
{
|
|
228
|
+
unit: 'gwei',
|
|
229
|
+
description: 'Priority fee per gas for blob transactions in mined blocks',
|
|
230
|
+
valueType: ValueType.DOUBLE,
|
|
231
|
+
},
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
this.fishermanMinedBlobTxTotalCost = this.meter.createHistogram(
|
|
235
|
+
Metrics.FISHERMAN_FEE_ANALYSIS_MINED_BLOB_TX_TOTAL_COST,
|
|
236
|
+
{
|
|
237
|
+
unit: 'eth',
|
|
238
|
+
description: 'Total cost in ETH for blob transactions in mined blocks',
|
|
239
|
+
valueType: ValueType.DOUBLE,
|
|
240
|
+
},
|
|
241
|
+
);
|
|
153
242
|
}
|
|
154
243
|
|
|
155
244
|
public recordRequiredAttestations(requiredAttestationsCount: number, allowanceMs: number) {
|
|
@@ -237,4 +326,95 @@ export class SequencerMetrics {
|
|
|
237
326
|
recordSlashingAttempt(actionCount: number) {
|
|
238
327
|
this.slashingAttempts.add(actionCount);
|
|
239
328
|
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Records metrics for a completed fisherman fee analysis
|
|
332
|
+
* @param analysis - The completed fee analysis result
|
|
333
|
+
*/
|
|
334
|
+
recordFishermanFeeAnalysis(analysis: L1FeeAnalysisResult) {
|
|
335
|
+
// In fisherman mode, we should always have strategy results
|
|
336
|
+
if (!analysis.computedPrices.strategyResults || analysis.computedPrices.strategyResults.length === 0) {
|
|
337
|
+
// This should never happen in fisherman mode - log an error
|
|
338
|
+
// We don't record metrics without strategy IDs as that defeats the purpose
|
|
339
|
+
throw new Error(
|
|
340
|
+
`No strategy results found in fisherman fee analysis ${analysis.id}. This indicates a bug in the fee analysis.`,
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Record metrics for each strategy separately
|
|
345
|
+
for (const strategyResult of analysis.computedPrices.strategyResults) {
|
|
346
|
+
const strategyAttributes = {
|
|
347
|
+
[Attributes.FISHERMAN_FEE_STRATEGY_ID]: strategyResult.strategyId,
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// Record pending block snapshot data (once per strategy for comparison)
|
|
351
|
+
this.fishermanPendingBlobTxCount.record(analysis.pendingSnapshot.pendingBlobTxCount, strategyAttributes);
|
|
352
|
+
|
|
353
|
+
// Record mined block data if available
|
|
354
|
+
if (analysis.minedBlock) {
|
|
355
|
+
this.fishermanIncludedBlobTxCount.record(analysis.minedBlock.includedBlobTxCount, strategyAttributes);
|
|
356
|
+
|
|
357
|
+
// Record actual fees from blob transactions in the mined block
|
|
358
|
+
for (const blobTx of analysis.minedBlock.includedBlobTxs) {
|
|
359
|
+
// Record priority fee per gas in Gwei
|
|
360
|
+
const priorityFeeGwei = Number(blobTx.maxPriorityFeePerGas) / 1e9;
|
|
361
|
+
this.fishermanMinedBlobTxPriorityFee.record(priorityFeeGwei, strategyAttributes);
|
|
362
|
+
|
|
363
|
+
// Calculate total cost in ETH
|
|
364
|
+
// Cost = (gas * (baseFee + priorityFee)) + (blobCount * blobGasPerBlob * blobBaseFee)
|
|
365
|
+
const baseFee = analysis.minedBlock.baseFeePerGas;
|
|
366
|
+
const effectiveGasPrice = baseFee + blobTx.maxPriorityFeePerGas;
|
|
367
|
+
|
|
368
|
+
// Calculate execution cost using actual gas limit from the transaction
|
|
369
|
+
const executionCost = blobTx.gas * effectiveGasPrice;
|
|
370
|
+
|
|
371
|
+
// Calculate blob cost using maxFeePerBlobGas * blobCount * GAS_PER_BLOB
|
|
372
|
+
const blobCost = blobTx.maxFeePerBlobGas * BigInt(blobTx.blobCount) * 131072n; // 128KB per blob
|
|
373
|
+
|
|
374
|
+
const totalCostWei = executionCost + blobCost;
|
|
375
|
+
const totalCostEth = Number(totalCostWei) / 1e18;
|
|
376
|
+
|
|
377
|
+
this.fishermanMinedBlobTxTotalCost.record(totalCostEth, strategyAttributes);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Record the calculated priority fee for this strategy
|
|
382
|
+
const calculatedPriorityFeeGwei = Number(strategyResult.calculatedPriorityFee) / 1e9;
|
|
383
|
+
this.fishermanCalculatedPriorityFee.record(calculatedPriorityFeeGwei, strategyAttributes);
|
|
384
|
+
|
|
385
|
+
// Record analysis results if available
|
|
386
|
+
if (analysis.analysis) {
|
|
387
|
+
this.fishermanTimeBeforeBlock.record(Math.ceil(analysis.analysis.timeBeforeBlockMs), strategyAttributes);
|
|
388
|
+
|
|
389
|
+
// Record strategy-specific inclusion result
|
|
390
|
+
if (strategyResult.wouldBeIncluded !== undefined) {
|
|
391
|
+
if (strategyResult.wouldBeIncluded) {
|
|
392
|
+
this.fishermanWouldBeIncluded.add(1, { ...strategyAttributes, [Attributes.OK]: true });
|
|
393
|
+
} else {
|
|
394
|
+
this.fishermanWouldBeIncluded.add(1, {
|
|
395
|
+
...strategyAttributes,
|
|
396
|
+
[Attributes.OK]: false,
|
|
397
|
+
...(strategyResult.exclusionReason && { [Attributes.ERROR_TYPE]: strategyResult.exclusionReason }),
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Record strategy-specific priority fee delta
|
|
403
|
+
if (strategyResult.priorityFeeDelta !== undefined) {
|
|
404
|
+
const priorityFeeDeltaGwei = Number(strategyResult.priorityFeeDelta) / 1e9;
|
|
405
|
+
this.fishermanPriorityFeeDelta.record(priorityFeeDeltaGwei, strategyAttributes);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Record estimated cost if available
|
|
409
|
+
if (strategyResult.estimatedCostEth !== undefined) {
|
|
410
|
+
this.fishermanEstimatedCost.record(strategyResult.estimatedCostEth, strategyAttributes);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Record estimated overpayment if available
|
|
414
|
+
if (strategyResult.estimatedOverpaymentEth !== undefined) {
|
|
415
|
+
this.fishermanEstimatedOverpayment.record(strategyResult.estimatedOverpaymentEth, strategyAttributes);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
240
420
|
}
|
|
@@ -108,6 +108,9 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
108
108
|
/** The last slot for which we built a validation block in fisherman mode, to prevent duplicate attempts. */
|
|
109
109
|
private lastSlotForValidationBlock: SlotNumber | undefined;
|
|
110
110
|
|
|
111
|
+
/** The last epoch for which we logged strategy comparison in fisherman mode. */
|
|
112
|
+
private lastEpochForStrategyComparison: EpochNumber | undefined;
|
|
113
|
+
|
|
111
114
|
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */
|
|
112
115
|
protected timetable!: SequencerTimetable;
|
|
113
116
|
protected enforceTimeTable: boolean = false;
|
|
@@ -430,9 +433,22 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
430
433
|
// Wait until the voting promises have resolved, so all requests are enqueued
|
|
431
434
|
await Promise.all(votesPromises);
|
|
432
435
|
|
|
433
|
-
// In fisherman mode, we don't publish to L1
|
|
436
|
+
// In fisherman mode, we don't publish to L1 but analyze the fees
|
|
434
437
|
if (this.config.fishermanMode) {
|
|
435
|
-
//
|
|
438
|
+
// Perform L1 fee analysis before clearing requests
|
|
439
|
+
// The callback is invoked asynchronously after the next block is mined
|
|
440
|
+
const feeAnalysis = await publisher.analyzeL1Fees(BigInt(slot), analysis => {
|
|
441
|
+
this.metrics.recordFishermanFeeAnalysis(analysis);
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// Check if we've moved to a new epoch and log strategy comparison
|
|
445
|
+
const currentEpoch = this.epochCache.getEpochAndSlotNow().epoch;
|
|
446
|
+
if (this.lastEpochForStrategyComparison === undefined || currentEpoch > this.lastEpochForStrategyComparison) {
|
|
447
|
+
this.logStrategyComparison(currentEpoch, publisher);
|
|
448
|
+
this.lastEpochForStrategyComparison = currentEpoch;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Clear pending requests (we're not sending them)
|
|
436
452
|
publisher.clearPendingRequests();
|
|
437
453
|
|
|
438
454
|
if (block) {
|
|
@@ -441,6 +457,7 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
441
457
|
slot: Number(slot),
|
|
442
458
|
archive: block.archive.toString(),
|
|
443
459
|
txCount: block.body.txEffects.length,
|
|
460
|
+
feeAnalysisId: feeAnalysis?.id,
|
|
444
461
|
});
|
|
445
462
|
this.lastBlockPublished = block;
|
|
446
463
|
this.metrics.recordBlockProposalSuccess();
|
|
@@ -449,6 +466,7 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
449
466
|
this.log.warn(`Validation block building FAILED for slot ${slot}`, {
|
|
450
467
|
blockNumber: newBlockNumber,
|
|
451
468
|
slot: Number(slot),
|
|
469
|
+
feeAnalysisId: feeAnalysis?.id,
|
|
452
470
|
});
|
|
453
471
|
this.metrics.recordBlockProposalFailed('block_build_failed');
|
|
454
472
|
}
|
|
@@ -1261,6 +1279,38 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
1261
1279
|
return Number((this.dateProvider.now() / 1000 - slotStartTimestamp).toFixed(3));
|
|
1262
1280
|
}
|
|
1263
1281
|
|
|
1282
|
+
/**
|
|
1283
|
+
* Logs strategy comparison statistics at the end of each epoch in fisherman mode
|
|
1284
|
+
*/
|
|
1285
|
+
private logStrategyComparison(epoch: EpochNumber, publisher: SequencerPublisher): void {
|
|
1286
|
+
const feeAnalyzer = publisher.getL1FeeAnalyzer();
|
|
1287
|
+
if (!feeAnalyzer) {
|
|
1288
|
+
return;
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
const comparison = feeAnalyzer.getStrategyComparison();
|
|
1292
|
+
if (comparison.length === 0) {
|
|
1293
|
+
this.log.debug(`No strategy data available yet for epoch ${epoch}`);
|
|
1294
|
+
return;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
this.log.info(`L1 Fee Strategy Performance Report - End of Epoch ${epoch}`, {
|
|
1298
|
+
epoch: Number(epoch),
|
|
1299
|
+
totalAnalyses: comparison[0]?.totalAnalyses,
|
|
1300
|
+
strategies: comparison.map(s => ({
|
|
1301
|
+
id: s.strategyId,
|
|
1302
|
+
name: s.strategyName,
|
|
1303
|
+
inclusionRate: `${(s.inclusionRate * 100).toFixed(1)}%`,
|
|
1304
|
+
inclusionCount: `${s.inclusionCount}/${s.totalAnalyses}`,
|
|
1305
|
+
avgCostEth: s.avgEstimatedCostEth.toFixed(6),
|
|
1306
|
+
totalCostEth: s.totalEstimatedCostEth.toFixed(6),
|
|
1307
|
+
avgOverpaymentEth: s.avgOverpaymentEth.toFixed(6),
|
|
1308
|
+
totalOverpaymentEth: s.totalOverpaymentEth.toFixed(6),
|
|
1309
|
+
avgPriorityFeeDeltaGwei: s.avgPriorityFeeDeltaGwei.toFixed(2),
|
|
1310
|
+
})),
|
|
1311
|
+
});
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1264
1314
|
get aztecSlotDuration() {
|
|
1265
1315
|
return this.l1Constants.slotDuration;
|
|
1266
1316
|
}
|