gate-evm-tools 1.0.22 → 1.0.24

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.
Files changed (132) hide show
  1. package/README.md +111 -5
  2. package/bin/manifest-bootstrap.js +109 -3
  3. package/dist/commands/prepare.d.ts +8 -0
  4. package/dist/commands/prepare.d.ts.map +1 -0
  5. package/dist/commands/prepare.js +78 -0
  6. package/dist/commands/prepare.js.map +1 -0
  7. package/dist/commands/sync.d.ts.map +1 -1
  8. package/dist/commands/sync.js +11 -28
  9. package/dist/commands/sync.js.map +1 -1
  10. package/dist/core/preparation/artifacts.d.ts +21 -0
  11. package/dist/core/preparation/artifacts.d.ts.map +1 -0
  12. package/dist/core/preparation/artifacts.js +80 -0
  13. package/dist/core/preparation/artifacts.js.map +1 -0
  14. package/dist/core/preparation/evm.d.ts +39 -0
  15. package/dist/core/preparation/evm.d.ts.map +1 -0
  16. package/dist/core/preparation/evm.js +290 -0
  17. package/dist/core/preparation/evm.js.map +1 -0
  18. package/dist/core/preparation/index.d.ts +9 -0
  19. package/dist/core/preparation/index.d.ts.map +1 -0
  20. package/dist/core/preparation/index.js +15 -0
  21. package/dist/core/preparation/index.js.map +1 -0
  22. package/dist/core/preparation/manifest.d.ts +43 -0
  23. package/dist/core/preparation/manifest.d.ts.map +1 -0
  24. package/dist/core/preparation/manifest.js +169 -0
  25. package/dist/core/preparation/manifest.js.map +1 -0
  26. package/dist/core/preparation/normalize.d.ts +7 -0
  27. package/dist/core/preparation/normalize.d.ts.map +1 -0
  28. package/dist/core/preparation/normalize.js +496 -0
  29. package/dist/core/preparation/normalize.js.map +1 -0
  30. package/dist/core/preparation/types.d.ts +111 -0
  31. package/dist/core/preparation/types.d.ts.map +1 -0
  32. package/dist/core/preparation/types.js +2 -0
  33. package/dist/core/preparation/types.js.map +1 -0
  34. package/dist/core/preparation/zkManifestSync.d.ts +49 -0
  35. package/dist/core/preparation/zkManifestSync.d.ts.map +1 -0
  36. package/dist/core/preparation/zkManifestSync.js +159 -0
  37. package/dist/core/preparation/zkManifestSync.js.map +1 -0
  38. package/dist/core/preparation/zkUpgradeValidation.d.ts +37 -0
  39. package/dist/core/preparation/zkUpgradeValidation.d.ts.map +1 -0
  40. package/dist/core/preparation/zkUpgradeValidation.js +91 -0
  41. package/dist/core/preparation/zkUpgradeValidation.js.map +1 -0
  42. package/dist/core/preparation/zksync.d.ts +28 -0
  43. package/dist/core/preparation/zksync.d.ts.map +1 -0
  44. package/dist/core/preparation/zksync.js +248 -0
  45. package/dist/core/preparation/zksync.js.map +1 -0
  46. package/dist/custody/credential.d.ts +16 -0
  47. package/dist/custody/credential.d.ts.map +1 -0
  48. package/dist/custody/credential.js +68 -0
  49. package/dist/custody/credential.js.map +1 -0
  50. package/dist/custody/hardhat-runtime.d.ts +16 -0
  51. package/dist/custody/hardhat-runtime.d.ts.map +1 -0
  52. package/dist/custody/hardhat-runtime.js +101 -0
  53. package/dist/custody/hardhat-runtime.js.map +1 -0
  54. package/dist/custody/hardhat.d.ts +3 -0
  55. package/dist/custody/hardhat.d.ts.map +1 -0
  56. package/dist/custody/hardhat.js +8 -0
  57. package/dist/custody/hardhat.js.map +1 -0
  58. package/dist/custody/index.d.ts +6 -0
  59. package/dist/custody/index.d.ts.map +1 -0
  60. package/dist/custody/index.js +6 -0
  61. package/dist/custody/index.js.map +1 -0
  62. package/dist/custody/service.d.ts +16 -0
  63. package/dist/custody/service.d.ts.map +1 -0
  64. package/dist/custody/service.js +100 -0
  65. package/dist/custody/service.js.map +1 -0
  66. package/dist/custody/signer.d.ts +13 -0
  67. package/dist/custody/signer.d.ts.map +1 -0
  68. package/dist/custody/signer.js +258 -0
  69. package/dist/custody/signer.js.map +1 -0
  70. package/dist/custody/version.d.ts +4 -0
  71. package/dist/custody/version.d.ts.map +1 -0
  72. package/dist/custody/version.js +13 -0
  73. package/dist/custody/version.js.map +1 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +20 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/sync/index.d.ts +31 -0
  78. package/dist/sync/index.d.ts.map +1 -0
  79. package/dist/sync/index.js +57 -0
  80. package/dist/sync/index.js.map +1 -0
  81. package/dist/types.d.ts +9 -1
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/workflow/index.d.ts +5 -0
  84. package/dist/workflow/index.d.ts.map +1 -0
  85. package/dist/workflow/index.js +3 -0
  86. package/dist/workflow/index.js.map +1 -0
  87. package/dist-cjs/core/preparation/artifacts.js +89 -0
  88. package/dist-cjs/core/preparation/artifacts.js.map +1 -0
  89. package/dist-cjs/core/preparation/evm.js +297 -0
  90. package/dist-cjs/core/preparation/evm.js.map +1 -0
  91. package/dist-cjs/core/preparation/index.js +19 -0
  92. package/dist-cjs/core/preparation/index.js.map +1 -0
  93. package/dist-cjs/core/preparation/manifest.js +180 -0
  94. package/dist-cjs/core/preparation/manifest.js.map +1 -0
  95. package/dist-cjs/core/preparation/normalize.js +507 -0
  96. package/dist-cjs/core/preparation/normalize.js.map +1 -0
  97. package/dist-cjs/core/preparation/types.js +3 -0
  98. package/dist-cjs/core/preparation/types.js.map +1 -0
  99. package/dist-cjs/core/preparation/zkManifestSync.js +166 -0
  100. package/dist-cjs/core/preparation/zkManifestSync.js.map +1 -0
  101. package/dist-cjs/core/preparation/zkUpgradeValidation.js +101 -0
  102. package/dist-cjs/core/preparation/zkUpgradeValidation.js.map +1 -0
  103. package/dist-cjs/core/preparation/zksync.js +252 -0
  104. package/dist-cjs/core/preparation/zksync.js.map +1 -0
  105. package/dist-cjs/core/syncUpgradeJson.js +315 -0
  106. package/dist-cjs/core/syncUpgradeJson.js.map +1 -0
  107. package/dist-cjs/custody/credential.js +74 -0
  108. package/dist-cjs/custody/credential.js.map +1 -0
  109. package/dist-cjs/custody/hardhat-runtime.js +104 -0
  110. package/dist-cjs/custody/hardhat-runtime.js.map +1 -0
  111. package/dist-cjs/custody/hardhat.js +15 -0
  112. package/dist-cjs/custody/hardhat.js.map +1 -0
  113. package/dist-cjs/custody/index.js +18 -0
  114. package/dist-cjs/custody/index.js.map +1 -0
  115. package/dist-cjs/custody/service.js +105 -0
  116. package/dist-cjs/custody/service.js.map +1 -0
  117. package/dist-cjs/custody/signer.js +261 -0
  118. package/dist-cjs/custody/signer.js.map +1 -0
  119. package/dist-cjs/custody/version.js +16 -0
  120. package/dist-cjs/custody/version.js.map +1 -0
  121. package/dist-cjs/package.json +3 -0
  122. package/dist-cjs/sync/index.js +60 -0
  123. package/dist-cjs/sync/index.js.map +1 -0
  124. package/dist-cjs/types.js +3 -0
  125. package/dist-cjs/types.js.map +1 -0
  126. package/dist-cjs/utils/manifestTransaction.js +302 -0
  127. package/dist-cjs/utils/manifestTransaction.js.map +1 -0
  128. package/dist-cjs/utils/openzeppelin.js +57 -0
  129. package/dist-cjs/utils/openzeppelin.js.map +1 -0
  130. package/dist-cjs/workflow/index.js +12 -0
  131. package/dist-cjs/workflow/index.js.map +1 -0
  132. package/package.json +73 -5
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Gate Smart Contract Tools
2
2
 
3
- 🛠️ Gate 智能合约工具集 - 字节码检查、合约升级验证、合约状态同步
3
+ 🛠️ Gate 智能合约工具集 - EVM/zkSync CREATE2 与 UUPS 计划、字节码检查、升级验证、合约状态同步
4
4
 
5
5
  ## 功能特性
6
6
 
@@ -25,8 +25,15 @@
25
25
  - ✅ 同步链上合约状态到本地 .openzeppelin 文件
26
26
  - ✅ 自动读取链上实现合约地址
27
27
  - ✅ 获取并更新存储布局信息
28
+ - ✅ EVM 与 zkSync 按 target 配置路由 manifest,并以事务方式写入或完整回滚
28
29
 
29
- ### ✅ 升级验证(validate)
30
+ ### 🧭 规范化部署准备(prepare)
31
+ - ✅ 普通 CREATE2、UUPS 初始部署和 UUPS 升级共用一个 version 1 plan contract
32
+ - ✅ EVM 缺省兼容;zkSync 使用 zksolc artifact、EraVM bytecode hash、ContractDeployer calldata 与 `factoryDeps`
33
+ - ✅ OpenZeppelin / Matter Labs 实现安全性和存储布局校验发生在任何签名或广播之前
34
+ - ✅ prepare-only:不签名、不广播、不写 manifest
35
+
36
+ ### ✅ 兼容升级验证(validate,legacy)
30
37
  - ✅ **自动检测合约类型(代理合约 or 实现合约)**
31
38
  - ✅ **代理模式:验证升级安全性并生成 upgradeCalldata**
32
39
  - ✅ **实现模式:验证存储布局兼容性并部署新合约**
@@ -37,6 +44,33 @@
37
44
  - ✅ 支持同一合约和不同合约的升级模式
38
45
  - ✅ 支持带构造函数参数的合约
39
46
 
47
+ ## EVM/zkSync 统一工作流边界
48
+
49
+ `gate-evm-tools/workflow` 是生成工作流唯一的部署准备实现:
50
+
51
+ - GateTool 读取严格 artifact,执行 OpenZeppelin 校验,计算 CREATE2 地址,并生成 Factory、`upgradeToAndCall` calldata 与 zkSync `factoryDeps`。
52
+ - full-template runtime 负责权限、controlled Multicall、immutable execution plan、签名、广播与 receipt reconciliation。
53
+ - SmartFlow 校验 immutable plan、receipt 和 finalized UUPS 的 `gateToolSync` 证据,不重新计算 CREATE2 或 calldata。
54
+
55
+ 生成工作流应在当前 Hardhat HRE 内调用:
56
+
57
+ ```typescript
58
+ import { prepareWorkflow } from "gate-evm-tools/workflow";
59
+
60
+ const plan = await prepareWorkflow(hre, request);
61
+ ```
62
+
63
+ 人工文件入口使用同一实现:
64
+
65
+ ```bash
66
+ npx gate-tool prepare \
67
+ --network <hardhat-network> \
68
+ --request scripts/tasks/<task-id>/gate-tool-request.json \
69
+ --output scripts/tasks/<task-id>/gate-tool-plan.json
70
+ ```
71
+
72
+ request 的 `kind` 只能是 `create2-deploy`、`uups-placeholder-deploy` 或 `uups-upgrade`;`scheme` 缺省为 `evm`,也可显式设置为 `zksync-eravm`。EVM plan 不携带 `factoryDeps`;每笔 zkSync transaction 都必须显式携带锁定的 `factoryDeps`,非 bytecode-publishing 交易使用空数组。
73
+
40
74
  ### 📋 Calldata 解析(parse)
41
75
  - ✅ 解析 EVM calldata,显示函数名称和参数
42
76
  - ✅ 支持从 Hardhat artifacts 自动查找 ABI
@@ -163,6 +197,53 @@ module.exports = {
163
197
  };
164
198
  ```
165
199
 
200
+ #### 托管钱包 Signer(ethers v5 / v6)
201
+
202
+ `gate-evm-tools` 支持把真实私钥和托管钱包统一放在同一个配置项中:
203
+
204
+ ```text
205
+ # 真实私钥
206
+ PRIVATE_KEY=0x...
207
+
208
+ # 或托管钱包凭证
209
+ PRIVATE_KEY=custody:<ProjectSecret>:<WalletAddress>
210
+ CUSTODY_API_BASE_URL=https://custody.example.com
211
+ ```
212
+
213
+ `CUSTODY_API_BASE_URL` must be an HTTP(S) base URL without embedded
214
+ credentials, query parameters, or fragments.
215
+
216
+ 也可以用 `WALLET_CREDENTIAL` 代替 `PRIVATE_KEY`。如果两个变量同时存在,值必须一致,否则会拒绝启动,避免误用账户。
217
+
218
+ Hardhat 配置需要在 ethers 和 OpenZeppelin 插件之后加载托管插件,并用 `resolveHardhatAccounts` 处理网络账户:
219
+
220
+ ```typescript
221
+ import "@nomicfoundation/hardhat-ethers";
222
+ import "@openzeppelin/hardhat-upgrades";
223
+ import "gate-evm-tools/hardhat";
224
+ import { resolveHardhatAccounts } from "gate-evm-tools/hardhat";
225
+
226
+ const walletCredential =
227
+ process.env.WALLET_CREDENTIAL ?? process.env.PRIVATE_KEY ?? "";
228
+
229
+ export default {
230
+ networks: {
231
+ sepolia: {
232
+ url: process.env.SEPOLIA_RPC_URL,
233
+ accounts: resolveHardhatAccounts(walletCredential),
234
+ },
235
+ },
236
+ };
237
+ ```
238
+
239
+ - 真实私钥返回给原生 `networks.accounts`,部署行为保持不变。
240
+ - 托管凭证让原生 accounts 保持为空,并自动替换 `ethers.getSigners()`、匹配地址的 `ethers.getSigner()` 和 `ethers.provider.getSigner(0)`。
241
+ - 实际 ethers 主版本取自 `hre.ethers.version`;v5 使用运行时 `Signer`,v6 使用运行时 `AbstractSigner`,包内不会固定加载某个 ethers 版本。
242
+ - 业务部署脚本无需传入额外 signer;`ethers.getContractFactory()`、`deployContract()` 和 `upgrades.deployProxy()` 会取得托管 signer。
243
+ - 完整托管凭证通过 Bearer 发送,服务端拆解 Project Secret 与绑定钱包地址;凭证不会写入日志,每次签名请求都会生成独立的 `Idempotency-Key`。
244
+
245
+ 托管服务只返回签名或 raw transaction,不负责广播。交易最终仍由当前 Hardhat ethers Provider 广播。现有 OpenZeppelin CREATE2/Multicall 补丁与 signer 注入是两套独立能力,升级项目应继续保留原补丁。
246
+
166
247
  ### 4. 编译合约
167
248
 
168
249
  ```bash
@@ -228,7 +309,7 @@ npx gate-tool check --output ./reports/result.json
228
309
 
229
310
  当合约通过 calldata 方式由其他人(如多签钱包)执行升级后,本地的 `.openzeppelin` 文件不会自动更新。使用此命令可以从链上读取最新状态并更新本地文件。
230
311
 
231
- `sync` 和 `validate` 会在加载 OpenZeppelin upgrades 之前确定 manifest 目录。约定路由如下:
312
+ `sync` 和 legacy `validate` 会在加载 OpenZeppelin upgrades 之前确定 manifest 目录。canonical workflow 的 `sync --target` 只接受所选 target 的 `config.yaml.openzeppelin.manifestDir`,不使用 Matter Labs 固定 `.upgradable` 目录。约定路由如下:
232
313
 
233
314
  | 网络名 | Manifest 目录 | 含义 |
234
315
  |------|------|------|
@@ -254,13 +335,26 @@ npx gate-tool sync --proxy 0x1234... --contract CounterUUPS --network sepolia
254
335
  最新 full 模版项目优先使用 `workflow:checkcode` 做只读验收,由模版负责选择精确的 manifest 文件并调用 gate-tool。
255
336
 
256
337
  ```bash
257
- # 同步合约状态
338
+ # EVM:confirmed UUPS receipt 后同步合约状态
258
339
  npx gate-tool sync \
340
+ --scheme evm \
259
341
  --proxy 0x1234... \
260
342
  --contract CounterUUPS \
261
- --network sepolia
343
+ --network sepolia \
344
+ --target sepolia
345
+
346
+ # zkSync:必须同时绑定 confirmed transaction hash
347
+ npx gate-tool sync \
348
+ --scheme zksync-eravm \
349
+ --proxy 0x1234... \
350
+ --contract CounterUUPS \
351
+ --network zkDev \
352
+ --target zkDev \
353
+ --transaction-hash 0x...
262
354
  ```
263
355
 
356
+ `sync` 会验证 runtime code、ERC-1967 implementation slot、chain ID、UUPS kind 与当前 artifact/layout。只有 `status=committed` 的 manifest transaction 才能作为 finalized UUPS 证据;失败会恢复原文件名和原始字节。
357
+
264
358
  #### ✅ 验证升级安全性并生成 calldata
265
359
 
266
360
  验证合约升级的安全性,并生成 `upgradeToAndCall` 的 calldata。
@@ -524,6 +618,18 @@ npx gate-tool parse \
524
618
  | `--proxy <address>` | - | 代理合约地址 | ✅ |
525
619
  | `--contract <name>` | - | 合约名称 | ✅ |
526
620
  | `--network <name>` | `-n` | 网络名称 | - |
621
+ | `--scheme <scheme>` | - | `evm`(默认)或 `zksync-eravm` | - |
622
+ | `--target <name>` | - | `config.yaml` 中的部署策略与 manifest target;zkSync 必需 | zkSync ✅ |
623
+ | `--constructor-args <json>` | - | 当前实现合约构造参数 JSON 数组 | - |
624
+ | `--transaction-hash <hash>` | - | 已确认的部署或升级交易哈希 | zkSync ✅ |
625
+
626
+ #### prepare 命令
627
+
628
+ | 选项 | 简写 | 说明 | 必需 |
629
+ |------|------|------|------|
630
+ | `--network <name>` | `-n` | Hardhat 网络;必须与 request.network 一致 | ✅ |
631
+ | `--request <path>` | - | 项目根目录内的严格 request JSON 文件 | ✅ |
632
+ | `--output <path>` | `-o` | 项目根目录内的 canonical plan JSON 文件 | ✅ |
527
633
 
528
634
  #### validate 命令
529
635
 
@@ -1,5 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { createRequire } from 'node:module';
3
4
 
4
5
  const MANIFEST_MUTATING_COMMANDS = new Set(['sync', 'validate']);
5
6
  const SAFE_MANIFEST_DIR = /^\.openzeppelin(?:\.[a-z0-9][a-z0-9-]*)?$/;
@@ -26,6 +27,91 @@ const isLocalDevelopmentNetwork = (network) => (
26
27
  /^(hardhat|localhost|local|anvil)$/i.test(network || '')
27
28
  );
28
29
 
30
+ const assertConfinedRegularFile = (cwd, requestedPath, label) => {
31
+ if (!requestedPath || typeof requestedPath !== 'string') {
32
+ throw new Error(`${label} is required`);
33
+ }
34
+ const projectRoot = path.resolve(cwd);
35
+ const candidate = path.resolve(projectRoot, requestedPath);
36
+ const relative = path.relative(projectRoot, candidate);
37
+ if (relative === '' || relative.startsWith('..') || path.isAbsolute(relative)) {
38
+ throw new Error(`${label} must be a file inside the project root`);
39
+ }
40
+ let current = projectRoot;
41
+ for (const segment of relative.split(path.sep).filter(Boolean)) {
42
+ current = path.join(current, segment);
43
+ if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink()) {
44
+ throw new Error(`${label} path cannot contain a symlink`);
45
+ }
46
+ }
47
+ if (!fs.existsSync(candidate) || !fs.lstatSync(candidate).isFile()) {
48
+ throw new Error(`${label} must be an existing regular file`);
49
+ }
50
+ return candidate;
51
+ };
52
+
53
+ const readPrepareRoute = (argv, cwd, cliNetwork) => {
54
+ const requestFile = assertConfinedRegularFile(
55
+ cwd,
56
+ argumentValue(argv, '--request'),
57
+ 'prepare request',
58
+ );
59
+ let request;
60
+ try {
61
+ request = JSON.parse(fs.readFileSync(requestFile, 'utf8'));
62
+ } catch (error) {
63
+ throw new Error(`prepare request is not valid JSON: ${error.message}`);
64
+ }
65
+ if (!request || typeof request !== 'object' || Array.isArray(request)) {
66
+ throw new Error('prepare request must be an object');
67
+ }
68
+ const requestNetwork = typeof request.network === 'string' ? request.network.trim() : '';
69
+ const target = typeof request.target === 'string' ? request.target.trim() : '';
70
+ if (!requestNetwork || !target) {
71
+ throw new Error('prepare request must contain network and target');
72
+ }
73
+ if (requestNetwork !== cliNetwork) {
74
+ throw new Error(
75
+ `prepare request network ${requestNetwork} does not match CLI network ${cliNetwork || '<missing>'}`,
76
+ );
77
+ }
78
+ return { target };
79
+ };
80
+
81
+ const loadTargetManifestDirectory = (cwd, target) => {
82
+ const configFile = path.join(path.resolve(cwd), 'config.yaml');
83
+ const confinedConfig = assertConfinedRegularFile(cwd, configFile, 'config.yaml');
84
+ let YAML;
85
+ try {
86
+ YAML = createRequire(path.join(path.resolve(cwd), 'package.json'))('yaml');
87
+ } catch {
88
+ YAML = createRequire(import.meta.url)('yaml');
89
+ }
90
+ const parsed = YAML.parse(fs.readFileSync(confinedConfig, 'utf8'), { merge: true });
91
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
92
+ throw new Error('config.yaml must define target keys at the top level');
93
+ }
94
+ const selected = parsed[target];
95
+ if (!selected || typeof selected !== 'object' || Array.isArray(selected) || target.startsWith('_')) {
96
+ throw new Error(`config.yaml has no target ${target}`);
97
+ }
98
+ const environment = selected.environment;
99
+ if (!new Set(['local', 'development', 'production']).has(environment)) {
100
+ throw new Error(`config.yaml target ${target} has an invalid environment`);
101
+ }
102
+ const manifestDir = selected.openzeppelin?.manifestDir;
103
+ if (typeof manifestDir !== 'string' || !SAFE_MANIFEST_DIR.test(manifestDir)) {
104
+ throw new Error(`config.yaml target ${target} has an unsafe OpenZeppelin manifest directory`);
105
+ }
106
+ if (environment === 'production' && manifestDir !== '.openzeppelin') {
107
+ throw new Error(`production target ${target} must use .openzeppelin`);
108
+ }
109
+ if (environment !== 'production' && manifestDir === '.openzeppelin') {
110
+ throw new Error(`non-production target ${target} must not use .openzeppelin`);
111
+ }
112
+ return manifestDir;
113
+ };
114
+
29
115
  const assertConfinedManifestDirectory = (cwd, manifestDir) => {
30
116
  if (!SAFE_MANIFEST_DIR.test(manifestDir)) {
31
117
  throw new Error(`Unsafe MANIFEST_DEFAULT_DIR: ${manifestDir}`);
@@ -55,6 +141,16 @@ export const resolveManifestBootstrap = ({
55
141
  const network = (
56
142
  argumentValue(argv, '--network') ?? argumentValue(argv, '-n')
57
143
  )?.trim();
144
+ const prepareRoute = command === 'prepare'
145
+ ? readPrepareRoute(argv, cwd, network)
146
+ : undefined;
147
+ const explicitTarget = argumentValue(argv, '--target')?.trim();
148
+ if (prepareRoute && explicitTarget && explicitTarget !== prepareRoute.target) {
149
+ throw new Error(
150
+ `prepare target ${prepareRoute.target} does not match CLI target ${explicitTarget}`,
151
+ );
152
+ }
153
+ const target = prepareRoute?.target ?? explicitTarget;
58
154
  const mutatesManifest = MANIFEST_MUTATING_COMMANDS.has(command);
59
155
  if (mutatesManifest && isLocalDevelopmentNetwork(network)) {
60
156
  throw new Error(
@@ -62,11 +158,14 @@ export const resolveManifestBootstrap = ({
62
158
  + 'OpenZeppelin stores ephemeral development manifests outside the project',
63
159
  );
64
160
  }
65
- const conventional = conventionalManifestDir(network);
161
+ const routeName = target ?? network;
162
+ const conventional = target
163
+ ? loadTargetManifestDirectory(cwd, target)
164
+ : conventionalManifestDir(routeName);
66
165
  const configured = env.MANIFEST_DEFAULT_DIR?.trim();
67
166
  if (configured && conventional && configured !== conventional) {
68
167
  throw new Error(
69
- `MANIFEST_DEFAULT_DIR conflict for ${network}: expected ${conventional}, received ${configured}`,
168
+ `MANIFEST_DEFAULT_DIR conflict for ${routeName}: expected ${conventional}, received ${configured}`,
70
169
  );
71
170
  }
72
171
  const manifestDir = configured || conventional;
@@ -77,12 +176,19 @@ export const resolveManifestBootstrap = ({
77
176
  );
78
177
  }
79
178
  if (manifestDir) assertConfinedManifestDirectory(cwd, manifestDir);
80
- return { command, network, manifestDir, mutatesManifest };
179
+ return {
180
+ command,
181
+ network,
182
+ ...(target ? { target } : {}),
183
+ manifestDir,
184
+ mutatesManifest,
185
+ };
81
186
  };
82
187
 
83
188
  export const prepareManifestEnvironment = (options = {}) => {
84
189
  const env = options.env ?? process.env;
85
190
  const resolved = resolveManifestBootstrap({ ...options, env });
86
191
  if (resolved.manifestDir) env.MANIFEST_DEFAULT_DIR = resolved.manifestDir;
192
+ if (resolved.target) env.GATE_WORKFLOW_TARGET = resolved.target;
87
193
  return resolved;
88
194
  };
@@ -0,0 +1,8 @@
1
+ import { createRequire } from 'node:module';
2
+ import { type GateToolPreparationHre } from '../core/preparation/index.js';
3
+ import type { GateToolPreparationPlanV1 } from '../core/preparation/types.js';
4
+ import type { PrepareOptions } from '../types.js';
5
+ export declare const prepareWithHre: (options: PrepareOptions, hre: GateToolPreparationHre, root?: string) => Promise<GateToolPreparationPlanV1>;
6
+ export declare const loadHardhat: (root: string, requireFactory?: typeof createRequire) => Promise<GateToolPreparationHre>;
7
+ export declare const prepareCommand: (options: PrepareOptions, root?: string) => Promise<GateToolPreparationPlanV1>;
8
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM5C,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2ClD,eAAO,MAAM,cAAc,GACzB,SAAS,cAAc,EACvB,KAAK,sBAAsB,EAC3B,aAAoB,KACnB,OAAO,CAAC,yBAAyB,CAWnC,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,iBAAgB,OAAO,aAA6B,KACnD,OAAO,CAAC,sBAAsB,CAahC,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,SAAS,cAAc,EACvB,aAAoB,KACnB,OAAO,CAAC,yBAAyB,CAOnC,CAAC"}
@@ -0,0 +1,78 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import { normalizePreparationRequest, writePreparationPlanAtomic, } from '../core/preparation/normalize.js';
5
+ import { prepareWorkflow, } from '../core/preparation/index.js';
6
+ import { isValidNetworkName } from '../utils/security.js';
7
+ const confinedFile = (root, requestedPath, label) => {
8
+ const resolvedRoot = path.resolve(root);
9
+ const resolvedPath = path.resolve(resolvedRoot, requestedPath);
10
+ const relative = path.relative(resolvedRoot, resolvedPath);
11
+ if (relative === '' || relative.startsWith('..') || path.isAbsolute(relative)) {
12
+ throw new Error(`${label} must be a file inside the project root`);
13
+ }
14
+ let current = resolvedRoot;
15
+ for (const segment of relative.split(path.sep).filter(Boolean)) {
16
+ current = path.join(current, segment);
17
+ if (fs.existsSync(current) && fs.lstatSync(current).isSymbolicLink()) {
18
+ throw new Error(`${label} path cannot contain a symlink`);
19
+ }
20
+ }
21
+ return resolvedPath;
22
+ };
23
+ const readRequest = (requestPath, root) => {
24
+ const confined = confinedFile(root, requestPath, 'preparation request');
25
+ let stat;
26
+ try {
27
+ stat = fs.lstatSync(confined);
28
+ }
29
+ catch {
30
+ throw new Error(`preparation request does not exist: ${requestPath}`);
31
+ }
32
+ if (stat.isSymbolicLink())
33
+ throw new Error('preparation request cannot be a symlink');
34
+ if (!stat.isFile())
35
+ throw new Error('preparation request must be a regular file');
36
+ try {
37
+ return JSON.parse(fs.readFileSync(confined, 'utf8'));
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ throw new Error(`preparation request is not valid JSON: ${message}`);
42
+ }
43
+ };
44
+ export const prepareWithHre = async (options, hre, root = process.cwd()) => {
45
+ const rawRequest = readRequest(options.request, root);
46
+ const request = normalizePreparationRequest(rawRequest);
47
+ if (request.network !== options.network) {
48
+ throw new Error(`preparation request network ${request.network} does not match CLI network ${options.network}`);
49
+ }
50
+ const outputPath = confinedFile(root, options.output, 'preparation plan output');
51
+ const plan = await prepareWorkflow(hre, request);
52
+ return writePreparationPlanAtomic(outputPath, plan, root);
53
+ };
54
+ export const loadHardhat = async (root, requireFactory = createRequire) => {
55
+ const projectRequire = requireFactory(path.join(path.resolve(root), 'package.json'));
56
+ try {
57
+ projectRequire('hardhat/register');
58
+ return projectRequire('hardhat');
59
+ }
60
+ catch (requireError) {
61
+ try {
62
+ const hardhatModule = await import('hardhat');
63
+ return (hardhatModule.default ?? hardhatModule);
64
+ }
65
+ catch {
66
+ throw requireError;
67
+ }
68
+ }
69
+ };
70
+ export const prepareCommand = async (options, root = process.cwd()) => {
71
+ if (!isValidNetworkName(options.network)) {
72
+ throw new Error('network name may contain only letters, numbers, underscores, and hyphens');
73
+ }
74
+ process.env.HARDHAT_NETWORK = options.network;
75
+ const hre = await loadHardhat(root);
76
+ return prepareWithHre(options, hre, root);
77
+ };
78
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/commands/prepare.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA+HrD"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA2GrD"}
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
- import { syncNetworkFile } from '../core/syncUpgradeJson.js';
3
+ import { syncWithHre } from '../sync/index.js';
4
4
  import fs from 'fs-extra';
5
5
  import path from 'path';
6
6
  import { createRequire } from 'module';
@@ -61,38 +61,21 @@ export async function syncUpgrade(options) {
61
61
  }
62
62
  }
63
63
  spinner.succeed(`Hardhat 环境已加载 (网络: ${chalk.cyan(hre.network.name)})`);
64
- // 5. 解析构造函数参数(如果有)
65
- let constructorArgs = [];
66
- if (options.constructorArgs) {
67
- try {
68
- // 尝试作为 JSON 数组解析
69
- constructorArgs = JSON.parse(options.constructorArgs);
70
- if (!Array.isArray(constructorArgs)) {
71
- throw new Error('构造函数参数必须是一个数组');
72
- }
73
- console.log(chalk.blue(`\n📝 构造函数参数: ${JSON.stringify(constructorArgs)}\n`));
74
- }
75
- catch (error) {
76
- throw new Error(`构造函数参数格式错误: ${error.message}\n请使用 JSON 数组格式,例如: '["arg1", "arg2"]' 或 '[100, "0x123..."]'`);
77
- }
78
- }
79
- // 6. 执行同步
64
+ // 5. 执行同步(EVM 保持 legacy forceImport;zkSync 使用显式原子 manifest writer)
80
65
  console.log('');
81
- const result = await syncNetworkFile({
82
- proxyAddress: options.proxy,
83
- contractName: options.contract,
84
- networkName: options.network,
85
- constructorArgs: constructorArgs,
86
- skipTxHash: options.skipTxHash,
87
- hre
88
- });
66
+ const result = await syncWithHre(options, hre, cwd);
89
67
  // 7. 显示成功信息
90
68
  console.log(chalk.green.bold('\n✅ 同步成功!\n'));
91
69
  console.log(chalk.cyan('同步结果摘要:'));
92
70
  console.log(chalk.gray('─'.repeat(60)));
93
- console.log(`${chalk.white('代理合约:')} ${chalk.yellow(result.proxyAddress)}`);
94
- console.log(`${chalk.white('实现合约:')} ${chalk.yellow(result.implementationAddress)}`);
95
- console.log(`${chalk.white('网络文件:')} ${chalk.gray(result.networkFile)}`);
71
+ const proxyAddress = 'proxyAddress' in result ? result.proxyAddress : result.proxy;
72
+ const implementationAddress = 'implementationAddress' in result
73
+ ? result.implementationAddress
74
+ : result.implementation;
75
+ const manifestFile = 'networkFile' in result ? result.networkFile : result.manifestFile;
76
+ console.log(`${chalk.white('代理合约:')} ${chalk.yellow(proxyAddress)}`);
77
+ console.log(`${chalk.white('实现合约:')} ${chalk.yellow(implementationAddress)}`);
78
+ console.log(`${chalk.white('网络文件:')} ${chalk.gray(manifestFile)}`);
96
79
  console.log(chalk.gray('─'.repeat(60)));
97
80
  console.log('');
98
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type InterfaceAbi } from 'ethers';
2
+ import type { GateToolArtifactIdentity, GateToolScheme } from './types.js';
3
+ export interface GateToolArtifact {
4
+ _format: string;
5
+ contractName: string;
6
+ sourceName: string;
7
+ abi: InterfaceAbi;
8
+ bytecode: string;
9
+ deployedBytecode?: string;
10
+ linkReferences?: Record<string, unknown>;
11
+ deployedLinkReferences?: Record<string, unknown>;
12
+ factoryDeps?: string[] | Record<string, string>;
13
+ }
14
+ export declare const assertArtifactScheme: (artifact: GateToolArtifact, scheme: GateToolScheme) => void;
15
+ interface ZkArtifactReader {
16
+ readArtifact(name: string): Promise<GateToolArtifact>;
17
+ }
18
+ export declare const collectZkFactoryDeps: (artifacts: ZkArtifactReader, rootArtifact: GateToolArtifact) => Promise<string[]>;
19
+ export declare const artifactIdentity: (artifact: GateToolArtifact, scheme: GateToolScheme) => GateToolArtifactIdentity;
20
+ export {};
21
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/core/preparation/artifacts.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAID,eAAO,MAAM,oBAAoB,GAC/B,UAAU,gBAAgB,EAC1B,QAAQ,cAAc,KACrB,IAqBF,CAAC;AAEF,UAAU,gBAAgB;IACxB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvD;AAMD,eAAO,MAAM,oBAAoB,GAC/B,WAAW,gBAAgB,EAC3B,cAAc,gBAAgB,KAC7B,OAAO,CAAC,MAAM,EAAE,CAoClB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,gBAAgB,EAC1B,QAAQ,cAAc,KACrB,wBAkBF,CAAC"}
@@ -0,0 +1,80 @@
1
+ import crypto from 'node:crypto';
2
+ import { isHexString, keccak256 } from 'ethers';
3
+ import { canonicalPreparationJson } from './normalize.js';
4
+ const jsonSafe = (value) => JSON.parse(JSON.stringify(value));
5
+ export const assertArtifactScheme = (artifact, scheme) => {
6
+ const expected = scheme === 'evm'
7
+ ? 'hh-sol-artifact-1'
8
+ : 'hh-zksolc-artifact-1';
9
+ if (artifact._format !== expected) {
10
+ throw new Error(`${scheme} requires artifact format ${expected}`);
11
+ }
12
+ if (!artifact.sourceName || !artifact.contractName || !artifact.bytecode || artifact.bytecode === '0x') {
13
+ throw new Error('artifact is missing source, contract, or bytecode');
14
+ }
15
+ if (!isHexString(artifact.bytecode))
16
+ throw new Error('artifact bytecode must be hex bytes');
17
+ if (scheme === 'zksync-eravm'
18
+ && (!artifact.factoryDeps
19
+ || typeof artifact.factoryDeps !== 'object'
20
+ || Array.isArray(artifact.factoryDeps))) {
21
+ throw new Error('hh-zksolc artifact factoryDeps must be an object');
22
+ }
23
+ };
24
+ const artifactName = (artifact) => (`${artifact.sourceName}:${artifact.contractName}`);
25
+ export const collectZkFactoryDeps = async (artifacts, rootArtifact) => {
26
+ assertArtifactScheme(rootArtifact, 'zksync-eravm');
27
+ const visitedArtifacts = new Set([artifactName(rootArtifact)]);
28
+ const bytecodeHashes = new Set();
29
+ const result = [];
30
+ const addBytecode = (bytecode) => {
31
+ if (!isHexString(bytecode) || bytecode === '0x') {
32
+ throw new Error('zkSync factory dependency bytecode must be non-empty hex bytes');
33
+ }
34
+ const digest = keccak256(bytecode);
35
+ if (bytecodeHashes.has(digest))
36
+ return;
37
+ bytecodeHashes.add(digest);
38
+ result.push(bytecode.toLowerCase());
39
+ };
40
+ const visitDependencies = async (artifact) => {
41
+ assertArtifactScheme(artifact, 'zksync-eravm');
42
+ const dependencies = artifact.factoryDeps;
43
+ for (const dependencyName of Object.values(dependencies)) {
44
+ if (typeof dependencyName !== 'string' || dependencyName.trim() === '') {
45
+ throw new Error('zkSync factory dependency must name an artifact');
46
+ }
47
+ const normalizedName = dependencyName.trim();
48
+ if (visitedArtifacts.has(normalizedName))
49
+ continue;
50
+ visitedArtifacts.add(normalizedName);
51
+ const dependency = await artifacts.readArtifact(normalizedName);
52
+ assertArtifactScheme(dependency, 'zksync-eravm');
53
+ addBytecode(dependency.bytecode);
54
+ await visitDependencies(dependency);
55
+ }
56
+ };
57
+ addBytecode(rootArtifact.bytecode);
58
+ await visitDependencies(rootArtifact);
59
+ return result;
60
+ };
61
+ export const artifactIdentity = (artifact, scheme) => {
62
+ assertArtifactScheme(artifact, scheme);
63
+ const digest = crypto.createHash('sha256').update(canonicalPreparationJson(jsonSafe({
64
+ _format: artifact._format,
65
+ sourceName: artifact.sourceName,
66
+ contractName: artifact.contractName,
67
+ abi: artifact.abi,
68
+ bytecode: artifact.bytecode,
69
+ deployedBytecode: artifact.deployedBytecode ?? '0x',
70
+ linkReferences: artifact.linkReferences ?? {},
71
+ deployedLinkReferences: artifact.deployedLinkReferences ?? {},
72
+ factoryDeps: artifact.factoryDeps ?? [],
73
+ }))).digest('hex');
74
+ return {
75
+ sourceName: artifact.sourceName,
76
+ contractName: artifact.contractName,
77
+ digest,
78
+ };
79
+ };
80
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/core/preparation/artifacts.ts"],"names":[],"mappings":"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"}