harb/onchain/script/DeployBase.sol
openhands 99d9c563d6 fix: Use Optimizer (base) in deploy scripts — Push3 lacks initialize/getLiquidityParams
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>
2026-02-26 19:37:12 +00:00

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();
}
}