
    ei-                         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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j        j                  ZdS )    N)
ArrayCacheArrayCacheBySymbolById)AnyBalancesBool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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!de2fd/Z3d0 Z4de!fd1Z5 xZ6S )4krakenfuturesreturnc                    |                      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    T/var/www/html/volatility/venv/lib/python3.11/site-packages/ccxt/pro/krakenfutures.pyrC   zkrakenfutures.describe   s   mT : : C C E Ed#U !%  	
   u !% $U    e !$ +D t    !" t#$ *. $#!%"&/  6 : ?	   $#"#& #D!	 	 UY/H
 /H
 / / /	    c                 f  K   |                                   | j        d         d         }d}|                     |          }|                    |          }|                     |j        |          }|8d| j        d}|                     ||          }|                     ||||           | d{V S )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
        r1   r   	challengeN)eventapi_key)	check_required_credentialsr>   clientreusableFuture
safe_valuesubscriptionsapiKeyextendwatch)	rD   paramsurlmessageHashrM   futureauthenticatedrequestmessages	            rF   authenticatezkrakenfutures.authenticateF   s       	'')))
 it$!S!!&&{33(<kJJ $; G kk'622GJJsK+>>>||||||rG   Nsymbolslimitc                 p   K   |                      dd|d|i|           d{V }|                                S )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]   )rD   r\   r]   rT   r_   s        rF   watch_order_book_for_symbolsz*krakenfutures.watch_order_book_for_symbolsb   sM       11+vwQXZ_P`bhiiiiiiii	   rG   namec                   K   |                                   d{V  | j        d         d         }d|d}g }|}|g }t          dt          |                    D ]2}||         }	|                    |                     |	                     3t          |          }
|
dk    r)|                     |d                   }|dz   |d	         z   }||d
<   |                     ||          }|                     ||||           d{V S )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
        Nr1   r   	subscribe)rJ   feedr      :symbolproduct_ids)	load_marketsr>   rangelenappend	market_idmarketrR   rS   )rD   rc   r\   rT   rU   re   	marketIdsrV   iri   lengthrp   rY   s                rF   subscribe_publiczkrakenfutures.subscribe_publicp   s4      !!!!!!!!!it$ 
 
	 	?Gq#g,,'' 	5 	5AQZFT^^F334444WQ;;[[1..F%+fX.>>K#,	- ++i00ZZ[';GGGGGGGGGrG   rV   c                 B  K   |                                   d{V  |                                  d{V  | j        d         d         }d|| j        | j        d         | j        d         d}|                     ||          }|                     ||||           d{V S )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
        Nr1   r   re   rI   signedChallenge)rJ   rf   rK   original_challengesigned_challenge)rk   r[   r>   rQ   r?   rR   rS   )rD   rc   rV   rT   rU   re   rY   s          rF   subscribe_privatezkrakenfutures.subscribe_private   s       !!!!!!!!!!!!!!!!!!it$ {"&,{"; $-> ?
 
	 ++i00ZZ[';GGGGGGGGGrG   ri   c                    K   |                                   d{V  |                     |          }|                     |g|           d{V }||         S )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)rk   ri   watch_tickers)rD   ri   rT   tickerss       rF   watch_tickerzkrakenfutures.watch_ticker   sp       !!!!!!!!!V$$**F8V<<<<<<<<vrG   c                 
  K   |                                   d{V  |                     |dd          }|                     dd|d|           d{V }| j        ri }|||d         <   |S |                     | j        d|          S )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tickerri   )rk   market_symbolsra   
newUpdatesfilter_by_arrayr|   rD   r\   rT   r   results        rF   r{   zkrakenfutures.watch_tickers   s       !!!!!!!!!%%gtU;;..x7DRXYYYYYYYY? 	F'-F6(#$M##DL(GDDDrG   c                    K   |                      dd|d|           d{V }| j        ri }|||d         <   |S |                     | j        d|          S )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_liteNri   )ra   r   r   bidsasksr   s        rF   watch_bids_askszkrakenfutures.watch_bids_asks   st       ..xQUW]^^^^^^^^? 	F'-F6(#$M##DM8WEEErG   sincec                 D   K   |                      |g|||           d{V S )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)rD   ri   r   r]   rT   s        rF   watch_tradeszkrakenfutures.watch_trades   s6       22F8UE6RRRRRRRRRrG   c                   K   |                      dd|d|           d{V }| j        rB|                     |d          }|                     |d          }|                    ||          }|                     |||dd          S )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   ri   	timestampT)ra   r   	safe_listsafe_stringgetLimitfilter_by_since_limit)rD   r\   r   r]   rT   tradesfirsttradeSymbols           rF   r   z&krakenfutures.watch_trades_for_symbols   s       ..w$PVWWWWWWWW? 	8NN61--E**5(;;KOOK77E))&%TRRRrG   c                 B   K   |                      |g||           d{V S )a2  
        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)rb   )rD   ri   r]   rT   s       rF   watch_order_bookzkrakenfutures.watch_order_book   s4       66xOOOOOOOOOrG   c                 T  K   |                                   d{V  d}|                     |          }|                     |          sdd                    |          z   }d|z   }|                     d||           d{V }| j        r|S |                     | j        |||d          S )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)rk   r   is_emptyjoinry   r   filter_by_symbols_since_limitr   )rD   r\   r   r]   rT   rV   newPositionss          rF   watch_positionszkrakenfutures.watch_positions  s       !!!!!!!!!%%g..}}W%% 	3'!2!22K!K/!334DkSYZZZZZZZZ? 	 11$.'5RWY]^^^rG   c                 @   | j         t                      | _         | j         }|                     |dg           }g }t          dt	          |                    D ]|}||         }|                     |          }|                     |d          }	|	|d<   |                     |	          |d<   |                    |           |                    |           }| 	                    |d          }
t          dt	          |
                    D ]}|
|         }|
                    d          }|d         }|
                    d          }|                     |d	|d
          }|                     |          s|                    ||           |                    |d           d S )Nr   r   r   datetimezpositions::r   rg   r   ri   F)r   r   rO   rl   rm   parse_ws_positionsafe_integeriso8601rn   find_message_hashessplitr   r   resolve)rD   rM   rZ   cacherawPositionsr   rr   rawPositionpositionr   messageHashesrV   partssymbolsStringr\   r   s                   rF   handle_positionszkrakenfutures.handle_positions  s   6 >!355DNwR@@q#l++,, 	# 	#A&q/K--k::H))';??I$-H[!#'<<	#:#:HZ )))LL""""00GGq#m,,-- 	7 	7A'*K%%d++E!!HM#))#..G,,\8WeTTI==++ 7y+666|[11111rG   c           
         |                      |d          }d}|                      |d          }d }t          j        |d          rd}nt          j        |d          rd}|                     i d|dd d	|                     |          d
d dd d|                     |d          d|                     |d          d|                     |d          d|                     |d          d|                     t          j        |                    dd d|                     |d          d|d|dd dd d|                     |d          d d |                     |d          d d d d          S ) N
instrumentbothbalance0longshortinfoidri   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   r   	string_gt	string_ltsafe_positionsafe_symbolsafe_numberparse_number
string_abs)rD   r   rp   marketIdr   balanceStringr   s          rF   r   zkrakenfutures.parse_ws_positionO  s   & ##Hl;;((9==]C00 	DD}c22 	D!! #
H#
$#
 d&&x00#
 	#

 $#
  0 0;R S S#
 $**8]CC#
 T--h>>#
 $**85GHH#
 **7+=m+L+LMM#
 D#
 ))(LAA#
 D#
 f#
 #
  !#
"  !1!1(<P!Q!Q##
$ ,0!--h8HII'+/#
 #
 #
   	rG   c                 2  K   |                                   d{V  d}d}|#|                     |          }|d|d         z   z  }|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )aq  
        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ordersrh   ri   r   Trk   rp   ry   r   r   r   )	rD   ri   r   r]   rT   rc   rV   rp   r   s	            rF   watch_orderszkrakenfutures.watch_orders  s       !!!!!!!!![[((F3!111K--dKHHHHHHHH? 	3OOFE22E))&%TRRRrG   c                 2  K   |                                   d{V  d}d}|#|                     |          }|d|d         z   z  }|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )a7  
        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myTradesrh   ri   r   Tr   )	rD   ri   r   r]   rT   rc   rV   rp   r   s	            rF   watch_my_tradeszkrakenfutures.watch_my_trades  s       !!!!!!!!! [[((F3!111K--dKHHHHHHHH? 	3OOFE22E))&%TRRRrG   c                   K   |                                   d{V  d}|}d}|                     |dd          \  }}|+|dk    r|dk    rt          | j        dz             |d|z   z  }|                     |||           d{V S )	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'rh   )rk   handle_option_and_paramsr   r   ry   )rD   rT   rc   rV   r   s        rF   watch_balancezkrakenfutures.watch_balance  s       !!!!!!!!!77PYZZ)##>(A(A'2x(xyyy3=(K++D+vFFFFFFFFFrG   rM   c                    |                      |d          }|                      |d          }|K|                     |          }|d         }|                     dd |          }|                     | j        |          3|                     | j        dd          }t          |          | j        |<   | j        |         }	|dk    rt|                     |dg           }
t          |
          }t          d	|          D ]<}|d
z
  |z
  }|
|         }| 
                    |          }|	                    |           =n*| 
                    |          }|	                    |           |                    |	|           d S d S )Nrf   
product_idri   r   r6   r3   trade_snapshotr   r   rg   )r   rp   get_message_hashr   r   r   r?   r   rm   rl   parse_ws_tradern   r   )rD   rM   rZ   channelr   rp   ri   rV   r6   tradesArrayr   rs   rr   indexitemr   s                   rF   handle_tradezkrakenfutures.handle_trade  s   J ""7F33##G\::[[**FH%F//vFFK~~dk622:"//mTRR&0&=&=F#+f-K***2>>Vq&)) . .A"QJNE!%=D //55E&&u----	. ++G44""5)))NN;44444'  rG   c                    |                      |d          }|                     ||          }|                     |d          }|                     ||                      |d          |                      |d          ||                     |          d |                      |d          |                      |d          d|                      |d          |                      |d	          d d d d d
d|          S )Nr   timeuidri   r5   r   takerpriceqtyratecostcurrencyr   r   ri   r   r   orderr5   r   takerOrMakerr   amountr  fee)r   safe_marketr   
safe_trader   )rD   r   rp   r   r   s        rF   r   zkrakenfutures.parse_ws_trade  s    ##E<88!!(F33%%eV44	""5%00&&vx88"Y//$$UF33$$UF33#%%eW55&&ue44   
  
$ %  	rG   c                 `   |                      |d          }|                     |d          }|                     ||                     |d          |                     ||          ||                     |          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d	          d d |                     |d
          |                     |d          dd|          S )N	tradeTimeri   tradeIdorderIdr5   r   	matchRoler   tradeAmounttradeFeefeeCurrencyr   r  )r   r   r
  r   r   safe_string_lower)rD   r   rp   r   r   s        rF   parse_ws_order_tradez"krakenfutures.parse_ws_order_trade)  s6   : %%e[99	##E844""5)44&&x88"Y//%%eY77**5&99$$UF33 ,,UK@@%%eW55&&um<<((
;; ,,UMBB  
  
$ %  	rG   c                 	   | j         }|1|                     | j        d          }t          |          }|| _         |                     |d          }||                     |d          }d}|                     |          }|                     |d          }	|                     |j        |i           }
|                     |
|	          }|                     |d          }||dk    r^|                     |          }|	                    |           |
                    ||           |
                    ||dz   |z              nB|                     |          }|d	         g |d	<   |d	         	                    |           |d
         |d<   d}d}|d	         }t          dt          |                    D ]f}||         }t          j        ||                     |d                             }t          j        ||                     |d                             }gt          j        |d          rt          j        ||          |d<   ||d<   |d         |                     |d                   }t          j        ||                     |d                             |d<   |d         1t          j        |                     |d                   |          |d<   |d         (d d|                     |d         d                   d|d<   |d         d         n|d         d         `|                     |d         d                   }|                     |d         d                   }t          j        ||          |d         d<   |	                    |                     |                     |
                    ||dz   |z              |
                    ||           n|                     |d          }|rt          dt          |                    D ]n}||         }|d         |d         k    rR|                     |ddi          ||<   |
                    |d           |
                    |d|d         z               no|S )Nr7   r  r   r   order_idreasonedited_by_userrh   r   r   lastTradeTimestampr   r   r  r  averagefilled	remainingr  r  r   	is_cancelr   statuscanceledorders:ri   )r   r   r?   r   rO   r   r   hashmapparse_ws_orderrn   r   r   rl   rm   r   
string_addnumber_to_stringr   
string_div
string_sub
safe_orderrR   )rD   rM   rZ   r   r]   r  r   rV   ri   r  previousOrderspreviousOrderr  parsedr   	totalCosttotalAmountr   rr   currentTradestringOrderFilledstringOrderCoststringTradeCostisCancelcurrentOrders                            rF   handle_orderzkrakenfutures.handle_order\  s   J >%%dlMBBE+E22F DK11''|<<H"K%%h//F&&uj99G!__V^VRHHN OONGDDM%%gx88F%65E+E+E,,U33f%%%v{333v{S'86'ABBBB++E22 *2.0M(+h'..u5556;K6H23	!&x0q#f++.. q qA#)!9L ' 29d>S>ST`agTh>i>i j jI")"4[$BWBWXdemXnBoBo"p"pKK$[#66 Z/6/A)[/Y/YM),(1f% *6(,(=(=mH>U(V(V%.5.@ARTXTiTijopxjyTzTz.{.{M(+$X.:5<5GH]H]^klt^uHvHv  yJ  6K  6Kk2 '/ $ #$($9$9%,z:R$S$S, ,M%(
 "%(0<5<PVCWCc&*&;&;M%<PQW<X&Y&YO&*&;&;E%L<P&Q&QO3:3EoWf3g3gM%(0doom<<===v{S'86'ABBBv{3333w<<H 
q#f++..  A#)!9L#D)WZ-@@@$(KK$j? % %q	 vx888vy<;Q/QRRR A rG   c                    |                      |dg           }|                     | j        d          }t          |          | _        i }| j        }t          dt          |                    D ]A}||         }|                     |          }	|	d         }
d||
<   |                    |	           Bt          | j                  }|dk    r|	                    | j        d           t          |                                          }t          dt          |                    D ],}||         }
d|
z   }|	                    | j        |           +d S d S )Nr   r7   r   ri   Tr   )rO   r   r?   r   r   rl   rm   r"  rn   r   listkeys)rD   rM   rZ   r   r]   r\   cachedOrdersrr   r  r*  ri   rs   r6  rV   s                 rF   handle_order_snapshotz#krakenfutures.handle_order_snapshot  sP   ` (B77!!$,>>,U33{q#f++&& 	( 	(A1IE((//FH%F"GFO''''T[!!A::NN4;111''D1c$ii(( 9 9a'&0t{K8888 :9 9rG   c           
         |                      |d          }|}d }||                      |d          }|du rd}|                     |d          }|                     |d          }|                     |d          }|                     i d|d	|                     ||          d
|                     |d          dd d|d|                     |          dd d|                     |d          dd dd d|dk    rdndd|                     |d          d|                     |d          d|                     |d          d|                     |d          dd dd |                     |d           d |d d d d!d d"          S )#Nr  r  T	cancelledr   r   	directionr   ri   r   r  clientOrderIdr   r   r  r5   timeInForcepostOnlyr   r   buysellr   limit_price	stopPrice
stop_pricetriggerPricer  r   r  r  r  r   )r  r  r  r  r   )rO   r   r   r'  r   r   )	rD   r  rp   isCancelledunparsedOrderr  r   r   r;  s	            rF   r"  zkrakenfutures.parse_ws_order*  s7   N ooe[99" OOE7;;Md""$##M<@@$$]F;;	%%m[AA	  
E 
d&&x88 
 $""=*== 
 T	 

  
 Y// 
 !$ 
 D$$]F;; 
 4 
  
 i1nnEE6 
 T%%m]CC 
 ))-FF 
 D,,]LII 
 d&&}e<< 
  D! 
" t# 
$ &&}h??  
 5 
  
  
   	rG   c                     |                      |d          }|V|                     |          }|d         }|| j        |<   |                     dd |          }|                    ||           d S d S )Nr   ri   r   )r   parse_ws_tickerr|   r   r   rD   rM   rZ   r   r   ri   rV   s          rF   handle_tickerzkrakenfutures.handle_tickerx  s    @ ##G\::))'22FH%F#)DL //$GGKNN6;/////  rG   c                     |                      |d          }|V|                     |          }|d         }|| j        |<   |                     dd |          }|                    ||           d S d S )Nr   ri   r   )r   rH  r   r   r   rI  s          rF   handle_bid_askzkrakenfutures.handle_bid_ask  s    " ##G\::))'22FH%F$*DM&!//$GGKNN6;/////  rG   c                    |                      |d          }|                     ||          }|d         }|                     |                      |d                    }|                      |d          }|                     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          S )Nr   ri   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   )rD   r   rp   r   ri   r   rO  s          rF   rH  zkrakenfutures.parse_ws_ticker  s   b ##FL99!!(F33!NN4#3#3FJ#G#GHH	// !
F!
f!
 !
 Y//	!

 D!
 4!
 4##FE22!
 ))&*==!
 4##FE22!
 ))&*==!
 D!
 D!
 T!
 D!
 T!
  d&&vx88!!
" $#!
$ **68<<++FMBB))&+>>**67;;-!
 !
 !
   	rG   c                    |                      |d          }|                     |          }|d         }|                     dd |          }|                     |j        |i           }|                     |d          }|                     |d          }	|                     i |          | j        |<   | j        |         }
|                     |d          }|                     |d          }t          dt          |                    D ]T}||         }|                     |d	          }|                     |d
          }|
d         }|                    ||           Ut          dt          |                    D ]T}||         }|                     |d	          }|                     |d
          }|
d         }|                    ||           U|	|
d<   |                     |	          |
d<   ||
d<   |                    |
|           d S )Nr   ri   r_   r]   r   bidsasksr   r   r   r   )r   r	  r   	safe_dictrP   r   
order_book
orderbooksr   rl   rm   r   storer   r   )rD   rM   rZ   r   rp   ri   rV   subscriptionr]   r   r_   re  rf  rr   rR  r   r   bidsSiderU  asksSides                       rF   handle_order_book_snapshotz(krakenfutures.handle_order_book_snapshot  s   < ##G\::!!(++!++KvFF~~f&:KLL!!,88%%g{;;	"&//"e"<"<OF+	~~gv..~~gv..q#d))$$ 	' 	'Aq'C$$S'22E""3..C (HNN5#&&&&q#d))$$ 	' 	'Aq'C$$S'22E""3..C (HNN5#&&&&!*	+ $Y 7 7	*$	(y+.....rG   c                 P   |                      |d          }|                     |          }|d         }|                     dd |          }| j        |         }|                      |d          }|                     |d          }	|                     |d          }
|                     |d          }|dk    r|d	         }|                    |	|
           n|d
         }|                    |	|
           ||d<   |                     |          |d<   |                    ||           d S )Nr   ri   r_   r   r   r   r   r@  rf  re  r   )	r   r	  r   ri  r   r   rj  r   r   )rD   rM   rZ   r   rp   ri   rV   r_   r   r   r   r   rf  re  s                 rF   handle_order_bookzkrakenfutures.handle_order_bookB  s/    ##G\::!!(++!++KvFFOF+	00  '22w..%%g{;;	6>>V$DJJuc""""V$DJJuc"""!*	+ $Y 7 7	*y+.....rG   c                    |                      |d          }|                      |d          }|                      |d          }d}|                     |d          }|t          |                                          }|||                     |          d}	t          dt          |                    D ]Q}
||
         }|                     |          }|                                 }| 	                    ||          |d<   ||	|<   R|	| j
        d	<   |                     | j
        d	                   | j
        d	<   |                    |	|           |}t          |                                          }|||                     |          d}t          dt          |                    D ]}
||
         }|                     |          }|                                 }|                      ||          }| 	                    |d
          }|                     |          }| 	                    |d          |d<   | 	                    |d          |d<   | 	                    |d          |d<   i ||<   |||         |<   || j
        d<   |                     | j
        d                   | j
        d<   |                    | j
        d         |dz              |^|                      |di           }t          |                                          }|||                     |          d}t          dt          |                    D ]}
||
         }|                      ||          }|                     |          }|                                 }| 	                    |d          |d<   | 	                    |d          |d<   | 	                    |d          |d<   |||<   || j
        d<   |                     | j
        d                   | j
        d<   |                    | j
        d         |dz              |                    | j
        |           d S )Nholdingr   r   r   r   )r   r   r   r   totalcashunit	availablefreer   usedr   margin
currenciescollateral_valuequantityflex)rO   r   r5  r6  r   rl   rm   safe_currency_coder   r   r   safe_balancer   r   )rD   rM   rZ   rr  r   flexFuturesrV   r   holdingKeysholdingResultrr   keycode
newAccountfuturesKeysfuturesResultri   rW   
currencyIdflexFutureCurrenciesflexFuturesKeysflexFuturesResult
flexFutures                          rF   handle_balancezkrakenfutures.handle_balancea  sB   d //'955//'955oog~>> %%g{;;	w||~~..K& LL33# #M
 1c+..// 1 1!!n..s33!\\^^
&*&6&6w&D&D
7#&0d###0DL #'#4#4T\&5I#J#JDL NN=+666w||~~..K& LL33# #M
 1c+..// 9 9!!n))#..!\\^^
#66!--ff==
..z::%)%5%5fk%J%J
6"%)%5%5f>N%O%O
6"&*&6&6vy&I&I
7#(*f%.8f%d++%2DL"%)%6%6t|H7M%N%NDL"NN4<1;3JKKK"#'??;b#Q#Q "#7#<#<#>#>??O& LL33' '
 1c/2233 5 5%a(!__-A3GG
..s33!\\^^
%)%5%5j+%N%N
6"%)%5%5jBT%U%U
6"&*&6&6z:&N&N
7#*4!$''#4DL #'#4#4T\&5I#J#JDL NN4</~1MNNNt|[11111rG   c                 \   |                      |dg           }| j        }|2|                     | j        dd          }t	          |          }|| _        i }t          dt          |                    D ]?}||         }|                     |          }	d||	d         <   |                    |	           @t          |
                                          }
t          dt          |
                    D ]%}|
|         }d|z   }|                    ||           &|                    |d           d S )	Nr   r6   r3   r   Tri   z	myTrades:r   )rO   r   r   r?   r   rl   rm   parse_ws_my_tradern   r5  r6  r   )rD   rM   rZ   r   storedr]   tradeSymbolsrr   r   parsedTradetradeSymbolKeysri   rV   s                rF   handle_my_tradeszkrakenfutures.handle_my_trades4  s5   4 '266>%%dlM4HHE+E22F"DMq#f++&& 	' 	'A1IE0077K26LX./MM+&&&&|002233q#o..// 	0 	0A$Q'F%.KNN6;////vz*****rG   c                    |                      |d          }|                     |d          }|                     ||          }|                     |d          }|                     |d          }|                     ||                     |d          ||                     |          |                     |d          |                     |d          |                     |d          |rdnd	|                     |d
          |                     |d          |                     |d          d |                     |          |                     |d          d dd          S )Nr   r   r?  fee_currencyfill_idri   r  r5   r@  	fill_typer   r   fee_paid)r  r  r  )r   r   r   r   ri   r  r5   r   r  r   r  r  r  )r   r   r	  rO   r
  r   r~  )rD   r   rp   r   r   isBuyfeeCurrencyIds          rF   r  zkrakenfutures.parse_ws_my_tradea  se   & %%eV44	##E<88!!(F33u--((??""5)44"Y//&&vx88%%eZ88$$UF33".EE ,,UK@@%%eW55&&ue44 33MBB((
;;  
  
   	rG   unifiedNamechannelNamec                   K   |                                   d {V  |                     |d ddd          }g }t          dt          |                    D ]E}|                    |                     |d |                     ||                                        F|                     |          }d||d}	| j        d         d         }
| 	                    |
|| 
                    |	|          ||           d {V S )NFTr   re   )rJ   rf   rj   r1   r   )rk   r   rl   rm   rn   r   ri   
market_idsr>   watch_multiplerR   )rD   r  r  r\   subscriptionArgsrT   r   rr   rq   rY   rU   s              rF   ra   z krakenfutures.watch_multi_helper  s     !!!!!!!!!%%gtUD%HHq#g,,'' 	d 	dA  !6!6{D$++V]^_V`JaJa!b!bccccOOG,,	 $
 

 it$((mT[[RX=Y=Y[hjz{{{{{{{{{rG   unifiedElementNamesubChannelNamec                 F    |d u}|}|s|dz  }n|d|z   z  }||d|z   z  }|S )Nsrh   # )rD   r  r  ri   
withSymbolrV   s         rF   r   zkrakenfutures.get_message_hash  sP     4'
( 	(3KK3<'K%3//KrG   c                     |                      |d          }	 t          | j        dz   |z             # t          $ r }|                    |           Y d }~dS d }~ww xY w)NrZ    F)r   r   r   	Exceptionreject)rD   rM   rZ   errMsgerrors        rF   handle_error_messagez"krakenfutures.handle_error_message  su     !!'955	# 6777 	 	 	MM%   55555	s   2 
AAAc                 &   |                      |d          }|dk    r|                     ||           d S |dk    r|                     ||           d S |dk    r|                                 |_        d S ||                      |d          }| j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        | j
        | j        | j        | j        | j        d}|                     ||          }| |||           d S d S d S )NrJ   rI   alertpongrf   )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lastPongrJ  rL  r   rp  rn  r3  r8  r  r  r   rO   )rD   rM   rZ   rJ   rf   methodsmethods          rF   handle_messagezkrakenfutures.handle_message  sG     '22K$$VW55555g%%fg66666f__"//11FOOO]##GV44D,#2*"&"3.!%!@'+'8040J."&"7#0(,(B /%)%8"&"7! G$ __Wd33F!vw'''''- ]* "!rG   c                 l   |                      |d          }d}|dk    r|                      |d          }|                     |                     |          dd          }|                     | j                  }|                     ||t          j        d          }|| j        d<   || j        d<   |                      |j	        |          }	|	
                    d	           nTt          | j        d
z   |                     |          z             }
|                    |
|           ||j        v r|j        |= |S )z}
 @ignore
        https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
        rJ   rI   r  rZ   sha256binarybase64rv   Tr  )rO   hashencodebase64_to_binarysecrethmachashlibsha512r?   r   r   r   r   jsonr  rP   )rD   rM   rZ   rJ   rV   rI   hashedChallengebase64Secret	signaturerW   r  s              rF   r  z!krakenfutures.handle_authenticate  s#    11!G;;I"iiI(>(>(SSO00==L		/<QYZZI(1DL%.7DL*+__V^[AAFNN4    '#		'8J8J(JKKEMM%---f222(5rG   )N)NN)7__name__
__module____qualname__r   rC   r[   r   strr   r
   rb   rt   ry   r   r}   r   r   r{   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r  r3  r8  r"  rJ  rL  rH  rn  rp  r  r  r  ra   r   r   r  r  r  __classcell__)rE   s   @rF   r   r      s       0# 0 0 0 0 0 0d )+    8 SW_a ! !$s) !C !fo ! ! ! ! LN H H3 Hc H H H H< KM H HC Hc H H H H, 68   F     6:" E E7 E E E E E& 8<B F FW F7 F F F F" <@d[] S S SS S Sbfglbm S S S S OSaenp S Sd3i S S[^ Suyz  vA S S S S& @DB P PS P PS\ P P P P 8<$]ajl _ _W _C _WZ _quv~q _ _ _ _.12 12 12f3 3 3 3j 04$UYbd S S SC Ss Simnsit S S S S0 37TX\eg S SC Ss SRU Slpqvlw S S S S. *, G G G G G G*:56 :5 :5 :5 :5x# # # #J1 1 1 1fH6 H H H HTB9F B9 B9 B9 B9HL L L L\&0F &0 &0 &0 &0P0V 0 0 0 02M M M M^8/ 8/ 8/ 8/ 8/t/ / / / />Q2V Q2 Q2 Q2 Q2f++v ++ ++ ++ ++Z* * * *X _cuy  CE | |C |c |T[ | | | |  3  \_    6 t    ( ( (@&        rG   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  rG   rF   <module>r     s8       O O O O O O O O  v v v v v v v v v v v v v v v v v v v v v v v v v v v v 4 4 4 4 4 4       * * * * * * 0 0 0 0 0 0 . . . . . . % % % % % %a a a a aD&4 a a a a arG   