gate-evm-tools 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +239 -0
- package/bin/cli.js +9 -0
- package/contractInfo.example.json +5 -0
- package/dist/commands/check.d.ts +6 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +177 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +97 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +108 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/bytecodeChecker.d.ts +105 -0
- package/dist/core/bytecodeChecker.d.ts.map +1 -0
- package/dist/core/bytecodeChecker.js +413 -0
- package/dist/core/bytecodeChecker.js.map +1 -0
- package/dist/core/syncUpgradeJson.d.ts +23 -0
- package/dist/core/syncUpgradeJson.d.ts.map +1 -0
- package/dist/core/syncUpgradeJson.js +260 -0
- package/dist/core/syncUpgradeJson.js.map +1 -0
- package/dist/core/validateAndGenerateCalldata.d.ts +26 -0
- package/dist/core/validateAndGenerateCalldata.d.ts.map +1 -0
- package/dist/core/validateAndGenerateCalldata.js +235 -0
- package/dist/core/validateAndGenerateCalldata.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/files.d.ts +18 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +75 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/output.d.ts +14 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +67 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface SyncOptions {
|
|
2
|
+
proxyAddress: string;
|
|
3
|
+
contractName: string;
|
|
4
|
+
networkName?: string;
|
|
5
|
+
hre: any;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 同步链上合约状态到本地 .openzeppelin 网络文件
|
|
9
|
+
*
|
|
10
|
+
* 使用场景:
|
|
11
|
+
* 当合约升级是通过 calldata 方式由其他人执行时,本地的 .openzeppelin 文件不会自动更新
|
|
12
|
+
* 使用此脚本可以从链上读取最新状态并更新本地文件,确保下次升级验证时有正确的参考
|
|
13
|
+
*
|
|
14
|
+
* @param options - 同步选项
|
|
15
|
+
*/
|
|
16
|
+
export declare function syncNetworkFile(options: SyncOptions): Promise<{
|
|
17
|
+
proxyAddress: string;
|
|
18
|
+
implementationAddress: string;
|
|
19
|
+
layoutHash: string;
|
|
20
|
+
networkFile: string;
|
|
21
|
+
success: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=syncUpgradeJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncUpgradeJson.d.ts","sourceRoot":"","sources":["../../src/core/syncUpgradeJson.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,GAAG,CAAC;CACV;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW;;;;;;GA0RzD"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* 同步链上合约状态到本地 .openzeppelin 网络文件
|
|
5
|
+
*
|
|
6
|
+
* 使用场景:
|
|
7
|
+
* 当合约升级是通过 calldata 方式由其他人执行时,本地的 .openzeppelin 文件不会自动更新
|
|
8
|
+
* 使用此脚本可以从链上读取最新状态并更新本地文件,确保下次升级验证时有正确的参考
|
|
9
|
+
*
|
|
10
|
+
* @param options - 同步选项
|
|
11
|
+
*/
|
|
12
|
+
export async function syncNetworkFile(options) {
|
|
13
|
+
const { proxyAddress, contractName, networkName, hre } = options;
|
|
14
|
+
console.log('\n🔄 开始同步链上状态到本地网络文件...');
|
|
15
|
+
console.log('=====================================\n');
|
|
16
|
+
const PROXY_ADDRESS = proxyAddress;
|
|
17
|
+
const CONTRACT_NAME = contractName;
|
|
18
|
+
// 获取网络名称和 chainId
|
|
19
|
+
const network = await hre.ethers.provider.getNetwork();
|
|
20
|
+
const chainId = Number(network.chainId);
|
|
21
|
+
const NETWORK_NAME = networkName || network.name;
|
|
22
|
+
console.log('📋 同步配置:');
|
|
23
|
+
console.log('-------------------------------------');
|
|
24
|
+
console.log('代理合约地址:', PROXY_ADDRESS);
|
|
25
|
+
console.log('合约名称:', CONTRACT_NAME);
|
|
26
|
+
console.log('网络:', NETWORK_NAME);
|
|
27
|
+
console.log('Chain ID:', chainId);
|
|
28
|
+
console.log('-------------------------------------\n');
|
|
29
|
+
// Step 1: 编译合约以获取最新的存储布局
|
|
30
|
+
console.log('🔨 Step 1: 编译合约获取存储布局...');
|
|
31
|
+
try {
|
|
32
|
+
await hre.run('compile', { quiet: true });
|
|
33
|
+
console.log('✅ 编译完成\n');
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('❌ 编译失败:', error.message);
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
// Step 2: 从链上读取当前实现合约地址
|
|
40
|
+
console.log('🔍 Step 2: 读取链上实现合约地址...');
|
|
41
|
+
let currentImplementation;
|
|
42
|
+
try {
|
|
43
|
+
currentImplementation = await hre.upgrades.erc1967.getImplementationAddress(PROXY_ADDRESS);
|
|
44
|
+
console.log('✅ 当前实现合约:', currentImplementation);
|
|
45
|
+
console.log('');
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('❌ 读取实现地址失败:', error.message);
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
// Step 3: 获取实现合约的部署交易哈希(尝试从事件获取)
|
|
52
|
+
console.log('🔍 Step 3: 获取实现合约部署信息...');
|
|
53
|
+
let implTxHash = '0x0'; // 默认值,如果无法获取
|
|
54
|
+
try {
|
|
55
|
+
// 尝试通过 Upgraded 事件获取升级交易哈希
|
|
56
|
+
const proxyContract = await hre.ethers.getContractAt('UUPSUpgradeable', PROXY_ADDRESS);
|
|
57
|
+
const currentBlock = await hre.ethers.provider.getBlockNumber();
|
|
58
|
+
// 免费 RPC 节点通常限制查询范围,使用较小的区块范围
|
|
59
|
+
// 可以分批查询,从最近的区块开始往前查
|
|
60
|
+
const batchSize = 5000; // 每次查询 5000 个区块
|
|
61
|
+
const maxBatches = 3000; // 最多查 3000 批(15000000 个区块)
|
|
62
|
+
let found = false;
|
|
63
|
+
for (let i = 0; i < maxBatches && !found; i++) {
|
|
64
|
+
const toBlock = currentBlock - (i * batchSize);
|
|
65
|
+
const fromBlock = Math.max(0, toBlock - batchSize);
|
|
66
|
+
try {
|
|
67
|
+
const filter = proxyContract.filters.Upgraded();
|
|
68
|
+
const events = await proxyContract.queryFilter(filter, fromBlock, toBlock);
|
|
69
|
+
if (events.length > 0) {
|
|
70
|
+
// 找到最后一次升级到当前实现的事件
|
|
71
|
+
const latestUpgrade = events
|
|
72
|
+
.reverse()
|
|
73
|
+
.find((event) => event.args && event.args[0].toLowerCase() === currentImplementation.toLowerCase());
|
|
74
|
+
if (latestUpgrade) {
|
|
75
|
+
implTxHash = latestUpgrade.transactionHash;
|
|
76
|
+
console.log('✅ 找到升级交易:', implTxHash);
|
|
77
|
+
found = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (batchError) {
|
|
83
|
+
if (i === 0) {
|
|
84
|
+
console.log(`⚠️ 查询区块范围 ${fromBlock}-${toBlock} 失败: ${batchError.message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!found) {
|
|
89
|
+
console.log('⚠️ 未找到对应的升级事件(可能需要查询更早的区块),使用默认交易哈希');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.log('⚠️ 获取交易哈希失败,使用默认值:', error.message);
|
|
94
|
+
}
|
|
95
|
+
console.log('');
|
|
96
|
+
// Step 4: 使用 OpenZeppelin 官方的 forceImport 方法同步状态
|
|
97
|
+
console.log('📊 Step 4: 使用 forceImport 同步链上状态...');
|
|
98
|
+
console.log(' 这会自动更新 .openzeppelin 文件,包括完整的存储布局和命名空间');
|
|
99
|
+
console.log('');
|
|
100
|
+
try {
|
|
101
|
+
const ContractFactory = await hre.ethers.getContractFactory(CONTRACT_NAME);
|
|
102
|
+
// forceImport: 强制导入已存在的代理,更新本地 .openzeppelin 文件
|
|
103
|
+
// 这是 OpenZeppelin 官方推荐的同步方式
|
|
104
|
+
await hre.upgrades.forceImport(PROXY_ADDRESS, ContractFactory, {
|
|
105
|
+
kind: 'uups'
|
|
106
|
+
});
|
|
107
|
+
console.log('✅ forceImport 完成!');
|
|
108
|
+
console.log('');
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error('❌ forceImport 失败:', error.message);
|
|
112
|
+
console.error('');
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
// Step 5: 查找正确的网络文件并补充交易哈希
|
|
116
|
+
console.log('📊 Step 5: 查找网络文件并补充交易哈希...');
|
|
117
|
+
const openzeppelinDir = path.join(process.cwd(), '.openzeppelin');
|
|
118
|
+
// 查找实际的网络文件
|
|
119
|
+
// OpenZeppelin 插件可能生成不同格式的文件名
|
|
120
|
+
let networkFilePath = null;
|
|
121
|
+
let actualNetworkName = NETWORK_NAME;
|
|
122
|
+
if (fs.existsSync(openzeppelinDir)) {
|
|
123
|
+
// 可能的文件名列表(按优先级)
|
|
124
|
+
const possibleFileNames = [
|
|
125
|
+
`${NETWORK_NAME}.json`, // 优先使用指定的网络名
|
|
126
|
+
`${network.name}.json`, // 使用 ethers 返回的网络名
|
|
127
|
+
`unknown-${chainId}.json`, // 未知网络格式
|
|
128
|
+
];
|
|
129
|
+
// 如果网络名是 'unknown',优先使用 chainId 格式
|
|
130
|
+
if (network.name === 'unknown' || NETWORK_NAME.startsWith('unknown')) {
|
|
131
|
+
possibleFileNames.unshift(`unknown-${chainId}.json`);
|
|
132
|
+
}
|
|
133
|
+
// 查找存在的文件
|
|
134
|
+
for (const fileName of possibleFileNames) {
|
|
135
|
+
const filePath = path.join(openzeppelinDir, fileName);
|
|
136
|
+
if (fs.existsSync(filePath)) {
|
|
137
|
+
networkFilePath = filePath;
|
|
138
|
+
actualNetworkName = fileName.replace('.json', '');
|
|
139
|
+
console.log(' ✅ 找到网络文件:', fileName);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// 如果都不存在,列出目录下的所有文件帮助调试
|
|
144
|
+
if (!networkFilePath) {
|
|
145
|
+
const files = fs.readdirSync(openzeppelinDir).filter(f => f.endsWith('.json'));
|
|
146
|
+
if (files.length > 0) {
|
|
147
|
+
console.log(' ⚠️ 未找到匹配的网络文件,但目录下存在以下文件:');
|
|
148
|
+
files.forEach(f => console.log(` - ${f}`));
|
|
149
|
+
// 尝试通过 chainId 智能匹配
|
|
150
|
+
const matchedFile = files.find(f => f.includes(`-${chainId}.json`) || f === `unknown-${chainId}.json`);
|
|
151
|
+
if (matchedFile) {
|
|
152
|
+
networkFilePath = path.join(openzeppelinDir, matchedFile);
|
|
153
|
+
actualNetworkName = matchedFile.replace('.json', '');
|
|
154
|
+
console.log(` ✅ 通过 chainId 匹配到文件: ${matchedFile}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!networkFilePath || !fs.existsSync(networkFilePath)) {
|
|
160
|
+
const error = new Error('未找到 .openzeppelin 网络文件');
|
|
161
|
+
console.error('❌ 错误: 未找到 .openzeppelin 网络文件');
|
|
162
|
+
console.error(' 预期文件名:');
|
|
163
|
+
console.error(` - ${NETWORK_NAME}.json`);
|
|
164
|
+
console.error(` - unknown-${chainId}.json`);
|
|
165
|
+
console.error(' 请确认 forceImport 已成功执行');
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
console.log(' 📄 使用网络文件:', actualNetworkName + '.json');
|
|
169
|
+
console.log('');
|
|
170
|
+
let networkFile = JSON.parse(fs.readFileSync(networkFilePath, 'utf8'));
|
|
171
|
+
// 查找当前代理的实现信息
|
|
172
|
+
const proxyInfo = networkFile.proxies?.find((p) => p.address.toLowerCase() === PROXY_ADDRESS.toLowerCase());
|
|
173
|
+
if (!proxyInfo) {
|
|
174
|
+
const error = new Error('代理信息未找到');
|
|
175
|
+
console.error('❌ 错误: 代理信息未找到');
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
// 查找实现合约的布局信息
|
|
179
|
+
let layoutInfo = null;
|
|
180
|
+
let layoutHash = '';
|
|
181
|
+
let needsSave = false;
|
|
182
|
+
for (const [hash, impl] of Object.entries(networkFile.impls || {})) {
|
|
183
|
+
const implData = impl;
|
|
184
|
+
if (implData.address.toLowerCase() === currentImplementation.toLowerCase()) {
|
|
185
|
+
layoutHash = hash;
|
|
186
|
+
layoutInfo = implData.layout;
|
|
187
|
+
// 检查并补充交易哈希
|
|
188
|
+
if (!implData.txHash && implTxHash && implTxHash !== '0x0') {
|
|
189
|
+
console.log(' 💾 补充交易哈希到记录...');
|
|
190
|
+
console.log(' 交易哈希:', implTxHash);
|
|
191
|
+
// 重新构建对象,确保字段顺序:address -> txHash -> layout
|
|
192
|
+
const newImpl = {
|
|
193
|
+
address: implData.address,
|
|
194
|
+
txHash: implTxHash,
|
|
195
|
+
layout: implData.layout
|
|
196
|
+
};
|
|
197
|
+
// 替换原有的实现记录
|
|
198
|
+
networkFile.impls[hash] = newImpl;
|
|
199
|
+
needsSave = true;
|
|
200
|
+
}
|
|
201
|
+
else if (implData.txHash) {
|
|
202
|
+
console.log(' ✅ 交易哈希已存在:', implData.txHash);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.log(' ⚠️ 未获取到交易哈希');
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// 保存更新后的文件
|
|
211
|
+
if (needsSave) {
|
|
212
|
+
try {
|
|
213
|
+
fs.writeFileSync(networkFilePath, JSON.stringify(networkFile, null, 2));
|
|
214
|
+
console.log(' 💾 文件已保存');
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
console.error(' ❌ 保存文件失败:', error.message);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
console.log('');
|
|
221
|
+
if (!layoutInfo) {
|
|
222
|
+
const error = new Error('未找到实现合约的布局信息');
|
|
223
|
+
console.error('❌ 错误: 未找到实现合约的布局信息');
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
console.log('✅ 同步结果验证通过!');
|
|
227
|
+
console.log('');
|
|
228
|
+
// 总结
|
|
229
|
+
console.log('=====================================');
|
|
230
|
+
console.log('✅ 同步完成!');
|
|
231
|
+
console.log('=====================================');
|
|
232
|
+
console.log('');
|
|
233
|
+
console.log('📋 同步摘要:');
|
|
234
|
+
console.log('-------------------------------------');
|
|
235
|
+
console.log('代理合约:', PROXY_ADDRESS);
|
|
236
|
+
console.log('实现合约:', currentImplementation);
|
|
237
|
+
console.log('布局哈希:', layoutHash.substring(0, 16) + '...');
|
|
238
|
+
console.log('存储变量:', layoutInfo.storage?.length || 0, '个');
|
|
239
|
+
console.log('命名空间:', Object.keys(layoutInfo.namespaces || {}).length, '个');
|
|
240
|
+
console.log('类型定义:', Object.keys(layoutInfo.types || {}).length, '个');
|
|
241
|
+
console.log('网络文件:', networkFilePath);
|
|
242
|
+
console.log('-------------------------------------');
|
|
243
|
+
console.log('');
|
|
244
|
+
// 显示命名空间详情
|
|
245
|
+
if (layoutInfo.namespaces && Object.keys(layoutInfo.namespaces).length > 0) {
|
|
246
|
+
console.log('📦 命名空间详情:');
|
|
247
|
+
for (const [namespace, vars] of Object.entries(layoutInfo.namespaces)) {
|
|
248
|
+
console.log(` - ${namespace}: ${vars.length} 个变量`);
|
|
249
|
+
}
|
|
250
|
+
console.log('');
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
proxyAddress: PROXY_ADDRESS,
|
|
254
|
+
implementationAddress: currentImplementation,
|
|
255
|
+
layoutHash: layoutHash.substring(0, 16) + '...',
|
|
256
|
+
networkFile: networkFilePath,
|
|
257
|
+
success: true
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=syncUpgradeJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncUpgradeJson.js","sourceRoot":"","sources":["../../src/core/syncUpgradeJson.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface ValidateOptions {
|
|
2
|
+
proxyAddress: string;
|
|
3
|
+
oldContractName: string;
|
|
4
|
+
newContractName: string;
|
|
5
|
+
outputPath?: string;
|
|
6
|
+
hre: any;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 验证升级合约的安全性并生成 upgradeToAndCall 的 calldata
|
|
10
|
+
* 不执行实际的升级操作
|
|
11
|
+
*
|
|
12
|
+
* 支持两种升级模式:
|
|
13
|
+
* 1. 同一合约升级:直接修改现有合约文件(如 CounterUUPS.sol),OLD 和 NEW 使用相同的合约名称
|
|
14
|
+
* 2. 不同合约升级:从一个合约升级到另一个合约(如 CounterUUPS -> CounterUUPSV2)
|
|
15
|
+
*
|
|
16
|
+
* @param options - 验证选项
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateAndGenerateCalldata(options: ValidateOptions): Promise<{
|
|
19
|
+
proxyAddress: string;
|
|
20
|
+
oldImplementation: string;
|
|
21
|
+
newImplementation: any;
|
|
22
|
+
calldata: any;
|
|
23
|
+
outputFile: string;
|
|
24
|
+
success: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=validateAndGenerateCalldata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAndGenerateCalldata.d.ts","sourceRoot":"","sources":["../../src/core/validateAndGenerateCalldata.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;CACV;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,eAAe;;;;;;;GAiQzE"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { validateUpgradeSafety } from '@openzeppelin/upgrades-core';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
/**
|
|
5
|
+
* 验证升级合约的安全性并生成 upgradeToAndCall 的 calldata
|
|
6
|
+
* 不执行实际的升级操作
|
|
7
|
+
*
|
|
8
|
+
* 支持两种升级模式:
|
|
9
|
+
* 1. 同一合约升级:直接修改现有合约文件(如 CounterUUPS.sol),OLD 和 NEW 使用相同的合约名称
|
|
10
|
+
* 2. 不同合约升级:从一个合约升级到另一个合约(如 CounterUUPS -> CounterUUPSV2)
|
|
11
|
+
*
|
|
12
|
+
* @param options - 验证选项
|
|
13
|
+
*/
|
|
14
|
+
export async function validateAndGenerateCalldata(options) {
|
|
15
|
+
const { proxyAddress, oldContractName, newContractName, outputPath, hre } = options;
|
|
16
|
+
const PROXY_ADDRESS = proxyAddress;
|
|
17
|
+
const OLD_CONTRACT_NAME = oldContractName;
|
|
18
|
+
const NEW_CONTRACT_NAME = newContractName;
|
|
19
|
+
console.log('\n🔍 开始升级安全性验证流程...');
|
|
20
|
+
console.log('=====================================\n');
|
|
21
|
+
// 检查是否是同一个合约的升级
|
|
22
|
+
const isSameContract = OLD_CONTRACT_NAME === NEW_CONTRACT_NAME;
|
|
23
|
+
if (isSameContract) {
|
|
24
|
+
console.log('📌 检测到同一合约升级模式(修改现有合约)');
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log('📌 检测到不同合约升级模式(从 A 升级到 B)');
|
|
28
|
+
}
|
|
29
|
+
console.log('');
|
|
30
|
+
// Step 0: 清理并编译合约生成 build-info
|
|
31
|
+
console.log('🔨 Step 0: 清理并编译合约...');
|
|
32
|
+
const buildInfoDir = path.join(process.cwd(), 'artifacts/build-info');
|
|
33
|
+
try {
|
|
34
|
+
console.log(' 🧹 清理旧的编译文件...');
|
|
35
|
+
await hre.run('clean');
|
|
36
|
+
console.log(' 🔧 编译合约...');
|
|
37
|
+
await hre.run('compile', { quiet: true });
|
|
38
|
+
console.log(' ✅ 编译完成\n');
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(' ❌ 编译失败:', error.message);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
// 检查 build-info 文件
|
|
45
|
+
if (!fs.existsSync(buildInfoDir)) {
|
|
46
|
+
const error = new Error('build-info 目录不存在');
|
|
47
|
+
console.error('❌ 错误: build-info 目录不存在');
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
const buildInfoFiles = fs.readdirSync(buildInfoDir).filter(f => f.endsWith('.json'));
|
|
51
|
+
if (buildInfoFiles.length === 0) {
|
|
52
|
+
const error = new Error('build-info 目录中没有文件');
|
|
53
|
+
console.error('❌ 错误: build-info 目录中没有文件');
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
console.log(`📂 找到 ${buildInfoFiles.length} 个 build-info 文件\n`);
|
|
57
|
+
// 从链上读取当前实现合约地址
|
|
58
|
+
let OLD_IMPLEMENTATION;
|
|
59
|
+
try {
|
|
60
|
+
OLD_IMPLEMENTATION = await hre.upgrades.erc1967.getImplementationAddress(PROXY_ADDRESS);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.log('⚠️ 通过 upgrades.erc1967 获取实现地址失败,尝试手动读取...');
|
|
64
|
+
const implementationSlot = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
|
|
65
|
+
const rawImplementationAddress = await hre.ethers.provider.getStorage(PROXY_ADDRESS, implementationSlot);
|
|
66
|
+
OLD_IMPLEMENTATION = '0x' + rawImplementationAddress.slice(-40);
|
|
67
|
+
}
|
|
68
|
+
console.log('📋 当前合约信息:');
|
|
69
|
+
console.log('=====================================');
|
|
70
|
+
console.log('代理合约地址:', PROXY_ADDRESS);
|
|
71
|
+
console.log('当前实现地址:', OLD_IMPLEMENTATION);
|
|
72
|
+
console.log('=====================================\n');
|
|
73
|
+
// Step 1: 部署新的实现合约(不升级代理)
|
|
74
|
+
console.log(`📦 Step 1: 部署新的实现合约(${NEW_CONTRACT_NAME})...`);
|
|
75
|
+
const NewContractFactory = await hre.ethers.getContractFactory(NEW_CONTRACT_NAME);
|
|
76
|
+
// 只部署实现合约,不通过代理
|
|
77
|
+
const newImplementation = await NewContractFactory.deploy();
|
|
78
|
+
await newImplementation.waitForDeployment();
|
|
79
|
+
const newImplementationAddress = await newImplementation.getAddress();
|
|
80
|
+
console.log('✅ 新实现合约部署完成:', newImplementationAddress);
|
|
81
|
+
console.log('');
|
|
82
|
+
// Step 2: 验证升级安全性
|
|
83
|
+
console.log('🔐 Step 2: 验证升级安全性...');
|
|
84
|
+
console.log('');
|
|
85
|
+
// 对于同一合约升级,validateUpgradeSafety 不支持(因为完全限定名相同)
|
|
86
|
+
// 我们跳过这一步,直接使用 Hardhat Upgrades 插件验证
|
|
87
|
+
if (isSameContract) {
|
|
88
|
+
console.log('📌 检测到同一合约升级,跳过 validateUpgradeSafety');
|
|
89
|
+
console.log(' 原因: OpenZeppelin 的 validateUpgradeSafety 不支持同名合约的比较');
|
|
90
|
+
console.log(' 将使用 Hardhat Upgrades 插件的链上验证(Step 3)');
|
|
91
|
+
console.log('');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// 不同合约升级,使用 validateUpgradeSafety 进行验证
|
|
95
|
+
try {
|
|
96
|
+
// 动态从 build-info 文件中查找合约的完全限定名
|
|
97
|
+
const findContractFQN = (contractName, searchDir) => {
|
|
98
|
+
const buildInfoFiles = fs.readdirSync(searchDir).filter(f => f.endsWith('.json'));
|
|
99
|
+
for (const file of buildInfoFiles) {
|
|
100
|
+
const buildInfoPath = path.join(searchDir, file);
|
|
101
|
+
const buildInfo = JSON.parse(fs.readFileSync(buildInfoPath, 'utf8'));
|
|
102
|
+
// 遍历 build-info 中的所有合约
|
|
103
|
+
const contracts = buildInfo.output?.contracts || {};
|
|
104
|
+
for (const [sourcePath, sourceContracts] of Object.entries(contracts)) {
|
|
105
|
+
if (typeof sourceContracts === 'object' && sourceContracts !== null) {
|
|
106
|
+
for (const contractNameInSource of Object.keys(sourceContracts)) {
|
|
107
|
+
if (contractNameInSource === contractName) {
|
|
108
|
+
// 找到匹配的合约,返回完全限定名
|
|
109
|
+
return `${sourcePath}:${contractName}`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw new Error(`未找到合约 ${contractName} 的完全限定名(搜索目录: ${searchDir})`);
|
|
116
|
+
};
|
|
117
|
+
const newContractFQN = findContractFQN(NEW_CONTRACT_NAME, buildInfoDir);
|
|
118
|
+
const oldContractFQN = findContractFQN(OLD_CONTRACT_NAME, buildInfoDir);
|
|
119
|
+
console.log('🔍 自动识别的完全限定名:');
|
|
120
|
+
console.log(' 新合约:', newContractFQN);
|
|
121
|
+
console.log(' 旧合约:', oldContractFQN);
|
|
122
|
+
console.log('');
|
|
123
|
+
const report = await validateUpgradeSafety(buildInfoDir, newContractFQN, oldContractFQN, {
|
|
124
|
+
unsafeAllow: ["delegatecall"],
|
|
125
|
+
unsafeAllowRenames: false,
|
|
126
|
+
unsafeSkipStorageCheck: false,
|
|
127
|
+
});
|
|
128
|
+
console.log('📊 验证报告:');
|
|
129
|
+
console.log('=====================================');
|
|
130
|
+
console.log('验证结果:', report.ok ? '✅ 通过' : '❌ 失败');
|
|
131
|
+
console.log('已通过的合约数量:', report.numPassed);
|
|
132
|
+
console.log('总合约数量:', report.numTotal);
|
|
133
|
+
if (!report.ok) {
|
|
134
|
+
console.log('');
|
|
135
|
+
console.log('❌ 发现升级风险:');
|
|
136
|
+
console.log(report.explain(true));
|
|
137
|
+
console.log('');
|
|
138
|
+
console.log('⚠️ 升级存在风险,不建议继续!');
|
|
139
|
+
const error = new Error('升级存在风险');
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
console.log('✅ 升级安全性验证通过!');
|
|
143
|
+
console.log('=====================================\n');
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('❌ 验证过程出错:', error.message);
|
|
147
|
+
console.error('详细错误:', error);
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Step 3: 使用 Hardhat Upgrades 插件进行验证
|
|
152
|
+
if (isSameContract) {
|
|
153
|
+
console.log('🔐 Step 3: 使用 Hardhat Upgrades 插件进行链上验证(主要验证)...');
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log('🔐 Step 3: 使用 Hardhat Upgrades 插件进行额外验证...');
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
// 验证新实现合约是否可以安全升级
|
|
160
|
+
// 这会从链上读取当前实现合约并与新合约进行比较
|
|
161
|
+
await hre.upgrades.validateUpgrade(PROXY_ADDRESS, NewContractFactory, {
|
|
162
|
+
kind: 'uups'
|
|
163
|
+
});
|
|
164
|
+
console.log('✅ Hardhat Upgrades 插件验证通过!');
|
|
165
|
+
if (isSameContract) {
|
|
166
|
+
console.log(' ℹ️ 已验证:存储布局兼容、无危险操作、升级安全');
|
|
167
|
+
}
|
|
168
|
+
console.log('');
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.error('❌ Hardhat Upgrades 验证失败:', error.message);
|
|
172
|
+
console.error('');
|
|
173
|
+
console.error('⚠️ 升级存在风险,不建议继续!');
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
// Step 4: 生成 upgradeToAndCall 的 calldata
|
|
177
|
+
console.log('📝 Step 4: 生成 upgradeToAndCall calldata...');
|
|
178
|
+
// 准备初始化数据(如果升级后需要调用某个函数)
|
|
179
|
+
// 这里我们不需要调用任何初始化函数,所以传空数据
|
|
180
|
+
const initData = '0x'; // 空数据,如果需要调用函数可以使用: NewContractFactory.interface.encodeFunctionData('functionName', [args])
|
|
181
|
+
// 如果需要在升级后立即调用某个函数,可以这样生成 calldata:
|
|
182
|
+
// const initData = NewContractFactory.interface.encodeFunctionData('setY', [100]);
|
|
183
|
+
// 生成 upgradeToAndCall 的 calldata
|
|
184
|
+
// upgradeToAndCall(address newImplementation, bytes memory data)
|
|
185
|
+
const upgradeInterface = new hre.ethers.Interface([
|
|
186
|
+
'function upgradeToAndCall(address newImplementation, bytes memory data) payable'
|
|
187
|
+
]);
|
|
188
|
+
const upgradeCalldata = upgradeInterface.encodeFunctionData('upgradeToAndCall', [
|
|
189
|
+
newImplementationAddress,
|
|
190
|
+
initData
|
|
191
|
+
]);
|
|
192
|
+
console.log('');
|
|
193
|
+
console.log('✅ Calldata 生成完成!');
|
|
194
|
+
console.log('=====================================');
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log('📋 升级信息摘要:');
|
|
197
|
+
console.log('-------------------------------------');
|
|
198
|
+
console.log('代理合约地址:', PROXY_ADDRESS);
|
|
199
|
+
console.log('旧实现合约:', OLD_IMPLEMENTATION);
|
|
200
|
+
console.log('新实现合约:', newImplementationAddress);
|
|
201
|
+
console.log('');
|
|
202
|
+
console.log('🔧 upgradeToAndCall:');
|
|
203
|
+
console.log('-------------------------------------');
|
|
204
|
+
console.log('Target:', PROXY_ADDRESS);
|
|
205
|
+
console.log('Calldata:', upgradeCalldata);
|
|
206
|
+
console.log('');
|
|
207
|
+
console.log('=====================================');
|
|
208
|
+
console.log('');
|
|
209
|
+
// 保存到文件
|
|
210
|
+
const outputData = {
|
|
211
|
+
proxyAddress: PROXY_ADDRESS,
|
|
212
|
+
oldImplementation: OLD_IMPLEMENTATION,
|
|
213
|
+
newImplementation: newImplementationAddress,
|
|
214
|
+
upgradeToAndCall: {
|
|
215
|
+
target: PROXY_ADDRESS,
|
|
216
|
+
calldata: upgradeCalldata
|
|
217
|
+
},
|
|
218
|
+
timestamp: new Date().toISOString(),
|
|
219
|
+
network: (await hre.ethers.provider.getNetwork()).name
|
|
220
|
+
};
|
|
221
|
+
const finalOutputPath = outputPath || path.join(process.cwd(), 'upgradeCalldata.json');
|
|
222
|
+
fs.writeFileSync(finalOutputPath, JSON.stringify(outputData, null, 2));
|
|
223
|
+
console.log('💾 升级信息已保存到:', finalOutputPath);
|
|
224
|
+
console.log('');
|
|
225
|
+
console.log('=====================================\n');
|
|
226
|
+
return {
|
|
227
|
+
proxyAddress: PROXY_ADDRESS,
|
|
228
|
+
oldImplementation: OLD_IMPLEMENTATION,
|
|
229
|
+
newImplementation: newImplementationAddress,
|
|
230
|
+
calldata: upgradeCalldata,
|
|
231
|
+
outputFile: finalOutputPath,
|
|
232
|
+
success: true
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=validateAndGenerateCalldata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAndGenerateCalldata.js","sourceRoot":"","sources":["../../src/core/validateAndGenerateCalldata.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgFA,wBAAsB,GAAG,kBAOxB"}
|