审计概览
- 审核类型:DeFi 智能合约安全审计
- 时间范围:2023-07-31 至 2023-08-11
- 主要语言:Solidity
发现总数:16
- 已解决 10 项
- 部分解决 1 项
- 中风险 2 项
- 低风险 8 项
- 说明与附加信息 6 项
代码仓库结构一览
src/
├── base/
│ ├── ProtocolFees.sol
│ ├── ReactorEvents.sol
│ └── ReactorStructs.sol
├── external/
│ └── ISwapRouter02.sol
├── interfaces/
│ ├── IProtocolFeeController.sol
│ ├── IReactor.sol
│ ├── IReactorCallback.sol
│ └── IValidationCallback.sol
├── lens/
│ └── OrderQuoter.sol
├── lib/
│ ├── CurrencyLibrary.sol
│ ├── DutchDecayLib.sol
│ ├── DutchOrderLib.sol
│ ├── ExclusiveDutchOrderLib.sol
│ ├── ExclusivityOverrideLib.sol
│ ├── LimitOrderLib.sol
│ ├── OrderInfoLib.sol
│ ├── Permit2Lib.sol
│ └── ResolvedOrderLib.sol
├── reactors/
│ ├── BaseReactor.sol
│ ├── DutchOrderReactor.sol
│ ├── ExclusiveDutchOrderReactor.sol
│ └── LimitOrderReactor.sol
├── sample-executors/
│ └── SwapRouter02Executor.sol
└── sample-validation-contracts/
└── ExclusiveFillerValidation.sol系统鸟瞰
UniswapX 作为非托管交易框架,核心亮点在于“荷兰拍”+“RFQ 双重机制”“无 Gas 签名体验”以及“抗 MEV 优化”。用户创建带签名的交易订单,交由“填充者”(Fillers,即 MEV 搜索者、做市机器人等链上代理)在链上博弈成交。系统通过 Reactor 合约保障资金安全、抵御前置抢跑。
订单类型一览
- 荷兰拍订单
价格随时间线性下降,鼓励抢先成交,利好用户最终成交价。 - 独家荷兰拍订单
在衰减开始前提供限时专属权,防止竞争,提高价格发现效率。 - 限价订单
固定目标价,无关时间,一次成交流程完成。
👉 想亲自体验各种订单的交易逻辑?点击进入实时数据面板查看成交量差异与费率变化。
参数设定与 RFQ 系统
订单参数(起始价、衰减区间)对最终成交结果影响极大,但普通用户难以正确估算。
UniswapX 提供 Quote Request 机制,让受信任报价方报价并给予短暂专属填充权,未来会开放为无需许可市场。
常见问题答疑
Q1:DeFi 小白也能看懂荷兰拍订单的衰减计算吗?
A:系统会在签名前展示“预计成交价区间”,用户只需确认即可。若价格跌破“最低可接受价”,订单会被自动撤销。
Q2:RFQ 系统会不会“作恶”坏人报价?
A:当前只允许 Uniswap Labs 白名单参与。下一阶段将增加 奖惩保证金池,恶行导致保证金被罚没。
Q3:无 Gas 交易真的是零费用吗?
A:Gas 由填充者垫付,已折入成交价。若想确认最终到手币量,使用系统内 OrderQuoter 模拟器 就能一键查看。
权限角色与治理设计
- ProtocolFees 合约:由 Uniswap Dao 持有,可更换 FeeController。
- Fee 上限:0.05%(输出量级),若未设置或放弃治理,则无法变更。
👉 想追踪治理提案是否会降低手续费上限?实时关注链上投票节奏。
中风险漏洞
M-01:填充者无最终回滚点导致可能亏损
场景:恶意 ERC-20/ERC-777 在 transferFrom 中发动二次回调耗光填充者 Gas,导致盈利变成亏损。
缓解:
- 填充者建议使用 中间合约。
- 结合 Flashbots/MevBlocker 等私有 mempool,避免 Gas 预支。
官方表示暂不修复,因现有工具已能解决。
M-02:原生币转账 6900 Gas 限制会卡智能合约钱包
影响:多签、智能合约钱包或聚合器在接收 ETH 时可能失败。
状态:已通过 PR #189 移除硬编码限制,链上升级后兼容任意钱包。
低风险与治理建议
| 序号 | 风险项 | 修复进度 |
|---|---|---|
| L-01 | 浮动 Pragma 与 L2 兼容性 | 未修复,表达式不锁定具体编译器版本 |
| L-02 | FeeController 返回值错误可能阻断交易 | 未修复,官方可一键重新部署 Reactor 减轻影响 |
| L-03 | 荷兰拍零持续时长实际等同限价但沿用荷兰单价,风险偏心用户 | 已修复,零持续时长被拒绝 |
| L-04 | 注释缺失 | 使用 NatSpec 补全 |
| L-05 | 文档与代码不一致 | 同步更新源码及官网文档 |
| L-06 | 测试覆盖率不完整 | 已补充 ExclusiveDutchReactor 输入衰减与 ProtocolFees 输入费测试 |
| L-07 | 冗余校验 | 已清理 |
| L-08 | Magic Number 无说明 | 已标注常量名与注释 |
附加信息
- 潜在跨链双费:同一链跨链桥合约视为“自己换自己”,累加可能导致双收 0.1% 费用。
- Gas 优化:已采纳前缀
++i优化并保留可读性优先的批量逻辑。
运营建议:如何监控链上异常
- 权限变动监控:监听
ProtocolFeeControllerSet事件,FeeController 异常变更需告警。 - 订单参数异常:对“衰减极快”“零时长”订单进行统计离群检测。
- 新 Reactor 上线:发布后追踪其地址白名单变化,避免任意合约作恶。
FAQ:补满用户最关心的细节
Q4:荷兰拍失败会不会签单后卡死?
A:不会。所有订单带 deadline,过期自动失效。清除 Pending 状态无需额外操作。
Q5:如果智能合约钱包支持不到 6900 Gas 会出现资金丢失吗?
A:绝无可能。交易在 Reactor 层面会回滚,钱包资产保持原位,仅是无法通过该路由器兑换。
Q6:二次回调攻击是否不可避免?
A:通用合约填充者的策略:(1) 采用多签合约前调 Gas Estimate;(2) 进入私密 mempool;(3) 回调内即时计算盈亏再最终回滚。这样可确保仅是 gas griefing,而非亏损交易 。
Q7:未来升级对现有用户有什么影响?
A:Reactor 为升级最小单位,后续可在前端 自动路由至最新版本合约。老订单在链上依旧有效,直至其自然过期。
结论
本次审计显示,UniswapX 结构模块化、代码轻量且高度可扩展;在抗 MEV、无 Gas 体验方面设计领先。官方已迅速修复多数低风险及优化建议,核心经济安全通过荷兰拍竞争机制与签名验证双重防护。对于 DeFi 交易者与聚合器开发者,UniswapX 已成为值得关注的高阶交易入口。