From 8b91d57a91742961938f8af84dc83a76b037cdd8 Mon Sep 17 00:00:00 2001 From: Khimesh Dewangan Date: Sat, 11 Jul 2026 22:14:12 +0530 Subject: [PATCH] fix(disputegamefactory): apply CEI pattern fix in create() and createWithInitData() Moves _finalizeGameCreation() before the external proxy.initialize()/initializeWithInitData() call in both create() and createWithInitData() functions to follow the Checks-Effects-Interactions (CEI) pattern. This prevents state-desynchronization where a dispute game could be initialized but not yet registered in the factory registry, which could cause integration failures and stale state reads for downstream components. Closes #356. --- src/L1/proofs/DisputeGameFactory.sol | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/L1/proofs/DisputeGameFactory.sol b/src/L1/proofs/DisputeGameFactory.sol index c79f3e9a4..c670dc71d 100644 --- a/src/L1/proofs/DisputeGameFactory.sol +++ b/src/L1/proofs/DisputeGameFactory.sol @@ -150,8 +150,10 @@ contract DisputeGameFactory is ProxyAdminOwnedBase, ReinitializableBase, Ownable returns (IDisputeGame proxy_) { proxy_ = _createGameImpl(_gameType, _rootClaim, _extraData); - proxy_.initialize{ value: msg.value }(); + // EFFECT: Finalize and register state first (CEI pattern) _finalizeGameCreation(_gameType, _rootClaim, _extraData, proxy_); + // INTERACTION: Perform external initialization call last + proxy_.initialize{ value: msg.value }(); } function createWithInitData( @@ -165,8 +167,10 @@ contract DisputeGameFactory is ProxyAdminOwnedBase, ReinitializableBase, Ownable returns (IDisputeGame proxy_) { proxy_ = _createGameImpl(_gameType, _rootClaim, _extraData); - proxy_.initializeWithInitData{ value: msg.value }(_initData); + // EFFECT: Finalize and register state first (CEI pattern) _finalizeGameCreation(_gameType, _rootClaim, _extraData, proxy_); + // INTERACTION: Perform external initialization call last + proxy_.initializeWithInitData{ value: msg.value }(_initData); } /// @notice Creates a new DisputeGame proxy contract.