ch05-08 deep_price 如何服务 DEEP 价格计算
先沿资金问问题
先沿资金问问题。“deep_price 如何服务 DEEP 价格计算”不是账面说明,而是在回答资产从钱包进入 BalanceManager、被订单锁定、成交后进入 settled/owed,最后由 Vault 收尾的哪一段。
源码入口
- packages/deepbook/sources/balance_manager.move:
BalanceManager余额、owner/cap、TradeProof、deposit/withdraw 和权限校验。 - packages/deepbook/sources/state/trade_params.move:maker/taker fee、stake required、折扣等级和 epoch 参数读取。
- packages/deepbook/sources/vault/deep_price.move:为 DEEP 支付手续费和折扣计算提供换算价格。
- packages/deepbook/sources/state/account.move:账户维度的 open orders、settled/owed balances、stake、rebate 和成交后状态。
- packages/deepbook/sources/pool.move:交易、stake、claim rebate、治理和 manager 结算的对外入口。
沿资金流看
deep_price.move 的 DeepPrice 分别维护 base 和 quote 的价格点以及累计值。add_price_point 要求同一方向价格点至少间隔一分钟,否则 EDataPointRecentlyAdded = 1;如果没有任何价格点,calculate_order_deep_price 抛出 ENoDataPoints = 2。
pool.add_deep_price_point 会用参考池和目标池更新 DEEP 价格,并发出 PriceAdded { conversion_rate, timestamp, is_base_conversion, reference_pool, target_pool }。交易时 get_order_deep_price(whitelisted) 会对 whitelisted pool 返回 deep_per_asset = 0,表示免手续费;普通池使用最近一天内价格点平均值。
应用下单前如果允许 pay_with_deep = true,必须先 dry run get_quantity_out 或 get_quote_quantity_in,确认需要的 DEEP 数量,并检查 manager 的 DEEP 余额加 settled DEEP 是否足够。
资金旁白:这条线不要从撮合引擎开始。钱包里的
Coin<T>先进入 balance_manager.move 的托管余额,成交后的 settled/owed 记录在 account.move,真正资产进出由 vault.move 收尾。读费用和余额时,始终沿这条资金线核对。
费用阅读顺序建议从 packages/deepbook/sources/state/trade_params.move 的当前参数开始,再看 packages/deepbook/sources/state/account.move 中 active stake 和 rebate 记录。pay_with_deep 会把手续费支付资产切到 DEEP,因此交易前检查必须同时覆盖 base/quote 余额、DEEP 余额和 deep price 是否可用。
资金安全判断
- 交易前同时检查
BalanceManager余额、授权 proof、pool version 和费用参数。 - 钱包余额只表示未托管资产;下单可用余额必须来自
balance_manager.move的 manager 余额。 - 涉及费用或返佣时,分别记录 maker/taker、base/quote/DEEP 和当前 epoch 参数。
动手检查
- deep_price 如何服务 DEEP 价格计算 中哪一步会读写
BalanceManager,哪一步会进入Vault? - 失败时应优先排查余额不足、cap/proof 权限、pool pause/version 还是治理参数未生效?
- 应用侧需要向用户展示 wallet balance、manager balance、locked balance 中的哪几项?