From 6978d1399f6dde86f9469c91f60804b8d97ebef6 Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 14 Mar 2026 05:08:32 +0000 Subject: [PATCH] fix: OptimizerV3 / OptimizerV3Push3 not explicitly typed against IOptimizer (#661) - Optimizer: add `is IOptimizer` and mark getLiquidityParams() with `override`, making the interface conformance explicit at the base level. OptimizerV3 inherits it transitively via Optimizer. - OptimizerV3Push3: add `is IOptimizer` and implement getLiquidityParams() that calls calculateParams() with zeroed inputs, returning bear-mode defaults (ci=0, anchorShare=0.3e18, anchorWidth=100, discoveryDepth=0.3e18). Behaviour is identical to the previous try/catch fallback used by LiquidityManager and the backtesting deployer. - Update backtesting comments to reflect that getLiquidityParams() now exists on OptimizerV3Push3 (returns bear defaults via zeroed inputs). Co-Authored-By: Claude Sonnet 4.6 --- .../script/backtesting/BacktestRunner.s.sol | 4 ++-- .../script/backtesting/KrAIkenDeployer.sol | 13 ++++++------ onchain/src/Optimizer.sol | 5 +++-- onchain/src/OptimizerV3.sol | 2 +- onchain/src/OptimizerV3Push3.sol | 20 +++++++++++++++++-- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/onchain/script/backtesting/BacktestRunner.s.sol b/onchain/script/backtesting/BacktestRunner.s.sol index dcf00d6..0f5f205 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 — only exposes isBullMarket(), - // causing LM to fall back to safe bear-mode defaults via try/catch). + // 1. Deploy OptimizerV3Push3 (no proxy — getLiquidityParams() uses zeroed + // inputs, returning 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 fb91233..0428978 100644 --- a/onchain/script/backtesting/KrAIkenDeployer.sol +++ b/onchain/script/backtesting/KrAIkenDeployer.sol @@ -11,9 +11,9 @@ import { MockToken } from "./MockToken.sol"; */ struct KrAIkenSystem { BacktestKraiken kraiken; - /// @dev OptimizerV3Push3 is used as the optimizer address. It does not implement - /// getLiquidityParams(), so LiquidityManager's try/catch falls back to safe - /// bear-mode defaults on every recenter. This is intentional for backtesting. + /// @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. OptimizerV3Push3 optimizer; LiquidityManager lm; } @@ -65,10 +65,9 @@ library KrAIkenDeployer { returns (KrAIkenSystem memory sys) { // 1. Deploy OptimizerV3Push3. - // LiquidityManager wraps getLiquidityParams() in a try/catch and falls back to - // safe bear-mode defaults when the call reverts. Since OptimizerV3Push3 only - // exposes isBullMarket(), every recenter uses bear defaults — conservative and - // correct for a baseline backtest. + // OptimizerV3Push3.getLiquidityParams() uses zeroed inputs (no stake data), + // so every recenter uses bear defaults — conservative and correct for a + // baseline backtest. OptimizerV3Push3 optimizer = new OptimizerV3Push3(); // 2. Deploy LiquidityManager. It computes the pool address from factory + WETH + diff --git a/onchain/src/Optimizer.sol b/onchain/src/Optimizer.sol index 2a8a0ba..4efa74c 100644 --- a/onchain/src/Optimizer.sol +++ b/onchain/src/Optimizer.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.19; import {Kraiken} from "./Kraiken.sol"; import {Stake} from "./Stake.sol"; -import {OptimizerInput} from "./IOptimizer.sol"; +import {IOptimizer, OptimizerInput} from "./IOptimizer.sol"; import {Initializable} from "@openzeppelin/proxy/utils/Initializable.sol"; import {UUPSUpgradeable} from "@openzeppelin/proxy/utils/UUPSUpgradeable.sol"; @@ -85,7 +85,7 @@ interface ILiquidityManagerPositions { * anchorWidth anchor position width (tick units, uint24) * discoveryDepth discovery liquidity density */ -contract Optimizer is Initializable, UUPSUpgradeable { +contract Optimizer is Initializable, UUPSUpgradeable, IOptimizer { Kraiken private kraiken; Stake private stake; @@ -413,6 +413,7 @@ contract Optimizer is Initializable, UUPSUpgradeable { function getLiquidityParams() external view + override returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth) { OptimizerInput[8] memory inputs; diff --git a/onchain/src/OptimizerV3.sol b/onchain/src/OptimizerV3.sol index 68b2d24..8fa995e 100644 --- a/onchain/src/OptimizerV3.sol +++ b/onchain/src/OptimizerV3.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.19; import {Optimizer} from "./Optimizer.sol"; -import {OptimizerInput} from "./IOptimizer.sol"; +import {IOptimizer, OptimizerInput} from "./IOptimizer.sol"; /** * @title OptimizerV3 diff --git a/onchain/src/OptimizerV3Push3.sol b/onchain/src/OptimizerV3Push3.sol index 706179f..99d2a33 100644 --- a/onchain/src/OptimizerV3Push3.sol +++ b/onchain/src/OptimizerV3Push3.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.19; -import {OptimizerInput} from "./IOptimizer.sol"; +import {IOptimizer, OptimizerInput} from "./IOptimizer.sol"; /** * @title OptimizerV3Push3 * @notice Auto-generated from optimizer_v3.push3 via Push3→Solidity transpiler. * Implements calculateParams with 8 dyadic rational inputs and 4 outputs. */ -contract OptimizerV3Push3 { +contract OptimizerV3Push3 is IOptimizer { /** * @notice Compute liquidity parameters from 8 dyadic rational inputs. * @dev capitalInefficiency (ci) is intentionally hardcoded to 0 in both the bear @@ -31,6 +31,22 @@ contract OptimizerV3Push3 { * @return anchorWidth Anchor position width in tick units. * @return discoveryDepth Discovery liquidity density (0..1e18). */ + /** + * @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. + */ + function getLiquidityParams() + external + view + returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth) + { + OptimizerInput[8] memory inputs; + return calculateParams(inputs); + } + function calculateParams(OptimizerInput[8] memory inputs) public pure