
    i                         d dl Zd dlmZmZ d dl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  G d	 d
ej        j                  ZdS )    N)
ArrayCacheArrayCacheBySymbolById)BalancesIntOrder	OrderBookStrTickerTrade)Client)List)AuthenticationError)
BadRequest)InvalidNoncec            
           e Zd Z fdZi fdZi fdZd Zddi fdedede	fd	Z
 fd
Zd ZdefdZdefdZdefdZ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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i fdefdZdefdZd2dZd2dZdefdZ de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&defd$Z'd%efd&Z(d' Z)d( Z*defd)Z+d* Z,defd+Z-defd,Z.defd-Z/defd.Z0defd/Z1defd0Z2d1 Z3 xZ4S )3poloniexfuturesc                 &   |                      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iiddddiddidddddi dd d!d"d#d$          S )%NwsTcancelAllOrdersWsFcancelOrdersWscancelOrderWscreateOrderWseditOrderWsfetchBalanceWsfetchOpenOrdersWsfetchOrderWsfetchTradesWs
watchOHLCVwatchOrderBookwatchTickerwatchTickerswatchTradeswatchBalancewatchOrders)watchMyTradeswatchPositionwatchPositionsapiz)wss://futures-apiws.poloniex.com/endpoint  method/contractMarket/ticker/contractMarket/tradeOrders/contractMarket/level2      )r*   snapshotDelaysnapshotMaxRetries)tradesLimitordersLimitr    r$   r   streamLimitstreamBySubscriptionsHashstreamIndexi0u  g       @)	keepAlivemaxPingPongMisses)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/poloniexfutures.pyr@   zpoloniexfutures.describe   s   ot < < E E G Gd#U !%  	
   u !% $U    e !$ t  t  !" t#$ "'!%"')  . E  $#6  ;  7%&*+# #
  !-/!! & #%( ]2J
 2J
 2 2 2	    c                    K   |rdnd}|                      | j        di           }||v r||         }| d {V S |                     | j        ||          ||<   || j        d<   ||         }| d {V S )Nprivatepublicr;   )
safe_valuer<   spawnnegotiate_helper)rA   privateChannelparams	connectIdr;   storedFuturefutures          rC   	negotiatezpoloniexfutures.negotiateG   s      !/=IIX	t|VR88	?L%%%%%%%% **T%:NFSSY#Vi||||||rD   c                   K   d }|rdnd}	 |r|                      |           d {V }n|                     |           d {V }|                     |di           }|                     |dg           }|                     |d          }|                     |d          }|                     |d          }	|                     |d          }
|	d	z   |                     |
||d
          z   }|                     |          }||_        |S # t          $ rN}|                     | j	        d         |          }|
                    |           | j	        d         |= Y d }~nd }~ww xY wd S )NrF   rG   datainstanceServersr   pingIntervalendpointtoken?)rV   rK   rM   r;   )privatePostBulletPrivatepublicPostBulletPublicrH   safe_integersafe_string	urlencodeclientr8   	Exceptionr<   reject)rA   rK   rL   responserM   rR   rS   firstInstanceServerrT   rU   rV   resultr]   erO   s                  rC   rJ   z poloniexfutures.negotiate_helperV   s     !/=IIX	'	0 E!%!>!>v!F!FFFFFFF& "&!<!<V!D!DDDDDDD??8VR88D"ood4ErJJO"&///1"E"E,,-@.QQL''(;ZHHH$$T733E^dnn"0&6 6 ' ' F
 [[((F+FM 	0 	0 	0__T\&%99EEFMM!V$Y//////	0 ts   C;D 
E AEE c                 z    |                      |                     | j        dd          d          }|| j        d<   |S )N	requestIdr      )sumrZ   r<   )rA   re   s     rC   
request_idzpoloniexfutures.request_id   s;    HHT..t|[!LLaPP	$-[!rD   Nname	isPrivatesymbolc                   K   |                      |           d{V }|%|                     |          }|d         }|d|z   z  }|}	|                     ||	           d{V }
|                                 }|d||d|
d}d|i}||}n|                     ||          }|                     ||          }|                     ||	|||           d{V S )a  
         * @ignore
        Connects to a websocket channel
        :param str name: name of the channel and suscriptionHash
        :param bool isPrivate: True for the authenticated url, False for the public url
        :param str symbol: is required for all public channels, not required for private channels(except position)
        :param dict subscription: subscription parameters
        :param dict [params]: extra parameters specific to the poloniex api
        :returns dict: data from the websocket stream
        Nid:	subscribeT)rm   typetopicrK   r`   tunnelId)rP   marketstreamrh   extendwatch)rA   ri   rj   rk   subscriptionrL   urlrs   marketIdmessageHashrr   re   ro   subscriptionRequestrequests                  rC   ro   zpoloniexfutures.subscribe   s"      NN9--------[[((Fd|HC(N"DS+66666666OO%%	' 
 
	 )
 .LL;;':LIIL++i00ZZ['4ATUUUUUUUUUrD   c                 n    i | j         d<   t          t          |                               ||           d S )Nr6   )r<   r?   r   on_close)rA   r]   errorrB   s      rC   r~   zpoloniexfutures.on_close   s6    4601ot$$--fe<<<<<rD   c                   K   |                      | j        di           }|                     ||          }||                     | j        dd          }|                      | j        d          }|dz   }||z  }|| j        d<   |                     |          }d|z   }|| j        d         |<   d|z   }	|	d|d	d
}
|	| j        d}|                     ||	|
|	|           d {V  |S )Nr6   r7   r2   r5   rf   zstream-ztunnel:
openTunnelT)rm   rp   newTunnelIdr`   )rm   r*   )rH   r<   r[   rZ   number_to_stringhandle_new_streamrv   )rA   rx   subscriptionHashr6   rt   r7   r5   normalizedIndexstreamIndexStringrz   r|   rw   s               rC   rt   zpoloniexfutures.stream   s'     $(OODLB]_a$b$b!!!";=MNN>++DL-LLK//$,FFK%/K)K7O*5DL' $ 5 5o F F!22FJPDL456FG#f,K!$% 	 G "0 L **S+w\RRRRRRRRRrD   r]   c                     |                      |d          }|                     |d          }|                     i |          | j        |<   d S )Nrk   limit)r[   rZ   
order_book
orderbooks)rA   r]   messagerw   rk   r   s         rC   handle_order_book_subscriptionz.poloniexfutures.handle_order_book_subscription   sL    !!,99!!,88"&//"e"<"<rD   c                     |                      |d          }|                     |j        d          }|                     ||i           }|                     |d          }| ||||           |S )Nrm   r*   )r[   index_bysubscriptionsrH   )rA   r]   r   rm   subscriptionsByIdrw   r*   s          rC   handle_subscription_statusz*poloniexfutures.handle_subscription_status   sx     gt,, MM&*>EE'8"bAAx88F67L111rD   c                 ^    |                      |d          }|                    ||           d S )Nrm   r[   resolve)rA   r]   r   rw   rz   s        rC   r   z!poloniexfutures.handle_new_stream   s3     &&w55w,,,,,rD   returnc                    K   |                                   d{V  |                     |          }d}|                     |d|d|           d{V S )a  
        watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
        :see: https://futures-docs.poloniex.com/#get-real-time-symbol-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>`
        Nr+   F)load_marketsrk   ro   )rA   rk   rL   ri   s       rC   watch_tickerzpoloniexfutures.watch_ticker   sn       !!!!!!!!!V$$'^^D%vFFFFFFFFFrD   sincer   c                   K   |                                   d{V  |                     | j        d          }|                     |dd          }|                     |dd|          \  }}|                     |          }|                     |d|d|           d{V }| j        r|                    ||          }| 	                    |||dd          S )	a/  
        get the list of most recent trades for a particular symbol
        :see: https://futures-docs.poloniex.com/#full-matching-engine-data-level-3
        :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>`
        Nr"   r*   z/contractMarket/executionri   F	timestampT)
r   rH   r<   r[   handle_option_and_paramsrk   ro   
newUpdatesgetLimitfilter_by_since_limit)rA   rk   r   r   rL   r<   ri   tradess           rC   watch_tradeszpoloniexfutures.watch_trades   s       !!!!!!!!!//$,>>3NOO44VXvtTTfV$$~~dE64HHHHHHHH? 	3OOFE22E))&%TRRRrD   c                   K   |                                   d{V  |                     | j        d          }|                     |dd          }|                     |dd|          \  }}|dk    r@|>|dk    r|dk    rt          | j        dz             |d	|                     |          z   z  }||| j        d
}| 	                    |d|||           d{V }|
                                S )a  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: https://futures-docs.poloniex.com/#level-2-market-data
        :param str symbol: unified symbol of the market to fetch the order book for
        :param int [limit]: not used by poloniexfutures watchOrderBook
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :param str [params.method]: the method to use. Defaults to /contractMarket/level2 can also be /contractMarket/level3v2 to receive the raw stream of orders
        :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
        Nr   r*   r-   ri   r.   2   z[ watchOrderBook limit argument must be none, 5 or 50 if using method /contractMarket/level2Depth)rk   r   r*   F)r   rH   r<   r[   r   r   rm   r   r   ro   r   )rA   rk   r   rL   r<   ri   rw   	orderbooks           rC   watch_order_bookz poloniexfutures.watch_order_book
  s0      !!!!!!!!!//$,0@AA3KLL44VXvtTTf+++0Azzerkk   ,I  "I  J  J  JGd33E::::D9
 

 ..uflFSSSSSSSS	   rD   c                   K   |                                   d{V  |                     | j        d          }|                     |dd          }|                     |ddd|           d{V }| j        r|                    ||          }|                     ||||          }t          |          }|dk    r| 	                    ||||           d{V S |S )a  
        watches information on multiple orders made by the user
        :see: https://futures-docs.poloniex.com/#private-messages
        :param str symbol: filter by 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
        :param str [params.method]: the method to use will default to /contractMarket/tradeOrders. Set to /contractMarket/advancedOrders to watch stop orders
        :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
        Nr$   r*   r,   Tr   )
r   rH   r<   r[   ro   r   r   filter_by_symbol_since_limitlenwatch_orders)	rA   rk   r   r   rL   r<   ri   orderslengths	            rC   r   zpoloniexfutures.watch_orders$  s       !!!!!!!!!//$,>>3PQQ~~dD$fEEEEEEEE? 	3OOFE22E22665%PPVQ;;**65%HHHHHHHHHrD   c                 |   K   |                                   d{V  d}|                     |ddd|           d{V S )ae  
        watch balance and get the amount of funds available for trading or funds locked in orders
        :see: https://futures-docs.poloniex.com/#account-balance-events
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
        N/contractAccount/walletT)r   ro   )rA   rL   ri   s      rC   watch_balancezpoloniexfutures.watch_balance;  s]       !!!!!!!!!(^^D$dFCCCCCCCCCrD   c                    |                      |di           }|                     |d          }||                     |          }|d         }d|z   }|                      | j        |          }|5|                     | j        dd          }	t          |	          }|| j        |<   |                    |           |                    ||           |S )NrR   rk   z/contractMarket/execution:r3   r)   )	rH   r[   parse_ws_trader   rZ   r<   r   appendr   )
rA   r]   r   rR   ry   traderk   rz   storedr3   s
             rC   handle_tradezpoloniexfutures.handle_tradeF  s    * w33##D(33''--E8_F6AK__T[&99F~"//mTRR#K00&,F#MM%   NN6;///rD   c                    |                      |d          }|                     ||          }|                     |dd          }|                     ||                      |d          |                      |d          ||                     |          |                     |dd          d |                      |d          d |                      |d          |                     |d	d
          d d d|          S )Nrk   tsư>tradeIdtakerOrderIdmakerOrderIdsideprice	matchSizesizeinform   rk   r   datetimeorderrp   r   takerOrMakerr   amountcostfee)r[   safe_marketsafe_integer_product
safe_tradeiso8601safe_string_2)rA   r   rs   ry   r   s        rC   r   zpoloniexfutures.parse_ws_tradej  s   $ ##E844!!(F33--eT8DD	""5)44&&vx88"Y//''~~NN$$UF33 %%eW55((VDD 
  
   	rD   c                 `   |                      |d          }|                     |d          }|                     ||                     |d          |                     ||          ||                     |          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d	          d d |                     |d
          |                     |d          dd|          S )N	tradeTimerk   r   orderIdrp   r   	matchRoler   tradeAmounttradeFeefeeCurrency)rater   currencyr   )rZ   r[   r   safe_symbolr   safe_string_lower)rA   r   rs   r   ry   s        rC   parse_ws_order_tradez$poloniexfutures.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 225+FF%%eW55&&um<<((
;; ,,UMBB  
  
$ %  	rD   c                 ,   |                      |di           }| j        }|1|                     | j        d          }t	          |          }|| _        d}|                     |          }|                    |           |                    ||           |S )NrR   r4   r,   )rH   r   rZ   r<   r   parse_ws_orderr   r   )rA   r]   r   rR   r   r   rz   parseds           rC   handle_orderzpoloniexfutures.handle_order  s    f w33>%%dlMBBE+E22F DK3$$T**fv{+++rD   statusrp   c                 |    dddd}|                      ||          }|dddd}|                      |||          }|S )z
         * @ignore
        :param str status: "match", "open", "done"
        :param str type: "open", "match", "filled", "canceled", "update"
        :returns str:
        canceledclosed)r   cancelfilledNopen)r   matchdone)r[   )rA   r   rp   typesparsedStatusstatusess         rC   parse_order_statusz"poloniexfutures.parse_order_status  sj     # 
 

 ''t44  H
  ++HffEELrD   c           	      >   |                      |d          }|                      |d          }|                      |d          }|                     |ddd          }|                      |d          }|                      |d          }|                     i d	|d|                     ||          d
|d|d|d|                     |          dd d|                      |d          dd dd d|                      |d          d|                     |dd          d|                      |d          dd d|                      |d          dd dd |                      |d          |                      |d          |                     ||          d d d          S )Nr   	clientOidrk   	orderTimer   r   r   rp   r   rm   clientOrderIdr   r   lastTradeTimestamp	orderTypetimeInForcepostOnlyr   r   
orderPrice	stopPricetriggerPricer   r   r   average
filledSize
remainSize)r   	remainingr   r   r   )r[   safe_integer_product_2
safe_orderr   r   r   r   )	rA   r   rs   rm   r   ry   r   r   messageTypes	            rC   r   zpoloniexfutures.parse_ws_order  s(   H eY//((<<##E844//{D(SS	!!%22&&uf55  
E 
d&&x88 
 " 
 ]	 

  
 Y// 
 !$ 
 D$$UK88 
 4 
  
 D$$UF33 
 T''wEE 
 ))%== 
 D 
 d&&uf55 
  D! 
" t# 
$ &&ul;;))%>>--fkBB- 
  
  
   	rD   c                     |                      |di           }|                     |d          }|                     |          }|5|                     |          }|| j        |<   |                    ||           |S )NrR   rq   )rH   r[   get_symbol_from_topicparse_tickertickersr   )rA   r]   r   rR   rz   rk   tickers          rC   handle_tickerzpoloniexfutures.handle_tickerZ  s    B w33&&w88++K88&&t,,F#)DL NN6;///rD   c                     |                      |d          }|                      |d          }|dk    rd S |                    ||           d S )Nrq   subjectreceivedr   )rA   r]   r   rz   r  s        rC   handle_l3_order_bookz$poloniexfutures.handle_l3_order_book  sY    X &&w88""7I66j  Fw,,,,,rD   c                     |                      |d          }|                    d          dk    }|r|                     ||           d S |                     ||           d S )Nrq   r   r   )r[   findhande_l2_snapshothandle_l2_order_book)rA   r]   r   rq   
isSnapshots        rC   handle_level_2zpoloniexfutures.handle_level_2  sn       '22ZZ((A-
 	""67333F!!&'22222rD   c                    |                      |di           }|                     |dd          }|                     |          }|                      | j        |          }|/|                     i           | j        |<   | j        |         }||d<   |                     |d          }|nt          |j                  }|                     ddd          }	||	k    r!d	}
| 	                    | j
        ||||
i            |j                            |           d S 	 |                     ||           |                    ||           d S # t          $ r)}| j        |= |                    ||           Y d }~d S d }~ww xY w)
NrR   rq    rk   noncer   r0   r.   r   )rH   r[   r   r   r   rZ   r   cachehandle_optionrI   load_order_bookr   handle_deltar   r^   r_   )rA   r]   r   rR   rz   rk   	orderBookr  cacheLengthr0   r   rc   s               rC   r
  z$poloniexfutures.handle_l2_order_book  s   ( w33&&w<<++K88OODOV<<	&*oob&9&9DOF#/I"(Ih!!)W55=io..K ../?RSTTMm++

4/feUWXXXO""4(((F	*i...NN9k22222 	* 	* 	*'MM![)))))))))	*s   ,E 
E8E33E8c                 T   |                      |di           }|                     |dd          }|                     |          }|                     |d          }|                     |||dd          }|                     |          }|| j        |<   |                    ||           d S )NrR   rq   r  r   bidsasks)rH   r[   r   rZ   parse_order_bookr   r   r   )	rA   r]   r   rR   rz   rk   r   snapshotr   s	            rC   r	  z!poloniexfutures.hande_l2_snapshot  s    2 w33&&w<<++K88%%dK88	((vy&&QQOOH--	"+y+.....rD   rq   c                     |                     d          }|                     |d          }|                     |          S )Nrn   rf   )splitr[   r   )rA   rq   
splitTopicry   s       rC   r   z%poloniexfutures.get_symbol_from_topic  s<    [[%%
##J22)))rD   c                 P   |                      |d          }|                     |d          }|                     |d          }||dz   k    rdS t          dt          |                    D ]-}||         }|                     |d          }||dz
  k    r|c S .t          |          S )Nr   r  sequencerf   r2   )rH   rZ   ranger   )	rA   r   r  
firstDeltar  firstDeltaSequenceideltar  s	            rC   get_cache_indexzpoloniexfutures.get_cache_index  s    __UA..
!!)W55!..z:FF	))2q#e**%% 	 	A!HE((
;;H1$$ %5zzrD   c                 |   |                      |d          }|                      |d          }||dz
  k    r5|                     | j        dd          }|rt          | j        dz             |                     |d          }|                    d          }|                     |d	          }|                     |d          }	|                     |d
          }
|                      |d          }||d<   |                     |          |d<   ||d<   |	dk    r|d         n|d         }|	                    ||
           d S )Nr  r  rf   checksumTz. watchOrderBook received an out-of-order noncechange,r      r   r   buyr  r  )
rZ   	safe_boolr<   r   rm   r[   r  safe_numberr   store)rA   r   r$  r  r  r'  r(  splitChanger   r   r   r   orderBookSides                rC   r  zpoloniexfutures.handle_delta)  sO    $$UJ77!!)W55HqL  ~~dlJEEH _"47-]#]^^^!!%22ll3''  a00Q//Q//%%e[99	!*	+ $Y 7 7	*%	'.2emm	&)))FBSE4(((((rD   c                    |                      |dg           }d}|                     |d          }|                     |          }|d         }|                     |          | j        |<   |                    | j        |         |           |S )NrR   r   r   code)rH   r[   r   parse_ws_balancebalancer   )rA   r]   r   rR   rz   
currencyIdr   r2  s           rC   handle_balancezpoloniexfutures.handle_balanceD  s    < w33/%%dJ77
==,,!22488Tt|D);777rD   c                 D   |                      |d          }|||                     |          d}|                     |d          }|                     |          }|                                 }|                     |d          |d<   |||<   |                     |          S )Nr   )r   r   r   r   availableBalancefree)rZ   r   r[   safe_currency_codeaccountsafe_balance)rA   r`   r   rb   r5  r2  
newAccounts          rC   r3  z poloniexfutures.parse_ws_balancek  s     %%h<<	"Y//
 

 %%h
;;
&&z22\\^^
!--h8JKK
6!t  (((rD   c                     |S N rA   r]   r   s      rC   handle_system_statusz$poloniexfutures.handle_system_status  s	     rD   c                     |                      |d          }| j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        d}|                     ||          }| |||           d S d S )Nr  )authr  r   updater   level2r  zsnapshot.24hr   orderChange	stopOrderzavailableBalance.changezorderMargin.change)	r[   handle_authenticater  r  r  r   r   r6  rH   )rA   r]   r   r  methodsr*   s         rC   handle_subjectzpoloniexfutures.handle_subject  s    ""7I66,1-/-)( .&,*'+':"&"5
 
 '22F67##### rD   c                 N    t          |                                           }|ddS )Nping)rm   rp   )strrh   )rA   r]   rm   s      rC   rM  zpoloniexfutures.ping  s.    ""##
 
 	
rD   c                 8    |                                  |_        |S r?  )millisecondslastPongrA  s      rC   handle_pongzpoloniexfutures.handle_pong  s    ++--rD   c                 0    |                     |           d S r?  )r_   rA  s      rC   handle_error_messagez$poloniexfutures.handle_error_message  s     	grD   c                     |                      |d          }| j        | j        | j        | j        | j        d}|                     ||          }| |||           d S d S )Nrp   )welcomeackr   pongr   )r[   rB  r   rK  rR  rT  rH   )rA   r]   r   rp   rJ  r*   s         rC   handle_messagezpoloniexfutures.handle_message  s|    0002*$.
 
 $//F67##### rD   c                 <   |                      |d          }|                      |d          }d}|r|                    ||           nTt          | j        dz   |                     |          z             }|                    ||           ||j        v r|j        |= |S )NrR   successauthenticated )rH   r   r   rm   jsonr_   r   )rA   r]   r   rR   r[  rz   r   s          rC   rI  z#poloniexfutures.handle_authenticate  s     w////$	22% 	6NN7K0000'#		'8J8J(JKKEMM%---f222(5rD   r?  )5__name__
__module____qualname__r@   rP   rJ   rh   rN  boolr	   ro   r~   rt   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  r6  r3  rB  rK  rM  rR  rT  rY  rI  __classcell__)rB   s   @rC   r   r      s       3 3 3 3 3j 68     =? + + + +Z  
 IM[_hj #V #VC #VD #V# #V #V #V #VJ= = = = =  4=V = = = =
    - - - - - 68 G G GF G G G G <@d[] S S SS S Sbfglbm S S S S( @DB ! !S ! !S\ ! ! ! !4 04$UYbd   C s imnsit    . *, 	D 	D 	D 	D 	D 	D"6 " " " "H# # # #J1 1 1 1f=6 = = = =~ C    ,A A A AF(F ( ( ( (T1-6 1- 1- 1- 1-f3V 3 3 3 3$**6 ** ** ** **X /  /  /  /  /D*3 * * * *
  ) ) )6%V % % % %N) ) )66    $V $ $ $ $*
6 
 
 
 
&    	6 	 	 	 	$V $ $ $ $      rD   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   ccxt.base.typesr   r   r   r   r	   r
   r   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   r   async_supportr   r@  rD   rC   <module>rl     s        O O O O O O O O O O O O O O O O O O O O O O O O O O 4 4 4 4 4 4       0 0 0 0 0 0 ' ' ' ' ' ' ) ) ) ) ) )J J J J Jd(8 J J J J JrD   