193 lines
7.0 KiB
TypeScript
193 lines
7.0 KiB
TypeScript
import { ethers, upgrades } from "hardhat";
|
||
import * as fs from "fs";
|
||
|
||
/**
|
||
* 部署YTLp系统的所有合约(不包含配置)
|
||
*/
|
||
async function main() {
|
||
console.log("开始部署YT协议可升级合约...\n");
|
||
|
||
const [deployer] = await ethers.getSigners();
|
||
console.log("部署账户:", deployer.address);
|
||
console.log("账户余额:", ethers.formatEther(await ethers.provider.getBalance(deployer.address)), "ETH\n");
|
||
|
||
// ==================== 1. 部署代币合约 ====================
|
||
console.log("===== 1. 部署代币合约 =====");
|
||
|
||
// 部署USDY (可升级)
|
||
console.log("部署USDY...");
|
||
const USDY = await ethers.getContractFactory("USDY");
|
||
const usdy = await upgrades.deployProxy(USDY, [], {
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
});
|
||
await usdy.waitForDeployment();
|
||
const usdyAddress = await usdy.getAddress();
|
||
console.log("✅ USDY deployed to:", usdyAddress);
|
||
|
||
// 部署YTLPToken (可升级)
|
||
console.log("部署YTLPToken...");
|
||
const YTLPToken = await ethers.getContractFactory("YTLPToken");
|
||
const ytLP = await upgrades.deployProxy(YTLPToken, [], {
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
});
|
||
await ytLP.waitForDeployment();
|
||
const ytLPAddress = await ytLP.getAddress();
|
||
console.log("✅ YTLPToken deployed to:", ytLPAddress);
|
||
|
||
// ==================== 2. 部署核心合约 ====================
|
||
console.log("\n===== 2. 部署核心合约 =====");
|
||
|
||
// 读取USDC配置
|
||
if (!fs.existsSync("./deployments-usdc-config.json")) {
|
||
throw new Error("未找到 deployments-usdc-config.json,请先运行 01-prepareUSDC.ts");
|
||
}
|
||
|
||
const usdcConfig = JSON.parse(fs.readFileSync("./deployments-usdc-config.json", "utf8"));
|
||
const usdcAddress = usdcConfig.contracts.USDC.address;
|
||
const usdcPriceFeedAddress = usdcConfig.contracts.ChainlinkUSDCPriceFeed.address;
|
||
|
||
console.log("USDC地址: ", usdcAddress);
|
||
console.log("Chainlink价格预言机: ", usdcPriceFeedAddress);
|
||
|
||
// 部署YTPriceFeed (可升级) - 传入USDC和Chainlink地址
|
||
console.log("\n部署YTPriceFeed...");
|
||
const YTPriceFeed = await ethers.getContractFactory("YTPriceFeed");
|
||
const priceFeed = await upgrades.deployProxy(
|
||
YTPriceFeed,
|
||
[usdcAddress, usdcPriceFeedAddress], // 传入两个参数
|
||
{
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
}
|
||
);
|
||
await priceFeed.waitForDeployment();
|
||
const priceFeedAddress = await priceFeed.getAddress();
|
||
console.log("✅ YTPriceFeed deployed to:", priceFeedAddress);
|
||
|
||
// 部署YTVault (可升级)
|
||
console.log("部署YTVault...");
|
||
const YTVault = await ethers.getContractFactory("YTVault");
|
||
const vault = await upgrades.deployProxy(
|
||
YTVault,
|
||
[usdyAddress, priceFeedAddress],
|
||
{
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
}
|
||
);
|
||
await vault.waitForDeployment();
|
||
const vaultAddress = await vault.getAddress();
|
||
console.log("✅ YTVault deployed to:", vaultAddress);
|
||
|
||
// 部署YTPoolManager (可升级)
|
||
console.log("部署YTPoolManager...");
|
||
const YTPoolManager = await ethers.getContractFactory("YTPoolManager");
|
||
const cooldownDuration = 15 * 60; // 15分钟
|
||
const poolManager = await upgrades.deployProxy(
|
||
YTPoolManager,
|
||
[vaultAddress, usdyAddress, ytLPAddress, cooldownDuration],
|
||
{
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
}
|
||
);
|
||
await poolManager.waitForDeployment();
|
||
const poolManagerAddress = await poolManager.getAddress();
|
||
console.log("✅ YTPoolManager deployed to:", poolManagerAddress);
|
||
|
||
// 部署YTRewardRouter (可升级)
|
||
console.log("部署YTRewardRouter...");
|
||
const YTRewardRouter = await ethers.getContractFactory("YTRewardRouter");
|
||
const router = await upgrades.deployProxy(
|
||
YTRewardRouter,
|
||
[usdyAddress, ytLPAddress, poolManagerAddress, vaultAddress],
|
||
{
|
||
kind: "uups",
|
||
initializer: "initialize"
|
||
}
|
||
);
|
||
await router.waitForDeployment();
|
||
const routerAddress = await router.getAddress();
|
||
console.log("✅ YTRewardRouter deployed to:", routerAddress);
|
||
|
||
// ==================== 3. 输出部署信息 ====================
|
||
console.log("\n===== 部署完成!=====");
|
||
console.log("\n📋 合约地址:");
|
||
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||
console.log("USDY: ", usdyAddress);
|
||
console.log("YTLPToken: ", ytLPAddress);
|
||
console.log("YTPriceFeed: ", priceFeedAddress);
|
||
console.log("YTVault: ", vaultAddress);
|
||
console.log("YTPoolManager: ", poolManagerAddress);
|
||
console.log("YTRewardRouter: ", routerAddress);
|
||
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||
|
||
// 获取实现合约地址
|
||
console.log("\n📋 实现合约地址 (用于验证和升级):");
|
||
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||
const usdyImpl = await upgrades.erc1967.getImplementationAddress(usdyAddress);
|
||
const ytLPImpl = await upgrades.erc1967.getImplementationAddress(ytLPAddress);
|
||
const priceFeedImpl = await upgrades.erc1967.getImplementationAddress(priceFeedAddress);
|
||
const vaultImpl = await upgrades.erc1967.getImplementationAddress(vaultAddress);
|
||
const poolManagerImpl = await upgrades.erc1967.getImplementationAddress(poolManagerAddress);
|
||
const routerImpl = await upgrades.erc1967.getImplementationAddress(routerAddress);
|
||
|
||
console.log("USDY Implementation: ", usdyImpl);
|
||
console.log("YTLPToken Implementation: ", ytLPImpl);
|
||
console.log("YTPriceFeed Implementation: ", priceFeedImpl);
|
||
console.log("YTVault Implementation: ", vaultImpl);
|
||
console.log("YTPoolManager Implementation: ", poolManagerImpl);
|
||
console.log("YTRewardRouter Implementation: ", routerImpl);
|
||
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||
|
||
// 保存到JSON文件
|
||
const deploymentInfo = {
|
||
network: (await ethers.provider.getNetwork()).name,
|
||
chainId: (await ethers.provider.getNetwork()).chainId.toString(),
|
||
deployer: deployer.address,
|
||
timestamp: new Date().toISOString(),
|
||
contracts: {
|
||
USDY: {
|
||
proxy: usdyAddress,
|
||
implementation: usdyImpl
|
||
},
|
||
YTLPToken: {
|
||
proxy: ytLPAddress,
|
||
implementation: ytLPImpl
|
||
},
|
||
YTPriceFeed: {
|
||
proxy: priceFeedAddress,
|
||
implementation: priceFeedImpl
|
||
},
|
||
YTVault: {
|
||
proxy: vaultAddress,
|
||
implementation: vaultImpl
|
||
},
|
||
YTPoolManager: {
|
||
proxy: poolManagerAddress,
|
||
implementation: poolManagerImpl
|
||
},
|
||
YTRewardRouter: {
|
||
proxy: routerAddress,
|
||
implementation: routerImpl
|
||
}
|
||
}
|
||
};
|
||
|
||
fs.writeFileSync(
|
||
"./deployments-ytlp.json",
|
||
JSON.stringify(deploymentInfo, null, 2)
|
||
);
|
||
console.log("\n✅ 部署信息已保存到 deployments-ytlp.json");
|
||
console.log("\n⚠️ 注意: 合约已部署但未配置,请运行 configureYTLp.ts 进行配置");
|
||
}
|
||
|
||
main()
|
||
.then(() => process.exit(0))
|
||
.catch((error) => {
|
||
console.error(error);
|
||
process.exit(1);
|
||
});
|