
    %i'                        d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	  G d de          Z
 G d d	e          Ze G d
 d                      Ze G d d                      Z G d d          Z G d d          ZdS )u  
Turbo CLOB — Central Limit Order Book engine.

Price-time priority matching. Stores resting limit orders,
matches incoming orders against them, returns fills.

All prices are in 6 decimals (500000 = 50c = 50%).
All sizes are in 6 decimals (1000000 = 1 share = 1 USDC if wins).
    N)	dataclassfield)IntEnum)Optionalc                       e Zd ZdZdZdS )Sider      N)__name__
__module____qualname__BUYSELL     #/var/www/html/turbo/backend/clob.pyr   r      s        
CDDDr   r   c                       e Zd ZdZdZdS )Outcomer   r	   N)r
   r   r   YESNOr   r   r   r   r      s        
C	
BBBr   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   d
Z	eed<   dZ
eed<   dZeed<   defdZdS )Orderid	market_idmakersideoutcomepricesize	remaining	timestamp 	signaturer   nonce
expirationreturnc                     | j         | j        | j        t          | j                  t          | j                  | j        | j        | j        | j	        | j
        | j        | j        dS )N)r   marketIdr   r   r   r   r   r   r    r"   r#   r$   )r   r   r   intr   r   r   r   r   r    r"   r#   r$   selfs    r   to_dictzOrder.to_dict+   s[    'Z	NN4<((ZIZ/
 
 	
r   N)r
   r   r   str__annotations__r   r   r(   floatr"   r#   r$   dictr+   r   r   r   r   r      s         GGGNNNJJJ
JJJJJJ
IIINNNIsE3NNNJ
 
 
 
 
 
 
r   r   c                   F    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dS )Fillz"A matched fill between two orders.	buy_order
sell_orderr   r   r    N)r
   r   r   __doc__r   r-   r(   r.   r   r   r   r1   r1   <   sN         ,,JJJ
IIIr   r1   c                       e Zd ZdZd Zdedee         fdZde	de
e         fdZ	 	 dde	d	e
e         d
e
e         dee
e         ee         f         fdZdde	dedee         fdZdefdZdefdZdS )	OrderBookz
    Single-outcome orderbook (YES or NO).
    Bids sorted highest-first (best bid at index 0).
    Asks sorted lowest-first (best ask at index 0).
    Price-time priority within each level.
    c                 "    g | _         g | _        d S Nbidsasksr)   s    r   __init__zOrderBook.__init__N   s    !#	!#			r   orderr%   c           
         g }|j         t          j        k    r|j        dk    r| j        r| j        d         }|j        |j        k    rt          |j        |j                  }|j        }|xj        |z  c_        |xj        |z  c_        |                    t          ||||t          j	                                         |j        dk    r| j        
                    d           |j        dk    r|                     |           n|j        dk    r| j        r| j        d         }|j        |j        k    rt          |j        |j                  }|j        }|xj        |z  c_        |xj        |z  c_        |                    t          ||||t          j	                                         |j        dk    r| j        
                    d           |j        dk    r|                     |           |S )z=Add an order. Returns list of fills if it crosses the spread.r   )r2   r3   r   r   r    )r   r   r   r   r;   r   minappendr1   timepop_insert_bidr:   _insert_ask)r*   r=   fillsbest_ask	fill_size
fill_pricebest_bids          r   	add_orderzOrderBook.add_orderR   s   :!!""ty"9Q<;(.00 #EOX5G H HI!)JOOy0OO&&)3&&LL"'#+(&"&)++" " "     )Q..	a((( ""  ''' ""ty"9Q<;(.00 #EOX5G H HI!)JOOy0OO&&)3&&LL"*#((&"&)++" " "     )Q..	a(((""  '''r   order_idc                     | j         | j        fD ];}t          |          D ])\  }}|j        |k    r|                    |          c c S *<dS )z=Cancel and remove an order by ID. Returns the order if found.N)r:   r;   	enumerater   rB   )r*   rK   lstios        r   cancel_orderzOrderBook.cancel_order   sm    Ity) 	& 	&C!# & &148##771::%%%%% $& tr   N	new_pricenew_sizec                     |                      |          }|dg fS |||_        |.|j        |j        z
  }||_        t	          d||z
            |_        |j        dk    r|g fS |                     |          }||fS )z
        Amend an order's price or size.
        Price change = cancel + re-insert (loses priority).
        Size decrease = in-place (keeps priority).
        Returns (amended_order, fills).
        Nr   )rQ   r   r   r   maxrJ   )r*   rK   rR   rS   oldfilled_so_farrE   s          r   amend_orderzOrderBook.amend_order   s     ));8O !CIHs}4MCH8m#;<<CM=A7Ns##Ezr   
   r   depthc                     |dk    r| j         n| j        }i }|D ]8}|j        dk    r+|                    |j        d          |j        z   ||j        <   9d |                                D             }|d|         S )z(Get aggregated price levels for display.r:   r   c                     g | ]
\  }}||d S ))r   r   r   ).0pss      r   
<listcomp>z(OrderBook.get_levels.<locals>.<listcomp>   s$    EEEdaAq))EEEr   N)r:   r;   r   getr   items)r*   r   rZ   orderslevelsrP   results          r   
get_levelszOrderBook.get_levels   s    "fnn$)#% 	G 	GA{Q"(**QWa"8"81;"FqwEEfllnnEEEfuf~r   c                 F   t          | j                  D ]q\  }}|j        |j        k    r| j                            ||            dS |j        |j        k    r.|j        |j        k     r| j                            ||            dS r| j                            |           dS )zGInsert bid in sorted position (highest price first, then oldest first).N)rM   r:   r   insertr    r@   r*   r=   rO   existings       r   rC   zOrderBook._insert_bid       $TY// 	 	KAx{X^++	  E***{hn,,8CU1U1U	  E***	r   c                 F   t          | j                  D ]q\  }}|j        |j        k     r| j                            ||            dS |j        |j        k    r.|j        |j        k     r| j                            ||            dS r| j                            |           dS )zFInsert ask in sorted position (lowest price first, then oldest first).N)rM   r;   r   rh   r    r@   ri   s       r   rD   zOrderBook._insert_ask   rk   r   NN)rY   )r
   r   r   r4   r<   r   listr1   rJ   r,   r   rQ   r(   tuplerX   r/   rf   rC   rD   r   r   r   r6   r6   F   s>        $ $ $1u 1d 1 1 1 1fS Xe_     EI.2 C HSM &sm7<Xe_dSWj=X7Y   2 s 3 T
    	  	  	  	  	 	  	  	  	  	  	  	 r   r6   c                      e Zd ZdZdefdZ	 	 	 ddededed	ed
edededede	e
ee         f         fdZdedee
         fdZ	 	 ddedee         dee         de	ee
         ee         f         fdZdedee
         fdZdedefdZdS )CLOBz
    Full CLOB for one market. Contains a YES book and a NO book.
    For Kalshi-style display, the frontend shows the YES book
    (UP = YES bids/asks).
    r   c                 |    || _         t                      | _        t                      | _        g | _        i | _        d S r8   )r   r6   yes_bookno_booktrades
all_orders)r*   r   s     r   r<   zCLOB.__init__   s1    "! {{"$,.r   r!   r   r   r   r   r   r   r"   r#   r$   r%   c	                 <   t          t          j                    j        dd         | j        ||||||t          j                    |||          }	|t          j        k    r| j        n| j	        }
|

                    |	          }|	| j        |	j        <   |D ]}| j                            | j        |j        j        |j        j        t%          |          |j        |j        |j        d           t-          | j                  dk    r| j        dd         | _        |	|fS )z*Place a new order. Returns (order, fills).N   )r   r   r   r   r   r   r   r   r    r"   r#   r$   r'   buyersellerr   r   r   r    d   i)r   uuiduuid4hexr   rA   r   r   rs   rt   rJ   rv   r   ru   r@   r2   r   r3   r(   r   r   r    len)r*   r   r   r   r   r   r"   r#   r$   r=   bookrE   fs                r   place_orderzCLOB.place_order   s&    z||$nikk!
 
 
 !(7; 6 6t}}DLu%%$)!  	1 	1AK N*,,w<<[       4;#%%"k$%%0e|r   rK   c                     | j                             |          }|sdS |j        t          j        k    r| j        n| j        }|                    |          }|r| j         |= |S )zCancel an order by ID.N)rv   ra   r   r   r   rs   rt   rQ   )r*   rK   r=   r   removeds        r   rQ   zCLOB.cancel_order  si    ##H-- 	4 % < <t}}$,##H-- 	*)r   NrR   rS   c                    | j                             |          }|sdg fS |j        t          j        k    r| j        n| j        }|                    |||          \  }}|D ]^}| j        	                    | j
        |j        j        |j        j        t          |j                  |j        |j        |j        d           _||fS )zAmend an order's price or size.Nry   )rv   ra   r   r   r   rs   rt   rX   ru   r@   r   r2   r   r3   r(   r   r   r    )	r*   rK   rR   rS   r=   r   amendedrE   r   s	            r   rX   zCLOB.amend_order  s     ##H-- 	8O % < <t}}$,))(IxHH 		 		AK N*,,u}--[        ~r   c                 v    |                                 fd| j                                        D             S )z#Get all resting orders for a maker.c                 d    g | ],}|j                                         k    |j        d k    *|-S )r   )r   lowerr   )r]   rP   addrs     r   r`   z,CLOB.get_orders_by_maker.<locals>.<listcomp>(  sB     @ @ @a7==??d**q{Q />r   )r   rv   values)r*   r   r   s     @r   get_orders_by_makerzCLOB.get_orders_by_maker%  sP    {{}}@ @ @ @4?1133 @ @ @ 	@r   c                     |t           j        k    r| j        n| j        }|                    d          |                    d          dS )z#Get orderbook snapshot for display.r:   r;   r9   )r   r   rs   rt   rf   )r*   r   r   s      r   get_book_snapshotzCLOB.get_book_snapshot+  sH     '7; 6 6t}}DLOOF++OOF++
 
 	
r   )r!   r   r   rm   )r
   r   r   r4   r,   r<   r   r   r(   ro   r   rn   r1   r   r   rQ   rX   r   r/   r   r   r   r   rq   rq      s        /# / / / / - -- - 	-
 - - - - - 
ud4j 	!- - - -^	S 	Xe_ 	 	 	 	 EI.2 C HSM &sm7<Xe_dSWj=X7Y   ,@ @e @ @ @ @
 
T 
 
 
 
 
 
r   rq   )r4   rA   r}   dataclassesr   r   enumr   typingr   r   r   r   r1   r6   rq   r   r   r   <module>r      s      ( ( ( ( ( ( ( (                7   
    g   
 
 
 
 
 
 
 
 
>        ~  ~  ~  ~  ~  ~  ~  ~ Bj
 j
 j
 j
 j
 j
 j
 j
 j
 j
r   