# 审计说明 — 策略 SoT / 资金门 / 自动兑 USDC(2026-07-30) ## 基线假设 1. **不会**在交易所人工开仓/平仓。 2. **运行中不会**使用本系统「手动全平 / 手动开一组」(策略跑着时手动开仓本就 409)。 3. 以策略主线为唯一真相源:盯仓 →(等待预览兑 USDC)→ 选约 → 定仓落库 → 兑 USDC → 资金门 fail-closed → 开仓 → 锁定出场。 ## 结论(三轮严格审计后) 本轮按审计清单落地后:**P0 资金门 fail-open、热切 LIVE 护栏、等待写定仓打架、force 砸单、手动/自动双管道、持仓改参、下载备份带密钥** 已关闭或显著收敛。 残留:币安 LIVE 余额仍未接入(现 fail-closed 拒绝开仓,需接余额或改手动本金);SIM 资金重置仍默认进资金账户(需划转至交易账户才能开);机内 zip 仍可能含 `.env`(仅 HTTP 下载已剥离)。 --- ## 第一轮审计(改完即审 · 对照清单) | 原发现 | 处置 | 证据 | |--------|------|------| | P0 资金门 fail-open | **已修** | `funds_gate_blocks`:仅双方 `is True` 放行;`None`/异常拦截。`open_pipeline.size_and_gate` + `engine`/`sim` 共用 | | P0 热切 LIVE | **已修** | `put_runtime`:非默认 `AUTH_SECRET`;切 LIVE 强制 `running=0`/`paused` | | P1 等待每 tick 写定仓 | **已修** | `prepare_okx_trading_usdc` / `preview_capacity_for_convert` 只预览;落库仅在 `size_and_gate` | | P1 force 砸单 | **已修** | `force` 参数忽略,45s 冷却始终生效 | | P1 容量 ask ≠ 选约腿 | **已修** | `assess_open_capacity(option_ask=…)`;`size_and_gate` 传入 `pick` 卖一 | | P1 手动≠自动 | **已修** | `api/sim.py` 与引擎共用 `size_and_gate` | | P1 持仓改出场/名义 | **已修** | `put_strategy_settings` 持仓禁止改 exit/qty/leverage/risk_* | | P1 备份下载含 .env | **已修** | `materialize_download_zip` 剥离后下载 | | P2 划转不清缓存 | **已修** | `funds.transfer` LIVE 后 `invalidate_live_balance_cache` | | P2 SIM 弱占坑 | **已修** | `matcher.open_group` 拒绝全部 `BLOCKING_STATUSES` | **第一轮残留:** 币安余额未接 → LIVE BN 将长期 `wait_funds`(刻意 fail-closed,非放行)。 --- ## 第二轮审计(干扰/打架复查) 路径重读:`engine._tick_async` → `prepare_usdc_while_waiting` → pick → `size_and_gate` → LIVE `assert_safe` → `open_group`。 | 检查点 | 结果 | |--------|------| | 等待阶段是否写 `perp_qty_eth`/`net_profit_target` | 否(仅 preview assess) | | 选约失败是否仍兑 USDC | 是(预览名义),不挡「无合格期权」文案分支 | | 选约后资金门异常是否放行 | 否(`size_and_gate` 返回 ok=False) | | 手动开仓是否仍 `except: pass` | 否(409 + detail) | | 持仓 `exit_target` 与设置 | 设置被锁;盯盘用锁定目标(既有逻辑保留) | | 自动兑与定仓顺序 | 定仓落库 → 兑 → 门;等待只有兑不落库 | **第二轮新发现(已记残留,未扩 scope):** - SIM:`reset_from_equity` 仍进资金账户 → 交易账户空时正确 fail-closed,需手动划转(符合「只认交易账户」)。 - `state()` 空仓仍 preview 覆盖展示字段名(展示层,不写库,不改出场执行)。 --- ## 第三轮审计(实盘安全 + 回归) | 检查 | 结果 | |------|------| | LIVE 开仓 claim/assert | 未改坏;仍在 `size_and_gate` 之后 | | 冷启动 AUTH_SECRET | 保留;热切现对齐 pause + secret | | 兑汇账户 | 交易账户;与手动 `/convert` 一致 | | 单测 | `test_funds_gate` / `test_auto_usdc` / `test_exit_lock` / `test_risk_sizing` 通过 | | 基线「无交易所人工开平」 | 文档化;代码不依赖该行为做对账放弃 | **第三轮残留(接受或后续):** 1. 币安 LIVE 余额未接线 → 开仓被拒直至接入或强制手动本金策略。 2. 机内自动备份 zip 默认可含 `.env`(磁盘权限模型);HTTP 下载已无密钥。 3. LIVE 兑换/划转仍无二次口令(仅登录态)——运行中无人工操作为基线时风险降低。 4. `localStorage` 长 token / XFF 登录限流等通用 Web 项未本轮改。 --- ## 涉及文件 `strategy/open_pipeline.py`(新)· `open_capacity.py` · `auto_usdc.py` · `engine.py` · `api/sim.py` · `api/settings.py` · `api/funds.py` · `api/backup_routes.py` · `backup.py` · `sim/matcher.py` · `tests/test_funds_gate.py` · `tests/test_auto_usdc.py` ## 与上一份审计关系 承接 `审计说明-2026-07-29-开平仓与实盘安全.md`(开平仓 claim/recover)。本份专注 **策略 SoT 不打架 + 资金门/兑汇/热切 LIVE**。