
    i4d                         d dl Zd dl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 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)ArrayCacheBySymbolById)IntOrder	OrderBookStrStringsTickerTickersTrade)List)ExchangeError)ArgumentsRequiredc            
           e Zd Z fdZdi fdZi fdedefdZdi fdede	fdZ
d	 Zdd
Z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di fdededefdZd Zd ZddZd Zd Zd Zd Z xZS )coinbasec                    |                      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idddiidddddddd          S )NwsTcancelAllOrdersWsFcancelOrdersWscancelOrderWscreateOrderWseditOrderWsfetchBalanceWsfetchOpenOrdersWsfetchOrderWsfetchTradesWswatchBalancewatchMyTrades
watchOHLCVwatchOrderBookwatchOrderswatchTickerwatchTickerswatchTradesapiz$wss://advanced-trade-ws.coinbase.com  bidsasks)bidoffer)tradesLimitordersLimitmyTradesLimitsides)hasurlsoptions)deep_extendsuperr   describe)self	__class__s    W/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/ccxt/pro/coinbase.pyr3   zcoinbase.describe   sW   h 5 5 > > @ @d#U !%  	
   u !% $U       e !$ t  t!" #$ t% * @  $#!%!# 	 5#C
 #C
 # # #	    Nc                 D  K   |                                   d{V  |                                  d}|}g }t          |t                    rH|                     |          }|                     |          }|}|dz   d                    |          z   }n.|,|                     |          }|dz   |d         z   }|d         g}| j        d         d         }	| 	                    | 
                                          }
| j                            d          dk    p| j                            d	          }|
|z   d                    |          z   }d
||d}|s_| j        |d<   |
|d<   |                     |                     |          |                     | j                  t"          j                  |d<   n| j                            d	          rt'          | j        dz             |                     | j        d          }|                     | j        dd          }| 
                                }|	|dz   |k     r)|                     |          }|| j        d<   || j        d<   |                     | j        d          |d<   |                     |	|||           d{V S )a  
         * @ignore
        subscribes to a websocket channel
        :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
        :param str name: the name of the channel
        :param string|str[] [symbol]: unified market symbol
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: subscription to a websocket channel
        N::,idr$   r   zorganizations/r   z
-----BEGIN	subscribe)typeproduct_idschannelapi_key	timestamp	signaturezV apiKey should contain the name(eg: organizations/3b910e93....) and not the public keywsTokenwsTokenTimestampx   jwt)load_marketscheck_required_credentials
isinstancelistmarket_symbols
market_idsjoinmarketr/   number_to_stringsecondsapiKeyfindsecret
startswithhmacencodehashlibsha256r   r;   safe_stringr0   safe_integercreate_auth_tokenwatch)r4   namesymbolparamsrN   messageHash
productIdssymbols	marketIdsurlrA   isCloudAPiKeyauthr<   currentTokentokenTimestamprP   tokens                     r6   r<   zcoinbase.subscribe7   s      !!!!!!!!!'')))
fd## 	())&11G00I"J%,sxx/?/??KK[[((F+t4K ,Jit$))$,,..99	))*:;;q@kdkF\F\]iFjFj4#((:"6"66%
 
	  	I#';Ii %.Ik"%)YYt{{4/@/@$++dkBZBZ\c\j%k%kIk""{%%l33 L'  3K  )K  L  L  L++DL)DDL!..t|=OQRSSNllnnG#~';g'E'E..w77*/Y'3:/0#//iHHIeZZ[)[IIIIIIIIIr7   r^   returnc                 D   K   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://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-channel
        :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>`
        tickerN)r<   )r4   r^   r_   r]   s       r6   watch_tickerzcoinbase.watch_tickerm   s5       ^^D&&999999999r7   rb   c                 v   K   || j         }d}|                     |||           d{V }| j        r|S | j        S )a  
        watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
        :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
        :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>`
        Nticker_batch)rb   r<   
newUpdatestickers)r4   rb   r_   r]   rq   s        r6   watch_tickerszcoinbase.watch_tickersx   sW       ?lGtWf========? 	N|r7   c                 .   |                      |d          }|                     |dg           }g }t          dt          |                    D ]}||         }|                     |dg           }t          dt          |                    D ]}	||	         }
|                     |
          }|d         }|| j        |<   |                      |
d          }|dz   |z   }|                    |           |                    ||           |                    d          r|                    ||d	z              | 	                    |d
          }t          dt          |                    D ]}||         }|
                    d          }|d         }|
                    d          }|                     |d|          }|                     |          sD|                    ||           |                    d          r|                    ||d	z              |S )Nr?   eventsr   rq   r^   
product_idr9   USDCzticker_batch::   r:   )rY   
safe_valuerangelenparse_ws_tickerrq   appendresolveendswithfind_message_hashessplitfilter_by_arrayis_empty)r4   clientmessager?   rt   
newTickersi
tickersObjrq   jrl   resultr^   
wsMarketIdr`   messageHashespartssymbolsStringrb   s                      r6   handle_tickerszcoinbase.handle_tickers   s(   | ""7I66(B77
q#f++&& 	> 	>AJooj)R@@G1c'll++ 
> 
> --f55)'-V$!--flCC
%nz9!!&)))v{333''.. >NN6;+<===
> 009IJJq#m,,-- 		? 		?A'*K%%d++E!!HM#))#..G**:xIIG==)) ?w444''.. ?NN7K#,=>>>r7   c           	         |                      |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          S )Nru   priceinfor^   -rA   datetimehigh	high_24_hlowlow_24_hr(   best_bid	bidVolumebest_bid_quantityaskbest_ask	askVolumebest_ask_quantityvwapopencloselastpreviousClosechange
percentageprice_percent_chg_24_hvolume_24_h)average
baseVolumequoteVolume)rY   safe_numbersafe_tickersafe_symboliso8601)r4   rl   rN   marketIdrA   r   s         r6   r|   zcoinbase.parse_ws_ticker   s   & ##FL99	00 !
F!
d&&x==!
 !
 Y//	!

 D$$V[99!
 4##FJ77!
 4##FJ77!
 ))&2EFF!
 4##FJ77!
 ))&2EFF!
 D!
 D!
 T!
 D!
 T!
  d!!
" $**63KLL#!
$ **6=AA)!
 !
 !
   	r7   sincelimitc                   K   |                                   d{V  |                     |          }d}|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )aD  
        get the list of most recent trades for a particular symbol
        :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
        :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market_tradesrA   T)rG   r^   r<   rp   getLimitfilter_by_since_limit)r4   r^   r   r   r_   r]   tradess          r6   watch_tradeszcoinbase.watch_trades  s       !!!!!!!!!V$$~~dFF;;;;;;;;? 	3OOFE22E))&%TRRRr7   c                    K   |                                   d{V  d}|                     |||           d{V }| j        r|                    ||          }|                     |||dd          S )aM  
        watches information on multiple orders made by the user
        :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
        :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 `order structures <https://docs.ccxt.com/#/?id=order-structure>`
        NuserrA   T)rG   r<   rp   r   r   )r4   r^   r   r   r_   r]   orderss          r6   watch_orderszcoinbase.watch_orders#  s       !!!!!!!!!~~dFF;;;;;;;;? 	3OOFE22E))&%TRRRr7   c                    K   |                                   d{V  d}|                     |          }|d         }|                     |||           d{V }|                                S )aT  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
        :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level2r^   )rG   rN   r<   r   )r4   r^   r   r_   r]   rN   	orderbooks          r6   watch_order_bookzcoinbase.watch_order_book4  s       !!!!!!!!!V$$!..vv>>>>>>>>	   r7   c                 ^   |                      |d          }|                      |d          }|                      |d          }|                      |d          }|                     |d          }d|z   }|                     |          }	|                      | j        |	          }
|
5|                     | j        dd          }t          |          }
|
| j        |	<   t          dt          |                    D ]p}||         }|                      |d          }t          dt          |                    D ]2}||         }|
	                    | 
                    |                     3q|                    |
|           |                    d          r|                    |
|d	z              |S )
Nrt   r   r   ru   zmarket_trades::r*   r%   rv   rw   )ry   rY   r   r   rZ   r0   r   rz   r{   r}   parse_trader~   r   )r4   r   r   rt   eventr   trader   r`   r^   tradesArrayr*   r   currentEventcurrentTradesr   items                    r6   handle_tradezcoinbase.handle_tradeD  s   0 (33**11**##E<88'(2!!(++oodk6::++DL-NNK0==K"-DKq#f++&& 	; 	;A!!9L OOL(CCM1c-0011 ; ;$Q'""4#3#3D#9#9::::; 	{K000U## 	;NN;c(9:::r7   c                 \   |                      |d          }g }| j        0|                     | j        dd          }t	          |          | _        t          dt          |                    D ]}||         }|                      |d          }t          dt          |                    D ]j}	||	         }
|                     |
          }| j        }|                     |
d          }||vr|	                    |           |	                    |           kt          dt          |                    D ]]}||         }d|z   }|
                    | j        |           |                    d          r|
                    | j        |d	z              ^|
                    | j        d
           |S )Nrt   r+   r%   r   r   ru   zuser::rv   rw   r   )ry   r   rZ   r0   r   rz   r{   parse_ws_orderrY   r}   r~   r   )r4   r   r   rt   rc   r   r   r   responseOrdersr   responseOrderparsedcachedOrdersr   r`   s                  r6   handle_orderzcoinbase.handle_orders  s   : (33	;%%dlM4HHE077DKq#f++&& 
	, 
	,A1IE!__UH==N1c.1122 , , .q 1,,];;#{++M<HH I--$$X...##F++++, q#i..)) 	? 	?A |H"X-KNN4;444##E** ?t{K#,=>>>t{F+++r7   c                    |                      |d          }|                      |d          }|                      |d          }|                      |d          }|                     ||          }|                     i d|d|                      |d          d|d|d	|                     |          d
|dd d|                      |d          dd dd d|                      |d          dd dd dd dd dd d|                      |d          |                      |d          |                      |d          |                     |d          |                      |d          |                      |d          dd d          S )Norder_idclient_order_idru   timer   r^   r;   clientOrderIdrA   r   lastTradeTimestampr=   
order_typetimeInForcepostOnlysider   	stopPricetriggerPriceamountcostr   	avg_pricecumulative_quantityleaves_quantitystatus
total_feesquote)r   currency)filled	remainingr   feer   )rY   safe_market
safe_order	parse8601safe_string_lower)r4   orderrN   r;   r   r   r   s          r6   r   zcoinbase.parse_ws_order  s     eZ00((0ABB##E<88##E622!!(F33  
E 
d&&vx88 
 " 
 ]	 

 11 
  
 !$ 
 D$$UL99 
 4 
  
 D$$UF33 
 T 
  
 D 
 d 
  D! 
" t''{;;# 
$ &&u.CDD))%1BCC,,UH==**5,?? ,,VW==  3 
  
  
   	r7   c                 X   t          dt          |                    D ]}||         }|                     |d          }|                     | j        d         |          }|                     |d          }|                     |d          }||         }	|	                    ||           d S )Nr   r   r-   price_levelnew_quantity)rz   r{   rY   r0   r   store)
r4   r   updatesr   r   sideIdr   r   r   orderbookSides
             r6   handle_order_book_helperz!coinbase.handle_order_book_helper  s    q#g,,'' 	/ 	/AAJE%%eV44F##DL$96BBD$$UM::E%%e^<<F%dOMv....	/ 	/r7   c                 &   |                      |d          }|                     |d          }t          dt          |                    D ]}||         }|                      |dg           }|                     |d          }d|z   }	|                      |j        |	i           }
|                     |
d          }|                     |          }|                     |d          }|d	k    r|                     i |          | j        |<   | j        |         }| 	                    ||           d |d<   d |d
<   ||d<   |
                    ||	           |	                    d          r|
                    ||	dz              6|dk    r| j        |         }| 	                    ||           ||d
<   |                     |          |d<   ||d<   |
                    ||	           |	                    d          r|
                    ||	dz              |S )Nrt   rA   r   r   ru   zlevel2::r   r=   snapshotr   r^   rv   rw   update)ry   rY   rz   r{   subscriptionsrZ   r   
order_book
orderbooksr   r~   r   r   )r4   r   r   rt   r   r   r   r   r   r`   subscriptionr   r^   r=   r   s                  r6   handle_order_bookzcoinbase.handle_order_book  s*   : (33##G[99q#f++&& 	A 	AA1IEooeY;;G''|<<H$x/K??6+?bQQL%%lG<<E%%h//F##E622Dz!!*.//"e*D*D' OF3	--iAAA)-	+&(,	*%&,	(#y+666''.. ANN9kC.?@@@!! OF3	--iAAA(0	*%)-)A)A	+&&,	(#y+666''.. ANN9kC.?@@@r7   c                     |S N )r4   r   r   s      r6   handle_subscription_statusz#coinbase.handle_subscription_status!  s	     r7   c                 F   |                      |d          }| j        | j        | j        | j        | j        | j        d}|                      |d          }|dk    r%|                      |d          }t          |          |                     ||          } |||           d S )Nr?   )r   rl   ro   r   r   l2_datar=   errorr   )rY   r  r   r   r   r   r   ry   )r4   r   r   r?   methodsr=   errorMessagemethods           r6   handle_messagezcoinbase.handle_message/  s    ""7I66!<) /!.%-
 
 007??++GY??L---'22vwr7   r   )__name__
__module____qualname__r3   r<   strr	   rm   r   r
   rr   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __classcell__)r5   s   @r6   r   r      s'       $ $ $ $ $L ,0 4J 4J 4J 4Jl 68 	: 	: 	:F 	: 	: 	: 	: 6:"  7      Z Z Zx+ + + +Z <@d[] S S SS S Sbfglbm S S S S$ 04$UYbd S S SC Ss Simnsit S S S S" @DB ! !S ! !S\ ! ! ! ! - - -^4 4 4l/ / / /b/ / /; ; ;z               r7   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   rW   ccxt.base.typesr   r   r   r   r   r	   r
   r   typingr   ccxt.base.errorsr   r   async_supportr   r   r7   r6   <module>r     s        C C C C C C  W W W W W W W W W W W W W W W W W W W W       * * * * * * . . . . . .o  o  o  o  o t!* o  o  o  o  o r7   