Files
assetxContracts/scripts/deploy/07-deployLending.ts
2025-12-22 14:12:50 +08:00

119 lines
4.7 KiB
TypeScript
Raw 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, upgrades } from "hardhat";
import * as fs from "fs";
import * as path from "path";
/**
* 部署 Lending 借贷池系统
* 包含LendingFactory, Configurator, Lending 实现和代理
*/
async function main() {
const [deployer] = await ethers.getSigners();
console.log("\n==========================================");
console.log("📦 部署 Lending 借贷池系统");
console.log("==========================================");
console.log("部署账户:", deployer.address);
console.log("账户余额:", ethers.formatEther(await ethers.provider.getBalance(deployer.address)), "ETH\n");
const deployments: any = {};
// ========== 第一阶段:部署工厂合约 ==========
console.log("📦 Phase 1: 部署 LendingFactory...");
const LendingFactory = await ethers.getContractFactory("LendingFactory");
const lendingFactory = await LendingFactory.deploy();
await lendingFactory.waitForDeployment();
const lendingFactoryAddress = await lendingFactory.getAddress();
console.log("✅ LendingFactory 已部署:", lendingFactoryAddress);
deployments.lendingFactory = lendingFactoryAddress;
// ========== 第二阶段:部署 Configurator ==========
console.log("\n📦 Phase 2: 部署 Configurator (UUPS 代理)...");
const Configurator = await ethers.getContractFactory("Configurator");
// 使用 upgrades 插件部署 UUPS 代理
const configurator = await upgrades.deployProxy(
Configurator,
[],
{
kind: "uups",
initializer: "initialize"
}
);
await configurator.waitForDeployment();
const configuratorProxyAddress = await configurator.getAddress();
console.log("✅ Configurator Proxy:", configuratorProxyAddress);
deployments.configuratorProxy = configuratorProxyAddress;
// 获取实现合约地址
const configuratorImplAddress = await upgrades.erc1967.getImplementationAddress(configuratorProxyAddress);
console.log("✅ Configurator Implementation:", configuratorImplAddress);
deployments.configuratorImpl = configuratorImplAddress;
console.log("✅ Configurator Owner:", await configurator.owner());
// ========== 第三阶段:部署 Lending 实现合约 ==========
console.log("\n📦 Phase 3: 通过工厂部署 Lending 实现合约...");
const deployTx = await lendingFactory.deploy();
const deployReceipt = await deployTx.wait();
// 使用 logs 和 interface.parseLog 解析事件
let lendingImplAddress;
for (const log of deployReceipt.logs) {
try {
const parsedLog = lendingFactory.interface.parseLog({
topics: [...log.topics],
data: log.data
});
if (parsedLog && parsedLog.name === 'LendingDeployed') {
lendingImplAddress = parsedLog.args.lending;
break;
}
} catch (e) {
// 忽略无法解析的日志
continue;
}
}
console.log("✅ Lending Implementation:", lendingImplAddress);
deployments.lendingImpl = lendingImplAddress;
// ========== 第四阶段:准备部署 Lending 代理 ==========
console.log("\n📦 Phase 4: 准备部署 Lending 代理(需要先配置参数)");
console.log("⚠️ 请运行配置脚本 08-configureLending.ts 来完成配置和代理部署");
// ========== 保存部署信息 ==========
const deploymentsPath = path.join(__dirname, "../../deployments-lending.json");
const existingDeployments = fs.existsSync(deploymentsPath)
? JSON.parse(fs.readFileSync(deploymentsPath, "utf-8"))
: {};
const network = await ethers.provider.getNetwork();
const chainId = network.chainId.toString();
existingDeployments[chainId] = {
...existingDeployments[chainId],
...deployments,
deployTimestamp: new Date().toISOString(),
deployer: deployer.address
};
fs.writeFileSync(deploymentsPath, JSON.stringify(existingDeployments, null, 2));
console.log("\n💾 部署信息已保存到:", deploymentsPath);
// ========== 部署总结 ==========
console.log("\n🎉 部署总结:");
console.log("=====================================");
console.log("LendingFactory: ", deployments.lendingFactory);
console.log("Configurator (Proxy): ", deployments.configuratorProxy);
console.log("Configurator (Impl): ", deployments.configuratorImpl);
console.log("Lending (Impl): ", deployments.lendingImpl);
console.log("=====================================\n");
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});