# Orbit V7 前端与迁移复核

日期：2026-09-25。性质：内部 AI 第二视角代码复核与本地浏览器验收；不是外部第三方审计，也不是安全保证。

## 结论

本次范围内未确认仍未修复的高危或中危前端问题。发现并完成一项跨流程交易状态保护整改：活动 Web Lock 结束后，持久化的未知钱包交接记录也必须阻止其他 V7 页面开启新签名；V5、V6 两个迁移入口必须共用同一保护函数。整改后完成两个方向的实际浏览器阻断验证。

最终浏览器验收共 16 组通过：部署与市场 10 组，双来源迁移 6 组。所有写入发生在内存 Ganache、chainId 56；公共链写入为零。测试不包含真实用户钱包签名、主网部署回执或主网迁移执行，因此不能据此宣布 V7 已经上链开放。

## 代码范围

- `integration/v7-contracts.js`：构造参数、运行时代码、角色与资产配置、部署回执、首次开放时间。
- `integration/v7-launch.js` / `v7-launch.html`：五步部署、未知交易保存、恢复、重复部署阻断。
- `integration/v7-lock.js`：跨页面活动锁与持久化未知交易阻断。
- `integration/v7-market.js` / `v7-markets.html`：本币存提、补抵押、清算参数、交易上下文。
- `integration/v7-liquidation.js`：固定区块只读试算、所得保护与链上时间期限。
- `integration/v7-borrow.js` / `v7-dashboard.js`：单资产价格依赖、额度计算及利息披露。
- `integration/v7-migrate.js` / `v7-migrate.html`：V5、V6 独立来源、迁移回执、旧奖励、窗口结束后的人工退出路径。
- 复用的 `native-migration.js`、`migration-batch.js`、`five-market-send.js` 按其交易和回执安全边界检查。

## 已关闭问题

### WEB-V7-01：未知交易在活动锁结束后可被另一流程绕过

初始实现只在活动 Promise 期间持有 `orbit-v7-signing` 锁。钱包交接结果未知且没有哈希时，记录会正确保留，但其他路由仍可能取得活动锁并发起新的交易流程。另一个初始遗漏是 V7 迁移页面仍有自身的锁函数，没有执行统一的持久化记录检查。

影响：不同页面可能同时处理同一签名账户的未决 nonce 与迁移状态，造成交易替代、记录无法判断或后续操作顺序混乱。未证明存在资产盗取路径。

整改：统一锁函数检查部署、市场、V5 → V7、V6 → V7 的未决记录；本流程可以恢复自身记录，其他流程停止。迁移入口统一调用同一函数。不能识别的持久化记录也保守阻断。

验证：市场在持久化 V5 → V7 未知记录存在时不发送新交易；V7 迁移在持久化市场未知记录存在时不发送新交易；活动锁竞争同样阻止签名。最后一次仅调整阻断提示文案，未改变判定逻辑。

## 浏览器验证证据

`browser-results.json`，最终通过时间 `2026-09-25T11:26:43.289Z`，本地钱包交易 10 笔：

1. 新 oracle、pool、rewards、configure、unpause 五笔交易全部经页面生成并核对；奖励没有注资，余额为零；迁移起点等于首次开放区块时间，时长恰为 2,592,000 秒。
2. 篡改起止日期或用后续 unpause 替代首次开放回执均被拒绝。
3. 发布有效清单后五个部署按钮全部锁定。
4. BNB 存款与全部提现各一笔，不进行额外包装或授权。
5. 有债务账户在 guardian 暂停后仍可执行原生 BNB 补抵押；普通存款保持禁止。
6. 活动跨页面锁阻断新签名。
7. 持久化迁移未知交接在活动锁已结束后仍阻断市场签名。
8. 清算试算不发送交易；填入 0.5% 所得容差及链上时间加 600 秒的截止时间。
9. 实际清算交易包含正确的八个参数、份额及资产下限、底层代币模式与截止时间；清算人 WBNB 余额增加。
10. 390px 移动宽度无整页横向溢出、无未捕获页面异常。

`migration-results.json`，最终通过时间 `2026-09-25T11:24:56.246Z`，本地钱包交易 10 笔：

1. 迁移页面执行持久化跨流程阻断。
2. V5 提现确认后拒绝授权，刷新不会自动签名；继续仅完成授权和存款。迁入原始提现的 100 USDT，原有 10 USDT 留在钱包。
3. V6 原生 BNB 存款使用 `withdraw(WBNB) → approve → supply` 迁移 2 WBNB，原有 3 WBNB 留在钱包。两来源的计划、待决与队列记录隔离。
4. V6 已赚取奖励从旧奖励合约进入原钱包，V7 奖励余额仍为零。
5. 30 天窗口结束后仍能人工迁移，并保留旧池还款、退出与领奖入口；没有定时自动划转。
6. 双来源迁移移动页面无整页横向溢出、无未捕获页面异常。

部署和市场测试使用精确 V7 生产字节码、原始 ORBIT 运行时代码和本地安装的资产/价格源夹具。迁移测试为本地部署的 V5、V6 旧池替换了浏览器中的旧池地址常量；这是测试环境地址映射，不是对生产地址的修改。对真实旧池状态、主网 RPC 可用性和部署后主网流动性的确认属于另一个验证范围。

## 执行中观察与限制

- 初次清算计数断言曾过早读取上一笔授权的完成提示。测试改为先观察新钱包请求，再等待完成，保留了“恰好增加一笔交易”和八参数及到账断言。
- 后续一次本地清算预检显示 `missing revert data`，未发出钱包交易。未捕获到该次底层 revert selector，未证明是应用或合约缺陷；不能声称已定位并修复其根因。完全相同的八参数在独立最小夹具中 `staticCall` 成功，`eth_estimateGas` 返回 `0xa77d4`；最终添加失败 RPC 诊断的完整浏览器轮也成功执行了清算。因此将此项保留为一次未复现的本地预检异常，而不隐去该次失败。
- Ganache 在 Windows 退出清理临时 `LOG` 文件时可能产生 `EBUSY`。测试只在所有断言与结果文件已完成后，将这个特定框架清理错误单独记录；其他异常仍使测试失败。此项不影响已完成链上断言，也不代表生产运行环境验证。
- 浏览器自动化不验证真实钱包扩展的全部实现、硬件钱包交互、公共 RPC 的诚实性、主网重组深度或最终部署后的源代码浏览器验证。
- 30 天窗口是披露与集中办理时段。旧合约没有第三方强制迁出权限；期限不会恢复私钥、代签或自动搬走资产。旧奖励预算也不能搬到新奖励合约。

## 可复现材料与版本绑定

- `browser-review.mjs` 与 `browser-results.json`：部署、市场与清算脚本及逐组结果，结果含全部 V7 前端来源 SHA-256，包括 `v7-liquidation.js`。
- `migration-review.mjs` 与 `migration-results.json`：双来源迁移脚本及结果，结果含安全相关来源 SHA-256。
- `liquidation-estimation-probe.mjs`：独立精确参数 staticCall / estimateGas 比较。
- `v7-market-mobile.png`、`v7-migration-mobile.png`：本地模拟页面截图，不是主网上线凭证。
- `source-binding.json`：本报告完成时的最终文件 SHA-256，与各组结果逐文件比较。迁移测试后 `v7-lock.js` 仅修改阻断提示文案；逻辑经静态复核一致，最终市场轮包含新文案版本。

测试依赖使用项目现有 Ganache / ethers / esbuild 和本地 Edge / Playwright。复核过程未修改 Site checkout 中的网站源文件；修复由主任务实施。
