gate-evm-tools 1.0.23 → 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.
- package/README.md +64 -5
- package/bin/manifest-bootstrap.js +109 -3
- package/dist/commands/prepare.d.ts +8 -0
- package/dist/commands/prepare.d.ts.map +1 -0
- package/dist/commands/prepare.js +78 -0
- package/dist/commands/prepare.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +11 -28
- package/dist/commands/sync.js.map +1 -1
- package/dist/core/preparation/artifacts.d.ts +21 -0
- package/dist/core/preparation/artifacts.d.ts.map +1 -0
- package/dist/core/preparation/artifacts.js +80 -0
- package/dist/core/preparation/artifacts.js.map +1 -0
- package/dist/core/preparation/evm.d.ts +39 -0
- package/dist/core/preparation/evm.d.ts.map +1 -0
- package/dist/core/preparation/evm.js +290 -0
- package/dist/core/preparation/evm.js.map +1 -0
- package/dist/core/preparation/index.d.ts +9 -0
- package/dist/core/preparation/index.d.ts.map +1 -0
- package/dist/core/preparation/index.js +15 -0
- package/dist/core/preparation/index.js.map +1 -0
- package/dist/core/preparation/manifest.d.ts +43 -0
- package/dist/core/preparation/manifest.d.ts.map +1 -0
- package/dist/core/preparation/manifest.js +169 -0
- package/dist/core/preparation/manifest.js.map +1 -0
- package/dist/core/preparation/normalize.d.ts +7 -0
- package/dist/core/preparation/normalize.d.ts.map +1 -0
- package/dist/core/preparation/normalize.js +496 -0
- package/dist/core/preparation/normalize.js.map +1 -0
- package/dist/core/preparation/types.d.ts +111 -0
- package/dist/core/preparation/types.d.ts.map +1 -0
- package/dist/core/preparation/types.js +2 -0
- package/dist/core/preparation/types.js.map +1 -0
- package/dist/core/preparation/zkManifestSync.d.ts +49 -0
- package/dist/core/preparation/zkManifestSync.d.ts.map +1 -0
- package/dist/core/preparation/zkManifestSync.js +159 -0
- package/dist/core/preparation/zkManifestSync.js.map +1 -0
- package/dist/core/preparation/zkUpgradeValidation.d.ts +37 -0
- package/dist/core/preparation/zkUpgradeValidation.d.ts.map +1 -0
- package/dist/core/preparation/zkUpgradeValidation.js +91 -0
- package/dist/core/preparation/zkUpgradeValidation.js.map +1 -0
- package/dist/core/preparation/zksync.d.ts +28 -0
- package/dist/core/preparation/zksync.d.ts.map +1 -0
- package/dist/core/preparation/zksync.js +248 -0
- package/dist/core/preparation/zksync.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/sync/index.d.ts +31 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +57 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist-cjs/core/preparation/artifacts.js +89 -0
- package/dist-cjs/core/preparation/artifacts.js.map +1 -0
- package/dist-cjs/core/preparation/evm.js +297 -0
- package/dist-cjs/core/preparation/evm.js.map +1 -0
- package/dist-cjs/core/preparation/index.js +19 -0
- package/dist-cjs/core/preparation/index.js.map +1 -0
- package/dist-cjs/core/preparation/manifest.js +180 -0
- package/dist-cjs/core/preparation/manifest.js.map +1 -0
- package/dist-cjs/core/preparation/normalize.js +507 -0
- package/dist-cjs/core/preparation/normalize.js.map +1 -0
- package/dist-cjs/core/preparation/types.js +3 -0
- package/dist-cjs/core/preparation/types.js.map +1 -0
- package/dist-cjs/core/preparation/zkManifestSync.js +166 -0
- package/dist-cjs/core/preparation/zkManifestSync.js.map +1 -0
- package/dist-cjs/core/preparation/zkUpgradeValidation.js +101 -0
- package/dist-cjs/core/preparation/zkUpgradeValidation.js.map +1 -0
- package/dist-cjs/core/preparation/zksync.js +252 -0
- package/dist-cjs/core/preparation/zksync.js.map +1 -0
- package/dist-cjs/core/syncUpgradeJson.js +315 -0
- package/dist-cjs/core/syncUpgradeJson.js.map +1 -0
- package/dist-cjs/sync/index.js +60 -0
- package/dist-cjs/sync/index.js.map +1 -0
- package/dist-cjs/types.js +3 -0
- package/dist-cjs/types.js.map +1 -0
- package/dist-cjs/utils/manifestTransaction.js +302 -0
- package/dist-cjs/utils/manifestTransaction.js.map +1 -0
- package/dist-cjs/utils/openzeppelin.js +57 -0
- package/dist-cjs/utils/openzeppelin.js.map +1 -0
- package/dist-cjs/workflow/index.js +12 -0
- package/dist-cjs/workflow/index.js.map +1 -0
- package/package.json +42 -2
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
|
-
###
|
|
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
|
|
@@ -275,7 +309,7 @@ npx gate-tool check --output ./reports/result.json
|
|
|
275
309
|
|
|
276
310
|
当合约通过 calldata 方式由其他人(如多签钱包)执行升级后,本地的 `.openzeppelin` 文件不会自动更新。使用此命令可以从链上读取最新状态并更新本地文件。
|
|
277
311
|
|
|
278
|
-
`sync` 和 `validate` 会在加载 OpenZeppelin upgrades 之前确定 manifest 目录。约定路由如下:
|
|
312
|
+
`sync` 和 legacy `validate` 会在加载 OpenZeppelin upgrades 之前确定 manifest 目录。canonical workflow 的 `sync --target` 只接受所选 target 的 `config.yaml.openzeppelin.manifestDir`,不使用 Matter Labs 固定 `.upgradable` 目录。约定路由如下:
|
|
279
313
|
|
|
280
314
|
| 网络名 | Manifest 目录 | 含义 |
|
|
281
315
|
|------|------|------|
|
|
@@ -301,13 +335,26 @@ npx gate-tool sync --proxy 0x1234... --contract CounterUUPS --network sepolia
|
|
|
301
335
|
最新 full 模版项目优先使用 `workflow:checkcode` 做只读验收,由模版负责选择精确的 manifest 文件并调用 gate-tool。
|
|
302
336
|
|
|
303
337
|
```bash
|
|
304
|
-
#
|
|
338
|
+
# EVM:confirmed UUPS receipt 后同步合约状态
|
|
305
339
|
npx gate-tool sync \
|
|
340
|
+
--scheme evm \
|
|
306
341
|
--proxy 0x1234... \
|
|
307
342
|
--contract CounterUUPS \
|
|
308
|
-
--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...
|
|
309
354
|
```
|
|
310
355
|
|
|
356
|
+
`sync` 会验证 runtime code、ERC-1967 implementation slot、chain ID、UUPS kind 与当前 artifact/layout。只有 `status=committed` 的 manifest transaction 才能作为 finalized UUPS 证据;失败会恢复原文件名和原始字节。
|
|
357
|
+
|
|
311
358
|
#### ✅ 验证升级安全性并生成 calldata
|
|
312
359
|
|
|
313
360
|
验证合约升级的安全性,并生成 `upgradeToAndCall` 的 calldata。
|
|
@@ -571,6 +618,18 @@ npx gate-tool parse \
|
|
|
571
618
|
| `--proxy <address>` | - | 代理合约地址 | ✅ |
|
|
572
619
|
| `--contract <name>` | - | 合约名称 | ✅ |
|
|
573
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 文件 | ✅ |
|
|
574
633
|
|
|
575
634
|
#### validate 命令
|
|
576
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
|
|
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 ${
|
|
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 {
|
|
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,
|
|
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"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import {
|
|
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
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,
|
|
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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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ContractFactory } from 'ethers';
|
|
2
|
+
import type { GateToolArtifact } from './artifacts.js';
|
|
3
|
+
import type { GateToolPreparationPlanV1, GateToolPreparationRequestV1, GateToolUupsUpgradeRequestV1 } from './types.js';
|
|
4
|
+
interface EvmPreparationHre {
|
|
5
|
+
network: {
|
|
6
|
+
name: string;
|
|
7
|
+
provider?: unknown;
|
|
8
|
+
};
|
|
9
|
+
artifacts: {
|
|
10
|
+
readArtifact(name: string): Promise<GateToolArtifact>;
|
|
11
|
+
};
|
|
12
|
+
ethers: {
|
|
13
|
+
provider: {
|
|
14
|
+
getNetwork(): Promise<{
|
|
15
|
+
chainId: bigint | number | string;
|
|
16
|
+
}>;
|
|
17
|
+
getCode(address: string): Promise<string>;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
upgrades?: {
|
|
21
|
+
validateImplementation?: (factory: ContractFactory, options: Record<string, unknown>) => Promise<void>;
|
|
22
|
+
validateUpgrade?: (proxy: string, factory: ContractFactory, options: Record<string, unknown>) => Promise<void>;
|
|
23
|
+
erc1967?: {
|
|
24
|
+
getImplementationAddress(address: string): Promise<string>;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface EvmUpgradeValidationEvidence {
|
|
29
|
+
currentImplementation: string;
|
|
30
|
+
oldLayoutHash: string;
|
|
31
|
+
newLayoutHash: string;
|
|
32
|
+
manifestDigest: string;
|
|
33
|
+
}
|
|
34
|
+
export interface EvmPreparationDependencies {
|
|
35
|
+
loadUpgradeEvidence?: (hre: EvmPreparationHre, request: GateToolUupsUpgradeRequestV1, factory: ContractFactory, validationOptions: Record<string, unknown>) => Promise<EvmUpgradeValidationEvidence>;
|
|
36
|
+
}
|
|
37
|
+
export declare const prepareEvm: (hre: EvmPreparationHre, request: GateToolPreparationRequestV1, dependencies?: EvmPreparationDependencies) => Promise<GateToolPreparationPlanV1>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=evm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../../src/core/preparation/evm.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAKhB,MAAM,QAAQ,CAAC;AAQhB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMvD,OAAO,KAAK,EAIV,yBAAyB,EACzB,4BAA4B,EAG5B,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAapB,UAAU,iBAAiB;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C,SAAS,EAAE;QAAE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACrE,MAAM,EAAE;QACN,QAAQ,EAAE;YACR,UAAU,IAAI,OAAO,CAAC;gBAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;aAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SAC3C,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,sBAAsB,CAAC,EAAE,CACvB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,CAAC,EAAE;YACR,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SAC5D,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,4BAA4B,EACrC,OAAO,EAAE,eAAe,EACxB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACvC,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAC5C;AA2TD,eAAO,MAAM,UAAU,GACrB,KAAK,iBAAiB,EACtB,SAAS,4BAA4B,EACrC,eAAc,0BAA+B,KAC5C,OAAO,CAAC,yBAAyB,CASnC,CAAC"}
|