Cessio Docs
Concepts

Atomic settlement

Accept → allocations → one Dvp_Settle batch — all-or-nothing

The chain

When the taker accepts your quote:

  1. Accept — the taker's transaction consumes your main DvpProposal, turning it into a live Dvp contract. The operator consumes your fee proposal the same way. You are not involved: both were pre-signed at quoting time.
  2. Allocations — each leg's payer locks concrete holdings to the trade via token-standard allocations (your side is funded from your party's holdings on the desk's node).
  3. Settle — the operator executes one atomic Dvp_Settle batch: both legs of the swap and the desk fee move in a single Canton transaction. Either the whole trade happens, or none of it does. There is no partial fill and no leg risk.

The fee

The desk fee is paid by the maker to the operator, in the pair's quote instrument:

fee = qty × price × feeBps / 10000   (floored to 10 decimal places)

feeBps is stamped on the RFQ at creation — you see it in rfq.created before you quote, so price it in.

Proof

trade.settled delivers the final TradeDto whose ledger object is your on-ledger proof:

  • updateId — the Canton update id of the atomic settle transaction;
  • receiptCids — contract ids of the SettledDvp receipts it created (trade + fee).

Both are also available later via GET /maker/trades.

When settlement fails

trade.failed {tradeId, rfqId, reason} is terminal: underfunding of a leg or an expired Dvp window. The RFQ closes; nothing has moved (atomicity cuts both ways). Keep your party funded — funding is checked at accept, not at quoting.

On this page