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
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 kiro
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Gate Smart Contract Tools
|
|
2
|
+
|
|
3
|
+
🛠️ Gate 智能合约工具集 - 字节码检查、合约升级验证、合约状态同步
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
### 🔍 字节码检查(check)
|
|
8
|
+
- ✅ 检查链下合约代码和链上合约代码是否一致
|
|
9
|
+
- ✅ 支持检查单个合约、指定网络或所有合约
|
|
10
|
+
- ✅ 智能识别 Constructor 参数差异和 Immutable 变量差异
|
|
11
|
+
- ✅ 自动移除元数据进行比较
|
|
12
|
+
- ✅ 生成详细的 JSON 报告
|
|
13
|
+
- ✅ 支持增量更新报告
|
|
14
|
+
|
|
15
|
+
### 🔄 合约状态同步(sync)
|
|
16
|
+
- ✅ 同步链上合约状态到本地 .openzeppelin 文件
|
|
17
|
+
- ✅ 自动读取链上实现合约地址
|
|
18
|
+
- ✅ 获取并更新存储布局信息
|
|
19
|
+
|
|
20
|
+
### ✅ 升级验证(validate)
|
|
21
|
+
- ✅ 验证合约升级的安全性
|
|
22
|
+
- ✅ 检查存储布局兼容性
|
|
23
|
+
- ✅ 自动部署新实现合约
|
|
24
|
+
- ✅ 生成 upgradeToAndCall 的 calldata
|
|
25
|
+
- ✅ 支持同一合约和不同合约的升级模式
|
|
26
|
+
|
|
27
|
+
## 一、发布 NPM 包
|
|
28
|
+
|
|
29
|
+
### 1. 准备发布
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 进入项目目录
|
|
33
|
+
cd evm-checkcode-cli
|
|
34
|
+
|
|
35
|
+
# 安装依赖
|
|
36
|
+
npm install
|
|
37
|
+
|
|
38
|
+
# 编译 TypeScript
|
|
39
|
+
npm run build
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. 配置 NPM 账户
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 登录 NPM(如果还未登录)
|
|
46
|
+
npm login
|
|
47
|
+
|
|
48
|
+
# 输入用户名、密码、邮箱
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3. 发布到 NPM
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 检查包信息
|
|
55
|
+
npm pack --dry-run
|
|
56
|
+
|
|
57
|
+
# 发布包
|
|
58
|
+
npm publish
|
|
59
|
+
|
|
60
|
+
# 如果包名已被占用,可以发布到作用域下
|
|
61
|
+
# 先修改 package.json 中的 name 为 "@your-username/bytecode-checker-cli"
|
|
62
|
+
# 然后执行:
|
|
63
|
+
npm publish --access public
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4. 更新版本
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# 更新补丁版本(1.0.0 -> 1.0.1)
|
|
70
|
+
npm version patch
|
|
71
|
+
|
|
72
|
+
# 更新小版本(1.0.0 -> 1.1.0)
|
|
73
|
+
npm version minor
|
|
74
|
+
|
|
75
|
+
# 更新大版本(1.0.0 -> 2.0.0)
|
|
76
|
+
npm version major
|
|
77
|
+
|
|
78
|
+
# 发布新版本
|
|
79
|
+
npm publish
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 二、使用 NPM 包
|
|
83
|
+
|
|
84
|
+
### 1. 安装
|
|
85
|
+
|
|
86
|
+
在你的 Hardhat 项目中安装:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install --save-dev gate-evm-tools
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
或全局安装:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm install -g gate-evm-tools
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 2. 创建配置文件
|
|
99
|
+
|
|
100
|
+
在项目根目录创建 `contractInfo.json` 文件:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"eth": {
|
|
105
|
+
"Vault": "0x80aaf2e4636c510e067a5d300d8bafd48027addf",
|
|
106
|
+
"VaultCrossChainRelay": "0x060194eec4556096baaabd6bf553d2658d6a66ab"
|
|
107
|
+
},
|
|
108
|
+
"bsc": {
|
|
109
|
+
"Vault": "0x2cb7d2603a5f43b9fe79e98f09fe3eec40b6765d",
|
|
110
|
+
"VaultCrossChainRelay": "0x23ae3a565e0896866e7725fe6d49fd777359c162"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
格式说明:
|
|
116
|
+
- 第一层 key 是网络名称(必须与 `hardhat.config.js` 中的网络名称一致)
|
|
117
|
+
- 第二层 key 是合约名称(必须与编译的合约名称一致)
|
|
118
|
+
- value 是合约地址
|
|
119
|
+
|
|
120
|
+
### 3. 配置 Hardhat
|
|
121
|
+
|
|
122
|
+
确保 `hardhat.config.js` 中配置了相应的网络:
|
|
123
|
+
|
|
124
|
+
```javascript
|
|
125
|
+
module.exports = {
|
|
126
|
+
networks: {
|
|
127
|
+
eth: {
|
|
128
|
+
url: "https://eth-mainnet.g.alchemy.com/v2/YOUR-API-KEY",
|
|
129
|
+
},
|
|
130
|
+
bsc: {
|
|
131
|
+
url: "https://bsc-dataseed.binance.org/",
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 4. 编译合约
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npx hardhat compile
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 5. 使用工具
|
|
144
|
+
|
|
145
|
+
#### 📋 查看帮助
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npx gate-tool --help
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### 🔍 字节码检查
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 检查所有合约
|
|
155
|
+
npx gate-tool check
|
|
156
|
+
|
|
157
|
+
# 检查指定合约
|
|
158
|
+
npx gate-tool check --contract Vault
|
|
159
|
+
|
|
160
|
+
# 检查指定网络
|
|
161
|
+
npx gate-tool check --network eth
|
|
162
|
+
|
|
163
|
+
# 指定配置文件路径
|
|
164
|
+
npx gate-tool check --config ./config/contracts.json
|
|
165
|
+
|
|
166
|
+
# 指定输出报告路径
|
|
167
|
+
npx gate-tool check --output ./reports/result.json
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
#### 🔄 同步链上合约状态
|
|
171
|
+
|
|
172
|
+
当合约通过 calldata 方式由其他人(如多签钱包)执行升级后,本地的 `.openzeppelin` 文件不会自动更新。使用此命令可以从链上读取最新状态并更新本地文件。
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# 同步合约状态
|
|
176
|
+
npx gate-tool sync \
|
|
177
|
+
--proxy 0x1234... \
|
|
178
|
+
--contract CounterUUPS \
|
|
179
|
+
--network sepolia
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
#### ✅ 验证升级安全性并生成 calldata
|
|
183
|
+
|
|
184
|
+
验证合约升级的安全性,并生成 `upgradeToAndCall` 的 calldata。
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# 不同合约升级(从 CounterUUPS 升级到 CounterUUPSV2)
|
|
188
|
+
npx gate-tool validate \
|
|
189
|
+
--proxy 0x1234... \
|
|
190
|
+
--old CounterUUPS \
|
|
191
|
+
--new CounterUUPSV2 \
|
|
192
|
+
--network sepolia
|
|
193
|
+
|
|
194
|
+
# 同一合约升级(修改现有合约后升级)
|
|
195
|
+
npx gate-tool validate \
|
|
196
|
+
--proxy 0x1234... \
|
|
197
|
+
--old CounterUUPS \
|
|
198
|
+
--new CounterUUPS \
|
|
199
|
+
--network sepolia
|
|
200
|
+
|
|
201
|
+
# 指定输出文件路径
|
|
202
|
+
npx gate-tool validate \
|
|
203
|
+
--proxy 0x1234... \
|
|
204
|
+
--old CounterUUPS \
|
|
205
|
+
--new CounterUUPSV2 \
|
|
206
|
+
--network sepolia \
|
|
207
|
+
--output ./upgrade-info.json
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**注意:** `validate` 命令会在链上部署新的实现合约(仅用于验证),但不会升级代理合约。请使用生成的 calldata 通过多签钱包执行升级。
|
|
211
|
+
|
|
212
|
+
### 6. 命令选项
|
|
213
|
+
|
|
214
|
+
#### check 命令
|
|
215
|
+
|
|
216
|
+
| 选项 | 简写 | 说明 | 默认值 |
|
|
217
|
+
|------|------|------|--------|
|
|
218
|
+
| `--contract <name>` | `-c` | 指定要检查的合约名称 | - |
|
|
219
|
+
| `--network <name>` | `-n` | 指定要检查的网络名称 | - |
|
|
220
|
+
| `--config <path>` | - | 指定配置文件路径 | `./contractInfo.json` |
|
|
221
|
+
| `--output <path>` | `-o` | 指定输出报告文件路径 | `./bytecode-check-report.json` |
|
|
222
|
+
|
|
223
|
+
#### sync 命令
|
|
224
|
+
|
|
225
|
+
| 选项 | 简写 | 说明 | 必需 |
|
|
226
|
+
|------|------|------|------|
|
|
227
|
+
| `--proxy <address>` | - | 代理合约地址 | ✅ |
|
|
228
|
+
| `--contract <name>` | - | 合约名称 | ✅ |
|
|
229
|
+
| `--network <name>` | `-n` | 网络名称 | - |
|
|
230
|
+
|
|
231
|
+
#### validate 命令
|
|
232
|
+
|
|
233
|
+
| 选项 | 简写 | 说明 | 必需 |
|
|
234
|
+
|------|------|------|------|
|
|
235
|
+
| `--proxy <address>` | - | 代理合约地址 | ✅ |
|
|
236
|
+
| `--old <name>` | - | 旧合约名称 | ✅ |
|
|
237
|
+
| `--new <name>` | - | 新合约名称 | ✅ |
|
|
238
|
+
| `--network <name>` | `-n` | 网络名称 | - |
|
|
239
|
+
| `--output <path>` | `-o` | 输出文件路径 | `./upgradeCalldata.json` |
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,iBA6IxD"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { findConfigFile, readConfigFile, saveReport, mergeReports } from '../utils/files.js';
|
|
4
|
+
import { printSummary, printProgress, printConfig } from '../utils/output.js';
|
|
5
|
+
import { BytecodeChecker } from '../core/bytecodeChecker.js';
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { createRequire } from 'module';
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
10
|
+
/**
|
|
11
|
+
* 执行字节码检查
|
|
12
|
+
*/
|
|
13
|
+
export async function checkBytecode(options) {
|
|
14
|
+
const spinner = ora();
|
|
15
|
+
try {
|
|
16
|
+
// 1. 查找并读取配置文件
|
|
17
|
+
spinner.start('正在查找配置文件...');
|
|
18
|
+
const configPath = findConfigFile(options.config);
|
|
19
|
+
const config = readConfigFile(configPath);
|
|
20
|
+
spinner.succeed(`已加载配置文件: ${chalk.gray(configPath)}`);
|
|
21
|
+
printConfig(config, configPath);
|
|
22
|
+
// 2. 检查是否在 Hardhat 项目中
|
|
23
|
+
const cwd = process.cwd();
|
|
24
|
+
const hardhatConfigExists = fs.existsSync(path.join(cwd, 'hardhat.config.js')) ||
|
|
25
|
+
fs.existsSync(path.join(cwd, 'hardhat.config.ts'));
|
|
26
|
+
if (!hardhatConfigExists) {
|
|
27
|
+
throw new Error('当前目录不是 Hardhat 项目,请在 Hardhat 项目根目录下运行此命令');
|
|
28
|
+
}
|
|
29
|
+
// 3. 动态加载 hardhat
|
|
30
|
+
spinner.start('正在加载 Hardhat 环境...');
|
|
31
|
+
let hre;
|
|
32
|
+
try {
|
|
33
|
+
// 尝试使用 require 加载(适用于大多数项目)
|
|
34
|
+
hre = require('hardhat');
|
|
35
|
+
}
|
|
36
|
+
catch (requireError) {
|
|
37
|
+
// 如果 require 失败,尝试使用 import(适用于 ES 模块项目)
|
|
38
|
+
try {
|
|
39
|
+
const hardhatModule = await import('hardhat');
|
|
40
|
+
hre = hardhatModule.default || hardhatModule;
|
|
41
|
+
}
|
|
42
|
+
catch (importError) {
|
|
43
|
+
// 两种方式都失败,抛出原始错误
|
|
44
|
+
throw requireError;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
spinner.succeed('Hardhat 环境已加载');
|
|
48
|
+
// 4. 编译项目
|
|
49
|
+
spinner.start('正在编译项目...');
|
|
50
|
+
try {
|
|
51
|
+
await hre.run('compile', { quiet: true });
|
|
52
|
+
spinner.succeed('项目编译完成');
|
|
53
|
+
}
|
|
54
|
+
catch (compileError) {
|
|
55
|
+
spinner.warn('编译过程中出现警告,继续执行检查...');
|
|
56
|
+
console.log(chalk.yellow(compileError.message));
|
|
57
|
+
}
|
|
58
|
+
// 5. 创建 checker 实例
|
|
59
|
+
const checker = new BytecodeChecker(hre, config);
|
|
60
|
+
// 6. 根据选项执行检查
|
|
61
|
+
spinner.start('正在执行字节码检查...');
|
|
62
|
+
let results = [];
|
|
63
|
+
if (options.contract) {
|
|
64
|
+
// 检查指定合约
|
|
65
|
+
printProgress(`检查合约: ${chalk.cyan(options.contract)}`, 'info');
|
|
66
|
+
results = await checker.checkSpecificContract(options.contract);
|
|
67
|
+
}
|
|
68
|
+
else if (options.network) {
|
|
69
|
+
// 检查指定网络
|
|
70
|
+
printProgress(`检查网络: ${chalk.cyan(options.network)}`, 'info');
|
|
71
|
+
results = await checker.checkNetworkContracts(options.network);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// 检查所有合约
|
|
75
|
+
printProgress('检查所有合约...', 'info');
|
|
76
|
+
results = await checker.checkAllContracts();
|
|
77
|
+
}
|
|
78
|
+
spinner.succeed(`检查完成,共 ${results.length} 个合约`);
|
|
79
|
+
// 7. 显示结果
|
|
80
|
+
printSummary(results);
|
|
81
|
+
// 8. 生成并保存报告
|
|
82
|
+
const networkResults = checker.generateNetworkContractResults(results);
|
|
83
|
+
// 读取现有报告(如果存在)
|
|
84
|
+
const outputPath = options.output || path.join(cwd, 'bytecode-check-report.json');
|
|
85
|
+
let existingReport = {};
|
|
86
|
+
if (fs.existsSync(outputPath)) {
|
|
87
|
+
try {
|
|
88
|
+
existingReport = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));
|
|
89
|
+
printProgress('检测到现有报告,将进行增量更新', 'info');
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
printProgress('现有报告文件格式错误,将创建新文件', 'warning');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 合并报告
|
|
96
|
+
const mergedReport = mergeReports(existingReport, networkResults);
|
|
97
|
+
const reportPath = saveReport(mergedReport, options.output);
|
|
98
|
+
printProgress(`报告已保存: ${chalk.gray(reportPath)}`, 'success');
|
|
99
|
+
// 9. 显示更新统计
|
|
100
|
+
displayUpdateStats(existingReport, networkResults);
|
|
101
|
+
// 10. 返回结果(用于判断是否全部通过)
|
|
102
|
+
const allPassed = results.every((r) => r.matches && !r.error);
|
|
103
|
+
if (!allPassed) {
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
spinner.fail('检查失败');
|
|
109
|
+
// 检测常见的 Hardhat 配置错误
|
|
110
|
+
if (error.message && error.message.includes('Cannot find module') &&
|
|
111
|
+
error.message.includes('hardhat/config')) {
|
|
112
|
+
console.error(chalk.red('\n❌ Hardhat 配置文件导入错误\n'));
|
|
113
|
+
console.error(chalk.yellow('问题:你的 hardhat.config.ts 中的导入语句与当前环境不兼容。\n'));
|
|
114
|
+
console.error(chalk.cyan('💡 解决方案:\n'));
|
|
115
|
+
console.error(chalk.white('方案 1:修改导入语句(推荐)'));
|
|
116
|
+
console.error(chalk.gray(' 将 hardhat.config.ts 中的导入语句改为:'));
|
|
117
|
+
console.error(chalk.green(' import { HardhatUserConfig } from "hardhat/config.js"'));
|
|
118
|
+
console.error(chalk.green(' import { task } from "hardhat/config.js"'));
|
|
119
|
+
console.error(chalk.gray(' (添加 .js 扩展名)\n'));
|
|
120
|
+
console.error(chalk.white('方案 2:修改为 CommonJS 配置'));
|
|
121
|
+
console.error(chalk.gray(' 将 hardhat.config.ts 重命名为 hardhat.config.js'));
|
|
122
|
+
console.error(chalk.gray(' 并使用 require 语法:'));
|
|
123
|
+
console.error(chalk.green(' const { task } = require("hardhat/config");\n'));
|
|
124
|
+
console.error(chalk.white('方案 3:确保 ts-node 正确配置'));
|
|
125
|
+
console.error(chalk.gray(' 在 tsconfig.json 中设置:'));
|
|
126
|
+
console.error(chalk.green(' "ts-node": { "transpileOnly": true, "compilerOptions": { "module": "commonjs" } }\n'));
|
|
127
|
+
console.error(chalk.red('详细错误信息:'));
|
|
128
|
+
console.error(chalk.gray(error.message));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.error(chalk.red('\n错误:'), error.message);
|
|
132
|
+
console.error(chalk.gray(error.stack));
|
|
133
|
+
}
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 显示更新统计
|
|
139
|
+
*/
|
|
140
|
+
function displayUpdateStats(existingReport, networkResults) {
|
|
141
|
+
const existingKeys = Object.keys(existingReport);
|
|
142
|
+
const newKeys = Object.keys(networkResults);
|
|
143
|
+
const updatedNetworks = newKeys.filter(key => existingKeys.includes(key));
|
|
144
|
+
const addedNetworks = newKeys.filter(key => !existingKeys.includes(key));
|
|
145
|
+
const updatedContracts = [];
|
|
146
|
+
const addedContracts = [];
|
|
147
|
+
for (const [networkName, networkData] of Object.entries(networkResults)) {
|
|
148
|
+
const existingNetworkData = existingReport[networkName] || {};
|
|
149
|
+
const existingContractKeys = Object.keys(existingNetworkData);
|
|
150
|
+
const newContractKeys = Object.keys(networkData);
|
|
151
|
+
for (const contractName of newContractKeys) {
|
|
152
|
+
if (existingContractKeys.includes(contractName)) {
|
|
153
|
+
updatedContracts.push(`${networkName}.${contractName}`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
addedContracts.push(`${networkName}.${contractName}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
console.log(chalk.cyan('\n更新统计:'));
|
|
161
|
+
if (updatedNetworks.length > 0) {
|
|
162
|
+
console.log(chalk.blue(' 🔄 更新的网络:'), updatedNetworks.join(', '));
|
|
163
|
+
}
|
|
164
|
+
if (addedNetworks.length > 0) {
|
|
165
|
+
console.log(chalk.green(' ➕ 新增的网络:'), addedNetworks.join(', '));
|
|
166
|
+
}
|
|
167
|
+
if (updatedContracts.length > 0) {
|
|
168
|
+
console.log(chalk.blue(' 🔄 更新的合约:'), updatedContracts.slice(0, 5).join(', ') +
|
|
169
|
+
(updatedContracts.length > 5 ? ` 等 ${updatedContracts.length} 个` : ''));
|
|
170
|
+
}
|
|
171
|
+
if (addedContracts.length > 0) {
|
|
172
|
+
console.log(chalk.green(' ➕ 新增的合约:'), addedContracts.slice(0, 5).join(', ') +
|
|
173
|
+
(addedContracts.length > 5 ? ` 等 ${addedContracts.length} 个` : ''));
|
|
174
|
+
}
|
|
175
|
+
console.log();
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA4FrD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { syncNetworkFile } from '../core/syncUpgradeJson.js';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { createRequire } from 'module';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
/**
|
|
9
|
+
* 执行合约状态同步
|
|
10
|
+
*/
|
|
11
|
+
export async function syncUpgrade(options) {
|
|
12
|
+
const spinner = ora();
|
|
13
|
+
try {
|
|
14
|
+
// 1. 验证必需参数
|
|
15
|
+
if (!options.proxy) {
|
|
16
|
+
throw new Error('必须提供代理合约地址(--proxy)');
|
|
17
|
+
}
|
|
18
|
+
if (!options.contract) {
|
|
19
|
+
throw new Error('必须提供合约名称(--contract)');
|
|
20
|
+
}
|
|
21
|
+
// 2. 检查是否在 Hardhat 项目中
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const hardhatConfigExists = fs.existsSync(path.join(cwd, 'hardhat.config.js')) ||
|
|
24
|
+
fs.existsSync(path.join(cwd, 'hardhat.config.ts'));
|
|
25
|
+
if (!hardhatConfigExists) {
|
|
26
|
+
throw new Error('当前目录不是 Hardhat 项目,请在 Hardhat 项目根目录下运行此命令');
|
|
27
|
+
}
|
|
28
|
+
// 3. 如果指定了网络,在加载 Hardhat 之前设置环境变量
|
|
29
|
+
if (options.network) {
|
|
30
|
+
process.env.HARDHAT_NETWORK = options.network;
|
|
31
|
+
spinner.info(`设置网络: ${chalk.cyan(options.network)}`);
|
|
32
|
+
}
|
|
33
|
+
// 4. 动态加载 hardhat
|
|
34
|
+
spinner.start('正在加载 Hardhat 环境...');
|
|
35
|
+
let hre;
|
|
36
|
+
try {
|
|
37
|
+
// 尝试使用 require 加载(适用于大多数项目)
|
|
38
|
+
hre = require('hardhat');
|
|
39
|
+
}
|
|
40
|
+
catch (requireError) {
|
|
41
|
+
// 如果 require 失败,尝试使用 import(适用于 ES 模块项目)
|
|
42
|
+
try {
|
|
43
|
+
const hardhatModule = await import('hardhat');
|
|
44
|
+
hre = hardhatModule.default || hardhatModule;
|
|
45
|
+
}
|
|
46
|
+
catch (importError) {
|
|
47
|
+
throw requireError;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
spinner.succeed(`Hardhat 环境已加载 (网络: ${chalk.cyan(hre.network.name)})`);
|
|
51
|
+
// 5. 执行同步
|
|
52
|
+
console.log('');
|
|
53
|
+
const result = await syncNetworkFile({
|
|
54
|
+
proxyAddress: options.proxy,
|
|
55
|
+
contractName: options.contract,
|
|
56
|
+
networkName: options.network,
|
|
57
|
+
hre
|
|
58
|
+
});
|
|
59
|
+
// 6. 显示成功信息
|
|
60
|
+
console.log(chalk.green.bold('\n✅ 同步成功!\n'));
|
|
61
|
+
console.log(chalk.cyan('同步结果摘要:'));
|
|
62
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
63
|
+
console.log(`${chalk.white('代理合约:')} ${chalk.yellow(result.proxyAddress)}`);
|
|
64
|
+
console.log(`${chalk.white('实现合约:')} ${chalk.yellow(result.implementationAddress)}`);
|
|
65
|
+
console.log(`${chalk.white('网络文件:')} ${chalk.gray(result.networkFile)}`);
|
|
66
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
67
|
+
console.log('');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
spinner.fail('同步失败');
|
|
71
|
+
// 检测常见的错误并给出友好提示
|
|
72
|
+
if (error.message && error.message.includes('Cannot find module') &&
|
|
73
|
+
error.message.includes('hardhat/config')) {
|
|
74
|
+
console.error(chalk.red('\n❌ Hardhat 配置文件导入错误\n'));
|
|
75
|
+
console.error(chalk.yellow('问题:你的 hardhat.config.ts 中的导入语句与当前环境不兼容。\n'));
|
|
76
|
+
console.error(chalk.cyan('💡 解决方案:\n'));
|
|
77
|
+
console.error(chalk.white('方案 1:修改导入语句(推荐)'));
|
|
78
|
+
console.error(chalk.gray(' 将 hardhat.config.ts 中的导入语句改为:'));
|
|
79
|
+
console.error(chalk.green(' import { HardhatUserConfig } from "hardhat/config.js"'));
|
|
80
|
+
console.error(chalk.gray(' (添加 .js 扩展名)\n'));
|
|
81
|
+
}
|
|
82
|
+
else if (error.message && error.message.includes('not found in config')) {
|
|
83
|
+
console.error(chalk.red('\n❌ 网络配置错误\n'));
|
|
84
|
+
console.error(chalk.yellow(`网络 "${options.network}" 未在 hardhat.config 中配置\n`));
|
|
85
|
+
console.error(chalk.cyan('💡 解决方案:\n'));
|
|
86
|
+
console.error(chalk.white('请在 hardhat.config 中添加该网络的配置'));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error(chalk.red('\n错误:'), error.message);
|
|
90
|
+
if (error.stack && process.env.DEBUG) {
|
|
91
|
+
console.error(chalk.gray(error.stack));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9C;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAsG7D"}
|