fix(proposal-6): WorldChain & XLayer v4 activation must use CrossChainAccount (XDM), not OptimismPortal2#149
Merged
jtriley2p merged 1 commit intoJul 17, 2026
Conversation
…ccount (XDM), not OptimismPortal2 WorldChain and XLayer v4 PoolManagers are owned by their CrossChainAccount, not the aliased Timelock -- verified onchain: PoolManager.owner() == crossChainAccount, and crossChainAccount.l1Owner == mainnet Timelock via the L2CrossDomainMessenger. Activating via OptimismPortal2Encoder delivers setProtocolFeeController from the aliased Timelock, so the L1 proposal executes but the L2 call reverts on onlyOwner -- v4 fees never activate on these two chains, and the OP deposit (unlike an Arbitrum retryable) cannot be retried without a new governance vote. Switch both to L1CrossDomainMessengerEncoder -> CrossChainAccount.forward, matching the other five OP-stack chains (Base/Celo/Optimism/Soneium/Zora). Remove the now-unused OptimismPortal2Encoder and IL1CrossDomainMessenger imports. Verified owner-vs-encoder-sender onchain for all reachable target chains; only WorldChain and XLayer were mismatched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
Summary
The v4 fee activation proposal (
V4FeeProposalinscript/proposal-6/V4FeesProposal.s.sol) activates WorldChain and XLayer viaOptimismPortal2Encoder, which deliverssetProtocolFeeControllerfrom the aliased Timelock. But both PoolManagers are owned by their CrossChainAccount, so the L2 call reverts ononlyOwner— the L1 proposal executes "successfully" while v4 fees silently never activate on those two chains. Because it's an OP-stack deposit (not an Arbitrum retryable), the spent message can't be retried without a fresh governance vote.This switches both to
L1CrossDomainMessengerEncoder→CrossChainAccount.forward, matching the five other OP-stack chains (Base/Celo/Optimism/Soneium/Zora).Onchain verification
Verified
owner()on all reachable target PoolManagers against the L2 sender each encoder produces — only WorldChain and XLayer were mismatched; the other 9 already line up. Full authority chain for the two fixed chains:.owner()l1Ownermessengeri.e.
Timelock → L1CrossDomainMessenger → CrossChainAccount (owned by Timelock) → forward → PoolManagerresolves cleanly. The previously-usedOptimismPortal2(aliased-Timelock) path does not, because aliased-Timelock ≠ owner.Changes
L1CrossDomainMessengerEncoderOptimismPortal2EncoderandIL1CrossDomainMessengerimportsforge buildpasses;V4FeeProposalcompilesNote
This only affects Part 2 of the activation (WorldChain/XLayer are both in Part 2). Part 1 is unaffected.
🤖 Generated with Claude Code