fix: OptimizerV3Push3 as IOptimizer always returns bear defaults — integration risk (#1063)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
johba 2026-03-20 20:52:29 +00:00
parent 45142e762a
commit 62fc7957b0
4 changed files with 13 additions and 7 deletions

View file

@ -134,8 +134,8 @@ contract BacktestRunner is Script {
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// KrAIken system deployment (follows DeployLocal.sol pattern) // KrAIken system deployment (follows DeployLocal.sol pattern)
// //
// 1. Deploy OptimizerV3Push3 (no proxy getLiquidityParams() uses zeroed // 1. Deploy OptimizerV3Push3 (no proxy getLiquidityParams() always reverts;
// inputs, returning bear-mode defaults on every recenter). // LM's try/catch falls back to bear-mode defaults on every recenter).
// 2. Deploy LiquidityManager pointing at the shadow pool. // 2. Deploy LiquidityManager pointing at the shadow pool.
// 3. Wire BacktestKraiken.setLiquidityManager(lm). // 3. Wire BacktestKraiken.setLiquidityManager(lm).
// 4. Set feeDestination = sender. // 4. Set feeDestination = sender.

View file

@ -12,8 +12,8 @@ import { MockToken } from "./MockToken.sol";
struct KrAIkenSystem { struct KrAIkenSystem {
BacktestKraiken kraiken; BacktestKraiken kraiken;
/// @dev OptimizerV3Push3 is used as the optimizer address. Its getLiquidityParams() /// @dev OptimizerV3Push3 is used as the optimizer address. Its getLiquidityParams()
/// uses zeroed inputs (no on-chain stake data) and returns bear-mode defaults on /// always reverts; LM's try/catch then falls back to bear-mode defaults on every
/// every recenter. This is intentional for backtesting. /// recenter. This is intentional for backtesting.
OptimizerV3Push3 optimizer; OptimizerV3Push3 optimizer;
LiquidityManager lm; LiquidityManager lm;
} }
@ -65,8 +65,8 @@ library KrAIkenDeployer {
returns (KrAIkenSystem memory sys) returns (KrAIkenSystem memory sys)
{ {
// 1. Deploy OptimizerV3Push3. // 1. Deploy OptimizerV3Push3.
// OptimizerV3Push3.getLiquidityParams() uses zeroed inputs (no stake data), // OptimizerV3Push3.getLiquidityParams() always reverts; LM's try/catch falls
// so every recenter uses bear defaults conservative and correct for a // back to bear defaults on every recenter conservative and correct for a
// baseline backtest. // baseline backtest.
OptimizerV3Push3 optimizer = new OptimizerV3Push3(); OptimizerV3Push3 optimizer = new OptimizerV3Push3();

View file

@ -16,7 +16,6 @@ import { OptimizerV3Push3Lib } from "./OptimizerV3Push3Lib.sol";
*/ */
contract OptimizerV3Push3 is IOptimizer { contract OptimizerV3Push3 is IOptimizer {
/** /**
* @inheritdoc IOptimizer
* @dev Always reverts this contract is a transpiler harness, not a production optimizer. * @dev Always reverts this contract is a transpiler harness, not a production optimizer.
* Calling getLiquidityParams() on this stub is a deployment misconfiguration. * Calling getLiquidityParams() on this stub is a deployment misconfiguration.
* LiquidityManager.recenter() has a try/catch that falls back to bear-mode defaults, * LiquidityManager.recenter() has a try/catch that falls back to bear-mode defaults,

View file

@ -103,6 +103,13 @@ contract OptimizerV3Push3Test is Test {
assertEq(dd, BULL_DISCOVERY, "bull: discoveryDepth"); assertEq(dd, BULL_DISCOVERY, "bull: discoveryDepth");
} }
// ---- getLiquidityParams() stub guard ----
function testGetLiquidityParamsReverts() public {
vm.expectRevert("OptimizerV3Push3: not for production use");
push3.getLiquidityParams();
}
// ---- Bear cases ---- // ---- Bear cases ----
function testAlwaysBearAt0Percent() public view { function testAlwaysBearAt0Percent() public view {