fix: No formal IOptimizer interface for getLiquidityParams ABI (#556)

Add IOptimizer interface with getLiquidityParams() signature to IOptimizer.sol
so upgrade-compatibility is explicit and static analysis can catch ABI mismatches.
Update LiquidityManager to hold optimizer as IOptimizer instead of concrete Optimizer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
openhands 2026-03-13 07:20:42 +00:00
parent fa561ce78e
commit d01c561028
2 changed files with 24 additions and 3 deletions

View file

@ -9,3 +9,24 @@ struct OptimizerInput {
int256 mantissa;
int256 shift;
}
/**
* @title IOptimizer
* @notice Minimal interface for the Optimizer contract consumed by LiquidityManager.
* Declaring the ABI here makes upgrade-compatibility explicit: any new
* Optimizer implementation must satisfy this selector or the LiquidityManager
* will fall back to bear-mode defaults via its try-catch.
*/
interface IOptimizer {
/**
* @notice Returns the four liquidity parameters used by LiquidityManager.recenter().
* @return capitalInefficiency Capital buffer level (0..1e18). CI=0 is safest.
* @return anchorShare Fraction of non-floor ETH in anchor (0..1e18).
* @return anchorWidth Anchor position width in tick units (uint24).
* @return discoveryDepth Discovery liquidity density (0..1e18).
*/
function getLiquidityParams()
external
view
returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth);
}

View file

@ -2,7 +2,7 @@
pragma solidity ^0.8.19;
import { Kraiken } from "./Kraiken.sol";
import { Optimizer } from "./Optimizer.sol";
import { IOptimizer } from "./IOptimizer.sol";
import { PriceOracle } from "./abstracts/PriceOracle.sol";
import { ThreePositionStrategy } from "./abstracts/ThreePositionStrategy.sol";
import { IWETH9 } from "./interfaces/IWETH9.sol";
@ -38,7 +38,7 @@ contract LiquidityManager is ThreePositionStrategy, PriceOracle {
address private immutable factory;
IWETH9 private immutable weth;
Kraiken private immutable kraiken;
Optimizer private immutable optimizer;
IOptimizer private immutable optimizer;
IUniswapV3Pool private immutable pool;
bool private immutable token0isWeth;
PoolKey private poolKey;
@ -84,7 +84,7 @@ contract LiquidityManager is ThreePositionStrategy, PriceOracle {
pool = IUniswapV3Pool(PoolAddress.computeAddress(factory, poolKey));
kraiken = Kraiken(_kraiken);
token0isWeth = _WETH9 < _kraiken;
optimizer = Optimizer(_optimizer);
optimizer = IOptimizer(_optimizer);
// Increase observation cardinality so pool.observe() has sufficient history
// for _isPriceStable() TWAP checks.
pool.increaseObservationCardinalityNext(ORACLE_CARDINALITY);