Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ch04-10 部分成交、完全成交、剩余挂单

返回本章

先看订单现场

先把“部分成交、完全成交、剩余挂单”放进一笔订单里看。用户看到的是买卖按钮,链上真正发生的是 Pool 接住入口、Book 决定撮合、OrderInfo 带着执行结果回到资金结算。

源码入口

把订单走一遍

order_info::match_maker 每撮合一个 maker:

  • 调用 maker.generate_fill(...)
  • 如果 fill 未过期,则增加 taker executed_quantitycumulative_quote_quantity
  • taker 状态先设为 partially filled;如果 remaining 为 0,则设为 filled。

book::match_against_book 撮合后会移除 expired 或 completed maker。然后 assert_execution 判断 taker 是否终止:

  • 完全成交:状态 filled,不挂单。
  • IOC:剩余取消,不挂单。
  • fill limit reached:不继续扫描,函数返回 true,不挂单。
  • 普通限价单仍有剩余:inject_limit_order,状态 live/partially filled,order_inserted = true

状态变化表:

场景taker executedtaker statusmaker status是否插入 taker
完全成交original_quantityfilledfilled 或 partially_filled
部分成交普通限价小于 originalpartially_filledfilled/partially_filled
IOC 部分成交小于 originalcanceledfilled/partially_filled
post-only crossing大于 0 前 abortabort回滚
FOK 不完全成交小于 original 前 abortabort回滚

源码旁白:撮合相关小节都从 packages/deepbook/sources/pool.move 的 public 入口进入,再沿 packages/deepbook/sources/book/book.move 追踪撮合、插入或取消。读的时候把 taker 的 OrderInfo 和 maker 的 Order 分开:前者是本次执行结果,后者才是可能继续留在订单簿里的状态。

事件阅读时要把 OrderPlacedOrderFilledOrderFullyFilledOrderCanceledOrderExpired 串成生命周期。取消和过期还会触发锁定资产释放,退款由 Order 计算后进入结算路径。

交易实现提醒

  • u128 + BigInt 思维处理 order_id、price、quantity,避免前端精度丢失。
  • 先判断订单会进入撮合、直接失败、完全吃单还是剩余挂单,再设计事件监听和 UI 状态。
  • 读取 FillOrderInfo 时同时记录 maker/taker 方向,避免把 base、quote 的应收应付方向写反。

动手检查

  • 部分成交、完全成交、剩余挂单 依赖哪一个 pool.move 入口,下一跳进入哪个 book/* 函数?
  • 成功路径会产生哪些订单事件,失败时最可能命中输入、执行策略还是余额相关校验?
  • 如果前端或 indexer 展示本节数据,哪些字段必须保持链上原始整数格式?