
    9}i                     B   d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ ddlmZ ddlZ e        dd	lmZ d
edefdZe G d d             Ze G d d             Z G d d      Zd Zedk(  r ej<                   e              yy)z
Mentions Market Maker - Single Market YES/NO Maker
Interactive keyboard controls + Telegram commands.
Market ID loaded from .env (MENTIONS_MARKET_ID).
    N)	dataclass)OptionalDict)load_dotenv)serializationhashes)padding)default_backend)TelegramNotifier
ob_fp_sidereturnc                     | D cg c]9  \  }}t        t        t        |      dz              t        t        |            g; c}}S c c}}w Nd   )introundfloat)r   pss      auto1.py_parse_ob_sider      sG     Aq 
U58c>"	#Sq]3  s   >Ac                       e Zd ZU dZeed<   y)Configz-https://api.elections.kalshi.com/trade-api/v2api_baseN)__name__
__module____qualname__r   str__annotations__     r   r   r   !   s    CHcCr!   r   c                       e Zd ZU eed<   dZee   ed<   dZe	ed<   dZ
ee   ed<   dZee   ed<   dZe	ed<   dZee   ed	<   d
efdZy)MarketState	market_idNyes_bidr   yes_bid_sizeyes_second_bidno_bidno_bid_sizeno_second_bidorderbook_datac                 0   |j                  di       }t        |j                  dg             }|rMt        |d d      }|d   d   dz  | _        |d   d   | _        t        |      dkD  r|d   d   dz  nd | _        nd | _        d| _        d | _        t        |j                  d	g             }|rSt        |d
 d      }|d   d   dz  | _        |d   d   | _        t        |      dkD  r|d   d   dz  | _	        y d | _	        y d | _        d| _        d | _	        y )Norderbook_fpyes_dollarsc                     | d   S Nr   r    xs    r   <lambda>z.MarketState.update_orderbook.<locals>.<lambda>5   s
    !A$ r!   T)keyreverser   r      
no_dollarsc                     | d   S r0   r    r1   s    r   r3   z.MarketState.update_orderbook.<locals>.<lambda>@   s
    ! r!   )
getr   sortedr%   r&   lenr'   r(   r)   r*   )selfr+   ob
yes_offers
yes_sorted	no_offers	no_sorteds          r   update_orderbookzMarketState.update_orderbook0   s$   3#BFF="$=>

MJ%a=+c1DL *1a 0D<?
Oa<O*Q-"2S"8UYDDL !D"&D"266,#;<	yndKI#A,q/C/DK(|AD:=i.1:L1a3!6DRVDDK D!%Dr!   )r   r   r   r   r   r%   r   r   r&   r   r'   r(   r)   r*   dictrB   r    r!   r   r#   r#   &   s_    N#GXe_#L#&*NHUO*"FHUO"K%)M8E?)&t &r!   r#   c            
          e Zd ZdZddgZdededededef
d	Zd
edededefdZ	d2dedede
fdZd Zdedededee   fdZdedefdZd Zdededee   fdZdefdZdee   fdZdedee   fdZdefdZd  Zdefd!Zd"ed#efd$Zd% Zd& Zd' Zd( Zd) Z d* Z!defd+Z"d, Z#dedefd-Z$dedefd.Z%d/ Z&d0 Z'd1 Z(y)3MentionsMakerz,YES/NO bid market maker for mentions marketsyesnoapi_key
api_secretr$   configtelegramc                     || _         || _        || _        || _        | | j                  _        t        |      | _        d d d| _        d d d| _        ddd| _	        d| _
        d d d| _        d d d| _        d d d| _        ddd| _        d d d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d| _        ddd| _        d d d| _        d| _        d| _        d | _        d| _         d | _!        d| _"        d| _#        d | _$        |r	 tJ        jL                  jO                  |      r&tQ        |d      5 }|jS                         }d d d        n|}tU        jV                  tY        tZ              r|j]                         n|d t_                     | _$        ta        d	       y y # 1 sw Y   [xY w# tb        $ r-}ta        d
|        te        jf                  d       Y d }~y d }~ww xY w)N)r$   rF   rG   r   FT   r)passwordbackendu   ✓ Private key loadedu    ❌ Failed to load private key: r6   )4rH   r$   rJ   rK   traderr#   market_state	order_idslast_pricescurrent_incrementcycle_start_tscached_restingcached_positioncached_queue_positioncached_fillsfill_pricesrunningactivepausedstoppingwaiting_for_manual_resumeemergency_stopcontract_incrementone_side_first_modeactive_sideside_selectionis_rebalancingbump_enabledbump_targetsingle_fire_modesingle_fire_sides_completedtrading_taskmanual_fill_modemanual_fill_sidemanual_fill_countmanual_fill_start_positionprivate_keyospathisfileopenreadr   load_pem_private_key
isinstancer   encoder
   print	Exceptionsysexit)	r<   rH   rI   r$   rJ   rK   fkey_dataes	            r   __init__zMentionsMaker.__init__O   s%   " # ()< <@t3L?C47P :;!1D#$ AED8QAET9RGKSW?X"45Q,??C47P )-&#"##( *.-1#5:%-H=A5N %+,(48 !&/3&'/0'  77>>*-j#. ,!#$668, ,  *H#0#E#E)3Hc)BHOO%!+-$ 
 ./ , ,  8<=s1   2+G G.AG GG 	H #HH	timestampmethodrs   r   c           	         | j                   sy|j                  d      d   }||z   dz   |z   }| j                   j                  |j                         t	        j
                  t	        j                  t        j                               t        j
                  j                        t        j                               }t        j                  |      j                         S )N ?r   z/trade-api/v2)mgfsalt_length)rq   splitsignry   r	   PSSMGF1r   SHA256DIGEST_LENGTHbase64	b64encodedecode)r<   r   r   rs   
path_cleanmsgsigs          r   _sign_requestzMentionsMaker._sign_request   s    ZZ_Q'
& ?2Z?##JJLKKLL1#KK55 MMO
 $++--r!   Nendpointc                   K   | j                   j                   | }t        t        t	        j                         dz              }| j                  |||      }| j                  ||dd}	 t        j                  d      }t        j                  |      4 d {   }	|dk(  rV|	j                  ||      4 d {   }
|
j                          d {   cd d d       d {    cd d d       d {    S |d	k(  rW|	j                  |||
      4 d {   }
|
j                          d {   cd d d       d {    cd d d       d {    S |dk(  rV|	j                  ||      4 d {   }
|
j                          d {   cd d d       d {    cd d d       d {    S d d d       d {    y 7 (7 
7 7 7 # 1 d {  7  sw Y   /xY w7 7 7 7 # 1 d {  7  sw Y   LxY w7 7 w7 i7 Z# 1 d {  7  sw Y   ixY w7 `# 1 d {  7  sw Y   y xY w# t        $ r i cY S w xY ww)N  zapplication/json)zKALSHI-ACCESS-KEYzKALSHI-ACCESS-SIGNATUREzKALSHI-ACCESS-TIMESTAMPzContent-TyperN   )total)timeoutGET)headersPOST)jsonr   DELETE)rJ   r   r   r   timer   rH   aiohttpClientTimeoutClientSessionr9   r   postdeleter{   )r<   r   r   dataurlr   r   r   r   sessionresps              r   _requestzMentionsMaker._request   s*    %%&xj1DIIK$./0	  FH=!%'*'0.	
	++!4G,,W= 	1 	1U?&{{3{@ 1 1D%)YY[01 1 1	1 	1 	1 v%&||CdG|L 1 1PT%)YY[01 1 1	1 	1 	1 x'&~~c7~C 1 1t%)YY[01 1 1	1 	1 	1 	1 	1101	11 1 1101	1
1 1 1101	11 1 1	1 	1 	1 	1  	I	s  A(I+0H5 GH5 H <G=H  GG	GH $G%H )H5 5G6H5 :I;H G$H G,0G&1G,4H  G(H H5 G*H5 IH 3H4H 7H	HH	H HH  H5 ,H-H5 1I2H5 =H>H5 IH5 H 	GH H5 G!	GG!	H &G,(H *H5 ,G>	2G53G>	:H H	H H5 	H	HH	H H5  H2&H)'H2.H5 1I2H5 5I IIIc                 
	  K   t        j                  | j                  dd| j                   d      | j                  dd| j                   d      | j                  dd| j                   d      | j                  dd| j                         | j                  dd	| j                   d
| j                   d      d       d {   }|d   r1t        |d   t              s| j                  j                  |d          |d   rft        |d   t              sS|d   j                  dg       }t        d |D              | j                  d<   t        d |D              | j                  d<   |d   rt        |d   t              sd| j                  d<   d| j                  d<   |d   j                  dg       D ]x  }|j                  d      | j                  k(  s"t        t        |j                  dd                  }|dkD  r|| j                  d<   n|dk  rt        |      | j                  d<    n d | j                   d<   d | j                   d<   |d   rt        |d   t              s|d   j                  d      }|rt        |t"              r|D ]  }|j                  d      | j                  k(  s"|j                  d      }dD ]c  }| j$                  j                  |      |k(  s"t        t        |j                  d|j                  d d                        | j                   |<      ddd| _        |d!   r~t        |d!   t              sk|d!   j                  d"g       D ]S  }	|	j                  d#      }
t        t        |	j                  d$d                  }|
dv s=| j&                  |
xx   |z  cc<   U | j(                  r| j*                  d%v r| j                  j,                  xs d}| j                  j.                  xs d}||k\  rdnd}| j                  j                  d      xs d}| j                  j                  d      xs d}|dk(  r,|dk(  r&| j*                  d&k(  r|| _        y |dk(  rdnd| _        y y y y y 7 w)'Nr   z	/markets/z
/orderbookz/portfolio/orders?ticker=z&status=restingz/portfolio/positions?ticker=z&count_filter=positionz1/portfolio/orders/queue_positions?market_tickers=z/portfolio/fills?ticker=z&min_ts=z
&limit=200T)return_exceptionsr   r6   ordersc              3      K   | ]M  }|j                  d       dk(  st        t        |j                  d|j                  dd                         O yw)siderF   remaining_count_fpcount_fp0Nr9   r   r   .0os     r   	<genexpr>z4MentionsMaker.refresh_market_data.<locals>.<genexpr>   sn       -Xqr  AB  AF  AF  GM  AN  RW  AWSquu=QSTSXSXYcehSi7j1k-l  -X
   A9ArF   c              3      K   | ]M  }|j                  d       dk(  st        t        |j                  d|j                  dd                         O yw)r   rG   r   r   r   Nr   r   s     r   r   z4MentionsMaker.refresh_market_data.<locals>.<genexpr>   sn       ,Vpq  @A  @E  @E  FL  @M  QU  @UCaee<PRSRWRWXbdgRh6i0j,k  ,Vr   rG      market_positionstickerposition_fpr   rN   queue_positionsmarket_tickerorder_idrM   queue_position_fpqueue_position   fillsr   r   )	expensivecheapr   )asynciogatherr   r$   rW   rx   r{   rS   rB   r9   sumrX   rY   r   r   absrZ   listrT   r[   rd   rf   r%   r(   re   )r<   resultsr   posposition_valr   qpr   r   fill	fill_side
fill_countr%   r(   r   yes_posno_poss                    r   refresh_market_dataz!MentionsMaker.refresh_market_data   so    MM%9T^^,<J!GHMM%#<T^^<LO!\]MM%#??OOe!fgMM%#TUYUcUcTd!efMM%#;DNN;K8TXTgTgShhr!st"
 
 1:jY?..wqz:1:jY?QZ^^Hb1F),  -Xv|  -X  *XD&(+  ,Vu{  ,V  )VD%1:jY?*+D  ')*D  &qz~~&8"= 778$6#&uSWW]C-H'I#JL#a'6B,,U3%)585F,,T2 -1""5)+/""4(1:jY?%ajnn->?O:ot#D) &Bvvo.$..@#%66*#5$1 &D#~~11$78CCFuRVVTgikioio  qA  CF  jG  NH  HI  DJ : :4 @ %&& %&Q/1:jY?
w3 ? HHV,	 txx
C'@!AB
-%%i0J>0	? ##(;(;?U(U''//41G&&--2F!(F!2I**..u5:G))--d38qF!|!&&+5'0D$/8E/AtuD$	 !,| )V#g
s.   CRR DRCR/4R$B9RC#Rr   pricecountc                 R  K   d| j                   d|ddd|ddd| j                    d	| d	t        t        j                         d
z         | dt        t        |dz              i}| j	                  dd|       d {   }|r!|j                  di       j                  d      S d S 7 )w)Nr   r   actionbuyr   typelimitclient_order_id-r   _pricer   r   z/portfolio/ordersorderr   )r$   r   r   r   r   r9   )r<   r   r   r   
order_dataresults         r   place_orderzMentionsMaker.place_order   s     dnnDeUG$..!14&#diikD>P:Q9RSfFOSus{!34

 }}V-@*MM:@vzz'2&**:6JdJ Ns   A9B';B%<*B'r   c                 d   K   |r(| j                  dd|        d {   }t        |      S y7 w)Nr   /portfolio/orders/F)r   bool)r<   r   r   s      r   cancel_orderzMentionsMaker.cancel_order	  s7     ==5Gz3RSSF< Ts   0.0c                 ,  K   g }| j                   D ]]  }| j                  |   s|j                  | j                  | j                  |                d | j                  |<   d | j                  |<   _ |rt        j                  |ddi d {    y y 7 w)Nr   T)SIDESrT   appendr   rU   r   r   )r<   tasksr   s      r   cancel_all_orderszMentionsMaker.cancel_all_orders  s     JJ 	.D~~d#T..t~~d/CDE'+t$)-  &		.
 ..%@4@@@ @s   !BA'BBB	new_pricec                   K   | j                   |   }|sb| j                  r| j                  }n| j                  }| j	                  |||       d {   }|r|| j                   |<   || j
                  |<   |S | j                  |   xs d}|dk(  rd | j                   |<   d | j
                  |<   y d| j                  d|ddd|| dt        t        |dz              i}| j                  d	d
| d|       d {   }|r9|j                  d      r(|d   j                  d      dk7  r|| j
                  |<   |S d | j                   |<   d | j
                  |<   y 7 7 aw)Nr   r   r   r   r   r   r   r   r   r   z/amendr   statuscanceled)rT   rm   ro   rc   r   rU   rX   r$   r   r   r   r9   )	r<   r   r   old_order_idr   new_order_idresting_count
amend_datar   s	            r   modify_orderzMentionsMaker.modify_order  sv    ~~d+$$..//!%!1!1$	5!IIL'3t$)2  &++D16QA#'DNN4 %)DT" dnnDe]fFOSy3!78

 }}V/A,v-VXbccfjj)fWo.A.A(.Kz.Y%.DT"#'DNN4 %)DT"7 J& ds&   AEEB%E5E6AEEc                    |dk(  rA| j                   j                  | j                   j                  | j                   j                  fS | j                   j                  | j                   j
                  | j                   j                  fS )NrF   )rS   r%   r&   r'   r(   r)   r*   )r<   r   s     r   get_bid_infozMentionsMaker.get_bid_info>  sk    5=$$,,d.?.?.L.LdN_N_NnNnnn$$++T->->-J-JDL]L]LkLkkkr!   c                     | j                   j                  | j                   j                  y dt        | j                   j                  dz        z
  t        | j                   j                  dz        z
  S r   )rS   r%   r(   r   r<   s    r   get_market_spreadzMentionsMaker.get_market_spreadD  se    $$,0A0A0H0H0PU4,,44s:;;eDDUDUD\D\_bDb>cccr!   c                 X   | j                  |      \  }}}| j                  |   }| j                  j                  |      xs d}|y t	        |dz        }|t	        |dz        nd }||kD  r|}	n|t	        |dz        }	nd }	| j
                  j                  |d      r| j                  |   |	|	dz   | j                  |<   | j                  |   }
|
|	G|	|
k\  rBt        d|j                          d|
dz  d       d| j
                  |<   d | j                  |<   n{|dk(  rd	nd}| j                  |      \  }}}|r t	        |dz        }|
|z   d
k  r
|
d
k  r|
dz  S t        d|j                          d       d| j
                  |<   d | j                  |<   |||kD  r|S ||kD  r|S ||S |S )Nr   r   Fr6   u   
⚠️ z+: Bump disabled - others bidding at/above $.2frF   rG   c   z": Bump disabled - spread too tight)	r   rU   rX   r9   r   rh   ri   rz   upper)r<   r   bidbid_size
second_bidcurrent_priceour_resting	bid_centscurrent_centsothers_best_centstarget_cents
other_side	other_bid_other_bid_centss                  r   check_target_pricez MentionsMaker.check_target_priceI  s   $($5$5d$;!Xz((.))--d38q;#)$	6C6Omc12UYk! )# %j3&6 7 $  u-%-2C2O):Q)>  &++D1L'$05F,5VIdjjl^3^_klo_ops^tuv.3D%%d+-1D$$T*)-EJ&*&7&7
&COIq! */	C*@'/9R?LTVDV#/##55Idjjl^3UVW.3D%%d+-1D$$T*$])BJk!J!
r!   c           
      T  K   d}| j                   r| j                  g}n&| j                  r| j                  g}n| j                  }|D ]  }| j
                  |   }|d}|dkD  r| j                  |      \  }}}|| j                   r| j                  n| j                  }| j                  |||       d {   }|r_|| j                  |<   || j                  |<   t        d|j                          d| d|d       t        j                  d       d {    d}d} |S 7 n7 w)	NTFr      ✓ 	: Placed  @ $r   g?)rm   rn   rd   re   r   rX   r   ro   rc   r   rT   rU   rz   r   r   sleep)	r<   successsidesr   existingr   r
  r   r   s	            r   initialize_orderszMentionsMaker.initialize_orders~  s9      **+E%%%%&EJJE 	 D**40H!|))$/ICA262G2G..TMdMd!%!1!1$U!CC+3DNN4(-0D$$T*Diwd3s)LM!--,,,#G)	 *  D
 -s%   B3D(5D$6AD(D&D(&D(c                    | j                   D ]E  }| j                  |   }|| j                  |   kD  s&|| j                  |   z
  }| j                  j	                  d      xs d}| j                  j	                  d      xs d}| j
                  j                  || j                  |   xs d|||       | j                  |   | j                  k  ru|| j                  k\  rf| j                  |   | j                  |<   | j                  |   r;d| j                  |<   d | j                  |<   t        d|j                          d       || j                  |<   H y )NrF   r   rG   F   
✓ z filled - bump disabled)r   r[   rV   rY   r9   rK   notify_fillrU   rc   r\   rh   ri   rz   r   )r<   r   fills_count	new_fillsr   r   s         r   check_fillszMentionsMaker.check_fills  sG   JJ 	;D++D1KT33D99'$*@*@*FF	..2259>Q--11$7<1))$0@0@0F0K!YX_agh))$/$2I2IIk]a]t]tNt-1-=-=d-CD$$T*((.27))$/15((.tzz|n4KLM/:&&t,	;r!   c                      j                   r, j                  } j                  |   }| j                  k\  ryy j                  r j
                  d   xs d} j
                  d   xs d} j                  d   xs d} j                  d   xs d}|dk(  rH|dk(  rC|dk(  r>|dk(  r9 j                  d    j                  k\  r j                  d    j                  k\  ry j                   j                      j                  k\  S  j                  r1 j
                  d   } j
                  d   }||y||k(  rd _
        yyt         fd j                  D              sy j
                  d   } j
                  d   }||y||k(  S )NTFrF   r   rG   c              3   V   K   | ]   }j                   |   j                  k\   " y wN)rV   rc   )r   r   r<   s     r   r   z,MentionsMaker.both_filled.<locals>.<genexpr>  s'     \A4))!,0G0GG\s   &))rm   rn   r[   ro   rd   rY   rX   rV   rc   re   rg   allr   )r<   r   r  r   r   yes_restno_rests   `      r   both_filledzMentionsMaker.both_filled  s     ((D++D1Kd444##**516QG))$/41F**516QH))$/41G11Q7a<&&u-1H1HH&&t,0G0GG))$*:*:;t?V?VVV**51G))$/F&.& &+#\QUQ[Q[\\&&u-%%d+?fn&  r!   r   r   c                   K   t        d| d|        | j                          d {    ||k  rd}||z
  }nd}||z
  }t        t        j                         dz        | _        ddd| _        d d d| _        d d d| _        d d d| _        | j                  |      \  }}}|a| j                  |||       d {   }|rC|| j                  |<   || j                  |<   d| _        | j                  j                  |||       y y y 7 7 Mw)	Nu   
⚠️ Rebalancing: YES=, NO=rF   rG   r   r   rM   T)rz   r   r   r   rW   rV   rT   rU   r\   r   r   rg   rK   notify_rebalance)r<   r   r   lagging_sidediffr   r
  r   s           r   	rebalancezMentionsMaker.rebalance  s&    *7)5AB$$&&&V LG#DLV#D!$))+"45)*!!4!%T2#'t4#'t4%%l3	Q?!--lCFFH/7|,14  .&*#..|T3G	  ! 	'" Gs#   %D
DBD
:D;AD
D
c                   K   | j                   j                  d      xs d}| j                   j                  d      xs d}| j                  r{t        d| j                   d| j
                  j                                 | j                          d {    d| _        d| _        d| _	        | j                  j                          y | j                  rQt        d| j                  j                          d	       | j                  dk(  rdnd}d| j                  |<   || _        n1| j                  j                  ||| j                          ddd
| _        t#        t%        j$                         dz        | _        d d d
| _        d d d
| _        d d d
| _        ddd
| _        d d d
| _        | j2                  r| j                  rf| xj4                  dz  c_        | j4                  dk\  r}d| _        d| _        d| _        d| _	        t        d       | j                  j                          y d| _        d| _        d| _	        t        d       | j                  j                          y | j7                          d {   rt        d       y | j                  s!||k7  r| j9                  ||       d {    y y y 7 %7 A7 w)NrF   r   rG   u   
✓ Manual fill complete:  FTr  u    filled — switching sidesrM   r   r6   r   u$   
✓ Single fire complete — pausedu   
✓ New cycle started)rY   r9   rm   rz   ro   rn   r   r   r_   ra   rK   notify_pausedrd   re   rV   notify_cycle_completerc   r   r   rW   rT   rU   r\   rh   ri   rj   rk   r  r(  )r<   r   r   new_sides       r   start_new_cyclezMentionsMaker.start_new_cycle  s    &&**516Q%%))$/41  01G1G0H$J_J_JeJeJgIhij((***$)D!DK-1D*MM'')##F4++11344OPQ#//58teH/0D""8,'DMM//AXAXY-.a%8D"!$))+"45!%T2#'t4#'t4$)7#'t4  ''00A5033q8"&DK,1D)78D459D2ABMM//1"(-%15.=>++-'')))+,++60AnnWf555 1B+[ +T * 6s7   BJ?J8G%J?9J;:6J?0J=1J?;J?=J?c                 P  K   | j                   r| j                  g}n&| j                  r| j                  g}n| j                  }|D ]  }| j
                  |   }||dk(  r| j                  |      }|.| j                  |   }|@t        |dz        t        |dz        k7  s^| j                  ||       d {   }|s{||kD  rdnd}| j                         }|d| dnd}	| j                  |   rdnd}
t        d	| d
|j                          d|dd|d|	 |
 
        y 7 kw)Nr   r      ↑   ↓z
 [Spread: zc]r   z [BUMP]
r*  z: $r   u    → $)rm   rn   rd   re   r   rX   r  rU   r   r   r   rh   rz   r   )r<   r  r   restingtarget_price
last_pricer   	directionspread
spread_strbump_strs              r   update_orderszMentionsMaker.update_orders%  sV      **+E%%%%&EJJE 	@D))$/G'Q,2248L#))$/J%+,j36F0GG)-):):4)N#NL#-9J-FEE	!%!7!7!9@F@Rz&%<XZ
040A0A$0G9R9+Qtzz|nC
3?OvVbcfUghrgst|s}~%	@ $Os%   BD&D&#D&8D$9D& A%D&c                    | j                   j                  rd| j                   j                  dnd}| j                   j                  rd| j                   j                  dnd}| j                  j	                  d      xs d}| j                  j	                  d      xs d}| j
                  d   }| j
                  d   }|t        |      nd}|t        |      nd}| j                         }	|	d|	 d	nd
}
| j                  rd| j                  j                          dnd
}| j                  rdnd
}| j                  s| j                  rdnd
}| j                  d   rdnd
}| j                  d   rdnd
}t        d| | | d| d| d| d| j                   d    d| j"                   d| d| d| d| j                   d    d| j"                   d| d| |
 d
       t$        j&                  j)                          y )N$r   zN/ArF   r   rG   r   z Sp:cr   []z[REBAL]zPAUSED r0  z Y:z Q: (/z) Nz) Pos:Y=z,N=)end)rS   r%   r(   rY   r9   rZ   r   r   rd   re   r   rg   r_   ra   rh   rz   rV   rc   r|   stdoutflush)r<   r%   r(   r   r   	yes_queueno_queueyes_queue_strno_queue_strr7  r8  side_str	rebal_str	pause_strbump_yesbump_nos                   r   print_statuszMentionsMaker.print_statusA  s-   9=9J9J9R9RAd''//45X]7;7H7H7O7O1T&&--c23UZ&&**516Q%%))$/41..u5	--d3*3*?IS(0(<s8}#''))/);tF81%
6:6N6NQt''--/02TV!%!4!4I"	!%0N0NITV	 --e45",,T2%9+hZ	{"XJayM?Z\]a]s]sty]z\{{|  ~B  ~U  ~U  }V V!F83|nBt7M7Md7S6TTUVZVmVmUn ois6(:,8=?	A 	

r!   c                   K   t        j                          }| j                  r9| j                  r,| j                  rMt	        d       | j                          d {    d| _        d| _        | j                  j                          n| j                          d {    | j                          | j                  r^| j                         rt	        d       | j                          d {    d| _        d| _
        | j                  j                          nA| j                  r| j                          d {    n| j                  rZt        t        j                          dz        | _        ddd| _        | j%                          d {   rt	        d       d| _        nA| j                         r| j'                          d {    n| j                          d {    t        j                          |z
  dk\  r$| j)                          t        j                          }t+        j,                  d	       d {    | j                  r| j                  r,t	        d
       y 7 7 7 7 77 7 7 7 <w)Nu   
⛔ Emergency stopFu    
✓ Cycle complete — stoppingr   r   rM   u   
✓ Orders initializedr6   g333333?u   
✓ Trading stopped)r   r]   r^   rb   rz   r   rK   notify_stoppedr   r  r`   r"  r_   r:  ra   r   rW   rV   r  r.  rP  r   r  )r<   last_statuss     r   trading_loopzMentionsMaker.trading_loopW  s    iikllt{{"",-,,...#&+#,,.**,,,}}##%=>00222"'DK$)DMMM002((***//&)$))+*<&=#12!)<&//1114516. ##%..000,,...yy{[(A-!!#"iik--%%%S llt{{V 	%&Q / - 3 +
 2 1. &s   AI=I)AI=I,AI=-I/.AI=;I2<AI=I5:I=
I7I=#I9$AI=>I;?I=I=,I=/I=2I=5I=7I=9I=;I=c                 $   | j                   st        d       y | j                  s| j                  r4d| _        d| _        t        d       | j                  j                          y d| _        t        d       | j                  j                          y )N(   
⚠️ Not trading — press G to startFu   
▶️ ResumedTu   
⏸️ Paused)r^   rz   r_   ra   rK   notify_resumedr+  r   s    r   toggle_pausezMentionsMaker.toggle_pause  sl    {{=>;;$88DK-2D*$%MM((*DK#$MM'')r!   c                     | j                   st        d       y | j                  s| j                  st        d       y t        d       d| _        d| _        d| _        d| _        y )NrV  u'   
⚠️ Already running — pause firstu   
🎯 Single fire modeTr   F)r^   rz   r_   ra   rj   rk   r   s    r   single_firezMentionsMaker.single_fire  sX    {{=>t==<='( $+,().&r!   c                    | j                   st        d       y | j                  r7|| j                  k7  r(t        d| j                  j	                          d       y | j
                  |    | j
                  |<   | j
                  |   sd | j                  |<   | j
                  |   rdnd}t        d| j
                  |   rdnd d	|j	                          d
|        y )NrV  u#   
⚠️ Can only bump active side (z) in one-side-first modeENABLEDDISABLEDr2  r0  r1  r*  z: Bump mode )r^   rz   rd   re   r   rh   ri   )r<   r   r   s      r   toggle_bumpzMentionsMaker.toggle_bump  s    {{=?##0@0@(@89I9I9O9O9Q8RRjkl&*&7&7&="=$  &%)DT""//5:D--d35?ql[aZbcdr!   c                   K   | j                          d {    | j                  j                  d      xs d}| j                  j                  d      xs d}||k(  rt        d| d| d       y ||kD  rd}||z
  }nd}||z
  }t        d| d|j	                          d	| d| d	       | j                  ||       d {    y 7 7 w)
NrF   r   rG   u'   
⚠️ No open position to close (YES=r$  )u   
🔒 Closing position: buying r*  z (current: YES=)r   rY   r9   rz   r   start_manual_fill)r<   r   r   
close_sideclose_counts        r   start_close_positionz"MentionsMaker.start_close_position  s     &&(((&&**516Q%%))$/41f<WIU6(RSTUVJ!F*KJ 7*K0Qz?O?O?Q>RRabiajjopvowwxyz$$Z=== 	) 	>s"   C
CB)C
 CC
C
c                 8  K   t        d| d|j                          d       | j                          d {    | j                          d {    d| _        || _        || _        | j                  |   xs d| _        t        t        j                         dz        | _        ddd| _        d d d| _        d d d| _        d d d| _        ddd| _        d d d| _        d| _        d| _        d| _        d| _        d| _        | j/                          d {   rt        d	       nt        d
       d| _        d| _        y | j0                  r| j0                  j3                         r)t5        j6                  | j9                               | _        y y 7 \7 G7 w)Nu   
🎯 Manual fill: r*   contract(s)Tr   r   rM   Fu/   ✓ Manual fill order placed - waiting for fillu%   ❌ Failed to place manual fill order)rz   r   r   r   rm   rn   ro   rY   rp   r   r   rW   rV   rT   rU   r\   rh   ri   r^   r_   r`   ra   rd   r  rl   doner   create_taskrT  )r<   r   r   s      r   ra  zMentionsMaker.start_manual_fill  s    $UG1TZZ\N,GH$$&&&&&((( $ $!&*.*>*>t*D*I'!$))+"45)*!!4!%T2#'t4#'t4$)7#'t4).&#( '')))CE9;$)D!DK  D$5$5$:$:$< ' 3 3D4E4E4G HD %== 	'(* *s5   4FFFFCFFA;FFFc           	        K   t        d| d|j                          d       | j                          d {    | j                          d {    d| _        || _        || _        | j                  |   xs d| _        t        t        j                         dz        | _        ddd| _        d d d| _        d d d| _        d d d| _        ddd| _        d d d| _        d| _        d| _        d| _        d| _        d| _        |d	k(  rd
nd	}| j/                  |      \  }}}|dt1        |dz        z
  }|dz  }| j3                  |||       d {   }|rC|| j                  |<   || j                  |<   t        d|j                          d| d|dd       nXt        d|j                          d       d| _        d| _        y t        d|j                          d       d| _        d| _        y | j4                  r| j4                  j7                         r)t9        j:                  | j=                               | _        y y 7 7 7 w)Nu   
🎯 Manual TAKER fill: r*  rf  Tr   r   rM   FrF   rG   r   r  r  r  r   z (taker at ask)u   ❌ z: Failed to place taker orderz): No opposite bid available for ask price)rz   r   r   r   rm   rn   ro   rY   rp   r   r   rW   rV   rT   rU   r\   rh   ri   r^   r_   r`   ra   rd   r   r   r   rl   rg  r   rh  rT  )	r<   r   r   r  r	  r
  	ask_cents	ask_pricer   s	            r   start_manual_fill_takerz%MentionsMaker.start_manual_fill_taker  sD    *5'4::<.MN$$&&&&&((( $ $!&*.*>*>t*D*I'!$))+"45)*!!4!%T2#'t4#'t4$)7#'t4).&#( !U]T
++J7	1a eIO44I!CI!--dIuEEH'/t$)2  &TZZ\N)E7$yo_]^TZZ\N*GHI(-%#D&OPQ$)D!DK  D$5$5$:$:$< ' 3 3D4E4E4G HD %=W 	'(4 Fs5   4I
II
IDI
IC2I
I
I
c                 *   K    j                   rt        d       y t        j                         }	 	 |j	                  d d        d {   }t        |      }d|cxk  rdk  rn n| _        nt        d       I|j	                  d d        d {   }|d	k(  rd _        d
 _	         j                          d {     j                  j                  xs d} j                  j                  xs d}||k\  rdnd _        t        d j                  j                          d j                  dk(  r|n|dd       nd _        d  _         j                  rd j                  j                          dnd|j	                  d  fd       d {   }|d	k7  rt        d       y d _        d _        t        d d j                   d        j                          d {    t        t%        j$                         dz         _        ddd _        d d d _        d d d _        d d d _        ddd _        d d d _        d _         d _        d _        d _        d _         j<                  j?                   j@                   j                   j                   j                         t        jB                   jE                                _#        t        d       y 7 # t        $ r t        d       Y w xY w7 v7 N7 z7 *w)Nu   
⚠️ Already runningTc                  4    t        d      j                         S )NzContract increment (1-20): )inputstripr    r!   r   r3   z-MentionsMaker.start_trading.<locals>.<lambda>  s    uEb?c?i?i?k r!   r6      u   ❌ Must be 1-20u   ❌ Enter a numberc                  P    t        d      j                         j                         S )Nz Higher price side first? (y/n): )ro  rp  lowerr    r!   r   r3   z-MentionsMaker.start_trading.<locals>.<lambda>&  s    u=_7`7f7f7h7n7n7p r!   yr   r   rF   rG   zStarting with z (bid: $r   r`  Fz + HIGHER FIRST (r   c                  t    t        d d j                   d      j                         j                         S )NzStart JOIN BIDz with z contracts? (y/n): )ro  rc   rp  rs  )r<   	side_infos   r   r3   z-MentionsMaker.start_trading.<locals>.<lambda>5  s5    %.6$BYBYAZZm nouuw}} r!   u   ❌ Cancelledu   
🚀 Starting JOIN BIDrB  z contracts)...r   rM   u&   ✓ Ready — press R to begin trading)$r^   rz   r   get_event_looprun_in_executorr   rc   
ValueErrorrd   rf   r   rS   r%   r(   re   r   rg   rm   r   rW   rV   rT   rU   r\   rh   ri   r`   rb   r_   ra   rK   notify_startupr$   rh  rT  rl   )	r<   loopval	incrementosfr%   r(   confirmrv  s	   `       @r   start_tradingzMentionsMaker.start_trading  s    ;;,-%%' , 007kllH		'R'.7D+()  ((/pqq#:'+D$"-D**,,,''//41G&&--2F(/6(9utDN4#3#3#9#9#;"<HPTP`P`diPiWouvyDzz{|}',D$#DGKG_G_'(8(8(>(>(@'ACeg	,,
 
 c>/"# %(2d6M6M5Nn]^&&(((!$))+"45)*!!4!%T2#'t4#'t4$)7#'t4#)-&$$NND33$$d&6&6	

 $//0A0A0CD67q m  ,*+, r -
 	)s   .LK, 	K)
$K, .L/K, :LL*L<L
=CLLAL&L'DL)K, ,L LLL
LLLc                 X    | j                   st        d       y t        d       d| _        y )N   
⚠️ Not tradingu$   
⏳ Stopping after current cycle...T)r^   rz   r`   r   s    r   stop_tradingzMentionsMaker.stop_tradingV  s%    {{()56r!   c                   K   | j                   st        d       y t        d       | j                          d {    ddd| _        d d d| _        d| _        d| _         d| _        d| _        | j                  r/| j                  j                          	 | j                   d {    | j                  j                          t        d       y 7 7 ,# t        j                  $ r Y ?w xY ww)Nr  u0   
⛔ Emergency stop — cancelling all orders...FrM   u   ✓ Stopped)r^   rz   r   rh   ri   rm   r`   rb   rl   cancelr   CancelledErrorrK   rR  r   s    r   
force_stopzMentionsMaker.force_stop]  s     {{()AB$$&&&$)7#'t4 %#$$&'''' 	$$&m 	' ()) sF   7C,CAC,C $C%C )'C,C C)&C,(C))C,r  ))r   r   r   __doc__r   r   r   r   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r"  r(  r.  r:  rP  rT  rX  rZ  r^  rd  ra  rl  r  r  r  r    r!   r   rE   rE   J   s   6DMEC C C Cf C`p CJ.s .C .s .s .S C t 2>M@Kc K% K KQT K3 4 A#s #u ## #Jl ld8C= d
3s 3x 3j @; %!T %!NHs HC H446l@8,.'`*/e e> !IC !I !IF.I# .Ic .I`B8Hr!   rE   c                  
  K   t        j                  d      } t        j                  d      }t        j                  d      }t        j                  d      }t        j                  d      }| s t        d       t        j                  d       t        ||g      s t        d       t        j                  d       t        ||g      s t        d	       t        j                  d       t               }t        ||      }t        ||| ||      }d
|_	        |j                          t        d       t        d       t        d|         t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d       t        d        t        d!       t        d"       t        j                         }	 |j                  r|j                  d d#        d {   }	|	d$k(  r|j                          d {    nE|	d%k(  r|j                          n.|	d&k(  r|j!                          n|	d'k(  r|j#                  d(       n|	d)k(  r|j#                  d*       n|	d+k(  r&|j%                  d(|j&                         d {    n|	d,k(  r&|j%                  d*|j&                         d {    n|	d-k(  r)|j%                  d(|j&                  d.z         d {    nc|	d/k(  r)|j%                  d*|j&                  d.z         d {    n5|	d0k(  r&|j)                  d(|j&                         d {    n
|	d1k(  r%|j)                  d*|j&                         d {    n|	d2k(  r(|j)                  d(|j&                  d.z         d {    n|	d3k(  r(|j)                  d*|j&                  d.z         d {    n|	d4k(  r|j+                          d {    nh|	d5k(  r$|j-                          d {    t        d6       n?|	d7k(  r|j/                          n)|	d8k(  r|j1                          d {    nt        d9       |j                  ry y 7 y7 _7 7 7 7 [7 37 7 7 7 7 }7 @# t2        $ r7 t        d:       |j-                          d {  7   |j5                          Y y w xY ww);NMENTIONS_MARKET_IDKALSHI_MOM_API_KEYKALSHI_MOM_API_SECRETTELEGRAM_MOM_BOT_TOKENTELEGRAM_MOM_CHAT_IDu"   ❌ Set MENTIONS_MARKET_ID in .envr6   u>   ❌ Missing KALSHI_MOM_API_KEY / KALSHI_MOM_API_SECRET in .envuA   ❌ Missing TELEGRAM_MOM_BOT_TOKEN / TELEGRAM_MOM_CHAT_ID in .envTz=
============================================================zMENTIONS MARKET MAKERzMarket: zAccount: momz<============================================================z

Controls:z-  [G] Start trading (prompts for size & mode)z  [R] Pause / resumez(  [F] Single fire (one cycle then pause)z2  [1] Toggle YES bump (+1c above others' best bid)z1  [2] Toggle NO bump (+1c above others' best bid)z*  [7] Taker fill: YES (contract increment)z)  [8] Taker fill: NO (contract increment)z-  [9] Taker fill: YES (2x contract increment)z,  [0] Taker fill: NO (2x contract increment)z*  [Y] Maker fill: YES (contract increment)z)  [U] Maker fill: NO (contract increment)z-  [H] Maker fill: YES (2x contract increment)z,  [J] Maker fill: NO (2x contract increment)z3  [K] Close position (buy opposite side to flatten)z  [N] Cancel all ordersz  [S] Stop after current cyclez  [Z] Emergency stopz=============================================================
c                  P    t        d      j                         j                         S )Nz	Command: )ro  rp  r   r    r!   r   r3   zmain.<locals>.<lambda>  s    eK>P>V>V>X>^>^>` r!   GRF1rF   2rG   789r   r   YUHJKNu   
✓ All orders cancelledSZu   ❌ Invalid commandu   
⛔ Interrupted)rr   getenvrz   r|   r}   r  r   r   rE   r]   start_listenerr   rw  rx  r  rX  rZ  r^  rl  rc   ra  rd  r   r  r  KeyboardInterruptrR  )
r$   rH   rI   	bot_tokenchat_idrJ   rK   rR   r{  choices
             r   mainr  s  sp    		./Iii,-G23J		23Iii./G23$%NO	7#$QRXF	73H7J	68LFFN 	/	
!"	HYK
 !	L	(O	-	
9:	
 !	
45	
>?	
=>	
67	
56	
9:	
89	
67	
56	
9:	
89	
?@	
#$	
*+	
 !	/!!#D,"nn//6`aaF}**,,,3##%3""$3""5)3""4(344UF<U<UVVV344T6;T;TUUU344UF<U<UXY<YZZZ344T6;T;TWX;XYYY3..uf6O6OPPP3..tV5N5NOOO3..uf6O6ORS6STTT3..tV5N5NQR5RSSS3113333..000233##%3'')))+,O nna - WUZYPOTS30
 *  "!"&&(((!"s!  IU#T 'S (T S#BT S&*T 8S)9-T &S,'-T S/*T ?S2 *T *S5+,T S8,T S:T "S<#T  S>>T ?T  T U T #T &T )T ,T /T 2T 5T 8T :T <T >T  T 'U)T,*U?UUU__main__)r  rr   r|   r   r   r   dataclassesr   typingr   r   dotenvr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr	   cryptography.hazmat.backendsr
   r   rK   r   r   r   r   r#   rE   r  r   runr    r!   r   <module>r     s    
 
    ! !  @ = 8   %t   D D D  &  &  &Ff fR`"F zGKK r!   