
    i                     F   d dl Zd dlmZmZm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 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  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ArrayCacheByTimestamp)IntNumOrder	OrderBook	OrderSide	OrderTypeStrStringsTickerTickersTrade)Client)List)ExchangeError)AuthenticationError)PermissionDenied)AccountSuspended)
BadRequest)	BadSymbol)InsufficientFunds)InvalidOrder)OrderNotFound)NotSupported)RateLimitExceeded)ExchangeNotAvailable)InvalidNonce)Precisec                   J    e Zd Z fdZdi fdededededede	fd	Z
d
 Zdi fdedededededede	fdZdi fdee         defdZdi fdedede	fdZd Zdi fdefdZd Zd ZdefdZdefdZd Zi fdZ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i fde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$i f fd%	Z(i fd&Z)defd'Z*defd(Z+d) Z,d=d*Z-defd+Z.i fd,Z/dddi fdededefd-Z0dddi fdedededee          fd.Z1d=defd/Z2d=d0Z3dddi fdedededee	         fd1Z4d=defd2Z5d=d3Z6ddi fd4ed5edefd6Z7d>d7ed8edefd9Z8defd:Z9defd;Z:defd<Z; xZ<S )?krakenc                    |                      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iidddi ddddt          ii dt          dt
          dt          dt          d t          d!t
          d"t          d#t          d$t          d%t          d&t          d't          d(t          d)t          d*t          d+t          d,t          i d-t          d.t          d/t          d0t          d1t          d2t          d3t          d4t          d5t          d6t          d7t          d8t          d9t          d:t          d;t          d<t          d=t          t          t          t          t          t          t          t          t          t          t          d>
d?id@          S )ANwsTwatchBalanceFwatchMyTrades
watchOHLCVwatchOrderBookwatchOrderBookForSymbolswatchOrderswatchTickerwatchTickerswatchTradeswatchTradesForSymbolscreateOrderWseditOrderWscancelOrderWscancelOrdersWscancelAllOrdersWsapizwss://ws.kraken.comzwss://ws-auth.kraken.comzwss://beta-ws.kraken.comzwss://beta-ws-auth.kraken.com)publicprivatebetazbeta-private  )tradesLimit
OHLCVLimitordersLimitsymbolsByOrderIdchecksumzEvent(s) not foundzAlready subscribedz'Currency pair not in ISO 4217-A3 formatzMalformed requestzPair field must be an arrayz1Pair field unsupported for self subscription typezPair(s) not foundz*Subscription book depth must be an integerz Subscription depth not supportedz$Subscription field must be an objectzSubscription name invalidz%Subscription object unsupported fieldz-Subscription ohlc interval must be an integerz(Subscription ohlc interval not supportedz#Subscription ohlc requires intervalzEAccount:Invalid permissionsz EAuth:Account temporary disabledzEAuth:Account unconfirmedzEAuth:Rate limit exceededzEAuth:Too many requestsz+EDatabase: Internal error(to be deprecated)z EGeneral:Internal error[:<code>]zEGeneral:Invalid argumentsz$EOrder:Cannot open opposing positionzEOrder:Cannot open positionz2EOrder:Insufficient funds(insufficient user funds)z[EOrder:Insufficient margin(exchange does not have sufficient funds to allow margin trading)zEOrder:Invalid pricez EOrder:Margin allowance exceededzEOrder:Margin level too lowzaEOrder:Margin position size exceeded(client would exceed the maximum position size for self pair)z,EOrder:Order minimum not met(volume too low)zEOrder:Orders limit exceededzEOrder:Positions limit exceededzEOrder:Rate limit exceeded)
z&EOrder:Scheduled orders limit exceededzEOrder:Unknown positionzEOrder:Unknown orderzEOrder:Invalid orderzEService:Deadline elapsedz#EService:Market in cancel_only modez"EService:Market in limit_only modez!EService:Market in post_only modezEService:UnavailablezETrade:Invalid request)exactbroad)hasurlsoptions
exceptions)deep_extendsuperr"   describer   r   r   r   r   r   r   r   r   r   r   r   )self	__class__s    U/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/ccxt/pro/kraken.pyrF   zkraken.describe   s^   fd 3 3 < < > >d   d	
 !$ +D t t  t (   t   !$  $T!* "7#= :(G	 	  $"#$&   ,j-,j-A9- ,Z- 6z	-
 LZ- ,Y- Ej- ;J- ?
- 4Z- @- H- CJ- >z- 78H-  ;<L!-" 45H#- -$ 45F%-& 23D'-( F})-* ;M+-, 5j--. ?/-0 6|1-2 MN_3-4 v  xI5-6 /7-8 ;L9-: 6|;-< |  ~J=-> G?-@ 7A-B :<C-D 56GE- -F CO3@0=0<5I?K>J=I0D2<Y- - -	2 24S^A
 ^A
 ^ ^ ^	    Nsymboltypesideamountpricereturnc           
        K   |                                   d{V  |                                  d{V }|                     |          }| j        d         d         d         }	|                                 }
|
}d||
|||d         |                     ||          d}|                     d|||||          \  }}|                     |	||                     ||          |           d{V S )	a  
        :see: https://docs.kraken.com/websockets/#message-addOrder
        create a trade order
        :param str symbol: unified symbol of the market to create an order in
        :param str type: 'market' or 'limit'
        :param str side: 'buy' or 'sell'
        :param float amount: how much of currency you want to trade in units of base currency
        :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nr4   r$   r6   addOrderwsId)eventtokenreqid	ordertyperL   pairvolumer/   	load_marketsauthenticatemarketrA   
request_idamount_to_precisionorderRequestwatchextend)rG   rK   rL   rM   rN   rO   paramsrU   r]   url	requestIdmessageHashrequests                rI   create_order_wszkraken.create_order_ws~   s      !!!!!!!!!''))))))))V$$it$Y/OO%%	6N..vv>>
 
 ++OVT7TY[abbZZ[$++gv2N2NP[\\\\\\\\\rJ   c                     |                      |          }|                     |d          }|                    ||           d S NrV   )parse_order
safe_valueresolve)rG   clientmessageorderrf   s        rI   handle_create_edit_orderzkraken.handle_create_edit_order   sD    (   ))oogw77uk*****rJ   idc           	        K   |                                   d{V  |                                  d{V }|                     |          }	| j        d         d         d         }
|                                 }|}d||||	d         |                     ||          d}|                     d|||||          \  }}|                     |
||                     ||          |           d{V S )	a  
        edit a trade order
        :see: https://docs.kraken.com/websockets/#message-editOrder
        :param str id: order id
        :param str symbol: unified symbol of the market to create an order in
        :param str type: 'market' or 'limit'
        :param str side: 'buy' or 'sell'
        :param float amount: how much of the currency you want to trade in units of the base currency
        :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nr4   r$   r6   	editOrderrS   )rT   rU   rV   orderidrX   rY   r0   rZ   )rG   rr   rK   rL   rM   rN   rO   rc   rU   r]   rd   re   rf   rg   s                 rI   edit_order_wszkraken.edit_order_ws   s      !!!!!!!!!''))))))))V$$it$Y/OO%%	 6N..vv>>
 
 ++M64RWY_``ZZ[$++gv2N2NP[\\\\\\\\\rJ   idsc                 >  K   |                                   d{V  |                                  d{V }| j        d         d         d         }|                                 }|}d|||d}|                     |||                     ||          |           d{V S )a  
        :see: https://docs.kraken.com/websockets/#message-cancelOrder
        cancel multiple orders
        :param str[] ids: order ids
        :param str symbol: unified market symbol, default is None
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
        Nr4   r$   r6   cancelOrderrT   rU   rV   txid)r[   r\   rA   r^   ra   rb   )	rG   rw   rK   rc   rU   rd   re   rf   rg   s	            rI   cancel_orders_wszkraken.cancel_orders_ws   s       !!!!!!!!!''))))))))it$Y/OO%%	"	
 
 ZZ[$++gv2N2NP[\\\\\\\\\rJ   c                   K   |                                   d{V  |                                  d{V }| j        d         d         d         }|                                 }|}|                     |dd|          }|                     |ddg          }d|||gd}	|                     |||                     |	|          |           d{V S )	a  
        :see: https://docs.kraken.com/websockets/#message-cancelOrder
        cancels an open order
        :param str id: order id
        :param str symbol: unified symbol of the market the order was made in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nr4   r$   r6   userrefclientOrderIdry   rz   )r[   r\   rA   r^   safe_value_2omitra   rb   )
rG   rr   rK   rc   rU   rd   re   rf   r   rg   s
             rI   cancel_order_wszkraken.cancel_order_ws   s       !!!!!!!!!''))))))))it$Y/OO%%	))&)_bQQ6I#?@@""O	
 
 ZZ[$++gv2N2NP[\\\\\\\\\rJ   c                 ^    |                      |d          }|                    ||           d S rj   rl   rm   rG   rn   ro   reqIds       rI   handle_cancel_orderzkraken.handle_cancel_order   1     11w&&&&&rJ   c                 n  K   |t          | j        dz             |                                  d{V  |                                  d{V }| j        d         d         d         }|                                 }|}d||d}|                     |||                     ||          |           d{V S )a  
        :see: https://docs.kraken.com/websockets/#message-cancelAll
        cancel all open orders
        :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
        :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>`
        NzM cancelAllOrdersWs() does not support cancelling orders in a specific market.r4   r$   r6   	cancelAll)rT   rU   rV   )r   rr   r[   r\   rA   r^   ra   rb   )rG   rK   rc   rU   rd   re   rf   rg   s           rI   cancel_all_orders_wszkraken.cancel_all_orders_ws  s       tw)xxyyy!!!!!!!!!''))))))))it$Y/OO%%	 
 

 ZZ[$++gv2N2NP[\\\\\\\\\rJ   c                 ^    |                      |d          }|                    ||           d S rj   r   r   s       rI   handle_cancel_all_orderszkraken.handle_cancel_all_orders"  r   rJ   c                    |d         }|                      | j        d         |          }|d         }|                     dd |          }|d         }|                     |d         d          }	d }
|                     |d         d          }||	t	          j        ||	          }
|                     |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d dd ||
|d           }|| j        |<   |                    ||           d S )!N   marketsByWsNamerK   ticker   pr   vc	timestampdatetimehighhlowlbidb	bidVolume   aska	askVolumevwapopenocloselastpreviousClosechange
percentageaverage)
baseVolumequoteVolumeinfo)	rl   rB   get_message_hashsafe_stringr    
string_mulsafe_tickertickersrm   )rG   rn   ro   subscriptionwsNamer]   rK   rf   r   r   r   r   r   results                 rI   handle_tickerzkraken.handle_ticker.  so   & .?!@&II!++HdFCCsQ//%%fSk155
!d&6!,Z>>KsQ//!! #
f#
#
 #
 D$$VC[!44	#

 4##F3K33#
 4##F3K33#
 ))&+q99#
 4##F3K33#
 ))&+q99#
 D#
 D$$VC[!44#
 T#
 D#
 T#
 d#
  $!#
" t##
$ %&)#
 #
 #
  ,  &Vv{+++++rJ   rn   c                 ~   |                      |d          }|                      |d          }|                     | j        d         |          }|d         }|                     |d |          }|                     | j        |          }	|	5|                     | j        dd          }
t          |
          }	|	| j        |<   |                     |dg           }|                     ||          }t          dt          |                    D ]}|	
                    ||                    |                    |	|           d S )	Nr   r   r   rK   r9   r8   r   r   )r   rl   rB   r   tradessafe_integerr   parse_tradesrangelenappendrm   )rG   rn   ro   r   r   namer]   rK   rf   storedlimitr   parsedis                 rI   handle_tradeszkraken.handle_tradese  s2    !!'1--++.?!@&II!++D$??f55>%%dlM4HHE&&F"(DK!R00""6622q#f++&& 	% 	%AMM&)$$$$v{+++++rJ   c           	      H   |                      |di           }|                     |d          }|                     |d          }|                     |d          }|                      | j        d         |          }|d         }	|                     |          }
|                     |
          }|
r|                      |d          }|dz   |
z   dz   |z   }|                     |d          }||z  }|                     |d	z            }||                     |d
          |                     |d          |                     |d          |                     |d          |                     |d          g}|                      | j        |	i           | j        |	<   |                      | j        |	         |
          }|;|                     | j        dd	          }t          |          }|| j        |	         |
<   |
                    |           |                    ||           d S d S )Nr   intervalr   r   r   rK   r   :r8   r            r:   )rl   r   r   rB   find_timeframeparse_timeframe
safe_floatparse_to_intohlcvsr   r   rm   )rG   rn   ro   r   r   r   r   r   r]   rK   	timeframedurationcandlerf   r   tsr   r   r   s                      rI   handle_ohlcvzkraken.handle_ohlcv  s   & |^R@@$$T:66f--!!'1--.?!@&II!''11	''	22 __Wa00F*y036?K22I!I""9t#344B**********F #'//$+vr"J"JDK__T[%8)DDF~))$,dKK.u5517F#I.MM&!!!NN6;/////+ ! rJ   c                 z    |                      |                     | j        dd          d          }|| j        d<   |S )NrV   r   r   )sumr   rB   )rG   rV   s     rI   r^   zkraken.request_id  s:    **4<!DDaHH %WrJ   c                   K   |                                   d {V  |                     |          }|                     |d         d          }|dz   |z   }| j        d         d         d         }|                                 }d||gd|id	}	|                     |	|          }
|                     |||
|           d {V S )
Nr   wsnamer   r4   r$   r5   	subscriber   rT   rV   rX   r   )r[   r]   rl   rA   r^   rD   ra   )rG   r   rK   rc   r]   r   rf   rd   re   r   rg   s              rI   watch_publiczkraken.watch_public  s      !!!!!!!!!V$$::Sj6)it$X.OO%%	  	
 	
	 ""9f55ZZ[';GGGGGGGGGrJ   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
        :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)r[   rK   watch_tickers)rG   rK   rc   r   s       rI   watch_tickerzkraken.watch_ticker  sp       !!!!!!!!!V$$**F8V<<<<<<<<vrJ   symbolsc                 
  K   |                                   d{V  |                     |dd          }|                     dd|d|           d{V }| j        ri }|||d         <   |S |                     | j        d|          S )r   NFr   rK   )r[   market_symbolswatch_multi_helper
newUpdatesfilter_by_arrayr   )rG   r   rc   r   r   s        rI   r   zkraken.watch_tickers  s       !!!!!!!!!%%gtU;;..x7DRXYYYYYYYY? 	F'-F6(#$M##DL(GDDDrJ   sincer   c                 D   K   |                      |g|||           d{V S )a  
        get the list of most recent trades for a particular symbol
        :see: https://docs.kraken.com/websockets/#message-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rG   rK   r   r   rc   s        rI   watch_tradeszkraken.watch_trades  s6       22F8UE6RRRRRRRRRrJ   c                   K   |                      dd|d|           d{V }| j        rB|                     |d          }|                     |d          }|                    ||          }|                     |||dd          S )a  
        :see: https://docs.kraken.com/websockets/#message-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   rK   r   T)r   r   	safe_listr   getLimitfilter_by_since_limit)rG   r   r   r   rc   r   firsttradeSymbols           rI   r   zkraken.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RrJ   c                 B   K   |                      |g||           d{V S )a2  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: https://docs.kraken.com/websockets/#message-book
        :param str symbol: unified symbol of the market to fetch the order book for
        :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
        N)watch_order_book_for_symbols)rG   rK   r   rc   s       rI   watch_order_bookzkraken.watch_order_book  s4       66xOOOOOOOOOrJ   c           
        K   i }|7|                      |g d          rd|i|d<   nt          | j        dz             |                     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.kraken.com/websockets/#message-book
        :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
        N)
      d   i  r8   depthr   zF watchOrderBook accepts limit values of 10, 25, 100, 500 and 1000 only	orderbookbookr   )in_arrayr   rr   r   rb   r   )rG   r   r   rc   rg   r   s         rI   r   z#kraken.watch_order_book_for_symbols  s       }}U$<$<$<== wU+'' #47-u#uvvv11+vwQXZ_P`bfbmbmnuw}b~b~	   rJ   1mc           	      D  K   |                                   d{V  d}|                     |          }|d         }|                     |d         d          }|dz   |z   dz   |z   }	| j        d         d         d	         }
|                                 }d
||g||                     | j        ||          dd}|                     ||          }|                     |
|	||	           d{V }| j        r|	                    ||          }| 
                    |||dd          S )aQ  
        watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
        :param str symbol: unified symbol of the market to fetch OHLCV data for
        :param str timeframe: the length of time each candle represents
        :param int [since]: timestamp in ms of the earliest candle to fetch
        :param int [limit]: the maximum amount of candles to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns int[][]: A list of candles ordered, open, high, low, close, volume
        NohlcrK   r   r   r   r4   r$   r5   r   )r   r   r   r   T)r[   r]   rl   rA   r^   
timeframesrD   ra   r   r   r   )rG   rK   r   r   r   rc   r   r]   r   rf   rd   re   r   rg   ohlcvs                  rI   watch_ohlcvzkraken.watch_ohlcv%  sW      !!!!!!!!!V$$!::Sj9,s2V;it$X.OO%%	   OODOY	RR 

 

	 ""9f55jjk7KHHHHHHHH? 	2NN6511E))%q$GGGrJ   Fc                 H  K   t          t          |                               ||           d {V }|                     | j        d          }||ri }t          dt          | j                            D ]}| j        |         }| j        |         }|d         rK|                     |di           }| 	                    |d          }	|	dd         dz   |	dd          z   }
|||
<   o|                     |di           }| 	                    |d          }
|||
<   || j        d<   |S )	Nr   r   darkpoolr   altnamer   /r   )
rE   r"   r[   rl   rB   r   r   r   marketsr   )rG   reloadrc   r  r   r   rK   r]   r   r  r   rH   s              rI   r[   zkraken.load_marketsH  sD     fd++88HHHHHHHH//$,8IJJ## O1c$,//00 5 5af-*% 5??662>>D"..tY??G$QqS\C/'!""+=F.4OF++??662>>D!--dH==F.4OF++.=DL*+rJ   c                    K   |                                   d {V  d}| j        d         d         d         }|                     ||           d {V S )N	heartbeatr4   r$   r5   )r[   rA   ra   )rG   rc   rT   rd   s       rI   watch_heartbeatzkraken.watch_heartbeat\  sk      !!!!!!!!!it$X.ZZU+++++++++rJ   c                 ^    |                      |d          }|                    ||           d S )NrT   )r   rm   )rG   rn   ro   rT   s       rI   handle_heartbeatzkraken.handle_heartbeatb  s3       '22w&&&&&rJ   c                 H
   t          |          }||dz
           }||dz
           }|                    d          }|                     |dd          }|                     | j        d         |          }	|	d         }
d }|                     dd |
          }d|d         v r|                     i |          | j        |
<   | j        |
         }d	d
d}t          |	                                          }t          dt          |                    D ]N}||         }||         }||         }|                     |d         |g           }|                     |||          }O|
|d<   ||d<   |                     |          |d<   |                    ||           d S | j        |
         }d }d }d }|dk    rt|                     |d         dg           }|                     |d         dg           }|                     |d         d          }|                     |d         d|          }na|                     |d         d          }d|d         v r|                     |d         dg           }n|                     |d         dg           }|d	         }|d
         }d }|-|                     |||          }|                     |d          }|-|                     |||          }|                     |d          }|                                 |                     | j        dd          }|r|                     |d          }|                     |d          }|                    d          }|                    d          }t          |d                   dz
  } t          |d                   dz
  }!g }"|t          dd          D ]\}|                     ||         d         |           |                     ||         d         |!          z   }#|"                    |#           ]t          dd          D ]\}|                     ||         d         |           |                     ||         d         |!          z   }#|"                    |#           ]d                    |"          }$|                     |$d          }%|%|k    r/t+          | j        dz             }&|                    |&|           d S |
|d<   ||d<   |                     |          |d<   |                    ||           d S )Nr   r   -r   r   rK   r   asasksbids)r  bsr   r   r   r   r   r   r   r=   T. Fz invalid checksum)r   splitr   rl   rB   r   
order_book
orderbookslistkeysr   custom_handle_deltasiso8601rm   r   	safe_boolr   format_numberr   joincrc32r   rr   reject)'rG   rn   ro   r   messageLengthr   bookDepthStringpartsr   r]   rK   r   rf   r   sidesr  r   keyrM   booksidedeltasr   r   r   
storedAsks
storedBidsexampler=   priceStringamountString
pricePartsamountPartspriceLengthamountLengthpayloadArray	formattedpayloadlocalChecksumerrors'                                          rI   handle_order_bookzkraken.handle_order_bookk  s^   R G*+!-!"34%%c**!!%B//.?!@&II!	++KvFF71:&*oob%&@&@DOF#/I E 

%%D1c$ii(( S S1gSz$T?S"== 55h	RR		"(Ih%.Ik"$(LL$;$;Ij!NN9k22222/IAAA!!OOGAJR88OOGAJR88%%gaj#66%%gaj#q99%%gaj#66'!*$$
C<<AA
C<<A"6*J"6*JG} 55j!YOO	//!Q//} 55j!YOO	//!Q//OO~~dlJEEH "..w::#//;;(..s33
*0055!*Q-0014";q>22Q6!="1b\\ 7 7$($6$6z!}Q7G$U$UX\XjXjkuvwkxyzk{  ~J  YK  YK  %K	$++I6666"1b\\ 7 7$($6$6z!}Q7G$U$UX\XjXjkuvwkxyzk{  ~J  YK  YK  %K	$++I6666'',// $

7E : : A%%(3F)FGGEMM%555F"(Ih%.Ik"$(LL$;$;Ij!NN9k22222rJ   c                 H   |                      |          }|                    d          }|                     |d          }|                     |dd          }|                    |d          }||z   }d}	||	         dk    r|	dz  }	||	         dk    |	dk    r
||	d          S |S )Nr  r   r   r  0)number_to_stringr  r   ljust)
rG   nlengthstringNumberr$  integerdecimalspaddedDecimalsjoinedr   s
             rI   r  zkraken.format_number  s    ,,Q//""3''""5!,,##E1b11!44>)Qi3FA Qi3q55!"":MrJ   c           
      l   t          dt          |                    D ]}||         }|                     |d                   }|                     |d                   }|r|nd}t          ||                     t          |d                   dz                      }|                    ||           |S )Nr   r   r   r8   )r   r   parse_numbermaxr   floatstore)	rG   r'  r(  r   jdeltarO   rN   oldTimestamps	            rI   r  zkraken.custom_handle_deltas  s    q#f++&& 	* 	*A1IE%%eAh//E&&uQx00F(1899qLL$*;*;E%(OOd<R*S*STTINN5&))))rJ   c                     |S N )rG   rn   ro   s      rI   handle_system_statuszkraken.handle_system_status  s	     rJ   c                 B  K   | j         d         d         d         }|                     |          }d}|                     |j        |          }|;|                     |           d {V }|                     |d          }||j        |<   |                     |d          S )Nr4   r$   r6   authenticatedr   rU   )rA   rn   rl   subscriptionsprivatePostGetWebSocketsTokenr   )rG   rc   rd   rn   rP  r   responses          rI   r\   zkraken.authenticate  s      it$Y/S!!'v';]KK!??GGGGGGGGH  ??8X>>L2>F /g666rJ   c                   K   |                                   d {V  |                                  d {V }|}|}||                     |          }|d|z   z  }| j        d         d         d         }	|                                 }
d|
||dd}|                     ||          }|                     |	|||           d {V }| j        r|                    ||          }| 	                    ||||          S )Nr   r4   r$   r6   r   )r   rU   )rT   rV   r   )
r[   r\   rK   rA   r^   rD   ra   r   r   filter_by_symbol_since_limit)rG   r   rK   r   r   rc   rU   subscriptionHashrf   rd   re   r   rg   r   s                 rI   watch_privatezkraken.watch_private$  s<     !!!!!!!!!''))))))))[[((F3<'Kit$Y/OO%%	  
 
	 ""9f55zz#{G=MNNNNNNNN? 	3OOFE22E00NNNrJ   c                 D   K   |                      d||||           d{V S )a  
        watches information on multiple trades made by the user
        :param str symbol: unified market symbol of the market trades were made in
        :param int [since]: the earliest time in ms to fetch trades for
        :param int [limit]: the maximum number of trade structures to retrieve
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
        	ownTradesNrW  r   s        rI   watch_my_tradeszkraken.watch_my_trades<  s6       ''VUE6RRRRRRRRRrJ   c                    |                      |dg           }t          |          }|dk    r| j        0|                     | j        dd          }t          |          | _        | j        }i }t          dt          |                    D ]}	|                      ||	i           }
t          |
                                          }t          dt          |                    D ]_}||         }|
|         }| 	                    | 
                    d|i|                    }|                    |           |d         }d||<   `d}|                    | j        |           t          |                                          }t          dt          |                    D ]-}	|dz   ||	         z   }|                    | j        |           ,d S d S )	Nr   r9   r8   rr   rK   TrY  r   )rl   r   myTradesr   rB   r   r   r  r  parse_ws_traderb   r   rm   )rG   rn   ro   r   	allTradesallTradesLengthr   r   r   r   r   rw   rH  rr   r   r   rK   r   r  rf   s                       rI   handle_my_tradeszkraken.handle_my_tradesG  s   N OOGQ33	i..Q}$))$,tLL *5 1 1]FG1c)nn-- 	+ 	+Ar::6;;==))q#c((++ + +AQB"2JE!00dBZ1O1OPPFMM&)))#H-F&*GFOO+ DNN4=$///''D1c$ii(( ; ;"Sj472t}k::::+ &; ;rJ   c                 r   |                      |d          }|                     | j        d         ||          }d }|                      |d          }|                     |dd          }|                     |d          }|                      |d          }|                      |d          }	|                     |d	          }
|                     |d
          }d }d }d|v r%d }||d         }|                     |d          |d}||d         }|
||
|z  }|||||                     |          ||	|d |
|||dS )NrX   r   	ordertxidrr   postxidtimerL   rW   rO   volfeequote)costcurrencyrK   )rr   rp   r   r   r   rK   rL   rM   takerOrMakerrO   rN   ri  rg  )r   rl   rB   safe_string_2safe_timestampr   r  )rG   r   r]   r   rK   orderIdrr   r   rM   rL   rO   rN   ri  rg  rj  s                  rI   r^  zkraken.parse_ws_trade  s}   B !!%00.?!@&&QQ""5+66tY77''v66	v..{33w//..E>>H!!'?u55$ C H%F!v~"Y// 
 
 	
rJ   c                 D   K   |                      d||||           d{V S )a1  
        :see: https://docs.kraken.com/websockets/#message-openOrders
        watches information on multiple orders made by the user
        :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  orde structures to retrieve
        :param dict [params]: maximum number of orderic to the exchange API endpoint
        :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
        
openOrdersNrZ  r   s        rI   watch_orderszkraken.watch_orders  s6       ''feUFSSSSSSSSSrJ   c                 `   |                      |dg           }t          |          }|dk    r~|                     | j        dd          }| j        t          |          | _        | j        }i }t          dt          |                    D ]}	|                      ||	i           }
t          |
                                          }t          dt          |                    D ]>}||         }|
|         }| 	                    |          }||d<   d }|                      | j        di           }|d         |d         }|||<   || j        d<   n| 
                    ||          }|                      |j        |          }|                      ||          }|}|<|                     |d         |d                   }| 	                    |          }||d<   t          |          }||k    r||d         }|d         |v r	||d         = |                    |           d||<   @d	}|                    | j        |           t          |                                          }t          dt          |                    D ]-}	|d
z   ||	         z   }|                    | j        |           ,d S d S )Nr   r;   r8   rr   r<   rK   r   Trp  r   )rl   r   r   rB   ordersr   r   r  r  parse_ws_orderr   hashmaprb   r   rm   )rG   rn   ro   r   	allOrdersallOrdersLengthr   r   r   r   rs  rw   rH  rr   rp   r   rK   r<   previousOrderspreviousOrdernewOrdernewRawOrderr=  r   r   r  rf   s                              rI   handle_orderszkraken.handle_orders  s   \ OOGQ33	i..Q%%dlM4HHE{"4U;;[FG1c)nn-- + +Ar::6;;==))q#c((++ + +AQB"2JE!0077F#%F4L!F'+t|EWY['\'\$h'3!'!1/5(,;K%788!%!1!12BB!G!G%)__V^V%L%LN$(OONB$G$GM%H$0&*kk-2GRXIY&Z&Z#'#6#6{#C#C)+ [[FM,A &q	 ;*::: 0t =MM(+++&*GFOO5+6  DNN4;---''D1c$ii(( 9 9"Sj472t{K8888S N9 9rJ   c           	      j   |                      |di           }|                     |d          }d }d }d }d }d }	||                    d          }
|                     |
d          }|                     |
d          }	|                     |
d          }|                     |
d          }|                     |
d          }|                     |d	|          }|                     |d
|          }|                     |d|          }|                      | j        d         ||          }d }|                     |d          }|                     |d|	          }	|                     |d          }d }|                     |d          }|                     |d|          }|t          j        |d          r|                     |d          }|t          j        |d          r|                     |d|          }|                     |dd          }|x|d         }d|v rl|d         }|                     |d          }|d d}|                    d          dk    r|d         |d<   n$|                    d          dk    r|d         |d<   | 	                    |                     |d                    }|                     |d          }|,|                      |d           }|                     |d          }|                     |d!          }|                      |d"          }d }|| 
                    ||d d d|i          }|                     |d#          }|                     i d|d$|d%|d&|d'|                     |          d(d d|d|d	|d)d d*d d+|d|d,|d-|d|d.|	||d ||d/          S )0Ndescrrp    r   r   r   r   r   rL   rW   rX   r   opentmrf  vol_execri  rO   z0.0price2	avg_pricerK   rg  oflags)ri  ratefciqrh  rj  fcibbasestatusrr   r{   r~   r   	stoppricer   r   r   r   lastTradeTimestamptimeInForcepostOnlyrM   	stopPricetriggerPricerN   )filledr   	remainingrg  r   )rl   r   r  rB   rm  r    	string_eqrl  findparse_order_statusr   safe_number
safe_orderr  )rG   rp   r]   descriptionorderDescriptionrM   rL   r   rO   rN   r$  rK   r   r  rg  ri  r   flagsfeeCostr  rr   r{   r   	rawTradesr   r  s                             rI   rt  zkraken.parse_ws_orderX  s   @ ooeWb99++KAA'$**3//E##E1--D%%eQ//F%%eQ//F##E1--D$$UA..EVT::[$??!!+vv>>.?!@&&QQ''x88	!!%77!!%44v..  gu==Mw0>>M$$[(;;EMw0>>M$$UGU;;E$$UKAAH%F~~h**5%88#   ::f%%**&,WoC
OOZZ''1,,&,VnC
O(()9)9%)J)JKKeT**:??5&11D!!$**B((	::OOE844	 &&y&$wPRmTTF$$UK88	  
" 
] 
 E 
 	 

 Y// 
 !$ 
 f 
 f 
 D 
 4 
  
 D 
 U 
  
 I 
  D! 
" f# 
$ - 
  
  
   	rJ   unifiedNamechannelNamec                   K   |                                   d {V  |                     |d ddd          }g }t          dt          |                    D ]E}|                    |                     |d |                     ||                                        F|                     |          }g }	t          dt          |                    D ]9}|                     ||         d         d          }
|	                    |
           :d| 	                                |	d|id}| j
        d	         d
         d         }|                     |||                     ||          ||           d {V S )NFTr   r   r   r   r   r   r4   r$   r5   )r[   r   r   r   r   r   rK   markets_for_symbolsr   r^   rA   watch_multiplerb   )rG   r  r  r   subscriptionArgsrc   messageHashesr   r  wsMarketIds
wsMarketIdrg   rd   s                rI   r   zkraken.watch_multi_helper  s     !!!!!!!!!%%gtUD%HHq#g,,'' 	d 	dA  !6!6{D$++V]^_V`JaJa!b!bcccc**733q#g,,'' 	+ 	+A))'!*V*<hGGJz**** __&&	
 
 it$X.((mT[[RX=Y=Y[hjz{{{{{{{{{rJ   unifiedElementNamesubChannelNamec                 F    |d u}|}|s|dz  }n|d|z   z  }||d|z   z  }|S )Ns@#rM  )rG   r  r  rK   
withSymbolrf   s         rI   r   zkraken.get_message_hash  sP     4'
( 	(3KK3<'K%3//KrJ   c                 N    |                      |d          }|||j        |<   d S d S )N	channelID)r   rQ  )rG   rn   ro   	channelIds       rI   handle_subscription_statusz!kraken.handle_subscription_status  s:    0 $$Wk::	 .5F +++ ! rJ   c                 2   |                      |d          }|~|                     |d          }|f| j        d         d         }|                     ||          }d }|t	          |          }n ||         |          }|                    ||           dS dS )NerrorMessagerV   r$   r?   FT)r   rl   rC   find_broadly_matched_keyr   r!  )rG   rn   ro   r  re   r?   broadKey	exceptions           rI   handle_error_messagezkraken.handle_error_message  s     ''@@#99I$-g688MM 	# -l ; ;II /h = =Ii333utrJ   c                    t          |t                    r|                     |d          }|                     |j        |i           }|                     |di           }t          |          }|                     ||dz
            }|                     |d          }| j        | j        | j        | j	        | j
        | j        d}	|                     |	||          }
|
 |
|||           d S d S |                     ||          ri|                     |d          }| j        | j        | j        | j        | j        | j        | j        d}	|                     |	|          }
|
 |
||           d S d S d S )Nr   r   r   r   )r   r   r   r   rp  rY  rT   )r
  systemStatussubscriptionStatusaddOrderStatuseditOrderStatuscancelOrderStatuscancelAllStatus)
isinstancer  r   rl   rQ  r   r7  r   r   r   r|  ra  r   r  r  rN  r  rq   r   r   )rG   rn   ro   r  r   r   r"  r  r   methodsmethodrT   s               rI   handle_messagezkraken.handle_message&  s   gt$$ "	,((!44I??6+?BOOL??<DDDLLM**7MA4EFFK##D&11D .),+"0!2	 	G &&wkBBF!vw55555 "! ((99 ,(('::!%!6$($=*.*I&*&C'+'D)-)A'+'D  %88%F67+++++, , &%rJ   rL  )NN)=__name__
__module____qualname__rF   strr   r
   rF  r   r   rh   rq   rv   r   r   r|   r   r   r   r   r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   r	   r   r   r  r  r[   r  r  r7  r  r  rN  r\   rW  r[  ra  r^  rq  r|  rt  r   r   r  r  r  __classcell__)rH   s   @rI   r"   r"      s)       _ _ _ _ _B pt|~ ] ]C ]y ]	 ][` ]il ]  DI ] ] ] ]<+ + +0 w{  DF ] ]c ]3 ]i ]y ]bg ]ps ]  KP ] ] ] ]< DHPR ] ]$s) ]S ] ] ] ], <@ ] ] ]S ]u ] ] ] ]0
' 
' 
' 8<B ] ] ] ] ] ],
' 
' 
'5, 5, 5,n,F , , , ,8006 00 00 00 00d   79 H H H H( 68 
 
 
F 
 
 
 
 6:" E E7 E E E E E  <@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 SW_a ! !$s) !C !fo ! ! ! !( 8<$]ajl !H !H !HC !HWZ !Hquvzq{ !H !H !H !HF ).b      ( ,. , , , ,'v ' ' ' '{3 {3 {3 {3 {3z     6     )+ 7 7 7 7( 7;\`ik O O O3 OVY O O O O0 37TX\eg 	S 	SC 	Ss 	SRU 	Slpqvlw 	S 	S 	S 	S>; >;v >; >; >; >;@H
 H
 H
 H
T 04$UYbd 
T 
T 
TC 
Ts 
Timnsit 
T 
T 
T 
Ty9 y9F y9 y9 y9 y9vm m m m^ _cuy  CE | |C |c |T[ | | | |0 3  \_    6 6 6 6 6@6    4#,V #, #, #, #, #, #, #, #,rJ   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   r   r   r   r   r   r   r   r   r   r   ccxt.base.preciser    async_supportr"   rM  rJ   rI   <module>r     s       f f f f f f f f f f r r r r r r r r r r r r r r r r r r r r r r r r r r 4 4 4 4 4 4       * * * * * * 0 0 0 0 0 0 - - - - - - - - - - - - ' ' ' ' ' ' & & & & & & . . . . . . ) ) ) ) ) ) * * * * * * ) ) ) ) ) ) . . . . . . 1 1 1 1 1 1 ) ) ) ) ) ) % % % % % %n, n, n, n, n,T& n, n, n, n, n,rJ   