Files
assetxContracts/scripts/deploy/04-createVault.ts

160 lines
5.1 KiB
TypeScript
Raw Permalink Normal View History

2025-12-18 13:07:35 +08:00
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 wusdAddress = vaultDeployment.wusdAddress;
console.log("YTAssetFactory:", factoryAddress);
console.log("WUSD地址:", wusdAddress);
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年后
initialWusdPrice: PRICE_PRECISION, // $1.00 (精度1e30)
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,
initialWusdPrice: PRICE_PRECISION, // $1.00 (精度1e30)
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,
initialWusdPrice: PRICE_PRECISION, // $1.00 (精度1e30)
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 wusdPrice = params.initialWusdPrice;
const ytPrice = params.initialYtPrice;
const tx = await factory.createVault(
params.name,
params.symbol,
params.manager,
params.hardCap,
wusdAddress,
params.redemptionTime,
wusdPrice,
ytPrice
);
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,
wusdPrice: wusdPrice.toString(),
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. 为YTPriceFeed设置价格来源使用第一个vault");
console.log("3. 为每个vault设置初始价格");
console.log("4. 开始使用!");
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});