Concepts
Atomic settlement
Accept → allocations → one Dvp_Settle batch — all-or-nothing
The chain
When the taker accepts your quote:
- 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.
- 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).
- Settle — the operator executes one atomic
Dvp_Settlebatch: 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 theSettledDvpreceipts 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.