Files
assetxContracts/scripts/deploy/04-createVault.ts
2025-12-24 16:41:26 +08:00

159 lines
5.2 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ethers } from "hardhat";
import * as fs from "fs";
/**
* 通过YTAssetFactory创建YTAssetVault
*/
async function main() {
console.log("开始创建YTAssetVault...\n");
const [deployer] = await ethers.getSigners();
console.log("操作账户:", deployer.address);
// ==================== 1. 读取Factory地址 ====================
console.log("\n===== 1. 读取Factory地址 =====");
if (!fs.existsSync("./deployments-vault-system.json")) {
throw new Error("未找到 deployments-vault-system.json请先运行 deployAsset.ts");
}
const vaultDeployment = JSON.parse(fs.readFileSync("./deployments-vault-system.json", "utf8"));
const factoryAddress = vaultDeployment.contracts.YTAssetFactory.proxy;
const usdcAddress = vaultDeployment.usdcAddress;
const usdcPriceFeedAddress = vaultDeployment.usdcPriceFeedAddress;
console.log("YTAssetFactory: ", factoryAddress);
console.log("USDC地址: ", usdcAddress);
console.log("Chainlink价格预言机: ", usdcPriceFeedAddress);
const factory = await ethers.getContractAt("YTAssetFactory", factoryAddress);
// 注意YTAssetVault的价格精度是1e30
const PRICE_PRECISION = ethers.parseUnits("1", 30); // 1e30
// 可以在这里修改要创建的vault参数
const vaultParams = [
{
name: "YT Token A",
symbol: "YT-A",
manager: deployer.address,
hardCap: ethers.parseEther("10000000"), // 1000万
redemptionTime: Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60, // 1年后
initialYtPrice: PRICE_PRECISION // $1.00 (精度1e30)
},
{
name: "YT Token B",
symbol: "YT-B",
manager: deployer.address,
hardCap: ethers.parseEther("10000000"),
redemptionTime: Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60,
initialYtPrice: PRICE_PRECISION // $1.00 (精度1e30)
},
{
name: "YT Token C",
symbol: "YT-C",
manager: deployer.address,
hardCap: ethers.parseEther("10000000"),
redemptionTime: Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60,
initialYtPrice: PRICE_PRECISION // $1.00 (精度1e30)
}
];
// ==================== 2. 创建Vaults ====================
console.log("\n===== 2. 创建Vaults =====");
const createdVaults: any[] = [];
for (const params of vaultParams) {
console.log(`\n创建 ${params.name} (${params.symbol})...`);
// 价格已经是1e30精度直接使用
const ytPrice = params.initialYtPrice;
// 新的createVault签名
// createVault(name, symbol, manager, hardCap, usdc, redemptionTime, ytPrice, usdcPriceFeed)
const tx = await factory.createVault(
params.name,
params.symbol,
params.manager,
params.hardCap,
usdcAddress, // USDC地址
params.redemptionTime,
ytPrice, // 只需要ytPrice
usdcPriceFeedAddress // Chainlink价格预言机地址
);
const receipt = await tx.wait();
// 从事件中获取vault地址
const event = receipt?.logs.find((log: any) => {
try {
const parsed = factory.interface.parseLog({
topics: log.topics as string[],
data: log.data
});
return parsed?.name === "VaultCreated";
} catch {
return false;
}
});
if (event) {
const parsed = factory.interface.parseLog({
topics: event.topics as string[],
data: event.data
});
const vaultAddress = parsed?.args[0];
const index = parsed?.args[5];
console.log(" ✅ Vault地址:", vaultAddress);
console.log(" ✅ Vault索引:", index.toString());
createdVaults.push({
name: params.name,
symbol: params.symbol,
address: vaultAddress,
index: index.toString(),
manager: params.manager,
hardCap: params.hardCap.toString(),
redemptionTime: params.redemptionTime,
ytPrice: ytPrice.toString()
});
}
}
// ==================== 3. 输出摘要 ====================
console.log("\n===== 创建完成!=====");
console.log("\n📋 创建的Vaults:");
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
createdVaults.forEach((vault, i) => {
console.log(`${i + 1}. ${vault.name} (${vault.symbol})`);
console.log(` 地址: ${vault.address}`);
console.log(` 索引: ${vault.index}`);
});
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
// 更新部署文件添加创建的vaults
vaultDeployment.vaults = createdVaults;
vaultDeployment.lastUpdate = new Date().toISOString();
fs.writeFileSync(
"./deployments-vault-system.json",
JSON.stringify(vaultDeployment, null, 2)
);
console.log("\n✅ Vault信息已保存到 deployments-vault-system.json");
console.log("\n💡 下一步:");
console.log("1. 在YTLp系统中将这些vault添加到白名单");
console.log("2. 为每个vault设置初始价格");
console.log("3. 开始使用!");
console.log("\n注意: USDC价格自动从Chainlink获取无需手动设置");
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});