
    i                         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 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)
BalancesIntOrder	OrderBookPositionStrStringsTickerTickersTrade)Client)List)ExchangeError)AuthenticationError)ArgumentsRequired)Precisec            
           e Zd Z 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+Z/d3d,ed-edefd.Z0de fd/Z1d0 Z2de fd1Z3 xZ4S )4krakenfuturesc                    |                      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    \/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/ccxt/pro/krakenfutures.pyr@   zkrakenfutures.describe   s   mT : : C C E Ed#U !%  	
   u !% $U    e !$ +D t    !" t#$ *. $#!%"&/  6 : ?	   $#"#& #D!	 	 UY/H
 /H
 / / /	    c                 P  K   |                                   | j        d         d         }d}|                     |          }|                     |j        |          }|Hd| j        d}|                     ||          }|                     ||||           d{V }||j        |<   |S )z
         * @ignore
        authenticates the user to access private web socket channels
        :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
        :returns dict: response from exchange
        r.   r   	challengeN)eventapi_key)check_required_credentialsr;   client
safe_valuesubscriptionsapiKeyextendwatch)rA   paramsurlmessageHashrJ   futurerequestmessages           rC   authenticatezkrakenfutures.authenticateF   s       	'')))
 it$!S!!!5{CC>$; G kk'622G::c;MMMMMMMMF06F -rD   Nsymbolslimitreturnc                 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
        :see: 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bookrX   N)watch_multi_helperrX   )rA   rW   rX   rP   r[   s        rC   watch_order_book_for_symbolsz*krakenfutures.watch_order_book_for_symbols`   sM       11+vwQXZ_P`bhiiiiiiii	   rD   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 )*  
         * @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
        Nr.   r   	subscribe)rG   feedr      :symbolproduct_ids)	load_marketsr;   rangelenappend	market_idmarketrN   rO   )rA   r_   rW   rP   rQ   rb   	marketIdsrR   irf   lengthrm   rT   s                rC   subscribe_publiczkrakenfutures.subscribe_publicl   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GrD   rR   c                 B  K   |                                   d{V  |                                  d{V  | j        d         d         }d|| j        | j        d         | j        d         d}|                     ||          }|                     ||||           d{V S )ra   Nr.   r   rb   rF   signedChallenge)rG   rc   rH   original_challengesigned_challenge)rh   rV   r;   rM   r<   rN   rO   )rA   r_   rR   rP   rQ   rb   rT   s          rC   subscribe_privatezkrakenfutures.subscribe_private   s       !!!!!!!!!!!!!!!!!!it$ {"&,{"; $-> ?
 
	 ++i00ZZ[';GGGGGGGGGrD   rf   c                    K   |                                   d{V  |                     |          }|                     |g|           d{V }||         S )  
        watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
        :see: 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)rh   rf   watch_tickers)rA   rf   rP   tickerss       rC   watch_tickerzkrakenfutures.watch_ticker   sp       !!!!!!!!!V$$**F8V<<<<<<<<vrD   c                 
  K   |                                   d{V  |                     |dd          }|                     dd|d|           d{V }| j        ri }|||d         <   |S |                     | j        d|          S )rx   NFtickerrf   )rh   market_symbolsr]   
newUpdatesfilter_by_arrayrz   rA   rW   rP   r}   results        rC   ry   zkrakenfutures.watch_tickers   s       !!!!!!!!!%%gtU;;..x7DRXYYYYYYYY? 	F'-F6(#$M##DL(GDDDrD   c                    K   |                      dd|d|           d{V }| j        ri }|||d         <   |S |                     | j        d|          S )a  
        :see: 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_liteNrf   )r]   r   r   bidsasksr   s        rC   watch_bids_askszkrakenfutures.watch_bids_asks   st       ..xQUW]^^^^^^^^? 	F'-F6(#$M##DM8WEEErD   sincec                 D   K   |                      |g|||           d{V S )a,  
        get the list of most recent trades for a particular symbol
        :see: 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)rA   rf   r   rX   rP   s        rC   watch_tradeszkrakenfutures.watch_trades   s6       22F8UE6RRRRRRRRRrD   c                   K   |                      dd|d|           d{V }| j        rB|                     |d          }|                     |d          }|                    ||          }|                     |||dd          S )a-  
        :see: 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   rf   	timestampT)r]   r   	safe_listsafe_stringgetLimitfilter_by_since_limit)rA   rW   r   rX   rP   tradesfirsttradeSymbols           rC   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RrD   c                 B   K   |                      |g||           d{V S )a8  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: 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^   )rA   rf   rX   rP   s       rC   watch_order_bookzkrakenfutures.watch_order_book   s4       66xOOOOOOOOOrD   c                 T  K   |                                   d{V  d}|                     |          }|                     |          sdd                    |          z   }d|z   }|                     d||           d{V }| j        r|S |                     | j        |||d          S )a  
        :see: 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 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)rh   r~   is_emptyjoinrv   r   filter_by_symbols_since_limitr   )rA   rW   r   rX   rP   rR   newPositionss          rC   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]^^^rD   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   rd   r   rf   F)r   r   rK   ri   rj   parse_ws_positionsafe_integeriso8601rk   find_message_hashessplitr   r   resolve)rA   rJ   rU   cacherawPositionsr   ro   rawPositionpositionr   messageHashesrR   partssymbolsStringrW   r   s                   rC   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1rD   c                    |                      |d          }d}|                     |d          }|dk    rdn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balancer   longshortinfoidrf   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)rA   r   rm   marketIdr   r   r   s          rC   r   zkrakenfutures.parse_ws_position;  s   & ##Hl;;""8Y77!A++vvG!! #
H#
$#
 d&&x00#
 	#

 $#
  0 0;R S S#
 $**8]CC#
 T--h>>#
 $**85GHH#
 **7+=d>S>ST[>\>\+]+]^^#
 D#
 ))(LAA#
 D#
 f#
 #
  !#
"  !1!1(<P!Q!Q##
$ ,0!--h8HII'+/#
 #
 #
   	rD   c                 2  K   |                                   d{V  d}d}|#|                     |          }|d|d         z   z  }|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )a}  
        watches information on multiple orders made by the user
        :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
        :see: 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ordersre   rf   r   Trh   rm   rv   r   r   r   )	rA   rf   r   rX   rP   r_   rR   rm   r   s	            rC   watch_orderszkrakenfutures.watch_ordersl  s       !!!!!!!!![[((F3!111K--dKHHHHHHHH? 	3OOFE22E))&%TRRRrD   c                 2  K   |                                   d{V  d}d}|#|                     |          }|d|d         z   z  }|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )a=  
        watches information on multiple trades made by the user
        :see: 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myTradesre   rf   r   Tr   )	rA   rf   r   rX   rP   r_   rR   rm   r   s	            rC   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RrD   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 multiple orders made by the user
        :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-balances
        :param str symbol: not used by krakenfutures watchBalance
        :param int [since]: not used by krakenfutures watchBalance
        :param int [limit]: not used by krakenfutures watchBalance
        :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're   )rh   handle_option_and_paramsr   r   rv   )rA   rP   r_   rR   r   s        rC   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FrD   rJ   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 )Nrc   
product_idrf   r   r3   r0   trade_snapshotr   r   rd   )r   rm   get_message_hashr   r   r   r<   r   rj   ri   parse_ws_traderk   r   )rA   rJ   rU   channelr   rm   rf   rR   r3   tradesArrayr   rp   ro   indexitemr   s                   rC   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'  rD   c                    |                      |d          }|                     ||          }|                     |d          }|                     ||                      |d          |                      |d          ||                     |          d |                      |d          |                      |d          d|                      |d          |                      |d	          d d d d d
d|          S )Nr   timeuidrf   r2   r   takerpriceqtyratecostcurrencyr   r   rf   r   r   orderr2   r   takerOrMakerr   amountr   fee)r   safe_marketr   
safe_trader   )rA   r   rm   r   r   s        rC   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   
  
$ %  	rD   c                 `   |                      |d          }|                     |d          }|                     ||                     |d          |                     ||          ||                     |          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d	          d d |                     |d
          |                     |d          dd|          S )N	tradeTimerf   tradeIdorderIdr2   r   	matchRoler   tradeAmounttradeFeefeeCurrencyr   r   )r   r   r  r   r   safe_string_lower)rA   r   rm   r   r   s        rC   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  
  
$ %  	rD   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 )Nr4   r   r   r   order_idreasonedited_by_userre   r   r   lastTradeTimestamp0r   r   r  averagefilled	remainingr  r   r   	is_cancelr   statuscanceledorders:rf   )r   r   r<   r   rK   r   r   hashmapparse_ws_orderrk   r   r   ri   rj   r   
string_addr   	string_gt
string_div
string_sub
safe_orderrN   )rA   rJ   rU   r   rX   r   r   rR   rf   r	  previousOrderspreviousOrderr  parsedr   	totalCosttotalAmountr   ro   currentTradestringOrderFilledstringOrderCoststringTradeCostisCancelcurrentOrders                            rC   handle_orderzkrakenfutures.handle_orderA  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 rD   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   r4   r   rf   Tr  )rK   r   r<   r   r   ri   rj   r  rk   r   listkeys)rA   rJ   rU   r   rX   rW   cachedOrdersro   r   r&  rf   rp   r2  rR   s                 rC   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 9rD   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   rf   r   r  clientOrderIdr   r   r  r2   timeInForcepostOnlyr   r   buysellr   limit_price	stopPrice
stop_pricetriggerPricer  r   r   r  r  r   )r  r  r  r  r   )rK   r   r   r#  r   r   )	rA   r   rm   isCancelledunparsedOrderr  r   r   r7  s	            rC   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 
  
  
   	rD   c                     |                      |d          }|V|                     |          }|d         }|| j        |<   |                     dd |          }|                    ||           d S d S )Nr   rf   r}   )r   parse_ws_tickerrz   r   r   rA   rJ   rU   r   r}   rf   rR   s          rC   handle_tickerzkrakenfutures.handle_ticker]  s    @ ##G\::))'22FH%F#)DL //$GGKNN6;/////  rD   c                     |                      |d          }|V|                     |          }|d         }|| j        |<   |                     dd |          }|                    ||           d S d S )Nr   rf   r   )r   rD  r   r   r   rE  s          rC   handle_bid_askzkrakenfutures.handle_bid_ask  s    " ##G\::))'22FH%F$*DM&!//$GGKNN6;/////  rD   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          S )Nr   rf   lastTimelastr   r   r   highlowbid	bidVolumebid_sizeask	askVolumeask_sizevwapopenclosepreviousClosechanger   volumevolumeQuote)r  
baseVolumequoteVolume)r   r  	parse8601safe_tickerr   )rA   r}   rm   r   rf   r   rK  s          rC   rD  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)!
 !
 !
   	rD   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   rf   r[   rX   r   bidsasksr   r   r   r   )r   r  r   	safe_dictrL   r   
order_book
orderbooksr   ri   rj   r   storer   r   )rA   rJ   rU   r   rm   rf   rR   subscriptionrX   r   r[   r`  ra  ro   rN  r   r   bidsSiderQ  asksSides                       rC   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+.....rD   c                 P   |                      |d          }|                     |          }|d         }|                     dd |          }| j        |         }|                      |d          }|                     |d          }	|                     |d          }
|                     |d          }|dk    r|d	         }|                    |	|
           n|d
         }|                    |	|
           ||d<   |                     |          |d<   |                    ||           d S )Nr   rf   r[   r   r   r   r   r<  ra  r`  r   )	r   r  r   rd  r   r   re  r   r   )rA   rJ   rU   r   rm   rf   rR   r[   r   r   r   r   ra  r`  s                 rC   handle_order_bookzkrakenfutures.handle_order_book%  s/    ##G\::!!(++!++KvFFOF+	00  '22w..%%g{;;	6>>V$DJJuc""""V$DJJuc"""!*	+ $Y 7 7	*y+.....rD   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)rK   r   r1  r2  r   ri   rj   safe_currency_coder   r   r   safe_balancer   r   )rA   rJ   rU   rm  r   flexFuturesrR   r   holdingKeysholdingResultro   keycode
newAccountfuturesKeysfuturesResultrf   rS   
currencyIdflexFutureCurrenciesflexFuturesKeysflexFuturesResult
flexFutures                          rC   handle_balancezkrakenfutures.handle_balanceD  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1rD   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   r3   r0   r   Trf   z	myTrades:r   )rK   r   r   r<   r   ri   rj   parse_ws_my_traderk   r1  r2  r   )rA   rJ   rU   r   storedrX   tradeSymbolsro   r   parsedTradetradeSymbolKeysrf   rR   s                rC   handle_my_tradeszkrakenfutures.handle_my_trades  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*****rD   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_idrf   r  r2   r<  	fill_typer   r   fee_paid)r   r   r   )r   r   r   r   rf   r   r2   r   r  r   r  r   r  )r   r   r  rK   r  r   ry  )rA   r   rm   r   r   isBuyfeeCurrencyIds          rC   r  zkrakenfutures.parse_ws_my_tradeD  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((
;;  
  
   	rD   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   rb   )rG   rc   rg   r.   r   )rh   r~   ri   rj   rk   r   rf   
market_idsr;   watch_multiplerN   )rA   r  r  rW   subscriptionArgsrP   r   ro   rn   rT   rQ   s              rC   r]   z krakenfutures.watch_multi_helperp  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{{{{{{{{{rD   unifiedElementNamesubChannelNamec                 F    |d u}|}|s|dz  }n|d|z   z  }||d|z   z  }|S )Nsre   # )rA   r  r  rf   
withSymbolrR   s         rC   r   zkrakenfutures.get_message_hash  sP     4'
( 	(3KK3<'K%3//KrD   c                     |                      |d          }	 t          | j        dz   |z             # t          $ r }|                    |           Y d }~d S d }~ww xY w)NrU    )r   r   r   	Exceptionreject)rA   rJ   rU   errMsgerrors        rC   handle_error_messagez"krakenfutures.handle_error_message  sz     !!'955	!# 6777 	! 	! 	!MM%         	!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 )NrG   rF   alertpongrc   )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lastPongrF  rH  r   rk  ri  r/  r4  r  r  r   rK   )rA   rJ   rU   rG   rc   methodsmethods          rC   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'''''- ]* "!rD   c                 8   |                      |d          }d}|dk    r|                      |d          }|                     |                     |          dd          }|                     | j                  }|                     ||t          j        d          }|| j        d<   || j        d<   |	                    ||           nTt          | j        d	z   |                     |          z             }	|                    |	|           ||j        v r|j        |= |S )
z
         * @ignore
        :see: https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
        rG   rF   r  rU   sha256binarybase64rs   r  )rK   hashencodebase64_to_binarysecrethmachashlibsha512r<   r   r   r   jsonr  rL   )
rA   rJ   rU   rG   rR   rF   hashedChallengebase64Secret	signaturer  s
             rC   r  z!krakenfutures.handle_authenticate  s    11!G;;I"iiI(>(>(SSO00==L		/<QYZZI(1DL%.7DL*+NN7K0000'#		'8J8J(JKKEMM%---f222(5rD   )N)NN)5__name__
__module____qualname__r@   rV   r   strr   r   r^   rq   rv   r   r{   r   r   ry   r   r
   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r  r/  r4  r  rF  rH  rD  ri  rk  r  r  r  r]   r   r  r  r  __classcell__)rB   s   @rC   r   r      s       0 0 0 0 0d )+    4 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 04$UYbd 
S 
S 
SC 
Ss 
Simnsit 
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/ / / /b 04$UYbd S S SC Ss Simnsit S S S S, 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 02K K K KZ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 ! ! ! !( ( (@&        rD   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   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   r   ccxt.base.preciser   async_supportr   r  rD   rC   <module>r     s,       O O O O O O O O  k k k k k k k k k k k k k k k k k k k k k k k k 4 4 4 4 4 4       * * * * * * 0 0 0 0 0 0 . . . . . . % % % % % %B B B B BD&4 B B B B BrD   