@aztec/sequencer-client 5.3.0-nightly.20260908 → 5.3.0-nightly.20260910
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/global_variable_builder/fee_predictor.d.ts +9 -14
- package/dest/global_variable_builder/fee_predictor.d.ts.map +1 -1
- package/dest/global_variable_builder/fee_predictor.js +5 -19
- package/dest/global_variable_builder/fee_provider.d.ts +32 -10
- package/dest/global_variable_builder/fee_provider.d.ts.map +1 -1
- package/dest/global_variable_builder/fee_provider.js +146 -34
- package/dest/global_variable_builder/global_builder.d.ts +9 -3
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +9 -2
- package/dest/sequencer/automine/automine_sequencer.d.ts +1 -1
- package/dest/sequencer/automine/automine_sequencer.d.ts.map +1 -1
- package/dest/sequencer/automine/automine_sequencer.js +1 -4
- package/dest/sequencer/sequencer.d.ts +2 -2
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +17 -12
- package/package.json +27 -27
- package/src/global_variable_builder/fee_predictor.ts +8 -28
- package/src/global_variable_builder/fee_provider.ts +156 -31
- package/src/global_variable_builder/global_builder.ts +10 -2
- package/src/sequencer/automine/automine_sequencer.ts +1 -4
- package/src/sequencer/sequencer.ts +19 -15
|
@@ -2,8 +2,8 @@ import { type L1FeeData, type RollupContract } from '@aztec/ethereum/contracts';
|
|
|
2
2
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import type { DateProvider } from '@aztec/foundation/timer';
|
|
4
4
|
import { GasFees, ManaUsageEstimate } from '@aztec/stdlib/gas';
|
|
5
|
-
/**
|
|
6
|
-
type FeeOracleState = {
|
|
5
|
+
/** Rollup state a set of fee predictions is computed from, read at a single L1 block. */
|
|
6
|
+
export type FeeOracleState = {
|
|
7
7
|
lastSlot: SlotNumber;
|
|
8
8
|
excessMana: bigint;
|
|
9
9
|
ethPerFeeAsset: bigint;
|
|
@@ -22,7 +22,6 @@ type FeeOracleState = {
|
|
|
22
22
|
export declare class FeePredictor {
|
|
23
23
|
private readonly rollupContract;
|
|
24
24
|
private readonly dateProvider;
|
|
25
|
-
private cachedState;
|
|
26
25
|
private readonly slotDuration;
|
|
27
26
|
private readonly l1GenesisTime;
|
|
28
27
|
private readonly ethereumSlotDuration;
|
|
@@ -31,19 +30,15 @@ export declare class FeePredictor {
|
|
|
31
30
|
l1GenesisTime: bigint;
|
|
32
31
|
ethereumSlotDuration: number;
|
|
33
32
|
});
|
|
34
|
-
/** Returns predicted min fees for each slot in the prediction window, from the cached state. */
|
|
35
|
-
getPredictedMinFees(manaUsage: ManaUsageEstimate): GasFees[];
|
|
36
|
-
/** Returns whatever rollup state is currently cached, or undefined if refreshState() has never been called. */
|
|
37
|
-
getState(): FeeOracleState | undefined;
|
|
38
33
|
/**
|
|
39
|
-
*
|
|
34
|
+
* Reads the rollup state the predictions are derived from, pinned to the given L1 block. The state is
|
|
35
|
+
* returned rather than cached: its owner stores it alongside the L1 block it was read at, so a caller that
|
|
36
|
+
* asks for fees at a specific L1 block is answered from the state read at that block.
|
|
40
37
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
private computePredictions;
|
|
38
|
+
computeState(blockNumber: bigint): Promise<FeeOracleState>;
|
|
39
|
+
/** Computes per-slot fee predictions given rollup state and a mana usage assumption. */
|
|
40
|
+
computePredictions(state: FeeOracleState, manaUsage: ManaUsageEstimate): GasFees[];
|
|
45
41
|
private getAssumedManaUsed;
|
|
46
42
|
private computeGasFees;
|
|
47
43
|
}
|
|
48
|
-
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlX3ByZWRpY3Rvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JhbF92YXJpYWJsZV9idWlsZGVyL2ZlZV9wcmVkaWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFvQyxLQUFLLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBRUwsT0FBTyxFQUVQLGlCQUFpQixFQUdsQixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLDJFQUEyRTtBQUMzRSxLQUFLLGNBQWMsR0FBRztJQUNwQixRQUFRLEVBQUUsVUFBVSxDQUFDO0lBQ3JCLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsY0FBYyxFQUFFLE1BQU0sQ0FBQztJQUN2QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0lBQzlCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsbUVBQW1FO0lBQ25FLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUMzQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHFCQUFhLFlBQVk7SUFRckIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjO0lBQy9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQVIvQixPQUFPLENBQUMsV0FBVyxDQUE2QjtJQUVoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBUztJQUN0QyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUN2QyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFTO0lBRTlDLFlBQ21CLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFlBQVksRUFBRSxZQUFZLEVBQzNDLE1BQU0sRUFBRTtRQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7UUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO1FBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFLdEY7SUFFRCxnR0FBZ0c7SUFDaEcsbUJBQW1CLENBQUMsU0FBUyxFQUFFLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxDQU0zRDtJQUVELCtHQUErRztJQUMvRyxRQUFRLElBQUksY0FBYyxHQUFHLFNBQVMsQ0FFckM7SUFFRDs7T0FFRztJQUNHLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FJL0Q7WUFFYSxVQUFVO0lBaUR4Qix3RkFBd0Y7SUFDeEYsT0FBTyxDQUFDLGtCQUFrQjtJQXVCMUIsT0FBTyxDQUFDLGtCQUFrQjtJQVcxQixPQUFPLENBQUMsY0FBYztDQW1CdkIifQ==
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlX3ByZWRpY3Rvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JhbF92YXJpYWJsZV9idWlsZGVyL2ZlZV9wcmVkaWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFvQyxLQUFLLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBRUwsT0FBTyxFQUVQLGlCQUFpQixFQUdsQixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLHlGQUF5RjtBQUN6RixNQUFNLE1BQU0sY0FBYyxHQUFHO0lBQzNCLFFBQVEsRUFBRSxVQUFVLENBQUM7SUFDckIsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixxQkFBcUIsRUFBRSxNQUFNLENBQUM7SUFDOUIsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0QixtRUFBbUU7SUFDbkUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQzNCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gscUJBQWEsWUFBWTtJQU1yQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWM7SUFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBTi9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFTO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQVM7SUFFOUMsWUFDbUIsY0FBYyxFQUFFLGNBQWMsRUFDOUIsWUFBWSxFQUFFLFlBQVksRUFDM0MsTUFBTSxFQUFFO1FBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUE7S0FBRSxFQUt0RjtJQUVEOzs7O09BSUc7SUFDRyxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBK0MvRDtJQUVELHdGQUF3RjtJQUN4RixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsR0FBRyxPQUFPLEVBQUUsQ0FxQmpGO0lBRUQsT0FBTyxDQUFDLGtCQUFrQjtJQVcxQixPQUFPLENBQUMsY0FBYztDQW1CdkIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fee_predictor.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/fee_predictor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoC,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAClH,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAEL,OAAO,EAEP,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC;AAE3B,
|
|
1
|
+
{"version":3,"file":"fee_predictor.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/fee_predictor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoC,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAClH,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAEL,OAAO,EAEP,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC;AAE3B,yFAAyF;AACzF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAE9C,YACmB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC3C,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAA;KAAE,EAKtF;IAED;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA+C/D;IAED,wFAAwF;IACxF,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAqBjF;IAED,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;CAmBvB"}
|
|
@@ -10,7 +10,6 @@ import { FEE_ORACLE_LAG, GasFees, MIN_ETH_PER_FEE_ASSET, ManaUsageEstimate, comp
|
|
|
10
10
|
*/ export class FeePredictor {
|
|
11
11
|
rollupContract;
|
|
12
12
|
dateProvider;
|
|
13
|
-
cachedState;
|
|
14
13
|
slotDuration;
|
|
15
14
|
l1GenesisTime;
|
|
16
15
|
ethereumSlotDuration;
|
|
@@ -21,24 +20,11 @@ import { FEE_ORACLE_LAG, GasFees, MIN_ETH_PER_FEE_ASSET, ManaUsageEstimate, comp
|
|
|
21
20
|
this.l1GenesisTime = config.l1GenesisTime;
|
|
22
21
|
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
23
22
|
}
|
|
24
|
-
/** Returns predicted min fees for each slot in the prediction window, from the cached state. */ getPredictedMinFees(manaUsage) {
|
|
25
|
-
const state = this.getState();
|
|
26
|
-
if (state === undefined) {
|
|
27
|
-
throw new Error('FeePredictor.refreshState() must be called before getPredictedMinFees()');
|
|
28
|
-
}
|
|
29
|
-
return this.computePredictions(state, manaUsage);
|
|
30
|
-
}
|
|
31
|
-
/** Returns whatever rollup state is currently cached, or undefined if refreshState() has never been called. */ getState() {
|
|
32
|
-
return this.cachedState;
|
|
33
|
-
}
|
|
34
23
|
/**
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return state;
|
|
40
|
-
}
|
|
41
|
-
async fetchState(blockNumber) {
|
|
24
|
+
* Reads the rollup state the predictions are derived from, pinned to the given L1 block. The state is
|
|
25
|
+
* returned rather than cached: its owner stores it alongside the L1 block it was read at, so a caller that
|
|
26
|
+
* asks for fees at a specific L1 block is answered from the state read at that block.
|
|
27
|
+
*/ async computeState(blockNumber) {
|
|
42
28
|
// Pin all non-constant queries to this L1 block number for a consistent snapshot.
|
|
43
29
|
const opts = {
|
|
44
30
|
blockNumber
|
|
@@ -85,7 +71,7 @@ import { FEE_ORACLE_LAG, GasFees, MIN_ETH_PER_FEE_ASSET, ManaUsageEstimate, comp
|
|
|
85
71
|
l1FeesBySlot
|
|
86
72
|
};
|
|
87
73
|
}
|
|
88
|
-
/** Computes per-slot fee predictions given
|
|
74
|
+
/** Computes per-slot fee predictions given rollup state and a mana usage assumption. */ computePredictions(state, manaUsage) {
|
|
89
75
|
const assumedManaUsed = this.getAssumedManaUsed(state, manaUsage);
|
|
90
76
|
const result = [];
|
|
91
77
|
let { excessMana } = state;
|
|
@@ -1,28 +1,50 @@
|
|
|
1
1
|
import type { ViemPublicClient } from '@aztec/ethereum/types';
|
|
2
|
-
import type
|
|
2
|
+
import { type DateProvider } from '@aztec/foundation/timer';
|
|
3
|
+
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
3
4
|
import { GasFees, ManaUsageEstimate } from '@aztec/stdlib/gas';
|
|
4
|
-
import type { FeeProvider } from '@aztec/stdlib/tx';
|
|
5
|
+
import type { FeeAsOf, FeeProvider } from '@aztec/stdlib/tx';
|
|
5
6
|
import type { GlobalVariableBuilderConfig } from './global_builder.js';
|
|
6
7
|
/**
|
|
7
|
-
* Provides current and predicted fee information based on on-chain state
|
|
8
|
+
* Provides current and predicted fee information based on on-chain state, refreshed from the archiver's L1 sync
|
|
9
|
+
* point rather than from a poll of its own.
|
|
10
|
+
*
|
|
11
|
+
* Following the archiver means the fees and the block plans that consume them describe the same L1 block: two
|
|
12
|
+
* independent L1 pollers would otherwise disagree for up to a poll interval after a checkpoint lands, and the
|
|
13
|
+
* mana min fee is a step function of the slot, so that disagreement shows up as a wallet quote the node's own
|
|
14
|
+
* public simulation then rejects.
|
|
15
|
+
*
|
|
16
|
+
* Every L1 read in a refresh is pinned to the sync point's block number, and the resulting entry is kept in a
|
|
17
|
+
* small ring so a caller that planned from a slightly older archiver snapshot can be answered for that same
|
|
18
|
+
* block via {@link FeeAsOf}.
|
|
8
19
|
*/
|
|
9
20
|
export declare class FeeProviderImpl implements FeeProvider {
|
|
10
21
|
private readonly dateProvider;
|
|
11
22
|
private readonly publicClient;
|
|
12
|
-
private
|
|
13
|
-
|
|
23
|
+
private readonly syncPointSource;
|
|
24
|
+
/** Recent L1 views, newest first. */
|
|
25
|
+
private entries;
|
|
14
26
|
private refreshLoop;
|
|
27
|
+
private inFlightRefresh;
|
|
15
28
|
private readonly rollupContract;
|
|
16
29
|
private readonly feePredictor;
|
|
17
30
|
private readonly ethereumSlotDuration;
|
|
18
31
|
private readonly l1GenesisTime;
|
|
19
32
|
private readonly log;
|
|
20
|
-
constructor(dateProvider: DateProvider, publicClient: ViemPublicClient, config: GlobalVariableBuilderConfig);
|
|
33
|
+
constructor(dateProvider: DateProvider, publicClient: ViemPublicClient, config: GlobalVariableBuilderConfig, syncPointSource: Pick<L2BlockSource, 'getL1SyncPoint'>);
|
|
21
34
|
start(pollingIntervalMs?: number): Promise<void>;
|
|
22
35
|
stop(): Promise<void>;
|
|
23
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Refreshes the fee entries against the archiver's current L1 sync point, unless the newest entry already
|
|
38
|
+
* describes it. Single-flight: a call made while a refresh is running joins that refresh instead of
|
|
39
|
+
* starting a second one, so the loop and any waiting requests share one round of L1 reads.
|
|
40
|
+
*/
|
|
41
|
+
refresh(): Promise<void>;
|
|
42
|
+
getCurrentMinFees(asOf?: FeeAsOf): Promise<GasFees>;
|
|
43
|
+
getPredictedMinFees(manaUsage?: ManaUsageEstimate, asOf?: FeeAsOf): Promise<GasFees[]>;
|
|
44
|
+
private getEntry;
|
|
45
|
+
private awaitRefresh;
|
|
46
|
+
private doRefresh;
|
|
47
|
+
private resolveSyncPoint;
|
|
24
48
|
private computeCurrentMinFees;
|
|
25
|
-
getCurrentMinFees(): Promise<GasFees>;
|
|
26
|
-
getPredictedMinFees(manaUsage?: ManaUsageEstimate): Promise<GasFees[]>;
|
|
27
49
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlX3Byb3ZpZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmFsX3ZhcmlhYmxlX2J1aWxkZXIvZmVlX3Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNOUQsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQWUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3RCxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBb0J2RTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxxQkFBYSxlQUFnQixZQUFXLFdBQVc7SUFhL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQUU3QixPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFmbEMscUNBQXFDO0lBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQWtCO0lBQ2pDLE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBQ2hELE9BQU8sQ0FBQyxlQUFlLENBQTRCO0lBRW5ELE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFpQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBZTtJQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFTO0lBQzlDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFTO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUF5RDtJQUU3RSxZQUNtQixZQUFZLEVBQUUsWUFBWSxFQUMxQixZQUFZLEVBQUUsZ0JBQWdCLEVBQy9DLE1BQU0sRUFBRSwyQkFBMkIsRUFDbEIsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsRUFXeEU7SUFFWSxLQUFLLENBQUMsaUJBQWlCLFNBQXNDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUl6RjtJQUVZLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBR2pDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBSTlCO0lBRVksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHL0Q7SUFFWSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBVWxHO1lBU2EsUUFBUTtZQXdDUixZQUFZO1lBYVosU0FBUztZQW9CVCxnQkFBZ0I7WUFjaEIscUJBQXFCO0NBbUJwQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fee_provider.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/fee_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"fee_provider.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/fee_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAoBvE;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,WAAW;IAa/C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAflC,qCAAqC;IACrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAA4B;IAEnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyD;IAE7E,YACmB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,gBAAgB,EAC/C,MAAM,EAAE,2BAA2B,EAClB,eAAe,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,EAWxE;IAEY,KAAK,CAAC,iBAAiB,SAAsC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzF;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjC;IAED;;;;OAIG;IACI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI9B;IAEY,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAG/D;IAEY,mBAAmB,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAUlG;YASa,QAAQ;YAwCR,YAAY;YAaZ,SAAS;YAoBT,gBAAgB;YAchB,qBAAqB;CAmBpC"}
|
|
@@ -1,29 +1,48 @@
|
|
|
1
1
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
4
6
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
7
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
5
8
|
import { getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
6
9
|
import { GasFees, ManaUsageEstimate } from '@aztec/stdlib/gas';
|
|
7
10
|
import { FeePredictor } from './fee_predictor.js';
|
|
8
|
-
/** Default interval for the background
|
|
11
|
+
/** Default interval for the background refresh loop, well below L1's block time. */ const DEFAULT_REFRESH_POLLING_INTERVAL_MS = 1000;
|
|
12
|
+
/** How many recent L1 views are retained, so a caller that planned a block or two ago is still answerable. */ const RING_SIZE = 4;
|
|
9
13
|
/**
|
|
10
|
-
*
|
|
14
|
+
* Refresh passes a tagged request waits through before settling for the closest view. The first pass it joins
|
|
15
|
+
* may have started from an older sync point than the one it is tagged with; the second is its own.
|
|
16
|
+
*/ const MAX_REFRESH_ATTEMPTS = 2;
|
|
17
|
+
/**
|
|
18
|
+
* Provides current and predicted fee information based on on-chain state, refreshed from the archiver's L1 sync
|
|
19
|
+
* point rather than from a poll of its own.
|
|
20
|
+
*
|
|
21
|
+
* Following the archiver means the fees and the block plans that consume them describe the same L1 block: two
|
|
22
|
+
* independent L1 pollers would otherwise disagree for up to a poll interval after a checkpoint lands, and the
|
|
23
|
+
* mana min fee is a step function of the slot, so that disagreement shows up as a wallet quote the node's own
|
|
24
|
+
* public simulation then rejects.
|
|
25
|
+
*
|
|
26
|
+
* Every L1 read in a refresh is pinned to the sync point's block number, and the resulting entry is kept in a
|
|
27
|
+
* small ring so a caller that planned from a slightly older archiver snapshot can be answered for that same
|
|
28
|
+
* block via {@link FeeAsOf}.
|
|
11
29
|
*/ export class FeeProviderImpl {
|
|
12
30
|
dateProvider;
|
|
13
31
|
publicClient;
|
|
14
|
-
|
|
15
|
-
|
|
32
|
+
syncPointSource;
|
|
33
|
+
/** Recent L1 views, newest first. */ entries;
|
|
16
34
|
refreshLoop;
|
|
35
|
+
inFlightRefresh;
|
|
17
36
|
rollupContract;
|
|
18
37
|
feePredictor;
|
|
19
38
|
ethereumSlotDuration;
|
|
20
39
|
l1GenesisTime;
|
|
21
40
|
log;
|
|
22
|
-
constructor(dateProvider, publicClient, config){
|
|
41
|
+
constructor(dateProvider, publicClient, config, syncPointSource){
|
|
23
42
|
this.dateProvider = dateProvider;
|
|
24
43
|
this.publicClient = publicClient;
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
44
|
+
this.syncPointSource = syncPointSource;
|
|
45
|
+
this.entries = [];
|
|
27
46
|
this.log = createLogger('sequencer-client:fee-provider');
|
|
28
47
|
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
29
48
|
this.l1GenesisTime = config.l1GenesisTime;
|
|
@@ -35,53 +54,146 @@ import { FeePredictor } from './fee_predictor.js';
|
|
|
35
54
|
});
|
|
36
55
|
}
|
|
37
56
|
async start(pollingIntervalMs = DEFAULT_REFRESH_POLLING_INTERVAL_MS) {
|
|
38
|
-
await this.
|
|
39
|
-
this.refreshLoop = new RunningPromise(()=>this.
|
|
57
|
+
await this.refresh();
|
|
58
|
+
this.refreshLoop = new RunningPromise(()=>this.refresh(), this.log, pollingIntervalMs);
|
|
40
59
|
this.refreshLoop.start();
|
|
41
60
|
}
|
|
42
61
|
async stop() {
|
|
43
62
|
await this.refreshLoop?.stop();
|
|
63
|
+
await this.inFlightRefresh?.catch(()=>{});
|
|
44
64
|
}
|
|
45
65
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
66
|
+
* Refreshes the fee entries against the archiver's current L1 sync point, unless the newest entry already
|
|
67
|
+
* describes it. Single-flight: a call made while a refresh is running joins that refresh instead of
|
|
68
|
+
* starting a second one, so the loop and any waiting requests share one round of L1 reads.
|
|
69
|
+
*/ refresh() {
|
|
70
|
+
return this.inFlightRefresh ??= this.doRefresh().finally(()=>{
|
|
71
|
+
this.inFlightRefresh = undefined;
|
|
51
72
|
});
|
|
52
|
-
|
|
73
|
+
}
|
|
74
|
+
async getCurrentMinFees(asOf) {
|
|
75
|
+
const entry = await this.getEntry(asOf);
|
|
76
|
+
return entry?.currentMinFees ?? new GasFees(0, 0);
|
|
77
|
+
}
|
|
78
|
+
async getPredictedMinFees(manaUsage, asOf) {
|
|
79
|
+
const entry = await this.getEntry(asOf);
|
|
80
|
+
if (entry === undefined) {
|
|
81
|
+
throw new Error('FeeProviderImpl.start() must be called before getPredictedMinFees()');
|
|
82
|
+
}
|
|
83
|
+
const predictions = this.feePredictor.computePredictions(entry.predictorState, manaUsage ?? ManaUsageEstimate.Target);
|
|
84
|
+
return [
|
|
85
|
+
entry.currentMinFees,
|
|
86
|
+
...predictions
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Picks the entry to serve: the newest one when untagged, otherwise the one for the tagged L1 block. A tag
|
|
91
|
+
* ahead of every entry waits for the shared refresh, and once more for its own if the one it joined was
|
|
92
|
+
* already under way from an older sync point, all within `maxWaitMs` when set; a tag behind the ring gets the
|
|
93
|
+
* oldest entry. A tagged miss never throws: the caller asked for a specific L1 view as a consistency
|
|
94
|
+
* preference, not as a precondition, so it is answered with the closest view available.
|
|
95
|
+
*/ async getEntry(asOf) {
|
|
96
|
+
if (asOf === undefined) {
|
|
97
|
+
return this.entries[0];
|
|
98
|
+
}
|
|
99
|
+
const findTagged = ()=>this.entries.find((entry)=>entry.blockNumber === asOf.blockNumber);
|
|
100
|
+
const timer = new Timer();
|
|
101
|
+
for(let attempt = 0; attempt < MAX_REFRESH_ATTEMPTS; attempt++){
|
|
102
|
+
const hit = findTagged();
|
|
103
|
+
if (hit) {
|
|
104
|
+
return hit;
|
|
105
|
+
}
|
|
106
|
+
const oldest = this.entries.at(-1);
|
|
107
|
+
if (oldest !== undefined && asOf.blockNumber < oldest.blockNumber) {
|
|
108
|
+
this.log.debug(`Requested fees for L1 block ${asOf.blockNumber} predate the retained views`, {
|
|
109
|
+
requestedBlockNumber: asOf.blockNumber,
|
|
110
|
+
servedBlockNumber: oldest.blockNumber
|
|
111
|
+
});
|
|
112
|
+
return oldest;
|
|
113
|
+
}
|
|
114
|
+
const remainingMs = asOf.maxWaitMs === undefined ? undefined : asOf.maxWaitMs - timer.ms();
|
|
115
|
+
if (remainingMs !== undefined && remainingMs <= 0) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
await this.awaitRefresh(remainingMs);
|
|
119
|
+
}
|
|
120
|
+
const refreshed = findTagged();
|
|
121
|
+
if (!refreshed) {
|
|
122
|
+
this.log.debug(`No fees available for L1 block ${asOf.blockNumber} after refreshing`, {
|
|
123
|
+
requestedBlockNumber: asOf.blockNumber,
|
|
124
|
+
servedBlockNumber: this.entries[0]?.blockNumber
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return refreshed ?? this.entries[0];
|
|
128
|
+
}
|
|
129
|
+
/** Waits for the shared refresh, giving up after `maxWaitMs` if set. Never rejects. */ async awaitRefresh(maxWaitMs) {
|
|
130
|
+
const refresh = this.refresh().catch((err)=>this.log.warn(`Failed to refresh fees while serving a request`, {
|
|
131
|
+
err
|
|
132
|
+
}));
|
|
133
|
+
if (maxWaitMs === undefined) {
|
|
134
|
+
return refresh;
|
|
135
|
+
}
|
|
136
|
+
const cap = promiseWithResolvers();
|
|
137
|
+
const timer = setTimeout(cap.resolve, maxWaitMs);
|
|
138
|
+
await Promise.race([
|
|
139
|
+
refresh,
|
|
140
|
+
cap.promise
|
|
141
|
+
]).finally(()=>clearTimeout(timer));
|
|
142
|
+
}
|
|
143
|
+
async doRefresh() {
|
|
144
|
+
const syncPoint = await this.resolveSyncPoint();
|
|
145
|
+
if (this.entries[0]?.blockHash.equals(syncPoint.blockHash)) {
|
|
53
146
|
return;
|
|
54
147
|
}
|
|
55
|
-
const
|
|
56
|
-
await
|
|
57
|
-
|
|
58
|
-
|
|
148
|
+
const { blockNumber } = syncPoint;
|
|
149
|
+
const [currentMinFees, predictorState] = await Promise.all([
|
|
150
|
+
this.computeCurrentMinFees(blockNumber),
|
|
151
|
+
this.feePredictor.computeState(blockNumber)
|
|
152
|
+
]);
|
|
153
|
+
this.entries = [
|
|
154
|
+
{
|
|
155
|
+
...syncPoint,
|
|
156
|
+
currentMinFees,
|
|
157
|
+
predictorState
|
|
158
|
+
},
|
|
159
|
+
...this.entries
|
|
160
|
+
].slice(0, RING_SIZE);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* The L1 block to price at: the archiver's sync point once it has run a pass, otherwise L1's head. The
|
|
164
|
+
* fallback only applies before the archiver's first pass, so a node can answer fee queries while it is still
|
|
165
|
+
* catching up rather than blocking startup on the archiver.
|
|
166
|
+
*/ async resolveSyncPoint() {
|
|
167
|
+
const syncPoint = await this.syncPointSource.getL1SyncPoint();
|
|
168
|
+
if (syncPoint !== undefined) {
|
|
169
|
+
return syncPoint;
|
|
170
|
+
}
|
|
171
|
+
const block = await this.publicClient.getBlock({
|
|
172
|
+
blockTag: 'latest'
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
blockNumber: block.number,
|
|
176
|
+
blockHash: Buffer32.fromString(block.hash)
|
|
177
|
+
};
|
|
59
178
|
}
|
|
60
179
|
/**
|
|
61
180
|
* Computes the "current" min fees, e.g., the price that you currently should pay to get include in the next block
|
|
181
|
+
* @param blockNumber - L1 block every read is pinned to.
|
|
62
182
|
* @returns Min fees for the next block
|
|
63
|
-
*/ async computeCurrentMinFees() {
|
|
183
|
+
*/ async computeCurrentMinFees(blockNumber) {
|
|
64
184
|
// Since this might be called in the middle of a slot where a block might have been published,
|
|
65
185
|
// we need to fetch the last block written, and estimate the earliest timestamp for the next block.
|
|
66
186
|
// The timestamp of that last block will act as a lower bound for the next block.
|
|
67
|
-
const
|
|
68
|
-
|
|
187
|
+
const options = {
|
|
188
|
+
blockNumber
|
|
189
|
+
};
|
|
190
|
+
const lastCheckpoint = await this.rollupContract.getPendingCheckpoint(options);
|
|
191
|
+
const earliestTimestamp = await this.rollupContract.getTimestampForSlot(SlotNumber.fromBigInt(BigInt(lastCheckpoint.slotNumber) + 1n), options);
|
|
69
192
|
const nextEthTimestamp = getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), {
|
|
70
193
|
l1GenesisTime: this.l1GenesisTime,
|
|
71
194
|
ethereumSlotDuration: this.ethereumSlotDuration
|
|
72
195
|
});
|
|
73
196
|
const timestamp = earliestTimestamp > nextEthTimestamp ? earliestTimestamp : nextEthTimestamp;
|
|
74
|
-
return new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true));
|
|
75
|
-
}
|
|
76
|
-
getCurrentMinFees() {
|
|
77
|
-
return Promise.resolve(this.currentMinFees);
|
|
78
|
-
}
|
|
79
|
-
getPredictedMinFees(manaUsage) {
|
|
80
|
-
const currentMinFees = this.currentMinFees;
|
|
81
|
-
const predictedMinFees = this.feePredictor.getPredictedMinFees(manaUsage ?? ManaUsageEstimate.Target);
|
|
82
|
-
return Promise.resolve([
|
|
83
|
-
currentMinFees,
|
|
84
|
-
...predictedMinFees
|
|
85
|
-
]);
|
|
197
|
+
return new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true, options));
|
|
86
198
|
}
|
|
87
199
|
}
|
|
@@ -22,7 +22,13 @@ export declare class GlobalVariableBuilder implements GlobalVariableBuilderInter
|
|
|
22
22
|
private chainId;
|
|
23
23
|
private version;
|
|
24
24
|
constructor(publicClient: ViemPublicClient, config: GlobalVariableBuilderConfig);
|
|
25
|
-
/**
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Builds global variables that are constant throughout a checkpoint.
|
|
27
|
+
* @param options - Optional L1 block number to pin the fee read to, so the fee describes the same L1 state
|
|
28
|
+
* the caller planned the block from.
|
|
29
|
+
*/
|
|
30
|
+
buildCheckpointGlobalVariables(coinbase: EthAddress, feeRecipient: AztecAddress, slotNumber: SlotNumber, simulationOverridesPlan?: SimulationOverridesPlan, options?: {
|
|
31
|
+
blockNumber?: bigint;
|
|
32
|
+
}): Promise<CheckpointGlobalVariables>;
|
|
27
33
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX2J1aWxkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nbG9iYWxfdmFyaWFibGVfYnVpbGRlci9nbG9iYWxfYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsS0FBSyx1QkFBdUIsRUFFN0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBRTFGLE9BQU8sS0FBSyxFQUNWLHlCQUF5QixFQUN6QixxQkFBcUIsSUFBSSw4QkFBOEIsRUFDeEQsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQiwrRUFBK0U7QUFDL0UsTUFBTSxNQUFNLDJCQUEyQixHQUFHO0lBQ3hDLGFBQWEsRUFBRSxVQUFVLENBQUM7SUFDMUIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBQzdCLGFBQWEsRUFBRSxNQUFNLENBQUM7Q0FDdkIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0FBRTlEOztHQUVHO0FBQ0gscUJBQWEscUJBQXNCLFlBQVcsOEJBQThCO0lBU3hFLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQVIvQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBaUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBUztJQUMzQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUV2QyxPQUFPLENBQUMsT0FBTyxDQUFLO0lBQ3BCLE9BQU8sQ0FBQyxPQUFPLENBQUs7SUFFcEIsWUFDbUIsWUFBWSxFQUFFLGdCQUFnQixFQUMvQyxNQUFNLEVBQUUsMkJBQTJCLEVBU3BDO0lBRUQ7Ozs7T0FJRztJQUNVLDhCQUE4QixDQUN6QyxRQUFRLEVBQUUsVUFBVSxFQUNwQixZQUFZLEVBQUUsWUFBWSxFQUMxQixVQUFVLEVBQUUsVUFBVSxFQUN0Qix1QkFBdUIsQ0FBQyxFQUFFLHVCQUF1QixFQUNqRCxPQUFPLENBQUMsRUFBRTtRQUFFLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQ2pDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQWVwQztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global_builder.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/global_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,6BAA6B,CAAC;AAE1F,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,IAAI,8BAA8B,EACxD,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,EAAE,UAAU,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAAC,iBAAiB,EAAE,cAAc,GAAG,eAAe,CAAC,CAAC;AAE9D;;GAEG;AACH,qBAAa,qBAAsB,YAAW,8BAA8B;IASxE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IAEpB,YACmB,YAAY,EAAE,gBAAgB,EAC/C,MAAM,EAAE,2BAA2B,EASpC;IAED
|
|
1
|
+
{"version":3,"file":"global_builder.d.ts","sourceRoot":"","sources":["../../src/global_variable_builder/global_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,6BAA6B,CAAC;AAE1F,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,IAAI,8BAA8B,EACxD,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,EAAE,UAAU,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAAC,iBAAiB,EAAE,cAAc,GAAG,eAAe,CAAC,CAAC;AAE9D;;GAEG;AACH,qBAAa,qBAAsB,YAAW,8BAA8B;IASxE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IAEpB,YACmB,YAAY,EAAE,gBAAgB,EAC/C,MAAM,EAAE,2BAA2B,EASpC;IAED;;;;OAIG;IACU,8BAA8B,CACzC,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,uBAAuB,CAAC,EAAE,uBAAuB,EACjD,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,yBAAyB,CAAC,CAepC;CACF"}
|
|
@@ -19,14 +19,21 @@ import { GasFees } from '@aztec/stdlib/gas';
|
|
|
19
19
|
this.l1GenesisTime = config.l1GenesisTime;
|
|
20
20
|
this.rollupContract = new RollupContract(this.publicClient, config.rollupAddress);
|
|
21
21
|
}
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Builds global variables that are constant throughout a checkpoint.
|
|
24
|
+
* @param options - Optional L1 block number to pin the fee read to, so the fee describes the same L1 state
|
|
25
|
+
* the caller planned the block from.
|
|
26
|
+
*/ async buildCheckpointGlobalVariables(coinbase, feeRecipient, slotNumber, simulationOverridesPlan, options) {
|
|
23
27
|
const { chainId, version } = this;
|
|
24
28
|
const timestamp = getTimestampForSlot(slotNumber, {
|
|
25
29
|
slotDuration: this.aztecSlotDuration,
|
|
26
30
|
l1GenesisTime: this.l1GenesisTime
|
|
27
31
|
});
|
|
28
32
|
const stateOverride = await buildSimulationOverridesStateOverride(this.rollupContract, simulationOverridesPlan);
|
|
29
|
-
const gasFees = new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true,
|
|
33
|
+
const gasFees = new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true, {
|
|
34
|
+
stateOverride,
|
|
35
|
+
...options
|
|
36
|
+
}));
|
|
30
37
|
return {
|
|
31
38
|
chainId,
|
|
32
39
|
version,
|
|
@@ -186,4 +186,4 @@ export declare class AutomineSequencer {
|
|
|
186
186
|
private tryBuildBlock;
|
|
187
187
|
private dropFailedTxsFromP2P;
|
|
188
188
|
}
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b21pbmVfc2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VxdWVuY2VyL2F1dG9taW5lL2F1dG9taW5lX3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUFlLGdCQUFnQixFQUEyQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pHLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLFNBQVMsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFtQyxLQUFLLE9BQU8sRUFBRSxLQUFLLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhHLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUl2QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBNkIsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pHLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsNEJBQTRCLEVB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automine_sequencer.d.ts","sourceRoot":"","sources":["../../../src/sequencer/automine/automine_sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAe,gBAAgB,EAA2B,MAAM,iCAAiC,CAAC;AACzG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAmC,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAExG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAA6B,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAGV,0BAA0B,EAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,iBAAiB,EACjB,sBAAsB,GAAG,eAAe,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAChG,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,cAAc,EAAE,qBAAqB,CAAC;IACtC,UAAU,EAAE,sBAAsB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,6EAA6E;IAC7E,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACjD,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,WAAW,EAAE,0BAA0B,CAAC;IACxC,QAAQ,EAAE,UAAU,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,4BAA4B,CAAC;IAC/C,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC;IAC3E;;;OAGG;IACH,QAAQ,EAAE,IAAI,CACZ,QAAQ,EACR,YAAY,GAAG,UAAU,GAAG,uBAAuB,GAAG,eAAe,GAAG,iCAAiC,CAC1G,CAAC;IACF,uEAAuE;IACvE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;IAC3C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oHAAoH;IACpH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAE7C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,+GAA+G;IAC/G,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,eAAe,CAAC,CAAa;IAErC,oFAAoF;IACpF,OAAO,CAAC,WAAW,CAAuD;IAE1E,sEAAsE;IACtE,OAAO,CAAC,aAAa,CAAc;IAEnC,2FAA2F;IAC3F,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAE5C,YAAY,IAAI,EAAE,qBAAqB,EAKtC;IAED,yGAAyG;IACzG,OAAO,CAAC,mBAAmB;IAO3B;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BlC;IAED;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjC;IAED;;;;OAIG;IACI,cAAc,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAgBpD;IAED;;;;OAIG;IACI,KAAK,IAAI,IAAI,CAMnB;IAED,8EAA8E;IACvE,MAAM,IAAI,IAAI,CAMpB;IAED;;;;OAIG;IACI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAE1D;IAED,6FAA6F;IACtF,SAAS,IAAI,eAAe,CAElC;IAED,kEAAkE;IAC3D,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAQzC;IAED;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvD;IAED;;;;OAIG;IACI,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7C;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;IAED,uDAAuD;IAChD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,cAAc,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEzE;YAOa,WAAW;YAgBX,qBAAqB;YAQrB,iBAAiB;YAyBjB,QAAQ;
|
|
1
|
+
{"version":3,"file":"automine_sequencer.d.ts","sourceRoot":"","sources":["../../../src/sequencer/automine/automine_sequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -364,10 +364,7 @@ import { InsufficientValidTxsError } from '@aztec/stdlib/interfaces/server';
|
|
|
364
364
|
if (slotBoundaryTs > pendingBlockTs) {
|
|
365
365
|
await this.deps.ethCheatCodes.setNextBlockTimestamp(slotBoundaryTs);
|
|
366
366
|
}
|
|
367
|
-
const
|
|
368
|
-
this.deps.l2BlockSource.getL2Tips(),
|
|
369
|
-
this.deps.l2BlockSource.getProposedCheckpointData()
|
|
370
|
-
]);
|
|
367
|
+
const { tips, proposedCheckpoint } = await this.deps.l2BlockSource.getL2Frontier();
|
|
371
368
|
const syncedToBlockNumber = tips.proposed.number;
|
|
372
369
|
// Ensure world state has processed the archiver's tip before forking. Without this,
|
|
373
370
|
// world state may still be at the previous block (since it syncs asynchronously from
|
|
@@ -9,7 +9,7 @@ import type { DateProvider } from '@aztec/foundation/timer';
|
|
|
9
9
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
10
10
|
import type { P2P } from '@aztec/p2p';
|
|
11
11
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
12
|
-
import type
|
|
12
|
+
import { type BlockData, type L2BlockSink, type L2BlockSource, type ProposedCheckpointSink, type ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
13
13
|
import { type Checkpoint, type ProposedCheckpointData } from '@aztec/stdlib/checkpoint';
|
|
14
14
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
15
15
|
import { type ResolvedSequencerConfig, type SequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
@@ -323,4 +323,4 @@ type SequencerSyncCheckResult = {
|
|
|
323
323
|
syncedL2Slot: SlotNumber;
|
|
324
324
|
pendingChainValidationStatus: ValidateCheckpointResult;
|
|
325
325
|
};
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQW1DLE1BQU0sb0JBQW9CLENBQUM7QUFDdEYsT0FBTyxFQUFvQixLQUFLLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFDTCxLQUFLLFNBQVMsRUFFZCxLQUFLLFdBQVcsRUFDaEIsS0FBSyxhQUFhLEVBQ2xCLEtBQUssc0JBQXNCLEVBQzNCLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLEtBQUssVUFBVSxFQUNmLEtBQUssc0JBQXNCLEVBRTVCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFP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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAmC,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAEzG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -379,6 +379,7 @@ import { merge, omit, pick } from '@aztec/foundation/collection';
|
|
|
379
379
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
380
380
|
import { createLogger } from '@aztec/foundation/log';
|
|
381
381
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
382
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
382
383
|
import { buildCheckpointSimulationOverridesPlan } from '@aztec/stdlib/checkpoint';
|
|
383
384
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
384
385
|
import { MIN_PER_BLOCK_ALLOCATION_MULTIPLIER, MIN_PER_BLOCK_DA_ALLOCATION_MULTIPLIER, computeNetworkTxGasLimits } from '@aztec/stdlib/gas';
|
|
@@ -1086,19 +1087,19 @@ _dec = trackSpan('Sequencer.work'), _dec1 = trackSpan('Sequencer.prepareCheckpoi
|
|
|
1086
1087
|
number: syncSummary.latestBlockNumber,
|
|
1087
1088
|
hash: syncSummary.latestBlockHash
|
|
1088
1089
|
})),
|
|
1089
|
-
this.l2BlockSource.
|
|
1090
|
-
proposed: t.proposed,
|
|
1091
|
-
checkpointed: t.checkpointed
|
|
1092
|
-
})),
|
|
1090
|
+
this.l2BlockSource.getL2Frontier(),
|
|
1093
1091
|
this.p2pClient.getStatus().then((p2p)=>p2p.syncedToL2Block),
|
|
1094
1092
|
this.l1ToL2MessageSource.getL2Tips().then((t)=>({
|
|
1095
1093
|
proposed: t.proposed,
|
|
1096
1094
|
checkpointed: t.checkpointed
|
|
1097
|
-
}))
|
|
1098
|
-
this.l2BlockSource.getPendingChainValidationStatus(),
|
|
1099
|
-
this.l2BlockSource.getProposedCheckpointData()
|
|
1095
|
+
}))
|
|
1100
1096
|
]);
|
|
1101
|
-
const [worldState,
|
|
1097
|
+
const [worldState, frontier, p2p, l1ToL2MessageSourceTips] = syncedBlocks;
|
|
1098
|
+
const { proposedCheckpoint: proposedCheckpointData, pendingChainValidationStatus } = frontier;
|
|
1099
|
+
const l2Tips = {
|
|
1100
|
+
proposed: frontier.tips.proposed,
|
|
1101
|
+
checkpointed: frontier.tips.checkpointed
|
|
1102
|
+
};
|
|
1102
1103
|
const result = worldState.hash === l2Tips.proposed.hash && p2p.hash === l2Tips.proposed.hash && l1ToL2MessageSourceTips.proposed.hash === l2Tips.proposed.hash && l1ToL2MessageSourceTips.checkpointed.block.hash === l2Tips.checkpointed.block.hash && l1ToL2MessageSourceTips.checkpointed.checkpoint.hash === l2Tips.checkpointed.checkpoint.hash;
|
|
1103
1104
|
if (!result) {
|
|
1104
1105
|
this.log.debug(`Sequencer sync check failed`, {
|
|
@@ -1109,9 +1110,13 @@ _dec = trackSpan('Sequencer.work'), _dec1 = trackSpan('Sequencer.prepareCheckpoi
|
|
|
1109
1110
|
});
|
|
1110
1111
|
return undefined;
|
|
1111
1112
|
}
|
|
1113
|
+
// Look the tip block up by its hash rather than its number: the tips come from the cached snapshot, so
|
|
1114
|
+
// after a prune-and-replace commits (but before the cache refreshes) a by-number read could return the
|
|
1115
|
+
// replacement block while every hash check above still described the pruned one. A miss just fails the
|
|
1116
|
+
// sync check and retries.
|
|
1112
1117
|
const blockNumber = worldState.number;
|
|
1113
1118
|
const blockData = await this.l2BlockSource.getBlockData({
|
|
1114
|
-
|
|
1119
|
+
hash: BlockHash.fromString(l2Tips.proposed.hash)
|
|
1115
1120
|
});
|
|
1116
1121
|
if (!blockData) {
|
|
1117
1122
|
this.log.warn(`Sequencer sync check failed: failed to get L2 block data ${blockNumber} from the archiver`, {
|
|
@@ -1128,9 +1133,9 @@ _dec = trackSpan('Sequencer.work'), _dec1 = trackSpan('Sequencer.prepareCheckpoi
|
|
|
1128
1133
|
// matching proposed checkpoint (e.g. it crashed before assembling it). Building on this orphan block
|
|
1129
1134
|
// would fork the chain off a tip no other node can follow. The archiver prunes these orphan blocks
|
|
1130
1135
|
// once their build slot ends; this guard is the correctness barrier during the grace window before.
|
|
1131
|
-
//
|
|
1132
|
-
// the
|
|
1133
|
-
//
|
|
1136
|
+
// The L2 frontier carries the leading proposed checkpoint payload (a proposed entry is only stored
|
|
1137
|
+
// beyond the confirmed frontier and is deleted on confirmation) alongside the tips it is compared
|
|
1138
|
+
// against, read atomically, so the two cannot describe different chain states.
|
|
1134
1139
|
if (blockData.checkpointNumber > l2Tips.checkpointed.checkpoint.number && proposedCheckpointData?.checkpointNumber !== blockData.checkpointNumber) {
|
|
1135
1140
|
const logCtx = {
|
|
1136
1141
|
blockCheckpointNumber: blockData.checkpointNumber,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "5.3.0-nightly.
|
|
3
|
+
"version": "5.3.0-nightly.20260910",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -27,37 +27,37 @@
|
|
|
27
27
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@aztec/aztec.js": "5.3.0-nightly.
|
|
31
|
-
"@aztec/bb-prover": "5.3.0-nightly.
|
|
32
|
-
"@aztec/blob-client": "5.3.0-nightly.
|
|
33
|
-
"@aztec/blob-lib": "5.3.0-nightly.
|
|
34
|
-
"@aztec/constants": "5.3.0-nightly.
|
|
35
|
-
"@aztec/epoch-cache": "5.3.0-nightly.
|
|
36
|
-
"@aztec/ethereum": "5.3.0-nightly.
|
|
37
|
-
"@aztec/foundation": "5.3.0-nightly.
|
|
38
|
-
"@aztec/l1-artifacts": "5.3.0-nightly.
|
|
39
|
-
"@aztec/node-keystore": "5.3.0-nightly.
|
|
40
|
-
"@aztec/noir-acvm_js": "5.3.0-nightly.
|
|
41
|
-
"@aztec/noir-contracts.js": "5.3.0-nightly.
|
|
42
|
-
"@aztec/noir-protocol-circuits-types": "5.3.0-nightly.
|
|
43
|
-
"@aztec/noir-types": "5.3.0-nightly.
|
|
44
|
-
"@aztec/p2p": "5.3.0-nightly.
|
|
45
|
-
"@aztec/protocol-contracts": "5.3.0-nightly.
|
|
46
|
-
"@aztec/prover-client": "5.3.0-nightly.
|
|
47
|
-
"@aztec/simulator": "5.3.0-nightly.
|
|
48
|
-
"@aztec/slasher": "5.3.0-nightly.
|
|
49
|
-
"@aztec/stdlib": "5.3.0-nightly.
|
|
50
|
-
"@aztec/telemetry-client": "5.3.0-nightly.
|
|
51
|
-
"@aztec/validator-client": "5.3.0-nightly.
|
|
52
|
-
"@aztec/validator-ha-signer": "5.3.0-nightly.
|
|
53
|
-
"@aztec/world-state": "5.3.0-nightly.
|
|
30
|
+
"@aztec/aztec.js": "5.3.0-nightly.20260910",
|
|
31
|
+
"@aztec/bb-prover": "5.3.0-nightly.20260910",
|
|
32
|
+
"@aztec/blob-client": "5.3.0-nightly.20260910",
|
|
33
|
+
"@aztec/blob-lib": "5.3.0-nightly.20260910",
|
|
34
|
+
"@aztec/constants": "5.3.0-nightly.20260910",
|
|
35
|
+
"@aztec/epoch-cache": "5.3.0-nightly.20260910",
|
|
36
|
+
"@aztec/ethereum": "5.3.0-nightly.20260910",
|
|
37
|
+
"@aztec/foundation": "5.3.0-nightly.20260910",
|
|
38
|
+
"@aztec/l1-artifacts": "5.3.0-nightly.20260910",
|
|
39
|
+
"@aztec/node-keystore": "5.3.0-nightly.20260910",
|
|
40
|
+
"@aztec/noir-acvm_js": "5.3.0-nightly.20260910",
|
|
41
|
+
"@aztec/noir-contracts.js": "5.3.0-nightly.20260910",
|
|
42
|
+
"@aztec/noir-protocol-circuits-types": "5.3.0-nightly.20260910",
|
|
43
|
+
"@aztec/noir-types": "5.3.0-nightly.20260910",
|
|
44
|
+
"@aztec/p2p": "5.3.0-nightly.20260910",
|
|
45
|
+
"@aztec/protocol-contracts": "5.3.0-nightly.20260910",
|
|
46
|
+
"@aztec/prover-client": "5.3.0-nightly.20260910",
|
|
47
|
+
"@aztec/simulator": "5.3.0-nightly.20260910",
|
|
48
|
+
"@aztec/slasher": "5.3.0-nightly.20260910",
|
|
49
|
+
"@aztec/stdlib": "5.3.0-nightly.20260910",
|
|
50
|
+
"@aztec/telemetry-client": "5.3.0-nightly.20260910",
|
|
51
|
+
"@aztec/validator-client": "5.3.0-nightly.20260910",
|
|
52
|
+
"@aztec/validator-ha-signer": "5.3.0-nightly.20260910",
|
|
53
|
+
"@aztec/world-state": "5.3.0-nightly.20260910",
|
|
54
54
|
"lodash.chunk": "^4.2.0",
|
|
55
55
|
"tslib": "^2.4.0",
|
|
56
56
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@aztec/archiver": "5.3.0-nightly.
|
|
60
|
-
"@aztec/kv-store": "5.3.0-nightly.
|
|
59
|
+
"@aztec/archiver": "5.3.0-nightly.20260910",
|
|
60
|
+
"@aztec/kv-store": "5.3.0-nightly.20260910",
|
|
61
61
|
"@electric-sql/pglite": "^0.3.14",
|
|
62
62
|
"@jest/globals": "^30.0.0",
|
|
63
63
|
"@types/jest": "^30.0.0",
|
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
computeManaMinFee,
|
|
13
13
|
} from '@aztec/stdlib/gas';
|
|
14
14
|
|
|
15
|
-
/**
|
|
16
|
-
type FeeOracleState = {
|
|
15
|
+
/** Rollup state a set of fee predictions is computed from, read at a single L1 block. */
|
|
16
|
+
export type FeeOracleState = {
|
|
17
17
|
lastSlot: SlotNumber;
|
|
18
18
|
excessMana: bigint;
|
|
19
19
|
ethPerFeeAsset: bigint;
|
|
@@ -31,8 +31,6 @@ type FeeOracleState = {
|
|
|
31
31
|
* are guaranteed stable.
|
|
32
32
|
*/
|
|
33
33
|
export class FeePredictor {
|
|
34
|
-
private cachedState: FeeOracleState | undefined;
|
|
35
|
-
|
|
36
34
|
private readonly slotDuration: number;
|
|
37
35
|
private readonly l1GenesisTime: bigint;
|
|
38
36
|
private readonly ethereumSlotDuration: number;
|
|
@@ -47,30 +45,12 @@ export class FeePredictor {
|
|
|
47
45
|
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
/** Returns predicted min fees for each slot in the prediction window, from the cached state. */
|
|
51
|
-
getPredictedMinFees(manaUsage: ManaUsageEstimate): GasFees[] {
|
|
52
|
-
const state = this.getState();
|
|
53
|
-
if (state === undefined) {
|
|
54
|
-
throw new Error('FeePredictor.refreshState() must be called before getPredictedMinFees()');
|
|
55
|
-
}
|
|
56
|
-
return this.computePredictions(state, manaUsage);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** Returns whatever rollup state is currently cached, or undefined if refreshState() has never been called. */
|
|
60
|
-
getState(): FeeOracleState | undefined {
|
|
61
|
-
return this.cachedState;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
48
|
/**
|
|
65
|
-
*
|
|
49
|
+
* Reads the rollup state the predictions are derived from, pinned to the given L1 block. The state is
|
|
50
|
+
* returned rather than cached: its owner stores it alongside the L1 block it was read at, so a caller that
|
|
51
|
+
* asks for fees at a specific L1 block is answered from the state read at that block.
|
|
66
52
|
*/
|
|
67
|
-
async
|
|
68
|
-
const state = await this.fetchState(blockNumber);
|
|
69
|
-
this.cachedState = state;
|
|
70
|
-
return state;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private async fetchState(blockNumber: bigint): Promise<FeeOracleState> {
|
|
53
|
+
async computeState(blockNumber: bigint): Promise<FeeOracleState> {
|
|
74
54
|
// Pin all non-constant queries to this L1 block number for a consistent snapshot.
|
|
75
55
|
const opts = { blockNumber };
|
|
76
56
|
|
|
@@ -119,8 +99,8 @@ export class FeePredictor {
|
|
|
119
99
|
};
|
|
120
100
|
}
|
|
121
101
|
|
|
122
|
-
/** Computes per-slot fee predictions given
|
|
123
|
-
|
|
102
|
+
/** Computes per-slot fee predictions given rollup state and a mana usage assumption. */
|
|
103
|
+
computePredictions(state: FeeOracleState, manaUsage: ManaUsageEstimate): GasFees[] {
|
|
124
104
|
const assumedManaUsed = this.getAssumedManaUsed(state, manaUsage);
|
|
125
105
|
|
|
126
106
|
const result: GasFees[] = [];
|
|
@@ -1,26 +1,55 @@
|
|
|
1
1
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
2
2
|
import type { ViemPublicClient } from '@aztec/ethereum/types';
|
|
3
3
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
4
5
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
5
7
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
6
|
-
import type
|
|
8
|
+
import { type DateProvider, Timer } from '@aztec/foundation/timer';
|
|
9
|
+
import type { L1SyncPoint, L2BlockSource } from '@aztec/stdlib/block';
|
|
7
10
|
import { getNextL1SlotTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
8
11
|
import { GasFees, ManaUsageEstimate } from '@aztec/stdlib/gas';
|
|
9
|
-
import type { FeeProvider } from '@aztec/stdlib/tx';
|
|
12
|
+
import type { FeeAsOf, FeeProvider } from '@aztec/stdlib/tx';
|
|
10
13
|
|
|
11
|
-
import { FeePredictor } from './fee_predictor.js';
|
|
14
|
+
import { type FeeOracleState, FeePredictor } from './fee_predictor.js';
|
|
12
15
|
import type { GlobalVariableBuilderConfig } from './global_builder.js';
|
|
13
16
|
|
|
14
|
-
/** Default interval for the background
|
|
17
|
+
/** Default interval for the background refresh loop, well below L1's block time. */
|
|
15
18
|
const DEFAULT_REFRESH_POLLING_INTERVAL_MS = 1000;
|
|
16
19
|
|
|
20
|
+
/** How many recent L1 views are retained, so a caller that planned a block or two ago is still answerable. */
|
|
21
|
+
const RING_SIZE = 4;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Refresh passes a tagged request waits through before settling for the closest view. The first pass it joins
|
|
25
|
+
* may have started from an older sync point than the one it is tagged with; the second is its own.
|
|
26
|
+
*/
|
|
27
|
+
const MAX_REFRESH_ATTEMPTS = 2;
|
|
28
|
+
|
|
29
|
+
/** Fees as read at one L1 block. Every read that produced it was pinned to `blockNumber`. */
|
|
30
|
+
type FeeEntry = L1SyncPoint & {
|
|
31
|
+
currentMinFees: GasFees;
|
|
32
|
+
predictorState: FeeOracleState;
|
|
33
|
+
};
|
|
34
|
+
|
|
17
35
|
/**
|
|
18
|
-
* Provides current and predicted fee information based on on-chain state
|
|
36
|
+
* Provides current and predicted fee information based on on-chain state, refreshed from the archiver's L1 sync
|
|
37
|
+
* point rather than from a poll of its own.
|
|
38
|
+
*
|
|
39
|
+
* Following the archiver means the fees and the block plans that consume them describe the same L1 block: two
|
|
40
|
+
* independent L1 pollers would otherwise disagree for up to a poll interval after a checkpoint lands, and the
|
|
41
|
+
* mana min fee is a step function of the slot, so that disagreement shows up as a wallet quote the node's own
|
|
42
|
+
* public simulation then rejects.
|
|
43
|
+
*
|
|
44
|
+
* Every L1 read in a refresh is pinned to the sync point's block number, and the resulting entry is kept in a
|
|
45
|
+
* small ring so a caller that planned from a slightly older archiver snapshot can be answered for that same
|
|
46
|
+
* block via {@link FeeAsOf}.
|
|
19
47
|
*/
|
|
20
48
|
export class FeeProviderImpl implements FeeProvider {
|
|
21
|
-
|
|
22
|
-
private
|
|
49
|
+
/** Recent L1 views, newest first. */
|
|
50
|
+
private entries: FeeEntry[] = [];
|
|
23
51
|
private refreshLoop: RunningPromise | undefined;
|
|
52
|
+
private inFlightRefresh: Promise<void> | undefined;
|
|
24
53
|
|
|
25
54
|
private readonly rollupContract: RollupContract;
|
|
26
55
|
private readonly feePredictor: FeePredictor;
|
|
@@ -32,6 +61,7 @@ export class FeeProviderImpl implements FeeProvider {
|
|
|
32
61
|
private readonly dateProvider: DateProvider,
|
|
33
62
|
private readonly publicClient: ViemPublicClient,
|
|
34
63
|
config: GlobalVariableBuilderConfig,
|
|
64
|
+
private readonly syncPointSource: Pick<L2BlockSource, 'getL1SyncPoint'>,
|
|
35
65
|
) {
|
|
36
66
|
this.ethereumSlotDuration = config.ethereumSlotDuration;
|
|
37
67
|
this.l1GenesisTime = config.l1GenesisTime;
|
|
@@ -45,43 +75,148 @@ export class FeeProviderImpl implements FeeProvider {
|
|
|
45
75
|
}
|
|
46
76
|
|
|
47
77
|
public async start(pollingIntervalMs = DEFAULT_REFRESH_POLLING_INTERVAL_MS): Promise<void> {
|
|
48
|
-
await this.
|
|
49
|
-
this.refreshLoop = new RunningPromise(() => this.
|
|
78
|
+
await this.refresh();
|
|
79
|
+
this.refreshLoop = new RunningPromise(() => this.refresh(), this.log, pollingIntervalMs);
|
|
50
80
|
this.refreshLoop.start();
|
|
51
81
|
}
|
|
52
82
|
|
|
53
83
|
public async stop(): Promise<void> {
|
|
54
84
|
await this.refreshLoop?.stop();
|
|
85
|
+
await this.inFlightRefresh?.catch(() => {});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Refreshes the fee entries against the archiver's current L1 sync point, unless the newest entry already
|
|
90
|
+
* describes it. Single-flight: a call made while a refresh is running joins that refresh instead of
|
|
91
|
+
* starting a second one, so the loop and any waiting requests share one round of L1 reads.
|
|
92
|
+
*/
|
|
93
|
+
public refresh(): Promise<void> {
|
|
94
|
+
return (this.inFlightRefresh ??= this.doRefresh().finally(() => {
|
|
95
|
+
this.inFlightRefresh = undefined;
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public async getCurrentMinFees(asOf?: FeeAsOf): Promise<GasFees> {
|
|
100
|
+
const entry = await this.getEntry(asOf);
|
|
101
|
+
return entry?.currentMinFees ?? new GasFees(0, 0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public async getPredictedMinFees(manaUsage?: ManaUsageEstimate, asOf?: FeeAsOf): Promise<GasFees[]> {
|
|
105
|
+
const entry = await this.getEntry(asOf);
|
|
106
|
+
if (entry === undefined) {
|
|
107
|
+
throw new Error('FeeProviderImpl.start() must be called before getPredictedMinFees()');
|
|
108
|
+
}
|
|
109
|
+
const predictions = this.feePredictor.computePredictions(
|
|
110
|
+
entry.predictorState,
|
|
111
|
+
manaUsage ?? ManaUsageEstimate.Target,
|
|
112
|
+
);
|
|
113
|
+
return [entry.currentMinFees, ...predictions];
|
|
55
114
|
}
|
|
56
115
|
|
|
57
116
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
117
|
+
* Picks the entry to serve: the newest one when untagged, otherwise the one for the tagged L1 block. A tag
|
|
118
|
+
* ahead of every entry waits for the shared refresh, and once more for its own if the one it joined was
|
|
119
|
+
* already under way from an older sync point, all within `maxWaitMs` when set; a tag behind the ring gets the
|
|
120
|
+
* oldest entry. A tagged miss never throws: the caller asked for a specific L1 view as a consistency
|
|
121
|
+
* preference, not as a precondition, so it is answered with the closest view available.
|
|
60
122
|
*/
|
|
61
|
-
private async
|
|
62
|
-
|
|
63
|
-
|
|
123
|
+
private async getEntry(asOf?: FeeAsOf): Promise<FeeEntry | undefined> {
|
|
124
|
+
if (asOf === undefined) {
|
|
125
|
+
return this.entries[0];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const findTagged = () => this.entries.find(entry => entry.blockNumber === asOf.blockNumber);
|
|
129
|
+
const timer = new Timer();
|
|
130
|
+
for (let attempt = 0; attempt < MAX_REFRESH_ATTEMPTS; attempt++) {
|
|
131
|
+
const hit = findTagged();
|
|
132
|
+
if (hit) {
|
|
133
|
+
return hit;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const oldest = this.entries.at(-1);
|
|
137
|
+
if (oldest !== undefined && asOf.blockNumber < oldest.blockNumber) {
|
|
138
|
+
this.log.debug(`Requested fees for L1 block ${asOf.blockNumber} predate the retained views`, {
|
|
139
|
+
requestedBlockNumber: asOf.blockNumber,
|
|
140
|
+
servedBlockNumber: oldest.blockNumber,
|
|
141
|
+
});
|
|
142
|
+
return oldest;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const remainingMs = asOf.maxWaitMs === undefined ? undefined : asOf.maxWaitMs - timer.ms();
|
|
146
|
+
if (remainingMs !== undefined && remainingMs <= 0) {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
await this.awaitRefresh(remainingMs);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const refreshed = findTagged();
|
|
153
|
+
if (!refreshed) {
|
|
154
|
+
this.log.debug(`No fees available for L1 block ${asOf.blockNumber} after refreshing`, {
|
|
155
|
+
requestedBlockNumber: asOf.blockNumber,
|
|
156
|
+
servedBlockNumber: this.entries[0]?.blockNumber,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return refreshed ?? this.entries[0];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Waits for the shared refresh, giving up after `maxWaitMs` if set. Never rejects. */
|
|
163
|
+
private async awaitRefresh(maxWaitMs: number | undefined): Promise<void> {
|
|
164
|
+
const refresh = this.refresh().catch(err =>
|
|
165
|
+
this.log.warn(`Failed to refresh fees while serving a request`, { err }),
|
|
166
|
+
);
|
|
167
|
+
if (maxWaitMs === undefined) {
|
|
168
|
+
return refresh;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const cap = promiseWithResolvers<void>();
|
|
172
|
+
const timer = setTimeout(cap.resolve, maxWaitMs);
|
|
173
|
+
await Promise.race([refresh, cap.promise]).finally(() => clearTimeout(timer));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private async doRefresh(): Promise<void> {
|
|
177
|
+
const syncPoint = await this.resolveSyncPoint();
|
|
178
|
+
if (this.entries[0]?.blockHash.equals(syncPoint.blockHash)) {
|
|
64
179
|
return;
|
|
65
180
|
}
|
|
66
181
|
|
|
67
|
-
const
|
|
68
|
-
await
|
|
69
|
-
|
|
70
|
-
|
|
182
|
+
const { blockNumber } = syncPoint;
|
|
183
|
+
const [currentMinFees, predictorState] = await Promise.all([
|
|
184
|
+
this.computeCurrentMinFees(blockNumber),
|
|
185
|
+
this.feePredictor.computeState(blockNumber),
|
|
186
|
+
]);
|
|
187
|
+
|
|
188
|
+
this.entries = [{ ...syncPoint, currentMinFees, predictorState }, ...this.entries].slice(0, RING_SIZE);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The L1 block to price at: the archiver's sync point once it has run a pass, otherwise L1's head. The
|
|
193
|
+
* fallback only applies before the archiver's first pass, so a node can answer fee queries while it is still
|
|
194
|
+
* catching up rather than blocking startup on the archiver.
|
|
195
|
+
*/
|
|
196
|
+
private async resolveSyncPoint(): Promise<L1SyncPoint> {
|
|
197
|
+
const syncPoint = await this.syncPointSource.getL1SyncPoint();
|
|
198
|
+
if (syncPoint !== undefined) {
|
|
199
|
+
return syncPoint;
|
|
200
|
+
}
|
|
201
|
+
const block = await this.publicClient.getBlock({ blockTag: 'latest' });
|
|
202
|
+
return { blockNumber: block.number, blockHash: Buffer32.fromString(block.hash) };
|
|
71
203
|
}
|
|
72
204
|
|
|
73
205
|
/**
|
|
74
206
|
* Computes the "current" min fees, e.g., the price that you currently should pay to get include in the next block
|
|
207
|
+
* @param blockNumber - L1 block every read is pinned to.
|
|
75
208
|
* @returns Min fees for the next block
|
|
76
209
|
*/
|
|
77
|
-
private async computeCurrentMinFees(): Promise<GasFees> {
|
|
210
|
+
private async computeCurrentMinFees(blockNumber: bigint): Promise<GasFees> {
|
|
78
211
|
// Since this might be called in the middle of a slot where a block might have been published,
|
|
79
212
|
// we need to fetch the last block written, and estimate the earliest timestamp for the next block.
|
|
80
213
|
// The timestamp of that last block will act as a lower bound for the next block.
|
|
214
|
+
const options = { blockNumber };
|
|
81
215
|
|
|
82
|
-
const lastCheckpoint = await this.rollupContract.getPendingCheckpoint();
|
|
216
|
+
const lastCheckpoint = await this.rollupContract.getPendingCheckpoint(options);
|
|
83
217
|
const earliestTimestamp = await this.rollupContract.getTimestampForSlot(
|
|
84
218
|
SlotNumber.fromBigInt(BigInt(lastCheckpoint.slotNumber) + 1n),
|
|
219
|
+
options,
|
|
85
220
|
);
|
|
86
221
|
const nextEthTimestamp = getNextL1SlotTimestamp(this.dateProvider.nowInSeconds(), {
|
|
87
222
|
l1GenesisTime: this.l1GenesisTime,
|
|
@@ -89,16 +224,6 @@ export class FeeProviderImpl implements FeeProvider {
|
|
|
89
224
|
});
|
|
90
225
|
const timestamp = earliestTimestamp > nextEthTimestamp ? earliestTimestamp : nextEthTimestamp;
|
|
91
226
|
|
|
92
|
-
return new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public getCurrentMinFees(): Promise<GasFees> {
|
|
96
|
-
return Promise.resolve(this.currentMinFees);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
public getPredictedMinFees(manaUsage?: ManaUsageEstimate): Promise<GasFees[]> {
|
|
100
|
-
const currentMinFees = this.currentMinFees;
|
|
101
|
-
const predictedMinFees = this.feePredictor.getPredictedMinFees(manaUsage ?? ManaUsageEstimate.Target);
|
|
102
|
-
return Promise.resolve([currentMinFees, ...predictedMinFees]);
|
|
227
|
+
return new GasFees(0, await this.rollupContract.getManaMinFeeAt(timestamp, true, options));
|
|
103
228
|
}
|
|
104
229
|
}
|
|
@@ -46,12 +46,17 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
46
46
|
this.rollupContract = new RollupContract(this.publicClient, config.rollupAddress);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Builds global variables that are constant throughout a checkpoint.
|
|
51
|
+
* @param options - Optional L1 block number to pin the fee read to, so the fee describes the same L1 state
|
|
52
|
+
* the caller planned the block from.
|
|
53
|
+
*/
|
|
50
54
|
public async buildCheckpointGlobalVariables(
|
|
51
55
|
coinbase: EthAddress,
|
|
52
56
|
feeRecipient: AztecAddress,
|
|
53
57
|
slotNumber: SlotNumber,
|
|
54
58
|
simulationOverridesPlan?: SimulationOverridesPlan,
|
|
59
|
+
options?: { blockNumber?: bigint },
|
|
55
60
|
): Promise<CheckpointGlobalVariables> {
|
|
56
61
|
const { chainId, version } = this;
|
|
57
62
|
|
|
@@ -61,7 +66,10 @@ export class GlobalVariableBuilder implements GlobalVariableBuilderInterface {
|
|
|
61
66
|
});
|
|
62
67
|
|
|
63
68
|
const stateOverride = await buildSimulationOverridesStateOverride(this.rollupContract, simulationOverridesPlan);
|
|
64
|
-
const gasFees = new GasFees(
|
|
69
|
+
const gasFees = new GasFees(
|
|
70
|
+
0,
|
|
71
|
+
await this.rollupContract.getManaMinFeeAt(timestamp, true, { stateOverride, ...options }),
|
|
72
|
+
);
|
|
65
73
|
|
|
66
74
|
return { chainId, version, slotNumber, timestamp, coinbase, feeRecipient, gasFees };
|
|
67
75
|
}
|
|
@@ -416,10 +416,7 @@ export class AutomineSequencer {
|
|
|
416
416
|
await this.deps.ethCheatCodes.setNextBlockTimestamp(slotBoundaryTs);
|
|
417
417
|
}
|
|
418
418
|
|
|
419
|
-
const
|
|
420
|
-
this.deps.l2BlockSource.getL2Tips(),
|
|
421
|
-
this.deps.l2BlockSource.getProposedCheckpointData(),
|
|
422
|
-
]);
|
|
419
|
+
const { tips, proposedCheckpoint } = await this.deps.l2BlockSource.getL2Frontier();
|
|
423
420
|
const syncedToBlockNumber = tips.proposed.number;
|
|
424
421
|
|
|
425
422
|
// Ensure world state has processed the archiver's tip before forking. Without this,
|
|
@@ -11,12 +11,13 @@ import type { DateProvider } from '@aztec/foundation/timer';
|
|
|
11
11
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
12
12
|
import type { P2P } from '@aztec/p2p';
|
|
13
13
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
14
|
-
import
|
|
15
|
-
BlockData,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
import {
|
|
15
|
+
type BlockData,
|
|
16
|
+
BlockHash,
|
|
17
|
+
type L2BlockSink,
|
|
18
|
+
type L2BlockSource,
|
|
19
|
+
type ProposedCheckpointSink,
|
|
20
|
+
type ValidateCheckpointResult,
|
|
20
21
|
} from '@aztec/stdlib/block';
|
|
21
22
|
import {
|
|
22
23
|
type Checkpoint,
|
|
@@ -887,15 +888,14 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
887
888
|
number: syncSummary.latestBlockNumber,
|
|
888
889
|
hash: syncSummary.latestBlockHash,
|
|
889
890
|
})),
|
|
890
|
-
this.l2BlockSource.
|
|
891
|
+
this.l2BlockSource.getL2Frontier(),
|
|
891
892
|
this.p2pClient.getStatus().then(p2p => p2p.syncedToL2Block),
|
|
892
893
|
this.l1ToL2MessageSource.getL2Tips().then(t => ({ proposed: t.proposed, checkpointed: t.checkpointed })),
|
|
893
|
-
this.l2BlockSource.getPendingChainValidationStatus(),
|
|
894
|
-
this.l2BlockSource.getProposedCheckpointData(),
|
|
895
894
|
] as const);
|
|
896
895
|
|
|
897
|
-
const [worldState,
|
|
898
|
-
|
|
896
|
+
const [worldState, frontier, p2p, l1ToL2MessageSourceTips] = syncedBlocks;
|
|
897
|
+
const { proposedCheckpoint: proposedCheckpointData, pendingChainValidationStatus } = frontier;
|
|
898
|
+
const l2Tips = { proposed: frontier.tips.proposed, checkpointed: frontier.tips.checkpointed };
|
|
899
899
|
|
|
900
900
|
const result =
|
|
901
901
|
worldState.hash === l2Tips.proposed.hash &&
|
|
@@ -914,8 +914,12 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
914
914
|
return undefined;
|
|
915
915
|
}
|
|
916
916
|
|
|
917
|
+
// Look the tip block up by its hash rather than its number: the tips come from the cached snapshot, so
|
|
918
|
+
// after a prune-and-replace commits (but before the cache refreshes) a by-number read could return the
|
|
919
|
+
// replacement block while every hash check above still described the pruned one. A miss just fails the
|
|
920
|
+
// sync check and retries.
|
|
917
921
|
const blockNumber = worldState.number;
|
|
918
|
-
const blockData = await this.l2BlockSource.getBlockData({
|
|
922
|
+
const blockData = await this.l2BlockSource.getBlockData({ hash: BlockHash.fromString(l2Tips.proposed.hash) });
|
|
919
923
|
if (!blockData) {
|
|
920
924
|
this.log.warn(`Sequencer sync check failed: failed to get L2 block data ${blockNumber} from the archiver`, {
|
|
921
925
|
blockNumber,
|
|
@@ -932,9 +936,9 @@ export class Sequencer extends (EventEmitter as new () => TypedEventEmitter<Sequ
|
|
|
932
936
|
// matching proposed checkpoint (e.g. it crashed before assembling it). Building on this orphan block
|
|
933
937
|
// would fork the chain off a tip no other node can follow. The archiver prunes these orphan blocks
|
|
934
938
|
// once their build slot ends; this guard is the correctness barrier during the grace window before.
|
|
935
|
-
//
|
|
936
|
-
// the
|
|
937
|
-
//
|
|
939
|
+
// The L2 frontier carries the leading proposed checkpoint payload (a proposed entry is only stored
|
|
940
|
+
// beyond the confirmed frontier and is deleted on confirmation) alongside the tips it is compared
|
|
941
|
+
// against, read atomically, so the two cannot describe different chain states.
|
|
938
942
|
if (
|
|
939
943
|
blockData.checkpointNumber > l2Tips.checkpointed.checkpoint.number &&
|
|
940
944
|
proposedCheckpointData?.checkpointNumber !== blockData.checkpointNumber
|