harb/onchain/src/IOptimizer.sol
openhands abbf14854d fix: address review — add negative-mantissa guard to OptimizerV3, add OptimizerV3 test file
- Add require(mantissa >= 0) to OptimizerV3.calculateParams validation loop
  (was missing unlike Optimizer and OptimizerV3Push3)
- Create onchain/test/OptimizerV3.t.sol with shift, negative-mantissa, and
  basic bear/bull output tests
- Fix stale comment in Optimizer.sol: "shift=0 assumed" → "shift=0 enforced"
- Use implementation-neutral NatSpec phrasing in IOptimizer.sol

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 12:10:03 +00:00

42 lines
1.9 KiB
Solidity
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.19;
/**
* @notice Dyadic rational input: mantissa × 2^(-shift).
* shift is reserved for future use and MUST be 0. All production
* Optimizer implementations require shift == 0 and revert otherwise.
* When shift == 0 (as produced by _toDyadic), value == mantissa.
*/
struct OptimizerInput {
int256 mantissa;
int256 shift;
}
/// @dev Safe bear-mode defaults shared by Optimizer._bearDefaults() and
/// LiquidityManager.recenter()'s catch block. Keep all four here so
/// the two call-sites cannot silently diverge.
uint256 constant BEAR_CAPITAL_INEFFICIENCY = 0;
uint256 constant BEAR_ANCHOR_SHARE = 3e17;
uint24 constant BEAR_ANCHOR_WIDTH = 100;
uint256 constant BEAR_DISCOVERY_DEPTH = 3e17;
/**
* @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, clamped to MAX_PARAM_SCALE). CI=0 is safest.
* @return anchorShare Fraction of non-floor ETH in anchor (0..1e18, clamped to MAX_PARAM_SCALE).
* @return anchorWidth Anchor position width in tick units (uint24); passed through to ThreePositionStrategy without clamping.
* @return discoveryDepth Discovery liquidity density (0..1e18, clamped to MAX_PARAM_SCALE).
*/
function getLiquidityParams()
external
view
returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth);
}