evm-all-tools
v1.0.0
Published
智能合约工具集 - 字节码检查、合约升级验证、合约状态同步
Maintainers
Readme
Smart Contract Tools
🛠️ 智能合约工具集 - 字节码检查、合约升级验证、合约状态同步
功能特性
🔧 配置修复(fix)
- ✅ 自动检测 Hardhat 配置文件的兼容性问题
- ✅ 智能修复 ESM 模块导入错误
- ✅ 交互式确认修复操作
- ✅ 自动备份原配置文件
- ✅ 支持仅检查模式
🔍 字节码检查(check)
- ✅ 检查链下合约代码和链上合约代码是否一致
- ✅ 支持检查单个合约、指定网络或所有合约
- ✅ 智能识别 Constructor 参数差异和 Immutable 变量差异
- ✅ 自动移除元数据进行比较
- ✅ 生成详细的 JSON 报告
- ✅ 支持增量更新报告
- ✅ 检测到配置错误时提供自动修复选项
🔄 合约状态同步(sync)
- ✅ 同步链上合约状态到本地 .openzeppelin 文件
- ✅ 自动读取链上实现合约地址
- ✅ 获取并更新存储布局信息
✅ 升级验证(validate)
- ✅ 验证合约升级的安全性
- ✅ 检查存储布局兼容性
- ✅ 自动部署新实现合约
- ✅ 生成 upgradeToAndCall 的 calldata
- ✅ 支持同一合约和不同合约的升级模式
📋 Calldata 解析(parse)
- ✅ 解析 EVM calldata,显示函数名称和参数
- ✅ 支持从 Hardhat artifacts 自动查找 ABI
- ✅ 支持指定自定义 ABI 文件路径
- ✅ 支持直接提供 ABI 数组
- ✅ 支持批量解析多个 calldata
- ✅ 友好的彩色输出和 JSON 导出
一、发布 NPM 包
1. 准备发布
# 进入项目目录
cd evm-checkcode-cli
# 安装依赖
npm install
# 编译 TypeScript
npm run build2. 配置 NPM 账户
# 登录 NPM(如果还未登录)
npm login
# 输入用户名、密码、邮箱3. 发布到 NPM
# 检查包信息
npm pack --dry-run
# 发布包
npm publish
# 如果包名已被占用,可以发布到作用域下
# 先修改 package.json 中的 name 为 "@your-username/bytecode-checker-cli"
# 然后执行:
npm publish --access public4. 更新版本
# 更新补丁版本(1.0.0 -> 1.0.1)
npm version patch
# 更新小版本(1.0.0 -> 1.1.0)
npm version minor
# 更新大版本(1.0.0 -> 2.0.0)
npm version major
s
# 发布新版本
npm publish二、使用 NPM 包
1. 安装
在你的 Hardhat 项目中安装:
npm install --save-dev evm-all-tools或全局安装:
npm install -g evm-all-tools2. 创建配置文件
在项目根目录创建 contractInfo.json 文件:
{
"eth": {
"Vault": "0x80aaf2e4636c510e067a5d300d8bafd48027addf",
"VaultCrossChainRelay": "0x060194eec4556096baaabd6bf553d2658d6a66ab"
},
"bsc": {
"Vault": "0x2cb7d2603a5f43b9fe79e98f09fe3eec40b6765d",
"VaultCrossChainRelay": "0x23ae3a565e0896866e7725fe6d49fd777359c162"
}
}格式说明:
- 第一层 key 是网络名称(必须与
hardhat.config.js中的网络名称一致) - 第二层 key 是合约名称(必须与编译的合约名称一致)
- value 是合约地址
3. 配置 Hardhat
确保 hardhat.config.js 中配置了相应的网络:
module.exports = {
networks: {
eth: {
url: "https://eth-mainnet.g.alchemy.com/v2/YOUR-API-KEY",
},
bsc: {
url: "https://bsc-dataseed.binance.org/",
}
}
};4. 编译合约
npx hardhat compile5. 使用工具
📋 查看帮助
npx evm-tool --help🔧 配置修复(推荐首次使用)
如果在使用过程中遇到 Hardhat 配置导入错误,可以使用 fix 命令自动修复:
# 自动检测并修复配置问题(交互式)
npx evm-tool fix
# 仅检查问题,不执行修复
npx evm-tool fix --check
# 跳过确认,直接修复
npx evm-tool fix --yes常见问题:
Cannot find module 'hardhat/config'- 导入语句需要使用type关键字Did you mean to import "hardhat/config.js"?- ESM 模块兼容性问题
fix 命令会自动将:
import { HardhatUserConfig } from "hardhat/config";修复为:
import type { HardhatUserConfig } from "hardhat/config";🔍 字节码检查
# 检查所有合约
npx evm-tool check
# 检查指定合约
npx evm-tool check --contract Vault
# 检查指定网络
npx evm-tool check --network eth
# 指定配置文件路径
npx evm-tool check --config ./config/contracts.json
# 指定输出报告路径
npx evm-tool check --output ./reports/result.json🔄 同步链上合约状态
当合约通过 calldata 方式由其他人(如多签钱包)执行升级后,本地的 .openzeppelin 文件不会自动更新。使用此命令可以从链上读取最新状态并更新本地文件。
# 同步合约状态
npx evm-tool sync \
--proxy 0x1234... \
--contract CounterUUPS \
--network sepolia✅ 验证升级安全性并生成 calldata
验证合约升级的安全性,并生成 upgradeToAndCall 的 calldata。
# 不同合约升级(从 CounterUUPS 升级到 CounterUUPSV2)
npx evm-tool validate \
--proxy 0x1234... \
--old CounterUUPS \
--new CounterUUPSV2 \
--network sepolia
# 同一合约升级(修改现有合约后升级)
npx evm-tool validate \
--proxy 0x1234... \
--old CounterUUPS \
--new CounterUUPS \
--network sepolia
# 指定输出文件路径
npx evm-tool validate \
--proxy 0x1234... \
--old CounterUUPS \
--new CounterUUPSV2 \
--network sepolia \
--output ./upgrade-info.json注意: validate 命令会在链上部署新的实现合约(仅用于验证),但不会升级代理合约。请使用生成的 calldata 通过多签钱包执行升级。
📋 解析 Calldata
解析 EVM calldata,将其转换为人类可读的函数调用信息。
# 从 JSON 文件读取(推荐)
npx evm-tool parse --input parseCalldata.example.json
# 直接从命令行参数(使用合约名称从 artifacts 查找 ABI)
npx evm-tool parse \
--to 0x5FbDB2315678afecb367f032d93F642f64180aa3 \
--contract Counter \
--calldata 0x3fb5c1cb0000000000000000000000000000000000000000000000000000000000000064
# 使用自定义 ABI 文件
npx evm-tool parse \
--to 0x1234... \
--abi-path ./custom-abi/MyContract.json \
--calldata 0x...
# 批量解析并保存结果
npx evm-tool parse \
--input batch-calldata.json \
--output results.json输入文件格式示例:
{
"to": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
"contractName": "Counter",
"calldata": "0x3fb5c1cb0000000000000000000000000000000000000000000000000000000000000064"
}批量解析格式(数组 包含三种形式):
[
{
"to": "0x...",
"contractName": "Counter",
"calldata": "0x..."
},
{
"to": "0x...",
"abiPath": "./abi.json",
"calldata": "0x..."
},
{
"": "0x...",
"abi": [
{
"inputs": [
{"name": "spender", "type": "address"},
{"name": "amount", "type": "uint256"}
],
"name": "approve",
"outputs": [{"name": "", "type": "bool"}],
"stateMutability": "nonpayable",
"type": "function"
}
],
"calldata": "0x..."
}
]支持三种 ABI 来源方式:
- contractName - 从 Hardhat artifacts 自动查找(需要先编译合约)
- abiPath - 指定 ABI 文件路径
- abi - 直接在 JSON 中提供 ABI 数组
6. 命令选项
check 命令
| 选项 | 简写 | 说明 | 默认值 |
|------|------|------|--------|
| --contract <name> | -c | 指定要检查的合约名称 | - |
| --network <name> | -n | 指定要检查的网络名称 | - |
| --config <path> | - | 指定配置文件路径 | ./contractInfo.json |
| --output <path> | -o | 指定输出报告文件路径 | ./bytecode-check-report.json |
sync 命令
| 选项 | 简写 | 说明 | 必需 |
|------|------|------|------|
| --proxy <address> | - | 代理合约地址 | ✅ |
| --contract <name> | - | 合约名称 | ✅ |
| --network <name> | -n | 网络名称 | - |
validate 命令
| 选项 | 简写 | 说明 | 必需 |
|------|------|------|------|
| --proxy <address> | - | 代理合约地址 | ✅ |
| --old <name> | - | 旧合约名称 | ✅ |
| --new <name> | - | 新合约名称 | ✅ |
| --network <name> | -n | 网络名称 | - |
| --output <path> | -o | 输出文件路径 | ./upgradeCalldata.json |
parse 命令
| 选项 | 简写 | 说明 | 默认值 |
|------|------|------|--------|
| --input <path> | -i | 输入 JSON 文件路径 | - |
| --to <address> | - | 目标合约地址(命令行模式) | - |
| --calldata <data> | - | Calldata 十六进制数据(命令行模式) | - |
| --contract <name> | -c | 合约名称(从 artifacts 查找 ABI) | - |
| --abi-path <path> | - | 自定义 ABI 文件路径 | - |
| --output <path> | -o | 输出 JSON 文件路径 | - |
ABI 来源优先级:直接提供的 abi > abiPath > contractName
