+
    iV                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHtHt ^ RIt]P"                  ! ]4      t^ RIHtHt ^ RIHt ^ R	IHt ^R
IHtHtHtHtH t H!t! ^RI"H#t# ^RI$H%t%H&t& ^RI'H(t(H)t)H*t*H+t+H,t, ^RI-H.t. ^RI/H0t0 ^RI1H2t2H3t3 ^RI4H5t5 ^RI6H7t7 ^RI8H9t9 ^RI:H;t; ^RI<H=t=H>t> Rt?Rt@0 RmtA ! R R4      tBR# )zF
Kalshi API Client

Core client class for authenticated API requests.
)annotationsN)	b64encode)cached_property)Any)urlparse	urlencode)hashesserialization)padding)RSAPrivateKey)KalshiAPIErrorAuthenticationErrorInsufficientFundsErrorResourceNotFoundErrorRateLimitErrorOrderRejectedError)Event)MarketSeries)MarketModel
EventModelSeriesModel
TradeModelCandlestickResponse)DataFrameList	Portfolio)MarketStatusCandlestickPeriodFeedExchangeAPIKeys)RateLimiterProtocol)normalize_tickernormalize_tickersz-https://api.elections.kalshi.com/trade-api/v2z'https://demo-api.kalshi.co/trade-api/v2c                     ] tR t^6tRtRFR R llt]R R l4       tR R	 ltR
 R lt	R R lt
RRRRRR/R R lltR R ltR R ltRGR R lltR R ltR R ltRHR R llt]R R  l4       t]R! R" l4       t]R# R$ l4       tR% R& ltR' R( ltR)RR*RR+RR,RR-RR.^dR/RR0R/R1 R2 lltR3R/R4 R5 lltR,RR)RR.^dR/RR0R/R6 R7 lltR8R/R9 R: lltR;RR.^dR/RR0R/R< R= lltR>RR?RR@RR.^dR/RR0R/RA RB llt]P>                  3RC RD llt REt!R# )IKalshiClientzAuthenticated client for the Kalshi Trading API.

Usage:
    client = KalshiClient.from_env()  # Loads .env file
    client = KalshiClient(api_key_id="...", private_key_path="...")
NFc               8    V ^8  d   QhRRRRRRRRRRR	R
RRRR/# )   
api_key_id
str | Noneprivate_key_pathapi_basedemobooltimeoutfloatmax_retriesintrate_limiterzRateLimiterProtocol | NonereturnNone )formats   "V/home/wkmabra/.openclaw/workspace/venv/lib/python3.14/site-packages/pykalshi/client.py__annotate__KalshiClient.__annotate__>   sZ     (+ (+(+ %(+ 	(+
 (+ (+ (+ 1(+ 
(+    c                   T;'       g    \         P                  ! R4      pT;'       g    \         P                  ! R4      pV'       g   \        R4      hV'       g   \        R4      hWn        T;'       g    V'       d   \        M\
        V n        \        V P                  4      P                  V n	        WPn
        W`n        Wpn        V P                  V4      V n        \        P                   ! 4       V n        R# )aI  Initialize the Kalshi client.

Args:
    api_key_id: API key ID. Falls back to KALSHI_API_KEY_ID env var.
    private_key_path: Path to private key file. Falls back to KALSHI_PRIVATE_KEY_PATH env var.
    api_base: API base URL. Defaults to production or demo based on `demo` flag.
    demo: If True, use demo environment. Ignored if api_base is provided.
    timeout: Request timeout in seconds (default 10).
    max_retries: Max retries for transient failures (default 3). Set to 0 to disable.
    rate_limiter: Optional rate limiter for proactive throttling. See RateLimiter class.
KALSHI_API_KEY_IDKALSHI_PRIVATE_KEY_PATHzFAPI key ID required. Set KALSHI_API_KEY_ID env var or pass api_key_id.zXPrivate key path required. Set KALSHI_PRIVATE_KEY_PATH env var or pass private_key_path.N)osgetenv
ValueErrorr,   DEMO_API_BASEDEFAULT_API_BASEr/   r   path	_api_pathr2   r4   r6   _load_private_keyprivate_keyrequestsSession_session)	selfr,   r.   r/   r0   r2   r4   r6   resolved_api_key_ids	   &&&&&&&& r;   __init__KalshiClient.__init__>   s    * )JJBII6I,J+SSryy9R/S"X   j   3 QQd]@P!$--055&(112BC ((*r>   c                   V ^8  d   QhRR/# )r+   r7   z'KalshiClient'r9   )r:   s   "r;   r<   r=   i   s      > r>   c                ,    ^ RI Hp V! 4        V ! R/ VB # )z}Create client from .env file.

Loads dotenv before reading env vars. All keyword arguments
are forwarded to the constructor.
)load_dotenvr9   )dotenvrT   )clskwargsrT   s   &, r;   from_envKalshiClient.from_envh   s     	'}V}r>   c                    V ^8  d   QhRRRR/# )r+   key_pathstrr7   r   r9   )r:   s   "r;   r<   r=   s   s      # - r>   c                &   \        VR4      ;_uu_ 4       p\        P                  ! VP                  4       RR7      p\	        V\
        4      '       g"   \        R\        V4      P                   24      hVuuRRR4       #   + '       g   i     R# ; i)z#Load RSA private key from PEM file.rbN)passwordzExpected RSA private key, got )	openr	   load_pem_private_keyread
isinstancer   	TypeErrortype__name__)rN   r[   fkeys   &&  r;   rI   KalshiClient._load_private_keys   sf    (D!!Q44QVVXMCc=11"@cASAS@T UVV	 "!!!s   AA??B	c               $    V ^8  d   QhRRRRRR/# )r+   methodr\   rG   r7   ztuple[str, str]r9   )r:   s   "r;   r<   r=   {   s!     8 8C 8s 8 8r>   c           	        \        \        \        P                  ! 4       R,          4      4      pV V V 2pV P                  P	                  VP                  4       \        P                  ! \        P                  ! \        P                  ! 4       4      \        P                  P                  R7      \        P                  ! 4       4      pV\        V4      P                  4       3# )z)Create RSA-PSS signature for API request.i  )mgfsalt_length)r\   r5   timerJ   signencoder
   PSSMGF1r   SHA256
MAX_LENGTHr   decode)rN   rk   rG   	timestampmessage	signatures   &&&   r;   _sign_requestKalshiClient._sign_request{   s    DIIK$./0	Kxv.$$))NNKKLL1w{{?U?U MMO
	 )I.55777r>   c               $    V ^8  d   QhRRRRRR/# )r+   rk   r\   endpointr7   zdict[str, str]r9   )r:   s   "r;   r<   r=      s!     

 

3 

# 

. 

r>   c                    \        V4      P                  pV P                   V 2pV P                  W4      w  rVRRRV P                  RVRV/# )zGenerate authenticated headers.zContent-Typezapplication/jsonzKALSHI-ACCESS-KEYzKALSHI-ACCESS-SIGNATUREzKALSHI-ACCESS-TIMESTAMP)r   rG   rH   rz   r,   )rN   rk   r}   path_without_query	full_pathrw   ry   s   &&&    r;   _get_headersKalshiClient._get_headers   s^    %h/44~~&'9&:;	#11&D	.%y%y	
 	
r>   rk   r}   request_bodyc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r+   responserequests.Responserk   r-   r}   r   zdict[str, Any] | Noner7   dict[str, Any]r9   )r:   s   "r;   r<   r=      sC     F F#F 	F
 F ,F 
Fr>   c          
        VP                   pVR8  dB   \        P                  RV4       V^8X  g   VP                  '       g   / # VP	                  4       # \        P                  RWQP                  4       Rp VP	                  4       pTpVP                  R4      ;'       g    VP                  RR4      pVP                  R4      ;'       g    VP                  R	4      p	VR9   d   \        WXV	W#WFR
7      hVR8X  d   \        WXV	W#WFR
7      hV	R9   d   \        WXV	W#WFR
7      hV	R9   d   \        WXV	W#WFR
7      h\!        WXV	W#WFR
7      h  \        \        P                  P                  3 d    TP                  pTP                  pRp	 Li ; i)zBHandle API response and raise custom exceptions with full context.i  zResponse %s: SuccesszResponse %s: Error body: %sNrx   error_messagezUnknown Errorcode
error_code)rk   r}   r   response_bodyi  )i  i  )insufficient_fundsinsufficient_balance)order_rejectedmarket_closedmarket_settledinvalid_price
self_tradepost_only_rejected)status_codeloggerdebugcontentjsonerrortextgetrD   rK   
exceptionsJSONDecodeErrorr   r   r   r   r   )
rN   r   rk   r}   r   r   r   
error_datarx   r   s
   &&$$$     r;   _handle_responseKalshiClient._handle_response   s    **LL/=c!)9)9)9	==?"2KO 6:
	!J&M nnY/  :>>4G >>&)IIZ^^L-ID *$%d) 
 C'd) 
 CC(d) 
  
 
 %d)  !d) M H//??@ 	mmG$MMMD	s   8)E "*E E ?FFc               $    V ^8  d   QhRRRRRR/# )r+   rk   r\   r}   r7   r   r9   )r:   s   "r;   r<   r=      s-     J JJ J
 
Jr>   c                6   V P                    V 2p\        V P                  ^,           4       EF  pV P                  e8   V P                  P	                  4       pV^ 8  d   \
        P                  RV4       V P                  W4      p V P                  P                  ! W3RVRV P                  /VB pT P                  ez   TP*                  P-                  R4      pTP*                  P-                  R4      pT P                  P/                  T'       d   \1        T4      MRT'       d   \1        T4      MRR	7       TP2                  \4        9  d   Tu # YPP                  8X  d%   TP2                  R
8X  d   \7        R
RTTR7      hTu # TP*                  P-                  R4      p T'       d   \9        T4      M\        ^T,          R,          ^4      p
\
        P!                  RYTP2                  T^,           T P                  T
4       \&        P(                  ! T
4       EK  	  X#   \        P                  P                  \        P                  P                  3 d   p	YPP                  8X  d   h \        ^T,          R,          ^4      p
\
        P!                  RY\#        T	4      P$                  T^,           T P                  T
4       \&        P(                  ! T
4        Rp	?	EK  Rp	?	ii ; i  \:        \<        3 d    \        ^T,          R,          ^4      p
 ELGi ; i)zExecute an HTTP request with timeout and retry on transient failures.

Retries on 429/5xx status codes and connection errors with exponential backoff.
Re-signs each attempt to keep the timestamp fresh.
NzRate limiter waited %.3fsheadersr2   g      ?z'%s %s failed (%s), retry %d/%d in %.1fszX-RateLimit-RemainingzX-RateLimit-Reset)	remainingreset_at  z!Rate limit exceeded after retriesrk   r}   zRetry-Afterz'%s %s returned %d, retry %d/%d in %.1fs)r/   ranger4   r6   acquirer   r   r   rM   requestr2   rK   r   TimeoutConnectionErrorminwarningre   rf   ro   sleepr   r   update_from_headersr5   r   _RETRYABLE_STATUS_CODESr   r3   rD   rd   )rN   rk   r}   rW   urlattempt	wait_timer   r   ewaitr   r   retry_afters   &&&,          r;   _requestKalshiClient._request   s    z*T--12G  , --557	q=LL!<iH''9G==00)0:>,,JP&   ,$,,001HI	#++//0CD!!5509c)nt.6S]D 6 
 ##+BB***''3.(;%!)	   "**..}=K3-8u[)c!w,QTBTVX>Y NN9("6"6!T--t
 JJtw 3z a ##++##33  ...1<#-r2=d1g&6&6aK!1!14
 

4 N 	* 31<#-r23s1   +H"#K)+%K)"9K&A?K!!K&)+LLc                    V ^8  d   QhRRRR/# )r+   r}   r\   r7   r   r9   )r:   s   "r;   r<   r=   )  s     P PC PN Pr>   c                z    \         P                  RV4       V P                  RV4      pV P                  VRVR7      # )zMake authenticated GET request.zGET %sGETr   )r   r   r   r   )rN   r}   r   s   && r;   r   KalshiClient.get)  s8    Xx(==1$$Xeh$OOr>   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r+   rG   r\   response_keyparamsr   	fetch_allr1   r7   z
list[dict]r9   )r:   s   "r;   r<   r=   /  s<        	
  
r>   c                j   \        V4      p. p VP                  4        UUu/ uF  w  rgVf   K  WgbK  	  pppV'       d   V R\        V4       2MTp	V P                  V	4      p
VP	                  V
P                  V. 4      4       V
P                  RR4      pV'       d	   V'       g    V# WR&   K  u uppi )a%  Fetch items with automatic cursor-based pagination.

Args:
    path: API endpoint path (e.g., "/markets").
    response_key: Key in response JSON containing the items list.
    params: Query parameters (None values are filtered out).
    fetch_all: If True, follow cursors to fetch all pages.
?cursor )dictitemsr   r   extend)rN   rG   r   r   r   	all_itemskvfilteredr}   r   r   s   &&&&&       r;   paginated_getKalshiClient.paginated_get/  s     f "	)/I1HI:B$q8!4 56Hxx)HX\\,;<\\(B/FF  &8 Js
   B/B/c               $    V ^8  d   QhRRRRRR/# r+   r}   r\   datar   r7   r9   )r:   s   "r;   r<   r=   K  s!     
 
S 
 
> 
r>   c                    \         P                  RV4       \        P                  ! VRR7      pV P	                  RWR7      pV P                  VRWR7      # )z Make authenticated POST request.zPOST %s
separatorsPOSTr   rk   r}   r   ,:r   r   r   dumpsr   r   rN   r}   r   bodyr   s   &&&  r;   postKalshiClient.postK  sQ    Y)zz$:6====$$Vh % 
 	
r>   c               $    V ^8  d   QhRRRRRR/# r   r9   )r:   s   "r;   r<   r=   T  s!     
 
C 
~ 
. 
r>   c                    \         P                  RV4       \        P                  ! VRR7      pV P	                  RWR7      pV P                  VRWR7      # )zMake authenticated PUT request.zPUT %sr   PUTr   r   r   r   r   s   &&&  r;   putKalshiClient.putT  sQ    Xx(zz$:6===<$$UX % 
 	
r>   c               $    V ^8  d   QhRRRRRR/# )r+   r}   r\   r   zdict | Noner7   r   r9   )r:   s   "r;   r<   r=   ]  s&     S Ss S+ S Sr>   c                    \         P                  RV4       V'       d-   \        P                  ! VRR7      pV P	                  RWR7      pMV P	                  RV4      pV P                  VRVR7      # )z"Make authenticated DELETE request.z	DELETE %sr   DELETEr   r   r   r   )rN   r}   r   r   r   s   &&&  r;   deleteKalshiClient.delete]  s]    [(+::dz:D}}Xx}CH}}Xx8H$$Xh$RRr>   c                   V ^8  d   QhRR/# )r+   r7   r   r9   )r:   s   "r;   r<   r=   j  s      9 r>   c                    \        V 4      # )z#The authenticated user's portfolio.r   rN   s   &r;   	portfolioKalshiClient.portfolioi  s     r>   c                   V ^8  d   QhRR/# )r+   r7   r"   r9   )r:   s   "r;   r<   r=   o  s      ( r>   c                    \        V 4      # )z-Exchange status, schedule, and announcements.r!   r   s   &r;   exchangeKalshiClient.exchangen  s     ~r>   c                   V ^8  d   QhRR/# )r+   r7   r$   r9   )r:   s   "r;   r<   r=   t  s      ' r>   c                    \        V 4      # )z#API key management and rate limits.r#   r   s   &r;   api_keysKalshiClient.api_keyss  s     t}r>   c                   V ^8  d   QhRR/# )r+   r7   r    r9   )r:   s   "r;   r<   r=   x  s      d r>   c                    \        V 4      # )a  Create a new real-time data feed.

Returns a Feed instance for streaming market data via WebSocket.
Each call creates a new Feed - use a single Feed for all subscriptions.

Usage:
    feed = client.feed()

    @feed.on("ticker")
    def handle_ticker(msg):
        print(f"{msg.market_ticker}: {msg.yes_bid}/{msg.yes_ask}")

    feed.subscribe("ticker", market_ticker="KXBTC-26JAN")
    feed.start()
r   r   s   &r;   feedKalshiClient.feedx  s      Dzr>   c                    V ^8  d   QhRRRR/# )r+   tickerr\   r7   r   r9   )r:   s   "r;   r<   r=     s     # # # #r>   c                    V P                  RVP                  4        24      p\        P                  ! VR,          4      p\	        W4      # )zGet a Market by ticker.z	/markets/market)r   upperr   model_validater   )rN   r   r   models   &&  r;   
get_marketKalshiClient.get_market  s>    88i'789**8H+=>d""r>   status
mve_filtertickersseries_tickerevent_tickerlimitr   r   c               <    V ^8  d   QhRRRRRRRRRRR	R
RRRRRR/	# )r+   r  MarketStatus | Noner  r-   r  zlist[str] | Noner	  r
  r  r5   r   r   r1   r7   zDataFrameList[Market]r9   )r:   s   "r;   r<   r=     sq     'X 'X $'X 	'X
 "'X "'X !'X 'X 'X 'X 
'Xr>   c                  a  RVe   VP                   MRRTRV'       d   RP                  \        V4      4      MRR\        V4      R\        V4      RVR	V/V	Cp
S P	                  R
RW4      p\        V 3R lV 4       4      # )a  Search for markets.

Args:
    status: Filter by market status (open, closed, settled, etc.).
    mve_filter: Filter multivariate/combo markets. "exclude" hides combos,
               "only" returns only combos.
    tickers: List of specific market tickers to fetch.
    series_ticker: Filter by series ticker.
    event_ticker: Filter by event ticker (supports comma-separated, max 10).
    limit: Maximum results per page (default 100, max 1000).
    cursor: Pagination cursor for fetching next page.
    fetch_all: If True, automatically fetch all pages.
    **extra_params: Additional API parameters (min_close_ts, max_created_ts, etc.).
                   See https://docs.kalshi.com/api-reference/market/get-markets
r  Nr  r  r   r	  r
  r  r   z/marketsmarketsc              3  d   <"   T F%  p\        S\        P                  ! V4      4      x  K'  	  R # 5iN)r   r   r  ).0mrN   s   & r;   	<genexpr>+KalshiClient.get_markets.<locals>.<genexpr>  (     WRVQVD+*D*DQ*GHHRV   -0)valuejoinr'   r&   r   r   )rN   r  r  r  r	  r
  r  r   r   extra_paramsr   r   s   f$$$$$$$$,  r;   get_marketsKalshiClient.get_markets  s    : f&8flld*wsxx 1' :;D-m<,\:Uf	
 	
 !!*iKWRVWWWr>   with_nested_marketsc               $    V ^8  d   QhRRRRRR/# )r+   r
  r\   r  r1   r7   r   r9   )r:   s   "r;   r<   r=     s(     " "" "	"
 
"r>   c                   / pV'       d   RVR&   RVP                  4        2pV'       d   VR\        V4      ,           ,          pV P                  V4      p\        P                  ! VR,          4      p\        W4      # )zGet an Event by ticker.

Args:
    event_ticker: The event ticker.
    with_nested_markets: If True, include markets nested in the event object.
truer  z/events/r   event)r  r   r   r   r  r   )rN   r
  r  r   r}   r   r  s   &&$    r;   	get_eventKalshiClient.get_event  sr     ,2F()l00234i///H88H%))(7*;<T!!r>   c               0    V ^8  d   QhRRRRRRRRRR	R
R/# )r+   r	  r-   r  r  r  r5   r   r   r1   r7   zDataFrameList[Event]r9   )r:   s   "r;   r<   r=     sP     V V "V $	V
 V V V 
Vr>   c                  a  RTR\        V4      RVe   VP                  MRRV/VCpS P                  RRWu4      p\        V 3R lV 4       4      # )	a9  Search for events.

Args:
    series_ticker: Filter by series ticker.
    status: Filter by event status.
    limit: Maximum results per page (default 100).
    cursor: Pagination cursor for fetching next page.
    fetch_all: If True, automatically fetch all pages.
    **extra_params: Additional API parameters.
r  r	  r  Nr   z/eventseventsc              3  d   <"   T F%  p\        S\        P                  ! V4      4      x  K'  	  R # 5ir  )r   r   r  )r  r   rN   s   & r;   r  *KalshiClient.get_events.<locals>.<genexpr>  s(     UPT1U4)B)B1)EFFPTr  )r&   r  r   r   )	rN   r	  r  r  r   r   r  r   r   s	   f$$$$$,  r;   
get_eventsKalshiClient.get_events  sc    * U-m<f&8flldf	

 
 !!)XvIUPTUUUr>   include_volumec               $    V ^8  d   QhRRRRRR/# )r+   r	  r\   r+  r1   r7   r   r9   )r:   s   "r;   r<   r=     s(     # ## 	#
 
#r>   c                   / pV'       d   RVR&   RVP                  4        2pV'       d   VR\        V4      ,           ,          pV P                  V4      p\        P                  ! VR,          4      p\        W4      # )zGet a Series by ticker.

Args:
    series_ticker: The series ticker.
    include_volume: If True, include total volume traded across all events.
r   r+  z/series/r   series)r  r   r   r   r  r   )rN   r	  r+  r   r}   r   r  s   &&$    r;   
get_seriesKalshiClient.get_series  sr     '-F#$m11345i///H88H%**8H+=>d""r>   categoryc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r+   r1  r-   r  r5   r   r   r1   r7   zDataFrameList[Series]r9   )r:   s   "r;   r<   r=     sE     X X X 	X
 X X 
Xr>   c               h   a  RVRVRV/VCpS P                  RRWd4      p\        V 3R lV 4       4      # )a	  List all series.

Args:
    category: Filter by category.
    limit: Maximum results per page (default 100).
    cursor: Pagination cursor for fetching next page.
    fetch_all: If True, automatically fetch all pages.
    **extra_params: Additional API parameters.
r  r1  r   z/seriesr.  c              3  d   <"   T F%  p\        S\        P                  ! V4      4      x  K'  	  R # 5ir  )r   r   r  )r  srN   s   & r;   r  .KalshiClient.get_all_series.<locals>.<genexpr>  r  r  )r   r   )rN   r1  r  r   r   r  r   r   s   f$$$$,  r;   get_all_seriesKalshiClient.get_all_series  sB    $ 5*h&YLY!!)XvIWRVWWWr>   r   min_tsmax_tsc               4    V ^8  d   QhRRRRRRRRRRR	R
RR/# )r+   r   r-   r9  z
int | Noner:  r  r5   r   r   r1   r7   zDataFrameList[TradeModel]r9   )r:   s   "r;   r<   r=     s[     I I I 	I
 I I I I 
#Ir>   c          
     z    RVR\        V4      RVRVRV/VCpV P                  RRW4      p	\        R V	 4       4      # )	ap  Get public trade history.

Args:
    ticker: Filter by market ticker.
    min_ts: Minimum timestamp (Unix seconds).
    max_ts: Maximum timestamp (Unix seconds).
    limit: Maximum trades per page (default 100).
    cursor: Pagination cursor for fetching next page.
    fetch_all: If True, automatically fetch all pages.
    **extra_params: Additional API parameters.
r  r   r9  r:  r   z/markets/tradestradesc              3  N   "   T F  p\         P                  ! V4      x  K  	  R # 5ir  )r   r  )r  ts   & r;   r  *KalshiClient.get_trades.<locals>.<genexpr>8  s     H4aZ66q994s   #%)r&   r   r   )
rN   r   r9  r:  r  r   r   r  r   r   s
   &$$$$$$,  r;   
get_tradesKalshiClient.get_trades  s\    . U&v.fff
 
 !!"3XvQH4HHHr>   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r+   r  z	list[str]start_tsr5   end_tsperiodr   r7   zdict[str, CandlestickResponse]r9   )r:   s   "r;   r<   r=   :  s<     
 

 
 	

 "
 
(
r>   c           
        \        RRP                  \        V4      4      RVRVRVP                  /4      pV P	                  RV 24      pVP	                  R. 4       Uu/ uF!  pVR,          \
        P                  ! V4      bK#  	  up# u upi )	aN  Batch fetch candlesticks for multiple markets (up to 100 tickers).

Args:
    tickers: List of market tickers (max 100).
    start_ts: Start timestamp (Unix seconds).
    end_ts: End timestamp (Unix seconds).
    period: Candlestick period (ONE_MINUTE, ONE_HOUR, or ONE_DAY).

Returns:
    Dict mapping ticker to CandlestickResponse.
market_tickersr   rD  rE  period_intervalz/markets/candlesticks?r  market_ticker)r   r  r'   r  r   r   r  )rN   r  rD  rE  rF  queryr   items   &&&&&   r;   get_candlesticks_batch#KalshiClient.get_candlesticks_batch:  s    $ chh'8'ABfv||	
  884UG<= !Y3
3 !#6#E#Ed#KK3
 	
 
s   'B)rH   rM   r/   r,   r4   rJ   r6   r2   )NNNFg      $@   N)Fr  )"rf   
__module____qualname____firstlineno____doc__rP   classmethodrX   rI   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r)  r/  r7  rA  r   ONE_HOURrM  __static_attributes__r9   r>   r;   r)   r)   6   s
   (+T  8

F "	F
  $F /3FPJXP8

S      $#'X '+'X "&	'X
 %)'X %)'X $('X 'X "'X  'XR" %*	",V %)V '+	V
 V "V  V<#  %	#,X  $X 	X
 "X  X,I "I "	I
 "I I "I  IL %6$>$>
 
r>   r)   >   r           )CrS  
__future__r   rB   ro   r   loggingbase64r   	functoolsr   typingr   urllib.parser   r   rK   	getLoggerrf   r   cryptography.hazmat.primitivesr   r	   )cryptography.hazmat.primitives.asymmetricr
   -cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   r   r   r   r&  r   r  r   r   modelsr   r   r   r   r   	dataframer   r   r   enumsr   r   r   r    r   r"   r   r$   r6   r%   _utilsr&   r'   rF   rE   r   r)   r9   r>   r;   <module>ri     s    # 	     %  , 			8	$ @ = G   # Y Y $   2    - 7 C 93 `
 `
r>   