Files
papers/lux-smart-order-routing/sections/07-compliance-aware-routing.tex
zeekay 4a753bb639 papers: reorganize into per-paper dirs, add Antje Worring as co-author
Restructured from flat .tex/.pdf files into per-paper subdirectories.
Added Antje Worring as co-author on all papers.
Synced PDFs to pdfs/ for download site.
2026-04-18 21:50:07 -07:00

68 lines
2.6 KiB
TeX

\section{Compliance-Aware Routing}
\label{sec:compliance}
\subsection{Pre-Route Compliance Check}
Before allocating order quantity to a venue, the SOR checks compliance at three levels:
\begin{enumerate}[nosep]
\item \textbf{Security level}: Does the security's transfer restriction policy permit trading on this venue? (e.g., a Reg D security may only trade on US-registered ATS platforms.)
\item \textbf{Investor level}: Does the investor's accreditation, KYC status, and jurisdiction permit trading on this venue?
\item \textbf{Venue level}: Is the venue currently accepting orders for this security? (e.g., a venue may pause trading for a corporate action.)
\end{enumerate}
\begin{lstlisting}[language=Go,caption={Pre-route compliance check.}]
func (r *Router) checkCompliance(
order Order, venue Provider,
) error {
// Security-level check
token := r.registry.GetSecurity(order.SecurityID)
restrictions := token.TransferRestrictions()
if !restrictions.AllowsVenue(venue.ID()) {
return fmt.Errorf("security %s: venue %s not permitted",
order.SecurityID, venue.ID())
}
// Investor-level check
investor := r.registry.GetInvestor(order.InvestorID)
did := investor.DID()
for _, jur := range venue.Jurisdictions() {
if did.Jurisdiction() == jur {
goto jurisdictionOK
}
}
return fmt.Errorf("investor jurisdiction %s not permitted on venue %s",
did.Jurisdiction(), venue.ID())
jurisdictionOK:
if restrictions.RequiresAccreditation() {
if !did.HasValidCredential("accreditation") {
return fmt.Errorf("investor %s: accreditation expired", order.InvestorID)
}
}
// Venue-level check
if !venue.Supports(order.SecurityID) {
return fmt.Errorf("venue %s does not support security %s",
venue.ID(), order.SecurityID)
}
return nil
}
\end{lstlisting}
\subsection{Cross-Venue Settlement}
When an order is split across multiple venues, settlement occurs independently at each venue. The SOR tracks settlement status and reconciles:
\begin{itemize}[nosep]
\item \textbf{On-chain venues} (Lux DEX VM, Lux ATS internal): Atomic T+0 settlement on Lux EVM.
\item \textbf{External ATS platforms}: Settlement per the venue's protocol (typically T+0 to T+2).
\item \textbf{Traditional venues}: Settlement via DTCC (T+1 for equities).
\end{itemize}
The ATS maintains a settlement ledger that tracks the net position across all venues and reconciles on-chain state with off-chain settlements via the \texttt{position\_reconcile} cron job \cite{lux-ats-architecture}.