diff --git a/STATE.md b/STATE.md index 52f87ec..c9c6eda 100644 --- a/STATE.md +++ b/STATE.md @@ -50,4 +50,4 @@ - [2026-03-15] txnBot AGENTS.md ENVIRONMENT enum is stale (#784) - [2026-03-20] Adoption milestone state ambiguity in MEMORY.md (#1068) - [2026-03-20] OptimizerV3Push3 as IOptimizer always returns bear defaults — integration risk (#1063) -- [2026-03-21] deploy-optimizer.sh reads LM_ADDR inside a guard that silently skips on missing broadcast JSON (#1051) +- [2026-03-21] Optimizer and OptimizerV3 lack _disableInitializers() in constructor (#1055) diff --git a/onchain/src/Optimizer.sol b/onchain/src/Optimizer.sol index e08d835..08b8769 100644 --- a/onchain/src/Optimizer.sol +++ b/onchain/src/Optimizer.sol @@ -86,6 +86,11 @@ interface ILiquidityManagerPositions { * discoveryDepth discovery liquidity density */ contract Optimizer is Initializable, UUPSUpgradeable, IOptimizer { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + Kraiken private kraiken; Stake private stake; diff --git a/onchain/src/OptimizerV3.sol b/onchain/src/OptimizerV3.sol index 44705ff..b40d796 100644 --- a/onchain/src/OptimizerV3.sol +++ b/onchain/src/OptimizerV3.sol @@ -17,6 +17,11 @@ import { OptimizerV3Push3Lib } from "./OptimizerV3Push3Lib.sol"; * r40 -> ci, r39 -> anchorShare, r38 -> anchorWidth, r37 -> discoveryDepth */ contract OptimizerV3 is Optimizer { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + function calculateParams(OptimizerInput[8] memory inputs) public pure diff --git a/onchain/test/Optimizer.t.sol b/onchain/test/Optimizer.t.sol index 57daa62..799bb8d 100644 --- a/onchain/test/Optimizer.t.sol +++ b/onchain/test/Optimizer.t.sol @@ -30,16 +30,11 @@ contract OptimizerTest is Test { mockKraiken = new MockKraiken(); mockStake = new MockStake(); - // Deploy Optimizer implementation + // Deploy implementation and proxy Optimizer implementation = new Optimizer(); - - // Deploy proxy and initialize bytes memory initData = abi.encodeWithSelector(Optimizer.initialize.selector, address(mockKraiken), address(mockStake)); - - // For simplicity, we'll test the implementation directly - // In production, you'd use a proper proxy setup - optimizer = implementation; - optimizer.initialize(address(mockKraiken), address(mockStake)); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), initData); + optimizer = Optimizer(address(proxy)); } /**