Tracking settlement
Following your trade from "won" to the on-ledger receipt
The event sequence after a win
quote.status {status: "won"}
└► trade.step {step: "trade_dvp"} main swap Dvp signed
└► trade.step {step: "fee_dvp"} fee Dvp signed
└► trade.step {step: "allocated"} every leg's funds locked
└► trade.settled {TradeDto} atomic settle executed
— or —
trade.failed {tradeId, rfqId, reason}trade.step.refs carries the contract ids each phase created. These
events are ephemeral — they exist only on the stream. The durable
record is the TradeDto.
The proof
trade.settled (and later GET /maker/trades) carries:
{
"tradeId": "…", "price": "97300.0", "fee": "121.625",
"settledAt": "2026-07-19T10:00:02Z",
"ledger": {
"updateId": "1220ab…",
"receiptCids": ["00c1…", "00d2…"]
}
}The ledger block is the on-ledger proof of the trade — what updateId and
receiptCids are, and what they prove, is in
Atomic settlement.
Reconciling after downtime
The stream does not replay missed trade events (the snapshot covers RFQs and quotes only). After downtime, reconcile via:
curl -H "X-API-Key: $API_KEY" "$API_URL/maker/trades?limit=100"Newest first, limit 1–500 (default 100). A trade still settling has
status: "settling" and an empty settledAt; the ledger block appears
once it completes.
balances.updated fires on your stream after each settlement;
GET /wallet/holdings returns the same shape on demand.