Trading Venue
In BuildA Trading Venue lets a tenant run its own market for a tokenized asset after issuance. The venue contract never gains custodian power over what trades on it.
One order's whole path: it reserves before it rests, it can match and still not be delivered, and delivery runs through each token's own compliance path before anything is final.
A venue is a tenant's own market: its own members, its own calendar, its own fees, under one on-chain identity, and a tenant runs as many as it needs. A market is one trading line inside a venue, so the same pair listed on two venues is two markets with two prices.
Listing gives the venue contract no custodian power. A DALP leg stays inside the trader's own wallet; a plain ERC-20 leg sits in the venue's escrow vault. The one custodian role a listing grants goes to the organisation's operations signer, which the platform uses only to reverse a delivered trade after an approved bust.
A fill is not delivery. With a positive holding period, both legs stay reserved until delivery; a market with a holding period of zero delivers inside the fill's own transaction, with no window at all.
Why trading needs a venue
Issuance is a single event. A primary offering sells newly created units once, and the register then closes to that offer. What a holder does with the position afterward is a separate question the sale itself never answers.
An institutional buyer prices that gap in before they ever subscribe. An instrument nobody can exit is worth less to hold than one that trades, and that discount lands on the offering itself, not just on the holder stuck with it later. A venue is what turns a single sale into an instrument with an ongoing market.
That places trading downstream of issuance, inside the same asset's working life rather than beside it. Asset Lifecycle names the stage directly: after an instrument is issued and unpaused, it is serviced for as long as it lives, and settling trades sits in that same Service stage next to paying coupons, freezing holdings, and collecting fees. Primary Offering is the contract-governed first sale that life begins from; a venue is what happens to the same asset afterward, for as long as anyone wants to trade it.
Why this venue runs on the platform, not beside it
The alternative to a venue built into the platform is a venue built beside it. That second system lists the same tokens under its own view of who may hold them. It needs its own way to hold units mid-trade too, because a trade in progress has to sit somewhere between the seller and the buyer, and each of those is a seam. A seam is where the exchange's own rules and the issuer's rules can quietly disagree: a trade the venue allows and the token's own compliance would have refused.
This venue carries no such seam, because the venue contract never becomes a second custodian. The same identity check and transfer rule that govern every other movement of a listed token are the same check and rule that govern its delivery here, described in full below. A delivered trade is a normal token transfer, so it lands in that asset's own record the same way every other movement does, next to the coupons, freezes, and fee collection Asset Lifecycle already indexes there.
That single fact is also most of why a financial institution reaches for this rather than a bolt-on exchange. Compliance risk stays with the token: every delivery runs through the token's own rules, and the platform checks those rules against the reversal transfers before it accepts a bust on a delivered trade. And the operator keeps the fee schedule and market-making arrangement it already runs, rather than adopting a third party's.
What a venue is, and what a market is inside it
A venue is a tenant's own market, run on its own terms. It admits whoever it decides to admit, keeps its own calendar and fee defaults, and carries its own on-chain identity to back that up, so who can trade there is answered by that venue's admission policy and nothing else. A tenant runs as many venues as it needs, one for retail members and one for institutional desks, or one per jurisdiction.
A market is one trading line on one venue: a base token, a quote token, and the book, price band, fee schedule, and holding period that make them tradable there. The same pair listed on two venues is two markets, with two order books and two prices, and halting one leaves the other trading. Exactly one market per token is that token's reference market, and only its official close reaches the token's price feed. A market's close is computed by a defined methodology set at the market: the last trade price, or a volume-weighted average over a configured window before the close, or over the whole session when no window is set. A session with no settled trade closes at the price its opening auction set.
A venue is the boundary and a market is one line inside it; the same pair on two venues is two markets with two prices, and only the reference market's official close feeds the token's price.
Listing: how a token trades without handing over custody
Listing grants the venue contract no custodian role over a token. Its own code is written so that role cannot exist, whatever an operator might otherwise promise. Every reservation request the venue makes is written to never name which backend it is talking to: it asks the token's bound backend to reserve, release, or deliver, and nothing else, ever. No path in the venue contract reaches a forced transfer, an address freeze, or a recovery, on any listed token.
Listing does give one platform account a custodian role. The organisation's operations signer, the same account that submits settlements, receives the custodian role on the access manager of both the base and the quote token, signed by the listing signer. That role exists for one job: reversing a trade that already delivered, after an approved bust, through custodian forced transfers. The platform uses it nowhere else. The grant is skipped when the operations signer already holds the role, and it never blocks a listing. When it cannot be made, for example on a plain ERC-20 with no access manager or when the listing signer cannot grant roles on the token, the platform logs the step to fix: a token admin grants the custodian role to the operations signer on the token's Permissions page. Until then, a bust on that market cannot reverse that leg after delivery.
Which backend a token gets follows from how it was made. A DALP token is issued through the platform's own factory, the contract that deploys every instrument the platform creates, so it carries a hold feature the venue can call directly. The committed units stay inside the trader's own wallet, unspendable elsewhere while the order works, and they leave the wallet only at delivery. A plain ERC-20 exposes no such interface, because nothing about it was built for this. The venue's escrow vault pulls the units in against the trader's approval instead, and can pay them out only to the trader as a claimable credit or to a counterparty at delivery. A listing is accepted only when each DALP issuer admits the venue as a hold reserver, each plain ERC-20 has the venue's escrow vault bound, the listing signer has the venue operator role, and the organisation's operations signer has the venue submitter role. A failed precondition refuses the listing with the step and account to fix. Listing asks an issuer for the right to reserve on one named venue, and for nothing broader; the issuer sets how long a hold stays effective and can drop the venue at any time.
The venue contract only reserves and delivers through the token's own backend; the path toward a forced transfer, a freeze, or a recovery is drawn only to show that it terminates before ever reaching the token.
Trading: how a resting order becomes a fill
Every order is an EIP-712-signed intent, a typed structured message signed by the trader's own key, so the venue can neither fabricate nor alter an order before it moves a token. An order carries a type and a time in force, independently of each other.
| Order type | What it does |
|---|---|
| Limit | Rests at a stated price until it fills, expires, or is cancelled |
| Market | Matches immediately at the best available price |
| Time in force | What it does |
|---|---|
| Good-til-cancelled (GTC) | Stays resting until filled or cancelled |
| Good-til-date (GTD) | Carries its own signed expiry, and expires on reaching it |
| Immediate-or-cancel (IOC) | Fills what it can at once and cancels the rest |
| Fill-or-kill (FOK) | Fills its whole quantity at once or is cancelled without trading. It is accepted only in the continuous session, because an auction cannot fill it immediately |
A stop is not a fourth order type. It carries a trigger price on a limit or a market order instead, and the venue reserves nothing for it until a settlement-confirmed trade reaches that price.
A resting order can be amended in two ways, and the way decides its place in the queue. Lowering its quantity at the same price is done in place: the order keeps its id, its signature and its position, and the reservation behind the removed quantity is released. A new price or a larger quantity needs a newly signed order, because the maker never signed those terms. The venue closes the original as replaced and enters the new order in the same step, so there is no moment with both or neither on the book. The new order takes its own id, joins the back of the queue at its price, and may trade at once if its price crosses. It inherits the original's reservation, so only the difference is reserved or released. Both kinds of amend are recorded in the order log, so a drop copy can report them as replacements.
An accepted order does not join the book directly. The venue first reserves the committed quantity through the market's bound backend, and the order rests and appears in the book only once that reservation confirms on chain. A reservation that reverts or times out rejects the order before it joins the book, and rejected is terminal: the trader signs a new order rather than expecting the original to retry. Once resting, the book shows the resting quantity at each price level, streamed to readers as a full snapshot followed by diffs, and the engine matches strictly by price and then by the order's time of arrival.
A buy limit order reserves enough of the quote token to pay its limit price plus the higher of the market's maker and taker fees. A fill below the limit price spends less than that. Once the settlement transaction confirms and the fills are recorded, the platform releases each buyer's unspent quote reservation for the filled quantity, so price improvement returns to the trader at the fill. When that release cannot be queued, the settlement still stands, and the platform's hold repair returns the surplus later.
Three separately configured price bands bound how far an order may sit or execute from a reference point.
| Band | Anchored to | Bounds |
|---|---|---|
| Protection | An independent price feed, or the last trade when the market has no feed | How far a market order may execute |
| Static | The session's last auction uncross or the day's last trade | How far an incoming order may rest |
| Dynamic | The moving last-trade price | How far a resting order may drift |
Tightening any of them never disturbs an order already resting inside the old limit. A market itself moves through one lifecycle: pending until every listing precondition completes, then live, with an operator-controlled halt and resume, and a delisting that is permanent from either state.
A halt also suspends the market's scheduled auctions. An opening auction or a collection-window clearing that falls due while the market is halted does not run. The first session step after the operator resumes the market runs it. When a session ends while the market is still halted, it closes without its opening auction. A continuous session with no preopen only changes session state, so it keeps its schedule through a halt.
A market's own status: pending until every precondition completes, then live, halt and resume under operator control, delisting permanent from either state.
Settlement: a fill is not delivery
A matched trade is reported, priced, and published straight away, and on a market with a positive holding period both legs stay reserved, untouched, for a window after that. The token's own compliance check is the venue's final authority on whether a transfer is legal, and that check only runs at the moment of delivery: the holding period is what waits for it. Atomic settlement at the moment of the trade is available too: setting a market's holding period to zero delivers inside the fill's own transaction, with no window and no undo, because there is nothing left to undo.
Before delivery, an undo is not a reversal. Nothing has moved yet, so releasing both legs has nothing to move back and no fee to refund; it is closer to the trade never finishing than to the trade being cancelled. Whether an approved bust undoes a pending trade or the token itself refuses the transfer at delivery, the venue fires the identical event with identical bookkeeping, one mechanism with two triggers rather than two separate features. The token's own refusal is the one case that looks like a real correction, since the trade was already reported: the price is corrected, the trade drops from clean history, and both sides are told why. Whichever backend held the leg, an undo pays out differently: a hold's units return to the trader's wallet on their own, an escrowed leg becomes a balance the trader claims from the vault.
A bust needs two venue operators. One proposes it within 24 hours of the trade, and a different operator approves or rejects it. When the trade is still pending, the proposal flags it on chain at once. Delivery skips a flagged trade, even after its due time, so the clock cannot settle a trade while the decision is open. A rejection clears the flag, and the trade delivers once it is due. An approval runs the undo at once. Only the settlement service, which holds the venue submitter role, can submit that undo on chain, and it does so only after the approval. No operator or admin key can undo a trade on its own. Before queueing the undo, the platform refuses a bust the venue would reject: a delivery that is past its due time without a review flag, or an organisation operations signer that lacks the venue submitter role. The refusal applies when the bust is proposed and again when it is approved or resumed. An operator can still flag or clear a trade by hand. Setting and clearing the flag is best effort, and a failure never cancels the proposal or the decision. When the flag cannot be set, only the holding period keeps the trade from delivering. When the flag cannot be cleared after a rejection, the platform logs the gap, and an operator clears the flag before the trade can deliver.
A trade that already delivered is outside the venue contract. Through the Platform API, a bust on a delivered trade is still possible inside the same 24 hours, and the platform first checks that the token's compliance rules allow the reversal transfers. An approved bust then sends custodian forced transfers under the operations signer: the base units go back to the seller, and the quote units the seller received and both fees go back to the buyer. The Console offers a bust only on a pending delivery.
One event, two triggers: an operator's bust and a token's own refusal both fire the identical undo, with identical bookkeeping.
Controls and evidence
Admission is checked repeatedly, not once. At intake the maker must be a participant the venue admits, and admission is checked again when a stop triggers and again immediately before matching or settlement. Five data changes re-run it too: an admission policy change, a membership revocation, a removed claim, a removed trusted issuer, and an identity registry status change. A participant who loses admission has their resting and pending orders pruned and their reservations released.
Evidence is identity-linked, sequenced, and venue-scoped: the trail carries signed orders, book events, session transitions, fills, deliveries, and undos with their reason, each naming the venue it belongs to. From that trail, the book's state is deterministically replayable, so what happened is something a regulator can recompute rather than take on trust.
What each drop copy report carries
The drop copy sends one Financial Information eXchange (FIX) ExecutionReport for each order and trade event. Besides the order, price, quantity and status tags, every report carries the fields a surveillance system uses to attribute and time the event.
| FIX field | Carried on | Value |
|---|---|---|
| PartyID (448), PartyIDSource (447), PartyRole (452) | Fills and trade cancels | The account mnemonic of the other side of the trade, sent as a custom-coded party with role 37 (contra trader). The venue knows participants by wallet, so the mnemonic from the drop copy account map stands in for a trader id. |
| ManualOrderIndicator (1028) | Every report | N. Every order is signed by the maker's wallet; the venue has no path for an operator to place an order for a client. |
| OrdType (40) | Every report | 1 market, 2 limit, 3 stop-market, 4 stop-limit. Stop-market intake is rejected, but its refusal ExecutionReport is emitted with 3 and StopPx. |
| StopPx (99) | Reports for a stop order | The trigger price, in the same decimal form as Price. |
| Capacity (528) | Reports for an account with a profile | P for a principal account, G when proprietary is set, A for agency, W for sponsored. Sponsored takes precedence when both sponsored and proprietary are configured. An account without a profile carries no Capacity. |
| ExecInst (18) | Reports for a fill-or-kill order | G (all or none). Other orders carry no ExecInst. |
| OrigTime (42) | Every report | The order acceptance time in UTC, kept across its reports; a refusal uses refusal.refusedAtMs, the refusal time, because the order was never accepted. |
The first restart after an upgrade that changes these fields rebuilds the drop copy's saved order state from the venue log.
The integration contract
For an integrator, the Trading Venue is a versioned API route group. A chain-writing call answers with an accepted status and a status URL, and acceptance is not placement: an order becomes matchable only after its reservation confirms on chain.
An order's own status and a trade's delivery status are two separate tracks, and reading one for the other is the mistake that costs an integrator a real position.
An order's own status: four open states, closing into one of five terminal states, each naming why it closed.
A trade's delivery status, tracked separately from the order's own status: pending until the due delivery runs, then delivered or undone.
The full contract, every status, every field, every error, is in the API reference.
Place a signed order, treat it as working only after its reservation confirms, and treat units as received only after the trade reports delivered.
Frequently asked questions
What is the difference between a venue and a market?
A venue is a tenant's own market: its own on-chain identity, access manager, admission policy, calendar, and escrow vault, and a tenant runs as many as it needs. A market is one trading line on one venue. The same pair listed on two venues is two markets, with separate order books, reservations, trade histories, and prices, and halting one leaves the other trading.
What does an issuer give up by listing a token on a venue?
The right to reserve on that one venue, and one custodian role for the platform's reversal path. The issuer attaches the token's hold feature and authorizes the venue as a reserver on it, which lets the venue commit units inside a holder's own wallet and move only what it committed. The issuer sets how long a hold stays effective and can drop the venue at any time, which releases its holds, prunes its resting orders, and undoes its pending deliveries. A listing that lacks this admission is refused before the market goes live. Listing also grants the custodian role on the token to the organisation's operations signer, when the listing signer can grant roles on the token. The platform uses that role only to reverse a delivered trade after an approved bust.
Who holds the assets while an order is working?
It depends on the leg. Units of a DALP token stay in the trader's own wallet, held for that venue, and leave the wallet only at delivery. Units of a plain ERC-20 sit in that venue's escrow vault, which pays them out only to the trader as a claimable credit or to a counterparty at delivery. The hold token feature is what reserves those units: governance authorizes the venue on the token, and releasing a hold is not a transfer.
Can the operator reverse a trade?
Not alone. One operator proposes a bust within 24 hours of the trade, and a different operator approves it. Before delivery, the approved bust is a release rather than a reversal. Both legs are still reserved, so the settlement service undoes the trade on the venue by releasing them; no fee has moved, and nothing is forced back from anyone. The proposal holds the trade on the venue until the decision, so delivery cannot overtake it. Once the trade is delivered, the venue offers no undo. An approved bust then reverses the trade with custodian forced transfers under the operations signer, which the Platform API supports and the Console does not offer.
Is an undo the same as a refund?
No. A refund returns something that was paid. Before delivery, nothing has been paid: both legs are still sitting in reserve, so an undo releases them back to where they already were rather than moving anything. The one case that looks like a real correction is a delivery the token refuses after the trade was already reported, and even there the fix is a correction to the record, not a payment reversed.
Who sets trading fees and who receives them?
The venue carries default maker and taker fees and a default fee account, in basis points of the quote leg, and a market inherits or overrides them; zero is a valid schedule. The fee moves at delivery, into the market's fee account, in the same transaction as the legs.
Does the venue provide liquidity or market makers?
No. The venue matches and settles orders; it never supplies capital or acts as a counterparty. Convening liquidity stays a decision for the operator.
Token Distribution
Token Distribution lets an issuer put an allocation into every wallet an eligibility list names, at one fixed cost, without a payout system per campaign.
Transaction Lifecycle
The Transaction Lifecycle gives every write one auditable path to its outcome, so a same-key retry never leaves it unrecorded or runs it twice.