OptimizerV3Push3 is an equivalence-proof contract with only isBullMarket(). It cannot serve as an ERC1967Proxy implementation because it has no initialize() or getLiquidityParams(). The CI bootstrap was failing because the proxy deployment reverted when calling initialize() on the Push3 implementation. Switch deploy scripts to Optimizer.sol (the base UUPS contract) which has the full interface required by ERC1967Proxy and LiquidityManager. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
110 lines
4.2 KiB
Solidity
110 lines
4.2 KiB
Solidity
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
pragma solidity ^0.8.19;
|
|
|
|
import "../src/Kraiken.sol";
|
|
|
|
import { LiquidityManager } from "../src/LiquidityManager.sol";
|
|
import "../src/Optimizer.sol";
|
|
import "../src/Stake.sol";
|
|
import "../src/helpers/UniswapHelpers.sol";
|
|
import { ERC1967Proxy } from "@openzeppelin/proxy/ERC1967/ERC1967Proxy.sol";
|
|
import "@uniswap-v3-core/interfaces/IUniswapV3Factory.sol";
|
|
import "@uniswap-v3-core/interfaces/IUniswapV3Pool.sol";
|
|
import "forge-std/Script.sol";
|
|
|
|
uint24 constant FEE = uint24(10_000);
|
|
|
|
contract DeployBase is Script {
|
|
using UniswapHelpers for IUniswapV3Pool;
|
|
|
|
bool public token0isWeth;
|
|
address public feeDest;
|
|
address public weth;
|
|
address public v3Factory;
|
|
address public optimizer;
|
|
|
|
// Deployed contracts
|
|
Kraiken public kraiken;
|
|
Stake public stake;
|
|
LiquidityManager public liquidityManager;
|
|
IUniswapV3Pool public pool;
|
|
|
|
function run() public {
|
|
string memory seedPhrase = vm.readFile(".secret");
|
|
uint256 privateKey = vm.deriveKey(seedPhrase, 0);
|
|
vm.startBroadcast(privateKey);
|
|
address sender = vm.addr(privateKey);
|
|
|
|
console.log("Deploying from:", sender);
|
|
|
|
// Deploy Kraiken token
|
|
kraiken = new Kraiken("Kraiken", "KRK");
|
|
console.log("Kraiken deployed at:", address(kraiken));
|
|
|
|
// Determine token ordering
|
|
token0isWeth = address(weth) < address(kraiken);
|
|
console.log("token0isWeth:", token0isWeth);
|
|
|
|
// Deploy Stake contract
|
|
stake = new Stake(address(kraiken), feeDest);
|
|
console.log("Stake deployed at:", address(stake));
|
|
|
|
// Set staking pool in Kraiken
|
|
kraiken.setStakingPool(address(stake));
|
|
|
|
// Get or create Uniswap V3 pool
|
|
IUniswapV3Factory factory = IUniswapV3Factory(v3Factory);
|
|
address liquidityPool = factory.getPool(weth, address(kraiken), FEE);
|
|
if (liquidityPool == address(0)) {
|
|
liquidityPool = factory.createPool(weth, address(kraiken), FEE);
|
|
console.log("Uniswap pool created at:", liquidityPool);
|
|
} else {
|
|
console.log("Using existing pool at:", liquidityPool);
|
|
}
|
|
pool = IUniswapV3Pool(liquidityPool);
|
|
|
|
// Initialize pool at 1 cent price if not already initialized
|
|
try pool.slot0() returns (uint160, int24, uint16, uint16, uint16, uint8, bool) {
|
|
console.log("Pool already initialized");
|
|
} catch {
|
|
pool.initializePoolFor1Cent(token0isWeth);
|
|
console.log("Pool initialized");
|
|
}
|
|
|
|
// Deploy Optimizer (if not already deployed)
|
|
address optimizerAddress;
|
|
if (optimizer == address(0)) {
|
|
Optimizer optimizerImpl = new Optimizer();
|
|
bytes memory params = abi.encodeWithSignature("initialize(address,address)", address(kraiken), address(stake));
|
|
ERC1967Proxy proxy = new ERC1967Proxy(address(optimizerImpl), params);
|
|
optimizerAddress = address(proxy);
|
|
console.log("Optimizer deployed at:", optimizerAddress);
|
|
} else {
|
|
optimizerAddress = optimizer;
|
|
console.log("Using existing optimizer at:", optimizerAddress);
|
|
}
|
|
|
|
// Deploy LiquidityManager
|
|
liquidityManager = new LiquidityManager(v3Factory, weth, address(kraiken), optimizerAddress);
|
|
console.log("LiquidityManager deployed at:", address(liquidityManager));
|
|
|
|
// Set fee destination
|
|
liquidityManager.setFeeDestination(feeDest);
|
|
|
|
// Set liquidity manager in Kraiken
|
|
kraiken.setLiquidityManager(address(liquidityManager));
|
|
|
|
console.log("\n=== Deployment Complete ===");
|
|
console.log("Kraiken:", address(kraiken));
|
|
console.log("Stake:", address(stake));
|
|
console.log("Pool:", address(pool));
|
|
console.log("LiquidityManager:", address(liquidityManager));
|
|
console.log("Optimizer:", optimizerAddress);
|
|
console.log("\nPost-deploy steps:");
|
|
console.log(" 1. Fund LiquidityManager with ETH");
|
|
console.log(" 2. Set recenterAccess to txnBot: lm.setRecenterAccess(txnBot) from feeDestination");
|
|
console.log(" 3. Wait a few minutes, then call recenter()");
|
|
|
|
vm.stopBroadcast();
|
|
}
|
|
}
|