
    i                    :   d Z d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 ddlm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!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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl5m7Z7 	 ddl8Z9n# e:$ r dZ9Y nw xY wddl;m<Z< dd l;m=Z= dd!l>m?Z? d"gZ@ddlAZAddlBZBddlCZCddlDZDddlEZEddlFZFddlGZGdd#lHmIZI ddlJZJddlKZKddlLZLddlMZMddlNZNddlOZOddlPZPdd$lQmRZR ddlSZSdd%lTmUZU dd&lVmWZW dd'lXmYZYmZZZm[Z[m\Z\m]Z^ dd(l_m`Z` ddlaZaddlbZbddlcZcdd)ldmeZe dd*lamfZf dd+lgmhZh ddlimjZk dd,llmmZmmnZn dd-l moZo  G d. d"ep          ZqdS )/Base exchange classz4.3.1    )ExchangeError)NetworkError)NotSupported)AuthenticationError)DDoSProtection)RequestTimeout)ExchangeNotAvailable)InvalidAddress)InvalidOrder)ArgumentsRequired)	BadSymbol)NullResponse)RateLimitExceeded)
BadRequest)BadResponse)
ProxyError)decimal_to_precision)DECIMAL_PLACES	TICK_SIZE
NO_PADDINGTRUNCATEROUNDROUND_UP
ROUND_DOWNSIGNIFICANT_DIGITS)number_to_string)Precise)BalanceAccountCurrency	IndexType	OrderSide	OrderTypeTradeOrderRequestMarket
MarketTypeStrNumStrings)backends)hashes)padding)load_pem_private_key)ecdsa)keccakN)abi)accountpackbExchange)	parsedate)Number)Session)default_user_agent)	HTTPErrorTimeoutTooManyRedirectsRequestExceptionConnectionError)SSLError)Decimal)mktime)format_date_time)AnyList)Intc                   &@   e Zd ZU dZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZddii i dd	Zddii i dd	ZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<d
dddZ=dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdddddddddddddZNi deOdePdeQdeRdeRdeRdeRdeRdeRdeRdeRdeRdeRdeRd eRd!eRd"eReReReReSeSeTeTeTd#ZUdZVdZWdZXdZYdZZdZ[dZ\dZ]dZ^dZ_dZ`dZadZbdZcdZddZedddddddddd$	Zfi d%dd&dd'dd(dd)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3dd4dd5di d6dd7dd8dd9dd:d;d<dd=dd>dd?dd@ddAddBddCddDddEddFddGd;i dHddIddJddKddLddMddNddOddPddQddRddSddTddUddVddWddXdi dYddZdd[dd\dd]dd^dd_dd`ddaddbddcdddddeddfddgddhddidi djddkddlddmddnddoddpddqddrddsddtdduddvddwddxddyddzdddddddddddddd{ZgehZiejZkd|ZldZmdZneoZpeqerd}<   dZsdZtd~Zud~ZvdZwdZxdZydZzd~Z{dZ|dZ}dZ~dZdZdZdZdZdZdZdZdZdZddddZdZi fdZd Zd Zd Zd ZddZed             ZddZd Zd Zd ZddZd Zd Zed             Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zed             Zedd            Zedd            Zedd            Zedd            Zedd            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zedd            Zedd            Zed             Zed             Zed             Zedd            Zed	d            Zed             ZedÄ             ZedĄ             Zedń             ZedƄ             Zei dfdǄ            Zei fdȄ            ZedɄ             Zei fdʄ            Zed
d̄            Zed̈́             Zed΄             Zedτ             ZedЄ             Zedф             Zed҄             Zedӄ             ZedԄ             ZedՄ             Zedք             Zedׄ             Zed؄             Zeddل            Zeddڄ            Zedd܄            Zedd݄            Zeddބ            Zedd߄            Zedd            Zedd            Zedd            Zedd            Zeej        dfd            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zeddi fd            Zedd            Zed             Zed             Zed             Zed             Zed             Zedd            Zedd            Zedd            Zedd            Zed             Zed             Zed             Zed              Zedd            Z d Zd Zdi fdZi fdZi fdZd Zed             Zeefd	            Z	d
 Z
d Zd Zed             Zed             Zed             Zed             Zed             Zed             Zd Zed             Zed             ZddZd Zd Zd Zed	d            Zd Zd Zd Zd ZddZdd Z d! Z!d" Z"d# Z#d$ Z$d% Z%dd&e&e'         d'e(fd(Z)dd)e'd*e'd'e(fd+Z*dd,e'd'e(fd-Z+dd&e&e'         d'e,fd.Z-dd,e'd'e,fd/Z.dd)e'd*e/d'e,fd0Z0dd&e&e'         d'e&e1         fd1Z2dd)e'd*e/d'e&e1         fd2Z3dd,e'd'e&e1         fd3Z4d4 Z5d5 Z6d6 Z7dd7Z8dd8e9d9e9fd:Z:dd8e9d9e9fd;Z;d< Z<d= Z=d>e/fd?Z>ddAe&e?         dBe@d,e'dCe(fdDZAddAe&e?         dEe@dBe@d,e'fdFZBddAe&e?         dGe'dEe@dBe@fdHZCdIe(fdJZDdKdi ddfdLe1dMe1dNe1fdOZEi fdPZFddi fdQe/dEe@dBe@fdRZGddi fdQe/dEe@dBe@fdSZHddi fdQe/dEe@dBe@fdTZIddi fdUe&e/         dEe@dBe@fdVZJddi fdUe&e/         dEe@dBe@fdWZKddi fdUe&e/         dEe@dBe@fdXZLddi fdYe&e&e/                  dEe@dBe@fdZZMdi fdUe&e/         dBe@fd[ZNdi fd\e&e/         fd]ZOdi fdQe/dBe@fd^ZPi fdQe/fd_ZQdi fdUe&e/         fd`ZRdi fdaZSdi fdQe/dBe@fdbZTi fdcZUdi fdUe&e/         fddZVde ZWdf ZXddge?dheYfdiZZddje[fdkZ\ddle?dheYfdmZ]ddje[fdnZ^ddje[fdoZ_dp Z`ddje[fdqZaddheYfdrZbi fdsZci fdtZdddheYfduZedi fdUe&e/         fdvZfddheYfdwZgddheYfdxZhddheYfdyZiddheYfdzZjddheYfd{ZkddheYfd|ZlddheYfd}Zmdi fdUe&e/         fd~Zni fdQe/fdZoi fdUe&e/         fdZpi fdUe&e/         fdZqi fde/deode/de/fdZrdi fde/deode/fdZsi fde/fdZtdi fde@dQe9fdZui fdQe/fdZvdi fdUe&e/         fdZwdi fde(dQe9fdZxi fdQe/deofdZyi fdQe/deofdZzi fdQe/deofdZ{ddddi fdQe9de9dEeqdBeqfdZ|di fde/dQe9fdZ}i fde/fdZ~dddi fdQe/dEe@dBe@fdZi fdQe/fdZi fdZi fdZd Zd ZdeofdZd Zd Zd Zdde?dje[fdZdje?fdZddZddZde1de1de,fdZde?fdZdde?dheYfdZdddi fde?dheYdEe@dBe@fdZdi fdQe/de/de/deodeof
dZdde?dheYfdZddle?dheYfdZd Zd Zddge?dheYfdZi fde/fdZi fde/fdZi fdQe/de/fdZi fde/deofdZi fdQe/de/deofdZdi fde/dQe9fdZdi fde/dQe9fdÄZdddi fdQe/dEe@dBe@fdńZdddi fdQe/dEe@dBe@fdƄZdddi fdQe/dEe@dBe@fdǄZddΐe&e&eo                  fdτZddΐe&e&eo                  fdЄZddфZddUefd҄ZddUefdӄZddUede9fdԄZdd\efdՄZddאe'dؐe'dِe'fdڄZdi fdQe/dBe@fdۄZddQe9fd܄ZddheYdݐefdބZddߐe/de9fdZdde/de9fdZd Zde/fdZd Zd Zd	dZdde?d)e'd*e'fdZdde?dQe/d@e@dאe'dؐe'dِe'fdZddΐe&e?         dhe1de/dEe@dBe@f
dZdde1dUe&e/         fdZddi fdUe&e/         fdZd Zdi fde&e1         dUe&e/         fdZi fde&e1         fdZdddi fde&e1         dheYdEe@dBe@fdZdddi fde&e1         dje[dEe@dBe@fdZdddi fde&e1         dje[dEe@dBe@fdZdddi fdje[dEe@dBe@fdZd  Zd ZdQe/fdZÐdQe/fdZĐdde?de/d'e9fdZŐdde?de/d'e@fdZƐd Zǐd,e'fd	ZȐdd
e9de9de(de(fdZɐdd,e'fdZʐdKdi ddi fdLe1dMe1dNe1fdZːdKdi ddi fdLe1dMe1dNe1fdZdi fdZ͐d de&e         de/dEeodBeofdZϐddEe@dBe@fdZdi fde/dQe/deodeqfdZdi fde/dQe/deodeqfdZdi fde/dQe/deӐdeodeqf
dZddi fde/dQe/deՐdeӐdeqdeqfdZdi fde/dQe/deՐdeӐdeodeqfdZi fdZi fdQe/fdZdi fdQe9fdZdddi fdUe&e/         dEe@dBe@fdZdddi fdUe&e/         dEe@dBe@fd Zi fdQe/fd!Zdi fdUe&e/         fd"Zdi fdUe&e/         fd#Zdi fdUe&e/         fd$Zddddi fde9dQe9dEe@dBe@fd%Zdddi fde9dEe@dBe@fd&Zdi fde/de9fd'Zddאe'dؐe'dِe'fd(Zdd)e9dje[fd*Zd!d+e9dheYd,e9d
e9fd-Zdd.Zd/ Zi fd0Zi fd1Zd2 Zi fd3Zi fd4Zi fd5Zi fd6Zi fd7Zi fd8Zi fde/fd9Zdi fd\e&e/         fd:Zdi fd\e&e/         fd;Zi fde/fd<Zi fd=Zi fde/fd>Zi fdQe/fd?Zdde?d@e/dAe/fdBZdde?d@e/dCe/dAe/fdDZdd@e/dAe/fdEZdi dfd@e/dheYfdFZdi dfd@e/fdGZi dfd@e/fdHZdI ZdJ Z dK ZdL Zi fdMZi fdQe/fdNZi fdQe/fdOZdi fdUe&e/         fdPZddi fdUe&e/         dBe@fdQZdi fdUefdRZdi fdUe&e/         fdSZ	di fde/dQe9fdTZ
di fde/dQe9fdUZdi fde/dQe9fdVZi fdWZdi fdQe/deՐdeӐdeodeqf
dXZdddi fdQe/deՐdeӐdeodeqf
dYZdddi fdQe/deՐdeӐdeodeqf
dZZi fdQe/deӐd[eofd\Zi fdQe/d[eofd]Zi fdQe/d[eofd^Zddi fdQe/deՐdeӐdeodeqd_eqfd`Zddi fdQe/deՐdeӐdeodeqdaeqfdbZddi fdQe/deՐdeӐdeodeqdceqfddZdddi fdQe/deՐdeӐdeodeqdeeqdfeqfdgZi fde&e         fdhZdi fdQe/deՐdeӐdeodeqf
diZdi fde/dQe9fdjZdi fde/dQe9fdkZdi fdle&e/         dQe9fdmZdi fdQe9fdnZdi fdQe9fdoZi fdpZ dddi fdQe9dEe@dBe@fdqZ!dddi fdQe9dEe@dBe@fdrZ"dddi fde/dQe9dEe@dBe@fdsZ#dddi fdQe9dEe@dBe@fdtZ$dddi fdQe9dEe@dBe@fduZ%dddi fdQe9dEe@dBe@fdvZ&dddi fdQe9dEe@dBe@fdwZ'dddi fdQe9dEe@dBe@fdxZ(dddi fdQe9dEe@dBe@fdyZ)dddi fdQe9dEe@dBe@fdzZ*dddi fdQe9dEe@dBe@fd{Z+ddi fdQe/dEe@dBe@fd|Z,dddi fdQe9dEe@dBe@fd}Z-dddi fdQe9dEe@dBe@fd~Z.i fdQe/fdZ/i fde/fdZ0i fdQe/fdZ1di fde/de/deqfdZ2dddi fde9dEe@dBe@fdZ3dddi fdQe9dEe@dBe@fdZ4dddi fdQe9dEe@dBe@fdZ5dddi fde9dEe@dBe@fdZ6dddi fde9dEe@dBe@fdZ7dddi fdQe9dEe@dBe@fdZ8dddi fdQe9dEe@dBe@fdZ9di fdQe/defdZ:i fdZ;di fdQe/dBe@fdZ<ddheYfdZ=i fde/fdZ>dݐe?fdZ@de/fdZAde/fdZBdQe/fdZCdQe/fdZDd ZEi fdQe/deӐdeodeofdZFdi fdQe/deӐdeodeqfdZGi fdQe/deodeofdZHi fdQe/deodeofdZIi fdQe/deofdZJi fdQe/deofdZKdQe/fdZLdQe/fdZMdQe/fdZNdQe/fdZOdde/fdZPd ZQd ZRd ZSd ZTdde?d,e'deqfdZUdde?de&e'         deqfdZVde/fdZWde9fdZXi fdZYd8e/fdZZi fdQe/fdZ[di fdQe/deՐdeӐdeodeqf
dZ\di fdQe/deՐdeӐdeodeqf
dZ]ddi fdQe/deՐdeӐdeodeqdeqfdZ^i fdQe/deӐdeodeodeof
dZ_i fdQe/deӐdeodeofdZ`dd)e9dje[fdZad"dQe9dEe@dBe@fdZbd"dEe@dBe@fdZcd"dUe&e/         dEe@dBe@fdZddi fdUe&e/         fdZedi fdUe&e/         fdZfddi fd\e&e/         fdZgddheYfdZhd!dEe@dBe@fdZid!d+e9dheYd,e9d
e9fdZjdde/dheYfdZkddheYfdÄZldĄ Zmi fdŐe(fdƄZni fdŐe(dǐe(de1fdȄZodi fdUe&e/         fdɄZpi fdʄZqi fd˄Zri fdQe/fd̄Zsi fd̈́ZtddheYfd΄Zud!dEe@dBe@fdτZvi fdQe/fdЄZwdddi fdEe@dBe@fdфZxdddi fdQe/dEe@dBe@fd҄Zydddi fdQe/dEe@dBe@fdӄZzi fdԄZ{dՄ Z|g fd@e/fdքZ}d@e/dQe9de/fdׄZ~dd\e&e/         fd؄Zddje[fdلZdڄ ZddۄZddheYfd܄Zd!dEe@dBe@fd݄ZddUe&e/         fdބZddΐe&e?         dhe1de/dEe@dBe@f
d߄Zdddi fde9dEe@dBe@fdZdd,e'fdZdd,e'fdZdQe/de/fdZdi fd9e/de@fdZdddi dfd9e/dQe9dEe@dBe@de@f
dZddddi fd9e/dQe9dEe@dBe@de9f
dZddddi dfd9e/dQe9dEe@dBe@de9f
dZdddi ddddfd9e/dQe9fdZdddi ddfd9e/dQe9fdZd Zd Zd#d,e/fdZddheYfdZddheYfdZd!dEe@dBe@fdZddheYfdZddje[dheYfdZdde&e?         de9de9fdZd!de&e?         dUe&e/         de9d
efdZddheYfdZd!de&e?         dUe&e/         de9d
efdZddheYfdZdde[de[fdZde/fdZde/fdZde/fd ZddheYfdZd!de&e?         dUe&e/         de9d
efdZdS ($  r5   r   NFTi  i'  
percentage)withdrawdeposittradingfundingzrMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36zlMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36zyMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36)chromechrome39	chrome100* minmaxleverageamountpricecost422418429404409410451500501502520521522525526400403)405503530408504401407511)	apiKeysecretuidloginpasswordtwofa
privateKeywalletAddresstoken	publicAPI
privateAPICORSspotmarginswapfutureoption	addMargincancelAllOrderscancelOrdercancelOrderscreateDepositAddresscreateLimitOrdercreateMarketOrdercreateOrdercreatePostOnlyOrdercreateReduceOnlyOrdercreateStopOrdercreateStopLimitOrdercreateStopMarketOrder	editOrderemulatedfetchAccountsfetchBalancefetchBidsAsksfetchBorrowInterestfetchBorrowRatefetchBorrowRateHistoryfetchBorrowRatesPerSymbolfetchBorrowRatesfetchCanceledOrdersfetchClosedOrderfetchClosedOrdersfetchCurrenciesfetchDepositfetchDepositAddressfetchDepositAddressesfetchDepositAddressesByNetworkfetchDepositsfetchFundingHistoryfetchFundingRatefetchFundingRateHistoryfetchFundingRatesfetchIndexOHLCVfetchLastPricesfetchL2OrderBookfetchLedgerfetchLedgerEntryfetchLeverageTiersfetchMarketLeverageTiersfetchMarketsfetchMarkOHLCVfetchMyTrades
fetchOHLCVfetchOpenOrderfetchOpenOrders
fetchOrderfetchOrderBookfetchOrderBooksfetchOrdersfetchOrderTradesfetchPermissionsfetchPositionfetchPositionsfetchPositionsRiskfetchPremiumIndexOHLCVfetchStatusfetchTickerfetchTickers	fetchTimefetchTradesfetchTradingFeefetchTradingFeesfetchTradingLimitsfetchTransactionsfetchTransfersfetchWithdrawalfetchWithdrawalsreduceMarginsetLeverage	setMarginsetMarginModesetPositionModesignIntransfer)rH   watchOrderBookwatchOrderswatchMyTradeswatchTickerswatchTickerwatchTradeswatchTradesForSymbolswatchOrderBookForSymbolswatchOHLCVForSymbolswatchBalance
watchOHLCV   numberr      :123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzBTCBCHBSV)XBTBCCBCHSVc                 	   	  j         p j         _          j        p j         _         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j	        t	                      n j	         _	         j
        t	                      n j
         _
         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j        t	                      n j         _         j                                         n j         _        t$           _        t&           _                                          _        t-                       _                                                              |          }|D ]}t5           |          r]t7          t9           |          t                    r:t;           |                     t9           |          ||                              ot;           |||                     j        r                      j                                                      tC                     }tE                     D ]}|d         dk    r|d         dk    rd|v r|#                    d          }dddd	|d         d$                    	 fd	|d
d          D                       z   }t9           |          }t7          |tJ          j&                  r t;          ||t9          ||                     t5           |          r|t;           ||           t;           ||            '                     j(        dk    r
d j(        z  ntS          d          ddddt9           di                      _*         j+        s+ j,        r$t[                       _+         j         j+        _         j.        r j.        nt_          j0        tb                     _.        d S )Nr   _OHLCVLEBE)ohlcvleberQ   c              3   j   K   | ]-}                     |                    |                    V  .d S N)get
capitalize).0i
exceptionsselfs     X/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/ccxt/base/exchange.py	<genexpr>z$Exchange.__init__.<locals>.<genexpr>  s?      .h.hYZz~~aQRASAS/T/T.h.h.h.h.h.h    r   g      ?infgMbP?)
refillRatedelaycapacitydefaultCosttokenBucket)2aiohttp_trust_env	trust_envrequests_trust_env	precisiondictlimitsr   headersbalance
orderbookstickersbidsaskstradestransactionsohlcvs
currenciesoptionsget_default_optionsr   r   uuidoriginr9   	userAgentdeep_extenddescribehasattr
isinstancegetattrsetattrmarketsset_marketsafter_constructtypedirsplitjointypes
MethodTypeextend	rateLimitfloatr   sessionsynchronousr8   loggerlogging	getLogger__name__)
r   configsettingskeyclsnameparts	camelcaseattrr   s
   `        @r   __init__zExchange.__init__  s@   !%!7!I4>"&"9"KT^#'>#9t~ $ 3dfff$(O$;$&&&!%!5tvvv4<!%!5tvvv4<$(O$;$&&&!%!5tvvv4<"&-"7T] $ 3dfff&*&7&?DFFFTEV $ 3dfff$(O$;$&&&59\5It//111t|$8! 0 iikk+--##DMMOOV<< 	2 	2CtS!! 2js1C1CT&J&J 2c4#3#3GD#4F4FQT#V#VWWWWc8C=1111< 	+T\*** 4jjII 	7 	7DAw#~~$r(c//cTkk

3'.d$GG
!!Hrww.h.h.h.h.h^cdedfdf^g.h.h.h'h'hh	tT**dE$455 7CGC,>,>????tY// 7+#D)T:::i666;;26.12D2D#..%PU,,	(
 (

 4++- - | 	= 0 	="99DL%)%<DL"%)[Qdkkg6G6Q6Qr   c                 |    | j         r4	 | j                                          d S # t          $ r}Y d }~d S d }~ww xY wd S r   )r'  close	Exception)r   es     r   __del__zExchange.__del__  sa    < 	""$$$$$   	 	s   $ 
99c                 4    d| j         rdndz   | j        z   dz   S )Nzccxt.zasync_support.rQ   z())asyncio_loopidr   s    r   __repr__zExchange.__repr__  s(    d.?G**RH47RUYYYr   c                     | j         S r   )r1  r>  s    r   __str__zExchange.__str__  s
    yr   c                     i S r    r>  s    r   r  zExchange.describe      	r   c                     t          |                                           }|| j        z
  }|dn|}| j        |z  }||k     r||z
  }t	          j        |dz             d S d S )Nr   g     @@)r&  millisecondslastRestRequestTimestampr%  timesleep)r   rY   nowelapsed
sleep_timer   s         r   throttlezExchange.throttle  sx    D%%''((55Lqqd^d*
Z(EJuv~&&&&&  r   c                    |                                                      d          }|dv ra|dk    r t          j        |t          j                   S t          j        dddt          j        |                    	                                S |S )NzContent-Encoding)gzipzx-gzipdeflaterP  rQ   rb	   )
infor   zlib
decompress	MAX_WBITSrO  GzipFileioBytesIOread)responsetextencodings      r   gzip_deflatezExchange.gzip_deflate  s|    ==??&&'9::4449$$tdn_===}Rq"*T2B2BCCHHJJJr   c                    |pi }| j         r|                    | j         j                   |                    | j                   | j        | j        n| j        }|r]t          |          t          u r|                    d|i           n/t          |          t          u rd|v r|                    |           |                    ddi           |                     |          S )Nz
User-AgentzAccept-Encodingzgzip, deflate)	r'  updater  r  
user_agentr  strr  set_headers)r   r  r  s      r   prepare_request_headersz Exchange.prepare_request_headers  s    -R< 	1NN4</000t|$$$&*n&@DNNdo	 	*I#%%i89999y//T))	0I0Iy))))?;<<<(((r   c                     t          |  d S r   )print)r   argss     r   logzExchange.log  s    tr   c	                 *    |                                 S r   strip)	r   codereasonurlmethodresponse_headersresponse_bodyrequest_headersrequest_bodys	            r   on_rest_responsezExchange.on_rest_response"  s    ""$$$r   c                 z    | j         r!t          j        |t          t                    S t          j        |          S )N)parse_float	parse_int)quoteJsonNumbersjsonloadsrb  )r   rq  s     r   on_json_responsezExchange.on_json_response%  s4      	-:mLLLL:m,,,r   GETc                 l
   |                      |          }|                     ||||          }|!|                    d| j        i           ||z   }d}|                     ||||          \  }}	}
|ri }||d<   n|	ri }|	|d<   n|
ri }|
|d<   |
|d<   |du}|                     ||           | j        "|s|rt          | j        dz             | j        }| j	        r!| 
                    d| j        ||d|d|           | j                            d	||||           |}|r|                                }| j        j                                         d}d}d}d}	 | j                            ||||| j        d
z  || j        o| j                  }d|_        |j        }|j        }|j        }|                     ||||||j        ||          }|                     |          }| j        r|| _        | j        r|| _        | j         r|| _!        | j	        r"| 
                    d| j        |||d|d|	  	         | j                            d|||||           |"                                 nZ# tF          $ r2}d$                    | j        ||g          }tK          |          |d}~wtL          $ r2}d$                    | j        ||g          }t          |          |d}~wtN          $ r2}d$                    | j        ||g          }t          |          |d}~wtP          $ rj}d$                    | j        ||g          }| )                    |||||||||	  	        }|s| *                    |||||           t          |          |d}~wtV          $ rU}tY          |          d$                    | j        ||g          }dv rtK          |          |t[          |          |d}~wt\          $ rA}tY          |          d$                    | j        ||g          }t[          |          |d}~wt^          $ r}tY          |          dv rta          | j        dz             d$                    | j        ||g          }tc          fddD                       rt[          |          |t          |          |d}~ww xY w| )                    |||||||||	  	         ||S | 2                    |          r|S tg          |j4        tj                    r|j4        6                    d          S |j4        S )z3Perform a HTTP request and return decoded JSON dataNOriginhttphttpszb you have conflicting proxy settings - use either .proxies or http(s)Proxy / socksProxy / proxyUrlz
fetch Request:zRequestHeaders:zRequestBody:z%s %s, Request: %s %s  )datar  timeoutproxiesverifyzutf-8z
fetch Response:zResponseHeaders:zResponseBody:z%s %s, Response: %s %s %s zRead timed outz&Missing dependencies for SOCKS supportzo - to use SOCKS proxy with ccxt, you might need "pysocks" module that can be installed by "pip install pysocks"c              3       K   | ]}|v V  	d S r   rC  )r   xerror_strings     r   r   z!Exchange.fetch.<locals>.<genexpr>  s(      jj1$jjjjjjr   )
ECONNRESETzConnection aborted.zConnection broken:utf8)7rd  check_proxy_url_settingsr`  r  check_proxy_settingscheck_conflicting_proxiesr  r   r=  verboserh  r)  debugencoder'  cookiesclearrequestr  r  validateServerSslr]  r  status_coderm  rt  r\  
parse_jsonenableLastHttpResponselast_http_responseenableLastJsonResponselast_json_responseenableLastResponseHeaderslast_response_headersraise_for_statusr;   r!  r	   r<   r?   r:   handle_errorshandle_http_status_coderequestsConnectionErrorrb  r   ConnectionResetErrorr=   r   anyis_text_responser  contentbytesdecode)r   rn  ro  r  bodyrr  proxyUrlr  	httpProxy
httpsProxy
socksProxyproxyAgentSetrs  http_responsehttp_status_codehttp_status_textjson_responser[  r9  detailsskip_further_error_handlingr  s                        @r   fetchzExchange.fetch+  s    66w??00fgtLL""Hdk#:;;;S.C,0,E,Ec6SZ\`,a,a)	:z 
	*G'GFOO 	*G)GG 	*G(GFO)GGt+&&}h???L$ T T#DG  /S  %S  T  T  TlG< 	yHH'&#?PRacqswxxx163QUVVV  	!;;==D""$$$E	4|++',{=t'= ,  H !(H&G'3' 112BDTVY[acjltly  |K  MY  Z  ZM OOM::M* 8*7'* 8*7'- 5-4*| S,dgvsDTVhjq  tC  ER  S  S  SK963HXZacpqqq%%'''' 	1 	1 	1hh566G ))q0 	0 	0 	0hh566G((a/ 	0 	0 	0hh566G((a/ 	0 	0 	0hh566G*.*<*<=MO_adflnu  xE  GT  Ve  gs  +t  +t'. m,,-=?OQTV\^klll((a/& 	3 	3 	3q66Lhh566G<//$W--14"7++2# 	/ 	/ 	/q66Lhh566Gw''Q. 	4 	4 	4q66L8LHH"47  ._  $_  `  `  `hh566Gjjjj.ijjjjj 4"7++2#G,,!3	4 	+-=sFGUbdq  tC  EQ  	R  	R  	R$  ""7++ 	$  (*E22 7'..v666##sd   DI) )
S 3-J  S --KS '-LS !A%NS AO##S 0<P,,S 9BR;;S c                     	 t                               |          r|                     |          S d S # t          $ r Y d S w xY wr   )r5   is_json_encoded_objectr{  
ValueError)r   r  s     r   r  zExchange.parse_json  s]    	..}== <,,];;;< < 	 	 	DD	s   .3 
A Ac                     |                     dd          }|                    d          p|                    d          S )NzContent-TyperQ   zapplication/jsonztext/)r   
startswith)r   r  content_types      r   r  zExchange.is_text_response  s>    {{>266&&'9::^l>U>UV]>^>^^r   c                     t          | d          rft          | t                    sQt          | t                    rt	          |          t
          urdS 	 | |         }|d uo|dk    S # t          $ r Y dS w xY wdS )N__getitem__FrQ   )r  r  rb  listr  intLookupError)
dictionaryr/  values      r   
key_existszExchange.key_exists  s    :}-- 	jS6Q6Q 	*d++ S		0D0Du"3D(8Ub[8   uuus   A& &
A43A4c                     |}	 t                               | |          rt          | |                   }n# t          $ r}|}Y d }~nd }~ww xY w|S r   )r5   r  r&  r  )r  r/  default_valuer  r9  s        r   
safe_floatzExchange.safe_float  si    	""":s33 /jo.. 	" 	" 	"!EEEEEE	"s   05 
AAAc                 f    t                               | |          rt          | |                   n|S r   )r5   r  rb  r  r/  r  s      r   safe_stringzExchange.safe_string  s/    '/':'::s'K'K^s:c?###Q^^r   c                     t                               | |          r't          | |                                                   S ||                                n|S r   )r5   r  rb  lowerr  s      r   safe_string_lowerzExchange.safe_string_lower  U    z3// 	Yz#''--///,9,E=&&(((=Xr   c                     t                               | |          r't          | |                                                   S ||                                n|S r   )r5   r  rb  upperr  s      r   safe_string_upperzExchange.safe_string_upper  r  r   c                     t                               | |          s|S | |         }	 t          t          |                    S # t          $ r |cY S t
          $ r |cY S w xY wr   )r5   r  r  r&  r  	TypeError)r  r/  r  r  s       r   safe_integerzExchange.safe_integer  s    "":s33 	!  3	! uU||$$$ 	! 	! 	!     	! 	! 	!    	!s   A AAAc                 (   t                               | |          s|S | |         }t          |t                    rt	          ||z            S t          |t
                    r0	 t	          t          |          |z            S # t          $ r Y nw xY w|S r   )r5   r  r  r7   r  rb  r&  r  )r  r/  factorr  r  s        r   safe_integer_productzExchange.safe_integer_product  s    "":s33 	!  3eV$$ 	uv~&&&s## 	5<<&0111   s   #B 
BBc                 <    t                               | |d|          S Nr  r5   r  r  s      r   safe_timestampzExchange.safe_timestamp  s    ,,ZdMRRRr   c                 L    t                               | |          r| |         n|S r   )r5   r  r  s      r   
safe_valuezExchange.safe_value  s%    "*"5"5j#"F"FYz#MYr   c                 R    t                               t           j        | |||          S r   )r5   safe_eitherr  r  key1key2r  s       r   safe_float_2zExchange.safe_float_2  "    ##H$7T4Q^___r   c                 R    t                               t           j        | |||          S r   )r5   r  r  r  s       r   safe_string_2zExchange.safe_string_2
  s"    ##H$8*dDR_```r   c                 R    t                               t           j        | |||          S r   )r5   r  r  r  s       r   safe_string_lower_2zExchange.safe_string_lower_2  #    ##H$>
DRVXefffr   c                 R    t                               t           j        | |||          S r   )r5   r  r  r  s       r   safe_string_upper_2zExchange.safe_string_upper_2  r  r   c                 R    t                               t           j        | |||          S r   )r5   r  r  r  s       r   safe_integer_2zExchange.safe_integer_2  s"    ##H$9:tTS`aaar   c                 |    t                               | ||          }||nt                               | |||          S r   r  )r  r  r  r  r  r  s         r   safe_integer_product_2zExchange.safe_integer_product_2  s?    --j$GG)uux/L/LZY]_egt/u/uur   c                 >    t                               | ||d|          S r  )r5   r  r  s       r   safe_timestamp_2zExchange.safe_timestamp_2  s    ..z4t][[[r   c                 R    t                               t           j        | |||          S r   )r5   r  r  r  s       r   safe_value_2zExchange.safe_value_2#  r  r   c                     t                               | |          }||S 	 t          |          }n# t          $ r}|}Y d }~nd }~ww xY w|S r   )r5   get_object_value_from_key_listr&  r  )r  key_listr  r  r9  s        r   safe_float_nzExchange.safe_float_n)  sg    77
HMM=  	"%LLEE 	" 	" 	"!EEEEEE	"s   1 
AAAc                 ^    t                               | |          }|t          |          n|S r   )r5   r  rb  r  r  r  r  s       r   safe_string_nzExchange.safe_string_n4  s,    77
HMM".s5zzzMAr   c                     t                               | |          }|!t          |                                          S ||S |                                S r   )r5   r  rb  r  r  s       r   safe_string_lower_nzExchange.safe_string_lower_n9  S    77
HMMu::##%%%"   &&(((r   c                     t                               | |          }|!t          |                                          S ||S |                                S r   )r5   r  rb  r  r  s       r   safe_string_upper_nzExchange.safe_string_upper_nC  r  r   c                     t                               | |          }||S 	 t          t          |                    S # t          $ r |cY S t
          $ r |cY S w xY wr   )r5   r  r  r&  r  r  r  s       r   safe_integer_nzExchange.safe_integer_nM  s    77
HMM=  	! uU||$$$ 	! 	! 	!     	! 	! 	!    	!s   = AAAc                 $   | |S t                               | |          }||S t          |t                    rt	          ||z            S t          |t
                    r0	 t	          t          |          |z            S # t          $ r Y nw xY w|S r   )r5   r  r  r7   r  rb  r&  r  )r  r  r  r  r  s        r   safe_integer_product_nzExchange.safe_integer_product_n[  s      77
HMM=  eV$$ 	uv~&&&s## 	5<<&0111   s   !B   
BBc                 <    t                               | |d|          S r  )r5   r  )r  r  r  s      r   safe_timestamp_nzExchange.safe_timestamp_nk  s    ..z8T=YYYr   c                 L    | |S t                               | |          }||n|S r   )r5   r  r  s       r   safe_value_nzExchange.safe_value_no  s2      77
HMM)uu}<r   c                     |D ]m}t          |t                    r#|| v r| |         | |         dk    r
| |         c S :|1|t          |           k     r| |         | |         dk    r
| |         c S nd S NrQ   r  rb  len)dictionary_or_listr  r/  s      r   r  z'Exchange.get_object_value_from_key_listv  s     	3 	3C#s## 3,,,1CC1H1TYkloYptvYvYv-c2222#011118J38O8[btuxby}bb-c2222tr   c                 <     | ||          }||n | |||          S )z/A helper-wrapper for the safe_value_2() family.rC  )ro  r  r  r  r  r  s         r   r  zExchange.safe_either  s2     z4(()uuvvj$/V/VVr   c                     |dk    r/t          j        d|          }t          j        | |z            |z  S t          t                              | |                    S )z,Deprecated, use decimal_to_precision insteadr   
   )mathpowtruncr  r5   truncate_to_string)numr  decimal_precisions      r   truncatezExchange.truncate  sY     q== $Y 7 7:c$55669JJJ8..sI>>???r   c                    |dk    r|d|z                       t          |                                         d          }|d         d|                             d          }t	          |          r|nd}|d         dz   |z   S d| z  S )z3Deprecated, todo: remove references from subclassesr   z{0:.%df}.r   N0%d)formatr@   r   rstripr	  )r  r  r2  decimal_digitss       r   r  zExchange.truncate_to_string  s     q==)+33GCLLAAGGLLE"1Xjyj188==N/2>/B/BK^^N8c>N22s
r      c                 L    t          t          j        | dz            d          S N   r  r  randomgetrandbitslengths    r   uuid22zExchange.uuid22  !    f(!44c:::r   c                 L    t          t          j        | dz            d          S r  r   r#  s    r   uuid16zExchange.uuid16  r&  r   c                  B    t          t          j                              S r   )rb  r  uuid4rC  r   r   r  zExchange.uuid  s    4:<<   r   c                  j    t          t          j                                                  dd          S )N-rQ   )rb  r  uuid1replacerC  r   r   uuidv1zExchange.uuidv1  s&    4:<<  ((b111r   c                     t          |           dk    r&| d                                         | dd          S |                                 S Nr   r   )r	  r  strings    r   r   zExchange.capitalize  sG    
 v;;??#AY__...qrr

;;||~~r   c                 *    |                                  S r   rj  r2  s    r   rk  zExchange.strip  s    ||~~r   c                 n    t          j        t          |                                 d                     S )Nc                     | d         S Nr   rC  )ts    r   <lambda>z"Exchange.keysort.<locals>.<lambda>  s    PQRSPT r   )r/  )collectionsOrderedDictsorteditems)r  s    r   keysortzExchange.keysort  s.    &vj.>.>.@.@nn'U'U'UVVVr   c                      | Ud }t          | d                   t          j        u rt          j                    }ni }| D ]}|                    |           |S i S r7  )r  r:  r;  r`  rg  resultargs      r   r$  zExchange.extend  sh    FDG}} 777$022 # #c""""M	r   c                      d }| D ]f}t          |t                    rMt          |t                    si }|D ]2}t                              ||v r||         nd ||                   ||<   3d|}g|S r   )r  r  r5   r  )rg  rA  rB  r/  s       r   r  zExchange.deep_extend  s     	 	C#t$$ !&$//  F i iC"*"6"6cVmmvc{{Y]_bcf_g"h"hF3KKi r   c                 |    t                               |           } t          t          fd|                     S )Nc                     |          k    S r   rC  )r  r/  r  s    r   r9  z$Exchange.filter_by.<locals>.<lambda>  s    QsVu_ r   )r5   to_arrayr  filterarrayr/  r  s    ``r   	filter_byzExchange.filter_by  s<    !!%((F44444e<<===r   c                 :    t                               | ||          S r   )r5   rJ  rH  s      r   filterByzExchange.filterBy  s    !!%e444r   c                     i }t                               |           } fd| D             } | D ]8}|         |vrg ||         <   ||                                      |           9|S )Nc                 ,    g | ]}|v |         |S r   rC  )r   entryr/  s     r   
<listcomp>z%Exchange.group_by.<locals>.<listcomp>  s*    YYY5cUllsAWAWAWAWr   )r5   rF  append)rI  r/  rA  rO  s    `  r   group_byzExchange.group_by  s    !!%((YYYYEYYY 	- 	-ESz''%'uSz"5:%%e,,,,r   c                 8    t                               | |          S r   )r5   rR  rI  r/  s     r   groupByzExchange.groupBy  s      ,,,r   c                    i }t          |           t          u r,t                              |                                           } t          |t                    }| D ]0}|r|t          |          k     s||v r||         ||         }|||<   1|S r   )r  r  r5   r>  valuesr  r  r	  )rI  r/  rA  
is_int_keyelementks         r   index_byzExchange.index_by  s    ;;$$$U++2244ES))
 	$ 	$G $s7||!3!3#..PWX[P\PhCL#q	r   c                 2    t          | fd|          S )Nc                 (    |          |          nS r   rC  )rZ  defaultr/  s    r   r9  z"Exchange.sort_by.<locals>.<lambda>  s    QsV5G1S66W r   r/  reverser<  )rI  r/  
descendingr^  s    ` `r   sort_byzExchange.sort_by  s'    e!T!T!T!T!T^hiiiir   c                 2    t          | fd|          S )Nc                 L    |          |          nd|          |          ndfS r  rC  )rZ  r  r  s    r   r9  z$Exchange.sort_by_2.<locals>.<lambda>  s7    qw7JAdGGPR_`ae_f_rTUVZT[T[xz+{ r   r_  ra  )rI  r  r  rb  s    `` r   	sort_by_2zExchange.sort_by_2  s7    e!{!{!{!{!{  FP  Q  Q  Q  	Qr   c                     | |z   S r   rC  )abs     r   array_concatzExchange.array_concat   s    1ur   c                 
    | |v S r   rC  )needlehaystacks     r   in_arrayzExchange.in_array  s    !!r   c                     |  S r   rC  )objects    r   is_emptyzExchange.is_empty  s
    zr   c                 ,    t          j        d|           S )Nz
{([\w-]+)})refindallr2  s    r   extract_paramszExchange.extract_params  s    z-000r   c                     t          |t                    rO|D ]L}t          ||         t                    s/|                     d|z   dz   t	          ||                             } M| S )N{})r  r  r  r.  rb  )r3  paramsr/  s      r   implode_paramszExchange.implode_params  sj    fd## 	O O O!&+t44 O#^^C#IOS=M=MNNFr   c                     |                                  }|                                 D ]#\  }}t          |t                    r	|rdnd||<   $t	          j        ||t          j                  S )Ntruefalse)	quote_via)copyr=  r  bool
_urlencode	urlencodequote)ry  doseq	newParamsr/  r  s        r   r  zExchange.urlencode  sj    KKMM	 ,,.. 	> 	>JC%&& >+0!=g	##Iu
@PQQQQr   c                 `    t          j        ddt                              | d                    S )Nz	%5B\d*%5DrQ   T)rs  subr5   r  ry  s    r   urlencode_with_array_repeatz$Exchange.urlencode_with_array_repeat   s&    vlB(:(:64(H(HIIIr   c                     i dfd	t          | t                    r| D ]} | |         |           t          j                  S )Nc                 Z   i }t          | t                    r'| D ]#}d                    ||          }| |         ||<   $nRt          | t          t          f          r1t          |           D ] \  }}d                    ||          }|||<   !n| |<   |D ]}||         } ||           d S )Nz{}[{}])r  r  r  r  tuple	enumerate)	ry  p_keyencode_paramsr/  
encode_keyoffsetr  _encode_paramsrA  s	          r   r  z1Exchange.urlencode_nested.<locals>._encode_params(  s    M&$'' 	'! < <C!)!<!<J06sM*--< FT5M22 '%.v%6%6 6 6MFE!)!?!?J05M*--6 !'u$ + +%c*uc****+ +r   r   )r  r  r  r  )ry  r/  r  rA  s     @@r   urlencode_nestedzExchange.urlencode_nested$  sy    	+ 	+ 	+ 	+ 	+ 	+ 	+ fd## 	1 1 1vc{C0000#F+++r   c                 Z    t          j        t                              |                     S r   )r  unquoter5   r  r  s    r   	rawencodezExchange.rawencode<  s!    !("4"4V"<"<===r   ~()*!.'c                 .    t          j        | |          S )N)safe)r  r  )urir  s     r   encode_uri_componentzExchange.encode_uri_component@  s    $////r   c                     t          | t                    rE|                                 }|D ],}t          |          t          u r|D ]	}||v r||= 
%||v r||= -|S | S r   )r  r  r  r  r  )drg  rA  rB  r/  s        r   omitzExchange.omitD  s    a 
	VVXXF ( (99$$" , ,&== &s, f}}"3KMr   c                 :    t          t          |                     S r   )r  setrI  s    r   uniquezExchange.uniqueS  s    CJJr   c                      fd| D             S )Nc                 8    g | ]}|v |         |         S r   rC  )r   rY  r/  s     r   rP  z"Exchange.pluck.<locals>.<listcomp>Y  s9     
 
 
wWS\%= CL%=%=%=r   rC  rT  s    `r   pluckzExchange.pluckW  s.    
 
 
 
 
 
 
 	
r   c                  4    t          d | D                       S )Nc                 J    g | ] }t          |t          t          f          |!S rC  )r  r&  r  )r   rB  s     r   rP  z Exchange.sum.<locals>.<listcomp>a  s+    IIIC:cE3<+H+HICIIIr   )sum)rg  s    r   r  zExchange.sum_  s    II4IIIJJJr   c                 *    t          j        |           S r   )r:  r;  r  s    r   orderedzExchange.orderedc  s    &u---r   c                    t                               i           }| D ]^}}}|dk    r||v r||         nd|z   ||<    g }t          |                                          }|D ]\  }}|                    ||g           |S r7  )r5   r  r  r=  rQ  )bidasksr  rX   volumer   rA  r=  s          r   	aggregatezExchange.aggregateg  s    ""2&&#* 	V 	VUFQzz49W4D4D'%..!v!UW]]__%%" 	+ 	+ME6MM5&/****r   c                  4    t                                           S r   )r5   secondsrC  r   r   seczExchange.secs  s    !!!r   c                  4    t                                           S r   )r5   rF  rC  r   r   mseczExchange.msecw      $$&&&r   c                  4    t                                           S r   )r5   microsecondsrC  r   r   useczExchange.usec{  r  r   c                  B    t          t          j                              S r   r  rH  rC  r   r   r  zExchange.seconds  s    49;;r   c                  H    t          t          j                    dz            S r  r  rC  r   r   rF  zExchange.milliseconds  s    49;;%&&&r   c                  H    t          t          j                    dz            S )Ni@B r  rC  r   r   r  zExchange.microseconds  s    49;;()))r   c                    | | S t          | t                    sd S t          |           dk     rd S 	 t          j                            | dz  t          j        j                  }|                    d          d d         d                    t          |           dz            z   dz   S # t          t          t          f$ r Y d S w xY w)Nr   r  z%Y-%m-%dT%H:%M:%S.%fz{:03d}Z)r  r  datetimefromtimestamptimezoneutcstrftimer  r  OverflowErrorOSError)	timestampr  s     r   iso8601zExchange.iso8601  s    )S)) 	4y>>A4	#11)t2CXEVEZ[[C<< 677<xsS\~~`dOd?e?eehkkk='2 	 	 	44	s   A7B* *CCc                     |t           j                                         }n|}t          |                                          }t	          |          S r   )r  rJ  rA   	timetuplerB   )r   r  tsstamps       r   rfc2616zExchange.rfc2616  sF    "&&((BBBr||~~&&&&&r   r,  c                     t           j                             t          t          | dz                      t           j        j                  }|                    d|z   dz   |z   dz             S )Nr  %mr  %Yr  r  r  roundr  r  r  r  infixutc_datetimes      r   dmyzExchange.dmy  s]    (66s5TAQ;R;R7S7SU]UfUjkk$$TE\D%85%@4%GHHHr   c                     |rdnd}t           j                             t          t          | dz                      t           j        j                  }|                    ||z   dz   |z   dz             S )Nr  z%yr  r  r  r  )r  r  fullYearyear_formatr  s        r   ymdzExchange.ymd  sl    &0ddD(66s5TAQ;R;R7S7SU]UfUjkk$$[5%84%?%%G$%NOOOr   c                 :    t                               | |d          S NFr5   r  r  r  s     r   yymmddzExchange.yymmdd  s    ||Iue444r   c                 :    t                               | |d          S NTr  r  s     r   yyyymmddzExchange.yyyymmdd  s    ||Iud333r   r  c                     t           j                             t          t          | dz                      t           j        j                  }|                    d|z   dz             S )Nr  z%Y-%m-%dz%H:%M:%Sr  r  s      r   ymdhmszExchange.ymdhms  sT    (66s5TAQ;R;R7S7SU]UfUjkk$$Z%%7*%DEEEr   c                    | | S t          | t                    sd S d| v r	 d                    d t          |           d d         D                       dz   }t          j                            |d          }t          j        |                                          dz  S # t          t          t          f$ r Y d S w xY wt                              |           S )NGMTrQ   c                 ,    g | ]}t          |          S rC  )rb  )r   r  s     r   rP  z'Exchange.parse_date.<locals>.<listcomp>  s    !S!S!S#e**!S!S!Sr      z.000Z%Y%m%d%H%M%S.%fZr  )r  rb  r!  r6   r  strptimecalendartimegmutctimetupler  r  r  r5   	parse8601)r  r3  dts      r   
parse_datezExchange.parse_date  s    )S)) 	4I!S!S)I:N:NrPQr:R!S!S!STTW^^&//8JKKr'8'899D@@}g6   tt %%i000s   A?B! !B<;B<c           
         | | S d}d}d}d}d}d}d}d}d|z   |z   |z   |z   |z   |z   |z   |z   }		 t          j        |	| t           j                  }
|
d S |
                                \
  }}}}}}}}}}|pd	}|d
z   dd         }t	          |dd                    }|pd}t	          |dz             dz  }t	          |pd          |z  }t	          |pd          |z  }t          j        ||          }||z   |z   |z   |z   |z   |z   dz   }t
          j                            |d          }||z   }t          j	        |
                                          dz  |z   S # t          t          t          t          f$ r Y d S w xY w)Nz([0-9]{4})-?z([0-9]{2})-?z([0-9]{2})(?:T|[\s])?z([0-9]{2}):?z
([0-9]{2})z(\.[0-9]{1,3})?z%(?:(\+|\-)([0-9]{2})\:?([0-9]{2})|Z)?rQ   z.00000r   r  r   1r   )hoursminutesr  r  r  )rs  search
IGNORECASEgroupsr  r  	timedeltar  r  r  r  r  r  r  r  )r  yyyymmddhmsmstzregexmatchsignr  r  msintr  r3  r  s                     r   r  zExchange.parse8601  s   %7d
R"$q(1,q025:	IeY>>E}t>Cllnn;D"b!Q2tUGvBt)QqS!B122KKE:2Dtcz??R'D
OOd*E',Q''$.G'eWEEEFBY^a'!+a/"4s:F"++F4FGGBfB?2??#4#455<uDD=':> 	 	 	44	s   "E DE E;:E;md5hexc                 (   |dk    r"t          t          j        |                     }n)t          j        ||           }|                                }|dk    rt                              |          S |dk    rt                              |          S |S )Nr0   base64r  )	r  r0   SHA3hashlibnewdigestr5   binary_to_base64binary_to_base16)r  	algorithmr  binaryr  s        r   hashzExchange.hash  s      6;w//00FFIw//AXXZZFX,,V444u__,,V444r   c                     t          j        || |          }|                                }|dk    rt                              |          S |dk    rt                              |          S |S )Nr  r  )hmacr  r  r5   r  r  )r  rt   r  r  r  r  s         r   r  zExchange.hmac  sc    HVWi00U??,,V444x,,V444r   c                  6    t                      }| D ]}||z   }|S r   r  r@  s      r   binary_concatzExchange.binary_concat  s*     	" 	"Cc\FFr   c                 6    t                      }| D ]}||z   }|S r   r  )rI  rA  rY  s      r   binary_concat_arrayzExchange.binary_concat_array
  s+     	& 	&Gg%FFr   c                     t                               t          j        |                                         dd          S )N=rQ   )r5   r  r  urlsafe_b64encoder.  r  s    r   base64urlencodezExchange.base64urlencode  s/    v7::;;CCCLLLr   c                 Z    t                               t          j        |                     S r   )r5   r  r  standard_b64encoder  s    r   r  zExchange.binary_to_base64  s    v8;;<<<r   c                 *    t          j        |           S r   )r  standard_b64decoder  s    r   base64_to_binaryzExchange.base64_to_binary  s    (+++r   c                 f    t                               t                               |                     S r   )r5   r  r  r  s    r   string_to_base64zExchange.string_to_base64  s"    ((););<<<r   c                 Z    t                               t          j        |                     S r   )r5   r  r  	b64decoder  s    r   base64_to_stringzExchange.base64_to_string!  s    v/22333r   sha256c                    t           j        t           j        t           j        d}|rdnd|dd          z   }d|v r|d         |d         }|dd}d|v r|d         |d         |d<   d	|v r|d	         |d	         |d	<   t                              t                              |                    }t                              |          }	t                              t                              t                              |                               }
|	d
z   |
z   }|dd         }|s|dk    rMt                              t          	                    |t          
                    |          |                    }n|dk    rot                              ||d|          }t                              |d                             dd          |d                             dd          z             }n;t                              t                              |          |||         d          }|d
z   t                              |          z   S )Nr(  sha384sha512RSHS   algJWT)r0  typkidnoncer  r      ESp256r@   r  r  r  )r
  r(  r+  r,  r5   r  ry  r  r"  rsar  r/   base16_to_binaryrjustr  )r  rt   r  is_rsaoptsalgosr0  header_optsheaderencoded_headerencoded_datar{   algoType	signaturerawSignatures                  r   jwtzExchange.jwt%  s    nnn
 

 'tt49QRR=8D==T%[4u+C
 
 D==T%[4!%eKd??tG}8#'=K {!;!;<<!11&99//g@V@V0W0WXX$|3qs8 	bX%% 11(,,uhooV\F]F]_h2i2ijjII#>>%KKL 11,s2C2I2I"c2R2RUabeUfUlUlmoqtUuUu2uvvII hooe&<&<feIFVX`aaIs{X55i@@@@r   c                    t          j                    t          j                    t          j                    d}||         }t	          t
                              |          d t          j                              }t
          	                    |
                    t
                              |           t          j                    |                    S )Nr*  )r,   SHA256SHA384SHA512r.   r5   r  r+   default_backendr  r  r-   PKCS1v15)r  rt   r0  
algorithmsr  priv_keys         r   r:  zExchange.rsaE  s     moomoomoo
 


 sO	'(?(?xG_GaGabb((xw7O7OQXQaQcQcen)o)opppr   c                 ,    t          j        | |          S r   )r1   r  )r"  rg  s     r   eth_abi_encodezExchange.eth_abi_encodeP  s    z%&&&r   c                     t           j                            | ||          }t                              d|j        |j                  S )Ns   )r2   messagesencode_typed_datar5   r  rA  r  )domainmessageTypesmessageencodedDatas       r   eth_encode_structured_dataz#Exchange.eth_encode_structured_dataT  s:    &88wWW%%k;3E{GWXXXr   c                      t          |           S r   r3   )os    r   r4   zExchange.packbY  s    Qxxr   c                     d| z  S )Nz%0.2XrC  )r  s    r   int_to_base16zExchange.int_to_base16]  s    }r   c                 L    t          t          j        | dz            d          S )N   r  r   r#  s    r   random_byteszExchange.random_bytesa  r&  r   r7  c           	      (   t           j        dgt           j        dgt           j        dgt           j        dgt           j        dgt           j        dgd}||vrt          |dz             ||         }t          t          |d                   }t                              |           }|t                              ||d          }	nt          j        |d	          }	t          |t                     rt                              |          }|                    d
          dk    r!t           j                            ||          }
n;t           j                            t          j        |d	          |d                   }
|
                    |	|t           j        j                  \  }}}t           j                            ||f|
j        j                  \  }}d}ddz  dz
  }|
j        j        dz  }|r||k    s||k    s||k    r|
                    |	|t           j        j        t                              |d                    \  }}}t           j                            ||f|
j        j                  \  }}|dz  }|r||k    ||k    ||k    t                              t          j        |                                                    t                              t          j        |                                                    }}|||dS )Nr(  r+  r,  )p192p224r7  p384p521	secp256k1z is not a supported algorithmr   r  Tcasefolds   -----BEGIN EC PRIVATE KEY-----r   r   curve)hashfunc	sigencode   r5      )rk  rl  extra_entropy)r8  r  v)r/   NIST192pNIST224pNIST256pNIST384pNIST521p	SECP256k1r   r  r
  r5   r  r  r  	b16decoder  rb  find
SigningKeyfrom_pemfrom_stringsign_digest_deterministicutilsigencode_strings_canonizesigdecode_stringsprivkeyordernumber_to_ler  	b16encoder  )r  rt   r  r  fixed_lengthrN  
curve_infohash_functionencoded_requestr  r/  r_binarys_binaryrp  r_ints_intcounterminimum_size
half_orderr8  r  s                        r   r/   zExchange.ecdsae  s    ^X.^X.^X.^X.^X./84
 

 J&&#I0O$OPPP	*
A77"//'22]]?D(CCFF%oEEEFfc"" 	-__V,,F;;899B>>"++FMBBCC"..v/?EI0K 0K 0KR\]^R_ / a aC # = =f}HM
Hm !> !o !o(Az33Xx4H#+J[\\uf*[&*
 	
 2 2e|6K6KuXdOdOd$'$A$A&S`LQJLqPXPePefmoqPrPr %B %t %t!Hh !:7788LckN_``LE5qLG  	
 2 2e|6K6KuXdOdOd v/99::@@BBHOOTZTdemTnTnDoDoDuDuDwDw1
 
 	
r   ed25519c                     t          t                              |          d           }t                              |                    |                     S r   )r.   r5   r  r  r  )r  rt   rj  private_keys       r   eddsazExchange.eddsa  s?    *8??6+B+BDII(()9)9')B)BCCCr   c                     d}t          j        | d          } t          j        |d          }t          j        |||           }t                              |          S )Ns@                                                                   Trg  )r  rw  r  calculateSignaturer5   binary_to_base58)r  rt   rj  r!  rE  s        r   axolotlzExchange.axolotl  sY    "7T:::!&4888,VVWEE	((333r   c                 .    t          j        | d          S )N),:)
separators)ry  dumps)r  ry  s     r   ry  zExchange.json  s    z$:6666r   c                     t          | t                    o*t          |           dk    o| d         dk    p| d         dk    S )Nr5  r   rw  [r  )inputs    r   r  zExchange.is_json_encoded_object  sC    5#&& 9Uq9(c/7uQx3	:r   c                 ,    |                      d          S Nzlatin-1)r  r2  s    r   r  zExchange.encode      }}Y'''r   c                 ,    |                      d          S r  )r  r2  s    r   r  zExchange.decode  r  r   c                 t    t          |           t          u r!t          |                                           n| S r   )r  r  r  rW  r  s    r   rF  zExchange.to_array  s-    '+E{{d':':tELLNN###Er   c                    d}|                      d          \  }}}t                               d          \  }}}t          |          }	t          |          }
t          |          }t          |          }t          |          }t          |          }|	|k    rd}|	|k    r|
|k    rd}n|
|k    r||k    rd}|s$|r t          dt          z   dz   | z   dz             |S |S )NTr  Fz Your current version of CCXT is z, a newer version z2 is required, please, upgrade your version of CCXT)r   __version__r  r   )required_versionerrorrA  major1minor1patch1major2minor2patch2
int_major1
int_minor1
int_patch1
int_major2
int_minor2
int_patch2s                  r   check_required_versionzExchange.check_required_version  s   #3#9#9##>#> #.#4#4S#9#9 [[
[[
[[
[[
[[
[[

""F##J&&z))j:.E.E 	 "#E#SVj#jm}#}  Au  $u  v  v  vr   c                 ,   t          | j        dz             t          fdD                       st                    | j        k     sdv rBt          | j        dz   t          | j                  z   dz   t                    z   dz             S )zIChecks an address is not the same character repeated or an empty sequenceNz address is Nonec              3   0   K   | ]}|d          k    V  dS )r   NrC  )r   letteraddresss     r   r   z)Exchange.check_address.<locals>.<genexpr>  s,      ::v#::::::r   r  z% address is invalid or has less than z characters: "")r   r=  allr	  minFundingAddressLengthrb  )r   r  s    `r   check_addresszExchange.check_address  s    ? +=!=>>>::::'::::: 	`c'llTMi>i>impt{m{m{ +R!RUXY]YuUvUv!v  zJ  "J  MP  QX  MY  MY  "Y  \_  "_  `  `  `r   c                     d|v r(t          j        dd|          }t          |          dz  S t          j        dd|                              d          }t	          |          dk    rt	          |d                   ndS )	Nr9  z\derQ   r   z0+$r  r   r   )rs  r  r  r   r	  )r   rb  numStrr2  s       r   precision_from_stringzExchange.precision_from_string  st    #::VFB,,Fv;;##
 vr3''--c22 #E

Qs58}}}A5r   c                    |s/| j         r(| j        s|                     | j                   S | j         S d }| j        d         du r|                                 }|                     |          }|                     ||          S )Nr   T)r  markets_by_idr  hasfetch_currenciesfetch_markets)r   reloadry  r  r  s        r   load_marketszExchange.load_markets  s     	$| $) :++DL999|#
8%&$....00J$$V,,444r   c                 6    |                      | j                  S r   )rF  r  r   ry  s     r   r  zExchange.fetch_markets  s    
 }}T\***r   c                     | j         S r   )r  r  s     r   r  zExchange.fetch_currencies  s    
 r   c                     i }i }| j         d         r|                                 }| j         d         r|                                 }||dS )Nr   fetchFundingFeesrJ   )r  fetch_trading_feesfetch_funding_fees)r   rK   rL   s      r   
fetch_feeszExchange.fetch_fees  sc    8&' 	0--//G8&' 	0--//G
 
 	
r   c                    t          | dd                   }| d         }d|k    rd}nXd|k    rd}nOd|k    rd}nFd	|k    rd
}n=d|k    rd}n4d|k    rd}n+d|k    rd}n"t          d                    |                    ||z  S )Nr   r   yi3Mi ' wi:	 r  iQ r  i  r  <   r  r   z"timeframe unit {} is not supported)r  r   r  )	timeframerW   unitscales       r   parse_timeframezExchange.parse_timeframe	  s    Yqt_%%}$;;&EED[[%EED[[$EED[[ EED[[EED[[EED[[EECJJ4PPQQQ~r   c                 p    t                               |           dz  }||z  }||z
  |t          k    r|ndz   S )Nr  r   )r5   r  r   )r  r  	directionr  r  s        r   round_timeframezExchange.round_timeframe  sA    %%i0047R6!9+@+@RRaHHr   c                 $    |||dk    r||z  nd S r7  rC  )r   
baseVolumequoteVolumes      r   vwapzExchange.vwap&  s0    .9.EJLbisvwiwiwj((  C  	Cr   c                 T    | j         rt          t          | j        dz             d S d S )Nz Eddsa functionality requires python-axolotl-curve25519, install with `pip install python-axolotl-curve25519==0.4.1.post2`: https://github.com/tgalal/python-axolotl-curve25519)requiresEddsar  r   r=  r>  s    r   check_required_dependenciesz$Exchange.check_required_dependencies)  sG     	\%-tw  *[   [  \  \  \	\ 	\--r   c                    t          j        t                              |          d          }t          j                            |t          j                  j        	                                }t          j        |          }dt                              t          j        |                    dd                                          z   S )NTri  0xi)r  rw  r5   r  r/   ry  r{  rv  verifying_key	to_stringr0   r	  r  r  r  )r   ry   private_key_bytespublic_key_bytespublic_key_hashs        r   privateKeyToAddresszExchange.privateKeyToAddress-  s    ",X__Z-H-H$OO +778IQVQ`7aaoyy{{ +&677hoof&6&G&GHHNTTVVVVr   c                 6    | d d         dk    r
| dd          S | S )Nr5  r  rC  r  s    r   remove0x_prefixzExchange.remove0x_prefix3  s(    !99r   c           	         d }d }t          t          j                              dz  }t                              |                    dd           ||                     dd                    t          j        d          } ||d	                   d
z  }t           ||||dz                      dz            }|dd          S )Nc                 $    t          | d          S )Nr   )base)r  )ns    r   
hex_to_decz!Exchange.totp.<locals>.hex_to_dec;  s    qr???"r   c                     t          |           dz  }|dk    rd|z
  nd}|                                 d|z  z   }t          j        |          S )Nr_  r   r  )r	  r  r  	b32decode)r  missing_paddingr-   paddeds       r   base32_to_bytesz&Exchange.totp.<locals>.base32_to_bytes>  sQ    !!ffqjO-<q-@-@a/))aGWWYY#-0F#F+++r      r_  bigr  rQ   r  r   r5  r  )	r  rH  r5   r  to_bytesr.  r
  sha1rb  )r/  r  r  epochhmac_resr  otps          r   totpzExchange.totp9  s    	# 	# 	#	, 	, 	, DIKK  B&==5!9!9??3;;WZ\^K_K_;`;`bibnpuvvHRL))A-**Xffqj&89::ZGHH233xr   c                 H    t          |                               |d          S )Nlittler  r  r  sizes     r   r  zExchange.number_to_leJ  s    1vvtX...r   c                 H    t          |                               |d          S )Nr  r  r  s     r   number_to_bezExchange.number_to_beN  s    1vvtU+++r   c                 ,    t          j        | d          S r  )r  rw  r  s    r   r;  zExchange.base16_to_binaryR  s    4(((r   c                 ~    t                               t          j        |                                                     S r   )r5   r  r  r  r  r  s    r   r  zExchange.binary_to_base16V  s+    v/223399;;;r   c                 0    t          j        |dz            S r  )rH  rI  )r   rF  s     r   rI  zExchange.sleepZ  s    z,-...r   c                    t           j        Ui t           _        i t           _        t          t           j                  D ]#\  }}|t           j        |<   |t           j        |<   $d}t          t          |                     D ]"}|dz  }|t           j        | |                  z  }#|                    |                                dz   dz  d          S )z2encodes a base58 string to as a big endian integerNr   :      r_  r  )	r5   base58_decoderbase58_encoderr  base58_alphabetranger	  r  
bit_length)r  r   crA  s       r   base58_to_binaryzExchange.base58_to_binary]  s     "*&(H#&(H#!(":;; / /1-.'*-.'**s1vv 	4 	4AbLFh-ad33FF 1 1 3 3a 7A=uEEEr   c                    t           j        Ui t           _        i t           _        t          t           j                  D ]#\  }}|t           j        |<   |t           j        |<   $d}| D ]}|dz  }||z  }g }|dk    r>t          |d          \  }}|                    t           j        |                    |dk    >|                                 d                    |          S )Nr      r  rQ   )	r5   r  r  r  r  divmodrQ  r`  r!  )ri  r   r  rA  byter3  next_characters          r   r  zExchange.binary_to_base58l  s    "*&(H#&(H#!(":;; / /1-.'*-.'** 	 	DeOFdNFFqjj%+FB%7%7"FNMM(1.ABBB qjj 	wwvr   c                 Z    ||S 	 |                      |          S # t          $ r |cY S w xY wr   )r   r8  )r   r  r^  s      r   parse_numberzExchange.parse_number  sG    =N{{5)))   s    **c                 D    ||dk    rd S t          |          dk    rd S |S )NrQ   r   )r&  )r   string_numbers     r   	omit_zerozExchange.omit_zero  s5     MR$7$741$$4r   c                 ~    ||dk    rt          | j        dz             |dk    rt          | j        dz             d S )Nlimitz; create_order() requires a price argument for a limit orderr   z( create_order() amount should be above 0)r   r=  r   )r   marketr  siderW   rX   ry  s          r   check_order_argumentszExchange.check_order_arguments  sL    =w'2o(opppQ;;tw)SSTTT ;r   c                     t          |          }|| j        v r;| j        |         } || j        dz   |z   dz   |z   dz   |z   dz   |z   dz   |z             d S )Nr  )rb  httpExceptionsr=  )r   rl  rm  rn  ro  r  codeAsString
ErrorClasss           r   r  z Exchange.handle_http_status_code  sw    4yy4...,\:J*TWs]V3c9C?#ETWZZ]ccfiilppqqq /.r   c                 n    t          j        |                     d                    }|r|dk    r|dz
  S |S )Nr  l        l        )binasciicrc32r  )r3  signedunsigneds      r   r)  zExchange.crc32  s?    >&--"7"788 	x:--k))Or   c                 Z    t          |t                    r|n|                     |          S r   )r  r  r$  )r   objs     r   clonezExchange.clone  s'     d++AssS1A1AAr   c                 N    t          |t                    rt          |          n|S r   )r  rb  r  r   r  s     r   convert_to_big_intzExchange.convert_to_big_int  s!    's33>s5zzz>r   c                      t          |          S r   )r  r0  s     r   string_to_chars_arrayzExchange.string_to_chars_array  s    E{{r   c                 
    |d uS r   rC  r0  s     r   valueIsDefinedzExchange.valueIsDefined  s    D  r   c                 .    |r
|||         n	||d          S r   rC  )r   rI  firstseconds       r   
arraySlicezExchange.arraySlice  s#    &,?uU6\""%-?r   c                 F    t          ||          rt          ||          n|S r   )r  r  )r   r-  propertydefaultValues       r   get_propertyzExchange.get_property  s&    )0h)?)?QwsH%%%\Qr   c                 (    t          |||           d S r   )r  )r   r-  r;  r  s       r   set_propertyzExchange.set_property  s    Xu%%%%%r   c                 R    t          j        dd|                                          S )Nz(?!^)([A-Z]+)z_\1)rs  r  r  )r   rb  s     r   un_camel_casezExchange.un_camel_case  s"    vovs3399;;;r   c                     |                     dd          }|                     dd          }|                     dd          }|S )N\rQ   z"{rw  z}"rx  )r.  )r   r  modifiedContents      r   fix_stringified_json_membersz%Exchange.fix_stringified_json_members  sG    
 "//$33)11$<<)11$<<r   c                 F    |                      | j        |          | _        d S r   )r$  r  )r   
newOptionss     r   extend_exchange_optionsz Exchange.extend_exchange_options  s    {{4<<<r   c                     i S r   rC  r>  s    r   create_safe_dictionaryzExchange.create_safe_dictionary  rD  r   keysr<  c                 b    |                      |||          }t          |t                    r|S |S zw
         * @ignore
        safely extract boolean value from dictionary or list
        :returns bool | None:
        )r  r  r  r   dictionaryOrListrK  r<  r  s        r   safe_bool_nzExchange.safe_bool_n  s9     !!"2D,GGeT"" 	Lr   r  r  c                 4    |                      |||g|          S rM  rP  r   r  r  r  r<  s        r   safe_bool_2zExchange.safe_bool_2        
T4L,GGGr   r/  c                 2    |                      ||g|          S rM  rR  r   r  r/  r<  s       r   	safe_boolzExchange.safe_bool       
SE<@@@r   c                 j    |                      |||          }||S t          |t                    r|S |S zv
         * @ignore
        safely extract a dictionary from dictionary or list
        :returns dict | None:
        )r  r  r  rN  s        r   safe_dict_nzExchange.safe_dict_n  D     !!"2D,GG=eT"" 	Lr   c                 2    |                      ||g|          S r[  r\  rW  s       r   	safe_dictzExchange.safe_dict$  rY  r   c                 4    |                      |||g|          S r[  r_  rS  s        r   safe_dict_2zExchange.safe_dict_2,  rU  r   c                 j    |                      |||          }||S t          |t                    r|S |S zs
         * @ignore
        safely extract an Array from dictionary or list
        :returns Array | None:
        )r  r  r  rN  s        r   safe_list_nzExchange.safe_list_n4  r]  r   c                 4    |                      |||g|          S rd  re  )r   rO  r  r  r<  s        r   safe_list_2zExchange.safe_list_2A  s!      04,MMMr   c                 2    |                      ||g|          S rd  rg  )r   rO  r/  r<  s       r   	safe_listzExchange.safe_listI  s      03%FFFr   c                 ~    t          dt          |                    D ]}|                     |||                    d S r7  )r  r	  handle_delta)r   	orderbookdeltasr   s       r   handle_deltaszExchange.handle_deltasQ  sH    q#f++&& 	4 	4Ai3333	4 	4r   c                 0    t          | j        dz             )Nz handleDelta not supported yetr   r=  )r   booksidedeltas      r   rl  zExchange.handle_deltaU      47%EEFFFr   c                     dS )Nr   rC  )r   rm  rn  s      r   get_cache_indexzExchange.get_cache_indexX  s    rr   c                     || j         }t          |                                          }t          dt	          |                    D ]}||         }||         |k    r|c S d S r7  )
timeframesr  rK  r  r	  )r   r  rx  rK  r   r/  s         r   find_timeframezExchange.find_timeframe\  sp    JJOO%%&&q#d))$$ 	 	Aq'C#)++


 ,tr   rn  ro  c                    g }d }| j         |                    d           | j         }| j        |                    d           | j        }| j        -|                    d           |                     ||||          }| j        -|                    d           |                     ||||          }| j        I|                    d           t          | j                  r|                     ||||          }n| j        }t          |          }|dk    r2d                    |          }t          | j
        dz   |z   d	z             |S )
Nr  	proxy_urlproxyUrlCallbackproxy_url_callbackproxyr   r  . you have multiple conflicting proxy settings(zW), please use only one from : proxyUrl, proxy_url, proxyUrlCallback, proxy_url_callback)r  rQ  r{  r|  r}  r~  callabler	  r!  r   r=  )	r   rn  ro  r  r  usedProxiesr  r$  joinedProxyNamess	            r   r  z!Exchange.check_proxy_url_settingsf  sm   =$z***}H>%{+++~H ,1222,,S&'4HHH".3444..sFGTJJH:!w'''
## &::c67DAA:[!!A::"xx44TW'WWZjj  nG  G  H  H  Hr   c                    g }d }d }d }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }| j        -|                    d           |                     ||||          }| j        -|                    d           |                     ||||          }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }| j        -|                    d           |                     ||||          }| j	        -|                    d           | 	                    ||||          }|                      | j
                  r|                    d	           | j
        }|                      | j                  r|                    d
           | j        }| j        -|                    d           |                     ||||          }| j        -|                    d           |                     ||||          }t          |          }	|	dk    r2d                    |          }
t!          | j        dz   |
z   dz             |||gS )Nr  
http_proxyhttpProxyCallbackhttp_proxy_callbackr  https_proxyhttpsProxyCallbackhttps_proxy_callbackr  socks_proxysocksProxyCallbacksocks_proxy_callbackr   r  r  zy), please use only one from: httpProxy, httpsProxy, httpProxyCallback, httpsProxyCallback, socksProxy, socksProxyCallback)r5  r  rQ  r  r  r  r  r  r  r  r  r  r  r  r	  r!  r   r=  )r   rn  ro  r  r  r  r  r  r  r$  r  s              r   r  zExchange.check_proxy_settings  s   	

t~.. 	'{+++It// 	(|,,,I!-2333..sFGTJJI#/455500fgtLLIt// 	)|,,,Jt/00 	*}---)J".344400fgtLLJ$05666223NNJt// 	)|,,,Jt/00 	*}---)J".344400fgtLLJ$05666223NNJ[!!A::"xx44TW'WWZjj  ni  i  j  j  j:z22r   c                 2   g }d }d }d }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }|                      | j                  r|                    d           | j        }t          |          }|dk    r2d	                    |          }t          | j        d	z   |z   d
z             |||gS )NwsProxyws_proxywssProxy	wss_proxywsSocksProxyws_socks_proxyr   r  r  z<), please use only one from: wsProxy, wssProxy, wsSocksProxy)r5  r  rQ  r  r  r  r  r  r	  r!  r   r=  )r   r  r  r  r  r$  r  s          r   check_ws_proxy_settingsz Exchange.check_ws_proxy_settings  s   t|,, 	#y)))lGt}-- 	$z***mGt}-- 	%z***}Ht~.. 	&{+++~Ht011 	-~...,Lt233 	//000.L[!!A::"xx44TW'WWZjj  nl  l  m  m  m<00r   c                 @    |r|rt          | j        dz             d S d S )Nzu you have multiple conflicting proxy settings, please use only one from : proxyUrl, httpProxy, httpsProxy, socksProxy)r   r=  )r   r  proxyUrlSets      r   r  z"Exchange.check_conflicting_proxies  sP     	`[ 	`TW  (_  _  `  `  `	` 	` 	` 	`r   rY  c                    g }t          |j                                                  }t          dt	          |                    D ]8}||         }|                    |          dk    r|                    |           9|S r7  )r  futuresrK  r  r	  rx  rQ  )r   clientrY  rA  messageHashesr   messageHashs          r   find_message_hasheszExchange.find_message_hashes  s~    V^002233q#m,,-- 	+ 	+A'*K((A--k***r   r  rI  r  	fromStartc                    |                      |          rt          |          }|dk    rd}||d         v r)|d         |         }||dz
           |         }||||k    }|r9||k    r|}|r|                     |d|          n|                     ||           }n0|r|                     ||           n|                     |d|          }|S )Nr   Tr   )r5  r	  r9  )	r   rI  r  r/  r  arrayLength	ascendingr7  lasts	            r   filter_by_limitzExchange.filter_by_limit  s    u%% 	ne**KQ 	58OO!!HSME q1#6D(T-=$)TM	 n{** +@ImDOOE1e<<<t_dglflOmOmEE>GmDOOEE6:::T__]bdeglMmMmEr   sincec                    |                      |          }|                     |          }|}|r]g }t          dt          |                    D ]=}	||	         }
|                     |
|          }|r||k    r|                    |
           >|r||                     ||           S | o|}|                     ||||          S r7  r5  rF  r  r	  r  rQ  r9  r  )r   rI  r  r  r/  tailsinceIsDefinedparsedArrayrA  r   rO  r  shouldFilterFromStarts                r   filter_by_since_limitzExchange.filter_by_since_limit  s    ,,U33mmE** 	)F1c+..// ) )#As33 )eunnMM%((( 	3E%??6E6222 %) ;^##FE38MNNNr   fieldc                    |                      |          }|                      |          }	|                     |          }
|
}|s|	r{g }t          dt          |
                    D ][}|
|         }||         |k    }|r|nd}|                     ||          }|o|o||k    }|	r|nd}|r|r|                    |           \|r||                     ||           S |                     ||||	          S )Nr   Tr  )r   rI  r  r  r  r  r/  r  r5  r  r  rA  r   rO  entryFiledEqualValuefirstConditionentryKeyValueentryKeyGESincesecondConditions                      r   filter_by_value_since_limitz$Exchange.filter_by_value_since_limit  s0   ,,U33,,U33mmE** 
	)^ 
	)F1c+..// ) )#A',U|u'<$9G!Q!5!5T $s ; ;#0"Xe"XRWAW5C"M//! )o )MM%((( 	3E%??6E6222##FE3GGGr   enabledc                    |rd| j         v rt          | j         d         t                    r,| j         d         | j         d<   | j         d         | j         d<   d S |                     | j         d                   | j         d<   |                     | j         d                   | j         d<   d S t	          | j        dz             d| j         v rt          | j         d         t                    r| j         d         | j         d<   n(|                     | j         d                   | j         d<   |                     | j         d          }|| _         d S d S )Ntestapi	apiBackupz does not have a sandbox URL)urlsr  rb  r.  r   r=  r  )r   r  newUrlss      r   set_sandbox_modezExchange.set_sandbox_mode  s;    	 ""di.44 E-1Yu-=DIk*'+y'8DIe$$$-1ZZ	%8H-I-IDIk*'+zz$)F2C'D'DDIe$$$"47-K#KLLLDI%%$)E*C00 F#'9[#9	%  #'::di.D#E#E	% ii	;77GDIII &%r   publicr  r  r  c                     i S r   rC  )r   pathr  ro  ry  r  r  s          r   r  zExchange.sign/  rD  r   c                 0    t          | j        dz             )Nz% fetchAccounts() is not supported yetrq  r  s     r   fetch_accountszExchange.fetch_accounts2      47%LLMMMr   symbolc                 0    t          | j        dz             )Nz# fetchTrades() is not supported yetrq  r   r  r  r  ry  s        r   fetch_tradeszExchange.fetch_trades5      47%JJKKKr   c                 0    t          | j        dz             )Nz% fetchTradesWs() is not supported yetrq  r  s        r   fetch_trades_wszExchange.fetch_trades_ws8  r  r   c                 0    t          | j        dz             )Nz# watchTrades() is not supported yetrq  r  s        r   watch_tradeszExchange.watch_trades;  r  r   symbolsc                 0    t          | j        dz             )Nz- watchTradesForSymbols() is not supported yetrq  r   r  r  r  ry  s        r   watch_trades_for_symbolsz!Exchange.watch_trades_for_symbols>      47%TTUUUr   c                 0    t          | j        dz             )Nz/ watchMyTradesForSymbols() is not supported yetrq  r  s        r   watch_my_trades_for_symbolsz$Exchange.watch_my_trades_for_symbolsA      47%VVWWWr   c                 0    t          | j        dz             )Nz- watchOrdersForSymbols() is not supported yetrq  r  s        r   watch_orders_for_symbolsz!Exchange.watch_orders_for_symbolsD  r  r   symbolsAndTimeframesc                 0    t          | j        dz             )Nz, watchOHLCVForSymbols() is not supported yetrq  )r   r  r  r  ry  s        r   watch_ohlcv_for_symbolsz Exchange.watch_ohlcv_for_symbolsG      47%SSTTTr   c                 0    t          | j        dz             )Nz0 watchOrderBookForSymbols() is not supported yetrq  r   r  r  ry  s       r   watch_order_book_for_symbolsz%Exchange.watch_order_book_for_symbolsJ      47%WWXXXr   codesc                 0    t          | j        dz             )Nz- fetchDepositAddresses() is not supported yetrq  r   r  ry  s      r   fetch_deposit_addressesz Exchange.fetch_deposit_addressesM  r  r   c                 0    t          | j        dz             )Nz& fetchOrderBook() is not supported yetrq  r   r  r  ry  s       r   fetch_order_bookzExchange.fetch_order_bookP      47%MMNNNr   c                     | j         d         r-|                     |g|          }|                     ||          S t          | j        dz             )NfetchMarginModesz' fetchMarginMode() is not supported yet)r  r  r`  r   r=  )r   r  ry  marginModess       r   fetch_margin_modezExchange.fetch_margin_modeS  sT    8&' 	T//&AAK>>+v666tw)RRSSSr   c                 0    t          | j        dz             )Nz( fetchMarginModes() is not supported yetrq  r   r  ry  s      r   fetch_margin_modeszExchange.fetch_margin_modesZ      47%OOPPPr   c                     |                      ddd          }t          d|          D ]?}	 |                     |||          }|c S # t          $ r}|dz   |k    r|Y d }~8d }~ww xY wd S )Nr   
maxRetriesr/  r   r   )handleOptionr  r  r8  )r   r  r  ry  fetchSnapshotMaxRetriesr   	orderBookr9  s           r   fetch_rest_order_book_safez#Exchange.fetch_rest_order_book_safe]  s    "&"3"34DlTU"V"Vq122 	 	A 11&%HH	       E555G 65555 ts   A
A%A  A%c                 0    t          | j        dz             )Nz& watchOrderBook() is not supported yetrq  r  s       r   watch_order_bookzExchange.watch_order_bookh  r  r   c                 0    t          | j        dz             )Nz! fetchTime() is not supported yetrq  r  s     r   
fetch_timezExchange.fetch_timek      47%HHIIIr   c                 0    t          | j        dz             )Nz* fetchTradingLimits() is not supported yetrq  r  s      r   fetch_trading_limitszExchange.fetch_trading_limitsn      47%QQRRRr   c                 0    t          | j        dz             )Nz# parseMarket() is not supported yetrq  )r   r   s     r   parse_marketzExchange.parse_marketq  r  r   c                     g }t          dt          |                    D ]0}|                    |                     ||                              1|S r7  )r  r	  rQ  r  )r   r  rA  r   s       r   parse_marketszExchange.parse_marketst  sR    q#g,,'' 	9 	9AMM$++GAJ778888r   tickerr   c                 0    t          | j        dz             )Nz# parseTicker() is not supported yetrq  )r   r  r   s      r   parse_tickerzExchange.parse_tickerz  r  r   currencyc                 0    t          | j        dz             )Nz+ parseDepositAddress() is not supported yetrq  )r   depositAddressr  s      r   parse_deposit_addresszExchange.parse_deposit_address}      47%RRSSSr   tradec                 0    t          | j        dz             )Nz" parseTrade() is not supported yetrq  r   r  r   s      r   parse_tradezExchange.parse_trade      47%IIJJJr   c                 0    t          | j        dz             )Nz( parseTransaction() is not supported yetrq  )r   transactionr  s      r   parse_transactionzExchange.parse_transaction  r  r   c                 0    t          | j        dz             )Nz% parseTransfer() is not supported yetrq  )r   r   r  s      r   parse_transferzExchange.parse_transfer  r  r   c                 0    t          | j        dz             )Nz$ parseAccount() is not supported yetrq  )r   r2   s     r   parse_accountzExchange.parse_account      47%KKLLLr   c                 0    t          | j        dz             )Nz( parseLedgerEntry() is not supported yetrq  )r   itemr  s      r   parse_ledger_entryzExchange.parse_ledger_entry  r  r   c                 0    t          | j        dz             )Nz" parseOrder() is not supported yetrq  r   r  r   s      r   parse_orderzExchange.parse_order  r
  r   c                 0    t          | j        dz             )Nz- fetchCrossBorrowRates() is not supported yetrq  r  s     r   fetch_cross_borrow_ratesz!Exchange.fetch_cross_borrow_rates  r  r   c                 0    t          | j        dz             )Nz0 fetchIsolatedBorrowRates() is not supported yetrq  r  s     r   fetch_isolated_borrow_ratesz$Exchange.fetch_isolated_borrow_rates  r  r   c                 0    t          | j        dz             )Nz0 parseMarketLeverageTiers() is not supported yetrq  r   rS  r   s      r   parse_market_leverage_tiersz$Exchange.parse_market_leverage_tiers  r  r   c                 0    t          | j        dz             )Nz* fetchLeverageTiers() is not supported yetrq  r  s      r   fetch_leverage_tierszExchange.fetch_leverage_tiers  r  r   c                 0    t          | j        dz             )Nz% parsePosition() is not supported yetrq  )r   positionr   s      r   parse_positionzExchange.parse_position  r  r   c                 0    t          | j        dz             )Nz/ parseFundingRateHistory() is not supported yetrq  r  s      r   parse_funding_rate_historyz#Exchange.parse_funding_rate_history  r  r   c                 0    t          | j        dz             )Nz+ parseBorrowInterest() is not supported yetrq  r  s      r   parse_borrow_interestzExchange.parse_borrow_interest  r  r   c                 0    t          | j        dz             )Nz$ parseWsTrade() is not supported yetrq  r  s      r   parse_ws_tradezExchange.parse_ws_trade  r  r   c                 0    t          | j        dz             )Nz$ parseWsOrder() is not supported yetrq  r  s      r   parse_ws_orderzExchange.parse_ws_order  r  r   c                 0    t          | j        dz             )Nz) parseWsOrderTrade() is not supported yetrq  r  s      r   parse_ws_order_tradezExchange.parse_ws_order_trade      47%PPQQQr   c                 .    |                      ||          S r   )parse_ohlcvr   r   r   s      r   parse_ws_ohlcvzExchange.parse_ws_ohlcv  s    v...r   c                 0    t          | j        dz             )Nz) fetchFundingRates() is not supported yetrq  r  s      r   fetch_funding_rateszExchange.fetch_funding_rates  r/  r   c                 0    t          | j        dz             )Nz( watchFundingRate() is not supported yetrq  r   r  ry  s      r   watch_funding_ratezExchange.watch_funding_rate  r  r   c                 0    t          | j        dz             )Nz) watchFundingRates() is not supported yetrq  r  s      r   watch_funding_rateszExchange.watch_funding_rates  r/  r   c                 .    |                      ||          S r   )watchFundingRatesr  s      r   watch_funding_rates_for_symbolsz(Exchange.watch_funding_rates_for_symbols  s    %%gv666r   rl  rW   fromAccount	toAccountc                 0    t          | j        dz             )Nz  transfer() is not supported yetrq  )r   rl  rW   r>  r?  ry  s         r   r   zExchange.transfer      47%GGHHHr   r  c                 0    t          | j        dz             )Nz  withdraw() is not supported yetrq  )r   rl  rW   r  tagry  s         r   rH   zExchange.withdraw  rA  r   c                 0    t          | j        dz             )Nz, createDepositAddress() is not supported yetrq  r   rl  ry  s      r   create_deposit_addresszExchange.create_deposit_address  r  r   rV   c                 0    t          | j        dz             )Nz# setLeverage() is not supported yetrq  )r   rV   r  ry  s       r   set_leveragezExchange.set_leverage  r  r   c                     | j         d         r-|                     |g|          }|                     ||          S t          | j        dz             )NfetchLeveragesz% fetchLeverage() is not supported yet)r  rJ  r`  r   r=  )r   r  ry  	leveragess       r   fetch_leveragezExchange.fetch_leverage  sT    8$% 	R++VHf==I>>)V444tw)PPQQQr   c                 0    t          | j        dz             )Nz& fetchLeverages() is not supported yetrq  r  s      r   fetch_leverageszExchange.fetch_leverages  r  r   hedgedc                 0    t          | j        dz             )Nz' setPositionMode() is not supported yetrq  )r   rO  r  ry  s       r   set_position_modezExchange.set_position_mode      47%NNOOOr   c                 0    t          | j        dz             )Nz! addMargin() is not supported yetrq  r   r  rW   ry  s       r   
add_marginzExchange.add_margin  r  r   c                 0    t          | j        dz             )Nz$ reduceMargin() is not supported yetrq  rT  s       r   reduce_marginzExchange.reduce_margin  r  r   c                 0    t          | j        dz             )Nz! setMargin() is not supported yetrq  rT  s       r   
set_marginzExchange.set_margin  r  r   r  c                 0    t          | j        dz             )a  
        fetches the history of margin added or reduced from contract isolated positions
        :param str [symbol]: unified market symbol
        :param str [type]: "add" or "reduce"
        :param int [since]: timestamp in ms of the earliest change to fetch
        :param int [limit]: the maximum amount of changes to fetch
        :param dict params: extra parameters specific to the exchange api endpoint
        :returns dict[]: a list of `margin structures <https://docs.ccxt.com/#/?id=margin-loan-structure>`
        z4 fetchMarginAdjustmentHistory() is not supported yetrq  )r   r  r  r  r  ry  s         r   fetch_margin_adjustment_historyz(Exchange.fetch_margin_adjustment_history  s     47%[[\\\r   
marginModec                 0    t          | j        dz             )Nz% setMarginMode() is not supported yetrq  )r   r\  r  ry  s       r   set_margin_modezExchange.set_margin_mode  r  r   c                 0    t          | j        dz             )Nz6 fetchDepositAddressesByNetwork() is not supported yetrq  rE  s      r   "fetch_deposit_addresses_by_networkz+Exchange.fetch_deposit_addresses_by_network  s    47%]]^^^r   1hc                 0    t          | j        dz             )Nz0 fetchOpenInterestHistory() is not supported yetrq  r   r  r  r  r  ry  s         r   fetch_open_interest_historyz$Exchange.fetch_open_interest_history  r  r   c                 0    t          | j        dz             )Nz) fetchOpenInterest() is not supported yetrq  r7  s      r   fetch_open_interestzExchange.fetch_open_interest  r/  r   c                 0    t          | j        dz             )Nz signIn() is not supported yetrq  r  s     r   sign_inzExchange.sign_in  rt  r   c                 0    t          | j        dz             )Nz+ fetchPaymentMethods() is not supported yetrq  r  s     r   fetch_payment_methodszExchange.fetch_payment_methods  r  r   c                 h    |                      |          }t          |          }t          |          S r   )r   r&  r  )r   r   stringifiedNumberconvertedNumbers       r   parse_to_intzExchange.parse_to_int  s4     !11&99 122?###r   c                     |                      |          }|                    d          dk    rt          |          S t          |          S )Nr  r   )r   rx  r&  r  )r   r   stringVersions      r   parse_to_numericzExchange.parse_to_numeric	  sL    --f55
 c""a'''''=!!!r   r  c                 >    |                      |dz            }|dk    S r1  )rq  )r   r  ress      r   is_round_numberzExchange.is_round_number	  s$     ##UQY00axr   c                 .    |                                   d S r   )create_networks_by_id_objectr>  s    r   r  zExchange.after_construct	  s    ))+++++r   c                     |                      |                     | j        di                     }|                     ||                     | j        di                     | j        d<   d S )NnetworksnetworksById)invert_flat_string_dictionaryr  r  r$  )r   networkIdsToCodesGenerateds     r   rv  z%Exchange.create_networks_by_id_object	  sq    %)%G%GX\XdfprtHuHu%v%v"'+{{3Mt_c_km{}  PA  PA  (B  (B^$$$r   c                     dddiddiddidiS )	NdefaultNetworkCodeReplacementsERC20ETHTRC20TRXCRC20CRONOS)r  r  CROrC  r>  s    r   r  zExchange.get_default_options	  s1    ,''*/ /
 	
r   rO  c                 $   |                      d |          }|                     |d          }|                     |d          }|                     |d          }|                     |d          }|3||t          j        ||          }n||t          j        ||          }|2|0|.t          j        ||          rd}t          j        ||          rd}|                     |d          }||                     |d          |d<   |                     |d	          }| 	                    |d
i           }	|                     |d          || 
                    |          ||                     |d          |                     |d          |                     |d          |                     |d          |d         |                     |          |                     |          |                     |          |                     |d          ||	dS )Nr  beforeafterrW   outinfeerY   r  rS  r=  r2   referenceIdreferenceAccountr  rl  status)r=  r  r  r  r2   r  r  r  r  rW   r  r  r  r  rS  )safe_currencyr  r   
string_sub
string_add	string_gtr  safe_numberr  r`  r  r  )
r   rO  r  r  r  r  rW   r  r  rS  s
             r   safe_ledger_entryzExchange.safe_ledger_entry'	  s#   %%dH55$$UK88	!!%22  00!!%22~%"3 +E6::#*66::%"3 $VU33 & %I$UF33 % $IooeU++?**377CK%%e[99	~~eVR00""5$//"Y//"''y99++E=AA $ 0 08J K K$$UF33 (''//''//&&u--&&uh77
 
 	
r   c                 ^    |                      d d d d d d d d d d d i i d d dd d ddd|          S )NrR   )rI   rH   )rS  r=  	numericIdrl  r  r  r1  activerI   rH   r  feesrx  r  r$  )r   r  s     r   safe_currency_structurez Exchange.safe_currency_structureO	  s|    {{   
   	 	
 
0 1  	r   c                    i dd dd dd dd dd dd dd dd d	d d
d dd dd dd dd dd dd dd d d d d d d d d 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}|a|                      ||          }|d         rA|d         d|d<   |d         d|d<   |d         d|d<   |d         d|d<   |d         d|d<   |S |S )Nr=  lowercaseIdr  r  r  settlebaseIdquoteIdsettleIdr  r   r   r   r   r   indexr  )rW   rX   rY   r  r  rR   rU   )contractlinearinversesubTypetakermakercontractSizeexpiryexpiryDatetimestrike
optionTyper  r  createdrS  r  Fr  )r   r   cleanStructurerA  s       r   safe_market_structurezExchange.safe_market_structurej	  s   8
$8
48
 d8
 D	8

 T8
 d8
 d8
 t8
 8
 D8
 D8
 d8
 D8
 d8
 d8
  T!8
" d#8
$  "    
   
   
    $ o8
 8
 8
r [[88Ff~ 
,*%-).F:&&>)%*F6N(#+',F8$(#+',F8$'?*&+F7OMr   c                    g }i | _         |                     |                     |          ddd          }t          dt	          |                    D ]}||         }|d         | j         v r'| j         |d                                      |           n|g| j         |d         <   |                     |                                 | j        | j	        d| j
        d         |          }|d         rd|d<   n|d	         rd	|d<   nd |d<   |                    |           |                     |d
          | _        |                     | j                  }|                     | j                   }	t          |                                          | _        t          |	                                          | _        |"|                     | j        |          | _        nFg }
g }t          dt	          |                    D ]U}||         }| j        t(          k    rdn|                     d          }|                     |di           }d|v r|                     |                     |dd          |                     |d          |                     |d          |                     |dd|          d          }|
                    |           d|v r|                     |                     |dd          |                     |d          |                     |d          |                     |dd|          d          }|                    |           W|                     |
ddd          }
|                     |ddd          }|                     |
d          | _        |                     |d          | _        |                     |
|          }|                     |d          }t          |                                          }g }t          dt	          |                    D ]}||         }|                      ||g           }| !                    |d          }t          dt	          |                    D ]G}||         }| j        tD          k    r|d         |d         k     r|n|}1|d         |d         k    r|n|}H|                    |           |                     |d          }|                     | j        |                     |d                    | _        |                     | j        d          | _#        |                     | j                  }t          |                                          | _$        | j        S )Nr   Tr   r=  )r  r  rK   r  r  r  r  r_  z1e-8r  r  r  baseNumericIdrW   )r=  r  rl  r  r  r  quoteNumericIdrX   rl  FrQ   r   )%r  rc  rF  r  r	  rQ  r  r  r  r  r  r[  r  r>  r  rK  r  idsr  precisionModer   r  r`  r  r  r  r  r  baseCurrenciesquoteCurrenciesrj  rR  rj  r  r   currencies_by_idr  )r   r  r  rW  marketValuesr   r  r   marketsSortedBySymbolmarketsSortedByIdr  r  defaultCurrencyPrecisionmarketPrecisionr  allCurrenciesgroupedCurrenciesr  resultingCurrenciesrl  groupedCurrenciesCodehighestPrecisionCurrencyjcurrentCurrencysortedCurrenciescurrenciesSortedByCodes                             r   r  zExchange.set_markets	  s    ||DMM'$:$:FD$OOq#l++,, 	" 	"A OET{d000#E$K088????38'"5;/%%d&@&@&B&B!^+E E y#U, ,F h )$,y!!	" )$-y!!$(y!MM&!!!!}}VX66 $T\ : : LL);<<1668899)..0011!"..t
KKDOON O1c&kk** 5 5151C~1U1U11\`\m\mnt\u\u("&..b"I"IV###;;"006JJ%)%6%6v%O%O $ 0 0 @ @%)%6%6PXZr%s%s	= =    H #))(333f$$#;;"00GLL%)%6%6v?O%P%P $ 0 0 A A%)%6%6QXZr%s%s	= =    H $**8444!\\.&%LLN"ll?FE2NNO"&--"G"GD#'==&#I#ID  --noNNM $mV D D*//1122E"$1c%jj)) 
E 
EQx(,7H$PR(S(S%+/??;PRS+T+T(q#&;"<"<== k kA&;A&>O)Y66GVWbGcf~  @K  gL  HL  HL??  Sk00GVWbGcf~  @K  gL  HL  HL??  Sk00#**+CDDDD#||,?HH"..tN^`f@g@ghhDO $dot D D!%do!>!>0557788
|r   currentRestInstanceparentRestInstancewsBaseDescribec                     |                      |                                |                                          }|                      ||          }|S r   )r  r  )r   r  r  r  extendedRestDescribesuperWithRestDescribes         r   %get_describe_for_extended_ws_exchangez.Exchange.get_describe_for_extended_ws_exchange
  sO    #//0B0K0K0M0MObOkOkOmOmnn $ 0 01E~ V V$$r   r  c                 ~   |                      |g d          }t          |                                          }i |d<   i |d<   i |d<   i }t          dt	          |                    D ]}||         }|                     ||         d          }|                     ||         d          }|                     ||         d          }	|                     ||         d          }
|||	t          j        ||	          }|||	t          j        ||	          }|	||t          j        ||          }	| 	                    |          ||         d<   | 	                    |	          ||         d<   | 	                    |          ||         d<   ||         d         |d         |<   ||         d         |d         |<   ||         d         |d         |<   |
/| 	                    |
          ||         d<   ||         d         ||<   t          |                                          }t	          |          }|r||d<   |S )N)rS  r  r  freeusedtotalr  r  r  r   debt)
r  r  rK  r  r	  r  r   r  r  r  )r   r  balancesr  debtBalancer   rl  r  r  r  r  debtBalanceArrayr$  s                r   safe_balancezExchange.safe_balance

  sO   99W&`&`&`aaX]]__%%q#e**%% 	: 	:A8D$$WT]G<<E##GDM6::D##GDM6::D##GDM6::DD$44;K*4665#44;K)%665#44;K)%66$($5$5d$;$;GDM&!$($5$5d$;$;GDM&!%)%6%6u%=%=GDM'"$+DM&$9GFOD!$+DM&$9GFOD!%,T]7%;GGT"(,(9(9$(?(?f%$+DM&$9D! 0 0 2 233%&& 	*)GFOr   r  c                    |                      |                     |d                    }|                     |d          }|                     |d          }|                     |d          }|                      |                     |d                    }|                      |                     |d                    }|                     |d          }	|                     |d          }
|                     |d	          }|                     |d
          }|d u }|d u }|	d u }|                     |d          }|d u }|                     |d          d u }|
d u }|d u }|p|}|                     |dg           }g }|s|s|r|                     |d|          }| j        }t          | _        |                     |d          }|d uod|v od|v }|s|                     ||          }n|}|| _        d}t          |t                    }|rt          |          }|r|dk    r|d         |d         d         |d<   |d	         |d         d	         |d	<   |d         |d         d         |d<   |d         |d         d         |d<   |rd}|rd}t          dt          |                    D ]v}||         }|                     |d          } |r| t          j        ||           }|                     |d          }!|r|!t          j        ||!          }|r|                     |d          }
|r|                     |d	          }|                     |d          }"|r|"|	|"}	nt          |	|"          }	|r|                     |d          }#|#St          dt          |#                    D ]3}$|#|$         }%|                    |                     i |%                     45|                     |d          }%|%)|                    |                     i |%                     x|r| j        r|                     |          n|}&t          |&          }'t          d|'          D ]V}|                     |&|         d          |&|         d<   d|&|         v r%|                     |&|         d          |&|         d<   W|sf|'dk    r`|                     |          }(|                     |(d          |(d<   d|(v r|                     |(d          |(d<   |&                    |(           |&|d<   |r|'dk    r|&d         |d<   |"||t          j        ||          }n|dk    r|}|$||t          j        ||          }n
|dk    r||}|"||t          j        ||          }n|dk    rd}|                     |dd          })|                     |                     |dd                    }*|[|Y|Wt          j        |d          rBt          j        ||*          }+|)rt          j        |+|          }nt          j        ||+          }|d up|d u},|rO|M|,rKd }-||}-n|}-t          j        ||*          }+|)rt          j        |+|-          }nt          j        |+|-          }|                     |d          }.|d u pt          j        |d          }/|/r|.dk    r|}t          dt          |                    D ]	}||         }0|                     |0d          |0d<   |                     |0d          |0d<   |                     |0d          |0d<   |                     |0di           }%|                     |%d          |%d<   d|%v r|                     |%d          |%d<   |                     |0dg           }1t          dt          |1                    D ]'}$|                     |1|$         d          |1|$         d<   (|1|0d<   |%|0d<   |                     |d          }2|                     |d          }3|2!|                     |d          dk    rd}2|3rd}2n|3|2dk    }3|                     |d          }4|                     |d           }5|                     |d!          }6|6|                     |4          }6|                     |                     |d"d#                    }7|                     |                     |d$                    }8|                     |                     |d%                    }9|                     |i d|                     |d          d&|                     |d&          d|4d!|6d|
d|                     |d          d	|d|	d |5d|                     |          d|                     |          d|                     |          d|                     |          d|                     |          d|                     |          d|2d|3||                     |d'          |7|7|8|9||                     |d          d(          S ))NrW   	remainingfilledrY   averagerX   lastTradeTimestampr  r!  r  r  r  r  r   rS  r=  r  r  r  r  rater   closedr  Fr  r   timeInForcepostOnlyIOCPOlastUpdateTimestampr  triggerPrice	stopPricetakeProfitPricestopLossPriceclientOrderId
reduceOnly)r  r  r  r  r  r  r  r  ) r  r  r  r  rj  r   rb  parse_tradesr  r  r	  r  r   r  rT   rQ  r$  
reduceFeesreduce_fees_by_currencyr  r  r  rX  r   r  
string_mul
string_divstring_equalsr`  r  r  r  ):r   r  r   rW   r  r  rY   r  rX   lastTradeTimeTimestampr  r!  r  parseFilled	parseCostparseLastTradeTimeTimestampr  parseFee	parseFeesparseSymbol	parseSideshouldParseFeesr  r  	rawTrades	oldNumber
firstTradetradesAreParsedtradesLengthisArrayr   r  tradeAmount	tradeCosttradeTimestamp	tradeFeesr  tradeFeereducedFeesreducedLengthfeeCopyr  r  filledTimesContractSizecostPriceExistsmultiplyPrice	orderType
emptyPricerO  	entryFeesr  r  r  r  r  r  r  r  s:                                                             r   
safe_orderzExchange.safe_order,
  s	     0 0 A ABB$$UK88	!!%22v....!1!1%!C!CDDt//w??@@!%!2!25:N!O!O!!%22v..!!%22~T\	'='E#ooeU++4KOOE622d:	nDL	"/i~~eVR00 :	G) :	G :	Gx@@IIDKA66J *$ 6kVz=QkX\`jXjO" #**9f=="#DKL ..G +"6{{ )GL1,,?*&,Qi&9E(O=($*1If$5E&M=($*1If$5E&M;&"()G"4E$K ! F Dq#f++.. G GA"1IE"&"2"25("C"CK" I(?!(!3FK!H!H $ 0 0 ? ?I  Ci&;&1$	BB" C!%!1!1%!B!B  ?#//v>>%)__UK%H%HN2 a8R195C22589OQ_5`5`2& 	G$(OOE6$B$B	$0%*1c)nn%=%= G G+4Q< $DKKH,E,E F F F FG (,ue'D'DH'3 $DKKH,E,E F F F 	.@DY$66t<<<UYK,,M1m,, V V)-)9)9+a.&)Q)QAv&[^++-1-=-=k!nf-U-UKN6* ,!!3!3**3//"&"2"27F"C"CW$$&*&6&6w&G&GGFO""7+++'E&M .]a//*1~e>!i&; +FI>>8##>!i&; +FI>>8##(:!f&8#.vv>>		8##	..E::,,T__V^UV-W-WXX ?")9w?PQWY\?]?])9*1*<V\*R*R' P%01H$OOGG%07NOOG #$.FE4E 	R&,/, M % '&-&8&N&N# R)*A=QQ)*A=QQOOE622	tmI(=eS(I(I
 	900Eq#f++&& 	$ 	$A1IE"..uh??E(O!--eW==E'N ,,UF;;E&M~~eUB77H#//&AAHV!!#'#3#3Hf#E#E ufb99I1c)nn-- N N'+'7'7	!f'M'M	!V$$%E&M#E%LL&&um<<??5*55v..(::# #""d*H%%e[99	"//7LMM##E:66||I..H((););E>S^)_)_``++D,<,<UDU,V,VWW))$*:*:5/*R*RSS{{5 #
$""5$//#
T--e_EE#
 #
 	#

 f#
 D$$UF33#
 D#
 !"8#
 "#6#
 T&&u--#
 d''//#
 D%%d++#
 t((11#
 d''//#
 **955#
  ;!#
" ##
$ //%>>%(.*??5%003#
 #
 #
   	r   ordersc           
         g }t          |t                    rft          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           Hnt          |                                          }	t          dt          |	                    D ]e}|	|         }
|                     |                     |                     d|
i||
                   |          |          }|                    |           f|                     |d          }||d         nd }| 	                    ||||          S )Nr   r=  r  r  )
r  r  r  r	  r$  r  rQ  rK  rc  filter_by_symbol_since_limit)r   r  r   r  r  ry  resultsr   r  r  r=  r  s               r   parse_orderszExchange.parse_orders  sL   , fd## 		&1c&kk** & &D$4$4VAY$G$GPPu%%%%& v{{}}%%C1c#hh'' & &VD$4$4T[[$VTVZ5X5XZ`$a$acijju%%%%,,w44&,&8!!t00&%OOOr   r  r!  rX   c                 D   |dk    r|dk    rt          | j        dz             | j        |         }|                     |dd          }	d}
|	dk    r|dk    }
n|	d	k    r|d
k    }
n|	dk    }
|                     |          }d}|
r-|                     |          }t          j        ||          }d}nd}|d         sd}|dk    rd}|                     ||          }t          j        ||          }|||         |                     |          |                     |          dS )a  
        calculates the presumptive fee that would be charged for an order
        :param str symbol: unified market symbol
        :param str type: 'market' or 'limit'
        :param str side: 'buy' or 'sell'
        :param float amount: how much you want to trade, in units of the base currency on most exchanges, or number of contracts
        :param float price: the price for the order to be filled at, in units of the quote currency
        :param str takerOrMaker: 'taker' or 'maker'
        :param dict params:
        :returns dict: contains the rate, the percentage multiplied to the order amount to obtain the fee amount, and cost, the total value of the fee in units of the quote currency, for the order
        r   r  z calculateFee() - you have provided incompatible arguments - "market" type order can not be "maker". Change either the "type" or the "takerOrMaker" argument to calculate the fee.feeSider  Nr   sellgivebuyr  r   r  r  )r  r  r  rY   )r   r=  r  r  r   r   r  r  )r   r  r  r!  rW   rX   takerOrMakerry  r   r  useQuoterY   r/  priceStringr  s                  r   calculate_feezExchange.calculate_fee+  sr    8 7 7#DG  /c  %c  d  d  df%""69g>>ev~HHu}HH ')H$$V,, 	//66K%dK88DCCCf~ 	C8"L55!$-- s%%d++%%d++	
 
 	
r   liquidationc                 B   |                      |d          }|                      |d          }|                      |d          }|                      |d          }|                      |d          }||||t          j        ||          }|||t          j        ||          }|                     |          |d<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |S )N	contractsr  rX   	baseValue
quoteValue)r  r   r  r  )r   r  r   r  r  rX   r  r  s           r   safe_liquidationzExchange.safe_liquidation\  s3   $$[+>>	''??  g66$$[+>>	%%k<@@
I$9@X_d_p*9lCCIY%:AR +Iu==J#'#4#4Y#?#?K &*&7&7&E&EN##0077G#'#4#4Y#?#?K $($5$5j$A$AL!r   c                 r   |                      |d          }|                      |d          }|                      |d          }|r|                      |d          }|}|C|                     |dd          }|rt          j        d|          }t          j        ||          }t          j        ||          }|                     |d          d u }	|                     |d	          d u }
|	p|
}g }|                     |d          }|ri| j        r|                     |          n|}t          |          }t          d
|          D ]V}| 
                    ||         d          ||         d<   d||         v r%| 
                    ||         d          ||         d<   W|	sf|d
k    r`|                     |          }| 
                    |d          |d<   d|v r| 
                    |d          |d<   |                    |           |
r||d	<   |	r|dk    r|d
         |d<   |                     |d          }|;| 
                    |d          |d<   d|v r| 
                    |d          |d<   ||d<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |S )NrW   rX   rY   r  r  Fr  r  r  r   r  r   )r  rX  r   r  r  r  r  r  r	  r  r  r  rQ  r  )r   r  r   rW   rX   rY   r  r  r  r  r  r  r  r  r  r  r   r  r   s                      r   
safe_tradezExchange.safe_tradem  s   !!%22  00v..<++FNCCL!M'..EBB C$+$6sE$B$BM ' 2=, O O%mV<<D??5%00D8OOE622d:	"/iooeU++ 	(@DY$66t<<<UYK,,M1m,, V V)-)9)9+a.&)Q)QAv&[^++-1-=-=k!nf-U-UKN6* ,!!3!3**3//"&"2"27F"C"CW$$&*&6&6w&G&GGFO""7+++ , +f .]a//*1~eue44H##'#3#3Hf#E#E X%%'+'7'7&'I'IHV$'e++F33h**511g))$//fr   c                     i }t          |                                          }t          dt          |                    D ],}||         }||         }t	          |t
                    r|||<   -|S r7  )r  rK  r  r	  r  rb  )r   r  reversedrK  r   r/  r  s          r   rz  z&Exchange.invert_flat_string_dictionary  sn    DIIKK  q#d))$$ 	& 	&Aq'CIE%%% &"%r   c                    i }t          dt          |                    D ]}||         }|                     |d          }||                     |d          }|                     |d          }t	          j        |d          rd||vri ||<   |dn|}|||         v r7t	          j        ||         |         d         |          ||         |         d<   ||d||         |<   ||||         |         d<   g }	t          |                                          }
t          dt          |
                    D ]?}t          |
|                                                   }| 	                    |	|          }	@|	S )Nr   r  r  rY   r  rQ   )r  rY   )
r  r	  r  r  r   	string_eqr  r  rW  rj  )r   r  reducedr   r  feeCurrencyCoder  rY   rateKeyrA  	feeValuesreducedFeeValuess               r   r  z Exchange.reduce_fees_by_currency  s   \ q#d))$$ 	I 	IAq'C"..sJ??O*''V44sF33$T3// '722/1GO,!%""Dgo666@G@RSZ[jSklsStu{S|  C  AD  ADGO,W5f== %4 $9 9GO,W5 'DH09&A))**	q#i..)) 	A 	AA#IaL$7$7$9$9::&&v/?@@FFr   c                 	   |                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }	|                     |d          }
|                     |d	          }|	(t          j        |                      |          |
          }	|||}n|||}|C|A|t          j        ||          }|(t          j        t          j        ||          d
          }|A|?|=t          j        |d          r(t          j        t          j        ||          d          }|,|*|(t          j        t          j        ||          d          }|||t          j        ||          }|                     |i 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openr7  r  changerG   r  r  r  r  2r  100bid	bidVolumeask	askVolumehighlowpreviousClose)r  r  r   r  r  r  r  r  r$  r  r  )r   r  r   r+  r7  r  r,  rG   r  r  r  r  s               r   safe_tickerzExchange.safe_ticker  s   ~~d..vv>>??t//@@AA~~d..vv>>?? 0 0 B BCC^^D$4$4V\$J$JKK
..!1!1&)!D!DEE~~d..vv>>??%%fl;;
&&v}==<%dnn[&A&A:NND5=EEl!2D4#3~ +D$77!,W-?d-K-KSQQV%7d>NT[TefjloTpTp>N +G,>vt,L,LeTTJN!7d>N'(::t(L(LeTTFLt/f6H%dF33D {{6 $
4$$T^^D4D4DVU4S4S%T%TUU$
))&+>>$
 4$$T^^D4D4DVU4S4S%T%TUU$
 ))&+>>	$

 D%%dnnT5E5Eff5U5U&V&VWW$
 4$$T^^D4D4DVU4S4S%T%TUU$
 D%%dnnT5F5Ft5L5L&M&MNN$
 T&&t~~d6G6G6N6N'O'OPP$
 D%%dnnT5F5Ft5L5L&M&MNN$
 d''//$
 $++J77$
 t((11$
 D%%d++$
 $++J77$
 4,,[99$
  T--foFF!$
   	r   c                 0    t          | j        dz             )Nzb fetchBorrowRate is deprecated, please use fetchCrossBorrowRate or fetchIsolatedBorrowRate insteadrq  r   rl  rW   ry  s       r   fetch_borrow_ratezExchange.fetch_borrow_rate"  s'    47  &J  J  K  K  	Kr   c                 0    t          | j        dz             )Nz$ repayCrossMargin is not support yetrq  r8  s       r   repay_cross_marginzExchange.repay_cross_margin%  r  r   c                 0    t          | j        dz             )Nz' repayIsolatedMargin is not support yetrq  r   r  rl  rW   ry  s        r   repay_isolated_marginzExchange.repay_isolated_margin(  rR  r   c                 0    t          | j        dz             )Nz% borrowCrossMargin is not support yetrq  r8  s       r   borrow_cross_marginzExchange.borrow_cross_margin+  r  r   c                 0    t          | j        dz             )Nz( borrowIsolatedMargin is not support yetrq  r=  s        r   borrow_isolated_marginzExchange.borrow_isolated_margin.  r  r   c                 0    t          | j        dz             )NzY borrowMargin is deprecated, please use borrowCrossMargin or borrowIsolatedMargin insteadrq  r   rl  rW   r  ry  s        r   borrow_marginzExchange.borrow_margin1  s'    47  &A  A  B  B  	Br   c                 0    t          | j        dz             )NzV repayMargin is deprecated, please use repayCrossMargin or repayIsolatedMargin insteadrq  rD  s        r   repay_marginzExchange.repay_margin4  s    47%}}~~~r   1mc                 X    d}| j         d         rd}t          | j        dz   |z             )NrQ   r   . If you want to build OHLCV candles from trade executions data, visit https://github.com/ccxt/ccxt/tree/master/examples/ and see "build-ohlcv-bars" filez" fetchOHLCV() is not supported yetr  r   r=  r   r  r  r  r  ry  rW  s          r   fetch_ohlcvzExchange.fetch_ohlcv7  s:    8M" 	r rG47%IIGSTTTr   c                 X    d}| j         d         rd}t          | j        dz   |z             )NrQ   fetchTradesWsrJ  zC fetchOHLCVWs() is not supported yet. Try using fetchOHLCV instead.rK  rL  s          r   fetch_ohlcv_wszExchange.fetch_ohlcv_ws=  s;    8O$ 	r rG47%jjmttuuur   c                 0    t          | j        dz             )Nz" watchOHLCV() is not supported yetrq  rc  s         r   watch_ohlcvzExchange.watch_ohlcvC  r
  r   r8  r[  r  lr  rp  r  c	                    g }	|                      ||g           }
|                      ||g           }|                      ||g           }|                      ||g           }|                      ||g           }|                      ||g           }t          dt          |
                    D ]}|	                    |r|                     |
|          n|                     |
|          |                     ||          |                     ||          |                     ||          |                     ||          |                     ||          g           |	S r7  )rj  r  r	  rQ  r  r  r  )r   r  r  r+  r3  r4  r7  r  r  rA  
timestampsopenshighslowsclosesvolumesr   s                    r   convert_trading_view_to_ohlcvz&Exchange.convert_trading_view_to_ohlcvF  sO   ^^FIr::
vtR00vtR00~~fc2..r22..44q#j//** 	 	AMM46^!!*a000D<O<OPZ\]<^<^q))q))a((**++     r   c	                    i }	g |	|<   g |	|<   g |	|<   g |	|<   g |	|<   g |	|<   t          dt          |                    D ]}
|r||
         d         n#|                     ||
         d         dz            }|	|                             |           |	|                             ||
         d                    |	|                             ||
         d                    |	|                             ||
         d                    |	|                             ||
         d                    |	|                             ||
         d                    |	S )Nr   r  r   r5  r/  r     )r  r	  
parseToIntrQ  )r   r  r  r+  r3  r4  r7  r  r  rA  r   r  s               r   convert_ohlcv_to_trading_viewz&Exchange.convert_ohlcv_to_trading_viewY  sM   yttsuvq#f++&& 	0 	0A!#M119L)M)MB9$$R(((4Lq	!---4Lq	!---3Kvay|,,,5M  1...6N!!&)A,////r   c                 
   d}|                      | j        |i           }|                     |dd          }	 |                     |dd          durd S |                      |dd          }	d }
d}||	k     rE	  t          | |          i           }
n*# t          $ r}|dz   }||	k    r|Y d }~nd }~ww xY w||	k     E|
}||                    |          }|d         }||                    |          }|d         }|rOt          |t                    r:|                     |	                                          }|r|S t          d	          |S # t          $ r}| j        d
z   |z   dz   }Y d }~nd }~ww xY w|rd S t          |          )NrQ   webApiMuteFailureTwebApiEnablewebApiRetriesr  r   r   z&could not parse the response into jsonr  zx() failed to fetch correct data from website. Probably webpage markup has been changed, breaking the page custom parser.)r  r  rX  r  r8  r   r  rb  r  rk  r   r=  )r   ro  endpointMethodreturnAsJson
startRegexendRegexerrorMessager  muteOnFailurer  r[  retryr9  r  splitted_by_startsplitted_by_endjsoneds                    r   fetch_web_endpointzExchange.fetch_web_endpointk  s   //$,;;w0CTJJ	o~~g~t<<DHHt/2FFJHE*$$ <wt^<<R@@H       !AIE
** +**** 	 *$$ G%$+MM*$=$=!+A.#")--"9"9)!, GS!9!9 99 P!M%&NOOO 	o 	o 	o7S=61  5o  oLLLLLL	o 	,4l+++sN   E !E 4B E 
B/B*%E *B//B
E :E 
E/E**E/c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r7  )r  r	  rQ  	market_idr   r  rA  r   s       r   
market_idszExchange.market_ids  sZ    ?Nq#g,,'' 	6 	6AMM$..445555r   c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r7  )r  r	  rQ  r   rq  s       r   markets_for_symbolszExchange.markets_for_symbols  sZ    ?Nq#g,,'' 	3 	3AMM$++gaj112222r   c                    ||st          | j        dz             |S t          |          }|dk    r|st          | j        dz             |S g }d }d }	t          dt          |                    D ]}
|                     ||
                   }|r7|5|d         |k    r)t          | j        dz   |z   dz   |d         z   dz             |r%|	#|d         |	k    rt          | j        dz             |)|d         |k    rt          | j        d	z   |z   d
z             |d         }|d         s|d         }	|                     |d||
                   }|                    |           |S )Nz' empty list of symbols is not supportedr   r  z* symbols must be of the same type, either z or r  r  z? symbols must be of the same subType, either linear or inverse.z" symbols must be of the same type zT. If the type is incorrect you can change it in options or the params of the requestr   r  )r   r=  r	  r  r   r   r  rQ  )r   r  r  
allowEmptysameTypeOnlysameSubTypeOnlysymbolsLengthrA  
marketTypeisLinearSubTyper   r   r  s                r   market_symbolszExchange.market_symbols  s   ? ]'2[([\\\NGA ]'2[([\\\N
q#g,,'' 	" 	"A[[,,F J!7&>Z//$TW/[%[^h%hkq%qtz  |B  uC  &C  FI  &I  J  J  J rO$?(#66$TW/p%pqqqF6Nd$:$: +O!ORV!V  Zp  "p  q  q  qJ&> 3"("2%%fh
CCFMM&!!!!r   c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r7  )r  r	  rQ  common_currency_code)r   r  rA  r   s       r   market_codeszExchange.market_codes  s\    =Lq#e**%% 	? 	?AMM$33E!H==>>>>r   r5  priceKey	amountKeycountOrIdKeyc           	          |                      |          }g }t          dt          |                    D ]3}|                    |                     ||         |||                     4|S r7  )rF  r  r	  rQ  parse_bid_ask)r   r  r  r  r  rA  r   s          r   parse_bids_askszExchange.parse_bids_asks  sk    --((q#g,,'' 	] 	]AMM$,,WQZ9l[[\\\\r   c           
         |                      |||          }|                     ||                     |                     |d                   d          |                     |                     |d                   dd          d          S )Nasksr   bidsT)r  r  )r  r$  rc  r  )r   r  r  ry  rm  s        r   fetch_l2_order_bookzExchange.fetch_l2_order_book  s    ))&%@@	{{9LL	&0A!B!BAFFLL	&0A!B!BAtLL'
 '
   	r   c                     ||S g }t          dt          |                    D ]?}|                     ||         d          }||k    r|                    ||                    @|S Nr   r  )r  r	  r  rQ  )r   objectsr  rA  r   objectSymbols         r   filter_by_symbolzExchange.filter_by_symbol  sp    >Nq#g,,'' 	* 	*A++GAJAALv%%gaj)))r   returnc           	      0   t          |t                    r|                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          gS |S )Nr   r   r5  r/  r  r]  )r  r  r  r  r2  s      r   r1  zExchange.parse_ohlcv  s    eT"" 	!!%++  **  **  **  **  **  r   networkCodecurrencyCodec                    |dS |                      | j        di           }|                     ||          }||t          | j                                                  }t          dt          |                    D ]K}|g}|                     |d          }|                     ||          }	|                     |	d          }| nLn|                      | j        di           }
||
v rx|
|         }t          |	                                          }t          dt          |                    D ]0}||         }||         }||k    r|                     ||          } n1n]|                     | j        |          }|                     |d          }|                     ||          }	|                     |	d          }||}|S )a9  
         * @ignore
        tries to convert the provided networkCode(which is expected to be an unified network code) to a network id. In order to achieve self, derived class needs to have 'options->networks' defined.
        :param str networkCode: unified network code
        :param str currencyCode: unified currency code, but self argument is not required by default, unless there is an exchange(like huobi) that needs an override of the method to be able to pass currencyCode argument additionally
        :returns str|None: exchange-specific network id
        Nrx  r   r=  r}  )
r  r  r  r  r  rW  r  r	  r`  rK  )r   r  r  networkIdsByCodes	networkIdr  r   r  rx  networkr}  replacementObjectrK  r/  r  s                  r   network_code_to_idzExchange.network_code_to_id  s    4 OODL*bII$$%6DD	#!$/"8"8":":;;
q#j//22  A !sH#~~h
CCH"nnX{CCG $ 0 0$ ? ?I , - 26Ooqs1t1t.#AAA(F|(T% 1 6 6 8 899D"1c$ii00 " ""1g 1# 6 K//(,(8(89JC(P(PI!E 0
  $~~do|LLH#~~h
CCH"nnX{CCG $ 0 0$ ? ?I '	r   r  c                    |dS |                      | j        di           }|                     |||          }|N|                      | j        di           }||v r.|                      ||i           }|                     |||          }|S )aW  
         * @ignore
        tries to convert the provided exchange-specific networkId to an unified network Code. In order to achieve self, derived class needs to have "options['networksById']" defined.
        :param str networkId: exchange specific network id/title, like: TRON, Trc-20, usdt-erc20, etc
        :param str|None currencyCode: unified currency code, but self argument is not required by default, unless there is an exchange(like huobi) that needs an override of the method to be able to pass currencyCode argument additionally
        :returns str|None: unified network code
        Nry  r}  )r`  r  r  )r   r  r  networkCodesByIdsr  r}  r  s          r   network_id_to_codezExchange.network_id_to_code  s     4 NN4<LL&&'8)YOO#-1^^DLJjln-o-o*===$(NN3QS_ac$d$d!"../@+{[[r   c                 l    |                      |dd          }||                     |ddg          }||gS )Nr  r  )r  r  )r   ry  networkCodeInParamss      r   handle_network_code_and_paramsz'Exchange.handle_network_code_and_params2  sC    "00	RR*YYvy'ABBF#V,,r   c                     d }|                      | j        di           }||v r	||         }n|                      | j        d          }||}|S )NdefaultNetworksdefaultNetwork)r`  r  )r   r  defaultNetworkCoder  r  s        r   default_network_codezExchange.default_network_code9  sc    !..7H"MM?**!0!> "^^DL:JKKN)%3"!!r   c                 2    |                      |||d          S r   select_network_key_from_networksr   r  r  indexedNetworkEntriess       r   )select_network_code_from_unified_networksz2Exchange.select_network_code_from_unified_networksF  s    44\;Pegklllr   c                 2    |                      |||d          S r  r  r  s       r   #select_network_id_from_raw_networksz,Exchange.select_network_id_from_raw_networksI  s    44\;Peglmmmr   c                 (   d }t          |                                          }t          |          }||dk    r t          | j        dz   |z   dz   |z             |r|n|                     ||          }||v r|}nt          | j        dz   |z   dz   |z   dz   d                    |          z             |dk    rt          | j        dz   |z             |                     |          }	|r|	n|                     |	|          }
|
|v r|
n|d         }|S )Nr   z - z' network did not return any result for z network was not found for z, use one of , z! - no networks were returned for )r  rK  r	  r   r=  r  r!  r  )r   r  r  r  isIndexedByUnifiedNetworkCodechosenNetworkIdavailableNetworkIdsresponseNetworksLengthr  r  defaultNetworkIds              r   r  z)Exchange.select_network_key_from_networksL  s   "#8#=#=#?#?@@!$%8!9!9"%**"47U?[#@Cl#lo{#{||| ,I  AKKdNeNefqs  OA  OA	 555&/OO&tw'BEb'beq'q  uD  (D  GK  GP  GP  Qd  Ge  Ge  (e  f  f  f%**"47-P#PS_#_``` &*%>%>|%L%L"9V  $V#5#5\`\s\s  uG  IU  ]V  ]V 7GK`7`7`"2"2gz{|g}r   r  c                 \    |                      |||          }|                     ||          S r   )r  r  )r   r  r  r  r  r  s         r   safe_number_2zExchange.safe_number_2e  s/    "":tT::  ***r   r  r  rm  c	                 @   |                      |                     ||g           |||          }	|                      |                     ||g           |||          }
||                     |	dd          |                     |
d          ||                     |          d dS )Nr   T)r  r  r  r  r  r4  )r  r  rc  r  )r   rm  r  r  bidsKeyasksKeyr  r  r  r  r  s              r   parse_order_bookzExchange.parse_order_booki  s    ##DOOIw$K$KXW`bnoo##DOOIw$K$KXW`bnooLLq$//LLq))"Y//
 
 	
r   r  c                     g }t          dt          |                    D ]1}|                    |                     ||         |                     2|                     |d          }|                     |||d          S r7  )r  r	  rQ  r1  rc  r  )	r   r  r   r  r  r  r  r   r<  s	            r   parse_ohlcvszExchange.parse_ohlcvsu  s~    q#f++&& 	@ 	@ANN4++F1Iv>>????gq))))&%BBBr   r[  c                 `   |                      |          }i }d}|t          |          }|d u p|dk    }t          |t                    rt	          dt          |                    D ]}||         }|                     ||          }	|                     |	d d d          }
|
d         }|                     |
dd          }|r1|s|                     ||          r| 	                    ||
          ||<   nt          |
                                          }t	          dt          |                    D ]|}||         }||         }|                     |d d d          }
|
d         }|                     |
dd          }|r1|s|                     ||          r| 	                    ||
          ||<   }|S )Nr   r   r  r  F)r|  r	  r  r  r  r  safe_marketrX  rn  r  rK  )r   r[  r  marketIdKeytiersry  	noSymbolsr   r  r=  r   r  r  rK  marketIds                  r   parse_leverage_tierszExchange.parse_leverage_tiers|  s   %%g..LLM_=-1*<	h%% 	S1c(mm,, S S{%%dK88))"dD&AA)>>&*eDD S SdmmFG.L.L S$($D$DT6$R$RE&MS ((D1c$ii(( S S7)))(D$GG)>>&*eDD S SdmmFG.L.L S$($D$DT6$R$RE&Mr   c                 P   | j         d         r|s	d| j        vr|                     |          }t          dt	          |                    D ]9}||         }|                     | j        |         ||                   | j        |<   :|                                 | j        d<   | j        S )Nr   limitsLoadedr   )r  r  r  r  r	  r  r  rF  )r   r  r  ry  r[  r   r  s          r   load_trading_limitszExchange.load_trading_limits  s    8() 	C Cn<<44W==q#g,,// d dA$QZF+/+;+;DL<PRZ[aRb+c+cDL((/3/@/@/B/B^,|r   c                    |                      |d          }|                      |d          }|                     |d          }|E|C|At          j        t          j        ||d          d          }|                     |          |d<   |                     |d          }|                      |d          }d }||                     | j        |          }|||                     |d          }||d<   |S )NunrealisedPnlinitialMarginrG   r  r.  r  r  )r  r  r   r  r  r  r  r  )	r   r#  unrealizedPnlStringinitialMarginStringrG   percentageStringr  r  r   s	            r   safe_positionzExchange.safe_position  s   "..xII"..xII __X|<<
%8%DK^Kj&1'2DEXZmop2q2qsxyy%)%6%67G%H%HH\"''.AA!!(H55__T\6::FF$6++FNCCL'3H^$r   	positionsc                 T   |                      |          }|                     |          }g }t          dt          |                    D ]G}|                     |                     ||         d           |          }|                    |           H|                     |d|d          S )Nr   r  F)r|  rF  r  r	  r$  r$  rQ  filter_by_array_positions)r   r  r  ry  rA  r   r#  s          r   parse_positionszExchange.parse_positions  s    %%g..MM),,	q#i..)) 	$ 	$A{{4#6#6y|T#J#JFSSHMM(####--fhOOOr   accountsc                     |                      |          }g }t          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           G|S r7  )rF  r  r	  r$  r  rQ  )r   r  ry  rA  r   r2   s         r   parse_accountszExchange.parse_accounts  sv    ==**q#h--(( 	# 	#Akk$"4"4Xa["A"A6JJGMM'""""r   r  c                 p   |                      |          }g }t          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           H|                     |dd          }||d         nd }	|                     ||	||          S )Nr   r  r=  r  )rF  r  r	  r$  r	  rQ  rf  r  )
r   r  r   r  r  ry  rA  r   r  r  s
             r   r  zExchange.parse_trades  s    v&&q#f++&& 	! 	!AKK 0 0F C CVLLEMM%    T::&,&8!!t00NNNr   r  c                 n   |                      |          }g }t          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           H|                     |d          }||d         nd }	|                     ||	||          S Nr   r  rl  )rF  r  r	  r$  r  rQ  rc  filter_by_currency_since_limit)
r   r  r  r  r  ry  rA  r   r  rl  s
             r   parse_transactionszExchange.parse_transactions  s    }}\22q#l++,, 	' 	'A++d&<&<\!_h&W&WY_``KMM+&&&&fk22$,$8xt2264NNNr   	transfersc                 n   |                      |          }g }t          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           H|                     |d          }||d         nd }	|                     ||	||          S r  )rF  r  r	  r$  r  rQ  rc  r  )
r   r  r  r  r  ry  rA  r   r   rl  s
             r   parse_transferszExchange.parse_transfers  s    MM),,	q#i..)) 	$ 	$A{{4#6#6y|X#N#NPVWWHMM(####fk22$,$8xt2264NNNr   c                 8   g }|                      |          }t          dt          |                    D ]}|                     ||         |          }	t	          |	t
                    rPt          dt          |	                    D ]1}
|                    |                     |	|
         |                     2|                    |                     |	|                     |                     |d          }||d         nd }| 	                    ||||          S r  )
rF  r  r	  r  r  r  rQ  r$  rc  r  )r   r  r  r  r  ry  rA  	arrayDatar   itemOrItemsr  rl  s               r   parse_ledgerzExchange.parse_ledger  s   MM$''	q#i..)) 	@ 	@A11)A,IIK+t,, @q#k"2"233 G GAMM$++k!nf"E"EFFFFG dkk+v>>????fk22$,$8xt2264NNNr   c                 *    |                                  S r   )r  r>  s    r   r4  zExchange.nonce  s    ||~~r   c                     |S r   rC  )r   r  s     r   rc  zExchange.set_headers  s    r   c                 D    |                      |          }||d         S |S Nr=  )r   r   r  r   s      r   rp  zExchange.market_id  s(    V$$$<r   c                 Z    |                      |          }|                     |d|          S Nr  )r   r  r  s      r   r  zExchange.symbol  s+    V$$&999r   ry  	paramNamec                 h    |                      |||          }||                     ||          }||gS r   )r  r  r   ry  r  r<  r  s        r   handle_param_stringzExchange.handle_param_string  s<      LAAYYvy11Fvr   c                 h    |                      |||          }||                     ||          }||gS r   )r  r  r  s        r   handle_param_integerzExchange.handle_param_integer  s<    !!&)\BBYYvy11Fvr   c                     |                      ||          |                     ||                     |                    gS r   )rz  r  ru  )r   r  ry  s      r   resolve_pathzExchange.resolve_path  s>    f--IIfd11$7788
 	
r   c                     |                      |          }g }t          dt          |                    D ]#}|                    ||         |                    $|S r7  )rF  r  r	  rQ  )r   r  r/  newArrayr  r   s         r   get_list_from_object_valuesz$Exchange.get_list_from_object_values  sZ    ==))q#h--(( 	- 	-ANN8A;s+,,,,r   rz  r  symbolWithActiveStatussymbolWithUnknownStatusc                 d   | j         }||                     |d|          }|1|                     d|dg d           |                     |d|          }g }|r|                    d           |r|                    d            |                     |d|d          }|                     |d          S )	Nr  getSymbolsForMarketTyper  )r  r  quantoTr  Fr  )r  rJ  check_required_argumentrQ  filter_by_arrayr  )r   rz  r  r  r  filteredMarketsactiveStatusess          r   get_symbols_for_market_typez$Exchange.get_symbols_for_market_type   s    ,!"nn_fjQQO(()BGYXwXwXwxxx"nn_iQQO! 	(!!$'''" 	(!!$'''...Z_``//JJJr   c                 Z   |                      |          }||s|r|                     ||          n|S g }t          dt          |                    D ]?}|                     ||         |         |          r|                    ||                    @|r|                     ||          n|S r7  )rF  r[  r  r	  rn  rQ  )r   r  r/  rW  indexedr  r   s          r   r  zExchange.filter_by_array/  s    --((>>29F4==#...wFq#g,,'' 	+ 	+A}}WQZ_f55 +wqz***.5Bt}}Wc***7Br   c                    | j         r.|                     |||||          }|                     |           |                                 | _        |                     ||||||          }	|	d         | _        |	d         | _        |	d         | _        | 	                    |	d         |	d         |	d         |	d                   S )Nr  r  rn  ro  )
enableRateLimitcalculate_rate_limiter_costrM  rF  rG  r  last_request_headerslast_request_bodylast_request_urlr  )
r   r  r  ro  ry  r  r  r-  rY   r  s
             r   fetch2zExchange.fetch2:  s     	 33CvvVVDMM$(,(9(9(;(;%))D#vvwEE$+I$6!!( 'zz'%.'(*;WY=OQXY_Q`aaar   c           	      8    |                      |||||||          S r   )r  )r   r  r  ro  ry  r  r  r-  s           r   r  zExchange.requestE  s     {{4ffgtVLLLr   c                     |r|                      |          | _        n(| j        r| j        S |                      |          | _        |                     | j        d          | _        | j        S r  )r  r  r[  accountsById)r   r  ry  s      r   load_accountszExchange.load_accountsH  sh     	< //77DMM} <}$ $ 3 3F ; ; MM$->>}r   r  c           
         |                      |          dz  }g }d}d}d}	d}
d}d}t          |          }t          ||          }t          d|          D ]}||         }|d         }||k     rt	          t          j        ||z                      |z  }||k     rHt          |          }|d	z
  }|d
k    s&||                     ||         |         |          k    r;|                    ||d         |d         |d         |d         |d         d	g           t          ||         |         |d                   ||         |<   t          ||         |	         |d                   ||         |	<   |d         ||         |
<   |                     ||         |         |d                   ||         |<   |                     ||         |         d	          ||         |<   |S )Nr  r   r5  r/  r  r]  r  r  r   r   rX   rW   )
r  r	  rS   r  r  r  floorr  rQ  rT   )r   r  r  r  r  r  r  i_timestampi_highi_lowi_closei_volumei_countr  oldestr   r  r  openingTimeohlcv_lengthcandles                        r   build_ohlcvczExchange.build_ohlcvcS  s    !!),,t36{{\5))q&!! 	O 	OA1IE{#BEzzdjb1122R7KU""v;;L!A%F"+&.:UWY1Z1Z"Z"Z'N'N'N'N(O     *-VF^F-CU7^)T)Tvv&(+F6N5,A5>(R(Rvu%*/.vw'+/88F6N84LeT\o+^+^vx(*.((6&>'3JA*N*Nvw''r   c                 ^    |                      |          }|                     |||||          S r   )r[  r  )r   r  r   r  r  r  rA  s          r   parse_trading_view_ohlcvz!Exchange.parse_trading_view_ohlcv  s1    33F;;  E5IIIr   r=  c                 6    |                      ||d|||          S )Nr  edit_limit_orderr   r=  r  rW   rX   ry  s         r   edit_limit_buy_orderzExchange.edit_limit_buy_order  s     $$RvNNNr   c                 6    |                      ||d|||          S )Nr  r  r  s         r   edit_limit_sell_orderzExchange.edit_limit_sell_order  s     $$ROOOr   c           	      8    |                      ||d||||          S Nr  )
edit_order)r   r=  r  r!  rW   rX   ry  s          r   r  zExchange.edit_limit_order  s     r67D&%PPPr   c                 b    |                      ||           |                     ||||||          S r   )r   create_orderr   r=  r  r  r!  rW   rX   ry  s           r   r   zExchange.edit_order  s6    V$$$  tVUFKKKr   c                 b    |                      ||           |                     ||||||          S r   )cancelOrderWscreateOrderWsr#  s           r   edit_order_wszExchange.edit_order_ws  s6    2v&&&!!&$feVLLLr   c                 0    t          | j        dz             )Nz( fetchPermissions() is not supported yetrq  r  s     r   fetch_permissionszExchange.fetch_permissions  r  r   c                 0    t          | j        dz             )Nz% fetchPosition() is not supported yetrq  r7  s      r   fetch_positionzExchange.fetch_position  r  r   c                 0    t          | j        dz             )Nz% watchPosition() is not supported yetrq  r7  s      r   watch_positionzExchange.watch_position  r  r   c                 0    t          | j        dz             )Nz& watchPositions() is not supported yetrq  r  s        r   watch_positionszExchange.watch_positions  r  r   c                 2    |                      ||||          S r   )watchPositionsr  s        r   watch_position_for_symbolsz#Exchange.watch_position_for_symbols  s    ""7E5&AAAr   c                 0    t          | j        dz             )a_  
        fetches all open positions for specific symbol, unlike fetchPositions(which is designed to work with multiple symbols) so self method might be preffered for one-market position, because of less rate-limit consumption and speed
        :param str symbol: unified market symbol
        :param dict params: extra parameters specific to the endpoint
        :returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>` with maximum 3 items - possible one position for "one-way" mode, and possible two positions(long & short) for "two-way"(a.k.a. hedge) mode
        z/ fetchPositionsForSymbol() is not supported yetrq  r7  s      r   fetch_positions_for_symbolz#Exchange.fetch_positions_for_symbol  s     47%VVWWWr   c                 0    t          | j        dz             )Nz& fetchPositions() is not supported yetrq  r  s      r   fetch_positionszExchange.fetch_positions  r  r   c                 0    t          | j        dz             )Nz* fetchPositionsRisk() is not supported yetrq  r  s      r   fetch_positions_riskzExchange.fetch_positions_risk  r  r   c                 0    t          | j        dz             )Nz% fetchBidsAsks() is not supported yetrq  r  s      r   fetch_bids_askszExchange.fetch_bids_asks  r  r   c                 0    t          | j        dz             )Nz+ fetchBorrowInterest() is not supported yetrq  )r   rl  r  r  r  ry  s         r   fetch_borrow_interestzExchange.fetch_borrow_interest  r  r   c                 0    t          | j        dz             )Nz# fetchLedger() is not supported yetrq  r   rl  r  r  ry  s        r   fetch_ledgerzExchange.fetch_ledger  r  r   c                 0    t          | j        dz             )Nz( fetchLedgerEntry() is not supported yetrq  )r   r=  rl  ry  s       r   fetch_ledger_entryzExchange.fetch_ledger_entry  r  r   c                     |                      ||          }|                      ||          }|                     ||          }||g}||                    |           |S r   )r  r  rQ  )	r   bidaskr  r  r  rX   rW   	countOrIdbidAsks	            r   r  zExchange.parse_bid_ask  sg      22!!&)44%%fl;;	 MM)$$$r   
currencyIdc                     |||S | j         #|| j         v r| j         |         | j         |         S |}|'|                     |                                          }|                     ||d d          S )N)r=  rl  r  )r  r~  r  r  )r   rF  r  rl  s       r   r  zExchange.safe_currency  s    X%9O!-J$BW4W4W^b^st~^  _L(44!,,Z-=-=-?-?@@D++-
 -
   	r   r  	delimiterc                    |                      ||d          }|S| j        || j        v r| j        |         }t          |          }|dk    r|d         S |'|t          | j        dz   |z   dz             |d         }t          dt          |                    D ]}||         }	|	|         r|	c S n||dk    r|                    |          }
t          |
          }|dk    r|                     |
d          |d	<   |                     |
d          |d
<   |                     |d	                   |d<   |                     |d
                   |d<   |d         dz   |d         z   |d<   |S |S ||S |S )N)r  r  r   r   z- safeMarket() requires a fourth argument for zB to disambiguate between different markets with the same market idr  rQ   r5  r  r  r  r  /r  )	r  r  r	  r   r=  r  r   r  safe_currency_code)r   r  r   rH  rz  rA  r  
numMarketsr   currentMarketr2  partsLengths               r   r  zExchange.safe_market  s   ++ -
 -
   ".XAS5S5S,X6 \\
??"1:%!)!>"3DG>m4mpx4x  |@  5@  #A  #A  A)/J"1c'll33 1 1(/
(4 1#000011 &9?? y11!%jj!##'+'7'7q'A'AF8$(,(8(8(B(BF9%%)%<%<VH=M%N%NF6N&*&=&=fY>O&P&PF7O'-f~';fWo'MF8$!M!MMr   c                     t          | j                                                  }t          dt	          |                    D ]I}||         }| j        |         r2t          | |          s"|rt          | j        dz   |z   dz              dS JdS )z
         * @ignore
        :param boolean error: raise an error that a credential is required if True
        :returns boolean: True if all required credentials have been set, otherwise False or an error is thrown is param error=true
        r   z requires "z" credentialFT)r  requiredCredentialsrK  r  r	  r  r   r=  )r   r  rK  r   r/  s        r   check_required_credentialsz#Exchange.check_required_credentials  s     D,113344q#d))$$ 	! 	!Aq'C', !WT35G5G ! !-dg.E.Kn.\]]] 55tr   c                 r    | j         |                     | j                   S t          | j        dz             )NzB exchange.twofa has not been set for 2FA Two-Factor Authentication)rx   r  r   r=  r>  s    r   oathzExchange.oath
  s4    :!99TZ(((*n nooor   c                 0    t          | j        dz             )Nz$ fetchBalance() is not supported yetrq  r  s     r   fetch_balancezExchange.fetch_balance  r  r   c                 0    t          | j        dz             )Nz& fetchBalanceWs() is not supported yetrq  r  s     r   fetch_balance_wszExchange.fetch_balance_ws  r  r   c                 0    t          | j        dz             )Nz$ parseBalance() is not supported yetrq  )r   r[  s     r   parse_balancezExchange.parse_balance  r  r   c                 0    t          | j        dz             )Nz$ watchBalance() is not supported yetrq  r  s     r   watch_balancezExchange.watch_balance  r  r   c                 <    |                      |          }||         S r   )rU  )r   partry  r  s       r   fetch_partial_balancezExchange.fetch_partial_balance  s    $$V,,t}r   c                 .    |                      d|          S )Nr  r^  r  s     r   fetch_free_balancezExchange.fetch_free_balance       ))&&999r   c                 .    |                      d|          S )Nr  r`  r  s     r   fetch_used_balancezExchange.fetch_used_balance#  rb  r   c                 .    |                      d|          S )Nr  r`  r  s     r   fetch_total_balancezExchange.fetch_total_balance&  s    ))'6:::r   c                 0    t          | j        dz             )Nz# fetchStatus() is not supported yetrq  r  s     r   fetch_statuszExchange.fetch_status)  r  r   c                 x    | j         d         st          | j        dz             |                     |g|          S )NfetchTransactionFeesz+ fetchTransactionFee() is not supported yet)r  r   r=  fetch_transaction_feesrE  s      r   fetch_transaction_feezExchange.fetch_transaction_fee,  sA    x./ 	Xtw)VVWWW**D66:::r   c                 0    t          | j        dz             )Nz, fetchTransactionFees() is not supported yetrq  r  s      r   rk  zExchange.fetch_transaction_fees1  r  r   c                 0    t          | j        dz             )Nz0 fetchDepositWithdrawFees() is not supported yetrq  r  s      r   fetch_deposit_withdraw_feesz$Exchange.fetch_deposit_withdraw_fees4  r  r   c                     | j         d         st          | j        dz             |                     |g|          }|                     ||          S )NfetchDepositWithdrawFeesz/ fetchDepositWithdrawFee() is not supported yet)r  r   r=  rq  r  )r   rl  ry  r  s       r   fetch_deposit_withdraw_feez#Exchange.fetch_deposit_withdraw_fee7  sT    x23 	\tw)ZZ[[[,,dVV<<tT***r   c                 T    ||v r||         S t          | j        dz   |z   dz             )Nr  z! does not have a value in mappingrq  )r   r/  mappings      r   get_supported_mappingzExchange.get_supported_mapping=  s4    '>>3<tw}s25XXYYYr   c                    |                                   | j        d         st          | j        dz             |                     |          }|                     ||          }|t          | j        dz   |z             |S )Nr   z, fetchCrossBorrowRate() is not supported yetzI fetchCrossBorrowRate() could not find the borrow rate for currency code )r  r  r   r=  fetchCrossBorrowRatesr  r   )r   rl  ry  borrowRatesr  s        r   fetch_cross_borrow_ratez Exchange.fetch_cross_borrow_rateC  s    x*+ 	Ytw)WWXXX0088{D11<*u ux| |}}}r   c                    |                                   | j        d         st          | j        dz             |                     |          }|                     ||          }|t          | j        dz   |z             |S )Nr   z/ fetchIsolatedBorrowRate() is not supported yetzL fetchIsolatedBorrowRate() could not find the borrow rate for market symbol )r  r  r   r=  r  r`  r   )r   r  ry  rx  r  s        r   fetch_isolated_borrow_ratez#Exchange.fetch_isolated_borrow_rateM  s    x*+ 	\tw)ZZ[[[66v>>~~k622<*x x  |B  !B  C  C  Cr   
methodName
optionNamec                    d|                      |          z   }|                     |||          }||                     |||g          }nr|                     |d|          \  }}|                     | j        |          }||                     |||          }||                     | j        ||          }||n|}||gS )Nr^  callerMethodName)r   r  r  r  r  r  )r   ry  r|  r}  r<  defaultOptionNamer  exchangeWideMethodOptionss           r   handle_option_and_paramsz!Exchange.handle_option_and_paramsW  s    %
(C(CC!!&*6GHHYYv
4E'FGGFF "&!9!9&BTV`!a!aJ(,j(Q(Q%(4))*CZQbcc}))$,
DUVV#/EElEvr   methodName2c                 P   d|                      |          z   }|                     |||          }||                     |||g          }nY|                     | j        ||          }||                     |||          }||                     | j        ||          }||n|}||gS )Nr^  )r   r  r  r  )	r   ry  r|  r  r}  r<  r  r  r  s	            r   handle_option_and_params_2z#Exchange.handle_option_and_params_2m  s    %
(C(CC!!&*6GHHYYv
4E'FGGFF )-(9(9$,
T_(`(`%(4))*CZQbcc}))$,
DUVV#/EElEvr   c                 <    |                      i |||          \  }}|S r   r  )r   r|  r}  r<  rA  emptys         r   handle_optionzExchange.handle_option  s%    55b*jR^__r   c                 b   |                      | j        ddd          }||}|                     | j        |          }|}|0t          |t                    r|}n|                      |dd|          }||n|d         }|                      |dd|          }	|                     |ddg          }|	|gS )a  
         * @ignore
         * @param methodName the method calling handleMarketTypeAndParams
        :param Market market:
        :param dict params:
        :param str [params.type]: type assigned by user
        :param str [params.defaultType]: same.type
        :param str [defaultValue]: assigned programatically in the method calling handleMarketTypeAndParams
        :returns [str, dict]: the market type and params with type and defaultType omitted
        defaultTyper  r   )r  r  r`  r  rb  r  )
r   r|  r   ry  r<  r  methodOptions
methodTyperz  r  s
             r   handle_market_type_and_paramsz&Exchange.handle_market_type_and_params  s     ((}ffUU&Lt|Z@@!
$--- b*

!//}fV`aa
$*NZZ
!!&-LL6M6#:;;f~r   c                     d }|                      |dd          }||}|                     |ddg          }n9||d         rd}n
|d         rd}| |                     i |d|          }|d         }||gS )Nr  defaultSubTyper  r  r   )r  r  r  )r   r|  r   ry  r<  r  subTypeInParamsrW  s           r   handle_sub_type_and_paramsz#Exchange.handle_sub_type_and_params  s    ,,VY@PQQ&%GYYv	3C'DEEFF !(# (&GGI& ('G66r:yR^__ )  r   c                 2    |                      ||d|          S )a  
         * @ignore
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns Array: the marginMode in lowercase by params["marginMode"], params["defaultMarginMode"] self.options["marginMode"] or self.options["defaultMarginMode"]
        r\  r  )r   r|  ry  r<  s       r   handle_margin_mode_and_paramsz&Exchange.handle_margin_mode_and_params  s     ,,VZ|\\\r   c                 8    |d S ||v r ||         |          d S r   rC  )r   exactr3  rW  s       r   throw_exactly_matched_exceptionz(Exchange.throw_exactly_matched_exception  s0    >FU??%-((( ?r   c                 X    |                      ||          }| ||         |          d S r   )find_broadly_matched_key)r   broadr3  rW  broadKeys        r   throw_broadly_matched_exceptionz(Exchange.throw_broadly_matched_exception  s9    00??!%/'***  r   c                     t          |                                          }t          dt          |                    D ])}||         }||                    |          dk    r|c S *d S r7  )r  rK  r  r	  rx  )r   r  r3  rK  r   r/  s         r   r  z!Exchange.find_broadly_matched_key  sk    EJJLL!!q#d))$$ 	 	Aq'C!;;s##q((JJJtr   c
                     d S r   rC  )
r   
statusCode
statusTextrn  ro  responseHeadersresponseBodyr[  requestHeadersrequestBodys
             r   r  zExchange.handle_errors  s	     tr   c                 0    |                      |dd          S )NrY   r   )r  )r   r  ro  r  ry  r-  s         r   r  z$Exchange.calculate_rate_limiter_cost  s    vvq111r   c                 B   | j         d         r||                                  |                     |          }|d         }|                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr   r  z, fetchTickers() could not find a ticker for z# fetchTicker() is not supported yet)r  r  r   fetch_tickersr`  r   r=  r   )r   r  ry  r   r
  r  s         r   fetch_tickerzExchange.fetch_ticker  s    8N# 	P[[((FH%F((&6::G^^GV44F~"47-[#[^d#deeetw)NNOOOr   c                 0    t          | j        dz             )Nz# watchTicker() is not supported yetrq  r7  s      r   watch_tickerzExchange.watch_ticker  r  r   c                 0    t          | j        dz             )Nz$ fetchTickers() is not supported yetrq  r  s      r   r  zExchange.fetch_tickers  r  r   c                 0    t          | j        dz             )Nz' fetchOrderBooks() is not supported yetrq  r  s       r   fetch_order_bookszExchange.fetch_order_books  rR  r   c                 0    t          | j        dz             )Nz% watchBidsAsks() is not supported yetrq  r  s      r   watch_bids_askszExchange.watch_bids_asks  r  r   c                 0    t          | j        dz             )Nz$ watchTickers() is not supported yetrq  r  s      r   watch_tickerszExchange.watch_tickers  r  r   c                 0    t          | j        dz             )Nz" fetchOrder() is not supported yetrq  r   r=  r  ry  s       r   fetch_orderzExchange.fetch_order  r
  r   c                 0    t          | j        dz             )Nz$ fetchOrderWs() is not supported yetrq  r  s       r   fetch_order_wszExchange.fetch_order_ws  r  r   c                 @    |                      |||          }|d         S )Nr  )r  )r   r=  r  ry  r  s        r   fetch_order_statuszExchange.fetch_order_status  s%       VV44Xr   c                     |                      |                     |d          |                     |d          |          S Nr=  r  )r  r  r   r  ry  s      r   fetch_unified_orderzExchange.fetch_unified_order  =     0 0 = =t?O?OPUW_?`?`bhiiir   c                 0    t          | j        dz             )Nz# createOrder() is not supported yetrq  r   r  r  r!  rW   rX   ry  s          r   r"  zExchange.create_order  r  r   c	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )a  
        create a trailing order by providing the symbol, type, side, amount, price and trailingAmount
        :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 you want to trade in units of the base currency, or number of contracts
        :param float [price]: the price for the order to be filled at, in units of the quote currency, ignored in market orders
        :param float trailingAmount: the quote amount to trail away from the current market price
        :param float [trailingTriggerPrice]: the price to activate a trailing order, default uses the price argument
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nz? createTrailingAmountOrder() requires a trailingAmount argumenttrailingAmounttrailingTriggerPricecreateTrailingAmountOrderz1 createTrailingAmountOrder() is not supported yetr   r=  r  r"  r   )	r   r  r  r!  rW   rX   r  r  ry  s	            r   create_trailing_amount_orderz%Exchange.create_trailing_amount_order	  s     !#DG.o$oppp#1 +-AF)*8/0 	P$$VT4OOO47%XXYYYr   c	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )a  
        create a trailing order by providing the symbol, type, side, amount, price and trailingPercent
        :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 you want to trade in units of the base currency, or number of contracts
        :param float [price]: the price for the order to be filled at, in units of the quote currency, ignored in market orders
        :param float trailingPercent: the percent to trail away from the current market price
        :param float [trailingTriggerPrice]: the price to activate a trailing order, default uses the price argument
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        NzA createTrailingPercentOrder() requires a trailingPercent argumenttrailingPercentr  createTrailingPercentOrderz2 createTrailingPercentOrder() is not supported yetr  )	r   r  r  r!  rW   rX   r  r  ry  s	            r   create_trailing_percent_orderz&Exchange.create_trailing_percent_order  s     "#DG.q$qrrr$3 !+-AF)*801 	P$$VT4OOO47%YYZZZr   rY   c                     | j         d         s| j         d         r'| j         d         r|                     |d||d|          S t          | j        dz             )a  
        create a market order by providing the symbol, side and cost
        :param str symbol: unified symbol of the market to create an order in
        :param str side: 'buy' or 'sell'
        :param float cost: how much you want to trade in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        createMarketOrderWithCostcreateMarketBuyOrderWithCostcreateMarketSellOrderWithCostr   r   z1 createMarketOrderWithCost() is not supported yet)r  r"  r   r=  )r   r  r!  rY   ry  s        r   create_market_order_with_costz&Exchange.create_market_order_with_cost5  ss     8/0 	NTX>\5] 	Nbfbj  lK  cL 	N$$VXtT1fMMM47%XXYYYr   c                     | j         d         s| j        d         r|                     |dd|d|          S t          | j        dz             )a  
        create a market buy order by providing the symbol and cost
        :param str symbol: unified symbol of the market to create an order in
        :param float cost: how much you want to trade in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        !createMarketBuyOrderRequiresPricer  r   r  r   z4 createMarketBuyOrderWithCost() is not supported yetr  r  r"  r   r=  r   r  rY   ry  s       r   !create_market_buy_order_with_costz*Exchange.create_market_buy_order_with_costB  sY     <;< 	OIg@h 	O$$VXudAvNNN47%[[\\\r   c                     | j         d         s| j        d         r|                     |dd|d|          S t          | j        dz             )a  
        create a market sell order by providing the symbol and cost
        :param str symbol: unified symbol of the market to create an order in
        :param float cost: how much you want to trade in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        "createMarketSellOrderRequiresPricer  r   r  r   z5 createMarketSellOrderWithCost() is not supported yetr  r  s       r   "create_market_sell_order_with_costz+Exchange.create_market_sell_order_with_costN  sY     <<= 	PJiAj 	P$$VXvtQOOO47%\\]]]r   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )a  
        create a trigger stop order(type 1)
        :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 you want to trade in units of the base currency or the number of contracts
        :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
        :param float triggerPrice: the price to trigger the stop order, in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nz6 createTriggerOrder() requires a triggerPrice argumentr  createTriggerOrderz* createTriggerOrder() is not supported yetr  )r   r  r  r!  rW   rX   r  ry  s           r   create_trigger_orderzExchange.create_trigger_orderZ  so     #DG.f$fggg!-~8() 	P$$VT4OOO47%QQRRRr   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )a  
        create a trigger stop loss order(type 2)
        :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 you want to trade in units of the base currency or the number of contracts
        :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
        :param float stopLossPrice: the price to trigger the stop loss order, in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nz8 createStopLossOrder() requires a stopLossPrice argumentr  createStopLossOrderz+ createStopLossOrder() is not supported yetr  )r   r  r  r!  rW   rX   r  ry  s           r   create_stop_loss_orderzExchange.create_stop_loss_orderm  so      #DG.h$hiii"/8)* 	P$$VT4OOO47%RRSSSr   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )a  
        create a trigger take profit order(type 2)
        :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 you want to trade in units of the base currency or the number of contracts
        :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
        :param float takeProfitPrice: the price to trigger the take profit order, in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        Nz< createTakeProfitOrder() requires a takeProfitPrice argumentr  createTakeProfitOrderz- createTakeProfitOrder() is not supported yetr  )r   r  r  r!  rW   rX   r  ry  s           r   create_take_profit_orderz!Exchange.create_take_profit_order  sp     "#DG.l$lmmm$3 !8+, 	P$$VT4OOO47%TTUUUr   
takeProfitstopLossc	                    ||t          | j        dz             |d|i|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<   |                     |g d          }| j        d         r|                     ||||||          S t          | j        dz             )a  
        create an order with a stop loss or take profit attached(type 3)
        :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 you want to trade in units of the base currency or the number of contracts
        :param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
        :param float [takeProfit]: the take profit price, in units of the quote currency
        :param float [stopLoss]: the stop loss price, in units of the quote currency
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :param str [params.takeProfitType]: *not available on all exchanges* 'limit' or 'market'
        :param str [params.stopLossType]: *not available on all exchanges* 'limit' or 'market'
        :param str [params.takeProfitPriceType]: *not available on all exchanges* 'last', 'mark' or 'index'
        :param str [params.stopLossPriceType]: *not available on all exchanges* 'last', 'mark' or 'index'
        :param float [params.takeProfitLimitPrice]: *not available on all exchanges* limit price for a limit take profit order
        :param float [params.stopLossLimitPrice]: *not available on all exchanges* stop loss for a limit stop loss order
        :param float [params.takeProfitAmount]: *not available on all exchanges* the amount for a take profit
        :param float [params.stopLossAmount]: *not available on all exchanges* the amount for a stop loss
        :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
        NzY createOrderWithTakeProfitAndStopLoss() requires either a takeProfit or stopLoss argumentr  r  r  takeProfitTypetakeProfitPriceTypetakeProfitLimitPricetakeProfitAmountstopLossTypestopLossPriceTypestopLossLimitPricestopLossAmountr  	priceTyperX   rW   )r  r  r  r  r  r  r  r  $createOrderWithTakeProfitAndStopLossz< createOrderWithTakeProfitAndStopLoss() is not supported yet)r   r=  r  rq  r  r  r"  r   )r   r  r  r!  rW   rX   r  r  ry  r  r  r  r  r  r  r  r  s                    r   +create_order_with_take_profit_and_stop_lossz4Exchange.create_order_with_take_profit_and_stop_loss  sk   * X%5#DG  /J  %J  K  K  K!
$F<  "F: ))&2BCC"..v7LMM#//8NOO++F4FGG''?? ,,V5HII!--f6JKK))&2BCC%+9F< (*0CF< -+,0,A,ABV,W,WF< )'-1-B-BCS-T-TF< *#)5F:v&(.?F:{+)*.*?*?@R*S*SF:w'%+/+@+@+P+PF:x(6  $F  $F  $F  G  G8:; 	P$$VT4OOO47%ccdddr   c                 0    t          | j        dz             )Nz$ createOrders() is not supported yetrq  )r   r  ry  s      r   create_orderszExchange.create_orders  r  r   c                 0    t          | j        dz             )Nz% createOrderWs() is not supported yetrq  r  s          r   create_order_wszExchange.create_order_ws  r  r   c                 0    t          | j        dz             )Nz# cancelOrder() is not supported yetrq  r  s       r   cancel_orderzExchange.cancel_order  r  r   c                 0    t          | j        dz             )Nz% cancelOrderWs() is not supported yetrq  r  s       r   cancel_order_wszExchange.cancel_order_ws  r  r   r  c                 0    t          | j        dz             )Nz& cancelOrdersWs() is not supported yetrq  )r   r  r  ry  s       r   cancel_orders_wszExchange.cancel_orders_ws  r  r   c                 0    t          | j        dz             )Nz' cancelAllOrders() is not supported yetrq  r7  s      r   cancel_all_orderszExchange.cancel_all_orders  rR  r   c                 0    t          | j        dz             )Nz) cancelAllOrdersWs() is not supported yetrq  r7  s      r   cancel_all_orders_wszExchange.cancel_all_orders_ws  r/  r   c                     |                      |                     |d          |                     |d          |          S r  )r   r  r  s      r   cancel_unified_orderzExchange.cancel_unified_order  r  r   c                     | j         d         r$| j         d         rt          | j        dz             t          | j        dz             )Nr   r   ze fetchOrders() is not supported yet, consider using fetchOpenOrders() and fetchClosedOrders() insteadz# fetchOrders() is not supported yetrK  r  s        r   fetch_orderszExchange.fetch_orders  s^    8%& 	R484G+H 	Rtw  *Q   Q  R  R  R47%JJKKKr   c                 0    t          | j        dz             )Nz% fetchOrdersWs() is not supported yetrq  r  s        r   fetch_orders_wszExchange.fetch_orders_ws  r  r   c                 0    t          | j        dz             )Nz( fetchOrderTrades() is not supported yetrq  )r   r=  r  r  r  ry  s         r   fetch_order_tradeszExchange.fetch_order_trades  r  r   c                 0    t          | j        dz             )Nz# watchOrders() is not supported yetrq  r  s        r   watch_orderszExchange.watch_orders  r  r   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr   r  r+  z' fetchOpenOrders() is not supported yetr  r  rJ  r   r=  r   r  r  r  ry  r  s         r   fetch_open_orderszExchange.fetch_open_orders  sV    8M" 	<&&vueVDDF>>&(F;;;47%NNOOOr   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )NfetchOrdersWsr  r+  z) fetchOpenOrdersWs() is not supported yetr  r  rJ  r   r=  r  s         r   fetch_open_orders_wszExchange.fetch_open_orders_ws  sV    8O$ 	<''ufEEF>>&(F;;;47%PPQQQr   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr   r  r  z) fetchClosedOrders() is not supported yetr  r  s         r   fetch_closed_orderszExchange.fetch_closed_orders  sV    8M" 	>&&vueVDDF>>&(H===47%PPQQQr   c                 0    t          | j        dz             )Nz4 fetchCanceledAndClosedOrders() is not supported yetrq  r  s        r    fetch_canceled_and_closed_ordersz)Exchange.fetch_canceled_and_closed_orders  s    47%[[\\\r   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr  r  r  z+ fetchClosedOrdersWs() is not supported yetr  r  s         r   fetch_closed_orders_wszExchange.fetch_closed_orders_ws
  sV    8O$ 	>''ufEEF>>&(H===47%RRSSSr   c                 0    t          | j        dz             )Nz% fetchMyTrades() is not supported yetrq  r  s        r   fetch_my_tradeszExchange.fetch_my_trades  r  r   c                 0    t          | j        dz             )Nz+ fetchMyLiquidations() is not supported yetrq  r  s        r   fetch_my_liquidationszExchange.fetch_my_liquidations  r  r   c                 0    t          | j        dz             )Nz) fetchLiquidations() is not supported yetrq  r  s        r   fetch_liquidationszExchange.fetch_liquidations  r/  r   c                 0    t          | j        dz             )Nz' fetchMyTradesWs() is not supported yetrq  r  s        r   fetch_my_trades_wszExchange.fetch_my_trades_ws  rR  r   c                 0    t          | j        dz             )Nz% watchMyTrades() is not supported yetrq  r  s        r   watch_my_tradeszExchange.watch_my_trades  r  r   c                 0    t          | j        dz             )Nz# fetchGreeks() is not supported yetrq  r7  s      r   fetch_greekszExchange.fetch_greeks  r  r   c                 0    t          | j        dz             )Nz( fetchOptionChain() is not supported yetrq  rE  s      r   fetch_option_chainzExchange.fetch_option_chain"  r  r   c                 0    t          | j        dz             )Nz# fetchOption() is not supported yetrq  r7  s      r   fetch_optionzExchange.fetch_option%  r  r   fromCodetoCodec                 0    t          | j        dz             )Nz) fetchConvertQuote() is not supported yetrq  )r   r$  r%  rW   ry  s        r   fetch_convert_quotezExchange.fetch_convert_quote(  r/  r   c                 0    t          | j        dz             )a%  
        fetch history of deposits and withdrawals
        :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
        :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
        :param int [limit]: max number of deposit/withdrawals to return, default is None
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
        z0 fetchDepositsWithdrawals() is not supported yetrq  r>  s        r   fetch_deposits_withdrawalsz#Exchange.fetch_deposits_withdrawals+  s     47%WWXXXr   c                 0    t          | j        dz             )Nz% fetchDeposits() is not supported yetrq  r  s        r   fetch_depositszExchange.fetch_deposits6  r  r   c                 0    t          | j        dz             )Nz( fetchWithdrawals() is not supported yetrq  r  s        r   fetch_withdrawalszExchange.fetch_withdrawals9  r  r   c                 0    t          | j        dz             )Nz' fetchDepositsWs() is not supported yetrq  r>  s        r   fetch_deposits_wszExchange.fetch_deposits_ws<  rR  r   c                 0    t          | j        dz             )Nz* fetchWithdrawalsWs() is not supported yetrq  r>  s        r   fetch_withdrawals_wszExchange.fetch_withdrawals_ws?  r  r   c                 0    t          | j        dz             )Nz/ fetchFundingRateHistory() is not supported yetrq  r  s        r   fetch_funding_rate_historyz#Exchange.fetch_funding_rate_historyB  r  r   c                 0    t          | j        dz             )Nz+ fetchFundingHistory() is not supported yetrq  r  s        r   fetch_funding_historyzExchange.fetch_funding_historyE  r  r   c                 0    t          | j        dz             )Nz% closePosition() is not supported yetrq  )r   r  r!  ry  s       r   close_positionzExchange.close_positionH  r  r   c                 0    t          | j        dz             )Nz) closeAllPositions() is not supported yetrq  r  s     r   close_all_positionszExchange.close_all_positionsK  r/  r   c                 0    t          | j        dz             )Nz( fetchL3OrderBook() is not supported yet)r   r=  r  s       r   fetch_l3_order_bookzExchange.fetch_l3_order_bookN  s    #MMNNNr   c                 0    t          | j        dz             )Nz& parseLastPrice() is not supported yetrq  )r   rX   r   s      r   parse_last_pricezExchange.parse_last_priceQ  r  r   c                 N   | j         d         rN|                     |g|          }|                     ||          }|t          | j        dz   |z   dz             |S | j         d         r|                     |d          }|                     |d          }|                     ||          }||                     ||          S t          |
                                          }|                     |d          }|                     ||          S t          | j        dz             )Nr   z< fetchDepositAddress() could not find a deposit address for zc, make sure you have created a corresponding deposit address in your wallet on the exchange websiter   r  r   z+ fetchDepositAddress() is not supported yet)r  r   r  r   r=  r  r  r   r`  r  rK  r   )	r   rl  ry  depositAddressesr  r  addressStructuresrK  r/  s	            r   fetch_deposit_addresszExchange.fetch_deposit_addressT  sA   8+, 	X#994&&II!__-=tDDN%$TW/m%mpt%t  x]  &]  ^  ^  ^%%X67 	X&&vy99GYYvy11F $ C CD& Q Q"~~&7AAA-224455&&tQ//~~&7===tw)VVWWWr   c                     d d d dS )N)r  r  r  rC  r>  s    r   r2   zExchange.accounti  s    
 
 	
r   c                 L    | j         s|S |                     | j        ||          S r   )substituteCommonCurrencyCodesr  commonCurrenciesr   rl  s     r   r~  zExchange.common_currency_codep  s-    1 	K 5tTBBBr   c                     | j         t          | j        dz             t          |t                    r,|| j         v r| j         |         S || j        v r| j        |         S t          | j        dz   |z             )Nz currencies not loadedz does not have currency code )r  r   r=  r  rb  r  rF  s     r   r  zExchange.currencyu  s    ?"*B BCCCdC   	3t&&t,,...,T22DG&EELMMMr   c                 N   | j         t          | j        dz             || j         v r| j         |         S || j        v rf| j        |         }|                     | j        ddd          }t          dt          |                    D ]}||         }||         r|c S |d         S |                    d          s?|                    d          s*|	                    d          s|	                    d	          r| 
                    |          S t          | j        d
z   |z             )Nz markets not loadedr  r  r   r   z-Cz-PzC-zP-z does not have market symbol )r  r   r=  r  r  r  r  r	  endswithr  createExpiredOptionMarketr   )r   r  r  r  r   r   s         r   r   zExchange.market  sB   <*? ?@@@T\!!<''t)))(0G,,T\=JZ\bccK1c'll++ " " +& "!MMM"1:ood## 	:)>)> 	:FDUDUVZD[D[ 	:agararswaxax 	:11&999"AAFJKKKr   c                 0    t          | j        dz             )Nz1 createExpiredOptionMarket() is not supported yetrq  )r   r  s     r   create_expired_option_marketz%Exchange.create_expired_option_market  s    47%XXYYYr   c                     |-t          |t                    r|                     ||          }d }|.|                     |d          }||                     |d          }||gS )NrC  )r  r  r$  r  r  )r   rC  ry  s      r   handle_withdraw_tag_and_paramsz'Exchange.handle_withdraw_tag_and_params  si    O*S$"7"7O[[f--FC;""6511C6511V}r   c                 6    |                      |d||||          S r  r"  r   r  r!  rW   rX   ry  s         r   create_limit_orderzExchange.create_limit_order  s       $vNNNr   c                 6    |                      |d||||          S )Nr   rP  rQ  s         r   create_market_orderzExchange.create_market_order  s       4OOOr   c                 6    |                      |dd|||          S )Nr  r  rP  r   r  rW   rX   ry  s        r   create_limit_buy_orderzExchange.create_limit_buy_order  s       %OOOr   c                 6    |                      |dd|||          S )Nr  r  rP  rV  s        r   create_limit_sell_orderz Exchange.create_limit_sell_order  s       &&%PPPr   c                 6    |                      |dd|d |          S )Nr   r  rP  rT  s       r   create_market_buy_orderz Exchange.create_market_buy_order  s       5&$OOOr   c                 6    |                      |dd|d |          S )Nr   r  rP  rT  s       r   create_market_sell_orderz!Exchange.create_market_sell_order  s       664PPPr   c                     |                      |          }|                     |t          |d         d         | j        | j                  S Nr  rX   )r   r   r   r  paddingMode)r   r  rY   r   s       r   cost_to_precisionzExchange.cost_to_precision  sA    V$$((x9LW9UW[Wikok{|||r   c                 .   |                      |          }|                     |t          |d         d         | j        | j                  }|dk    rEt          | j        dz   |d         z   dz   |                     |d         d                   z             |S )Nr  rX   r  z
 price of r  z1 must be greater than minimum price precision of )r   r   r   r  r`  r   r=  r   )r   r  rX   r   rA  s        r   price_to_precisionzExchange.price_to_precision  s    V$$**5%9LW9UW[Wikok{||S==tw5x8HHK~~  BF  BW  BW  X^  _j  Xk  ls  Xt  Bu  Bu   u  v  v  vr   c                 .   |                      |          }|                     |t          |d         d         | j        | j                  }|dk    rEt          | j        dz   |d         z   dz   |                     |d         d                   z             |S )Nr  rW   r  z amount of r  z2 must be greater than minimum amount precision of )r   r   r   r  r`  r   r=  r   )r   r  rW   r   rA  s        r   amount_to_precisionzExchange.amount_to_precision  s    V$$**68VK=PQY=Z\`\npt  qA  B  BS==tw69II  MA   A  DH  DY  DY  Z`  al  Zm  nv  Zw  Dx  Dx   x  y  y  yr   c                     |                      |          }|                     |t          |d         d         | j        | j                  S r_  )r   r   r   r  r`  )r   r  r  r   s       r   fee_to_precisionzExchange.fee_to_precision  sA    V$$((eVK5H5QSWSegkgwxxxr   c                 T   | j         |         }|                     |d          }|E|                     |di           }|                     ||i           }|                     |d|          }||                     |          S |                     |t
          || j        | j                  S )Nr  rx  )r  r  r`  forceStringr   r   r  r`  )r   rl  r  r  r  r  rx  networkItems           r   currency_to_precisionzExchange.currency_to_precision  s    ?4(OOHk::	"~~h
B??H..;CCK[)LLI##C(((,,S%DDVX\Xhiiir   c                 Z    t          |t                    s|                     |          S |S r   )r  rb  r   r0  s     r   force_stringzExchange.force_string  s-    %%% 	0((///r   c                 "    | j         t          k    S r   )r  r   r>  s    r   is_tick_precisionzExchange.is_tick_precision  s    !Y..r   c                 "    | j         t          k    S r   )r  r   r>  s    r   is_decimal_precisionzExchange.is_decimal_precision  s    !^33r   c                 "    | j         t          k    S r   )r  r   r>  s    r   is_significant_precisionz!Exchange.is_significant_precision  s    !%777r   r-  defaultNumberc                 Z    |                      ||          }|                     ||          S r   )r  r  )r   r-  r/  rt  r  s        r   r  zExchange.safe_number  s-      c**  666r   arrc                 Z    |                      ||          }|                     ||          S r   )r  r  )r   r-  rv  rt  r  s        r   safe_number_nzExchange.safe_number_n  s-    ""3,,  666r   r  c                 |    |dS t          |          }|dk    rdS d}t          d|dz
            D ]}|dz   }|dz   S )z
         * @ignore
        :param str precision: The number of digits to the right of the decimal
        :returns str: a string number equal to 1e-precision
        Nr   r  z0.r   r  )r  r  )r   r  precisionNumberparsedPrecisionr   s        r   parse_precisionzExchange.parse_precision  sd     4i..a3q/A-.. 	4 	4A-3OO$$r   c                     |dS t          j        |d          r|                     |          S t          j        |          }t	          |          }d}t          d|dz
            D ]}|dz   }|dz   S )a#  
         * @ignore
        handles positive & negative numbers too. parsePrecision() does not handle negative numbers, but self method handles
        :param str precision: The number of digits to the right of the decimal
        :returns str: a string number equal to 1e-precision
        Nr  r  r   r   )r   	string_ger|  
string_absr  r  )r   r  positivePrecisionStringpositivePrecisionr{  r   s         r   integer_precision_to_amountz$Exchange.integer_precision_to_amount  s     4Y,, 	)''	222&-&8&C&C# #$; < <!O1/!344 8 8"1C"7"S((r   c                     |                      |          }|                                 }||z
  | j        d<   | j        d         S )NtimeDifference)r  rF  r  )r   ry  
serverTimer  s       r   load_time_differencezExchange.load_time_difference
  sD    __V,,
!!##).);%&|,--r   c                 <    |                      |d| j        i          S )Nhostname)rz  r  )r   rn  s     r   implode_hostnamezExchange.implode_hostname  s    ""3T](CDDDr   c                 
   | j         d         r`|                     |          }|d         st          | j        dz             |                     |g          }|                     ||          S t          | j        dz             )Nr   r  z: fetchMarketLeverageTiers() supports contract markets onlyz0 fetchMarketLeverageTiers() is not supported yet)r  r   r   r=  r!  r  r   )r   r  ry  r   r  s        r   fetch_market_leverage_tiersz$Exchange.fetch_market_leverage_tiers  s    8() 	][[((F*% h*f fggg--vh77E??5&111tw)[[\\\r   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr   z*createPostOnlyOrder() is not supported yetr  Tr  r   r=  r$  r"  r   r  r  r!  rW   rX   ry  querys           r   create_post_only_orderzExchange.create_post_only_order  s_    x-. 	Wtw)UUVVVFZ$677  tVUEJJJr   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr   z,createReduceOnlyOrder() is not supported yetr  Tr  r  s           r   create_reduce_only_orderz!Exchange.create_reduce_only_order#  s_    x/0 	Ytw)WWXXXF\4$899  tVUEJJJr   r  c                     | j         d         st          | j        dz             |t          | j        dz             |                     |d|i          }|                     ||||||          S )Nr   z' createStopOrder() is not supported yetz2 create_stop_order() requires a stopPrice argumentr  )r  r   r=  r   r$  r"  )	r   r  r  r!  rW   rX   r  ry  r  s	            r   create_stop_orderzExchange.create_stop_order)  s{    x)* 	Ttw)RRSSS#DG.b$bcccF[)$<==  tVUEJJJr   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||||          S )Nr   z, createStopLimitOrder() is not supported yetr  r  r  )r   r  r!  rW   rX   r  ry  r  s           r   create_stop_limit_orderz Exchange.create_stop_limit_order1  s_    x./ 	Ytw)WWXXXF[)$<==  $uMMMr   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||d |          S )Nr   z- createStopMarketOrder() is not supported yetr  r   r  )r   r  r!  rW   r  ry  r  s          r   create_stop_market_orderz!Exchange.create_stop_market_order7  s_    x/0 	Ztw)XXYYYF[)$<==  4uMMMr   c                 >    |                      ||          }|d         S )Nrl  )r  )r   rF  r  s      r   rK  zExchange.safe_currency_code=  s"    %%j(;;r   c           	      8    |                      |d|||d|          S )Nr  r  r  )r   rI  r  r  r  r  s         r   r  z%Exchange.filter_by_symbol_since_limitA  s%    //xPUWbdhiiir   c           	      8    |                      |d|||d|          S )Nr  r  r  )r   rI  rl  r  r  r  s         r   r  z'Exchange.filter_by_currency_since_limitD  s%    //z4PUWbdhiiir   c                 d    |                      |d|d          }|                     |||d|          S )Nr  Fr  )r  r  )r   rI  r  r  r  r  rA  s          r   filter_by_symbols_since_limitz&Exchange.filter_by_symbols_since_limitG  s7    %%eXwFF))&%TRRRr   c                    g }t          |t                    ret          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           Gnt          |                                          }t          dt          |                    D ]d}||         }|                     |          }	|                     |                     ||         |	          |          }|                    |           e| 	                    |          }| 
                    |d|          S r  )r  r  r  r	  r$  parseLastPricerQ  rK  r  r|  r  )
r   
pricesDatar  ry  r  r   	priceData	marketIdsr  r   s
             r   parse_last_priceszExchange.parse_last_pricesK  s7   ( j$'' 
	*1c*oo.. * * KK(;(;JqM(J(JFSS	y))))* Z__..//I1c)nn-- * *$Q<))(33 KK(;(;Jx<PRX(Y(Y[abb	y))))%%g..##GXw???r   c                    g }t          |t                    ret          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           Gnt          |                                          }t          dt          |                    D ]d}||         }|                     |          }	|                     |                     ||         |	          |          }|                    |           e| 	                    |          }| 
                    |d|          S r  )r  r  r  r	  r$  r   rQ  rK  r  r|  r  )
r   r
  r  ry  r  r   r  r  r  r   s
             r   parse_tickerszExchange.parse_tickersn  s4   , gt$$ 
	'1c'll++ ' 'T%6%6wqz%B%BFKKv&&&&' W\\^^,,I1c)nn-- ' '$Q<))(33T%6%6wx7H&%Q%QSYZZv&&&&%%g..##GXw???r   c                 6   g }t          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           G||                     |d|d          }|r|                     |d          S |S )Nr   r  F)r  r	  r$  r  rQ  r  r[  )r   	addressesr  r  ry  rA  r   r  s           r   parse_deposit_addressesz Exchange.parse_deposit_addresses  s    q#i..)) 	# 	#Akk$"<"<Yq\"J"JFSSGMM'""""))&*eUKKF 	5==444r   c                     g }t          dt          |                    D ]3}||         }|                    |                     ||                     4|S r7  )r  r	  rQ  r(  )r   r[  r   	interestsr   rows         r   parse_borrow_interestszExchange.parse_borrow_interests  s^    	q#h--(( 	F 	FA1+CT77VDDEEEEr   c                    g }t          dt          |                    D ]3}||         }|                    |                     ||                     4|                     |d          }|d n|d         }	|                     ||	||          S Nr   r  r  )r  r	  rQ  r&  rc  r  )
r   r[  r   r  r  ratesr   rO  r<  r  s
             r   parse_funding_rate_historiesz%Exchange.parse_funding_rate_histories  s    q#h--(( 	I 	IAQKELL88GGHHHHe[11 .vh/?00NNNr   c                 B    |                      ||||          }|d         S r  )r  )r   r  r   rH  rz  s        r   safe_symbolzExchange.safe_symbol  s&    !!(FIzJJhr   r  c                 0    t          | j        dz             )Nz( parseFundingRate() is not supported yetrq  )r   r  r   s      r   parse_funding_ratezExchange.parse_funding_rate  r  r   c                     i }t          dt          |                    D ])}|                     ||         |          }|||d         <   *|S r  )r  r	  r  )r   r[  r   rA  r   parseds         r   parse_funding_rateszExchange.parse_funding_rates  sV    q#h--(( 	. 	.A,,Xa[&AAF'-F6(#$$r   c                 l    |                      |dd          }|r|                     |ddg          }||gS )Ntriggerstop)rT  r  )r   ry  	isTriggers      r   is_trigger_orderzExchange.is_trigger_order  sD    $$VY??	 	<YYv	6':;;F6""r   isMarketOrderc                    |                      |d          }|                     |ddd          }|dk    }|dk    }|dk    }|p|p|}|r9|s|rt          | j        dz   |z             |rt          | j        d	z             d
S dS )a  
         * @ignore
        :param str type: Order type
        :param boolean exchangeSpecificParam: exchange specific postOnly
        :param dict [params]: exchange specific params
        :returns boolean: True if a post only order, False otherwise
        r  r  	post_onlyFr  FOKr  2 postOnly orders cannot have timeInForce equal to ! market orders cannot be postOnlyT)r  rT  r   r=  )	r   r  exchangeSpecificParamry  r  r  iocfoktimeInForcePostOnlys	            r   is_post_onlyzExchange.is_post_only  s     ,,V]CC##FJUKKU"U")T1K2K6K 	 c "47-a#ado#oppp "47-P#PQQQt5r   exchangeSpecificPostOnlyOptionc                 j   |                      |d          }|                     |dd          }|dk    }|dk    }|dk    }|p|p|}|ri|s|rt          | j        dz   |z             |rt          | j        dz             |r|                     |d          }|                     |d          }d	|gS d|gS )
z
         * @ignore
        :param str type: Order type
        :param boolean exchangeSpecificBoolean: exchange specific postOnly
        :param dict [params]: exchange specific params
        :returns Array:
        r  r  Fr  r  r  r  r  T)r  rX  r   r=  r  )	r   r  r  ry  r  r  r  r  pos	            r   handle_post_onlyzExchange.handle_post_only  s     ,,V]CC>>&*e<<U"U"D CrC%C 		& &c &"47-a#ado#oppp &"47-P#PQQQ >!YYv}==F6:66f~%vr   c                 0    t          | j        dz             )Nz' fetchLastPrices() is not supported yetrq  r  s      r   fetch_last_priceszExchange.fetch_last_prices  rR  r   c                 0    t          | j        dz             )Nz( fetchTradingFees() is not supported yetrq  r  s     r   r  zExchange.fetch_trading_fees  r  r   c                 0    t          | j        dz             )Nz* fetchTradingFeesWs() is not supported yetrq  r  s     r   fetch_trading_fees_wszExchange.fetch_trading_fees_ws  r  r   c                     | j         d         st          | j        dz             |                     |          }|                     ||          S )Nr   z' fetchTradingFee() is not supported yet)r  r   r=  r  r`  )r   r  ry  r  s       r   fetch_trading_feezExchange.fetch_trading_fee  sP    x*+ 	Ttw)RRSSS&&v..~~dF+++r   c                 0    t          | j        dz             )Nz. fetchConvertCurrencies() is not supported yetrq  r  s     r   fetch_convert_currenciesz!Exchange.fetch_convert_currencies  s    47%UUVVVr   c                 0    t          | j        dz             )Nz) parseOpenInterest() is not supported yetrq  r   interestr   s      r   parse_open_interestzExchange.parse_open_interest  r/  r   c                 4   g }t          dt          |                    D ]5}||         }|                     ||          }|                    |           6|                     |d          }	|                     |d          }
|                     |	|
||          S r  )r  r	  r  rQ  rc  r  r  )r   r[  r   r  r  r  r   rO  r  r<  r  s              r   parse_open_interestszExchange.parse_open_interests
  s    	q#h--(( 	' 	'AQKE//v>>HX&&&&i55!!&(3300NNNr   c                    | j         d         r|                                  |                     |          }|d         }|d         st          | j        dz             |                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr   r  r  z2 fetchFundingRate() supports contract markets onlyz) fetchFundingRate() returned no data for z( fetchFundingRate() is not supported yet)	r  r  r   r   r=  r   r  r   r   )r   r  ry  r   r  r  s         r   fetch_funding_ratezExchange.fetch_funding_rate  s    8'( 	U[[((FH%F*% `*^ ^___**F8V<<E??5&11D|"47-X#X[a#abbbtw)SSTTTr   c           
          | j         d         r1ddi}|                     |||||                     ||                    S t          | j        dz             )aL  
        fetches historical mark price candlestick data containing the open, high, low, and close price 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 float[][]: A list of candles ordered, open, high, low, close, None
        r   rX   markz& fetchMarkOHLCV() is not supported yetr  rM  r$  r   r=  r   r  r  r  r  ry  r  s          r   fetch_mark_ohlcvzExchange.fetch_mark_ohlcv$  se     8$% 	SG ##FIueT[[QXZ`EaEabbbtw)QQRRRr   c           
          | j         d         r1ddi}|                     |||||                     ||                    S t          | j        dz             )aH  
        fetches historical index price candlestick data containing the open, high, low, and close price 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 {} A list of candles ordered, open, high, low, close, None
        r   rX   r  z' fetchIndexOHLCV() is not supported yetr  r  s          r   fetch_index_ohlcvzExchange.fetch_index_ohlcv6  se     8%& 	TG ##FIueT[[QXZ`EaEabbbtw)RRSSSr   c           
          | j         d         r1ddi}|                     |||||                     ||                    S t          | j        dz             )aU  
        fetches historical premium index price candlestick data containing the open, high, low, and close price 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 float[][]: A list of candles ordered, open, high, low, close, None
        r   rX   premiumIndexz. fetchPremiumIndexOHLCV() is not supported yetr  r  s          r   fetch_premium_index_ohlcvz"Exchange.fetch_premium_index_ohlcvH  se     8,- 	[G ##FIueT[[QXZ`EaEabbbtw)YYZZZr   c                     |                      |d          }|B|                     | j        d         |          }|t          | j        dz   |z   dz             |S dS )z
         * @ignore
         * Must add timeInForce to self.options to use self method
        :returns str: returns the exchange specific value for timeInForce
        r  Nz does not support timeInForce "r  )r  r  r  r   r=  )r   ry  r  exchangeValues       r   handle_time_in_forcezExchange.handle_time_in_forceZ  sn     ,,V]CC" ,,T\--H+VVM$#DG.O$OR]$]`c$cddd  tr   c                     |                      | j        di           } |j                    }||v r||         S || j        v s	|| j        v r|                     |          }|d         S |S )a  
         * @ignore
         * Must add accountsByType to self.options to use self method
        :param str account: key for account name in self.options['accountsByType']
        :returns: the exchange specific account name or the isolated margin id for transfers
        accountsByTyper=  )r`  r  r  r  r  r   )r   r2   r  lowercaseAccountr   s        r   convert_type_to_accountz Exchange.convert_type_to_accounth  s{     6FKK(7=??~--!"233%%7d6H+H+H[[))F$<Nr   c                     t          |          }||dk    ra|                     ||          sMd                    |          }| j        dz   |z   dz   |z   dz   }|dk    r|d|z   d	z   z  }t	          |          dS dS )
ay  
         * @ignore
        :param str methodName: the name of the method that the argument is being checked for
        :param str argument: the argument's actual value provided
        :param str argumentName: the name of the argument being checked(for logging purposes)
        :param str[] options: a list of options that the argument can be
        :returns None:
        Nr   r  r  z() requires a z	 argumentrQ   z
, one of ())r	  rn  r!  r=  r   )r   r|  argumentargumentNamer  optionsLengthmessageOptionsrW  s           r   r  z Exchange.check_required_argumenty  s     G=1#4#4t}}XW^?_?_#4!YYw//Ngmj03CClRU``G##,~=CC#G,,, $5#4#4#4r   c                     |dk    r|t          | j        dz   |z   dz             |dk    r|t          | j        dz   |z   dz             dS dS )z
         * @ignore
        :param str symbol: unified symbol of the market
        :param str methodName: name of the method that requires a symbol
        :param str marginMode: is either 'isolated' or 'cross'
        isolatedNr  z1() requires a symbol argument for isolated margincrossz1() cannot have a symbol argument for cross margin)r   r=  )r   r|  r  r\  s       r   check_required_margin_argumentz'Exchange.check_required_margin_argument  so     *$$6>#DGcMJ$>At$tuuuG##&*<#DGcMJ$>At$tuuu $#*<*<r   c                    i }t          |t                    }|}|s!t          |                                          }t          dt	          |                    D ]}||         }|r|n||         }	|r|                     |	|          n|}
|                     |
          }|                     |d          }||                     ||          r|                     |	|          ||<   |S )a  
         * @ignore
        :param object[]|dict response: unparsed response from the exchange
        :param str[]|None codes: the unified currency codes to fetch transactions fees for, returns all currencies when None
        :param str currencyIdKey: *should only be None when response is a dictionary* the object key that corresponds to the currency id
        :returns dict: objects with withdraw and deposit fees, indexed by currency codes
        r   rl  )	r  r  rK  r  r	  r  r  rn  parseDepositWithdrawFee)r   r[  r  currencyIdKeydepositWithdrawFeesr  responseKeysr   rO  r  rF  r  rl  s                r   parse_deposit_withdraw_feesz$Exchange.parse_deposit_withdraw_fees  s     !Xt,, 	100Lq#l++,, 	_ 	_A OE")>xJHOZ))*mDDDUZJ))*55H##Hf55D4==u#=#=,0,H,HU],^,^#D)""r   c                 0    t          | j        dz             )Nz/ parseDepositWithdrawFee() is not supported yetrq  )r   r  r  s      r   parse_deposit_withdraw_feez#Exchange.parse_deposit_withdraw_fee  r  r   c                     |d d dd d di dS )N)r  rG   )rS  rH   rI   rx  rC  )r   rS  s     r   deposit_withdraw_feezExchange.deposit_withdraw_fee  s;    " 
 "  
 
 	
r   c                    t          |d                                                   }t          |          }|dk    r<|d         |d                  d         |d<   |d         |d                  d         |d<   |S |                     |d          }t	          d|          D ]J}||         }||k    r:|d         ||                  d         |d<   |d         ||                  d         |d<   K|S )aI  
         * @ignore
        Takes a depositWithdrawFee structure and assigns the default values for withdraw and deposit
        :param dict fee: A deposit withdraw fee structure
        :param dict currency: A currency structure, the response from self.currency()
        :returns dict: A deposit withdraw fee structure
        rx  r   r   rH   rI   rl  )r  rK  r	  r  r  )r   r  r  networkKeysnumNetworksr  r   r  s           r   $assign_default_deposit_withdraw_feesz-Exchange.assign_default_deposit_withdraw_fees  s     3z?//1122+&&!!*ok!n=jIC
O _[^<YGC	NJ''&99q+&& 	L 	LA!!nG,&&"%j/+a."A*"MJ!$ZQ!@!KI
r   c                 0    t          | j        dz             )Nz# parseIncome() is not supported yetrq  r  s      r   parse_incomezExchange.parse_income  r  r   c                    g }t          dt          |                    D ]5}||         }|                     ||          }|                    |           6|                     |d          }	|                     |	||          S )a  
         * @ignore
        parses funding fee info from exchange response
        :param dict[] incomes: each item describes once instance of currency being received or paid
        :param dict market: ccxt market
        :param int [since]: when defined, the response items are filtered to only include items after self timestamp
        :param int [limit]: limits the number of items in the response
        :returns dict[]: an array of `funding history structures <https://docs.ccxt.com/#/?id=funding-history-structure>`
        r   r  )r  r	  r	  rQ  rc  r  )
r   incomesr   r  r  rA  r   rO  r  r<  s
             r   parse_incomeszExchange.parse_incomes  s     q#g,,'' 	" 	"AAJE&&uf55FMM&!!!!fk22))&%???r   c                 d    |d S |                      |d          }|                     |          }|S r7  )r  r   )r   r  firstMarketr   s       r   get_market_from_symbolsz Exchange.get_market_from_symbols  s7    ?4&&w22[))r   c                     g }t          dt          |                    D ]1}|                    |                     ||         |                     2|S r7  )r  r	  rQ  r3  )r   r  r   r  r  r  r  r   s           r   parse_ws_ohlcvszExchange.parse_ws_ohlcvs  sV    q#f++&& 	C 	CANN4..vay&AABBBBr   c                 z    | j         d         r|                     ||||          S t          | j        dz             )aB  
         * @deprecated
        *DEPRECATED* use fetchDepositsWithdrawals instead
        :param str code: unified currency code for the currency of the deposit/withdrawals, default is None
        :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
        :param int [limit]: max number of deposit/withdrawals to return, default is None
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
        fetchDepositsWithdrawalsz) fetchTransactions() is not supported yet)r  r	  r   r=  r>  s        r   fetch_transactionszExchange.fetch_transactions  sE     8./ 	V00ueVLLLtw)TTUUUr   c                 2    |                      ||||          S )ze
         * @ignore
        Typed wrapper for filterByArray that returns a list of positions
        r  r   r  r/  rW  r  s        r   r  z"Exchange.filter_by_array_positions      
 ##GS&'BBBr   c                 2    |                      ||||          S )zi
         * @ignore
        Typed wrapper for filterByArray that returns a dictionary of tickers
        r	  r	  s        r   filter_by_array_tickersz Exchange.filter_by_array_tickers  r	  r   c                 *    i }i ||<   |||         |<   |S r   rC  )r   r  r  r  rs  s        r   create_ohlcv_objectzExchange.create_ohlcv_object  s#    F!%FI
r   maxEntriesPerRequestc                 ^    d }|                      ||d          \  }}|||k    r|}|d}||gS )Nr	  r  r  )r   ro  r	  ry  newMaxEntriesPerRequests        r   )handle_max_entries_per_request_and_paramsz2Exchange.handle_max_entries_per_request_and_params  sV    "&*.*G*GPVXn*o*o'#/6MQe6e6e#: '#' $f--r   c                 4   d }|                      ||dd          \  }}d }|                      ||dd          \  }}d }	|                      ||dd          \  }	}d }
d}g }d}|                     |dd	          }|                     |||          \  }}|	d
k    r|t          | j        dz             |}
||k     r*|dz  }	 |	dk    r|
|
dz
  |d<    t          | |          |d ||          }t          |          }| j        rid|                     |          z   dz   |z   dz   |                     |          z   }|
|d|                     |
          z   z  }| 	                    |           |dk    rnqd}| 
                    ||          }|                     |d          }|                     |dd          }
||
|k    rn"n t          | |          ||
||          }t          |          }| j        rid|                     |          z   dz   |z   dz   |                     |          z   }|
|d|                     |
          z   z  }| 	                    |           |dk    rnd}| 
                    ||          }|                     ||dz
            }|                     |d          dz
  }
||
|k    rn,n$# t          $ r}|dz  }||k    r|Y d }~nd }~ww xY w||k     *|                     |          }|dk    rdnd}|                     ||||          S )NpaginationCallsr  r  r/  paginationDirectionbackwardr   untilltillforwardzM pagination requires a since argument when paginationDirection set to forwardr   untilzDynamic pagination call  method  response length z timestamp r  r   )r  r  r	  r   r=  r  r	  r  r   rh  rj  r  r  r8  #remove_repeated_elements_from_arrayr  )r   ro  r  r  r  ry  r	  maxCallsr  r"	  paginationTimestampcallsrA  errorsr'	  r[  responseLengthbackwardMessagefirstElementforwardMessager  r9  uniqueResultsr/  s                           r   fetch_paginated_call_dynamicz%Exchange.fetch_paginated_call_dynamic"  sF   88IZ\^__&
!::66<YZ[[
F"&*&C&CFFTiku&v&v#V"##FHf=='+'U'UV\^rtz'{'{$f9,,}'  3B  )B  C  C  C"'xQJE)&*44 +6*=*Aw4wtV44VTCWY_``H%(]]N| 2*DtG\G\]bGcGc*cfp*psy*y  }P  +P  SW  Sh  Sh  iw  Sx  Sx  +x.:+}t?T?TUh?i?i/iiO111%**F!..vx@@F#'??8Q#?#?L*.*=*=lKYZ*[*[')0Cu0L0L  5wtV44V=PRfhnooH%(]]N| 1)CdF[F[\aFbFb)beo)orx)x  |O  *O  RV  Rg  Rg  hv  Rw  Rw  *w.:*md>S>STg>h>h.hhN000%**F!..vx@@F??8^a5GHHD*.*;*;D+*N*NQR*R')0Cu0L0L   !J&&G '&&&&Q xX @@HHl**aa))-sKKKs.   ?B1J8 2AJ8 B"J8 $AJ8 8
KKKc                 >   d }|                      ||dd          \  }}d}	 |r#|dk    r t          | |          |||||          S  t          | |          ||||          S # t          $ r.}	t          |	t                    r|	|dz  }||k    r|	Y d }	~	nd }	~	ww xY wd S )Nr  r/  r   r   r   )r  r  r8  r  r   )
r   ro  r  r  r  r  ry  r  r.	  r9  s
             r   safe_deterministic_callz Exchange.safe_deterministic_callc  s    
!::66<YZ[[
F
	 KV'@@@,wtV,,VYufUUU,wtV,,VUE6JJJ 	 	 	!.// aKF
"" #""""		 ts   $A" A" "
B,$BBc                    d }|                      ||dd          \  }}|                     |||          \  }}|                                 }	g }
|                     |          dz  }||z  }|	||z  z
  dz
  }|t	          ||          }|                     |dd          }|gt          t          j        ||z
            |z            }||k    r:t          | j
        dz   t          |          z   dz   t          |          z             t          d	|          D ]R}|||k    r nG|
                    |                     ||||||                     |                     ||          dz
  }S|
}g }t          d	t!          |                    D ]}|                     |||                   }|                     |          }|d
k    rd	nd}|                     ||||          S )Nr!	  r  r  r   r'	  r%	  z the number of required calls is greater than the max number of calls allowed, either increase the paginationCalls or decrease the since-until gap. Current paginationCalls limit is z required calls is r   r   r  )r  r	  rF  r  rT   r  r  r  ceilr   r=  rb  r  rQ  r6	  r  r	  rj  r*	  r  )r   ro  r  r  r  r  ry  r	  r+	  currenttasksrH  stepcurrentSincer'	  requiredCallsr   r  rA  r3	  r/  s                        r   "fetch_paginated_call_deterministicz+Exchange.fetch_paginated_call_deterministict  s_   88IZ\^__&'+'U'UV\^rtz'{'{$f##%%##I..5**(T/2Q6|U33L##FGV<<	55= : :T ABBMx''   ,c  "c  fi  jr  fs  fs  "s  vK  "K  NQ  R_  N`  N`  "`  a  a  aq(## 	< 	<A!(=(=LL55fflThjsu{||}}}88L$77!;LLq#g,,'' 	; 	;A&&vwqz::FF@@HHl**aa))-sKKKr   c
                    d }
|                      ||dd          \  }
}d }|                      ||dd          \  }}|                     ||	|          \  }	}d }d}d}g }||
k     rh	 |||                     |          |z   }|||<   d }|dk    r t          | |          |          }n t          | |          |||	|          }d}t	          |          }| j        rK|t          d          z   }d|z   d	z   |z   d
z   t          |          z   dz   |z   }|                     |           |dk    rn|                     ||          }| 	                    ||dz
            }| 	                    |d         |          }|nP| 
                    |d          }|||k     rn1n$# t          $ r}|dz  }||k    r|Y d }~nd }~ww xY w|dz  }||
k     h|                     |          }|dk    rdnd}|                     ||||          S )Nr!	  r  r  r/  r   r   r   zCursor pagination call r(	  r)	  z cursor rS  r  r   )r  r	  r^  r  r	  r  rb  rh  rj  r  r  r8  sortCursorPaginatedResultr  )r   ro  r  r  r  ry  cursorReceived
cursorSentcursorIncrementr	  r+	  r  cursorValuer   r.	  rA  r[  r/	  	iterationcursorMessager  lastTimestampr9  r<  r/  s                            r   fetch_paginated_call_cursorz$Exchange.fetch_paginated_call_cursor  s   88IZ\^__&
!::66<YZ[[
F'+'U'UV\^rtz'{'{$f(ll*&2&*ook&B&B_&T)4F:&_,,4wtV44V<<HH4wtV44VUDXZ`aaH!$X< ,!"SVVI$=	$IJ$VY_$_bu$ux{  }K  yL  yL  %L  OY  %Y  \g  %gMHH]+++!Q&&**68<<x!1CDD"ood6lNKK& $ 1 1$ D D ,1F1F   !J&&G '&&&& FA? (ll@ //77l**aa))&%DDDs&   %CF .AF <F 
F=&F88F=c                    d }|                      ||dd          \  }}d }	|                      ||dd          \  }	}|                     |||          \  }}d}
d}g }|
|k     r	 |
dz   ||<    t          | |          ||||          }d}t          |          }| j        rE|
t          d          z   }d|z   dz   |z   d	z   t          |          z   }|                     |           |dk    rnF|                     ||          }n$# t          $ r}|dz  }||	k    r|Y d }~nd }~ww xY w|
dz  }
|
|k     | 	                    |          }|d
k    rdnd}| 
                    ||||          S )Nr!	  r  r  r/  r   r   zIncremental pagination call r(	  r)	  r   r  )r  r	  r  r	  r  rb  rh  rj  r8  r@	  r  )r   ro  r  r  r  ry  pageKeyr	  r+	  r  r   r.	  rA  r[  r/	  rE	  incrementalMessager9  r<  r/  s                       r    fetch_paginated_call_incrementalz)Exchange.fetch_paginated_call_incremental  s   88IZ\^__&
!::66<YZ[[
F'+'U'UV\^rtz'{'{$f(ll"#a%w07400@TV\]]!$X< 1!"SVVI)G))SV`)`ci)il)  CF  GU  CV  CV  *V&HH/000!Q&&**68<<   !J&&G '&&&& FA# (ll$ //77l**aa))&%DDDs   "BD *D 
D"DD"c                     |                      |d          }|6d|v r|                     |dd          S d|v r|                     |dd          S |S )Nr   r  Tr=  )r  rc  )r   rA  r7  s      r   sort_cursor_paginated_resultz%Exchange.sort_cursor_paginated_result  s`    **e##||FK>>>u}}||FD$777r   c                    i }t          dt          |                    D ]r}||         }|                     |d          }||                     ||          |||<   >|                     |dd          }||                     ||          |||<   st	          |                                          }t          |          }|dk    r|S |S )Nr   r=  r  )r  r	  r  r  r  rW  )	r   r  uniqueResultr   rO  r=  r  rW  valuesLengths	            r   r*	  z,Exchange.remove_repeated_elements_from_array  s    q#e**%% 
	8 
	8A!HE!!%..B~##L"55=',L$ //{AFF	(''i@@H27Y/l))++,,6{{!Mr   c                     |                      |dd          }|3|                     ||z            ||<   |                     |ddg          }||gS )Nr'	  r%	  )r  r^  r  )r   r/  r  ry  
multiplierr'	  s         r   handle_until_optionzExchange.handle_until_option  s\    ##FGV<<??5:+=>>GCLYYv'899F  r   c                    |                      ||                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          d	          S )
Nr  r  r  openInterestAmountopenInterestValuer  r  rS  )r  r  r  rV	  rW	  r  r  rS  )r$  r  r  r  r  r  s      r   safe_open_interestzExchange.safe_open_interest  s    {{8&&vx88**8\BB++HmDD"&"2"28=Q"R"R!%!1!1(<O!P!P**8[AA((:>>OOHf55	&
 	&
 	 	 		r   c                 0    t          | j        dz             )Nz( parseLiquidation() is not supported yetrq  )r   r  r   s      r   parse_liquidationzExchange.parse_liquidation  r  r   c                 4   g }t          dt          |                    D ]5}||         }|                     ||          }|                    |           6|                     |d          }	|                     |d          }
|                     |	|
||          S )a  
         * @ignore
        parses liquidation info from the exchange response
        :param dict[] liquidations: each item describes an instance of a liquidation event
        :param dict market: ccxt market
        :param int [since]: when defined, the response items are filtered to only include items after self timestamp
        :param int [limit]: limits the number of items in the response
        :returns dict[]: an array of `liquidation structures <https://docs.ccxt.com/#/?id=liquidation-structure>`
        r   r  r  )r  r	  parseLiquidationrQ  rc  r  r  )r   liquidationsr   r  r  rA  r   rO  r  r<  r  s              r   parse_liquidationszExchange.parse_liquidations  s     q#l++,, 	" 	"A OE**5&99FMM&!!!!fk22!!&(3300NNNr   c                 0    t          | j        dz             )Nz# parseGreeks() is not supported yetrq  )r   greeksr   s      r   parse_greekszExchange.parse_greeks#  r  r   c                 0    t          | j        dz             )Nz# parseOption() is not supported yetrq  )r   chainr  r   s       r   parse_optionzExchange.parse_option&  r  r   currencyKey	symbolKeyc                 L   i }t          dt          |                    D ]}||         }|                     ||          }|                     |          }|                     ||          }	|                     |	d d d          }
|                     |||
          ||
d         <   |S )Nr   r   r  )r  r	  r  r  r  parseOption)r   r[  re	  rf	  optionStructuresr   rS  rF  r  r  r   s              r   parse_option_chainzExchange.parse_option_chain)  s    q#h--(( 	Z 	ZAA;D))$<<J))*55H''i88H%%hdHEEF151A1A$RX1Y1YVH-..r   c                 0   i }t          dt          |                    D ]u}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r|                     ||	          ||	d         <   v|S r  )r  r	  r  r  rn  parse_margin_mode)
r   r[  r  rf	  rz  marginModeStructuresr   rS  r  r   s
             r   parse_margin_modeszExchange.parse_margin_modes4  s    !q#h--(( 	^ 	^AA;D''i88H%%hdJGGFDMM&2BG$L$L9=9O9OPTV\9]9]$VH%56##r   c                 0    t          | j        dz             )Nz' parseMarginMode() is not supported yetrq  )r   r\  r   s      r   rl	  zExchange.parse_margin_mode>  rR  r   c                 0   i }t          dt          |                    D ]u}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r|                     ||	          ||	d         <   v|S r  )r  r	  r  r  rn  parse_leverage)
r   r[  r  rf	  rz  leverageStructuresr   rS  r  r   s
             r   parse_leverageszExchange.parse_leveragesA  s    q#h--(( 	Y 	YAA;D''i88H%%hdJGGFDMM&2BG$L$L7;7J7J4QW7X7X"6(#34!!r   c                 0    t          | j        dz             )Nz% parseLeverage() is not supported yetrq  )r   rV   r   s      r   rq	  zExchange.parse_leverageK  r  r   fromCurrency
toCurrencyc                 0    t          | j        dz             )Nz' parseConversion() is not supported yetrq  )r   
conversionru	  rv	  s       r   parse_conversionzExchange.parse_conversionN  rR  r   datec                 j    |dd         }|dd         }|dd         }d|z   dz   |z   dz   |z   dz   }|S )Nr   r5  r  r  20r,  z
T00:00:00ZrC  )r   rz	  yearmonthdayreconstructedDates         r   convert_expire_datezExchange.convert_expire_dateQ  sR    AaCyQqS	1Q3i 4K#-5;cALP  r   c                 ,   |dd         }|dd         }d }|dd         }|dk    rd}nb|dk    rd}nY|d	k    rd
}nP|dk    rd}nG|dk    rd}n>|dk    rd}n5|dk    rd}n,|dk    rd}n#|dk    rd}n|dk    rd}n|dk    rd}n|dk    rd}||z   |z   }|S )Nr   r5  r  r  01JAN02FEB03MAR04APR05MAY06JUN07JUL08AUG09SEP10OCT11NOV12DECrC  )r   rz	  r}	  monthRawr~	  r	  r	  s          r   %convert_expire_date_to_market_id_datez.Exchange.convert_expire_date_to_market_id_dateY  s   AaCy!91Q3itEEEEEEEEEEEEEEEEEEEEEEE%K$.  r   c                     ddddddddd	d
ddd}t          |          dk    rd|z   }|dd         }|dd         }|                     ||          }|dd         }||z   |z   }|S )Nr	  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   r5  r]  r  )r	  r  )r   rz	  monthMapppingr}	  	monthNamer~	  r	  r	  s           r   convert_market_id_expire_datez&Exchange.convert_market_id_expire_datez  s     
 
 t99>>:DAaCy1I	  	::1Q3i%K$.  r   c                 0    t          | j        dz             )Nz/ parseMarginModification() is not supported yetrq  )r   r  r   s      r   parse_margin_modificationz"Exchange.parse_margin_modification  r  r   c                 D   g }t          dt          |                    D ]}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r)|                    |                     ||	                     |S r  )r  r	  r  r  rn  rQ  r	  )
r   r[  r  rf	  rz  marginModificationsr   rS  r  r   s
             r   parse_margin_modificationsz#Exchange.parse_margin_modifications  s     q#h--(( 	Y 	YAA;D''i88H%%hdJGGFDMM&2BG$L$L#**4+I+I$PV+W+WXXX""r   r   )r|  NN)r   )r  )r   )Fr   )F)r  )r,  )r,  T)rQ   )r  )r  r  )r(  )r7  NF)r  )T)NNNN)Nr  F)NNr  F)NNNr  F)r8  r[  r  rS  r  rp  F)NN)NNTFF)r   r   r5  )Nr  r  r   r   r5  )NrH  NN)NNTTr  )rH  r   r  )NNN)NNNF)r   (  r,  
__module____qualname____doc__r=  r1  version	certifiedproaliasr  r%  r  r<  aiohttp_proxyssl_contextr  r  r  r'  socks_proxy_sessionsr  r  validateClientSslr)  r  r  r  r  rx  r  loaded_feesr  r  r  parseJsonResponser~  r  r{  r|  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  r  r  r  r  r  r  
userAgentsr  r  r  r  rs   rt   rw   ru   ry   rz   r{   rx   r  r  r  r   r  r   r   r   r
   r	   r   r$  r  r	  r  triggerOrdersmyTradesr  r  r  r
  r  base_currenciesquote_currenciesr  r  r  r  rP  r  r   r  r   r`  r  rD  rx  r&  r   r)   __annotations__handleContentTypeApplicationZipr  rG  lastRestPollTimestamprestRequestQueuerestPollerLoopIsRunningrateLimitTokensrateLimitMaxTokensrateLimitUpdateTimer  r  r  r  r  r  r  r  r   r  r  r  r  rE  r(  r5  r:  r?  rA  r  rM  staticmethodr^  rd  rh  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  r  r  r  r%  r(  r  r/  r   rk  r>  r$  r  rJ  rL  rR  rU  r[  rc  rf  rj  rn  rq  ru  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rF  r  r  r  r  r  r  r  r  r  r  r  r
  r(  r  r  r  r  r  r"  r$  r'  rG  r:  rQ  rY  r4   r]  r`  r/   r  r  ry  r  r  r  rF  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r;  r  rI  r  r  r  r  r"  r  r)  r.  r1  r3  r5  r9  r=  r?  rA  rE  rH  rJ  rD   r!   r  rP  rT  rX  r  r\  r`  rb  rb  rC   re  rh  rj  ro  rl  rv  ry  r(   r  r  r  r  r  rp  rE   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  r  r  r  r  r  r  r  r!  r$  r&  r(  r*  r,  r.  r3  r5  r8  r:  r=  r   rH   rF  rH  rL  rN  rQ  rU  rW  rY  r[  r^  r`  rd  rf  rh  rj  rn  rq  rt  r  rv  r  r  r  r  r  r  r  r
  r  r  r  r   rz  r  r6  r9  r;  r>  r@  rB  rE  rG  rM  rP  rR  r[  r_  rn  r*   rr  rt  r|  r  r  r  r  r  r1  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  rc  rp  r  r  r  r  r  r  r  r  r  r  r$   r  r  r  r  r"   r  r#   r   r'  r)  r+  r-  r/  r2  r4  r6  r8  r:  r<  r?  rA  r  r  r  rQ  rS  rU  rW  rY  r[  r^  ra  rd  rf  rh  rl  rk  ro  rr  ru  ry  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r  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  r  r  r!  r#  r'  r)  r+  r-  r/  r1  r3  r5  r7  r9  r;  r=  rA  r   r2   r~  r  r   rL  rN  rR  rT  rW  rY  r[  r]  ra  rc  re  rg  rk  rm  ro  rq  rs  r  rx  r|  r  r  r  r  r  r  r  r  r  rK  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  r 	  r	  r	  r	  r	  r	  r	  r	  r  r	  r	  r	  r4	  r6	  r>	  rH	  rL	  rN	  r*	  rT	  rX	  rZ	  r^	  ra	  rd	  rj	  r'   rn	  rl	  rs	  rq	  ry	  r	  r	  r	  r	  r	  rC  r   r   r5   r5   l   s\        	BDGI
CEOIGLMKIGFFGGGEJ $
 
 
	 D $
 
 
	 K CD
C EHIIJJKJKIJGHHILN G C Q J
 GFGHFFH
CJMEEMIJ 
 

 
 

 
 

 
 
 F$}~ 	  	#	
 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#  	#!" 	##$ $##"""3  N6 GJFMHFLFGHOJGHI 
 
bTbdb 	b 		b
 	$b 	b 	$b 	$b 	Tb 	4b 	tb 	b 	b 	Db 	Tb  	t!b" 	t#b b$ 	 %b& 	4'b( 	)b* 	 +b, 	Z-b. 	/b0 	1b2 	3b4 	t5b6 	47b8 	!$9b: 	$T;b< 	D=b> 	t?b@ 	DAbB 	TCbD 	:Eb b bF 	GbH 	tIbJ 	 KbL 	)$MbN 	ObP 	tQbR 	DSbT 	"4UbV 	TWbX 	4YbZ 	4[b\ 	D]b^ 	t_b` 	Dabb 	dcbd 	#Debf 	gb b bh 	$ibj 	kbl 	dmbn 	$obp 	4qbr 	dsbt 	$ubv 	4wbx 	tybz 	D{b| 	D}b~ 	b@ 	$AbB 	dCbD 	!$EbF 	tGbH 	tIb b bJ 	KbL 	TMbN 	tObP 	4QbR 	DSbT 	dUbV 	TWbX 	$YbZ 	4[b\ 	D]b^ 	_b` 	tabb 	Tcbd 	ebf 	4gbh 	$ibj 	Dkb bl !%$( $Cb b bCF #MK$(!FC&+#J #O!! $ MNNRO  
 K  ER ER ER ERN  Z Z Z    ' ' ' '   \) ) ) )  % % %- - -~$ ~$ ~$ ~$@  _ _ _
 	 	 \	    \ _ _ _ \_ Y Y Y \Y Y Y Y \Y ! ! ! \!    \ S S S \S Z Z Z \Z ` ` ` \` a a a \a g g g \g g g g \g b b b \b v v v \v \ \ \ \\ ` ` ` \`
    \ B B B \B ) ) ) \) ) ) ) \) ! ! ! \!    \ Z Z Z \Z = = = \=   \ W W W \W
 @ @ @ \@    \ ; ; ; \; ; ; ; \; ! ! \! 2 2 \2   \   \ W W \W 
 
 \
 
 
 \
 > > > \> 5 5 5 \5   \ - - \- 	 	 \	 j j j \j Q Q Q \Q   \ " " \"   \ 1 1 \1   \ 5 R R R \R +- J J J \J , , \,.  > > > \> 0 0 0 \0   \     \  
 
 \
 K K \K . . \. 	 	 \	 " " \" ' ' \' ' ' \'     \  ' ' \' * * \*    \ ' ' ' \' I I I \I P P P \P
 5 5 5 \5 4 4 4 \4 F F F \F 1 1 1 \1    \@ 
 
 
 \
 (/u    \   \   \ M M \M = = \= , , \, = = \= 4 4 \4 '/B A A A \A> q q q \q ' ' \' Y Y \Y   \   \ ; ; \; +
 +
 +
 \+
Z D D D \D 4 4 4 \4 7 7 7 \7 : : \:
 ( ( \( ( ( \( F F \F    \0  
6 
6 
6 #( 
5 
5 
5 
5 $& + + + + ')    

 

 

   \* 8B I I I \IC C C\ \ \W W W   \
   \  / / \/ , , \, ) ) \) < < \</ / / F F \F   \&     U U Ur r r    \B B B? ? ?  ! ! !@ @ @ @R R R R& & &< < <  = = =  T	 	$y/ 	QU 	 	 	 	H HI HY HVZ H H H HA A A$ A A A A $y/ QU    A A A$ A A A AH HI HS HPT H H H H $y/ QUVYQZ    N N) N3 NVZ[^V_ N N N NG Gy GS	 G G G G4 4 4G G G      C     813 13 13C 13 13 13 13f1 1 1B` ` `3     T&\ # 9 os    $O O4< O OSV Odm O O O O$H Hf Hi Hdg Hwz H H H H*         & %-U2VZhl  c PS be     %' N N N N 6:UW L L3 Ls L# L L L L 9=4XZ N Nc N# NS N N N N 6:UW L L3 Ls L# L L L L IM[_hj V VS	 V# VUX V V V V LP^bkm X X49 XS XX[ X X X X IM[_hj V VS	 V# VUX V V V V [_mqz| U UDcO UTW Ugj U U U U MQY[ Y YDI Yc Y Y Y Y :>b V VT#Y V V V V :>b O Os O3 O O O O 57 T T T T T T 7;2 Q Q$s) Q Q Q Q 8<B 	 	 	 	 :>b O Os O3 O O O O !# J J J J 9=R S SDI S S S SL L L  L L6 L6 L L L LT Th T T T TK K K K K K KQ Qx Q Q Q QN N N N N NM M MQ Q Q Q Q QK K K K K K /1 V V V V 24 Y Y Y YY Y Y Y Y Y 9=R S SDI S S S SN Nv N N N NX Xv X X X XT T& T T T TM MF M M M MM MF M M M MR R& R R R R/ /F / / / / 8<B R R49 R R R R 68 Q Q Q Q Q Q >@ R R49 R R R R JL 7 7tCy 7 7 7 7 [] I IS I% Ic Ic I I I I DHPR I IS I% I# I I I I 8: U U3 U U U U 9=R L LS L# L L L L 24 R RS R R R R 48 O OtCy O O O O =A P P Pc P P P P =? J J Je J J J J @B M MC M M M M M =? J J Je J J J J =Adaetx  BD 
] 
]c 
] 
][^ 
]nq 
] 
] 
] 
] >B" N N# Ns N N N N DF _ _s _ _ _ _ BFTXgktv Y Y# Yc Yad Y Y Y Y 79 R R# R R R R   G G G G ,. T T T T$ $ $" " "U    , , ,B B B

 
 
&
 &
v &
 &
 &
 &
 &
P    6I I I IVN N N N`% %be %w{ % % % %
 F        DX X X X X X Xt =Atbfoq #P #P6 #P6 #P #P\_ #P #P #P #PJ jqy{ /
 /
C /
s /
# /
u /
UZ /
 /
 /
 /
b F F    ". . . . . . .`  I I IV. .& .& . . . .` ;= K Kc K K K K <> M Ms M M M M LN P PC Ps P P P P DF N N NU N N N N TV Q QS Q QU Q Q Q Q >B" B B# Bs B B B B =A   c     26DW[df U U# Uc UQT U U U U 59tZ^gi v vS v vTW v v v v 26DW[df K K# Kc KQT K K K K De4E    & De4E    $', ', ', ',R '     7     g C    < '      9 hq     =A  # c         
 
 
4 
 
 
 
. .c . . . . .` C s    (- - -" " " " "m m mn n n   2+ + +i +y + + + +

 

& 

# 

# 

  AJ 

  [d 

  xA 

 

 

 

C C4< C CPS Ccf Cvy C C C C S 49    : 8<ERT  49      . JNVX P Pc PT#Y P P P P :<  tCy     @DRVeirt O O49 Of OC O_b O O O O PTbfuy  CE O OtCy OH O\_ Oor O O O O JN\`os|~ O Oc Oh OVY Oil O O O O 7;\`ik O O8 O3 OVY O O O O        :S : : : : & S PS     6 c QT    
 
 
	    K Kc K3 Kos K  VZ K K K K	C 	CI 	C 	C 	C 	C '/uRX\jnwy 	b 	b 	bRU 	bdg 	b 	b 	b 	b (0bY]koxz M M MSV Meh M M M M $) 	 	 	 	* *4; *3 *e *`e * * * *XJ JSV Jfi J J J J VZbd O Os OC O Os O O O O W[ce P P PS P% PPS P P P P cgoq Q Q3 Q Q9 Qe Q\_ Q Q Q Q `drv  @B L LS L# LY Li LY\ Llo L L L L qu} M M MS M	 M M\a Mjm M M M M (* Q Q Q Q 24 N NS N N N N ,0 N NS N N N N 48dY]fh O OtCy O OSV O O O O ?CQUdhqs B B$s) B3 B^a B B B B >@ X X X X X X 48 O OtCy O O O O 9=R S SDI S S S S 48 N NtCy N N N N 15DW[jnwy T T# Tc TQT Tdg T T T T (,$TZ\ L L LC Ls L L L L 7;2 Q QS Q Q Q Q Q i 	 en      x    # #C # #3 #cf # # # #J    p p p $& M M M M ') O O O OM M M $& M M M M 24     )+ : : : : )+ : : : : *, ; ; ; ; #% L L L L 79 ; ;# ; ; ; ;
 9=R U UDI U U U U >B" Y Yc Y Y Y Y <> + +s + + + + 24 Z Z Z Z 9;  C     >@       v 3 TW    ,  S WZ hk    (      
 OS[]lp   V    4 BFb_c ! !S ! ! ! !* EGUY ] ] ] ] ] ]) ) )+ + +
    
 MO 2 2 2 2 02 P P3 P P P P 02 L L3 L L L L 26b M MT#Y M M M M 6:UW P Pc P# P P P P 26b N Nw N N N N 26b M MT#Y M M M M 26b K Kc K3 K K K K 59 M M Mc M M M M 9=R  S #     13 j j j j gksu L L3 Li Ly LRW L`c L L L L w{  LP  gk  tv Z Z3 Zi Zy Zbg Zps Z Z Z Z, x|  NR  im  vx [ [C [y [PY [ch [qt [ [ [ [, _a Z ZC Zy ZPU Z Z Z Z RT 
] 
] 
]5 
] 
] 
] 
] SU 
^ 
^ 
^E 
^ 
^ 
^ 
^ os  IM  VX S S3 Si Sy SZ_ Shk S  CF S S S S& qu  LP  Y[ T TS T	 T T\a Tjm T  FI T T T T& sw  PT  ]_ V Vs V) V9 V^c Vlo V  JM V V V V& FJ  ^b  tx  AC :e :e# :eY :e^g :eqv :e  @C :e  X[ :e  nq :e :e :e :ex @B M MD$6 M M M M jnvx N Nc N N) NUZ Ncf N N N N 37r L Ls LC L L L L 6:" N N# Ns N N N N >B" O ODI Os O O O O /32 P P P P P P 26b R R3 R R R R 24 j j j j *.Dt\^ L L3 Lc L L L L L
 -1tRV_a N Nc N NC N N N N 9=4^bkm Q QS Q# QS QX[ Q Q Q Q *.Dt\^ L L3 Lc L L L L L /3TXac P P P3 Pc P P P P 26DW[df R R3 Rc RQT R R R R 154VZce R R# RS RPS R R R R >BPTcgpr ] ]s ]# ]]` ] ] ] ] 48dY]fh T TS T TSV T T T T -1tRV_a N Nc N NC N N N N 37TX\eg T TC Ts TRU T T T T <@d[] R R RS R R R R R 04$UYbd P P PC Ps P P P P -1tRV_a N Nc N NC N N N N 02 L L3 L L L L 46 Q Qs Q Q Q Q 02 L L3 L L L L MQY[ R RC R Rc R R R R 6:[_hj 	Y 	Ys 	Y# 	YUX 	Y 	Y 	Y 	Y ,0dQU^` N NS N N3 N N N N /3TXac Q Q Q3 Qc Q Q Q Q -1tRV_a P Pc P PC P P P P 04$UYbd S S SC Ss S S S S 8<$]ajl X X XC XWZ X X X X 37TX\eg T TC Ts TRU T T T T =A N NS N	 N N N N *, R R R R =A O O# Oc O O O OO Of O O O O 79 X X# X X X X*
 
 
 
 
C C C C C
NS N N N NLS L L L L"Z3 Z Z Z Z   df O O OI Ou OUZ O O O O ]aik P P# PY P PVY P P P P WY P PS P% P P P P P XZ Q Qc Q5 Q Q Q Q Q JL P Pc P5 P P P P KM Q Qs QE Q Q Q Q} } } } }    #    ys y y y y
j 
j# 
j 
j 
j 
j  
/ / /4 4 48 8 87 7v 7I 7c 7 7 7 77 7 7d9o 7c 7 7 7 7% % % % % )S ) ) ) )& +- . . . .EC E E E E ?A ] ]# ] ] ] ] qu} K KS K	 K K\a Kjm K K K K sw  @B K Ks K) K9 K^c Klo K K K K lp  CG  PR K K K9 KI KW\ Keh K| K K K K {} N Nc N NE NZ_ Nlq N N N N np N Ns N) NU N_d N N N N   S  H        j j# jS j`c j j j jj jc jY\ j j j jS SDI SUX Shk S S S S BFb !@ !@T#Y !@ !@ !@ !@F ;?r #@ #@d3i #@ #@ #@ #@J EIRV_a 	 	S	 	 	 	 	 v    O O O\_ O O O O   C    3  cf        Q Q3 Q Q Q Q Q F    # # # OQ  $    2 ik  d TX be    4 6:" P Pc P P P P )+ Q Q Q Q ,. S S S S 57 , , , , , , /1 W W W WR RF R R R RO O OTW O O O O 68 U U U U U U  26DW[df S Sc SQT S S S S$ 8<$]ajl T T TC TWZ T T T T$ @DRVeirt [ [ [C [_b [ [ [ [$ +-      " XZ - -# - - - -"
v 
vc 
vWZ 
v 
v 
v 
v# #49 # # # #.X X X X X X
 
 
   ,L L L L L L@ @ @C @ @ @ @$ tCy     d6l C SV fi y|     .2SW`b V Vs V# VS V V V VC Ci C C C CC CI C C C C# #     bfnp . . .[^ . . . . GKY]lpy{  Z^ ?L ?L3 ?L ?LSV ?Lfi ?L  TW ?L ?L ?L ?LB BFTXgk  C  LN  c 3 c ad x{    " MQ_crv  JN  WY  pt L L Lc LY\ Llo L  DG L L L L: FJQU]ajl  ~B  OS  ei  @D ,E ,E# ,Es ,E ,E ,E ,E\ KOVZbfoq{  W[ E Es EC E E E E>    &! !s ! ! ! !
 
6 
 
 
 
Q QV Q Q Q QO O3 OVY O O O O&L L6 L L L LL LH LV L L L L	  	 4< 	 c 	 ]` 	  	  	  	 $ $4< $$s) $_b $  xB $ $ $ $P PF P P P P" "V "tCy "\_ "t~ " " " "N Nv N N N NP P PV^ P P P P! ! ! ! !!# ! ! ! !B!# ! ! ! !4X Xf X X X X# #4< #$s) #gj #  @J # # # # # #r   )rr	  r  ccxt.base.errorsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   ccxt.base.decimal_to_precisionr   r   r   r   r   r   r   r   r   r   ccxt.base.preciser   ccxt.base.typesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   cryptography.hazmatr+   cryptography.hazmat.primitivesr,   )cryptography.hazmat.primitives.asymmetricr-   ,cryptography.hazmat.primitives.serializationr.   ccxt.static_dependenciesr/   r0   axolotl_curve25519r  ImportError!ccxt.static_dependencies.ethereumr1   r2    ccxt.static_dependencies.msgpackr4   __all__r"  r*  r  r(  r  r:  r  email.utilsr6   rO  r
  r  rX  ry  r  r!  numbersr7   rs  requestsr8   requests.utilsr9   requests.exceptionsr:   r;   r<   r=   r>   r  sslr?   rH  r  rT  decimalr@   rA   wsgiref.handlersrB   urllib.parseparser  typingrC   rD   rE   rp  r5   rC  r   r   <module>r	     s      + * * * * * ) ) ) ) ) ) ) ) ) ) ) ) 0 0 0 0 0 0 + + + + + + + + + + + + 1 1 1 1 1 1 + + + + + + ) ) ) ) ) ) . . . . . . & & & & & & ) ) ) ) ) ) . . . . . . ' ' ' ' ' ' ( ( ( ( ( ( ' ' ' ' ' ' @ ? ? ? ? ? L  L  L  L  L  L  L  L  L  L  L  L  L  L  L  L  L  L  L  L ; ; ; ; ; ; % % % % % % 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
 ) ( ( ( ( ( 1 1 1 1 1 1 = = = = = = M M M M M M
 + * * * * * + + + + + +&&&&&   EEE 2 1 1 1 1 1 5 5 5 5 5 5 2 2 2 2 2 2            ! ! ! ! ! !    				          				       - - - - - - C  C  C  C  C  C  C  C  C  C  C  C  C  C                      - - - - - - ! ! ! ! ! !              
sT# sT# sT# sT# sT#v sT# sT# sT# sT# sT#s   C CC