From 6f7b6c42547efdebd026aa30fad52e8775d900b3 Mon Sep 17 00:00:00 2001 From: johba Date: Fri, 20 Mar 2026 20:13:18 +0000 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20OptimizerV3Push3=20as=20IOptimizer?= =?UTF-8?q?=20always=20returns=20bear=20defaults=20=E2=80=94=20integration?= =?UTF-8?q?=20risk=20(#1063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getLiquidityParams() now reverts with "OptimizerV3Push3: not for production use" instead of silently returning zeroed bear-mode defaults; LiquidityManager.recenter() already has a try/catch fallback so backtesting is unaffected - Added @custom:experimental NatSpec annotation to the contract marking it as a transpiler harness / backtesting stub only - DeployBase.sol now validates any pre-existing optimizer address by calling getLiquidityParams() and reverting if it fails, blocking accidental wiring of OptimizerV3Push3 as a live optimizer Co-Authored-By: Claude Sonnet 4.6 --- onchain/script/DeployBase.sol | 4 ++++ onchain/src/OptimizerV3Push3.sol | 17 ++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/onchain/script/DeployBase.sol b/onchain/script/DeployBase.sol index afeb034..9c7aed2 100644 --- a/onchain/script/DeployBase.sol +++ b/onchain/script/DeployBase.sol @@ -93,6 +93,10 @@ contract DeployBase is Script { } else { optimizerAddress = optimizer; console.log("Using existing optimizer at:", optimizerAddress); + // Guard: ensure the pre-existing optimizer is not a stub (e.g. OptimizerV3Push3). + // OptimizerV3Push3.getLiquidityParams() always reverts; a live optimizer must not. + (bool ok,) = optimizerAddress.staticcall(abi.encodeWithSignature("getLiquidityParams()")); + require(ok, "DeployBase: optimizer getLiquidityParams() reverted - stub or misconfigured address"); } // Deploy LiquidityManager diff --git a/onchain/src/OptimizerV3Push3.sol b/onchain/src/OptimizerV3Push3.sol index 31bb68a..c44ee96 100644 --- a/onchain/src/OptimizerV3Push3.sol +++ b/onchain/src/OptimizerV3Push3.sol @@ -10,18 +10,21 @@ import { OptimizerV3Push3Lib } from "./OptimizerV3Push3Lib.sol"; * The actual calculation logic lives in OptimizerV3Push3Lib and is * shared with OptimizerV3 so that transpiler changes require only * one edit point. + * @custom:experimental This contract is a transpiler harness / backtesting stub only. + * It must NOT be wired as the live optimizer in any production deployment. + * Use OptimizerV3 (UUPS proxy) for production. */ contract OptimizerV3Push3 is IOptimizer { /** * @inheritdoc IOptimizer - * @dev Calls calculateParams with zeroed inputs (percentageStaked=0, averageTaxRate=0), - * producing bear-mode defaults: (ci=0, anchorShare=0.3e18, anchorWidth=100, discoveryDepth=0.3e18). - * This contract is a standalone transpiler output without access to on-chain stake data; - * use OptimizerV3 (which inherits Optimizer) for a live deployment with real inputs. + * @dev Always reverts — this contract is a transpiler harness, not a production optimizer. + * Calling getLiquidityParams() on this stub is a deployment misconfiguration. + * LiquidityManager.recenter() has a try/catch that falls back to bear-mode defaults, + * so accidental wiring produces a permanent bear-mode lock rather than a silent failure. + * Use OptimizerV3 (which inherits Optimizer) for a live deployment with real inputs. */ - function getLiquidityParams() external view returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth) { - OptimizerInput[8] memory inputs; - return calculateParams(inputs); + function getLiquidityParams() external pure returns (uint256, uint256, uint24, uint256) { + revert("OptimizerV3Push3: not for production use"); } /** From 45142e762add794f9aeca4c50a41b55fde3847ab Mon Sep 17 00:00:00 2001 From: johba Date: Fri, 20 Mar 2026 20:14:19 +0000 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20OptimizerV3Push3=20as=20IOptimizer?= =?UTF-8?q?=20always=20returns=20bear=20defaults=20=E2=80=94=20integration?= =?UTF-8?q?=20risk=20(#1063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/STATE.md b/STATE.md index 585c612..ba61a71 100644 --- a/STATE.md +++ b/STATE.md @@ -49,3 +49,4 @@ - [2026-03-15] evo_run007_champion.push3 note has same CI/DD inversion (#790) - [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) From 62fc7957b0b93a8db0f9f428fa8f25b8eda1baeb Mon Sep 17 00:00:00 2001 From: johba Date: Fri, 20 Mar 2026 20:52:29 +0000 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20OptimizerV3Push3=20as=20IOptimizer?= =?UTF-8?q?=20always=20returns=20bear=20defaults=20=E2=80=94=20integration?= =?UTF-8?q?=20risk=20(#1063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- onchain/script/backtesting/BacktestRunner.s.sol | 4 ++-- onchain/script/backtesting/KrAIkenDeployer.sol | 8 ++++---- onchain/src/OptimizerV3Push3.sol | 1 - onchain/test/OptimizerV3Push3.t.sol | 7 +++++++ 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/onchain/script/backtesting/BacktestRunner.s.sol b/onchain/script/backtesting/BacktestRunner.s.sol index 9da45d6..be56c75 100644 --- a/onchain/script/backtesting/BacktestRunner.s.sol +++ b/onchain/script/backtesting/BacktestRunner.s.sol @@ -134,8 +134,8 @@ contract BacktestRunner is Script { // ------------------------------------------------------------------ // KrAIken system deployment (follows DeployLocal.sol pattern) // - // 1. Deploy OptimizerV3Push3 (no proxy — getLiquidityParams() uses zeroed - // inputs, returning bear-mode defaults on every recenter). + // 1. Deploy OptimizerV3Push3 (no proxy — getLiquidityParams() always reverts; + // LM's try/catch falls back to bear-mode defaults on every recenter). // 2. Deploy LiquidityManager pointing at the shadow pool. // 3. Wire BacktestKraiken.setLiquidityManager(lm). // 4. Set feeDestination = sender. diff --git a/onchain/script/backtesting/KrAIkenDeployer.sol b/onchain/script/backtesting/KrAIkenDeployer.sol index 0428978..75b852a 100644 --- a/onchain/script/backtesting/KrAIkenDeployer.sol +++ b/onchain/script/backtesting/KrAIkenDeployer.sol @@ -12,8 +12,8 @@ import { MockToken } from "./MockToken.sol"; struct KrAIkenSystem { BacktestKraiken kraiken; /// @dev OptimizerV3Push3 is used as the optimizer address. Its getLiquidityParams() - /// uses zeroed inputs (no on-chain stake data) and returns bear-mode defaults on - /// every recenter. This is intentional for backtesting. + /// always reverts; LM's try/catch then falls back to bear-mode defaults on every + /// recenter. This is intentional for backtesting. OptimizerV3Push3 optimizer; LiquidityManager lm; } @@ -65,8 +65,8 @@ library KrAIkenDeployer { returns (KrAIkenSystem memory sys) { // 1. Deploy OptimizerV3Push3. - // OptimizerV3Push3.getLiquidityParams() uses zeroed inputs (no stake data), - // so every recenter uses bear defaults — conservative and correct for a + // OptimizerV3Push3.getLiquidityParams() always reverts; LM's try/catch falls + // back to bear defaults on every recenter — conservative and correct for a // baseline backtest. OptimizerV3Push3 optimizer = new OptimizerV3Push3(); diff --git a/onchain/src/OptimizerV3Push3.sol b/onchain/src/OptimizerV3Push3.sol index c44ee96..b9e0168 100644 --- a/onchain/src/OptimizerV3Push3.sol +++ b/onchain/src/OptimizerV3Push3.sol @@ -16,7 +16,6 @@ import { OptimizerV3Push3Lib } from "./OptimizerV3Push3Lib.sol"; */ contract OptimizerV3Push3 is IOptimizer { /** - * @inheritdoc IOptimizer * @dev Always reverts — this contract is a transpiler harness, not a production optimizer. * Calling getLiquidityParams() on this stub is a deployment misconfiguration. * LiquidityManager.recenter() has a try/catch that falls back to bear-mode defaults, diff --git a/onchain/test/OptimizerV3Push3.t.sol b/onchain/test/OptimizerV3Push3.t.sol index f606c41..bd83f4f 100644 --- a/onchain/test/OptimizerV3Push3.t.sol +++ b/onchain/test/OptimizerV3Push3.t.sol @@ -103,6 +103,13 @@ contract OptimizerV3Push3Test is Test { assertEq(dd, BULL_DISCOVERY, "bull: discoveryDepth"); } + // ---- getLiquidityParams() stub guard ---- + + function testGetLiquidityParamsReverts() public { + vm.expectRevert("OptimizerV3Push3: not for production use"); + push3.getLiquidityParams(); + } + // ---- Bear cases ---- function testAlwaysBearAt0Percent() public view {