
    E#i                         S SK rS SKJrJr  S SKrS SKJrJrJ	r	J
r
JrJrJrJrJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr   " S
 S\R:                  R<                  5      rg)    N)
ArrayCacheArrayCacheBySymbolById)AnyBalancesBoolIntOrder	OrderBookPositionStrStringsTickerTickersTrade)Client)List)ExchangeError)AuthenticationError)ArgumentsRequired)Precisec            
         ^  \ rS rSrS\4U 4S jjr0 4S jrS0 4S\\   S\	S\
4S jjr0 4S	\S\\   4S
 jjr0 4S	\S\4S jjr0 4S\S\4S jjrS0 4S\S\4S jjrS0 4S\S\4S jjrSS0 4S\S\	S\	S\\   4S jjrSS0 4S\\   S\	S\	S\\   4S jjrS0 4S\S\	S\
4S jjrSSS0 4S\S\	S\	S\\   4S jjrS rS4S jrSSS0 4S\S\	S\	S\\   4S jjrSSS0 4S\S\	S\	S\\   4S jjr0 4S\ 4S jjr!S\"4S jr#S4S jr$S4S jr%S\"4S jr&S\"4S  jr'S4S! jr(S\"4S" jr)S\"4S# jr*S4S$ jr+S\"4S% jr,S\"4S& jr-S\"4S' jr.S\"4S( jr/S4S) jr0SS0 4S*\S+\S\4S, jjr1S5S-\S.\S\4S/ jjr2S\"S\34S0 jr4S1 r5S\"4S2 jr6S3r7U =r8$ )6krakenfutures   returnc                    > U R                  [        [        U ]  5       0 SS_SS_SS_SS_SS_SS_S	S_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SSSSSS.ESS0SS0S.SSSSSSS 0S.SS0S.5      $ )NwsTcancelAllOrdersWsFcancelOrdersWscancelOrderWscreateOrderWseditOrderWsfetchBalanceWsfetchOpenOrdersWsfetchOrderWsfetchTradesWs
watchOHLCVwatchOrderBookwatchOrderBookForSymbolswatchTickerwatchTickerswatchBidsAskswatchTrades)watchTradesForSymbolswatchBalancewatchOrderswatchMyTradeswatchPositionszwss://futures.kraken.com/ws/v1z#wss://demo-futures.kraken.com/ws/v1)apitest  d   type)tradesLimitordersLimit
OHLCVLimitconnectionLimitrequestLimitfetchBalance	keepAlivei0u  )hasurlsoptions	streaming)deep_extendsuperr   describe)self	__class__s    P/home/james-whalen/.local/lib/python3.13/site-packages/ccxt/pro/krakenfutures.pyrD   krakenfutures.describe   sW   mT C Ed#U !%  	
   u !% $U    e !$ +D t    !" t#$ *. $#!%"&/6 : ?	  $#"#& #D!	 UY/H
 / /	    c                 P  #    U R                  5         U R                  S   S   nSnU R                  U5      nUR                  U5      nU R	                  UR
                  U5      nUc2  SU R                  S.nU R                  Xq5      nU R                  X#X5        UI Sh  vN $  N7f)z
@ignore
       authenticates the user to access private web socket channels

       https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge

       :returns dict: response from exchange
       r2   r   	challengeN)eventapi_key)	check_required_credentialsr?   clientreusableFuture
safe_valuesubscriptionsapiKeyextendwatch)	rE   paramsurlmessageHashrO   futureauthenticatedrequestmessages	            rG   authenticatekrakenfutures.authenticateF   s      	'')
 iit$!S!&&{3(<(<kJ $;;G kk'2GJJs>||s   BB&B$ B&Nsymbolslimitc                 l   #    U R                  SSUSU0U5      I Sh  vN nUR                  5       $  N7f)a  
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge

:param str[] symbols: unified array of symbols
:param int [limit]: the maximum amount of order book entries to return
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
	orderbookbookr`   N)watch_multi_helperr`   )rE   r_   r`   rV   rb   s        rG   watch_order_book_for_symbols*krakenfutures.watch_order_book_for_symbolsb   s=      11+vwQXZ_P`bhii	   js   424namec                   #    U R                  5       I Sh  vN   U R                  S   S   nSUS.n/ nUnUc  / n[        S[        U5      5       H'  nX(   n	UR	                  U R                  U	5      5        M)     [        U5      n
U
S:X  a  U R                  US   5      nUS-   US	   -   nXeS
'   U R                  XS5      nU R                  XGX5      I Sh  vN $  N N7f)a  
@ignore
       Connects to a websocket channel
       :param str name: name of the channel
       :param str[] symbols: CCXT market symbols
       :param dict [params]: extra parameters specific to the krakenfutures api
       :returns dict: data from the websocket stream
       Nr2   r   	subscribe)rL   feedr      :symbolproduct_ids)	load_marketsr?   rangelenappend	market_idmarketrT   rU   )rE   rg   r_   rV   rW   ri   	marketIdsrX   irm   lengthrt   r[   s                rG   subscribe_publickrakenfutures.subscribe_publicp   s      !!!iit$ 
	 	?Gq#g,'AZFT^^F34 ( WQ;[[1.F%+fX.>>K#,- ++i0ZZ'GGG' 	"& Hs"   CCB>CCCCrX   c                 H  #    U R                  5       I Sh  vN   U R                  5       I Sh  vN   U R                  S   S   nSUU R                  U R                  S   U R                  S   S.nU R                  XS5      nU R                  XBXb5      I Sh  vN $  N No N7f)a)  
@ignore
       Connects to a websocket channel
       :param str name: name of the channel
       :param str messageHash: unique identifier for the message
       :param dict [params]: extra parameters specific to the krakenfutures api
       :returns dict: data from the websocket stream
       Nr2   r   ri   rK   signedChallenge)rL   rj   rM   original_challengesigned_challenge)ro   r]   r?   rS   r@   rT   rU   )rE   rg   rX   rV   rW   ri   r[   s          rG   subscribe_privatekrakenfutures.subscribe_private   s      !!!!!!iit$ {{"&,,{"; $-> ?
	 ++i0ZZ'GGG 	"! Hs2   B"BB"BA(B"B B"B" B"rm   c                    #    U R                  5       I Sh  vN   U R                  U5      nU R                  U/U5      I Sh  vN nX1   $  N4 N
7f)a  
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market

https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker

:param str symbol: unified symbol of the market to fetch the ticker for
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
N)ro   rm   watch_tickers)rE   rm   rV   tickerss       rG   watch_tickerkrakenfutures.watch_ticker   sN      !!!V$**F8V<< 	"<s!   AA+AA	AAc                   #    U R                  5       I Sh  vN   U R                  USS5      nU R                  SSUSU5      I Sh  vN nU R                  (       a  0 nX4US   '   U$ U R	                  U R
                  SU5      $  Nm N?7f)a  
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market

https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker

:param str[] symbols: unified symbols of the markets to fetch the ticker for
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
NFtickerrm   )ro   market_symbolsrd   
newUpdatesfilter_by_arrayr   rE   r_   rV   r   results        rG   r   krakenfutures.watch_tickers   s      !!!%%gtU;..x7DRXYY??F'-6(#$M##DLL(GDD 	"Ys!   BB/BB>BBc                    #    U R                  SSUSU5      I Sh  vN nU R                  (       a  0 nX4US   '   U$ U R                  U R                  SU5      $  N=7f)aY  

https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker-lite

watches best bid & ask for symbols
:param str[] symbols: unified symbol of the market to fetch the ticker for
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
bidaskticker_liteNrm   )rd   r   r   bidsasksr   s        rG   watch_bids_askskrakenfutures.watch_bids_asks   sa      ..xQUW]^^??F'-6(#$M##DMM8WEE _s   AA>Asincec                 F   #    U R                  U/X#U5      I Sh  vN $  N7f)a  
get the list of most recent trades for a particular symbol

https://docs.futures.kraken.com/#websocket-api-public-feeds-trade

:param str symbol: unified symbol of the market to fetch trades for
:param int [since]: timestamp in ms of the earliest trade to fetch
:param int [limit]: the maximum amount of trades to fetch
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
N)watch_trades_for_symbols)rE   rm   r   r`   rV   s        rG   watch_tradeskrakenfutures.watch_trades   s$      22F8U6RRRRs   !!c                    #    U R                  SSUSU5      I Sh  vN nU R                  (       a5  U R                  US5      nU R                  US5      nUR	                  Xs5      nU R                  XRUSS5      $  N^7f)a  

https://docs.futures.kraken.com/#websocket-api-public-feeds-trade

get the list of most recent trades for a list of symbols
:param str[] symbols: unified symbol of the market to fetch trades for
:param int [since]: timestamp in ms of the earliest trade to fetch
:param int [limit]: the maximum amount of trades to fetch
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
tradeNr   rm   	timestampT)rd   r   	safe_listsafe_stringgetLimitfilter_by_since_limit)rE   r_   r   r`   rV   tradesfirsttradeSymbols           rG   r   &krakenfutures.watch_trades_for_symbols   sw      ..w$PVWW??NN61-E**5(;KOOK7E))&TRR Xs   A<A:AA<c                 D   #    U R                  U/X#5      I Sh  vN $  N7f)a  
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

https://docs.futures.kraken.com/#websocket-api-public-feeds-book

:param str symbol: unified symbol of the market to fetch the order book for
:param int [limit]: not used by krakenfutures watchOrderBook
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
N)re   )rE   rm   r`   rV   s       rG   watch_order_bookkrakenfutures.watch_order_book   s"      66xOOOOs     c                 \  #    U R                  5       I Sh  vN   SnU R                  U5      nU R                  U5      (       d  SSR                  U5      -   nSU-   nU R	                  SXT5      I Sh  vN nU R
                  (       a  U$ U R                  U R                  XUS5      $  N N77f)a  

       https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions

       watch all open positions
       :param str[]|None symbols: list of unified market symbols
@param since
@param limit
       :param dict params: extra parameters specific to the exchange API endpoint
       :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
       N ::,	positionsopen_positionsT)ro   r   is_emptyjoinr~   r   filter_by_symbols_since_limitr   )rE   r_   r   r`   rV   rX   newPositionss          rG   watch_positionskrakenfutures.watch_positions  s      !!!%%g.}}W%%'!22K!K/!334DkZZ??11$..'RWY]^^ 	" [s"   B,B(AB,2B*36B,*B,c                    U R                   c  [        5       U l         U R                   nU R                  US/ 5      n/ n[        S[	        U5      5       Hd  nXF   nU R                  U5      nU R                  US5      n	XS'   U R                  U	5      US'   UR                  U5        UR                  U5        Mf     U R                  US5      n
[        S[	        U
5      5       Hk  nX   nUR                  S5      nUS   nUR                  S5      nU R                  US	US
5      nU R                  U5      (       a  MZ  UR                  X5        Mm     UR                  US5        g )Nr   r   r   datetimezpositions::r   rk   r   rm   F)r   r   rQ   rp   rq   parse_ws_positionsafe_integeriso8601rr   find_message_hashessplitr   r   resolve)rE   rO   r\   cacherawPositionsr   rv   rawPositionpositionr   messageHashesrX   partssymbolsStringr_   r   s                   rG   handle_positionskrakenfutures.handle_positions  sH   6 >>!35DNwR@q#l+,A&/K--k:H))';?I$-[!#'<<	#:HZ )LL" - 00Gq#m,-A'*K%%d+E!!HM#))#.G,,\8WeTI==++y6 . 	|[1rI   c                 ^   U R                  US5      nSnU R                  US5      nUS:  a  SOSnU R                  0 SU_SS _S	U R                  U5      _S
S _SS _SU R                  US5      _SU R                  US5      _SU R                  US5      _SU R                  US5      _SU R	                  [
        R                  " U R                  U5      5      5      _SS _SU R                  US5      _SU_SU_SS _SS _SU R                  US5      _S S U R                  US5      S S S S.E5      $ ) N
instrumentbothbalancer   longshortinfoidrm   notional
marginModeliquidationPriceliquidation_threshold
entryPriceentry_priceunrealizedPnlpnl
percentagereturn_on_equity	contractscontractSize	markPrice
mark_pricesidehedgedr   r   maintenanceMarginmaintenance_margininitial_margin)maintenanceMarginPercentage
collateralinitialMargininitialMarginPercentageleveragemarginRatio)r   safe_numbersafe_positionsafe_symbolparse_numberr   
string_absnumber_to_string)rE   r   rt   marketIdr   r   r   s          rG   r   krakenfutures.parse_ws_positionO  s   & ##Hl;""8Y7!A+vG!! #
H#
$#
 d&&x0#
 	#

 $#
  0 0;R S#
 $**8]C#
 T--h>#
 $**85GH#
 **7+=+=d>S>ST[>\+]^#
 D#
 ))(LA#
 D#
 f#
 #
  !#
"  !1!1(<P!Q##
$ ,0!--h8HI'+/#
  	rI   c                 (  #    U R                  5       I Sh  vN   SnSnUb  U R                  U5      nUSUS   -   -  nU R                  XVU5      I Sh  vN nU R                  (       a  UR	                  X5      nU R                  XUSS5      $  Nw N<7f)a+  
watches information on multiple orders made by the user

https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders-verbose

:param str symbol: not used by krakenfutures watchOrders
:param int [since]: not used by krakenfutures watchOrders
:param int [limit]: not used by krakenfutures watchOrders
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
Nopen_ordersordersrl   rm   r   Tro   rt   r~   r   r   r   )	rE   rm   r   r`   rV   rg   rX   rt   r   s	            rG   watch_orderskrakenfutures.watch_orders  s      !!![[(F3!111K--dHH??OOF2E))&TRR 	" I!   BB<BB;BBc                 (  #    U R                  5       I Sh  vN   SnSnUb  U R                  U5      nUSUS   -   -  nU R                  XVU5      I Sh  vN nU R                  (       a  UR	                  X5      nU R                  XUSS5      $  Nw N<7f)a  
watches information on multiple trades made by the user

https://docs.futures.kraken.com/#websocket-api-private-feeds-fills

:param str symbol: unified market symbol of the market orders were made in
:param int [since]: the earliest time in ms to fetch orders for
:param int [limit]: the maximum number of order structures to retrieve
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
NfillsmyTradesrl   rm   r   Tr   )	rE   rm   r   r`   rV   rg   rX   rt   r   s	            rG   watch_my_tradeskrakenfutures.watch_my_trades  s      !!! [[(F3!111K--dHH??OOF2E))&TRR 	" Ir   c                 
  #    U R                  5       I Sh  vN   SnUnSnU R                  USS5      u  pAUb,  US:w  a  US:w  a  [        U R                  S-   5      eUSU-   -  nU R	                  X#U5      I Sh  vN $  Nh N7f)	a  
watches information on the user's account balance

https://docs.futures.kraken.com/#websocket-api-private-feeds-balances

:param dict [params]: extra parameters specific to the exchange API endpoint
:param str [params.account]: can be either 'futures' or 'flex_futures'
:returns dict} a object of wallet types each with a balance structure {@link https://docs.ccxt.com/#/?id=balance-structure:
Nbalancesr.   accountfuturesflex_futuresz@ watchBalance account must be either 'futures' or 'flex_futures'rl   )ro   handle_option_and_paramsr   r   r~   )rE   rV   rg   rX   r   s        rG   watch_balancekrakenfutures.watch_balance  s      !!!77PYZ)#>(A'2x(xyy3=(K++DvFFF 	" Gs"   BA?A#B:B;BBrO   c                    U R                  US5      nU R                  US5      nUGb$  U R                  U5      nUS   nU R                  SS U5      nU R                  U R                  U5      c5  U R                  U R                  SS5      n[        U5      U R                  U'   U R                  U   n	US:X  a`  U R                  US/ 5      n
[        U
5      n[        S	U5       H1  nUS
-
  U-
  nX   nU R                  U5      nU	R                  U5        M3     O"U R                  U5      nU	R                  U5        UR                  X5        g g )Nrj   
product_idrm   r   r7   r4   trade_snapshotr   r   rk   )r   rt   get_message_hashr   r   r   r@   r   rq   rp   parse_ws_traderr   r   )rE   rO   r\   channelr   rt   rm   rX   r7   tradesArrayr   rw   rv   indexitemr   s                   rG   handle_tradekrakenfutures.handle_trade  sA   J ""7F3##G\:[[*FH%F//vFK~~dkk62:"//mTR&0&=F#++f-K**2>Vq&)A"QJNE!=D //5E&&u-	 * ++G4""5)NN;4'  rI   c                    U R                  US5      nU R                  X25      nU R                  US5      nU R                  UU R                  US5      U R                  US5      UU R	                  U5      S U R                  US5      U R                  US5      SU R                  US5      U R                  US	5      S S S S S
.S.U5      $ )Nr  timeuidrm   r6   r   takerpriceqtyratecostcurrencyr   r   rm   r   r   orderr6   r   takerOrMakerr  amountr  fee)r   safe_marketr   
safe_trader   )rE   r   rt   r   r   s        rG   r  krakenfutures.parse_ws_trade   s     ##E<8!!(3%%eV4	""5%0&&vx8"Y/$$UF3$$UF3#%%eW5&&ue4  
$ % 	rI   c                    U R                  US5      nU R                  US5      nU R                  UU R                  US5      U R                  XB5      UU R	                  U5      U R                  US5      U R                  US5      U R                  US5      U R                  US5      U R                  US5      U R                  US	5      S S U R                  US
5      U R                  US5      S.S.U5      $ )N	tradeTimerm   tradeIdorderIdr6   r   	matchRoler  tradeAmounttradeFeefeeCurrencyr  r  )r   r   r  r   r   safe_string_lower)rE   r   rt   r   r   s        rG   parse_ws_order_trade"krakenfutures.parse_ws_order_trade%  s    : %%e[9	##E84""5)4&&x8"Y/%%eY7**5&9$$UF3 ,,UK@%%eW5&&um<((
; ,,UMB 
$ % 	rI   c                    U R                   nUc-  U R                  U R                  S5      n[        U5      nX0l         U R	                  US5      nUGb  U R                  US5      nSnU R                  U5      nU R                  US5      n	U R	                  UR                  U0 5      n
U R	                  X5      nU R                  US5      nUb  US:X  aL  U R                  U5      nUR                  U5        UR                  X75        UR                  X7S-   U-   5        U$ U R                  U5      nUS	   c  / US	'   US	   R                  U5        US
   US'   SnSnUS	   n[        S[        U5      5       HY  nUU   n[        R                  " XR!                  US   5      5      n[        R                  " UU R!                  US   5      5      nM[     [        R"                  " US5      (       a  [        R$                  " UU5      US'   XS'   US   br  U R!                  US   5      n[        R                  " UU R!                  US   5      5      US'   US   b,  [        R&                  " U R!                  US   5      U5      US'   US   c  S SU R!                  US   S   5      S.US'   US   S   bT  US   S   bK  U R!                  US   S   5      nU R!                  US   S   5      n[        R                  " UU5      US   S'   UR                  U R)                  U5      5        UR                  X7S-   U-   5        UR                  X75         U$ U R	                  US5      nU(       aq  [        S[        U5      5       HX  nUU   nUS   US   :X  d  M  U R+                  USS05      UU'   UR                  US5        UR                  USUS   -   5          U$    U$ )Nr8   r  r   r   order_idreasonedited_by_userrl   r   r   lastTradeTimestamp0r   r  r  averagefilled	remainingr  r  r  	is_cancelr   statuscanceledorders:rm   )r   r   r@   r   rQ   r   r   hashmapparse_ws_orderrr   r   r  rp   rq   r   
string_addr   	string_gt
string_div
string_sub
safe_orderrT   )rE   rO   r\   r   r`   r  r   rX   rm   r   previousOrderspreviousOrderr*  parsedr   	totalCosttotalAmountr   rv   currentTradestringOrderFilledstringOrderCoststringTradeCostisCancelcurrentOrders                            rG   handle_orderkrakenfutures.handle_orderX  s   J >%%dllMBE+E2F K1''|<H"K%%h/F&&uj9G!__V^^VRHN OONDM%%gx8F%65E+E,,U3f%v3vS'86'ABb _ ++E2 *2.0M(+h'..u56;K6H23	!&x0q#f+.A#)!9L ' 2 29>S>ST`agTh>i jI")"4"4[$BWBWXdemXnBo"pK / $$[#66/6/A/A)[/YM),(1f% *6(,(=(=mH>U(V%.5.@.@ARTXTiTijopxjyTz.{M(+$X.:5<5G5GH]H]^klt^uHv  yJ  6Kk2 '/ $ #$($9$9%,z:R$S,M%(
 "%(0<5<PVCWCc&*&;&;M%<PQW<X&YO&*&;&;E%L<P&QO3:3E3EoWf3gM%(0doom<=vS'86'ABv3  w<Hq#f+.A#)!9L#D)WZ-@@$(KK$j? %q	 vx8vy<;Q/QR / rI   c                 X   U R                  US/ 5      nU R                  U R                  S5      n[        U5      U l        0 nU R                  n[        S[        U5      5       H2  nX7   nU R                  U5      n	U	S   n
SXZ'   UR                  U	5        M4     [        U R                  5      nUS:  aw  UR                  U R                  S5        [        UR                  5       5      n[        S[        U5      5       H(  nX   n
SU
-   nUR                  U R                  U5        M*     g g )Nr   r8   r   rm   Tr4  )rQ   r   r@   r   r   rp   rq   r6  rr   r   listkeys)rE   rO   r\   r   r`   r_   cachedOrdersrv   r  r>  rm   rw   rK  rX   s                 rG   handle_order_snapshot#krakenfutures.handle_order_snapshot  s   ` (B7!!$,,>,U3{{q#f+&AIE((/FH%F"GO' ' T[[!A:NN4;;1'D1c$i('&0t{{K8 ) rI   c           
         U R                  US5      nUnS nUb  U R                  US5      nUSL a  SnU R                  US5      nU R                  US5      nU R                  US5      nU R                  0 SU_S	U R	                  Xb5      _S
U R                  US5      _SS _SU_SU R                  U5      _SS _SU R                  US5      _SS _SS _SUS:X  a  SOS_SU R                  US5      _SU R                  US5      _SU R                  US5      _SU R                  US5      _SS _SS _U R                  US 5      S US S S S!.S S".E5      $ )#Nr1  r  T	cancelledr   r  	directionr   rm   r   r)  clientOrderIdr   r   r,  r6   timeInForcepostOnlyr   r   buysellr  limit_price	stopPrice
stop_pricetriggerPricer  r  r  r.  r/  r  )r/  r0  r2  r  r   )rQ   r   r   r;  r   r   )	rE   r  rt   isCancelledunparsedOrderr2  r   r   rQ  s	            rG   r6  krakenfutures.parse_ws_order&  s   N ooe[9" OOE7;Md"$##M<@$$]F;	%%m[A	  
E 
d&&x8 
 $""=*= 
 T	 

  
 Y/ 
 !$ 
 D$$]F; 
 4 
  
 i1nE6 
 T%%m]C 
 ))-F 
 D,,]LI 
 d&&}e< 
  D! 
" t# 
$ &&}h? 
 5 
  	rI   c                     U R                  US5      nUbI  U R                  U5      nUS   nX@R                  U'   U R                  SS U5      nUR	                  XF5        g g )Nr  rm   r   )r   parse_ws_tickerr   r  r   rE   rO   r\   r   r   rm   rX   s          rG   handle_tickerkrakenfutures.handle_tickert  sh    @ ##G\:))'2FH%F#)LL //$GKNN6/  rI   c                     U R                  US5      nUbI  U R                  U5      nUS   nX@R                  U'   U R                  SS U5      nUR	                  XF5        g g )Nr  rm   r   )r   r_  r   r  r   r`  s          rG   handle_bid_askkrakenfutures.handle_bid_ask  sg    " ##G\:))'2FH%F$*MM&!//$GKNN6/  rI   c                    U R                  US5      nU R                  X25      nUS   nU R                  U R                  US5      5      nU R                  US5      nU R                  0 SU_SU_SU_SU R	                  U5      _SS _S	S _S
U R                  US
5      _SU R                  US5      _SU R                  US5      _SU R                  US5      _SS _SS _SU_SU_SS _SU R                  US5      _SS _S U R                  US5      U R                  US5      U R                  US5      U R                  US5      S.E5      $ )Nr  rm   lastTimelastr   r   r   highlowbid	bidVolumebid_sizeask	askVolumeask_sizevwapopenclosepreviousClosechanger   volumevolumeQuoter   r  )r.  
baseVolumequoteVolumer   
indexPrice)r   r  	parse8601safe_tickerr   )rE   r   rt   r   rm   r   rh  s          rG   r_  krakenfutures.parse_ws_ticker  s   b ##FL9!!(3!NN4#3#3FJ#GH	/ !
F!
f!
 !
 Y/	!

 D!
 4!
 4##FE2!
 ))&*=!
 4##FE2!
 ))&*=!
 D!
 D!
 T!
 D!
 T!
  d&&vx8!!
" $#!
$ **68<++FMB))&+>**67;-!
  	rI   c                 f   U R                  US5      nU R                  U5      nUS   nU R                  SS U5      nU R                  UR                  U0 5      nU R                  US5      nU R                  US5      n	U R                  0 U5      U R                  U'   U R                  U   n
U R                  US5      nU R                  US5      n[        S[        U5      5       HB  nX   nU R                  US	5      nU R                  US
5      nU
S   nUR                  UU5        MD     [        S[        U5      5       HB  nX   nU R                  US	5      nU R                  US
5      nU
S   nUR                  UU5        MD     XS'   U R                  U	5      U
S'   XZS'   UR                  X5        g )Nr  rm   rb   r`   r   bidsasksr   r  r  r   )r   r  r  	safe_dictrR   r   
order_book
orderbooksr   rp   rq   r   storer   r   )rE   rO   r\   r   rt   rm   rX   subscriptionr`   r   rb   r  r  rv   rk  r  r  bidsSidern  asksSides                       rG   handle_order_book_snapshot(krakenfutures.handle_order_book_snapshot  s   < ##G\:!!(+!++KvF~~f&:&:KL!!,8%%g{;	"&//"e"<OOF+	~~gv.~~gv.q#d)$A'C$$S'2E""3.C (HNN5#& % q#d)$A'C$$S'2E""3.C (HNN5#& % "++ $Y 7	*$(y.rI   c                    U R                  US5      nU R                  U5      nUS   nU R                  SS U5      nU R                  U   nU R                  US5      nU R	                  US5      n	U R	                  US5      n
U R                  US5      nUS:X  a  US	   nUR                  X5        OUS
   nUR                  X5        XS'   U R                  U5      US'   UR                  Xv5        g )Nr  rm   rb   r   r  r  r   rV  r  r  r   )	r   r  r  r  r   r   r  r   r   )rE   rO   r\   r   rt   rm   rX   rb   r   r  r  r   r  r  s                 rG   handle_order_bookkrakenfutures.handle_order_book>  s     ##G\:!!(+!++KvFOOF+	0  '2w.%%g{;	6>V$DJJu"V$DJJu"!*+ $Y 7	*y.rI   c                    U R                  US5      nU R                  US5      nU R                  US5      nSnU R                  US5      nUb  [        UR                  5       5      nUUU R	                  U5      S.n	[        S[        U5      5       H@  n
X   nU R                  U5      nU R                  5       nU R                  X;5      US'   XU'   MB     XR                  S	'   U R                  U R                  S	   5      U R                  S	'   UR                  X5        UGbI  [        UR                  5       5      nUUU R	                  U5      S.n[        S[        U5      5       H  n
X   nU R                  U5      nU R                  5       nU R                  XK5      nU R                  US
5      nU R                  U5      nU R                  US5      US'   U R                  US5      US'   U R                  US5      US'   0 UU'   XU   U'   M     XR                  S'   U R                  U R                  S   5      U R                  S'   UR                  U R                  S   US-   5        UGb5  U R                  US0 5      n[        UR                  5       5      nUUU R	                  U5      S.n[        S[        U5      5       H  n
UU
   nU R                  UU5      nU R                  U5      nU R                  5       nU R                  US5      US'   U R                  US5      US'   U R                  US5      US'   UUU'   M     UU R                  S'   U R                  U R                  S   5      U R                  S'   UR                  U R                  S   US-   5        UR                  U R                  U5        g )Nholdingr   r   r   r   )r   r   r   r   totalcashunit	availablefreer   usedr   margin
currenciescollateral_valuequantityflex)rQ   r   rJ  rK  r   rp   rq   safe_currency_coder   r   r   safe_balancer   r   )rE   rO   r\   r  r   flexFuturesrX   r   holdingKeysholdingResultrv   keycode
newAccountfuturesKeysfuturesResultrm   rY   
currencyIdflexFutureCurrenciesflexFuturesKeysflexFuturesResult
flexFutures                          rG   handle_balancekrakenfutures.handle_balance]  s   d //'95//'95oog~> %%g{;	w||~.K& LL3#M
 1c+./!n..s3!\\^
&*&6&6w&D
7#&0d# 0 $1LL #'#4#4T\\&5I#JDLL NN=6w||~.K& LL3#M
 1c+./!n))#.!\\^
6!--ff=
..z:%)%5%5fk%J
6"%)%5%5f>N%O
6"&*&6&6vy&I
7#(*f%.8f%d+ 0 &3LL"%)%6%6t||H7M%NDLL"NN4<<1;3JK"#'??;b#Q "#7#<#<#>?O& LL3'
 1c/23%a(!__-A3G
..s3!\\^
%)%5%5j+%N
6"%)%5%5jBT%U
6"&*&6&6z:&N
7#*4!$' 4 $5DLL #'#4#4T\\&5I#JDLL NN4<</~1MNt||[1rI   c                    U R                  US/ 5      nU R                  nUc.  U R                  U R                  SS5      n[	        U5      nX@l        0 n[        S[        U5      5       H0  nX7   nU R                  U5      n	SXiS   '   UR                  U	5        M2     [        UR                  5       5      n
[        S[        U
5      5       H  nX   nSU-   nUR                  XL5        M     UR                  US5        g )	Nr   r7   r4   r   Trm   z	myTrades:r   )rQ   r   r   r@   r   rp   rq   parse_ws_my_traderr   rJ  rK  r   )rE   rO   r\   r   storedr`   tradeSymbolsrv   r   parsedTradetradeSymbolKeysrm   rX   s                rG   handle_my_tradeskrakenfutures.handle_my_trades0  s    4 '26>%%dllM4HE+E2F"Mq#f+&AIE007K26LX./MM+&	 '
 |0023q#o./A$'F%.KNN6/ 0 	vz*rI   c                 H   U R                  US5      nU R                  US5      nU R                  XB5      nU R                  US5      nU R                  US5      nU R	                  UU R                  US5      UU R                  U5      U R                  US5      U R                  US5      U R                  US5      U(       a  SOS	U R                  US
5      U R                  US5      U R                  US5      S U R                  U5      U R                  US5      S S.S.5      $ )Nr  r   rU  fee_currencyfill_idrm   r)  r6   rV  	fill_typer  r  fee_paid)r  r  r  )r   r   r   r   rm   r  r6   r   r  r  r  r  r  )r   r   r  rQ   r  r   r  )rE   r   rt   r   r   isBuyfeeCurrencyIds          rG   r  krakenfutures.parse_ws_my_trade]  s"   & %%eV4	##E<8!!(3u-((?""5)4"Y/&&vx8%%eZ8$$UF3"E ,,UK@%%eW5&&ue4 33MB((
; 
  	rI   unifiedNamechannelNamec                   #    U R                  5       I S h  vN   U R                  US SSS5      n/ n[        S[        U5      5       H6  nUR	                  U R                  US U R                  X7   5      5      5        M8     U R                  U5      nSUUS.n	U R                  S   S   n
U R                  XU R                  X5      Xd5      I S h  vN $  N N7f)NFTr   ri   )rL   rj   rn   r2   r   )ro   r   rp   rq   rr   r  rm   
market_idsr?   watch_multiplerT   )rE   r  r  r_   subscriptionArgsrV   r   rv   ru   r[   rW   s              rG   rd    krakenfutures.watch_multi_helper  s     !!!%%gtUD%Hq#g,'A  !6!6{D$++V]V`Ja!bc (OOG,	 $

 iit$((T[[=Y[h{{{ 	" |s"   CCB8CCCCunifiedElementNamesubChannelNamec                 R    US LnUnU(       d  US-  nOUSU-   -  nUb  USU-   -  nU$ )Nsrl   # )rE   r  r  rm   
withSymbolrX   s         rG   r  krakenfutures.get_message_hash  sI     4'
(3K3<'K%3//KrI   c                     U R                  US5      n [        U R                  S-   U-   5      e! [         a  nUR	                  U5         S nAgS nAff = f)Nr\    F)r   r   r   	Exceptionreject)rE   rO   r\   errMsgerrors        rG   handle_error_message"krakenfutures.handle_error_message  sR     !!'95	# 677 	MM% 	s   / 
AAAc                 v   U R                  US5      nUS:X  a  U R                  X5        g US:X  a  U R                  X5        g US:X  a  U R                  5       Ul        g Uc  U R                  US5      nU R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S.nU R                  XT5      nUb	  U" X5        g g g )NrL   rK   alertpongrj   )r   r   r   r  rc   book_snapshotopen_orders_verboseopen_orders_verbose_snapshotr   fills_snapshotr   open_orders_snapshotr   balances_snapshotr   )r   handle_authenticater  millisecondslastPongra  rd  r	  r  r  rG  rM  r  r  r   rQ   )rE   rO   r\   rL   rj   methodsmethods          rG   handle_messagekrakenfutures.handle_message  s$     '2K$$V5g%%f6f_"//1FO]##GV4D,,#22**"&"3"3..!%!@!@'+'8'8040J0J.."&"7"7#00(,(B(B //%)%8%8"&"7"7!G$ __W3F!v' "+ rI   c                 ^   U R                  US5      nSnUS:w  a  U R                  US5      nU R                  U R                  U5      SS5      nU R                  U R                  5      nU R                  Xg[        R                  S5      nXPR                  S'   XR                  S'   U R                  UR                  U5      n	U	R                  S	5        U$ [        U R                  S
-   U R                  U5      -   5      n
UR                  X5        XAR                  ;   a  UR                  U	 U$ )zz
@ignore
       https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
       rL   rK   r  r\   sha256binarybase64r{   Tr  )rQ   hashencodebase64_to_binarysecrethmachashlibsha512r@   r   r   r   r   jsonr  rR   )rE   rO   r\   rL   rX   rK   hashedChallengebase64Secret	signaturerY   r  s              rG   r  !krakenfutures.handle_authenticate  s    1!G;I"iiI(>(SO00=L		/QYZI(1LL%.7LL*+__V^^[AFNN4  	 (#		'8J(JKEMM%-222((5rI   )r   r   r   )N)NN)9__name__
__module____qualname____firstlineno__r   rD   r]   r   strr   r
   re   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r	  r  r&  rG  rM  r6  ra  rd  r_  r  r  r  r  r  rd   r  r   r  r  r  __static_attributes____classcell__)rF   s   @rG   r   r      sS   0# 0d )+ 8 SW_a !$s) !C !fo ! LN H3 Hc H< KM HC Hc H, 68  F  6:" E7 E E& 8<B FW F7 F" <@d[] S SS S Sbfglbm S OSaenp Sd3i S S[^ Suyz  vA S& @DB PS P PS\ P 8<$]ajl _W _C _WZ _quv~q _.12f/b 04$UYbd S SC Ss Simnsit S0 37TX\eg SC Ss SRU Slpqvlw S. *, G G*:56 :5x#J1fH6 HTB9F B9HL\&0F &0P0V 02M^8/ 8/t/ />Q2V Q2f++v ++Z*X _cuy  CE |C |c |T[ | 3  \_ 6 t (@&  rI   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   r  ccxt.base.typesr   r   r   r   r	   r
   r   r   r   r   r   r   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   r   ccxt.base.preciser   async_supportr   r  rI   rG   <module>r     sH     O  v v v v 4  * 0 . %]D&&44 ]rI   