ch06-11 交易前模拟、Gas 和错误提示
先从用户动作开始
这一节把“交易前模拟、Gas 和错误提示”当作应用流程来读:先看用户要完成什么,再反推 PTB 需要哪些对象、参数、dry run 和失败处理。
源码入口
- packages/deepbook/sources/pool.move:
place_limit_order、place_market_order、cancel_order(s)、cancel_live_order(s)等 Spot PTB 入口。 - packages/deepbook/sources/book/order_info.move:订单生命周期事件、执行策略校验和用户可见错误来源。
- packages/deepbook/sources/balance_manager.move:创建或复用
BalanceManager、deposit/withdraw、TradeProof授权。 book/ch06/code/s01-pool-list-cli至book/ch06/code/s05-mini-terminal:本章 CLI/PTB 示例的应用侧落点。
从应用反推链上
每笔下单 PTB 前至少检查:
- base/quote/DEEP manager 余额,含 settled balances。
- price、quantity 是否满足 tick、lot、min size。
expire_timestamp是否晚于当前时间。- pool 是否 registered,版本是否启用。
- DEEP price 是否存在,或输入资产 fee 是否有额外余额。
常见订单错误码来自 order_info.move:post-only 穿越订单簿触发 EPOSTOrderCrossesOrderbook = 5;FOK 无法完全成交触发 EFOKOrderCannotBeFullyFilled = 6;市价单不能 post-only,触发 EMarketOrderCannotBePostOnly = 7;自成交策略取消 taker 时可能触发 ESelfMatchingCancelTaker = 8。
工程旁白:Spot 应用先看用户状态机:市场、余额、订单、提交、确认。链上提交仍然落到 pool.move 和 balance_manager.move;UI 只是把这些固定入口组织成用户能理解的交易动作。
精度和池子发现是所有交易动作的前置条件。用户输入的十进制价格和数量必须转换为 tick/lot 对齐的整数,再交给 pool.move,否则错误会在链上校验阶段暴露。
写应用时
- 所有用户输入先做 decimal、tick size、lot size 和 min size 转换,再构造 PTB。
- 提交前 dry run,提交后用 digest、事件和
order_query.move刷新状态。 - UI/CLI 中分开展示 wallet coins、manager 余额、open orders 和最近一次交易状态。
动手检查
- 交易前模拟、Gas 和错误提示 需要哪些对象 ID、type arguments、cap/proof 和数值参数?
- dry run 失败时应给用户显示哪类提示:余额、精度、订单状态、版本暂停还是 Gas?
- 交易成功后应用应该依赖事件、order query 还是本地缓存更新页面?