
    ":h                         d dl Zd dlmZmZ d dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ  G d
 dej8                  j:                        Zy)    N)
ArrayCacheArrayCacheBySymbolById)AnyBalancesIntOrder	OrderBookPositionStrStringsTickerTickersTrade)Client)List)ExchangeError)AuthenticationError)ArgumentsRequired)Precisec            
           e Zd Zdef fdZi fdZdi fdee   dede	fdZ
i fdedee   fd	Zi fded
efdZi fdedefdZdi fdedefdZdi fdedefdZdddi fdedededee   fdZddi fdee   dededee   fdZdi fdedede	fdZdddi fdedededee   fdZd Zd2dZdddi fdedededee   fdZdddi fdedededee   fdZi fdefdZ de!fdZ"d2dZ#d2dZ$de!fdZ%de!fdZ&d2d Z'de!fd!Z(de!fd"Z)d2d#Z*de!fd$Z+de!fd%Z,de!fd&Z-de!fd'Z.d2d(Z/ddi fd)ed*edefd+Z0d3d,ed-edefd.Z1de!fd/Z2d0 Z3de!fd1Z4 xZ5S )4krakenfuturesreturnc                     | j                  t        t        |          i ddddddddddddd	dd
dddddddddddddddddddddddddddiddidddddddd idddid      S )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/var/www/html/turnos/venv/lib/python3.12/site-packages/ccxt/pro/krakenfutures.pyrB   zkrakenfutures.describe   sW   mT C Ed#U !%  	
   u !% $U    e !$ +D t    !" t#$ *. $#!%"&/6 : ?	  $#"#& #D!	 UY/H
 / /	    c                 T  K   | j                          | j                  d   d   }d}| j                  |      }|j                  |      }| j	                  |j
                  |      }|5d| j                  d}| j                  ||      }| j                  ||||       | d{   S 7 w)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
        r0   r   	challengeN)eventapi_key)	check_required_credentialsr=   clientfuture
safe_valuesubscriptionsapiKeyextendwatch)	rC   paramsurlmessageHashrL   rM   authenticatedrequestmessages	            rE   authenticatezkrakenfutures.authenticateF   s      	'')
 iit$!S!{+(<(<kJ $;;G kk'62GJJsK+>||s   BB(!B&"B(Nsymbolslimitc                 l   K   | j                  dd|d|i|       d{   }|j                         S 7 w)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[   )rC   rZ   r[   rS   r]   s        rE   watch_order_book_for_symbolsz*krakenfutures.watch_order_book_for_symbolsb   s>      11+vwQXZ_P`bhii	   js   424namec                   K   | j                          d{    | j                  d   d   }d|d}g }|}|g }t        dt        |            D ]'  }||   }	|j	                  | j                  |	             ) t        |      }
|
dk(  r| j                  |d         }|dz   |d	   z   }||d
<   | j                  ||      }| j                  ||||       d{   S 7 7 w)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
        Nr0   r   	subscribe)rI   feedr      :symbolproduct_ids)	load_marketsr=   rangelenappend	market_idmarketrQ   rR   )rC   ra   rZ   rS   rT   rc   	marketIdsrU   irg   lengthrn   rW   s                rE   subscribe_publiczkrakenfutures.subscribe_publicp   s      !!!iit$ 
	 	?Gq#g,' 	5AQZFT^^F34	5 WQ;[[1.F%+fX.>>K#,	- ++i0ZZ[';GGG' 	"& Hs"   CCB?CCCCrU   c                 N  K   | j                          d{    | j                          d{    | j                  d   d   }d|| j                  | j                  d   | j                  d   d}| j                  ||      }| j                  ||||       d{   S 7 7 r7 w)a0  
 @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
        Nr0   r   rc   rH   signedChallenge)rI   rd   rJ   original_challengesigned_challenge)ri   rY   r=   rP   r>   rQ   rR   )rC   ra   rU   rS   rT   rc   rW   s          rE   subscribe_privatezkrakenfutures.subscribe_private   s      !!!!!!iit$ {{"&,,{"; $-> ?
	 ++i0ZZ[';GGG 	"! Hs2   B%BB%B!A+B%B#B%!B%#B%rg   c                    K   | j                          d{    | j                  |      }| j                  |g|       d{   }||   S 7 57 w)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)ri   rg   watch_tickers)rC   rg   rS   tickerss       rE   watch_tickerzkrakenfutures.watch_ticker   sR      !!!V$**F8V<<v 	"<s!   AA+AA
AAc                   K   | j                          d{    | j                  |dd      }| j                  dd|d|       d{   }| j                  ri }|||d   <   |S | j	                  | j
                  d|      S 7 i7 ;w)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tickerrg   )ri   market_symbolsr_   
newUpdatesfilter_by_arrayrz   rC   rZ   rS   r}   results        rE   ry   zkrakenfutures.watch_tickers   s      !!!%%gtU;..x7DRXYY??F'-F6(#$M##DLL(GDD 	"Ys!   BB /BB:BBc                    K   | j                  dd|d|       d{   }| j                  ri }|||d   <   |S | j                  | j                  d|      S 7 9w)a  

        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_liteNrg   )r_   r   r   bidsasksr   s        rE   watch_bids_askszkrakenfutures.watch_bids_asks   sd      ..xQUW]^^??F'-F6(#$M##DMM8WEE _s   AA:Asincec                 H   K   | j                  |g|||       d{   S 7 w)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)rC   rg   r   r[   rS   s        rE   watch_tradeszkrakenfutures.watch_trades   s'      22F8UE6RRRRs   " "c                    K   | j                  dd|d|       d{   }| j                  r6| j                  |d      }| j                  |d      }|j	                  ||      }| j                  |||dd      S 7 [w)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   rg   	timestampT)r_   r   	safe_listsafe_stringgetLimitfilter_by_since_limit)rC   rZ   r   r[   rS   tradesfirsttradeSymbols           rE   r   z&krakenfutures.watch_trades_for_symbols   s|      ..w$PVWW??NN61-E**5(;KOOK7E))&%TRR Xs   A9A7AA9c                 F   K   | j                  |g||       d{   S 7 w)a4  
        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)r`   )rC   rg   r[   rS   s       rE   watch_order_bookzkrakenfutures.watch_order_book   s%      66xOOOOs   !!c                 L  K   | j                          d{    d}| j                  |      }| j                  |      sddj                  |      z   }d|z   }| j	                  d||       d{   }| j
                  r|S | j                  | j                  |||d      S 7 7 3w)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)ri   r~   is_emptyjoinrw   r   filter_by_symbols_since_limitr   )rC   rZ   r   r[   rS   rU   newPositionss          rE   watch_positionszkrakenfutures.watch_positions  s      !!!%%g.}}W%'!22K!K/!334DkSYZZ??11$..'5RWY]^^ 	" [s"   B$B AB$.B"/2B$"B$c                    | j                   t               | _         | j                   }| j                  |dg       }g }t        dt	        |            D ]e  }||   }| j                  |      }| j                  |d      }	|	|d<   | j                  |	      |d<   |j                  |       |j                  |       g | j                  |d      }
t        dt	        |
            D ]f  }|
|   }|j                  d      }|d   }|j                  d      }| j                  |d	|d
      }| j                  |      rU|j                  ||       h |j                  |d       y )Nr   r   r   datetimezpositions::r   re   r   rg   F)r   r   rN   rj   rk   parse_ws_positionsafe_integeriso8601rl   find_message_hashessplitr   r   resolve)rC   rL   rX   cacherawPositionsr   rp   rawPositionpositionr   messageHashesrU   partssymbolsStringrZ   r   s                   rE   handle_positionszkrakenfutures.handle_positions  sW   6 >>!35DNwR@q#l+, 	#A&q/K--k:H))';?I$-H[!#'<<	#:HZ )LL"	# 00Gq#m,- 	7A'*K%%d+E!!HM#))#.G,,\8WeTI==+y+6	7 	|[1rF   c                 Z   | j                  |d      }d}| j                  |d      }|dkD  rdnd}| j                  i d|dd d	| j                  |      d
d dd d| j                  |d      d| j                  |d      d| j                  |d      d| j                  |d      d| j	                  t        j                  | j                  |                  dd d| j                  |d      d|d|dd dd d| j                  |d      d d | j                  |d      d d d d      S ) N
instrumentbothbalancer   longshortinfoidrg   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)rC   r   rn   marketIdr   r   r   s          rE   r   z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'+/#
  	rF   c                 "  K   | j                          d{    d}d}|| j                  |      }|d|d   z   z  }| j                  |||       d{   }| j                  r|j	                  ||      }| j                  |||dd      S 7 t7 9w)as  
        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ordersrf   rg   r   Tri   rn   rw   r   r   r   )	rC   rg   r   r[   rS   ra   rU   rn   r   s	            rE   watch_orderszkrakenfutures.watch_orders  s      !!![[(F3!111K--dKHH??OOFE2E))&%TRR 	" I!   BB<BB8BBc                 "  K   | j                          d{    d}d}|| j                  |      }|d|d   z   z  }| j                  |||       d{   }| j                  r|j	                  ||      }| j                  |||dd      S 7 t7 9w)a9  
        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myTradesrf   rg   r   Tr   )	rC   rg   r   r[   rS   ra   rU   rn   r   s	            rE   watch_my_tradeszkrakenfutures.watch_my_trades  s      !!! [[(F3!111K--dKHH??OOFE2E))&%TRR 	" Ir   c                   K   | j                          d{    d}|}d}| j                  |dd      \  }}|*|dk7  r|dk7  rt        | j                  dz         |d|z   z  }| j	                  |||       d{   S 7 g7 w)	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'rf   )ri   handle_option_and_paramsr   r   rw   )rC   rS   ra   rU   r   s        rE   watch_balancezkrakenfutures.watch_balance  s      !!!77PYZ)#>(A'2x(xyy3=(K++D+vFFF 	" Gs"   BA>A"B9B :B BrL   c                    | j                  |d      }| j                  |d      }|"| j                  |      }|d   }| j                  dd |      }| j                  | j                  |      5| j                  | j                  dd      }t        |      | j                  |<   | j                  |   }	|dk(  r_| j                  |dg       }
t        |
      }t        d	|      D ]1  }|d
z
  |z
  }|
|   }| j                  |      }|	j                  |       3 n"| j                  |      }|	j                  |       |j                  |	|       y y )Nrd   
product_idrg   r   r5   r2   trade_snapshotr   r   re   )r   rn   get_message_hashr   r   r   r>   r   rk   rj   parse_ws_traderl   r   )rC   rL   rX   channelr   rn   rg   rU   r5   tradesArrayr   rq   rp   indexitemr   s                   rE   handle_tradezkrakenfutures.handle_trade  sJ   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'  rF   c                    | j                  |d      }| j                  ||      }| j                  |d      }| j                  || j                  |d      | j                  |d      || j	                  |      d | j                  |d      | j                  |d      d| j                  |d      | j                  |d	      d d d d d
d|      S )Nr   timeuidrg   r4   r   takerpriceqtyratecostcurrencyr   r   rg   r   r   orderr4   r   takerOrMakerr   amountr   fee)r   safe_marketr   
safe_trader   )rC   r   rn   r   r   s        rE   r   zkrakenfutures.parse_ws_trade   s     ##E<8!!(F3%%eV4	""5%0&&vx8"Y/$$UF3$$UF3#%%eW5&&ue4  
$ % 	rF   c                    | j                  |d      }| j                  |d      }| j                  || j                  |d      | j                  ||      || j	                  |      | j                  |d      | j                  |d      | j                  |d      | j                  |d      | j                  |d      | j                  |d	      d d | j                  |d
      | j                  |d      dd|      S )N	tradeTimerg   tradeIdorderIdr4   r   	matchRoler   tradeAmounttradeFeefeeCurrencyr   r   )r   r   r  r   r   safe_string_lower)rC   r   rn   r   r   s        rE   parse_ws_order_tradez"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 
$ % 	rF   c                    | j                   }|.| j                  | j                  d      }t        |      }|| _         | j	                  |d      }|| j                  |d      }d}| j                  |      }| j                  |d      }	| j	                  |j                  |i       }
| j	                  |
|	      }| j                  |d      }||dk(  rN| j                  |      }|j                  |       |j                  ||       |j                  ||dz   |z          |S | j                  |      }|d	   g |d	<   |d	   j                  |       |d
   |d<   d}d}|d	   }t        dt        |            D ]W  }||   }t        j                  || j!                  |d               }t        j                  || j!                  |d               }Y t        j"                  |d      rt        j$                  ||      |d<   ||d<   |d   o| j!                  |d         }t        j                  || j!                  |d               |d<   |d   +t        j&                  | j!                  |d         |      |d<   |d   d d| j!                  |d   d         d|d<   |d   d   R|d   d   J| j!                  |d   d         }| j!                  |d   d         }t        j                  ||      |d   d<   |j                  | j)                  |             |j                  ||dz   |z          |j                  ||       |S | j	                  |d      }|rnt        dt        |            D ]V  }||   }|d   |d   k(  s| j+                  |ddi      ||<   |j                  |d       |j                  |d|d   z           |S  |S )Nr6   r  r   r   order_idreasonedited_by_userrf   r   r   lastTradeTimestamp0r   r   r  averagefilled	remainingr  r   r   	is_cancelr   statuscanceledorders:rg   )r   r   r>   r   rN   r   r   hashmapparse_ws_orderrl   r   r   rj   rk   r   
string_addr   	string_gt
string_div
string_sub
safe_orderrQ   )rC   rL   rX   r   r[   r  r   rU   rg   r
  previousOrderspreviousOrderr  parsedr   	totalCosttotalAmountr   rp   currentTradestringOrderFilledstringOrderCoststringTradeCostisCancelcurrentOrders                            rE   handle_orderzkrakenfutures.handle_orderX  s'   J >%%dllMBE+E2F DK1''|<H"K%%h/F&&uj9G!__V^^VRHN OONGDM%%gx8F%65E+E,,U3f%v{3v{S'86'ABb _ ++E2 *2.0M(+h'..u56;K6H23	!&x0q#f+. qA#)!9L ' 2 29d>S>ST`agTh>i jI")"4"4[$BWBWXdemXnBo"pKq $$[#6/6/A/A)[/YM),(1f% *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<=v{S'86'ABv{3  w<Hq#f+. A#)!9L#D)WZ-@@$(KK$j? %q	 vx8vy<;Q/QR rF   c                 T   | j                  |dg       }| j                  | j                  d      }t        |      | _        i }| j                  }t        dt        |            D ]3  }||   }| j                  |      }	|	d   }
d||
<   |j                  |	       5 t        | j                        }|dkD  rv|j                  | j                  d       t        |j                               }t        dt        |            D ](  }||   }
d|
z   }|j                  | j                  |       * y y )Nr   r6   r   rg   Tr  )rN   r   r>   r   r   rj   rk   r  rl   r   listkeys)rC   rL   rX   r   r[   rZ   cachedOrdersrp   r  r'  rg   rq   r3  rU   s                 rE   handle_order_snapshotz#krakenfutures.handle_order_snapshot  s   ` (B7!!$,,>,U3{{q#f+& 	(A1IE((/FH%F"GFO'	( T[[!A:NN4;;1'D1c$i( 9a'&0t{{K89 rF   c           
         | j                  |d      }|}d }|| j                  |d      }|du rd}| j                  |d      }| j                  |d      }| j                  |d      }| j                  i d|d	| j	                  ||      d
| j                  |d      dd d|d| j                  |      dd d| j                  |d      dd dd d|dk(  rdndd| j                  |d      d| j                  |d      d| j                  |d      d| j                  |d      dd dd | j                  |d       d |d d d d!d d"      S )#Nr  r  T	cancelledr   r   	directionr   rg   r   r  clientOrderIdr   r   r  r4   timeInForcepostOnlyr   r   buysellr   limit_price	stopPrice
stop_pricetriggerPricer  r   r   r  r  r   )r  r  r  r  r   )rN   r   r   r$  r   r   )	rC   r  rn   isCancelledunparsedOrderr  r   r   r8  s	            rE   r  z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 
  	rF   c                     | j                  |d      }|K| j                  |      }|d   }|| j                  |<   | j                  dd |      }|j	                  ||       y y )Nr   rg   r}   )r   parse_ws_tickerrz   r   r   rC   rL   rX   r   r}   rg   rU   s          rE   handle_tickerzkrakenfutures.handle_tickert  sl    @ ##G\:))'2FH%F#)DLL //$GKNN6;/  rF   c                     | j                  |d      }|K| j                  |      }|d   }|| j                  |<   | j                  dd |      }|j	                  ||       y y )Nr   rg   r   )r   rE  r   r   r   rF  s          rE   handle_bid_askzkrakenfutures.handle_bid_ask  sk    " ##G\:))'2FH%F$*DMM&!//$GKNN6;/  rF   c                    | j                  |d      }| j                  ||      }|d   }| j                  | j                  |d            }| j                  |d      }| j                  i d|d|d|d| j	                  |      dd d	d d
| j                  |d
      d| j                  |d      d| j                  |d      d| j                  |d      dd dd d|d|dd d| j                  |d      dd d | j                  |d      | j                  |d      | j                  |d      | j                  |d      d      S )Nr   rg   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   )rC   r}   rn   r   rg   r   rL  s          rE   rE  zkrakenfutures.parse_ws_ticker  s   b ##FL9!!(F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;-!
  	rF   c                 h   | j                  |d      }| j                  |      }|d   }| j                  dd |      }| j                  |j                  |i       }| j                  |d      }| j                  |d      }	| j                  i |      | j                  |<   | j                  |   }
| j                  |d      }| j                  |d      }t        dt        |            D ]B  }||   }| j                  |d	      }| j                  |d
      }|
d   }|j                  ||       D t        dt        |            D ]B  }||   }| j                  |d	      }| j                  |d
      }|
d   }|j                  ||       D |	|
d<   | j                  |	      |
d<   ||
d<   |j                  |
|       y )Nr   rg   r]   r[   r   bidsasksr   r   r   r   )r   r  r   	safe_dictrO   r   
order_book
orderbooksr   rj   rk   r   storer   r   )rC   rL   rX   r   rn   rg   rU   subscriptionr[   r   r]   rb  rc  rp   rO  r   r   bidsSiderR  asksSides                       rE   handle_order_book_snapshotz(krakenfutures.handle_order_book_snapshot  s   < ##G\:!!(+!++KvF~~f&:&:KL!!,8%%g{;	"&//"e"<OOF+	~~gv.~~gv.q#d)$ 	'Aq'C$$S'2E""3.C (HNN5#&	' q#d)$ 	'Aq'C$$S'2E""3.C (HNN5#&	' "+	+ $Y 7	*$	(y+.rF   c                    | j                  |d      }| j                  |      }|d   }| j                  dd |      }| j                  |   }| j                  |d      }| j	                  |d      }	| j	                  |d      }
| j                  |d      }|dk(  r|d	   }|j                  |	|
       n|d
   }|j                  |	|
       ||d<   | j                  |      |d<   |j                  ||       y )Nr   rg   r]   r   r   r   r   r=  rc  rb  r   )	r   r  r   rf  r   r   rg  r   r   )rC   rL   rX   r   rn   rg   rU   r]   r   r   r   r   rc  rb  s                 rE   handle_order_bookzkrakenfutures.handle_order_book>  s     ##G\:!!(+!++KvFOOF+	0  '2w.%%g{;	6>V$DJJuc"V$DJJuc"!*	+ $Y 7	*y+.rF   c                    | j                  |d      }| j                  |d      }| j                  |d      }d}| j                  |d      }|t        |j                               }||| j	                  |      d}	t        dt        |            D ]B  }
||
   }| j                  |      }| j                         }| j                  ||      |d<   ||	|<   D |	| j                  d	<   | j                  | j                  d	         | j                  d	<   |j                  |	|       |Kt        |j                               }||| j	                  |      d}t        dt        |            D ]  }
||
   }| j                  |      }| j                         }| j                  ||      }| j                  |d
      }| j                  |      }| j                  |d      |d<   | j                  |d      |d<   | j                  |d      |d<   i ||<   |||   |<    || j                  d<   | j                  | j                  d         | j                  d<   |j                  | j                  d   |dz          |3| j                  |di       }t        |j                               }||| j	                  |      d}t        dt        |            D ]~  }
||
   }| j                  ||      }| j                  |      }| j                         }| j                  |d      |d<   | j                  |d      |d<   | j                  |d      |d<   |||<    || j                  d<   | j                  | j                  d         | j                  d<   |j                  | j                  d   |dz          |j                  | j                  |       y )Nholdingr   r   r   r   )r   r   r   r   totalcashunit	availablefreer   usedr   margin
currenciescollateral_valuequantityflex)rN   r   r2  r3  r   rj   rk   safe_currency_coder   r   r   safe_balancer   r   )rC   rL   rX   ro  r   flexFuturesrU   r   holdingKeysholdingResultrp   keycode
newAccountfuturesKeysfuturesResultrg   rM   
currencyIdflexFutureCurrenciesflexFuturesKeysflexFuturesResult
flexFutures                          rE   handle_balancezkrakenfutures.handle_balance]  s   d //'95//'95oog~> %%g{;	w||~.K& LL3#M
 1c+./ 1!!n..s3!\\^
&*&6&6w&D
7#&0d#1 $1DLL #'#4#4T\\&5I#JDLL NN=+6w||~.K& LL3#M
 1c+./ 9!!n))#.!\\^
#6!--ff=
..z:%)%5%5fk%J
6"%)%5%5f>N%O
6"&*&6&6vy&I
7#(*f%.8f%d+9 &3DLL"%)%6%6t||H7M%NDLL"NN4<<1;3JK"#'??;b#Q "#7#<#<#>?O& LL3'
 1c/23 5%a(!__-A3G
..s3!\\^
%)%5%5j+%N
6"%)%5%5jBT%U
6"&*&6&6z:&N
7#*4!$'5 $5DLL #'#4#4T\\&5I#JDLL NN4<</~1MNt||[1rF   c                    | j                  |dg       }| j                  }|/| j                  | j                  dd      }t	        |      }|| _        i }t        dt        |            D ]1  }||   }| j                  |      }	d||	d   <   |j                  |	       3 t        |j                               }
t        dt        |
            D ]  }|
|   }d|z   }|j                  ||         |j                  |d       y )	Nr   r5   r2   r   Trg   z	myTrades:r   )rN   r   r   r>   r   rj   rk   parse_ws_my_traderl   r2  r3  r   )rC   rL   rX   r   storedr[   tradeSymbolsrp   r   parsedTradetradeSymbolKeysrg   rU   s                rE   handle_my_tradeszkrakenfutures.handle_my_trades0  s   4 '26>%%dllM4HE+E2F"DMq#f+& 	'A1IE007K26LX./MM+&		'
 |0023q#o./ 	0A$Q'F%.KNN6;/	0 	vz*rF   c                 @   | j                  |d      }| j                  |d      }| j                  ||      }| j                  |d      }| j                  |d      }| j	                  || j                  |d      || j                  |      | j                  |d      | j                  |d      | j                  |d      |rdnd	| j                  |d
      | j                  |d      | j                  |d      d | j                  |      | j                  |d      d dd      S )Nr   r   r<  fee_currencyfill_idrg   r  r4   r=  	fill_typer   r   fee_paid)r   r   r   )r   r   r   r   rg   r  r4   r   r  r   r  r   r  )r   r   r  rN   r  r   r{  )rC   r   rn   r   r   isBuyfeeCurrencyIds          rE   r  zkrakenfutures.parse_ws_my_trade]  s$   & %%eV4	##E<8!!(F3u-((?""5)4"Y/&&vx8%%eZ8$$UF3"E ,,UK@%%eW5&&ue4 33MB((
; 
  	rF   unifiedNamechannelNamec                   K   | j                          d {    | j                  |d ddd      }g }t        dt        |            D ]6  }|j	                  | j                  |d | j                  ||                      8 | j                  |      }d||d}	| j                  d   d   }
| j                  |
|| j                  |	|      ||       d {   S 7 7 w)NFTr   rc   )rI   rd   rh   r0   r   )ri   r~   rj   rk   rl   r   rg   
market_idsr=   watch_multiplerQ   )rC   r  r  rZ   subscriptionArgsrS   r   rp   ro   rW   rT   s              rE   r_   z krakenfutures.watch_multi_helper  s     !!!%%gtUD%Hq#g,' 	dA  !6!6{D$++V]^_V`Ja!bc	dOOG,	 $

 iit$((mT[[RX=Y[hjz{{{ 	" |s"   CCB:CCCCunifiedElementNamesubChannelNamec                 F    |d u}|}|s|dz  }n|d|z   z  }||d|z   z  }|S )Nsrf   # )rC   r  r  rg   
withSymbolrU   s         rE   r   zkrakenfutures.get_message_hash  sI     4'
(3K3<'K%3//KrF   c                     | j                  |d      }	 t        | j                  dz   |z         # t        $ r}|j	                  |       Y d }~y d }~ww xY w)NrX    )r   r   r   	Exceptionreject)rC   rL   rX   errMsgerrors        rE   handle_error_messagez"krakenfutures.handle_error_message  sR     !!'95	!# 677 	!MM%  	!s   / 	AAAc                 t   | j                  |d      }|dk(  r| j                  ||       y |dk(  r| j                  ||       y |dk(  r| j                         |_        y || j                  |d      }| j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d}| j                  ||      }|
 |||       y y y )NrI   rH   alertpongrd   )r}   r   r   r   r^   book_snapshotopen_orders_verboseopen_orders_verbose_snapshotr   fills_snapshotr   open_orders_snapshotr   balances_snapshotr   )r   handle_authenticater  millisecondslastPongrG  rI  r   rm  rk  r0  r5  r  r  r   rN   )rC   rL   rX   rI   rd   methodsmethods          rE   handle_messagezkrakenfutures.handle_message  s,     '2K$$VW5g%%fg6f_"//1FO]##GV4D,,#22**"&"3"3..!%!@!@'+'8'8040J0J.."&"7"7#00(,(B(B //%)%8%8"&"7"7!G$ __Wd3F!vw' "+ rF   c                 b   | j                  |d      }d}|dk7  r| j                  |d      }| j                  | j                  |      dd      }| j                  | j                        }| j                  ||t        j                  d      }|| j                  d<   || j                  d<   | j                  |j                  |      }	|	j                  d	       |S t        | j                  d
z   | j                  |      z         }
|j                  |
|       ||j                  v r|j                  |= |S )z}
 @ignore
        https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
        rI   rH   r  rX   sha256binarybase64rt   Tr  )rN   hashencodebase64_to_binarysecrethmachashlibsha512r>   r   r   r   r   jsonr  rO   )rC   rL   rX   rI   rU   rH   hashedChallengebase64Secret	signaturerM   r  s              rE   r  z!krakenfutures.handle_authenticate  s    1!G;I"iiI(>(SO00=L		/<QYZI(1DLL%.7DLL*+__V^^[AFNN4  	 (#		'8J(JKEMM%-f222((5rF   )N)NN)6__name__
__module____qualname__r   rB   rY   r   strr   r	   r`   rr   rw   r   r{   r   r   ry   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r  r0  r5  r  rG  rI  rE  rk  rm  r  r  r  r_   r   r  r  r  __classcell__)rD   s   @rE   r   r      sI   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" 04$UYbd S SC Ss Simnsit 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 !(@& rF   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   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   r   ccxt.base.preciser   async_supportr   r  rF   rE   <module>r     sH     O  p p p p 4  * 0 . %\D&&44 \rF   