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"); } /**