- 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 <noreply@anthropic.com>
91 lines
4.1 KiB
Solidity
91 lines
4.1 KiB
Solidity
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
pragma solidity ^0.8.19;
|
|
|
|
import { LiquidityManager } from "../../src/LiquidityManager.sol";
|
|
import { OptimizerV3Push3 } from "../../src/OptimizerV3Push3.sol";
|
|
import { BacktestKraiken } from "./BacktestKraiken.sol";
|
|
import { MockToken } from "./MockToken.sol";
|
|
|
|
/**
|
|
* @notice Deployment result for the KrAIken system on the shadow pool.
|
|
*/
|
|
struct KrAIkenSystem {
|
|
BacktestKraiken kraiken;
|
|
/// @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;
|
|
}
|
|
|
|
/**
|
|
* @title KrAIkenDeployer
|
|
* @notice Library that deploys the KrAIken protocol contracts on top of a shadow pool
|
|
* for backtesting purposes.
|
|
*
|
|
* Deployment order follows DeployLocal.sol:
|
|
* 1. Deploy OptimizerV3Push3 (no proxy — it only exposes isBullMarket(), so LM falls
|
|
* back to bear-mode defaults via try/catch on every recenter call).
|
|
* 2. Deploy LiquidityManager pointing at the shadow factory + mock WETH + BacktestKraiken.
|
|
* 3. Wire BacktestKraiken → LM (setLiquidityManager).
|
|
* 4. Set fee destination on LM.
|
|
* 5. Fund LM with mock WETH (initial capital).
|
|
*
|
|
* @dev All functions are `internal` so they are inlined into BacktestRunner.s.sol,
|
|
* keeping msg.sender consistent with the broadcaster throughout deployment.
|
|
*/
|
|
library KrAIkenDeployer {
|
|
uint256 internal constant DEFAULT_INITIAL_CAPITAL = 10 ether;
|
|
|
|
/**
|
|
* @notice Deploy the KrAIken system with default initial capital (10 ETH equivalent).
|
|
*/
|
|
function deploy(address shadowFactory, address mockWeth, address krkToken, address feeDestination) internal returns (KrAIkenSystem memory sys) {
|
|
return deploy(shadowFactory, mockWeth, krkToken, feeDestination, DEFAULT_INITIAL_CAPITAL);
|
|
}
|
|
|
|
/**
|
|
* @notice Deploy the KrAIken system with configurable initial capital.
|
|
*
|
|
* @param shadowFactory Factory that created the shadow pool.
|
|
* @param mockWeth Mock WETH token address (18-decimal ERC-20, freely mintable).
|
|
* @param krkToken BacktestKraiken token address (setLiquidityManager not yet called).
|
|
* @param feeDestination Address that will receive LP fees; also used as the caller
|
|
* for subsequent setRecenterAccess() calls.
|
|
* @param initialCapital Mock WETH minted to LM so recenter() has capital to deploy.
|
|
*/
|
|
function deploy(
|
|
address shadowFactory,
|
|
address mockWeth,
|
|
address krkToken,
|
|
address feeDestination,
|
|
uint256 initialCapital
|
|
)
|
|
internal
|
|
returns (KrAIkenSystem memory sys)
|
|
{
|
|
// 1. Deploy OptimizerV3Push3.
|
|
// 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 +
|
|
// KRK + FEE (10 000). The shadow pool must have been created with the same
|
|
// factory and the same fee tier (ShadowPoolDeployer.SHADOW_FEE == 10 000).
|
|
LiquidityManager lm = new LiquidityManager(shadowFactory, mockWeth, krkToken, address(optimizer));
|
|
|
|
// 3. Wire BacktestKraiken → LM so the restricted mint/burn functions work.
|
|
BacktestKraiken(krkToken).setLiquidityManager(address(lm));
|
|
|
|
// 4. Set fee destination (required before setRecenterAccess can be called).
|
|
lm.setFeeDestination(feeDestination);
|
|
|
|
// 5. Fund LM with mock WETH. recenter() uses _getEthBalance() which reads
|
|
// weth.balanceOf(address(this)). Pre-funding avoids calling weth.deposit()
|
|
// (which MockToken does not implement).
|
|
MockToken(mockWeth).mint(address(lm), initialCapital);
|
|
|
|
sys = KrAIkenSystem({ kraiken: BacktestKraiken(krkToken), optimizer: optimizer, lm: lm });
|
|
}
|
|
}
|