Skip to content

Conversation

@adraffy
Copy link
Collaborator

@adraffy adraffy commented Nov 6, 2025

  • updated OPFaultGameFinder
    • changed from IOptimismPortal to IAnchorStateRegistry
    • changed interpretation of gameTypes = []
    • added optimistic _isUnchallenged() checks
    • changed disputeGameBlacklist() to isGameProper()
    • removed finality delay period requirement
  • updated OPFaultVerifier
    • exposed minAgeSec(), allowedGameTypes(), allowedProposers(), anchorStateRegistry(), disputeGameFactory()
  • updated OPFaultRollup
    • updated finder deployments
    • changed config.OptimismPortal to AnchorStateRegistry
    • changed isCommitStillValid() to use finder
  • added RPCInfo.order? for chain default ordering
  • providerOrder() is now: chain env, global env, chain default, global default
  • added --gameTypes to serve.ts
  • added realFinder option to testOPFault()
  • added scripts/deploy-finder.ts
  • improved scripts/providers.ts
  • named struct parameters

@adraffy adraffy marked this pull request as ready for review November 7, 2025 22:12
Copy link
Collaborator

@clowestab clowestab left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I re-read all this and all the OP contracts on the plane for fun. Added two small comments. Some other things that came to mind:

  • Do we need to check isGameRetired() on the parent? It's checked during game initialization in OPSuccinctFaultDisputeGame but the parent could be retired after the fact...
  • We should check paused() on IOptimismPortal2. Is everything invalid if the portal is paused?
  • OPSuccinctFaultDisputeGame says /// @notice An implementation of the IFaultDisputeGame interface but it does in fact not. It implements IDisputeGame, hence the inconsistent interfaces

Not an issue, but an observation:

            // When there is no parent game, the starting output root is the anchor state for the game type.
            (startingOutputRoot.root, startingOutputRoot.l2BlockNumber) =
                IAnchorStateRegistry(ANCHOR_STATE_REGISTRY).anchors(GAME_TYPE);

On mainnet if new game types are going to be released that are going to build upon the previous game type, then the upgrade path and process needs to be very well defined such that anchor states etc are set correctly so as to avoid an issue like that one with Base.

@adraffy
Copy link
Collaborator Author

adraffy commented Nov 11, 2025

Oh, isGameRetired() is interesting. We should add that.

I'm not sure about the circumstances for paused(), are finalized games still considered valid? Or do you only pause if rollback is going to happen? Either we could just ignore all games if paused() or ignore the unfinalized code branch when paused.

@adraffy adraffy requested a review from clowestab November 14, 2025 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants