@aztec/sequencer-client 5.3.0-nightly.20260909 → 5.3.0-nightly.20260911

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.
@@ -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
- /** Cached rollup state for fee prediction. Refreshed once per L1 block. */
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
- * Fetches and caches rollup state for the given L1 block.
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
- refreshState(blockNumber: bigint): Promise<FeeOracleState>;
42
- private fetchState;
43
- /** Computes per-slot fee predictions given cached state and a mana usage assumption. */
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
- export {};
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,2EAA2E;AAC3E,KAAK,cAAc,GAAG;IACpB,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;IAQrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,WAAW,CAA6B;IAEhD,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,gGAAgG;IAChG,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAM3D;IAED,+GAA+G;IAC/G,QAAQ,IAAI,cAAc,GAAG,SAAS,CAErC;IAED;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAI/D;YAEa,UAAU;IAiDxB,wFAAwF;IACxF,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;CAmBvB"}
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
- * Fetches and caches rollup state for the given L1 block.
36
- */ async refreshState(blockNumber) {
37
- const state = await this.fetchState(blockNumber);
38
- this.cachedState = state;
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 cached state and a mana usage assumption. */ computePredictions(state, manaUsage) {
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 { DateProvider } from '@aztec/foundation/timer';
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 currentMinFees;
13
- private currentL1BlockNumber;
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
- private refreshFromL1;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlX3Byb3ZpZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmFsX3ZhcmlhYmxlX2J1aWxkZXIvZmVlX3Byb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJOUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3BELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLdkU7O0dBRUc7QUFDSCxxQkFBYSxlQUFnQixZQUFXLFdBQVc7SUFZL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQVovQixPQUFPLENBQUMsY0FBYyxDQUFxQjtJQUMzQyxPQUFPLENBQUMsb0JBQW9CLENBQWlDO0lBQzdELE9BQU8sQ0FBQyxXQUFXLENBQTZCO0lBRWhELE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFpQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBZTtJQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFTO0lBQzlDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFTO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUF5RDtJQUU3RSxZQUNtQixZQUFZLEVBQUUsWUFBWSxFQUMxQixZQUFZLEVBQUUsZ0JBQWdCLEVBQy9DLE1BQU0sRUFBRSwyQkFBMkIsRUFXcEM7SUFFWSxLQUFLLENBQUMsaUJBQWlCLFNBQXNDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUl6RjtJQUVZLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBRWpDO1lBTWEsYUFBYTtZQWdCYixxQkFBcUI7SUFrQjVCLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFM0M7SUFFTSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FJNUU7Q0FDRiJ9
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;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAKvE;;GAEG;AACH,qBAAa,eAAgB,YAAW,WAAW;IAY/C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAZ/B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,oBAAoB,CAAiC;IAC7D,OAAO,CAAC,WAAW,CAA6B;IAEhD,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,EAWpC;IAEY,KAAK,CAAC,iBAAiB,SAAsC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzF;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;YAMa,aAAa;YAgBb,qBAAqB;IAkB5B,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE3C;IAEM,mBAAmB,CAAC,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAI5E;CACF"}
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 L1 refresh loop, well below L1's block time. */ const DEFAULT_REFRESH_POLLING_INTERVAL_MS = 1000;
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
- * Provides current and predicted fee information based on on-chain state.
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
- currentMinFees;
15
- currentL1BlockNumber;
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.currentMinFees = new GasFees(0, 0);
26
- this.currentL1BlockNumber = undefined;
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.refreshFromL1();
39
- this.refreshLoop = new RunningPromise(()=>this.refreshFromL1(), this.log, pollingIntervalMs);
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
- * Checks the current L1 block number and, if it has advanced, refreshes both the current and
47
- * predicted min fees for that block.
48
- */ async refreshFromL1() {
49
- const blockNumber = await this.publicClient.getBlockNumber({
50
- cacheTime: 0
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
- if (this.currentL1BlockNumber !== undefined && blockNumber <= this.currentL1BlockNumber) {
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 currentMinFees = await this.computeCurrentMinFees();
56
- await this.feePredictor.refreshState(blockNumber);
57
- this.currentMinFees = currentMinFees;
58
- this.currentL1BlockNumber = blockNumber;
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 lastCheckpoint = await this.rollupContract.getPendingCheckpoint();
68
- const earliestTimestamp = await this.rollupContract.getTimestampForSlot(SlotNumber.fromBigInt(BigInt(lastCheckpoint.slotNumber) + 1n));
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
- /** Builds global variables that are constant throughout a checkpoint. */
26
- buildCheckpointGlobalVariables(coinbase: EthAddress, feeRecipient: AztecAddress, slotNumber: SlotNumber, simulationOverridesPlan?: SimulationOverridesPlan): Promise<CheckpointGlobalVariables>;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX2J1aWxkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nbG9iYWxfdmFyaWFibGVfYnVpbGRlci9nbG9iYWxfYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsS0FBSyx1QkFBdUIsRUFFN0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBRTFGLE9BQU8sS0FBSyxFQUNWLHlCQUF5QixFQUN6QixxQkFBcUIsSUFBSSw4QkFBOEIsRUFDeEQsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQiwrRUFBK0U7QUFDL0UsTUFBTSxNQUFNLDJCQUEyQixHQUFHO0lBQ3hDLGFBQWEsRUFBRSxVQUFVLENBQUM7SUFDMUIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBQzdCLGFBQWEsRUFBRSxNQUFNLENBQUM7Q0FDdkIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0FBRTlEOztHQUVHO0FBQ0gscUJBQWEscUJBQXNCLFlBQVcsOEJBQThCO0lBU3hFLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQVIvQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBaUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBUztJQUMzQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUV2QyxPQUFPLENBQUMsT0FBTyxDQUFLO0lBQ3BCLE9BQU8sQ0FBQyxPQUFPLENBQUs7SUFFcEIsWUFDbUIsWUFBWSxFQUFFLGdCQUFnQixFQUMvQyxNQUFNLEVBQUUsMkJBQTJCLEVBU3BDO0lBRUQseUVBQXlFO0lBQzVELDhCQUE4QixDQUN6QyxRQUFRLEVBQUUsVUFBVSxFQUNwQixZQUFZLEVBQUUsWUFBWSxFQUMxQixVQUFVLEVBQUUsVUFBVSxFQUN0Qix1QkFBdUIsQ0FBQyxFQUFFLHVCQUF1QixHQUNoRCxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FZcEM7Q0FDRiJ9
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,yEAAyE;IAC5D,8BAA8B,CACzC,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,uBAAuB,CAAC,EAAE,uBAAuB,GAChD,OAAO,CAAC,yBAAyB,CAAC,CAYpC;CACF"}
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
- /** Builds global variables that are constant throughout a checkpoint. */ async buildCheckpointGlobalVariables(coinbase, feeRecipient, slotNumber, simulationOverridesPlan) {
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, stateOverride));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b21pbmVfc2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VxdWVuY2VyL2F1dG9taW5lL2F1dG9taW5lX3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUFlLGdCQUFnQixFQUEyQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pHLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLFNBQVMsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFtQyxLQUFLLE9BQU8sRUFBRSxLQUFLLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhHLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUl2QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBNkIsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pHLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsNEJBQTRCLEVB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
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":"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"}
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 [tips, proposedCheckpoint] = await Promise.all([
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 { BlockData, L2BlockSink, L2BlockSource, ProposedCheckpointSink, ValidateCheckpointResult } from '@aztec/stdlib/block';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQW1DLE1BQU0sb0JBQW9CLENBQUM7QUFDdEYsT0FBTyxFQUFvQixLQUFLLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsYUFBYSxFQUNiLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDekIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsS0FBSyxVQUFVLEVBQ2YsS0FBSyxzQkFBc0IsRUFFNUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU94RCxPQUFPLEVBQ0wsS0FBSyx1QkFB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
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":"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"}
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.getL2Tips().then((t)=>({
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, l2Tips, p2p, l1ToL2MessageSourceTips, pendingChainValidationStatus, proposedCheckpointData] = syncedBlocks;
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
- number: blockNumber
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
- // `getProposedCheckpointData()` returns the latest proposed checkpoint payload, which is always
1132
- // the leading one (a proposed entry is only stored beyond the confirmed frontier and is deleted
1133
- // on confirmation). It carries no tip, so there is no tip-vs-payload split read to reconcile.
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.20260909",
3
+ "version": "5.3.0-nightly.20260911",
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.20260909",
31
- "@aztec/bb-prover": "5.3.0-nightly.20260909",
32
- "@aztec/blob-client": "5.3.0-nightly.20260909",
33
- "@aztec/blob-lib": "5.3.0-nightly.20260909",
34
- "@aztec/constants": "5.3.0-nightly.20260909",
35
- "@aztec/epoch-cache": "5.3.0-nightly.20260909",
36
- "@aztec/ethereum": "5.3.0-nightly.20260909",
37
- "@aztec/foundation": "5.3.0-nightly.20260909",
38
- "@aztec/l1-artifacts": "5.3.0-nightly.20260909",
39
- "@aztec/node-keystore": "5.3.0-nightly.20260909",
40
- "@aztec/noir-acvm_js": "5.3.0-nightly.20260909",
41
- "@aztec/noir-contracts.js": "5.3.0-nightly.20260909",
42
- "@aztec/noir-protocol-circuits-types": "5.3.0-nightly.20260909",
43
- "@aztec/noir-types": "5.3.0-nightly.20260909",
44
- "@aztec/p2p": "5.3.0-nightly.20260909",
45
- "@aztec/protocol-contracts": "5.3.0-nightly.20260909",
46
- "@aztec/prover-client": "5.3.0-nightly.20260909",
47
- "@aztec/simulator": "5.3.0-nightly.20260909",
48
- "@aztec/slasher": "5.3.0-nightly.20260909",
49
- "@aztec/stdlib": "5.3.0-nightly.20260909",
50
- "@aztec/telemetry-client": "5.3.0-nightly.20260909",
51
- "@aztec/validator-client": "5.3.0-nightly.20260909",
52
- "@aztec/validator-ha-signer": "5.3.0-nightly.20260909",
53
- "@aztec/world-state": "5.3.0-nightly.20260909",
30
+ "@aztec/aztec.js": "5.3.0-nightly.20260911",
31
+ "@aztec/bb-prover": "5.3.0-nightly.20260911",
32
+ "@aztec/blob-client": "5.3.0-nightly.20260911",
33
+ "@aztec/blob-lib": "5.3.0-nightly.20260911",
34
+ "@aztec/constants": "5.3.0-nightly.20260911",
35
+ "@aztec/epoch-cache": "5.3.0-nightly.20260911",
36
+ "@aztec/ethereum": "5.3.0-nightly.20260911",
37
+ "@aztec/foundation": "5.3.0-nightly.20260911",
38
+ "@aztec/l1-artifacts": "5.3.0-nightly.20260911",
39
+ "@aztec/node-keystore": "5.3.0-nightly.20260911",
40
+ "@aztec/noir-acvm_js": "5.3.0-nightly.20260911",
41
+ "@aztec/noir-contracts.js": "5.3.0-nightly.20260911",
42
+ "@aztec/noir-protocol-circuits-types": "5.3.0-nightly.20260911",
43
+ "@aztec/noir-types": "5.3.0-nightly.20260911",
44
+ "@aztec/p2p": "5.3.0-nightly.20260911",
45
+ "@aztec/protocol-contracts": "5.3.0-nightly.20260911",
46
+ "@aztec/prover-client": "5.3.0-nightly.20260911",
47
+ "@aztec/simulator": "5.3.0-nightly.20260911",
48
+ "@aztec/slasher": "5.3.0-nightly.20260911",
49
+ "@aztec/stdlib": "5.3.0-nightly.20260911",
50
+ "@aztec/telemetry-client": "5.3.0-nightly.20260911",
51
+ "@aztec/validator-client": "5.3.0-nightly.20260911",
52
+ "@aztec/validator-ha-signer": "5.3.0-nightly.20260911",
53
+ "@aztec/world-state": "5.3.0-nightly.20260911",
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.20260909",
60
- "@aztec/kv-store": "5.3.0-nightly.20260909",
59
+ "@aztec/archiver": "5.3.0-nightly.20260911",
60
+ "@aztec/kv-store": "5.3.0-nightly.20260911",
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
- /** Cached rollup state for fee prediction. Refreshed once per L1 block. */
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
- * Fetches and caches rollup state for the given L1 block.
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 refreshState(blockNumber: bigint): Promise<FeeOracleState> {
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 cached state and a mana usage assumption. */
123
- private computePredictions(state: FeeOracleState, manaUsage: ManaUsageEstimate): GasFees[] {
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 { DateProvider } from '@aztec/foundation/timer';
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 L1 refresh loop, well below L1's block time. */
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
- private currentMinFees = new GasFees(0, 0);
22
- private currentL1BlockNumber: bigint | undefined = undefined;
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.refreshFromL1();
49
- this.refreshLoop = new RunningPromise(() => this.refreshFromL1(), this.log, pollingIntervalMs);
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
- * Checks the current L1 block number and, if it has advanced, refreshes both the current and
59
- * predicted min fees for that block.
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 refreshFromL1(): Promise<void> {
62
- const blockNumber = await this.publicClient.getBlockNumber({ cacheTime: 0 });
63
- if (this.currentL1BlockNumber !== undefined && blockNumber <= this.currentL1BlockNumber) {
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 currentMinFees = await this.computeCurrentMinFees();
68
- await this.feePredictor.refreshState(blockNumber);
69
- this.currentMinFees = currentMinFees;
70
- this.currentL1BlockNumber = blockNumber;
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
- /** Builds global variables that are constant throughout a checkpoint. */
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(0, await this.rollupContract.getManaMinFeeAt(timestamp, true, stateOverride));
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 [tips, proposedCheckpoint] = await Promise.all([
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 type {
15
- BlockData,
16
- L2BlockSink,
17
- L2BlockSource,
18
- ProposedCheckpointSink,
19
- ValidateCheckpointResult,
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.getL2Tips().then(t => ({ proposed: t.proposed, checkpointed: t.checkpointed })),
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, l2Tips, p2p, l1ToL2MessageSourceTips, pendingChainValidationStatus, proposedCheckpointData] =
898
- syncedBlocks;
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({ number: blockNumber });
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
- // `getProposedCheckpointData()` returns the latest proposed checkpoint payload, which is always
936
- // the leading one (a proposed entry is only stored beyond the confirmed frontier and is deleted
937
- // on confirmation). It carries no tip, so there is no tip-vs-payload split read to reconcile.
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