fix(sequencer): anchor fee asset price modifier to predicted parent#23113
Open
spalladino wants to merge 1 commit intomerge-train/spartanfrom
Open
fix(sequencer): anchor fee asset price modifier to predicted parent#23113spalladino wants to merge 1 commit intomerge-train/spartanfrom
spalladino wants to merge 1 commit intomerge-train/spartanfrom
Conversation
Under proposer pipelining the modifier for checkpoint N is computed in slot N-1, before checkpoint N-1 has landed on L1. The proposer was deriving the modifier off `rollupContract.getEthPerFeeAsset()`, which still reflects the latest published checkpoint (commonly N-2). When L1 later applied the modifier in `computeNewEthPerFeeAsset`, it multiplied it against checkpoint N-1's `ethPerFeeAsset` — one step ahead of the proposer's reference — causing a 1-checkpoint drift between intended and stored prices. Threads the predicted parent's `ethPerFeeAsset` (already computed for the pipelined simulation override) through `getFeeAssetPriceModifier()` into `FeeAssetPriceOracle.computePriceModifier()`. Non-pipelined and genesis (checkpoint < 2) paths fall back to today's L1 read.
just-mitch
approved these changes
May 9, 2026
Collaborator
just-mitch
left a comment
There was a problem hiding this comment.
Kind of interesting that it seems to work regardless of what the parent actually does.
E.g. if we're far below what I perceive to be the true value, I expect you to add 100bps. Regardless of what you actually did, I'm still going to add 100bps.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Under proposer pipelining, checkpoint N's fee asset price modifier is computed in slot N-1 before checkpoint N-1 has landed on L1. The proposer was reading
rollupContract.getEthPerFeeAsset(), which still reflects the latest published checkpoint (commonly N-2), while L1 later applies the modifier against checkpoint N-1'sethPerFeeAsset. The mismatch produced a 1-checkpoint drift between the proposer's intended new price and the price L1 actually stored, causing the e2e price-convergence test to oscillate around the target instead of converging.Approach
Threads the predicted parent's
ethPerFeeAssetthrough to the modifier computation.buildPipelinedParentSimulationOverridesPlanalready derives that fee header for global-variable simulation overrides; the pending fee header on the resulting plan is used as the reference price for the bps calculation. Non-pipelined paths and genesis (checkpoint < 2) fall back to today'sgetEthPerFeeAsset()read.Changes
FeeAssetPriceOracle.computePriceModifier()now takes an optionalcurrentPriceE12; when supplied, the L1 read is skipped.SequencerPublisher.getFeeAssetPriceModifier()forwards the optional predicted price;checkpoint_proposal_jobreads it from the pipelined simulation overrides plan and passes it through.inboxLag: 2infee_asset_price_oracle_gossip.test.ts.RollupContract.computeChildFeeHeader(asserting modifier truncation leaves a sub-bp gap to target).Note: if pipelining is enabled at checkpoint ≥ 2 but
proposedCheckpointDatais missing, the predicted-parent will beundefinedand the code silently falls back to the stale L1 read. That's a pre-existing failure-mode behavior, not introduced here.