Two-phase acknowledgement
- PreconfirmAck — emitted by the validator you submit to, usually within 1–5 ms. Includes the matched price, filled size, resulting position, fee, and the block height the fill lands in.
- Finality — BFT commit lands 200–800 ms later. Until finality the client keeps the preconfirm optimistic with a soft indicator.
What a client should do
- Treat PreconfirmAck as "trade done" for UX (show position, update balance).
- Keep a reconciliation queue keyed on
ack_nonce. If finality disagrees (rare, only during validator fork or rollback), revert to the reconciled state and surface a toast. - Never retry on timeout without a fresh nonce — the matching engine deduplicates on
(account, session_key, nonce).