+
    €žõj‰I  ã                   óR  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t^ RI
H
t
Ht ^ RIHtHtHt ^ RIt^ RIt ^ RIHt ^ RIHt . R!Ot]! R
4      t]! ]4      tRt]P<                  ! R4      t]P<                  ! R4      t R t!R"R lt"RRRRR	R/t# ! R R4      t$ ! R R4      t%R t& ! R R]PN                  4      t(R t)R t*R t+R#R lt,R t-].R8X  d    ]P^                  ! ]-! 4       4       R# R#   ] d    ]P0                  ! R4        LÅi ; i  ]0 d    ]1! R 4        R# i ; i)$ub  
Testnet demo on Lighter â€” all four markets, each at its own MAX leverage.

  python lighter_live.py --dry                 # signals + would-be orders (no key)
  python lighter_live.py --run                 # signed testnet orders
  python lighter_live.py --run --market        # cross the spread instead of resting

Execution, both solved problems in one place:
  * default is a POST-ONLY limit resting ON the line â€” the spread cost disappears
    and you can earn it, at the risk of not being filled;
  * if the venue rejects post-only (price already through the line) it falls back
    to a market order so the trade still happens.

Safety, so it can run while you are unreachable:
  * daily loss cap â€” stops opening after MAX_DAILY_LOSS, keeps managing what is open
  * exchange-side stop on every position, two boxes beyond the line
  * kill switch â€” create a file called STOP in this folder, or send /stop on Telegram:
    every position is flattened at market and the process exits
  * Telegram: profit booked => "withdraw X" alert with the running total to withdraw;
    /status, /flat, /stop commands when TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID are set

Keys live in the environment on your machine, never here:
  LIGHTER_API_PRIVATE_KEY, LIGHTER_ACCOUNT_INDEX=8073, LIGHTER_API_KEY_INDEX=2
Orders must be signed even on testnet â€” there is no unsigned path.
N)ÚdatetimeÚtimezone)ÚDecimalÚ
ROUND_DOWNÚROUND_HALF_UP)ÚSignerClient)ÚWsClientzpip install lighter-sdkÚBTCÚETHÚSOLÚ2ÚSTOPÚTELEGRAM_BOT_TOKENÚTELEGRAM_CHAT_IDc                  óL   € \        \        P                  ! 4       R ,          4      # )iè  )ÚintÚtime© ó    Úlighter_live.pyÚms_nowr   6   s   € ÜŒt�yŠy‹{˜TÕ!Ó"Ð"r   c                óŒ  € \         P                  P                  V 4      '       g   R# \        V RR7       F‹  pVP	                  4       pV'       d   VP                  R4      '       g   RV9  d   K;  VP                  R^4      w  r#\         P                  P                  VP	                  4       VP	                  4       4       K�  	  R# )zORead keys from a local file so they never live in code or in the shell history.Nzutf-8)ÚencodingÚ#Ú=)	ÚosÚpathÚexistsÚopenÚstripÚ
startswithÚsplitÚenvironÚ
setdefault)r   ÚlineÚkÚvs   &   r   Úload_envr'   :   s€   € ä�7‰7�>‰>˜$×ÒÙÜ�T G×,ˆØ�z‰z‹|ˆß�t—‘ s×+Ò+¨s¸$¬ÙØ�z‰z˜#˜qÓ!‰ˆÜ
�
‰
×Ñ˜aŸg™g›i¨¯©«Ö3ó -r   ÚBTCUSDTÚETHUSDTÚSOLUSDTc                   ó8   a € ] tR t^It o R tR tR tR tRtV t	R# )ÚMetac                ó~  € \        VR ,          4      V n        VR,          V n        \        VR,          4      V n        \        VR,          4      V n        \        \        VR,          4      4      V n        \        \        VR,          4      4      V n        \        ^4      P                  V P                  ) 4      V n
        \        ^4      P                  V P                  ) 4      V n        \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      p\        ^R	V,          4      V n        R
# )Ú	market_idÚsymbolÚprice_decimalsÚsize_decimalsÚmin_base_amountÚlast_trade_priceÚmin_initial_margin_fractionÚdefault_initial_margin_fractioniô  i'  N)r   Úindexr/   Ú	price_decÚsize_decÚDÚstrÚmin_baseÚlastÚscalebÚ
price_stepÚ	size_stepÚgetÚmaxÚmax_lev)ÚselfÚdÚfracs   && r   Ú__init__ÚMeta.__init__J   sã   € Ü˜˜;�Ó(ˆŒ
Ø˜•kˆŒÜ˜QÐ/Õ0Ó1ˆŒÜ˜A˜oÕ.Ó/ˆŒÜœ#˜aÐ 1Õ2Ó3Ó4ˆŒÜ”c˜!Ð.Õ/Ó0Ó1ˆŒ	Ü˜A›$Ÿ+™+ t§~¡~ oÓ6ˆŒÜ˜1›Ÿ™ d§m¡m ^Ó4ˆŒÜ�1—5‘5Ð6Ó7×jÐj¸1¿5¹5ÐAbÓ;c×jÐjÐgjÓkˆÜ˜1˜e t�mÓ,ˆŽr   c                ó¦   € \        \        \        V4      4      \        ^
4      V P                  ,          ,          P	                  \
        R7      4      # ©é
   )Úrounding)r   r9   r:   r7   Úto_integral_valuer   )rC   Úprices   &&r   ÚpxÚMeta.pxV   s6   € Ü”A”c˜%“j“M¤Q r£U¨d¯n©nÕ%<Õ=×PÑPÔZgÐPÓhÓiÐir   c                ó¦   € \        \        \        V4      4      \        ^
4      V P                  ,          ,          P	                  \
        R7      4      # rI   )r   r9   r:   r8   rL   r   )rC   Úqtys   &&r   ÚamountÚMeta.amountY   s6   € Ü”A”c˜#“h“K¤1 R£5¨D¯M©MÕ#9Õ:×MÑMÔWaÐMÓbÓcÐcr   c                óº   € V P                    R V P                   RV P                   RV P                   RV P                   RV P
                   RV P                   2# )z idx ú | zx | px z
dp | size z	dp | min z | last )r/   r6   rB   r7   r8   r;   r<   ©rC   s   &r   Ú__repr__ÚMeta.__repr__\   sY   € Ø—;‘;�-˜u T§Z¡Z L°°D·L±L°>ÀÈÏÉÐHXð YØŸ-™-˜¨	°$·-±-°ÀÈÏÉÈðUð 	Vr   )	r6   r<   rB   r;   r7   r>   r8   r?   r/   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rF   rN   rR   rW   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r,   r,   I   s"   ø‡ € ò
-òjòd÷Vð Vr   r,   c                   óR   a € ] tR t^at o R
R ltR tR tR tRR ltR t	R t
RtV tR	# )ÚVenuec                óú  € V'       d   \         P                  M\         P                  pVP                  VP                  VP
                  uV n        V n        V n        W n        Wn	        / R uV n
        V n        \        \        P                  ! RR4      ;'       g    ^ 4      ;'       g    R V n        \        \        P                  ! RR4      ;'       g    ^ 4      V n        \        P                  ! R4      V n        R # )NÚLIGHTER_ACCOUNT_INDEXÚ0ÚLIGHTER_API_KEY_INDEXÚLIGHTER_API_PRIVATE_KEY)ÚlighterÚMAINNETÚTESTNETÚapi_urlÚws_urlÚchain_idÚurlÚchainÚmainnetÚmakerÚmetasÚsignerr   r   ÚgetenvÚaccount_indexÚapi_key_indexÚkey)rC   rq   rp   Úps   &&& r   rF   ÚVenue.__init__b   s«   € ß&ŒG�OŠO¬G¯O©OˆØ,-¯I©I°q·x±xÀÇÁÐ)ˆŒ�$”+˜tœzØŒØŒ
Ø"$ dÐˆŒ
�D”KÜ ¤§¢Ð+BÀCÓ!H×!MÐ!MÈAÓN×VÐVÐRVˆÔÜ ¤§¢Ð+BÀCÓ!H×!MÐ!MÈAÓNˆÔÜ—9’9Ð6Ó7ˆŽr   c              ƒ  óª  "  € \         P                  ! V P                  R 7      p\         P                  ! V4      p \         P                  ! V4      pVP                  4       G Rj  x€L
 p\        VR. 4       FN  pVP                  4       pVP                  R4      \        9   g   K/  \        V4      V P                  VR,          &   KP  	  VP                  4       G Rj  x€L
  V P                  '       g    \        R\         RV P                   24      hV P                  '       d‚   V P                  '       dp   \!        V P                  V P                  V P"                  V P                  /V P$                  R7      V n        V P&                  P)                  4       e   \        R4      hV P                  #  ELL L×  TP                  4       G Rj  x€L 
  i ; i5i))ÚhostNÚorder_book_detailsr/   zno z markets on )rm   zsigner refused the key)rh   ÚConfigurationrn   Ú	ApiClientÚOrderApir|   ÚgetattrÚto_dictr@   ÚSYMBOLSr,   rr   ÚcloseÚRuntimeErrorrw   ru   r   rv   ro   rs   Úcheck_client)rC   ÚcfgÚclientÚapiÚresÚbrD   s   &      r   ÚloadÚ
Venue.loadl   sV  é € Ü×#Ò#¨¯©Ô2ˆÜ×"Ò" 3Ó'ˆð	!Ü×"Ò" 6Ó*ˆCØ×.Ñ.Ó0×0ˆCÜ˜SÐ"6¸Ö;�Ø—I‘I“K�Ø—5‘5˜“?¤gÖ-Ü.2°1«g�D—J‘J˜q �{Ó+ñ <ð
 —,‘,“.× Ð Ø�z�zˆzÜ ¤W I¨\¸$¿(¹(¸ÐDÓEÐEØ�8�8ˆ8˜×*×*Ð*Ü& t§x¡x°×1CÑ1CØ(,×(:Ñ(:¸D¿H¹HÐ'EÐPT×PZÑPZô\ˆDŒKà�{‰{×'Ñ'Ó)Ò5Ü"Ð#;Ó<Ð<Ø�z‰zÐò 1ñ !ø�&—,‘,“.× Ò üse   ‚8G»)F5 Á$F0Á%;F5 Â%#F5 ÃGÃF3ÃGÃ20GÄ#GÄ5A;GÆ0F5 Æ3GÆ5GÇ	GÇ
GÇGc              ƒ  ó´   "  € V P                   P                  VP                  ^ W4VR8H  \        P                  \        P
                  VR7      G Rj  x€L
 #  L5i©é    ÚSHORT)Úreduce_onlyN)rs   Úcreate_orderr6   r   ÚORDER_TYPE_LIMITÚORDER_TIME_IN_FORCE_POST_ONLY©rC   ÚmÚsideÚamtrN   r‘   s   &&&&&&r   Ú_limitÚVenue._limit�   sS   é € Ø—[‘[×-Ñ-Ø�G‰G�Q˜ ¨¡´,×2OÑ2OÜ×6Ñ6ÀKð .ó Q÷ Qð 	Qñ Qùs   ‚AAÁAÁAc           	   ƒ  óx   "  € V P                   P                  VP                  ^ W4VR8H  VR7      G Rj  x€L
 #  L5irŽ   )rs   Úcreate_market_orderr6   r•   s   &&&&&&r   Ú_marketÚVenue._market†   sC   é € Ø—[‘[×4Ñ4°Q·W±W¸aÀØ59¸W±_ÐR]ð 5ó _÷ _ð 	_ñ _ùs   ‚1:³8´:c              ƒ  óÂ  "  € V P                   V,          pVP                  V4      VP                  V4      r‡V^ 8:  d   V RV RVP                   R2# V P                  f+   RT RT RT RT R	T RV P
                  '       d   R
 2# R 2# V P
                  '       dv   V P                  WbWxV4      G Rj  x€L
 w  ršpV'       dE   V P                  WbWxV4      G Rj  x€L
 w  ršpT RT RV'       d   R\        V4      ,            2# R 2# V RV RV R2# V P                  WbWxV4      G Rj  x€L
 w  ršpT RT RT RV'       d   R\        V4      ,            2# R 2#  L¥ L� L45i)r�   ú: z rounds to 0 at ÚdpNzDRY Ú ú amt z px z reduce=zpost-only limitÚmarketz post-only refused -> market: úERR Úokz	 limit @ z resting (maker)z market amt )	rr   rR   rN   r8   rs   rq   r™   r�   r:   )rC   Úsymr—   rQ   rM   r‘   r–   r˜   rN   ÚtxÚrespÚerrs   &&&&&&      r   ÚorderÚVenue.orderŠ   sŒ  é € Ø�J‰J�s�OˆØ—(‘(˜3“- §¡ e£ˆRØ�!Œ8Ø�U˜"˜S˜EÐ!1°!·*±*°¸RÐ@Ð@Ø�;‰;ÒØ˜#˜˜a ˜v U¨3¨%¨t°B°4°xÀ¸}ÈAØ+/¯:¯:¨:Ð'ÐDðFð FØ;CÐDðFð Fà�:�:ˆ:Ø"&§+¡+¨a°sÀÓ"L×L‰MˆB�cßØ&*§l¡l°1¸CÀ[Ó&Q× Q‘�˜#Ø˜˜a ˜vÐ%C×Y\ÀFÌSÐQTËXÕDUÐCgÐhÐhÐbfÐCgÐhÐhØ�U˜!˜D˜6 ¨2¨$Ð.>Ð?Ð?Ø"Ÿl™l¨1°C¸[ÓI×I‰ˆ�#Ø��a˜�v˜\¨#¨¨bÇc°¼#¸c»(Õ1BÐ0TÐUÐUÈtÐ0TÐUÐUñ Má Qñ JùsC   ‚B EÂEÂEÂ3EÂ4%EÃEÃAEÄ(EÄ)1EÅEÅEc              ƒ  óÎ   "  € V P                   V,          pV P                  f   R# V P                  P                  VP                  ^ 4      G R j  x€L
 w  r4pT;'       g    R#  L5i)Nz
DRY cancelÚ	cancelled)rr   rs   Úcancel_all_ordersr6   )rC   r§   r–   r¨   r©   rª   s   &&    r   Ú
cancel_allÚVenue.cancel_all›   sT   é € Ø�J‰J�s�OˆØ�;‰;ÒÙØ"Ÿk™k×;Ñ;¸A¿G¹GÀQÓG×G‰ˆ�#Ø×!Ð!�kÐ!ñ Hùs   ‚AA%ÁA#ÁA%Á A%c              ƒ  óª  "  € V P                   V,          pVP                  V4      VP                  V4      rvV P                  f   RV RV RV RV 2# V P                  P	                  VP
                  ^ WgVR8H  \        P                  \        P                  RVR7	      G R j  x€L
 w  r‰p
RT RT RV
'       d   R	\        V
4      ,            2# R
 2#  L.5i)Nz	DRY STOP r¢   r£   ú @ r�   T)r‘   Útrigger_pricezSTOP r¥   Úplaced)
rr   rR   rN   rs   r’   r6   r   ÚORDER_TYPE_STOP_LOSSÚ'ORDER_TIME_IN_FORCE_IMMEDIATE_OR_CANCELr:   )rC   r§   r—   rQ   Útriggerr–   r˜   rN   r¨   r©   rª   s   &&&&&      r   ÚstopÚ
Venue.stop¢   sÒ   é € Ø�J‰J�s�OˆØ—(‘(˜3“- §¡ g£ˆRØ�;‰;ÒØ˜s˜e 1 T F¨%°¨u°C¸°tÐ<Ð<Ø"Ÿk™k×6Ñ6Ø�G‰G�Q˜ ¨¡´,×2SÑ2SÜ×@Ñ@Ø¨Bð 7ó 0÷ 0‰ˆ�#ð �s�e˜3˜r˜d !¿ F¬S°«XÕ$5Ð#KÐLÐLÀ(Ð#KÐLÐLñ	0ùs   ‚B CÂ"CÂ#/C)
ru   rv   ro   rw   rp   rq   rr   rs   rn   rl   N)TF)F)rY   rZ   r[   r\   rF   r‹   r™   r�   r«   r°   r¹   r]   r^   r_   s   @r   rb   rb   a   s2   ø‡ € ô8òò*Qò
_ôVò""÷	Mð 	Mr   rb   c                 ó  € \         '       d   \        '       g   R #  \        P                  P	                  R\        RV /4      P                  4       p\        P                  P                  R\          R2V^
R7       R #   \         d     R # i ; i)NÚchat_idÚtextúhttps://api.telegram.org/botz/sendMessage©Útimeout)	ÚTG_TOKENÚTG_CHATÚurllibÚparseÚ	urlencodeÚencodeÚrequestÚurlopenÚ	Exception)r½   Údatas   & r   ÚtgrË   ®   ss   € ß‹HŸ›ÙðÜ�|‰|×%Ñ% y´'¸6À4Ð&HÓI×PÑPÓRˆÜ�‰×ÑÐ!=¼h¸ZÀ|ÐTØ#¨Rð 	ö 	1øäô Úðús   œAA= Á=BÂBc                   ó®   a a€ ] tR t^¹t oV 3R ltR tR tV 3R ltRR ltV 3R lt	V 3R lt
R tR	 tR
 tV 3R ltV 3R ltV 3R ltR tR tRtVtV ;t# )ÚLiveBotc                ó@  <€ VP                   V n        Wn        W0n        VP                  V n        R V P                   R2V n        RV n        \        \        V4      4      V n
        RV n        \        ^ 4      V n        RV n        RV n        \        ^ 4      V n        \         SV `E  R4       \        \        V4      4      \        ^ 4      RuV n        V n        V n        VP*                  V n        VP.                  V n        VP2                  VP4                  ,          V n        R# )Úevents_z.csvNF)r/   r§   ÚmetaÚvenuerB   ÚlevÚlogpathÚ_prevr9   r:   Úmax_daily_lossÚdayÚday_pnlÚblockedÚpendingÚwithdrawableÚsuperrF   ÚcapitalÚsavingsÚdeadr>   Útickr?   Úqty_stepr;   r<   Úmin_notional)rC   rÐ   rÜ   rÑ   rÕ   Ú	__class__s   &&&&&€r   rF   ÚLiveBot.__init__º   sÖ   ø€ Ø—;‘;ˆŒØŒ	ØŒ
Ø—<‘<ˆŒØ  §¡ 
¨$Ð/ˆŒØˆŒ
Ü¤ NÓ 3Ó4ˆÔØˆŒÜ˜“tˆŒØˆŒØˆŒÜ˜a›DˆÔÜ‰Ñ˜ÔÜ01´#°g³,³ÄÀ1ÃÀuÐ-ˆŒ�d”l D¤IØ—O‘OˆŒ	ØŸ™ˆŒØ ŸM™M¨D¯I©IÕ5ˆÖr   c                ó   € R # ©Nr   rV   s   &r   r‹   ÚLiveBot.loadÍ   ó   € Ùr   c                ó   € R # rå   r   rV   s   &r   ÚsaveÚLiveBot.saveÐ   rç   r   c                ó^   <€ \        V P                  4      \        n        \        SV `  V4      # rå   )r   rÒ   ÚzÚLEVERAGErÛ   Ú
liquidated)rC   rM   râ   s   &&€r   rî   ÚLiveBot.liquidatedÓ   s"   ø€ Ü˜Ÿ™“]ŒŒ
Ü‰wÑ! %Ó(Ð(r   c                ó”  € \         P                  ! \        P                  4      P	                  R 4      p\        V RV P                  R RVR RV 2V'       d   RV 2MR,           RV P                  R 2,           RR	7       \        P                  P                  V P                  4      '       * p\        V P                  R
RR7      ;_uu_ 4       p\        P                  ! V4      pV'       d   VP                  . RO4       VP                  WPP                  WW4V P                  R .4       RRR4       R#   + '       g   i     R# ; i)ú%H:%M:%Sr¢   ú<5z<18z | PnL Ú ú | cash ú.4fT©ÚflushÚa)Únewlinez.6fN)r   r¤   ÚeventÚdetailÚpnlÚfeesrÜ   )r   Únowr   ÚutcÚstrftimeÚprintr§   rÜ   r   r   r   rÓ   r   ÚcsvÚwriterÚwriterow)	rC   rú   rû   rü   rý   ÚstampÚnewÚfÚws	   &&&&&    r   ÚlogÚLiveBot.log×   sò   € Ü—’œXŸ\™\Ó*×3Ñ3°JÓ?ˆÜ���q˜Ÿ™ "˜ Q u¨S k°°6°(Ð;ß$'�7˜3˜%‘¨Rõ1Ø5=¸d¿l¹lÈ3Ð=OÐ3PõQØX\õ	^ä—'‘'—.‘. §¡Ó.Ô.ˆÜ�$—,‘, ¨R×0Õ0°AÜ—
’
˜1“ˆAßØ—
‘
ÒZÔ[Ø�J‰J˜Ÿx™x¨¸ÀdÇlÁlÐSVÐEWÐYÔZ÷	 1×0×0Ò0ús   ÃAD6Ä6E	c           
     ó„  <€ V P                   V P                  ,           p\        SV `  V4       V P                   V P                  ,           pW2,
          p\        P
                  ! \        P                  4      P                  4       pV P                  V8w  d   V\        ^ 4      uV n	        V n        V ;P                  V,          un        V^ 8”  df   V\        P                  ,          ^d,          pV ;P                  V,          un        \        V P                    RVR RVR RV P                  R R24       V P                  V P"                  ) 8:  dr   V P$                  '       g^   RV n        V P'                  RRV P                  R R	24       \        V P                    R
V P"                   RV P                  R R24       R# R# R# )r�   z profit booked: +rõ   z USDC
withdraw now: z! USDC
total waiting to withdraw: z USDCTz	DAILY CAPzstopped opening after z todayz: daily loss cap z hit (z4). No new trades today; open position still managed.N)rÜ   rÝ   rÛ   Úbookr   rþ   r   rÿ   ÚdaterÖ   r9   r×   rì   ÚSAVINGS_PCTrÚ   rË   r§   rÕ   rØ   r	  )rC   ÚreasonÚbeforeÚafterÚgainedÚtodayÚoutrâ   s   &&     €r   r  ÚLiveBot.bookâ   sw  ø€ Ø—‘ §¡Õ,ˆÜ‰‰�VÔØ—‘˜tŸ|™|Õ+ˆØ•ˆÜ—’œXŸ\™\Ó*×/Ñ/Ó1ˆØ�8‰8�uÔØ%*¬A¨a«DÐ"ˆDŒH�d”lØ�Š˜Õ�Ø�AŒ:Øœ1Ÿ=™=Õ(¨3Õ.ˆCØ×Ò Õ$ÕÜ�$—(‘(�Ð,¨V°C¨Lð 9 Ø # C˜yð )-Ø-1×->Ñ->¸sÐ,CÀ5ðJô Kð �<‰<˜D×/Ñ/Ð/Ô/¸¿¿¸ØˆDŒLØ�H‰H�[Ð$:¸4¿<¹<ÈÐ:LÈFÐ"SÔTÜ�$—(‘(�Ð,¨T×-@Ñ-@Ð,AÀÈÏÉÐUXÐGYð ZCð Dö Eñ 9EÑ/r   c                ó¶   <€ \         SV `  W4       V P                  '       d7   V P                  e'   \        P
                  ! V P                  4       4       R# R# R# )uI   A new line kills any entry still resting at the old one â€” at zero cost.N)rÛ   Úset_linerÙ   rÑ   ÚasyncioÚcreate_taskÚ_expire)rC   r$   r—   râ   s   &&&€r   r  ÚLiveBot.set_line÷   s=   ø€ ä‰Ñ˜Ô$Ø�<�<ˆ<˜DŸJ™JÒ2Ü×Ò §¡£Ö/ñ 3‰<r   c           	   ƒ  óJ  "  € R V n          \        RV P                   RV P                  P	                  V P                  4      G Rj  x€L
  2RR7       R#  L  \
         d?   p\        RT P                   R\        T4      P                   RT 2RR7        Rp?R# Rp?ii ; i5i)Fz  expired resting entry on r    NTrö   z  expire error )rÙ   r  r§   rÑ   r°   rÉ   ÚtyperY   )rC   Úes   & r   r  ÚLiveBot._expireý   sŽ   é € ØˆŒð	UÜÐ/°·±¨z¸À$Ç*Á*×BWÑBWÐX\×X`ÑX`ÓBa×<aÐ;bÐcØ÷Ñ<aøäô 	UÜ�O D§H¡H :¨R´°Q³×0@Ñ0@Ð/AÀÀAÀ3ÐGÈt×TÓTûð	Uüs@   ‚B#‹;A ÁAÁA ÁB#ÁA ÁB Á"3BÂB#ÂB Â B#c           	   ƒ  ó  a"  € \         P                  V P                  4      oS'       g   V P                  RR4       R# V3R lp \        P
                  ! V4      G Rj  x€L
 p\        4       pT FG  p\        T^,          4      T8  g   K  T P                  P                  \        T^,          4      4       KI  	  T P                  P                  '       d;   T P                  T P                  P                   T P                  P                  4       T P                  RRT P"                   R\%        T4       R24       R#  Lß  \         d4   pT P                  RR\        T4      P                   24        Rp?R# Rp?ii ; i5i)	zKBuild the 1hr line from already-closed hours so trading starts immediately.ÚSEEDu3   no hourly source â€” line warms up from live pricesNc                  óx   <€ ^ RI p RS R2pV P                  \        P                  P	                  V^R7      4      # )r�   Nz/https://fapi.binance.com/fapi/v1/klines?symbol=z&interval=1h&limit=300r¿   )Újsonr‹   rÃ   rÇ   rÈ   )r#  rn   Úpairs     €r   ÚfetchÚLiveBot.seed.<locals>.fetch  s:   ø€ ÛØDÀTÀFØ+ð-ˆCà—9‘9œVŸ^™^×3Ñ3°CÀÐ3ÓDÓEÐEr   zfailed: zline z from z& closed hours (same price, other feed))Ú
SEED_PAIRSr@   r§   r	  r  Ú	to_threadrÉ   r  rY   r   r   Úr1hÚfeedr9   Údirr  r   r$   Úlen)rC   r%  Úrowsr  rþ   Úcr$  s   &     @r   ÚseedÚLiveBot.seed  s  øé € ä�~‰~˜dŸh™hÓ'ˆßØ�H‰H�VÐRÔSÙõ	Fð
	Ü ×*Ò*¨5Ó1×1ˆDô ‹hˆÛˆAÜ�1�Q•4‹y˜3ŽØ—‘—‘œa  !¥›gÖ&ñ ð �8‰8�<�<ˆ<Ø�M‰M˜$Ÿ(™(Ÿ-™-¨¯©¯©Ô6Ø�‰�˜5 §¡ ¨6´#°d³)°Ð<bÐcÖdñ 2øÜô 	Ø�H‰H�V˜x¬¨Q«×(8Ñ(8Ð'9Ð:Ô;Ýûð	üsP   ƒAFÁE ÁD?Á E Á$#FÂA
FÃA(FÄ?E ÅE?Å(E:Å4FÅ:E?Å?Fc              ƒ  óÆ   "  € V P                   f   R # V P                  P                  V P                   4       F#  pV P                  V^ ,          V^,          4       K%  	  R # 5irå   )rÔ   r)  r*  r  )rC   rŠ   s   & r   Únew_hourÚLiveBot.new_hour  sC   é € Ø�:‰:ÒÙØ—‘—‘˜tŸz™zÖ*ˆAØ�M‰M˜!˜A�$  !¥Ö%ó +ùs   ‚AA!c              ƒ  óN   <"  € Wn         \        SV `	  W4      G R j  x€L
  R #  L5irå   )rÔ   rÛ   Úon_trade)rC   rM   Útsrâ   s   &&&€r   r5  ÚLiveBot.on_trade$  s   øé € ØŒ
Ü‰gÑ˜uÓ)×)Ô)ùs   ƒ%œ#�%c           
     ó  <€ \        V P                  4      \        n        V P                  '       d   R # \
        S
V `  WW44       V P                  '       g   R # V^8X  d   RMRpV P                  R,          V P                  R,          rvRV n        \        P                  ! V P                  V P                  P                  V P                  WVVR4      4       V P                  ;'       g    TpV^8X  d*   V^\         \        P"                  ,          ,
          ,          M(V^\         \        P"                  ,          ,           ,          p	\        P                  ! V P                  V P                  P$                  V P                  WVV	4      4       R # )NÚLONGr�   rQ   ÚentryTF)r   rÒ   rì   rí   rØ   rÛ   r   ÚposrÙ   r  r  Ú_sendrÑ   r«   r§   r$   Ú
STOP_BOXESÚ
BOX_HOURLYr¹   )rC   rD   ÚrawÚslipÚon_liner—   rQ   r:  r$   r¹   râ   s   &&&&&     €r   r   ÚLiveBot.open(  s  ø€ Ü˜Ÿ™“]ŒŒ
Ø�<�<ˆ<ÙÜ‰‰�Q˜TÔ+Ø�x�xˆxÙØ˜aœ‰v WˆØ—X‘X˜e•_ d§h¡h¨wÕ&7ˆUØˆŒÜ×Ò˜DŸJ™J t§z¡z×'7Ñ'7¸¿¹À4ÈeÐUZÓ[Ô\Ø�y‰y×!Ð!˜EˆØ9:¸a¼ˆt�qœ:¬¯©Õ4Õ4Ö5ÀTÈQÔQ[Ô^_×^jÑ^jÕQjÕMjÕEkˆÜ×Ò˜DŸJ™J t§z¡z§¡¸¿¹À$ÈTÓRÖSr   c           
     óN  <€ \        V P                  4      \        n        V P                  p\
        SV `  WV4       V'       db   \        P                  ! T P                  V P                  P                  V P                  VR ,          ^8X  d   RMRVR,          VR4      4       R# R# )r+  r9  r�   rQ   TN)r   rÒ   rì   rí   r;  rÛ   rƒ   r  r  r<  rÑ   r«   r§   )rC   r?  r@  r  rx   râ   s   &&&& €r   rƒ   ÚLiveBot.close7  sx   ø€ Ü˜Ÿ™“]ŒŒ
Ø�H‰HˆÜ‰‰�c Ô(ßÜ×Ò §
¡
¨4¯:©:×+;Ñ+;¸T¿X¹XØ56°uµXÀ´]©6ÈØ+,¨U­8°S¸$ó!@ö Añ r   c           
     óH  € V P                   '       d�   V P                   p\        P                  ! T P                  V P                  P
                  V P                  VR ,          ^8X  d   RMRVR,          V P                  ;'       g
    VR,          R4      4       RV n         R# R# )r+  r9  r�   rQ   r:  TN)r;  r  r  r<  rÑ   r«   r§   Ú
last_price)rC   rx   s   & r   ÚflattenÚLiveBot.flatten@  sz   € Ø�8�8ˆ8Ø—‘ˆAÜ×Ò §
¡
¨4¯:©:×+;Ñ+;¸T¿X¹XØ56°uµXÀ´]©6ÈØ+,¨U­8°T·_±_×5RÐ5RÈÈ'Í
ÐTXó!Zô [ð ˆDŽHñ r   c              ‡  óÊ   "  €  \        R V! V!  G Rj  x€L
  2RR7       R#  L  \         d2   p\        R\        T4      P                   RT 2RR7        Rp?R# Rp?ii ; i5i)z	  venue: NTrö   z  venue error: r    )r  rÉ   r  rY   )rC   ÚfnÚargsr  s   &&* r   r<  ÚLiveBot._sendH  s[   é € ð	IÜ�I¡B¨¡IŸoÐ.Ð/°t×<™oøÜô 	IÜ�O¤D¨£G×$4Ñ$4Ð#5°R¸°sÐ;À4×HÓHûð	Iüs6   ‚A#„$ “"
”$  A#¢$ ¤A ¯&AÁA#ÁA Á A#)rÔ   rØ   rÜ   rÖ   r×   rÞ   rÒ   rÓ   rÕ   rÐ   rá   rÙ   r;  rà   rÝ   r§   rß   rÑ   rÚ   )ró   ró   ró   )rY   rZ   r[   r\   rF   r‹   ré   rî   r	  r  r  r  r/  r2  r5  r   rƒ   rG  r<  r]   r^   Ú__classcell__)râ   r`   s   @@r   rÍ   rÍ   ¹   s]   ù‡ € õ6ò&òõ)ô	[õEõ*0òUòeò2&õ*õTõAò÷Iò Ir   rÍ   c           	   ƒ   óð  a"  € V P                   pR R/oV3R lp  \        VP                  VP                  .. VR7      p\        P
                  ! VP                  4       4      p \        P                  ! R4      G Rj  x€L
  SR ,          pVeA   RSR &   V P                  VP                  VP                  4      \        4       4      G Rj  x€L
  VP                  4       '       g   K„  \        R4      h Lt L)  \        P                   d    h \         d]   p\!        RTP"                   R\%        T4      P&                   R	2RR
7       \        P                  ! ^4      G Rj  x€L 
   Rp?EKT  Rp?ii ; i5i)rN   Nc                  ó$  <€ V R,          p\        V\        4      '       g   R#  \        VR,          ^ ,          R,          4      \        VR,          ^ ,          R,          4      ,           ^,          SR&   R#   \        \        \
        3 d     R# i ; i)é   NÚbidsrM   ÚasksrN   éÿÿÿÿ)Ú
isinstanceÚdictr9   ÚKeyErrorÚ
IndexErrorÚ	TypeError)rK  ÚmsgrÙ   s   * €r   Úon_bookÚfeed.<locals>.on_bookS  sr   ø€ Ø�2�hˆÜ˜#œt×$Ò$Ùð	Ü˜s 6�{¨1�~¨gÕ6Ó7¼!¸CÀ½KÈ½NÈ7Õ<SÓ:TÕTÐXYÕYˆG�D‹MøÜœ*¤iÐ0ô 	Úð	ús   ¤AA5 Á5BÂBT)rl   Úorder_book_idsÚaccount_idsÚon_order_book_updategš™™™™™É?zstream closedú  z feed dropped (z); reconnectingrö   )rÐ   r   rl   r6   r  r  Ú	run_asyncÚsleepr5  Úquantizer>   r   Údoner„   ÚCancelledErrorrÉ   r  r/   r  rY   )	ÚbotrÑ   rÐ   rZ  ÚwsÚtaskrN   r  rÙ   s	   &&      @r   r*  r*  O  s+  øé € Ø�8‰8€DØ�Tˆl€Gõð ð	#Ü §¡¸t¿z¹z¸lÐXZØ/6ô8ˆBä×&Ò& r§|¡|£~Ó6ˆDØÜ—m’m CÓ(×(Ð(Ø˜T•]�Ø’>Ø$(�G˜D‘MØŸ,™, r§{¡{°4·?±?Ó'CÄVÃXÓN×NÐNØ—9‘9—;”;Ü& Ó7Ð7ñ )ñ Oøô ×%Ñ%ô 	ØÜô 	#Ü�B�t—{‘{�m ?´4¸³7×3CÑ3CÐ2DÀOÐTÐ\`ÕaÜ—-’- Ó"×"×"Ð"ûð	#üsa   ƒE6œA"C7 Á>C3Á?AC7 ÃC5ÃC7 Ã(C7 Ã5C7 Ã7E3ÄE3ÄA
E.Å!E$Å"E.Å'E6Å.E3Å3E6c              ƒ   óä  a"  € \         '       d   \        '       g   R # R p  R^/pV'       d   WR&   R\          R2\        P                  P	                  V4      ,           o\
        P                  ! V3R l4      G R j  x€L
 p^ R IpVP                  V4      P                  R. 4       EF
  pVR,          ^,           pVP                  R/ 4      P                  R	R
4      P                  4       P                  4       pVR9   d$   \        RP                  R V  4       4      4       K|  VR9   d'   V  F  pVP                  4        K  	  \        R4       K©  VR9   g   K²  \        R4       V  F  pVP                  4        K  	  \
        P                  ! ^4      G R j  x€L
  \         P"                  ! ^ 4       EK  	  EK™   EL< L%  \$         d%    \
        P                  ! ^4      G R j  x€L 
   EKÌ  i ; i5i)NrÀ   Úoffsetr¾   z/getUpdates?c                  ób   <€ \         P                  P                  S ^R7      P                  4       # )é   r¿   )rÃ   rÇ   rÈ   Úread)rn   s   €r   Ú<lambda>Útelegram.<locals>.<lambda>z  s#   ø€ ´6·>±>×3IÑ3IÈ#ÐWYÐ3IÓ3Z×3_Ñ3_Ô3ar   ÚresultÚ	update_idÚmessager½   ró   Ú
c           	   3   ó¤   "  € T FF  pVP                    R VP                  '       g   RMR RVP                  R RVP                  R 2x € KH  	  R# 5i)r    Úflatzin traderô   ú.2fú | withdraw N)r§   r;  rÜ   rÚ   )Ú.0rŠ   s   & r   Ú	<genexpr>Útelegram.<locals>.<genexpr>€  sS   é € ð !0á*. Qð %&§E¡E 7¨"¸1¿5¿5¸5©VÀjÐ,Qð R)Ø)*¯©°3¨°|ÀAÇNÁNÐSVÐCWõ"Yã*.ùs
   ‚#A¦*Azall positions flattenedz#kill switch: flattening and exiting)z/statusÚstatus)z/flatrt  )z/stopr¹   )rÁ   rÂ   rÃ   rÄ   rÅ   r  r(  r#  Úloadsr@   r   ÚlowerrË   ÚjoinrG  ra  r   Ú_exitrÉ   )	Úbotsri  ÚqrÊ   r#  ÚupdrY  rŠ   rn   s	   &       @r   Útelegramr‚  p  s‡  øé € ß‹HŸ›ÙØ€FØ
ð	#Ø˜B�ˆAßØ$�(‘Ø0´°
¸,ÐGÌ&Ï,É,×J`ÑJ`ÐabÓJcÕcˆCÜ ×*Ò*Ô+aÓb×bˆDÛØ—z‘z $Ó'×+Ñ+¨H°b×9�Ø˜[Õ)¨AÕ-�Ø—g‘g˜i¨Ó,×0Ñ0°¸Ó<×BÑBÓD×JÑJÓL�ØÐ/Ô/Ü�t—y‘yñ !0á*.ó!0ó 0ö 1ð Ð-Ô-Û!˜ØŸ	™	žñ "äÐ0Ö1ØÐ-Ö-ÜÐ<Ô=Û!˜ØŸ	™	žñ "ä!Ÿ-š-¨Ó*×*Ð*Ü—H’H˜Q—Kô! :ò cñ" +øäô 	#Ü—-’- Ó"×"Õ"ð	#üsj   ƒG0œG0¢F> ®AF> Á=F9Á>CF> Å=F> ÆF<ÆF> Æ6G0Æ9F> Æ<F> Æ>$G-Ç"G%Ç#G-Ç(G0Ç,G-Ç-G0c              ƒ   ó¨  "  €  \         P                  ! ^4      G Rj  x€L
  \        P                  P	                  \
        4      '       g   KJ  \        RR R7       \        R4       V  F  pVP                  4        K  	  \         P                  ! ^4      G Rj  x€L
  \        P                  ! \
        4       \        P                  ! ^ 4       KË   L° L85i)TNu)   STOP file found â€” flattening everythingrö   z/kill switch (STOP file): flattening and exiting)r  ra  r   r   r   Ú	STOP_FILEr  rË   rG  Úremover~  )r  rŠ   s   & r   Úwatchdogr†  ‘  s‡   é € Ø
Ü�mŠm˜AÓ×ÐÜ�7‰7�>‰>œ)×$Ô$ÜÐ=ÀTÕJÜÐ@ÔAÛ�Ø—	‘	–ñ ä—-’- Ó"×"Ð"Ü�IŠI”iÔ Ü�HŠH�QŽKñ 	ñ #ùs(   ‚C�Cž*CÁA
CÂCÂ7CÃCc              ƒ   óž  "  €  \         P                  ! V4      G Rj  x€L
  \        R\        P                  ! \
        P                  4      R R2R R7       V  Fë  pVP                  '       g   RMgVP                  R,          ^8X  d   RMR	 R
VP                  R,           RVP                  R,           2VP                  R,          '       d   RMR,           p\        RVP                  R R
VP                   RVR RVP                   RVP                  '       d   RMR RVP                  R RVP                  R 2R R7       Kí  	  EKG   EL-5i)TNz--- rñ   z ---rö   rt  r+  r9  r�   r¢   rQ   r³   r:  Úcarriedz HELDró   r_  rò   úx | z<32z | line z | gate ÚONÚoffrô   ru  rv  )r  ra  r  r   rþ   r   rÿ   r;  r§   rÒ   r$   ÚgaterÜ   rÚ   )r  ÚeveryrŠ   r;  s   &&  r   rz  rz  ž  s  é € Ø
Ü�mŠm˜EÓ"×"Ð"Ü�”X—\’\¤(§,¡,Ó/°Ð9¸Ð>ÀdÕKÛˆAØ !§§ ‘&ØŸU™U 5�\¨QÔ.‘6°GÐ<¸A¸a¿e¹eÀE½l¸^È3ÈqÏuÉuÐU\Í~ÐN^Ð_ØŸe™e I×.Ô.‘7°Bõ8ð ô �B�q—u‘u˜R�j  !§%¡% ¨¨S°¨I°X¸a¿f¹f¸XÀXØŸVŸV˜V‘T¨Ð/¨x¸¿	¹	À#°ð G Ø !§¡¨sÐ3ð5à<@÷Bô	 ò 	#ùs   ‚E�E
žB.EÃA>Ec               ƒ   ó¨  "  € \         P                  ! 4       p V P                  R RR7       V P                  RRR7       V P                  RRRR7       V P                  RRR7       V P                  R\        R	R
7       V P                  R\        RRR7       V P	                  4       pVP
                  '       g)   VP                  '       g   \        P                  ! R4       \        4        \        VP                  '       * VP                  R7      pVP                  4       G Rj  x€L
 p\        \        VP                   4      4      \"        ,          pVP$                  '       d   \        \        VP$                  4      4      MV\        R4      ,          p\'        RVP(                   RVP*                   RVP                  '       d   RMR RVP,                  '       d   RMR RVP.                  '       d   RMR 2
RR7       VP1                  4        F  p\'        RVRR7       K  	  \2         Uu. uF2  qwV9   g   K  \5        W7,          YAP                  '       d   TMRV4      NK4  	  ppV F*  p	V	P7                  RV	P8                   R VR! R"VR! R#24       K,  	  VP                  '       d   VP,                  f   \'        R$RR7       R# V F  p	V	P;                  4       G Rj  x€L
  K  	  \<        P>                  ! . V U	u. uF  p	\A        W’4      NK  	  up	O\C        V4      N\E        V4      N\G        V4      N5!  G Rj  x€L
  R#  ELu upi  Lku up	i  L5i)%z--dryÚ
store_true)Úactionz--runz--marketz#cross the spread instead of resting)r�  Úhelpz	--mainnetz	--capitalg     ˆÃ@)r  Údefaultz
--max-lossNzBUSD loss per market per day before it stops opening (default 25%%))r  r’  r‘  zpick --dry or --run)rq   rp   z0.25z
connected z	 | chain rU   ri   Útestnetz
 | signer ÚyeszNO (dry)rq   ÚtakerTrö   r¢   ÚSTARTr‰  ru  z USDC | daily cap z | line buildingzX!! --run needs LIGHTER_API_PRIVATE_KEY + LIGHTER_ACCOUNT_INDEX (put them in lighter.env))$ÚargparseÚArgumentParserÚadd_argumentÚfloatÚ
parse_argsÚdryÚrunÚsysÚexitr'   rb   r¤   rp   r‹   r9   r:   rÜ   ÚSPLITÚmax_lossr  rn   ro   rs   rq   Úvaluesr‚   rÍ   r	  rÒ   r/  r  Úgatherr*  rz  r†  r‚  )
Úaprø   rÑ   rr   ÚperÚcapr–   Úsr  rŠ   s
             r   Úmainr¨  «  sŸ  é € Ü	×	 Ò	 Ó	"€BØ‡O�O�G L€OÔ1Ø‡O�O�G L€OÔ1Ø‡O�O�J |Ð:_€OÔ`Ø‡O�O�K¨€OÔ5Ø‡O�O�K¤e°W€OÔ=Ø‡O�O�L¤u°dØ]ð ô _à
�‰‹€AØ�E�EˆE�Q—U—U�UÜ�ŠÐ&Ô'Ü„Jä˜AŸH™Hœ¨a¯i©iÔ8€EØ—*‘*“,×€EÜ
ŒC�—	‘	‹NÓ
œeÕ
#€CØ !§
§
 
Œ!ŒC�—
‘
‹OÔ
°´a¸³iµ€CÜ	ˆJ�u—y‘y�k ¨5¯;©;¨-°sØŸ)Ÿ)˜)‰Y¨Ð3°:Ø—l—l�l‰U¨
Ð3°3À%Ç+Ç+À+±wÐSZÐ6[ð]ð õð �\‰\Ž^ˆÜˆc�1˜D×!ñ õ LSÓaÉ7ÀaÐ[`ÑV`ÔAŒG�E•H˜c¯E¯E¨E¡5°t¸SÖAÉ7€DÐaÛˆØ	�‰ˆg˜!Ÿ%™%˜  S¨ IÐ-?ÀÀC¸yÐHXÐYÖZñ à‡u‡u€u�—‘Ò%Üð *Ø15õ	7áÛˆØ�f‰f‹h�Šñ ô �.Š.ð 9±4Ó8±4¨aœ4 ž>±4Ñ8ð 9¼&À»,ð 9Ü! $›ð9Ü)1°$«ó9÷ 9ò 9ò) ùò bñ 	ùâ8ñ 9ùso   ‚CMÃ
AMÄ#MÄ$B7MÇMÇ39MÈ,MÈ9+MÉ$AMÊ(5MËM	ËMË;M
Ì+MÌ:MÌ;MÍMÍMÚ__main__z
stopped)r	   r
   r   ÚASELS)zlighter.env)é<   )2Ú__doc__r—  r  r  r   rž  r   Úurllib.parserÃ   Úurllib.requestr   r   Údecimalr   r9   r   r   rh   Úzec_renko_botrì   r   Úlighter.ws_clientr   ÚImportErrorrŸ  r‚   r=  r,  r   r„  rt   rÁ   rÂ   r   r'   r'  r,   rb   rË   ÚBotrÍ   r*  r‚  r†  rz  r¨  rY   r�  ÚKeyboardInterruptr  r   r   r   Ú<module>rµ     sD  ðñó2 Û Û 
Û 	Û 
Û Û Û ß 'ß ;Ñ ;ã Û ð(Ý$Ý*ò )€Ùˆs‹V€
ÙˆG‹€Ø€	Ø�9Š9Ð)Ó*€Ø
�)Š)Ð&Ó
'€ò#ô	4ð �Y  y°%¸ÐC€
÷Vñ V÷0JMñ JMòZôSIˆa�e‰eô SIòl#òB#òB
ô
Bò$9ðN ˆzÔðØ�Š‘D“FÖñ øðO ô (Ø‡H‚HÐ&Ö'ð(ûðT ô Ùˆk×ðús#   ¾C4 ÃD Ã4DÄDÄD&Ä%D&