183 lines
7.0 KiB
TypeScript
183 lines
7.0 KiB
TypeScript
|
|
import { ethers, upgrades } from "hardhat";
|
|||
|
|
import * as fs from "fs";
|
|||
|
|
import * as path from "path";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 验证 YTAssetVault 升级结果
|
|||
|
|
*
|
|||
|
|
* 功能:
|
|||
|
|
* 1. 检查 Factory 的实现地址是否已更新
|
|||
|
|
* 2. 验证现有 Vault 的实现地址
|
|||
|
|
* 3. 测试新功能是否可用
|
|||
|
|
*/
|
|||
|
|
async function main() {
|
|||
|
|
console.log("\n==========================================");
|
|||
|
|
console.log("🔍 验证 YTAssetVault 升级结果");
|
|||
|
|
console.log("==========================================\n");
|
|||
|
|
|
|||
|
|
// ========== 读取部署信息 ==========
|
|||
|
|
const deploymentsPath = path.join(__dirname, "../../deployments-vault-system.json");
|
|||
|
|
if (!fs.existsSync(deploymentsPath)) {
|
|||
|
|
throw new Error("未找到部署信息文件");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const deployments = JSON.parse(fs.readFileSync(deploymentsPath, "utf-8"));
|
|||
|
|
const factory = await ethers.getContractAt(
|
|||
|
|
"YTAssetFactory",
|
|||
|
|
deployments.contracts.YTAssetFactory.proxy
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// ========== 验证 Factory ==========
|
|||
|
|
console.log("📋 验证 Factory 配置");
|
|||
|
|
console.log("=====================================");
|
|||
|
|
|
|||
|
|
const currentImplInFactory = await factory.vaultImplementation();
|
|||
|
|
const expectedImpl = deployments.contracts.YTAssetVault.implementation;
|
|||
|
|
|
|||
|
|
console.log("Factory Proxy: ", deployments.contracts.YTAssetFactory.proxy);
|
|||
|
|
console.log("当前 vaultImplementation:", currentImplInFactory);
|
|||
|
|
console.log("配置文件中的实现: ", expectedImpl);
|
|||
|
|
|
|||
|
|
if (currentImplInFactory.toLowerCase() === expectedImpl.toLowerCase()) {
|
|||
|
|
console.log("✅ Factory 配置正确!\n");
|
|||
|
|
} else {
|
|||
|
|
console.log("❌ Factory 配置不匹配!\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ========== 验证已部署的 Vaults ==========
|
|||
|
|
const vaults = deployments.vaults || [];
|
|||
|
|
|
|||
|
|
if (vaults.length === 0) {
|
|||
|
|
console.log("ℹ️ 没有已部署的 Vault\n");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log("📋 验证已部署的 Vaults");
|
|||
|
|
console.log("=====================================");
|
|||
|
|
console.log(`发现 ${vaults.length} 个 Vault\n`);
|
|||
|
|
|
|||
|
|
const results: any[] = [];
|
|||
|
|
|
|||
|
|
for (let i = 0; i < vaults.length; i++) {
|
|||
|
|
const vaultInfo = vaults[i];
|
|||
|
|
console.log(`[${i + 1}/${vaults.length}] 检查 ${vaultInfo.symbol} (${vaultInfo.address})`);
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 获取实现地址
|
|||
|
|
const implAddress = await upgrades.erc1967.getImplementationAddress(vaultInfo.address);
|
|||
|
|
const isUpgraded = implAddress.toLowerCase() === expectedImpl.toLowerCase();
|
|||
|
|
|
|||
|
|
console.log(` 实现地址: ${implAddress}`);
|
|||
|
|
console.log(` 状态: ${isUpgraded ? '✅ 已升级' : '⏸️ 未升级'}`);
|
|||
|
|
|
|||
|
|
// 如果已升级,测试新功能
|
|||
|
|
if (isUpgraded) {
|
|||
|
|
const vault = await ethers.getContractAt("YTAssetVault", vaultInfo.address);
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 测试新增的状态变量
|
|||
|
|
const pendingCount = await vault.pendingRequestsCount();
|
|||
|
|
const requestIdCounter = await vault.requestIdCounter();
|
|||
|
|
const processedUpToIndex = await vault.processedUpToIndex();
|
|||
|
|
|
|||
|
|
console.log(` 新功能验证:`);
|
|||
|
|
console.log(` - pendingRequestsCount: ${pendingCount}`);
|
|||
|
|
console.log(` - requestIdCounter: ${requestIdCounter}`);
|
|||
|
|
console.log(` - processedUpToIndex: ${processedUpToIndex}`);
|
|||
|
|
|
|||
|
|
// 测试新增的查询函数
|
|||
|
|
const queueProgress = await vault.getQueueProgress();
|
|||
|
|
console.log(` - 队列进度: ${queueProgress[0]}/${queueProgress[1]} (待处理: ${queueProgress[2]})`);
|
|||
|
|
|
|||
|
|
console.log(` ✅ 新功能工作正常`);
|
|||
|
|
|
|||
|
|
results.push({
|
|||
|
|
index: i,
|
|||
|
|
symbol: vaultInfo.symbol,
|
|||
|
|
address: vaultInfo.address,
|
|||
|
|
upgraded: true,
|
|||
|
|
functional: true
|
|||
|
|
});
|
|||
|
|
} catch (error: any) {
|
|||
|
|
console.log(` ⚠️ 新功能测试失败: ${error.message}`);
|
|||
|
|
results.push({
|
|||
|
|
index: i,
|
|||
|
|
symbol: vaultInfo.symbol,
|
|||
|
|
address: vaultInfo.address,
|
|||
|
|
upgraded: true,
|
|||
|
|
functional: false,
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
results.push({
|
|||
|
|
index: i,
|
|||
|
|
symbol: vaultInfo.symbol,
|
|||
|
|
address: vaultInfo.address,
|
|||
|
|
upgraded: false,
|
|||
|
|
functional: false
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
} catch (error: any) {
|
|||
|
|
console.log(` ❌ 检查失败: ${error.message}`);
|
|||
|
|
results.push({
|
|||
|
|
index: i,
|
|||
|
|
symbol: vaultInfo.symbol,
|
|||
|
|
address: vaultInfo.address,
|
|||
|
|
upgraded: false,
|
|||
|
|
functional: false,
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
console.log("");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ========== 验证总结 ==========
|
|||
|
|
console.log("📊 验证总结");
|
|||
|
|
console.log("=====================================");
|
|||
|
|
|
|||
|
|
const upgraded = results.filter(r => r.upgraded);
|
|||
|
|
const functional = results.filter(r => r.functional);
|
|||
|
|
const needsUpgrade = results.filter(r => !r.upgraded);
|
|||
|
|
|
|||
|
|
console.log(`总 Vaults 数量: ${results.length}`);
|
|||
|
|
console.log(`已升级: ${upgraded.length} ✅`);
|
|||
|
|
console.log(`功能正常: ${functional.length} ✅`);
|
|||
|
|
console.log(`待升级: ${needsUpgrade.length} ${needsUpgrade.length > 0 ? '⏸️' : ''}`);
|
|||
|
|
console.log("");
|
|||
|
|
|
|||
|
|
if (needsUpgrade.length > 0) {
|
|||
|
|
console.log("⏸️ 待升级的 Vaults:");
|
|||
|
|
needsUpgrade.forEach(v => {
|
|||
|
|
console.log(` [${v.index}] ${v.symbol}: ${v.address}`);
|
|||
|
|
});
|
|||
|
|
console.log("");
|
|||
|
|
console.log("💡 升级命令:");
|
|||
|
|
console.log(` factory.upgradeVault("vaultAddress", "${expectedImpl}")`);
|
|||
|
|
console.log("");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ========== 升级历史 ==========
|
|||
|
|
if (deployments.upgradeHistory && deployments.upgradeHistory.length > 0) {
|
|||
|
|
console.log("📜 升级历史");
|
|||
|
|
console.log("=====================================");
|
|||
|
|
deployments.upgradeHistory.forEach((h: any, idx: number) => {
|
|||
|
|
console.log(`[${idx + 1}] ${h.timestamp}`);
|
|||
|
|
console.log(` 升级者: ${h.upgrader}`);
|
|||
|
|
console.log(` 旧实现: ${h.oldImplementation}`);
|
|||
|
|
console.log(` 新实现: ${h.newImplementation}`);
|
|||
|
|
});
|
|||
|
|
console.log("");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log("✅ 验证完成!\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main()
|
|||
|
|
.then(() => process.exit(0))
|
|||
|
|
.catch((error) => {
|
|||
|
|
console.error(error);
|
|||
|
|
process.exit(1);
|
|||
|
|
});
|
|||
|
|
|