
    ei=                       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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ dd l?mAZA 	 dd!lBZBn# eC$ r d!ZBY nw xY w	 dd!lDZEn# eC$ r d!ZEY nw xY wdd"lFmGZG dd#lFmHZH dd$lImJZJ dd%lKmLZL dd&lMmNZN dd'lOmPZP dd(lQmRZRmSZS dd)lTmUZV 	 dd*lWmXZX dd+lYmZZZ dd,l[m\Z\ dd-l]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe dd.lfmgZg n# eC$ r d!ZgY nw xY w	 dd!lhmiZi n# eC$ r d!ZiY nw xY wdd!ljZjdd/lkmlZlmmZmmnZnmoZo d0gZpdd!lqZqdd!lrZrdd!lsZsdd!ltZtdd!luZudd!lvZvdd!lwZwdd1lxmyZy dd!lzZzdd!l{Z{dd!l|Z|dd!l}Z}dd!l~Z~d!Z	 dd!lZn# eC$ r Y nw xY wdd!lZdd!lZdd!lZdd2lmZ dd!lZdd3lmZ dd4lmZ dd5lmZmZmZmZmZ dd6lmZ dd!lZdd!lZdd!lZdd7lmZ dd!lmZ dd8lmZmZ dd9l$mZ  G d: d;ej                  Z G d< d0e          Zd!S )=Base exchange classz4.5.46    )format_exception)ExchangeError)NetworkError)NotSupported)AuthenticationError)DDoSProtection)RequestTimeout)ExchangeNotAvailable)InvalidAddress)InvalidOrder)ArgumentsRequired)	BadSymbol)NullResponse)RateLimitExceeded)OperationFailed)
BadRequest)BadResponse)InvalidProxySettings)UnsubscribeError)decimal_to_precision)DECIMAL_PLACES	TICK_SIZE
NO_PADDINGTRUNCATEROUNDROUND_UP
ROUND_DOWNSIGNIFICANT_DIGITSnumber_to_string)Precise)ConstructorArgsBalanceAccountCurrency	IndexType	OrderSide	OrderTypeTradeOrderRequestMarket
MarketTypeStrNumNumTypeStringsCancellationRequestBoolOrder)backends)hashes)paddinged25519)load_pem_private_key)ecdsa)keccakN)abi)accountpackb)"get_private_key_from_eth_signature)compute_address)get_selector_from_name)message_signatureprivate_to_stark_key)	TypedData)Mnemonic)Bip44)SignMode)AuthInfoFeeModeInfoSignDoc
SignerInfoTxTxBodyTxRaw)encode_as_any)load_lighter_librarydecode_tx_infodecode_authCreateOrderTxReqExchange)	parsedate)Number)Session)default_user_agent)	HTTPErrorTimeoutTooManyRedirectsRequestExceptionConnectionError)SSLError)Decimal)AnyList)Intc                        e Zd Z fdZ xZS )SafeJSONEncoderc                     t          |t                    rd|j        j        iS 	 t	                                          |          S # t          $ r dt          |          j         dcY S w xY w)NnamezTypeError: Object of type z is not JSON serializable)
isinstance	Exception	__class____name__superdefault	TypeErrortype)selfobjrj   s     P/var/www/html/volatility/venv/lib/python3.11/site-packages/ccxt/base/exchange.pyrm   zSafeJSONEncoder.default   s    c9%% 	4CM233	^77??3''' 	^ 	^ 	^]S		0B]]]]]]	^s    A "A,+A,)rk   
__module____qualname__rm   __classcell__)rj   s   @rr   re   re      sA        ^ ^ ^ ^ ^ ^ ^ ^ ^    re   c                   ZS   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ZdZi Z dZ!dZ"dZ#ddddd	dd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Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCddddZDdZEdZFdZG eHd          ZIdZJdZKdZLdZMdZNdZOdZPdZQdZRdZSdZTdZUdZVdZWdZXdddddddddddddZYi deZde[de\de]de]de]de]de]de]d e]d!e]d"e]d#e]d$e]d%e]d&e]d'e]e]e]e]e^e^e_e_e_d(Z`dZadZbdZcdZddZedZfdZgdZhdZidZjdZkdZldZmdZndZoi ZpdZqdZrdZsdZtdZuddddddddddd)
Zvi Zwi ZxeyZze{Z|d*Z}dZ~dZeHZeed+<   dZdZd,Zd,ZdZdZd-Zd-Zd,ZdZdZdZdZdZdZdZdZdZdZdZdZd.Z ej        d/          Zd0d1d2d3ZdZi fd4efd5Zd6 Zd7 Zd8 Zdd9Zdd:Zdd<ed=efd>Zdd<ed?ed=efd@Zd<efdAZdB ZdCefdDZedE             ZddFZdG ZdH ZdI ZddKZdL ZdM ZedN             ZeddO            ZeddP            ZeddQ            ZeddR            ZeddS            ZeddT            ZeddU            ZeddV            ZeddW            ZeddX            ZeddY            ZeddZ            Zedd[            Zedd\            Zedd]            Zedd^            Zedd_            Zedd`            Zedda            Zeddb            Zeddc            Zeddd            Zedde            Zeddf            Zedg             Zeddh            Zeddi            Zeddj            Zeddl            Zeddm            Zedn             Zedoefdp            Zedq             Zedr             Zeds             Zedt             Zedu             Zeddvdw            Zeddx            Zeddy            Zedz             Zed{             Zed|             Zed}             Zedd~            Zedd            Zed             Zed             Zed             Zed             Zed             Zei ddfd            Z ej        d          Zei fd            Zed             Zei dfd            Zedd            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Zedd            Z ej        dej                  Zedd            Zedd            Zee j        dfd            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Z	eddi fd            Z
edd            Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zed             Zedd            Zedd            Zd?edefdZedd            Zedd            Zedd            Zed             Zed             Zed             Zed             Zedd            Z dÄ Z!dĄ Z"dń Z#di fdƄZ$i fdǄZ%i fdȄZ&dɄ Z'edʄ             Z(ee)fd˄            Z*d̄ Z+d̈́ Z,ed΄             Z-edτ             Z.edЄ             Z/edф             Z0ed҄             Z1edӄ             Z2dԄ Z3edՄ             Z4edք             Z5ddׄZ6d؄ Z7dل Z8dڄ Z9eddۄ            Z:d܄ Z;d݄ Z<dބ Z=d߄ Z>ddZ?ddZ@d ZAddZBd ZCd ZDd ZEd ZFd ZGd ZHd ZIi fdefdZJi fdefdZKd ZLd ZMd ZNd ZOd ZPddZQd ZRd ZSd ZTd ZUd ZVd ZWd ZXd ZYd ZZd Z[d Z\d Z]d  Z^d Z_d Z`d Zad ZbdecfdZdddeeef         degfdZhdd	efd
efdegfdZiddefdegfdZjddeeef         dekfdZlddefdekfdZmdd	efd
edekfdZnddeeef         deeec         fdZodd	efd
edeeec         fdZpddefdeeec         fdZqd Zrd ZsddecdefdefdeffdZtd Zudeeec         fdZvddZwdd exd!exfd"Zyd#efd$Zzdd exd!exfd%Z{d& Z|d' Z}dd(exfd)Z~d*efd+Zdd-eee         d.edefd/egfd0ZdÐd-eee         d1ed.edeffd2ZdĐd-eee         d3efd1ed.efd4Zd5egfd6Zd7egfd8Zd9dJi ddfd:ecd;ecd<ecfd=Zi fd>Zddi fd?ed1ed.efd@Zddi fd?ed1ed.efdAZddi fd?ed1ed.efdBZddi fdCeee         d1ed.efdDZddi fd?ed1ed.efdEZddi fdCeee         d1ed.efdFZddi fd?ed1ed.efdGZdi fd?exfdHZi fd?efdIZddi fdCeee         d1ed.efdJZi fdCeee         fdKZddi fdCeee         d1ed.efdLZddi fdCeee         d1ed.efdMZddi fdNeeeee                  d1ed.efdOZi fdNeeeee                  fdPZdi fdCeee         d.efdQZi fdCeee         fdRZdi fdCefdSZi fd?efdTZi fd?efdUZdi fdCefdVZdi fdWefdXZdi fd?ed.efdYZdi fd?ed.efdZZi fd?efd[Zdi fdCefd\Zdi fd]Zdi fd?ed.efd^Zi fd?efd_Zi fd`Zdi fdCefdaZdbekfdcZdd ZdeekfdfZdg ZddhekdeefdiZddjefdkZddlekdeefdmZddnekdjefdoZddpekdjefdqZdrekfdsZddtekdjefduZddvekdeefdwZi fdxZi fdyZddeefdzZdi fdCefd{Zdd|ekdeefd}Zddeefd~ZddekdeefdZddekdeefdZddlekdeefdZddvekdeefdZddlekdeefdZddeefdZdi fdCefdZdi fdCefdZi fd?efdZdi fdCefdZdi fdCefdZi fdCeee         fdZi fdedeHdedefdZdi fdedeHd(edexfdZi fdefdZdi fde̐d?exfdZi fd?efdZdi fdCefdZdi fdegd?exfdZi fd?edeHfdZi fd?edeHfdZi fd?edeHfdZdi fd?edexfdZddddi fd?exdexd1ed.efdZddddi fd?exdexd1e֐d.efdZdi fded?exfdZi fdefdZِdddi fd?eded1ed.efdZi fd?efdZdi fdCefdZi fdZi fdZސd Zߐd ZdeHfdZd ZddedefdefdZddedefdefdZd Zd Zd ZddecdexdexfdZdŐd?edexdexdecfdZdŐdedexdexdexdecf
dZd?exfdZd Zd ZddedjefdZdjefdÄZddeekfdĄZddńZdƄ ZdǐecdȐecdɐekfdʄZdːekfd̄Zddvekdeefd̈́Zdddi fdΐedeed1ed.efdτZddi fd?edededeHdeHdӐefdԄZdi fd?edededeHdeHf
dՄZdd֐ekdeefdׄZddlekdeefd؄ZdƐdلZdڐecfdۄZdܐecfd݄ZdސeeeH         deHfdZd Zd Z d ZddhekdeefdZi fdedeHfdZi fdedeHfdZi fd?ededeHfdZi fdedeHfdZi fd?ededeHfdZdi fdedeHd?exfdZdi fdedeHd?exfdZ	dddi fd?eded1ed.efdZ
dddi fd?eded1ed.efdZdddi fd?eded1ed.efdZdddi fd?eded1ed.efdZdddi fd?eded1ed.efdZdǐdeeeeeH                  fdZdǐdeeeeeH                  fdZdȐdZddCefdZddWefdZddCefdZdɐdCedexfdZddWefd ZddefdefdeffdZdi fd?ed.efdZdd?exfdZddeedefdZddedexfdZdȐdexdexfd	Zd
 ZdefdZd Z d Z!ddZ"dded	efd
effdZ#dʐded?ed,edefdefdeffdZ$dːdeee         deecded1ed.ede%fdZ&dȐdecdCeee         fdZ'ddi fdCefdZ(d|ekfdZ)di fdeeec         dCeee         fdZ*ddekdeefdZ+di fdeeec         dCeee         fdZ,i fd eeec         fd!Z-dddi fd"egd#eeec         deed1ed.ef
d$Z.dddi fd#eeec         deed1ed.efd%Z/dddi fd#eeec         deed1ed.efd&Z0dddi fd'eeec         djed1ed.efd(Z1dddi fd)eeec         djed1ed.efd*Z2dddi fdjed1ed.efd+Z3d, Z4d- Z5defd.Z6d?efd/Z7d?efd0Z8dd1ededexfd2Z9dd1ed3ed4edexfd5Z:dd1ededefd6Z;dd1ed3ed4edefd7Z<dd1edede%fd8Z=dd1ed3ed4ede%fd9Z>dd1ekd:ekd;edexd<egf
d=Z?d> Z@deffd?ZAd̐dexdexd@egdAegfdBZBd͐deffdCZCd9dJi ddi fd:ecd;ecd<ecfdDZDd9dJi ddi fd:ecd;ecd<ecfdEZEdi fdFZFdΐd#eeeG         ded1eHd.eHfdHZHdϐd1ed.efdIZIdi fdJed?edeHdҐefdKZJdi fdJed?edeHdҐefdLZKdi fdJed?edѐeLdeHdҐef
dMZMddi fdJed?edeNdѐeLde֐dҐefdNZOddi fdOed?edeNdѐeLde֐dҐefdPZPddi fdJed?edeNdѐeLde֐dҐefdQZQi fd?efdRZRi fd?efdSZSdi fd?exfdTZTdddi fdCed1ed.efdUZUdddi fdCed1ed.efdVZVi fd?efdWZWi fd?efdXZXdi fdCefdYZYdi fdCefdZZZdi fdCefd[Z[di fdCefd\Z\ddddi fdexd?exd1ed.efd]Z]dddi fdexd1ed.efd^Z^di fdJedexfd_Z_ddefdefdeffd`Z`ddaexdjefdbZaddcexdeeddexdexfdeZbdd?exfdfZcddgZddh Zei fdiZfi fdjZgdk Zhi fdlZii fdmZji fdnZki fdoZli fdpZmi fdqZni fdefdrZodi fdWefdsZpdi fdWefdtZqi fdefduZri fdvZsi fdefdwZti fd?efdxZudd1ededyefdzZvdd1ed{ed|ed}efd~ZwddedyefdZxdi dfdedeefdZydi dfdefdZzi dfdefdZ{d Z|d Z}d Z~de̐ded ed!edekdefdZi fdZi fd?efdZi fd?efdZi fd?efdZi fd?efdZdi fdCefdZdi fdCefdZdi fdCefdZdi fdCefdZdi fdCefdZddi fdCed.efdZdi fdCefdZdi fdCefdZdi fdCefdZi fd?efdZdi fdJed?exfdZdi fdOed?exfdZdi fdJed?exfdZdi fdJed?exfdZi fdZdi fd?edeNdѐeLdeHdҐef
dZi fd?edѐeLdeHdeHfdZdi fdJedededefdZdi fdJedexfdZdddi fdexd1ed.efdZdi fd?exfdZi fd?efdZdi fdCefdZi fd?efdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdZi fd?edѐeLdeHfdZi fd?edeHfdZi fd?edeHfdZi fd?edѐeLdeHfdZddi fd?edeNdѐeLdeHdҐe֐defdZddi fd?edeNdѐeLdeHdҐe֐defdZddi fd?edeNdѐeLdeHdҐe֐defdZddi fd?edeNdѐeLdeHdҐe֐defdZddi fd?edeNdѐeLdeHdҐe֐defdZddi fd?edeNdѐeLdeHdҐe֐defdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdZdddi fd?edeNdѐeLdeHdҐe֐de֐defdÄZdddi fd?edeNdѐeLdeHdҐe֐de֐defdĄZi fdΐeee         fdńZi fdΐeee         fdƄZi fdΐeee         fdǄZi fdΐeee         fdȄZdi fd?edeNdѐeLdeHdҐef
dɄZdi fdJed?exfdʄZdi fdJed?exfd˄Zdi fdJed?exfd̄Zdi fdOed?exfd̈́Zdi fdJed?exfd΄Zdi fdϐeee         d?exfdЄZdi fdѐeee         d?exfd҄Zdi fdϐeee         d?exfdӄZdi fd?exfdԄZdi fd?exfdՄZdi fd?exfdքZi fdאefd؄Zi fdΐeee         fdلZdi fd?exfdڄZi fdvefdۄZdddi fd?exd1ed.efd܄Zdddi fd?exd1ed.efd݄Zdddi fdJed?exd1ed.efdބZdddi fd?exd1ed.efd߄Zdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZddi fd?ed1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZi fd?efdZdi fdCefdZi fdefdZi fd?efdZdi fdededefdZdddi fdexd1ed.efdZdddi fdexd1ed.efdZdddi fdexd1ed.efdZdddi fdexd1ed.efdZdddi fdexd1ed.efdZdddi fd?exd1ed.efdZdddi fd?exd1ed.efdZdi fd?edѐeLfdZi fdZdi fd?ed.efdZddeefdZi fdefdZi fdefdZdefdZdefdZdefdZd?efd Zd?efdZdАde%dekfdZd Zi fd?edѐeLdeHdeHfdZi fd?edѐeLdeHdeHfdZdi fd?edѐeLdeHdҐefdZdi fd?edѐeLdeHdҐefd	Zi fd?edeHdeHfd
Zi fd?edeHdeHfdZi fd?edeHdeHfdZi fd?edeHdeHfdZi fd?edeHfdZi fd?edeHfdZi fd?edeHfdZi fd?edeHfdZd?efdZd?efdZd?efdZd?efdZddefdZd Zd Z d Zd ZddefdefdZddedސeeef         defdZdefdZdexfd Zi fd!Zd efd"Zi fd?efd#Z	di fd?edeNdѐeLdeHdҐef
d$Z
di fd?edeNdѐeLdeHdҐef
d%Zdi fd?edeNdѐeLdeHdҐef
d&Zdi fd?edeNdѐeLdeHdҐef
d'Zddi fd?edeNdѐeLdeHdҐe֐defd(Zddi fd?edeNdѐeLdeHdҐe֐defd)Zi fd?edѐeLdeHdeHdeHf
d*Zi fd?edѐeLdeHdeHdeHf
d+Zi fd?edѐeLdeHdeHfd,Zi fd?edѐeLdeHdeHfd-Zi fd.efd/Zddaexdjefd0Zdѐd?exd1ed.efd1Zdѐd1ed.efd2ZdѐdCeee         d1ed.efd3Zdi fdCeee         fd4Zdi fdCefd5Zddi fdWefd6Zddeefd7Zddjefd8Zdexd1ed.efd9Zdecfd:ZdŐd1ed.efd;Z dŐdcexdeeddexdexfd<Z!dd=edeefd>Z"ddCefd?Z#ddekdeefd@Z$dŐd1ed.efdAZ%ddBZ&dd;exdCe%fdDZ'dE Z(dF Z)i fdGegfdHZ*i fdGegdIegd1ecfdJZ+di fdCefdKZ,i fdLZ-i fdMZ.i fd?efdNZ/i fdOZ0ddeefdPZ1ddCefdQZ2dŐd1ed.efdRZ3i fd?efdSZ4i fd?efdTZ5dddi fd?eded1ed.efdUZ6dddi fd?eded1ed.efdVZ7dddi fd?eded1ed.efdWZ8i fdXZ9dY Z:g fdefdZZ;ded?exdefd[Z<dȐdWefd\Z=ddjefd]Z>d^ Z?dd_Z@ddeefd`ZAdŐd1ed.efdaZBddCefdbZCdϐdeee         deecded1ed.ef
dcZDdddi fdexd1ed.efddZEd͐deffdeZFd͐deffdfZGd͐deffdgZHd?edefdhZIdi fd!ediefdjZJdddi ddfd!ed?exd1ed.edief
dkZKddddi fd!ed?exd1ed.edexf
dlZLddddi dfd!ed?exd1ed.edexf
dmZMdddi ddddfd!ed?exfdnZNdddi ddfd!ed?exfdoZOdp ZPddqegfdrZQds ZRdtekdueee         fdvZSdҐdefdwZTddxekdeefdyZUddeefdzZVdŐd{eeek         deed1ed.efd|ZWdd}ekdeefd~ZXdi fdCefdZYdȐdekdjedeefdZZdȐdeee         dexdexfdZ[dŐdeee         dCeee         dexde\fdZ]ddekdeefdZ^dŐdeee         dCeee         dexde\fdZ_ddekdeefdZ`dddddi fdeeec         dexdexdexd1ed.efdZadȐdekdedefdZbdefdZcdefdZddefdZeddi fd?ed1ed.efdZfd Zgdddi fdCed1ed.efdZhdd?ekdeefdZidŐdeee         dCedexde\fdZjdi fdJedexfdZkdddi fdexd1ed.efdZldi fd?edefdZmi fd?efdZndi fdCefdZodi fdedeHd(edexfdZpdi fd?exfdZqi fdΐeee         fdZrdddi fded?exd1ed.efdZsdi fdCefdZtddedefdZudekfdZvdeHfdZwdS (  rU   r   NFT  '          leakyBucket	tierBased
percentagetakermakerr}   r~   withdrawdeposittradingfundingr~   )r   r   zrMozilla/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*inf 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	accountIdloginpasswordtwofa
privateKeywalletAddresstoken   numberr      :123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzz
{([\w-]+)}BTCBCHBSV)XBTBCCBCHSVconfigc                 	   	  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        d n j         _         j        d n j         _         j        t	                      n j         _         j                                         n j         _        t*           _        t,           _                                          _        t3                       _                                                              |          }|D ]}t;           |          r]t=          t?           |          t                    r:tA           |                     t?           |          ||                              otA           |||                     !                                  "                    |d          s "                    |d          r #                    d           tI                     }tK                     D ]}|d         dk    r|d         dk    rd|v r|&                    d          }ddd	d
d	|d         d'                    	 fd|dd          D                       z   }t?           |          }t=          |tP          j)                  r tA          ||t?          ||                     t;           |          r|tA           ||           tA           ||            j*        s+ j+        r$tY                       _*         j         j*        _         j-        r j-        nt]          j/        t`                     _-        d S )NsandboxtestnetTr   _OHLCVLEBEADL)ohlcvlebeadlr   c              3   j   K   | ]-}                     |                    |                    V  .d S N)get
capitalize).0i
exceptionsrp   s     rr   	<genexpr>z$Exchange.__init__.<locals>.<genexpr>  s?      .h.hYZz~~aQRASAS/T/T.h.h.h.h.h.hrv   r   )1aiohttp_trust_env	trust_envrequests_trust_env	precisiondictlimitsr   headersbalance
orderbooksfundingRatestickersbidsaskstradestransactionsohlcvsliquidationsmyLiquidations
currenciesoptionsget_default_optionsr   r!   uuidoriginrY   	userAgentdeep_extenddescribehasattrrh   getattrsetattrafter_construct	safe_boolset_sandbox_modero   dirsplitjointypes
MethodTypesessionsynchronousrX   loggerlogging	getLoggerrk   )
rp   r   settingskeyclsrg   parts	camelcaseattrr   s
   `        @rr   __init__zExchange.__init__  sL   !%!7!I4>"&"9"KT^#'>#9t~ $ 3dfff$(O$;$&&&!%!5tvvv4<!%!5tvvv4<$(O$;$&&&&*&7&?DFFFTEV!%!5tvvv4<"&-"7T] $ 3dfff&*&7&?DFFFTEV $ 3dfff$($5$=DD4CT&*&9&AddtGZ$(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>>&),, 	(vy0Q0Q 	(!!$''' 4jjII 	7 	7DAw#~~$r(c//cTkk

3'.d$uUU
!!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| 	= 0 	="99DL%)%<DL"%)[Qdkkg6G6Q6Qrv   c                 |    | j         r4	 | j                                          d S # t          $ r}Y d }~d S d }~ww xY wd S r   )r   closeri   )rp   es     rr   __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.r   z())asyncio_loopidrp   s    rr   __repr__zExchange.__repr__  s(    d.?G**RH47RUYYYrv   c                     | j         S r   )rg   r  s    rr   __str__zExchange.__str__  s
    yrv   c                     d S r    )rp   r   s     rr   init_throttlerzExchange.init_throttler  s    rv   c                     t          |                                           }|| j        z
  }|dn|}| j        |z  }||k     r||z
  }t	          j        |dz             d S d S )Nr   g     @@)floatmillisecondslastRestRequestTimestamp	rateLimittimesleep)rp   r   nowelapsed
sleep_timedelays         rr   throttlezExchange.throttle  sx    D%%''((55Lqqd^d*
Z(EJuv~&&&&&  rv   utf-8pathencodingc                     |                      |           	 t          |d|          5 }|                                cddd           S # 1 swxY w Y   dS # t          $ r Y dS w xY w)z
        Read file contents (synchronous)
        :param str path: File path to read
        :param str encoding: File encoding (default: 'utf-8')
        :returns str|None: File contents as string, or None on error
        rr&  N)_ensure_whitelisted_fileopenreadri   )rp   r%  r&  files       rr   	read_filezExchange.read_file  s     	%%d+++	dC(333 #tyy{{# # # # # # # # # # # # # # # # # # 	 	 	44	s3   A A
A 
AA AA 
A%$A%datac                     |                      |           	 t          |d|          5 }|                    |           ddd           n# 1 swxY w Y   dS # t          $ r Y dS w xY w)z
        Write file contents (synchronous)
        :param str path: File path to write
        :param str data: Data to write
        :param str encoding: File encoding (default: 'utf-8')
        :returns bool: True if successful, False otherwise
        wr)  NTF)r*  r+  writeri   )rp   r%  r/  r&  r-  s        rr   
write_filezExchange.write_file  s     	%%d+++	dC(333 !t

4   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !4 	 	 	55	s3   A AA AA AA 
A&%A&c                     |                      |           	 ddl}|j                            |          S # t          $ r Y dS w xY w)z
        Check if file exists (synchronous)
        :param str path: File path to check
        :returns bool: True if file exists, False otherwise
        r   NF)r*  osr%  isfileri   )rp   r%  r5  s      rr   exists_filezExchange.exists_file  s\     	%%d+++	III7>>$''' 	 	 	55	s   5 
AAc                     t           j                            t          j                              }|                    t           j                  r|n|t           j        z   S r   )r5  r%  realpathtempfile
gettempdirendswithsep)rp   tmps     rr   get_temp_dirzExchange.get_temp_dir$  sC    gx24455ll26**<ssbf<rv   	file_pathc                     t           j                            |          }|                    |                                           r|                    d          rd S t          d|           )Nz	.ccxtfilezinvalid file path: )r5  r%  r9  
startswithr?  r<  
ValueError)rp   r@  	sanitizeds      rr   r*  z!Exchange._ensure_whitelisted_file(  sj    G$$Y//	 1 1 3 344 	9K9KK9X9X 	F:y::;;;rv   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deflaterG  r   rb	   )
infor   zlib
decompress	MAX_WBITSrF  GzipFileioBytesIOr,  )responsetextr&  s      rr   gzip_deflatezExchange.gzip_deflate.  s|    ==??&&'9::4449$$tdn_===}Rq"*T2B2BCCHHJJJrv   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_agentro   strr   set_headers)rp   r   r   s      rr   prepare_request_headersz Exchange.prepare_request_headers8  s    -R< 	1NN4</000t|$$$&*n&@DNNdo	 	*I#%%i89999y//T))	0I0Iy))))?;<<<(((rv   c                     t          |  d S r   )print)rp   argss     rr   logzExchange.logF  s    trv   c	                 *    |                                 S r   strip)	rp   codereasonurlmethodresponse_headersresponse_bodyrequest_headersrequest_bodys	            rr   on_rest_responsezExchange.on_rest_responseI  s    ""$$$rv   c                     | j         r(t          !t          j        |t          t                    S t          rt          j        |          S t          j        |          S )N)parse_float	parse_int)quoteJsonNumbersorjsonjsonloadsrW  )rp   rf  s     rr   on_json_responsezExchange.on_json_responseL  sP      	-V^:mLLLL 3|M222:m,,,rv   GETc                    |                      |          }|                     ||||          }|4|                    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	||||           |}d}d}|                                D ]S\  }}|                                }|d
k    r4|dk    r,|}d}|                                D ]\  }}||d|fffz  }d} n nT|||= t!          |           |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|||||           |r!tM          |tN                    s| j(        r||d<   |)                                 nZ# tT          $ r2}d+                    | j	        ||g          }tY          |          |d}~wtZ          $ r2}d+                    | j	        ||g          }t          |          |d}~wt\          $ r2}d+                    | j	        ||g          }t          |          |d}~wt^          $ rj}d+                    | j	        ||g          }| 0                    |||||||||	  	        }|s| 1                    |||||           t          |          |d}~wtd          $ rU}tg          |          d+                    | j	        ||g          }dv rtY          |          |ti          |          |d}~wtj          $ rA}tg          |          d+                    | j	        ||g          }ti          |          |d}~wtl          $ r}tg          |          dv rto          | j	        dz             d+                    | j	        ||g          }tq          fddD                       rti          |          |t          |          |d}~ww xY w| 0                    |||||||||	  	         ||S | 9                    |          r|S tM          |j:        tv                    r|j:        <                    d          S |j:        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 %szcontent-typezmultipart/form-datar    )r/  r   timeoutproxiesverifyfilesr$  z
fetch Response:zResponseHeaders:zResponseBody:z%s %s, Response: %s %s %sresponseHeaders 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   r  )r   xerror_strings     rr   r   z!Exchange.fetch.<locals>.<genexpr>  s(      jj1$jjjjjjrv   )
ECONNRESETzConnection aborted.zConnection broken:utf8)=rY  check_proxy_url_settingsrU  r   url_encoder_for_proxy_urlcheck_proxy_settingscheck_conflicting_proxiesry  r   r  verboser]  r   debugitemslowerr[  encoder   cookiesclearrequestrx  rz  validateServerSslr&  r   status_coderb  ri  rR  
parse_jsonenableLastHttpResponselast_http_responseenableLastJsonResponselast_json_responseenableLastResponseHeaderslast_response_headersrh   listreturnResponseHeadersraise_for_statusr[   r   r
   r\   r_   rZ   handle_errorshandle_http_status_coderequestsConnectionErrorrW  r   ConnectionResetErrorr]   r   anyis_text_responsecontentbytesdecode)rp   rc  rd  r   bodyrg  proxyUrlry  	httpProxy
httpsProxy
socksProxyproxyAgentSetrh  content_type_keyr{  kvlkhttp_responsehttp_status_codehttp_status_textjson_responserQ  r  detailsskip_further_error_handlingr  s                             @rr   fetchzExchange.fetchT  s    66w??00fgtLL""Hdk#:;;;T;;C@@@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 #))++ 	 	DAqB^##---'($E $

 4 411tQi.!33DEE $  01/""" 	!;;==D""$$$H	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 ;Zt%D%D ;Ic ;3:/0%%'''' 	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   -D1L   
U7*-MU7$-NU7-OU7A%P==U7
ARU7'<S##U70BU22U7c                     	 t                               |          r|                     |          S d S # t          $ r Y d S w xY wr   )rU   is_json_encoded_objectrq  rC  )rp   r  s     rr   r  zExchange.parse_json  s]    	..}== <,,];;;< < 	 	 	DD	s   .3 
A Ac                     |                     dd          }|                    d          p|                    d          S )NzContent-Typer   zapplication/jsonztext/)r   rB  )rp   r   content_types      rr   r  zExchange.is_text_response  s>    {{>266&&'9::^l>U>UV]>^>^^rv   c                 J    	 | |         }|d uo|dk    S # t           $ r Y dS w xY w)Nr   Fri   )
dictionaryr  values      rr   
key_existszExchange.key_exists  sF    	sOE$4"4 	 	 	55	s    
""c                 R    	 t          | |                   S # t          $ r |cY S w xY wr   r  ri   r  r  default_values      rr   
safe_floatzExchange.safe_float  s@    	!C))) 	! 	! 	!    	!s    &&c                 h    	 | |         }||dk    rt          |          S n# t          $ r Y nw xY w|S Nr   rW  ri   r  r  r  r  s       rr   safe_stringzExchange.safe_string  sQ    	sOE Ub[[5zz! 	 	 	D	s   " 
//c                     	 | |         }|'|dk    r!t          |                                          S n# t          $ r Y nw xY w||                                n|S r  )rW  r  ri   r  s       rr   safe_string_lowerzExchange.safe_string_lower  s    	sOE Ub[[5zz''))) 	 	 	D	(5(A}""$$$}T   04 
A Ac                     	 | |         }|'|dk    r!t          |                                          S n# t          $ r Y nw xY w||                                n|S r  )rW  upperri   r  s       rr   safe_string_upperzExchange.safe_string_upper  r  r  c                 l    	 t          t          | |                             S # t          $ r |cY S w xY wr   intr  ri   r  s      rr   safe_integerzExchange.safe_integer#  sJ    	! uZ_--... 	! 	! 	!    	!s   !$ 33c                 r    	 t          t          | |                   |z            S # t          $ r |cY S w xY wr   r  )r  r  factorr  s       rr   safe_integer_productzExchange.safe_integer_product-  sM    	!uZ_--6777 	! 	! 	!    	!s   $' 66c                 <    t                               | |d|          S Nrw  )rU   r  r  s      rr   safe_timestampzExchange.safe_timestamp4  s    ,,ZdMRRRrv   c                 N    	 | |         }||dk    r|S n# t           $ r Y nw xY w|S r  r  r  s       rr   
safe_valuezExchange.safe_value8  sJ    	sOE Ub[[ 	 	 	D	s    
""c                     	 t          | |                   S # t          $ r- 	 t          | |                   cY S # t          $ r |cY cY S w xY ww xY wr   r  r  key1key2r  s       rr   safe_float_2zExchange.safe_float_2E  s    	%D)*** 	% 	% 	%%Z-..... % % %$$$$$$%	%s)    
A9AA
A	A

Ac                     	 | |         }||dk    rt          |          S n# t          $ r Y nw xY w	 | |         }||dk    rt          |          S n# t          $ r Y nw xY w|S r  r  r  r  r  r  r  s        rr   safe_string_2zExchange.safe_string_2O  s    	t$E Ub[[5zz! 	 	 	D		t$E Ub[[5zz! 	 	 	D	s   " 
//A 
A A c                 l    t                               | |||          }||                                n|S r   )rU   r  r  r  s        rr   safe_string_lower_2zExchange.safe_string_lower_2_  2    &&z4}MM % 1u{{}}}u<rv   c                 l    t                               | |||          }||                                n|S r   )rU   r  r  r  s        rr   safe_string_upper_2zExchange.safe_string_upper_2d  r  rv   c                     	 t          t          | |                             S # t          $ r: 	 t          t          | |                             cY S # t          $ r |cY cY S w xY ww xY wr   r  r  s       rr   safe_integer_2zExchange.safe_integer_2i  s    	%uZ-../// 	% 	% 	%%5D!12233333 % % %$$$$$$%	%s,   !$ 
A(!AA(A$A(#A$$A(c                     	 t          t          | |                   |z            S # t          $ r= 	 t          t          | |                   |z            cY S # t          $ r |cY cY S w xY ww xY wr   r  )r  r  r  r  r  s        rr   safe_integer_product_2zExchange.safe_integer_product_2s  s    	%uZ-..7888 	% 	% 	%%5D!122V;<<<<< % % %$$$$$$%	%s,   $' 
A.$AA.A*%A.)A**A.c                 >    t                               | ||d|          S r  )rU   r  r  s       rr   safe_timestamp_2zExchange.safe_timestamp_2}  s    ..z4t][[[rv   c                     	 | |         }||dk    r|S n# t           $ r Y nw xY w	 | |         }||dk    r|S n# t           $ r Y nw xY w|S r  r  r  s        rr   safe_value_2zExchange.safe_value_2  s    	t$E Ub[[ 	 	 	D		t$E Ub[[ 	 	 	D	s    
""9 
AAc                     t                               | |          }||S 	 t          |          S # t          $ r}|cY d }~S d }~ww xY wr   )rU   get_object_value_from_key_listr  rC  )r  key_listr  r  r  s        rr   safe_float_nzExchange.safe_float_n  sg    77
HMM=  	!<< 	! 	! 	!       	!s   0 
AAAAc                 ^    t                               | |          }|t          |          n|S r   )rU   r  rW  r  r  r  r  s       rr   safe_string_nzExchange.safe_string_n  s,    77
HMM".s5zzzMArv   c                     t                               | |          }|!t          |                                          S ||S |                                S r   )rU   r  rW  r  r  s       rr   safe_string_lower_nzExchange.safe_string_lower_n  S    77
HMMu::##%%%"   &&(((rv   c                     t                               | |          }|!t          |                                          S ||S |                                S r   )rU   r  rW  r  r  s       rr   safe_string_upper_nzExchange.safe_string_upper_n  r  rv   c                     t                               | |          }||S 	 t          t          |                    S # t          $ r |cY S t
          $ r |cY S w xY wr   )rU   r  r  r  rC  rn   r  s       rr   safe_integer_nzExchange.safe_integer_n  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   )rU   r  rh   rW   r  rW  r  rC  )r  r  r  r  r  s        rr   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  )rU   r  )r  r  r  s      rr   safe_timestamp_nzExchange.safe_timestamp_n  s    ..z8T=YYYrv   c                 L    | |S t                               | |          }||n|S r   )rU   r  r  s       rr   safe_value_nzExchange.safe_value_n  s2      77
HMM)uu}<rv   c                 <   t          | t                    r$| j        }|D ]} ||          }|
|dk    r|c S nbt          | t                    rMt	          |           }|D ];}t          |t
                    r$d|cxk    r|k     rn '| |         }|
|dk    r|c S <d S Nr   r   )rh   r   r   r  lenr  )dictionary_or_listr  r   r  r  lengths         rr   r  z'Exchange.get_object_value_from_key_list  s    ($// 	%$(C ! !C$" LLL! *D11 	%+,,F % %c3'' %A,=,=,=,=v,=,=,=,=,=.s3E(Ub[[$trv   c                 <     | ||          }||n | |||          S )z/A helper-wrapper for the safe_value_2() family.r  )rd  r  r  r  r  r  s         rr   safe_eitherzExchange.safe_either  s2     z4(()uuvvj$/V/VVrv   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  rU   truncate_to_string)numr   decimal_precisions      rr   truncatezExchange.truncate  sY     q== $Y 7 7:c$55669JJJ8..sI>>???rv   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   r  decimal_digitss       rr   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
rv      c                 X    d                     t          j        | dz            |           S Nz{:0{}x}   r  randomgetrandbitsr  s    rr   uuid22zExchange.uuid22  '     26A: > >GGGrv   c                 X    d                     t          j        | dz            |           S r  r  r"  s    rr   uuid16zExchange.uuid16  r$  rv   c                  B    t          t          j                              S r   )rW  r   uuid4r  rv   rr   r   zExchange.uuid  s    4:<<   rv   	namespacec                 j    t          t          j        t          j        |           |                    S r   )rW  r   uuid5UUID)r)  rg   s     rr   r+  zExchange.uuid5  s&    4:di	22D99:::rv   c                 T    | r%| d                                          | dd          z   S | S Nr   r   )r  strings    rr   r   zExchange.capitalize  s2    
  	2!9??$$vabbz11rv   c                 *    |                                  S r   r_  r/  s    rr   r`  zExchange.strip!  s    ||~~rv   c                 ^    t          t          |                                                     S r   )r   sortedr  )r  s    rr   keysortzExchange.keysort%  s$    F:++--..///rv   c                      t          |           S r   r3  arrays    rr   sortzExchange.sort)  s    e}}rv   c                      | si S t          | d                   t          j        u rt          j                    ni }| D ]}|                    |           |S Nr   )ro   collectionsOrderedDictrU  r\  resultargs      rr   extendzExchange.extend-  sc     	I.247mm{?V.V.V(***\^ 	 	CMM#rv   
_all_dictsc                 d   d }d}|D ]}| st          |t                    r||si }d}|s$|                                D ]j\  }}|                    |          }t          |t                    r6t          |t                    r!t                              ||d          ||<   e|||<   k|}d}|S )NFTrB  )rh   r   r  r   rU   r   )rC  r\  r?  result_is_dictr@  r  r  currents           rr   r   zExchange.deep_extend7  s      	' 	'C 'ZT22 '>>F%)N  "%))++ , ,JC$jjooG!'400 ,Zt5L5L ,&.&:&:7EVZ&:&[&[s&+s, !&rv   c                 X    t                               |           } fd| D             S )Nc                 F    g | ]}|                               k    |S r  )r   )r   r  r  r  s     rr   
<listcomp>z&Exchange.filter_by.<locals>.<listcomp>Z  s-    888aAEE#JJ%$7$7$7$7$7rv   )rU   to_arrayr8  r  r  s    ``rr   	filter_byzExchange.filter_byW  s4    !!%((8888858888rv   c                 :    t                               | ||          S r   )rU   rL  rK  s      rr   filterByzExchange.filterBy\  s    !!%e444rv   c                     t          j        t                    }t                              |           D ]4}|                    |          }|||                             |           5|S r   )r<  defaultdictr  rU   rJ  r   append)r8  r  r?  entryr  s        rr   group_byzExchange.group_by`  sb    (..&&u-- 	, 	,EIIcNNE u$$U+++rv   c                 8    t                               | |          S r   )rU   rS  r8  r  s     rr   groupByzExchange.groupByi        ,,,rv   c                 8    t                               | |          S r   )rU   index_byrU  s     rr   index_by_safezExchange.index_by_safem  rW  rv   c                 p   i }t          | t                    r@t          t          |                                                                                     } t          |t
                    r(| D ]$}|t          |          k     r||         }||||<   %n!| D ]}|                    |          }||||<   |S r   )rh   r   r3  r  valuesr  r  r   )r8  r  r?  elementr  s        rr   rY  zExchange.index_byq  s    eT"" 	9..//6688Ec3 
	(  , ,W%%A}$+q		, ! ( (KK$$= 'F1Irv   c                 2    t          | fd|          S )Nc                 (    |          |          nS r   r  )r  rm   r  s    rr   <lambda>z"Exchange.sort_by.<locals>.<lambda>  s    QsV5G1S66W rv   r  reverser6  )r8  r  
descendingrm   s    ` `rr   sort_byzExchange.sort_by  s'    e!T!T!T!T!T^hiiiirv   c                 2    t          | fd|          S )Nc                 L    |          |          nd|          |          ndfS r  r  )r  r  r  s    rr   r`  z$Exchange.sort_by_2.<locals>.<lambda>  s7    qw7JAdGGPR_`ae_f_rTUVZT[T[xz+{ rv   ra  r6  )r8  r  r  rc  s    `` rr   	sort_by_2zExchange.sort_by_2  s7    e!{!{!{!{!{  FP  Q  Q  Q  	Qrv   c                     | |z   S r   r  )abs     rr   array_concatzExchange.array_concat  s    1urv   c                 
    | |v S r   r  )needlehaystacks     rr   in_arrayzExchange.in_array  s    !!rv   c                 (   | dS t          | d          r/t          | t          t          f          st	          |           dk    S t          | d          r>d t          |                                           D             }t	          |          dk    S dS )NT__len__r   __dict__c                 <    g | ]}|                     d           |S )r   )rB  )r   r  s     rr   rI  z%Exchange.is_empty.<locals>.<listcomp>  s)    PPPall3>O>OP1PPPrv   F)r   rh   rW  r  r  varskeys)rq   public_varss     rr   is_emptyzExchange.is_empty  s     ;4 3	"" 	!:cC<+H+H 	!s88q= 3
## 	)PPd3iinn&6&6PPPK{##q((urv   c                 @    t           j                            |           S r   )rU   extract_params_regexfindallr/  s    rr   extract_paramszExchange.extract_params  s    ,44V<<<rv   c                     t          |t                    rO|D ]L}t          ||         t                    s/|                     d|z   dz   t	          ||                             } M| S )N{})rh   r   r  replacerW  )r0  paramsr  s      rr   implode_paramszExchange.implode_params  sj    fd## 	O O O!&+t44 O#^^C#IOS=M=MNNFrv   c                     |                                  }|                                 D ]#\  }}t          |t                    r	|rdnd||<   $t	          j        ||t          j                  S )Ntruefalse)	quote_via)copyr  rh   bool
_urlencode	urlencodequote)r  doseqr9  	newParamsr  r  s         rr   r  zExchange.urlencode  sj    KKMM	 ,,.. 	> 	>JC%&& >+0!=g	##Iu
@PQQQQrv   z	%5B\d*%5Dc                 t    t           j                            dt                               | d                    S )Nr   T)rU   "_URLENCODE_WITH_ARRAY_REPEAT_REGEXsubr  )r  s    rr   urlencode_with_array_repeatz$Exchange.urlencode_with_array_repeat  s-    :>>r8CUCUV\^bCcCcdddrv   c                     i dfd	t          | t                    r| D ]} | |         |           t          j        dt          j                  S )Nc                 Z   i }t          | t                    r'| D ]#}d                    ||          }| |         ||<   $nRt          | t          t          f          r1t          |           D ] \  }}d                    ||          }|||<   !n| |<   |D ]}||         } ||           d S )Nz{}[{}])rh   r   r  r  tuple	enumerate)	r  p_keyencode_paramsr  
encode_keyoffsetr  _encode_paramsr?  s	          rr   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****+ +rv   z[])safer  r   )rh   r   r  r  r  )r  r  r  r?  s     @@rr   urlencode_nestedzExchange.urlencode_nested  s    	+ 	+ 	+ 	+ 	+ 	+ 	+ fd## 	1 1 1vc{C0000#FAQRRRRrv   c                 Z    t          j        t                              |                     S r   )r  unquoterU   r  )r  r9  s     rr   	rawencodezExchange.rawencode  s!    !("4"4V"<"<===rv   ~()*!.'c                 .    t          j        | |          S )N)r  )r  r  )urir  s     rr   encode_uri_componentzExchange.encode_uri_component  s    $////rv   c                     t          | t                    rE|                                 }|D ],}t          |          t          u r|D ]	}||v r||= 
%||v r||= -|S | S r   )rh   r   r  ro   r  )dr\  r?  r@  r  s        rr   omitzExchange.omit  s    a 
	VVXXF ( (99$$" , ,&== &s, f}}"3KMrv   c                 :    t          t          |                     S r   )r  setr7  s    rr   uniquezExchange.unique  s    CJJrv   c                  V    d}| D ]#}t          |t          t          f          r||z  }$|S r;  )rh   r  r  )r\  totalr@  s      rr   sumzExchange.sum  s;     	 	C#U|,, rv   c                     i }| D ]'^}}}|dk    r|                     |d          |z   ||<   (d |                                D             S )Nr   c                     g | ]	\  }}||g
S r  r  )r   r   volumes      rr   rI  z&Exchange.aggregate.<locals>.<listcomp>   s     EEEME6EEErv   )r   r  )bidasksorderedr   r  r   s        rr   	aggregatezExchange.aggregate  sa    !( 	@ 	@E6Azz!(UA!6!6!?EEW]]__EEEErv   c                  B    t          t          j                              S r   )r  r  r  rv   rr   secondszExchange.seconds  s    49;;rv   c                  .    t          j                    dz  S )N@B r  time_nsr  rv   rr   r  zExchange.milliseconds  s    |~~**rv   c                  .    t          j                    dz  S r  r  r  rv   rr   microsecondszExchange.microseconds  s    |~~&&rv   c                 d   | d S t          | t                    r| dk     rd S 	 t          j                            | dz  t          j        j                  }|j        dd|j        dd|j        dd|j	        dd|j
        dd|j        dd| dz  d	d
S # t          t          t          f$ r Y d S w xY w)Nr   rw  04d-02dT:r  03dZ)rh   r  datetimefromtimestamptimezoneutcyearmonthdayhourminutesecondrn   OverflowErrorOSError)	timestampr  s     rr   iso8601zExchange.iso8601  s5   4)S)) 	Y]]4	#11)t2CXEVEZ[[Ch  L  L  LSY  L  L  LSW  L  L  L38  L  L  LRUR\  L  L  Lcfcm  L  L  Lt}  AE  uE  L  L  L  L  L='2 	 	 	44	s   A0B B/.B/r  c                     t           j                             t          t          | dz                      t           j        j                  }|                    d|z   dz   |z   dz             S )Nrw  %mr  %Yr  r  r  roundr  r  strftimer  infixutc_datetimes      rr   dmyzExchange.dmy  s]    (66s5TAQ;R;R7S7SU]UfUjkk$$TE\D%85%@4%GHHHrv   c                     |rdnd}t           j                             t          t          | dz                      t           j        j                  }|                    ||z   dz   |z   dz             S )Nr  z%yrw  r  r  r  )r  r  fullYearyear_formatr  s        rr   ymdzExchange.ymd   sl    &0ddD(66s5TAQ;R;R7S7SU]UfUjkk$$[5%84%?%%G$%NOOOrv   c                 :    t                               | |d          S NFrU   r  r  r  s     rr   yymmddzExchange.yymmdd&  s    ||Iue444rv   c                 :    t                               | |d          S NTr  r  s     rr   yyyymmddzExchange.yyyymmdd*  s    ||Iud333rv   r}  c                     t           j                             t          t          | dz                      t           j        j                  }|                    d|z   dz             S )Nrw  z%Y-%m-%dz%H:%M:%Sr  r  s      rr   ymdhmszExchange.ymdhms.  sT    (66s5TAQ;R;R7S7SU]UfUjkk$$Z%%7*%DEEErv   c                    | d S t          | t                    sd S d| v rQ	 t          |           }|d S t          j        |d d                   dz  S # t
          t          t          f$ r Y d S w xY wt          	                    |           S )NGMT   rw  )
rh   rW  rV   calendartimegmrn   r  r  rU   	parse8601)r  parseds     rr   
parse_datezExchange.parse_date3  s    4)S)) 	4I"9-->4vbqbz22T99}g6   tt!!),,,s   A A A.-A.z([0-9]{4})-?([0-9]{2})-?([0-9]{2})(?:T|[\s])?([0-9]{2}):?([0-9]{2}):?([0-9]{2})(\.[0-9]{1,3})?(?:(\+|\-)([0-9]{2})\:?([0-9]{2})|Z)?c           
         | d S 	 t           j                            |           }|d S |                                \
  }}}}}}}}	}
}|r2|dd          }|ddt	          |          z
  z  z   }t          |          }nd}|	r/|	dk    rdnd}t          |
          |z  }t          |          |z  }nd}d}t          j        t          |          t          |          t          |          t          |          t          |          t          |                    }|t          j        ||          z   }t          j	        |
                                          dz  |z   S # t          t          t          t          f$ r Y d S w xY w)	Nr   r     r   +r   )hoursminutesrw  )rU   _PARSE8601_ISO8601_PATTERNsearchgroupsr  r  r  	timedeltar  r  utctimetuplern   r  r  rC  )r  matchyyyymmddhmsmssignr  r  msintoffset_signoffset_hoursoffset_minutesdts                    rr   r  zExchange.parse8601K  s   4	7>>yIIE}t>Cllnn;D"b!Q2tUG V#SWW--B #$(CKKbbQ"5zzK7!$W!; !""3t99c"ggs2wwAAPSTUPVPVWWBh(|^TTTTB?2??#4#455<uDD=':> 	 	 	44	s   !E D5E F ?F md5hexc                 (   |dk    r"t          t          j        |                     }n)t          j        ||           }|                                }|dk    rt                              |          S |dk    rt                              |          S |S )Nr:   base64r	  )	r  r:   SHA3hashlibnewdigestrU   binary_to_base64binary_to_base16)r  	algorithmr  binaryr  s        rr   hashzExchange.hashj  s      6;w//00FFIw//AXXZZFX,,V444u__,,V444rv   c                     t          j        || |          }|                                }|dk    rt                              |          S |dk    rt                              |          S |S )Nr	  r  )hmacr  r  rU   r  r  )r  r   r  r  r  r  s         rr   r  zExchange.hmacw  sc    HVWi00U??,,V444x,,V444rv   c                  6    t                      }| D ]}||z   }|S r   r  r>  s      rr   binary_concatzExchange.binary_concat  s*     	" 	"Cc\FFrv   c                 6    t                      }| D ]}||z   }|S r   r  )r8  r?  r]  s      rr   binary_concat_arrayzExchange.binary_concat_array  s+     	& 	&Gg%FFrv   c                 
   | }t          | t                    r4t                              |           }t                              |          }t          j        |                                                              d          S )N=)	rh   rW  rU   string_to_base64base64_to_binaryr  urlsafe_b64encoder  r  )r   payload	payload64s      rr   urlencode_base64zExchange.urlencode_base64  sj    a 	; 11!44I//	::G'007799@@EEErv   c                 Z    t                               t          j        |                     S r   )rU   r  r  standard_b64encoder   s    rr   r  zExchange.binary_to_base64  s    v8;;<<<rv   c                 *    t          j        |           S r   )r  standard_b64decoder&  s    rr   r  zExchange.base64_to_binary  s    (+++rv   c                 f    t                               t                               |                     S r   )rU   r  r  r&  s    rr   r  zExchange.string_to_base64  s"    ((););<<<rv   c                 Z    t                               t          j        |                     S r   )rU   r  r  	b64decoder&  s    rr   base64_to_stringzExchange.base64_to_string  s    v/22333rv   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             }ny|dk    r8t                              |                    d          |dd          }|d
z   |z   S t                              t                              |          |||         d          }|d
z   t                              |          z   S )Nr-  sha384sha512RSHSr  algJWT)r4  typkidnoncer  r      ESp256r(  @   r  r   Edr$  r7   Tr  )r  r-  r0  r1  rU   r  ro  r#  r  rsar  r9   base16_to_binaryrjusteddsar  )r  r   r  is_rsaoptsalgosr4  header_optsheaderencoded_headerencoded_datar   algoType	signaturerawSignatures                  rr   jwtzExchange.jwt  sV    nnn
 

 'tt49QRR=8D==T%[4u+C
 
 D==T%[4!%eKd??tG}8#'=K {!;!;<<!226::00wAWAW1X1XYY$|3qs8 
	bX%% 11(,,uhooV\F]F]_h2i2ijjII#>>%KKL 11,s2C2I2I"c2R2RUabeUfUlUlmoqtUuUu2uvvII u||G'<'<fiQUVVI3;** hooe&<&<feIFVX`aaIs{X66yAAAArv   c                    t          j                    t          j                    t          j                    d}||         }t	          t
                              |          d t          j                              }t
          	                    |
                    t
                              |           t          j                    |                    S )Nr/  )r5   SHA256SHA384SHA512r8   rU   r  r4   default_backendr  r  r6   PKCS1v15)r  r   r4  
algorithmsr  priv_keys         rr   r>  zExchange.rsa  s     moomoomoo
 


 sO	'(?(?xG_GaGabb((xw7O7OQXQaQcQcen)o)oppprv   c                 ,    t          j        | |          S r   )r;   r  )r   r\  s     rr   eth_abi_encodezExchange.eth_abi_encode  s    z%&&&rv   c                     t           j                            | ||          }t                              d|j        |j                  S )Ns   )r<   messagesencode_typed_datarU   r  rF  r  )domainmessageTypesmessageencodedDatas       rr   eth_encode_structured_dataz#Exchange.eth_encode_structured_data  s:    &88wWW%%k;3E{GWXXXrv   c                 >   t                               |           }t          j        t                              |                    }|j                            d          dd          }t          j	        |          dd          }d|
                                z   }|S )NF)
compressedr   i0x)rU   remove0x_prefix	coincurve
PrivateKeyr  fromhex
public_keyr  r:   r  r	  )private_keyclean_private_keyprivate_key_objpublic_key_bytesaddress_bytesaddress_hexs         rr    eth_get_address_from_private_keyz)Exchange.eth_get_address_from_private_key  s     %44[AA#.u}}=N/O/OPP*5<<<NNqrrR$455cdd;]..000rv   c                    t          |           }t          |          }t          |d          t          d          d|dg}t	          t          |d          ||          }|t          |          t          |          dS )Nr   
initializer9  r   )
class_hashconstructor_calldatasalt)r   	publicKeyaddress)r?   rC   r  rA   r@   r	  )rJ  accountClassHashaccountProxyClassHashr   rs  calldatart  s          rr   retrieve_stark_accountzExchange.retrieve_stark_account  s    7	BB
(44	 "%%"<00
 "0"55!)
 
 
 %Y7||
 
 	
rv   c           
      b   t          |                                          }t          |          dk    rt          d          | |d         t                              dddddddd	ddgi|          |d
}t          j        |          }|                    t          |d                    }|S )Nr   z5starknetEncodeStructuredData only support single typer   StarkNetDomainrg   felt)rg   ro   chainIdversion)rZ  primaryTyper   r\  r   )
r  ru  r  r   rU   rA  TypedDataDataclass	from_dictmessage_hashr  )rZ  r[  messageDatart  r   r  typedDataClassmsgHashs           rr   starknet_encode_structured_dataz(Exchange.starknet_encode_structured_data  s    \&&(())u::>>VWWW  8__ #V44&77&77#&   #
 
 ,5g>> --c'2.>.>??rv   c                     t          |t                    rt          |d          }t          | |          \  }}t                              t          |          t          |          g          S )Nr   )rh   rW  r  rB   rU   ro  r	  )msg_hashprir(  r   s       rr   starknet_signzExchange.starknet_sign  sY     c3 	c2,,C 3//1}}c!ffc!ff-...rv   c                      t          |           S r   r=   )os    rr   r>   zExchange.packb#  s    Qxxrv   c                     d| z  S )Nz%0.2Xr  )r  s    rr   int_to_base16zExchange.int_to_base16'  s    }rv   c                 L    t          t          j        | dz            d          S )N   r  r  r"  s    rr   random_byteszExchange.random_bytes+  s!    f(!44c:::rv   r;  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             |dk    r5t          .	 t          
                    | |||          S # t          $ r Y nw xY w||         }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 )a(  
        ECDSA signing with support for multiple algorithms and coincurve for SECP256K1.
        Args:
            request: The message to sign
            secret: The private key (hex string or PEM format)
            algorithm: The elliptic curve algorithm ('p192', 'p224', 'p256', 'p384', 'p521', 'secp256k1')
            hash: The hash function to use (defaults to algorithm-specific hash)
            fixed_length: Whether to ensure fixed-length signatures (for deterministic signing)
            Note: coincurve produces non-deterministic signatures
        Returns:
            dict: {'r': r_value, 's': s_value, 'v': v_value}
        Note:
            If coincurve is not available or fails for SECP256K1, the method automatically
            falls back to the standard ecdsa implementation.
        r-  r0  r1  )p192p224r;  p384p521	secp256k1z is not a supported algorithmr  Nr   r  Tcasefold   -----BEGIN EC PRIVATE KEY-----r   r   curve)hashfunc	sigencode   r9      )r  r  extra_entropyr(  r   r  )"r9   NIST192pNIST224pNIST256pNIST384pNIST521p	SECP256k1r   rc  rU   _ecdsa_secp256k1_coincurveri   r   r  r  r  r  	b16decoderh   rW  find
SigningKeyfrom_pemfrom_stringsign_digest_deterministicutilsigencode_strings_canonizesigdecode_stringsprivkeyordernumber_to_ler  	b16encoder  )r  r   r  r  fixed_lengthrS  
curve_infohash_functionencoded_requestr  r  r_binarys_binaryr  r_ints_intcounterminimum_size
half_orderr(  r   s                        rr   r9   zExchange.ecdsa/  s_   & ^X.^X.^X.^X.^X./84
 

 J&&#I0O$OPPP##	(=::7FDR^___     	*
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
 
 	
s   6B 
B B c                    t                               |           }|t                               ||d          }nt          j        |d          }t          |t                    rt                               |          }|                    d          dk    rgt          j        |                    dd                              dd                              d	d                              d
d          d          }nt          j        |d          }t          j
        |          }|                    |d          }|dd         }|dd         }	|d         }
t                               t          j        |                                                    }t                               t          j        |	                                                    }|||
dS )a  
        Use coincurve library for SECP256K1 ECDSA signing.
        This method provides faster SECP256K1 signing using the coincurve library,
        which is a Python binding to libsecp256k1. This implementation produces
        deterministic signatures (RFC 6979) using coincurve's sign_recoverable method.
        Args:
            request: The message to sign
            secret: The private key (hex string or PEM format)
            hash: The hash function to use
            fixed_length: Not used in coincurve implementation (signatures are always fixed length)
        Returns:
            dict: {'r': r_value, 's': s_value, 'v': v_value}
        Raises:
            ArgumentsRequired: If coincurve library is not available
        Nr  Tr  r  r   rv   s   -----END EC PRIVATE KEY-----   
   )hasherr  r<  r  )rU   r  r  r  r  rh   rW  r  r  rc  rd  sign_recoverabler  r  r  )r  r   r  r  r  r  rg  rJ  r  r  r  r(  r   s                rr   r  z#Exchange._ecdsa_secp256k1_coincurveu  s   " #//'22]]?D(CCFF%oEEEFfc"" 	-__V,,F;;899B>>%fnn5VX[&\&\&d&d  fE  GJ  'K  'K  'S  'S  TY  [^  '_  '_  'g  'g  hm  or  's  's  ~B  C  C  CFF %ft<<<F*622  000EE	SbS>RU#bMOOF,X6677==??OOF,X6677==??
 
 	
rv   returnc                 z    t          j        |                               d          }|                    d          S )Nr$  r  )r  r   r  r  )r/  encodeds     rr   binary_to_urlencoded_base64z$Exchange.binary_to_urlencoded_base64  s2    *40077@@~~c"""rv   r7   c                 z   t          |t                    rt                              |          }t	          |          dk    rt
          j                            |          nt          |d           }|	                    |           }|rt          
                    |          S t                              |          S )Nr  )rh   rW  rU   r  r  r7   Ed25519PrivateKeyfrom_private_bytesr8   r  r  r  )r  r   r  
url_encoderg  rJ  s         rr   rA  zExchange.eddsa  s    fc"" 	-__V,,FNQRXkk]_N_N_g/BB6JJJey  {A  CG  fH  fH$$W--	 	C77	BBB((333rv   c                     d}t          j        | d          } t          j        |d          }t          j        |||           }t                              |          S )Ns@                                                                   Tr  )r  r  rA  calculateSignaturerU   binary_to_base58)r  r   r  r   rJ  s        rr   axolotlzExchange.axolotl  sY    "7T:::!&4888,VVWEE	((333rv   c                     t           r't          j        |                               d          S t          j        | dt                    S )Nr$  ),r  )
separatorsr  )rn  dumpsr  ro  re   )r/  r  s     rr   ro  zExchange.json  s?     	6<%%,,W555z$:?KKKKrv   c                     	 t          | t                    o| d         dk    p| d         dk    S # t          $ r Y dS w xY w)Nr   r}  [F)rh   rW  ri   )inputs    rr   r  zExchange.is_json_encoded_object  sT    	uc**WqS0VeAhRUoX 	 	 	55	s   ,/ 
==c                 ,    |                      d          S Nr$  )r  r/  s    rr   r  zExchange.encode      }}W%%%rv   c                 ,    |                      d          S r  )r  r/  s    rr   r  zExchange.decode  r  rv   c                 t    t          |           t          u r!t          |                                           n| S r   )ro   r   r  r\  r  s    rr   rJ  zExchange.to_array  s-    '+E{{d':':tELLNN###Erv   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errorr?  major1minor1patch1major2minor2patch2
int_major1
int_minor1
int_patch1
int_major2
int_minor2
int_patch2s                  rr   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rv   c                 @   d|v sd|v rK|                     d          }|dk    r|                     d          }t          ||dz   d                     S |                     d          }|dk    rdS ||dz   d                              d          }t          |          S )Nr  Er   r   r  r   r  )r  r  r  r  )rp   rW  idxdot_idxdecimal_parts        rr   precision_from_stringzExchange.precision_from_string  s    #::((3--CbyyhhsmmC!GHH&&&&((3--b==17Q;<<(//44<   rv   c                     |S r   r  rp   r  s     rr   map_to_safe_mapzExchange.map_to_safe_map      rv   c                     |S r   r  r  s     rr   safe_map_to_mapzExchange.safe_map_to_map  r  rv   c                 :   |s/| j         r(| j        s|                     | j                   S | j         S d}| j        d         du r|                                 }|| j        d<   |                     |          }d| j        v r| j        d= |                     ||          S )a  
        Loads and prepares the markets for trading.

        Args:
            reload (bool): If True, the markets will be reloaded from the exchange.
            params (dict): Additional exchange-specific parameters for the request.

        Returns:
            dict: A dictionary of markets.

        Raises:
            Exception: If the markets cannot be loaded or prepared.

        Notes:
            It ensures that the markets are only loaded once, even if called multiple times.
            If the markets are already loaded and `reload` is False or not provided, it returns the existing markets.
            If a reload is in progress, it waits for completion before returning.
            If an error occurs during loading or preparation, an exception is raised.
        NfetchCurrenciesTcachedCurrencies)marketsmarkets_by_idset_marketshasfetch_currenciesr   fetch_markets)rp   reloadr  r   r  s        rr   load_marketszExchange.load_markets  s    (  	$| $) :++DL999|#
8%&$....00J/9DL+,$$V,,--/0444rv   c                 6    |                      | j                  S r   )rJ  r  rp   r  s     rr   r  zExchange.fetch_markets&  s    
 }}T\***rv   c                     | j         S r   )r   r  s     rr   r  zExchange.fetch_currencies-  s    
 rv   c                     i }i }| j         d         r|                                 }| j         d         r|                                 }||dS )NfetchTradingFeesfetchFundingFeesr   )r  fetch_trading_feesfetch_funding_fees)rp   r   r   s      rr   
fetch_feeszExchange.fetch_fees4  sc    8&' 	0--//G8&' 	0--//G
 
 	
rv   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 ' r1  i:	 r  iQ r  i  r  <   r   r   z"timeframe unit {} is not supported)r  r   r  )	timeframer   unitscales       rr   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~rv   c                 p    t                               |           dz  }||z  }||z
  |t          k    r|ndz   S )Nrw  r   )rU   r  r   )r  r  	directionr  r  s        rr   round_timeframezExchange.round_timeframeV  sA    %%i0047R6!9+@+@RRaHHrv   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)requiresEddsarA  r   r  r  s    rr   check_required_dependenciesz$Exchange.check_required_dependencies]  sG     	\%-tw  *[   [  \  \  \	\ 	\--rv   c                    t          j        t                              |          d          }t          j                            |t          j                  j        	                                }t          j        |          }dt                              t          j        |                    dd                                          z   S )NTr  ra  i)r  r  rU   r  r9   r  r  r  verifying_key	to_stringr:   r  r  r  r  )rp   r   private_key_bytesrj  public_key_hashs        rr   privateKeyToAddresszExchange.privateKeyToAddressa  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Vrv   c                 6    | d d         dk    r
| dd          S | S )Nr9  ra  r  r  s    rr   rb  zExchange.remove0x_prefixg  s(    !99rv   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    rr   
hex_to_decz!Exchange.totp.<locals>.hex_to_deco  s    qr???"rv   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_paddingr6   paddeds       rr   base32_to_bytesz&Exchange.totp.<locals>.base32_to_bytesr  sQ    !!ffqjO-<q-@-@a/))aGWWYY#-0F#F+++rv      r  bigr}  r   r	  r   r9  i)	r  r  rU   r  to_bytesr  r  sha1rW  )r  r)  r.  epochhmac_resr  otps          rr   totpzExchange.totpm  s    	# 	# 	#	, 	, 	, DIKK  B&==5!9!9??3;;WZ\^K_K_;`;`bibnpuvvHRL))A-**Xffqj&89::ZGHH233xrv   c                 H    t          |                               |d          S )Nlittler  r2  r(  sizes     rr   r  zExchange.number_to_le~  s    1vvtX...rv   c                 H    t          |                               |d          S )Nr0  r:  r;  s     rr   number_to_bezExchange.number_to_be  s    1vvtU+++rv   c                 ,    t          j        | d          S r  )r  r  r&  s    rr   r?  zExchange.base16_to_binary  s    4(((rv   c                 ~    t                               t          j        |                                                     S r   )rU   r  r  r  r  r&  s    rr   r  zExchange.binary_to_base16  s+    v/223399;;;rv   c                 0    t          j        |dz            S r  )r  r  )rp   r  s     rr   r  zExchange.sleep  s    z,-...rv   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  r0  )	rU   base58_decoderbase58_encoderr  base58_alphabetranger  r2  
bit_length)r   r   cr?  s       rr   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Erv   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      rC  r   )	rU   rF  rE  r  rG  divmodrQ  rb  r   )rj  r   rJ  r?  byter0  next_characters          rr   r  zExchange.binary_to_base58  s    "*&(H#&(H#!(":;; / /1-.'*-.'** 	 	DeOFdNFFqjj%+FB%7%7"FNMM(1.ABBB qjj 	wwvrv   c                 Z    ||S 	 |                      |          S # t          $ r |cY S w xY wr   )r   ri   )rp   r  rm   s      rr   parse_numberzExchange.parse_number  sG    =N{{5)))   s    **c                 j    	 ||dk    rd S t          |          dk    rd S |S # t          $ r |cY S w xY wr  r  )rp   string_numbers     rr   	omit_zerozExchange.omit_zero  sa    	!$(;(;t]##q((t   	! 	! 	!    	!s   # # # 22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   )rp   marketro   sider   r   r  s          rr   check_order_argumentszExchange.check_order_arguments  sL    =w'2o(opppQ;;tw)SSTTT ;rv   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}  )rW  httpExceptionsr  )rp   ra  rb  rc  rd  r  codeAsString
ErrorClasss           rr   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 /.rv   c                 n    t          j        |                     d                    }|r|dk    r|dz
  S |S )Nr  l        l        )binasciicrc32r  )r0  signedunsigneds      rr   ra  zExchange.crc32  s?    >&--"7"788 	x:--k))Orv   c                 Z    t          |t                    r|n|                     |          S r   )rh   r  rA  )rp   rq   s     rr   clonezExchange.clone  s'     d++AssS1A1AArv   c                 N    t          |t                    rt          |          n|S r   )rh   rW  r  rp   r  s     rr   convert_to_big_intzExchange.convert_to_big_int  s!    's33>s5zzz>rv   c                      t          |          S r   )r  rg  s     rr   string_to_chars_arrayzExchange.string_to_chars_array  s    E{{rv   c                 
    |d uS r   r  rg  s     rr   value_is_definedzExchange.value_is_defined  s    D  rv   c                 .    |r
|||         n	||d          S r   r  )rp   r8  firstr  s       rr   array_slicezExchange.array_slice  s#    &,?uU6\""%-?rv   c                 F    t          ||          rt          ||          n|S r   )r   r   )rp   rq   propertydefaultValues       rr   get_propertyzExchange.get_property  s&    )0h)?)?QwsH%%%\Qrv   c                 (    t          |||           d S r   )r   )rp   rq   rq  r  s       rr   set_propertyzExchange.set_property  s    Xu%%%%%rv   c           	         dt          |          j        z   dz   |rt          |          n7d                    t	          t          |          ||j        d                    z   }t          dt          |                    }|d|         S )Nr  z] r   r  )rW  i r   )ro   rk   rW  r   r   __traceback__r   r  )rp   excinclude_stackr\  r  s        rr   exception_messagezExchange.exception_message  s    S		**T1  6ZSXXXTVT[T[\lmqrumvmvx{  ~A  ~O  WX  ]Y  ]Y  ]Y  UZ  UZ  [VS\\**qx  rv   c                 R    t          j        dd|                                          S )Nz(?!^)([A-Z]+)z_\1)rer  r  rp   rW  s     rr   un_camel_casezExchange.un_camel_case  s"    vovs3399;;;rv   c                     |                     dd          }|                     dd          }|                     dd          }|S )N\r   z"{r}  z}"r~  )r  )rp   r  modifiedContents      rr   fix_stringified_json_membersz%Exchange.fix_stringified_json_members  sG    
 "//$33)11$<<)11$<<rv   c                 F    |                      | j        |          | _        d S r   )rA  r   )rp   
newOptionss     rr   extend_exchange_optionsz Exchange.extend_exchange_options  s    {{4<<<rv   c                     i S r   r  r  s    rr   create_safe_dictionaryzExchange.create_safe_dictionary      	rv   c                     |S r   r  r  s     rr   convert_to_safe_dictionaryz#Exchange.convert_to_safe_dictionary  r  rv   c                 t    t          d                    d t          |          D                                 S )Nr   c                 R    g | ]$}t          t          j        d d                    %S )r   rI  )rW  r   randint)r   r   s     rr   rI  z(Exchange.rand_number.<locals>.<listcomp>  s,    KKK!Cq! 4 455KKKrv   )r  r   rH  )rp   r<  s     rr   rand_numberzExchange.rand_number  s1    277KKuT{{KKKLLMMMrv   c                      t          |          S r   )r  )rp   r  s     rr   binary_lengthzExchange.binary_length  s    6{{rv   seedsc                    t           t          d          |                     |d          }t          |                     |                     |                     |          dd                    d          }d}d}||z  |z  }||z  }t          |                     |d          d	          |z  }t          |                     |d
                    t          d	          t          d          z  z                      t          d          d          }	t          |                     |d                    t          d	          t          d          z  z                      t          d          d          }
t          |                     |d                    t          d          z                      t          d          d          }t          |                     |d                    t          d          z                      t          d          d          }t          j	        t          |          t          d          t          |          t          |          t          | 
                    |d                    |
                                |	                                |                     |d          dk    t          |          t          |          d          }t          j        |          }t                              |                    d                    }t          j                                        |          }|                    |                                          }|j        }|S )Nrzklink_sdk is not installed, please do pip3 install apexomni-arm or apexomni-x86-mac or apexomni-x86-windows-linuxslotIdr-  r	  r   l    l    r   r  r   18r   r   )roundingr<  takerFeeRatery   r   makerFeeRatepairIdr  BUYFra  )
zklink_sdkri   r  r  rb  r  r  r`   quantizeContractBuildersafe_numberr  Contractr  re  removeprefixZkLinkSignernew_from_seed
sign_musig	get_bytesrJ  )rp   r  r  r  nonceInt	maxUint64	maxUint32r8  r   priceStrsizeStrtakerFeeRateStrmakerFeeRateStrbuildertx	seedsByte
signerSeed	auth_datarJ  s                      rr   get_zk_contract_signature_objz&Exchange.get_zk_contract_signature_obj  s&     Q  R  R  R!!&(33t++DIIdkk&6I6I8UZ,[,[\\^`aa(		Y&)39$((==rBBYN	D,,VW==>>PWX\P]P]A]]gghopqhrhr  ~Jg  K  K4++FF;;<<wr{{gVZmm?[[eefmnofpfp  |He  I  I"4#3#3FN#K#KLLwW\~~]gghopqhrhr  ~Hg  I  I"4#3#3FN#K#KLLwW\~~]gghopqhrhr  ~Hg  I  I,	NNCFFCKKUSAQAQRXZbAcAc=d=dOOx//1143C3CFK3X3X\a3a  #o"6"6? ?  ))MM%"4"4T":":;;	,..<<YGG
))",,..99	'	rv   c                    t           t          d          |                     |dd          }|                     |d          rod}t	          |                     |                     |                     |          dd                    d          }t          j	        t          |          |          }t          j        t	          |                     |d	d
                    |                     |d          t	          |                     |dd
                    t	          |                     |dd
                    t	          |                     |dd
                    |                     |dd          |                     |dd          |                     |          t	          |                     |dd
                    	  	        }t          j        |          }t                              |                    d                    }t          j                                        |          }	|	                    |                                          }
|
j        }|S )Nr  r8  r  
isContract
4294967295r-  r	  r   zkAccountIdr   receiverAddresssubAccountIdreceiverSubAccountIdtokenIdr   feetimestampSecondsra  )r  ri   r  r   r  rb  r  r  r"   
string_modrW  TransferBuilderr  parse_to_intTransferr  re  r  r  r  r  r  rJ  )rp   r  r  r8  formattedUint32formattedNonce
tx_builderr  r  r  r  rJ  s               rr   get_zk_transfer_signature_objz&Exchange.get_zk_transfer_signature_obj;  s     Q  R  R  R  #66>>&,// 	M*O !5!5diiE@R@RT\^c6d6d!e!egijjN&s>':':OLLE/  ::;;V%677  ;;<<  )?CCDD  A6677VXs33VUC00e$$  );Q??@@

 


  ,,MM%"4"4T":":;;	,..<<YGG
))",,..99	'	rv   c                 V    t          |t                    pt          |t                    S r   )rh   r  	bytearray)rp   r\  s     rr   is_binary_messagezExchange.is_binary_messageX  s!    '5))KZ-K-KKrv   c                    t          d          }d|v r|}n(|                    |                     |                    }|                    |          }t	          j        |                                          }|                                                                	                                }|
                                                                	                                }|||dS )Nenglishr}  )mnemonicr   rs  )rE   to_mnemonicr?  to_seedrF   FromSeedDeriveDefaultPathrd  RawToBytes	PublicKeyRawCompressed)rp   entropymnemor  seedkeyPairr   rs  s           rr   retrieve_dydx_credentialsz"Exchange.retrieve_dydx_credentials[  s    ##'>>HH(()>)>w)G)GHHH}}X&&.&&88::''))--//7799
%%''5577??AA	 $"
 
 	
rv   c                     d S r   r  r  s    rr   load_dydx_protoszExchange.load_dydx_protosk  s    rv   c                     |S r   r  )rp   r  s     rr   to_dydx_longzExchange.to_dydx_longn  s    
rv   c                    t           st          | j        dz             t          |          g}t          ||          }t	          t          t          d|d          |                     |          t          t          j        t          j
                                      gi           }t          ||d	g
          }|                     |                                          S )Nz requires protobuf and pycryptodome to encode messages, please install it with `pip install "protobuf==5.29.5"` and `pycryptodome==3.18.0`)rX  memo/cosmos.crypto.secp256k1.PubKeytypeUrlr  modesinglerf  sequence	mode_infosigner_infosr  rv   )r  	auth_info
signatures)rP   r   r  rN   rH   rL   r  rJ   SinglerG   SIGN_MODE_UNSPECIFIEDrM   r  SerializeToString)	rp   r\  r  r  rs  rX  r  r  r  s	            rr   encode_dydx_tx_for_simulationz&Exchange.encode_dydx_tx_for_simulationq  s    	wtw  *v   v  w  w  w 

 
 
 
 ,#D!*. .     "..x88&ho8Ca.b.b.bccc  	 
 
 
	 TYC5AAA$$R%9%9%;%;<<<rv   c                 *   t           st          | j        dz             |g dd}g }|'|                    t          dd|id                     t          |          g}|                                 }	t          |||          }
t          t          t          d|d	         d          |                     |	          t          t          j
        t          j        
                              gt          |d         |d                             }t          |                     |d                   |                                |
                                |          }|                     |                                dd          }||gS )N^ requires protobuf to encode messages, please install it with `pip install "protobuf==5.29.5"`r  )r   gasLimitz%/dydxprotocol.accountplus.TxExtensionselected_authenticatorsr  )rX  r  non_critical_extension_optionsr  pub_keyr  r  r  r   r  )r   	gas_limitr  account_number)r  auth_info_bytes
body_byteschain_idr-  r	  )rP   r   r  rQ  r  rN   rH   rL   r  rJ   r  rG   SIGN_MODE_DIRECTrI   rK   r  r  )rp   r\  r  r|  r<   authenticatorsr  r  rX  r  r  r  signDocsigningHashs                 rr   encode_dydx_tx_for_signingz#Exchange.encode_dydx_tx_for_signing  s    	Ktw  *J   J  K  K  K;# C *,&%*11-B-~A A 3 3     

 $$&&+I
 
 

 ,#D!(!3. .     "..x88&ho8C\.].].]^^^  	 3x=C
ODDD
 
 
	 ,,W5E-FGG%7799--//	
 
 
 ii 9 9 ; ;XuMMW%%rv   c                     t           st          | j        dz             t          |j        |j        |                     |          g          }d|                     |                                          z   S )Nr  )r  r  r  ra  )	rP   r   r  rO   r  r  base16ToBinaryr  r  )rp   r  rJ  r  s       rr   encode_dydx_tx_rawzExchange.encode_dydx_tx_raw  s     	Ktw  *J   J  K  K  K#3)++I667
 
 

 d++B,@,@,B,BCCCCrv   c                     d S r   r  r  s    rr   lock_idzExchange.lock_id      trv   c                     d S r   r  r  s    rr   	unlock_idzExchange.unlock_id  r  rv   c                     dS r  r  r  s    rr    is_lighter_library_path_requiredz)Exchange.is_lighter_library_path_required  r  rv   c                 4    |                      |||||          S r   )load_lighter_library_helper)rp   r%  r|  r   apiKeyIndexaccountIndexs         rr   rQ   zExchange.load_lighter_library  s    //gz;Xdeeerv   c                    |t          | j        dz             t          j                            |          st          | j        dz             t          |          }|                     | j        d         d                   }|                    |	                    d          |	                    d          |||          }|At          |                              d          rt          dt          |          z             |S )NaC   load_lighter_library() requires a path to the lighter library. You can find it here https://github.com/elliottech/lighter-python/tree/main/lighter/signers. Please download the appropriate library for your system and provide the path to it.
Example: exchange.options["libraryPath"] = "path/to/lighter-signer-linux-arm64.so"z  the library path does not existapipublicr$  r  z9load_lighter_library(): Failed to create lighter signer: )r   r  r5  r%  r6  rQ   implode_hostnameurlsCreateClientr  rW  r  ri   )	rp   r%  r|  r   r  r  lighterSignerrc  ress	            rr   r
  z$Exchange.load_lighter_library_helper  s   <tw  *p   p  q  q  qw~~d## 	Mtw)KKLLL,T22##DIe$4X$>??((JJwg&&
 
 ?s3xx}}W55?WZ]^aZbZbbcccrv   c                    |d         }t           t          |          z  }g }|D ]w}|                    t          t          |d                   |d         |d         |d         |d         |d         |d         |d	         |d
         |d         
  
                   x || }t	          |                    |d         |t          |          |d         |d         |d                             \  }}	}
}||	gS )Nordersmarket_indexclient_order_indexbase_amountavg_execution_priceis_ask
order_typetime_in_forcereduce_onlytrigger_priceorder_expiry)
MarketIndexClientOrderIndex
BaseAmountPriceIsAskTypeTimeInForce
ReduceOnlyTriggerPriceOrderExpirygrouping_typer8  api_key_indexaccount_index)rT   r  rQ  r  rR   SignCreateGroupedOrders)rp   signerr  r  arr_type
orders_arrr  orders_carrtx_typetx_infotx_hashr  s               rr   "lighter_sign_create_grouped_ordersz+Exchange.lighter_sign_create_grouped_orders  s0   "#c&kk1
 	 	E.n 566!&';!< /12Ho<(!/2 /"?3!.1       h
++9&:X:XO$k3v;;@PRYZiRjls  uD  mE;
 ;
 , ,('5 !!rv   c                 h   t          |                    t          |d                   |d         |d         |d         |d         |d         |d         |d         |d	         |d
         |d         |d         |d                             \  }}}}|rt          dt	          |          z             ||gS )Nr  r  r  r  r  r  r  r  r  r   r8  r,  r-  z/lighter_sign_create_order() failed with error: )rR   SignCreateOrderr  ri   rW  rp   r/  r  r3  r4  r5  r  s          rr   lighter_sign_create_orderz"Exchange.lighter_sign_create_order  s    +9&:P:P'((()M")*HL!O$M"O$N#GO$O$;
 ;
 , ,('5  	\MPSTYPZPZZ[[[!!rv   c           
          t          |                    |d         |d         |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nr  order_indexr8  r,  r-  z/lighter_sign_cancel_order() failed with error: )rR   SignCancelOrderri   rW  r9  s          rr   lighter_sign_cancel_orderz"Exchange.lighter_sign_cancel_order	  s    +9&:P:PN#M"GO$O$;
 ;
 , ,('5  	\MPSTYPZPZZ[[[!!rv   c                     t          |                    |d         |d         |d         |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nasset_index
route_typer   r8  r,  r-  z+lighter_sign_withdraw() failed with error: )rR   SignWithdrawri   rW  r9  s          rr   lighter_sign_withdrawzExchange.lighter_sign_withdraw	  s    +9&:M:MM"L!HGO$O$;
 ;
 , ,('5  	XICPUJJVWWW!!rv   c                     t          |                    |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nr8  r,  r-  z5lighter_sign_create_sub_account() failed with error: )rR   SignCreateSubAccountri   rW  r9  s          rr   lighter_sign_create_sub_accountz(Exchange.lighter_sign_create_sub_account,	  sx    +9&:U:UGO$O$;
 ;
 , ,('5
  	bSVYZ_V`V``aaa!!rv   c           
          t          |                    |d         |d         |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nr  r  r8  r,  r-  z4lighter_sign_cancel_all_orders() failed with error: )rR   SignCancelAllOrdersri   rW  r9  s          rr   lighter_sign_cancel_all_ordersz'Exchange.lighter_sign_cancel_all_orders6	  s    +9&:T:TO$FOGO$O$;
 ;
 , ,('5  	aRUXY^U_U__```!!rv   c                    t          |                    |d         |d         |d         |d         |d         |d         |d         |d                             \  }}}}|rt          d	t          |          z             ||gS )
Nr  indexr  r   r  r8  r,  r-  z/lighter_sign_modify_order() failed with error: )rR   SignModifyOrderri   rW  r9  s          rr   lighter_sign_modify_orderz"Exchange.lighter_sign_modify_orderB	  s    +9&:P:PN#GM"GO$GO$O$	;
 	;
 	, 	,('5  	\MPSTYPZPZZ[[[!!rv   c                 $   t          |                    |d         |d         |d         |d         |d         |d         |d         |d         |d	         |d
         
  
                  \  }}}}|rt          dt          |          z             ||gS )Nto_account_indexr@  from_route_typeto_route_typer   usdc_feer  r8  r,  r-  z+lighter_sign_transfer() failed with error: )rR   SignTransferri   rW  r9  s          rr   lighter_sign_transferzExchange.lighter_sign_transferQ	  s    +9&:M:M&'M"%&O$HJFOGO$O$;
 ;
 , ,('5  	XICPUJJVWWW!!rv   c                     t          |                    |d         |d         |d         |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nr  initial_margin_fractionmargin_moder8  r,  r-  z2lighter_sign_update_leverage() failed with error: )rR   SignUpdateLeverageri   rW  r9  s          rr   lighter_sign_update_leveragez%Exchange.lighter_sign_update_leverageb	  s    +9&:S:SN#-.M"GO$O$;
 ;
 , ,('5  	_PSVW\S]S]]^^^!!rv   c                     t          |                    |d         |d         |d                             \  }}|rt          dt          |          z             |S )Ndeadliner,  r-  z/lighter_create_auth_token() failed with error: )rS   CreateAuthTokenri   rW  )rp   r/  r  authr  s        rr   lighter_create_auth_tokenz"Exchange.lighter_create_auth_tokeno	  sm    !&"8"8JO$O$#
 #
  e
  	\MPSTYPZPZZ[[[rv   c                     t          |                    |d         |d         |d         |d         |d         |d                             \  }}}}|rt          dt          |          z             ||gS )Nr  usdc_amountr  r8  r,  r-  z0lighter_sign_update_margin() failed with error: )rR   SignUpdateMarginri   rW  r9  s          rr   lighter_sign_update_marginz#Exchange.lighter_sign_update_marginy	  s    +9&:Q:QN#M"K GO$O$;
 ;
 , ,('5  	]NQTUZQ[Q[[\\\!!rv   c                    i dd dd dd ddddd| j         d	d
dd
dd
dd
di dddddd dd dd dd dd dd dd dd dd dd dd dd dd dddd 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 d0d i d1dd2dd3d d4d d5d d6d d7d d8d d9dd:d d;d d<d d=d d>d d?d d@d dAd i dBd dCd dDd dEd dFd dGd dHd dId dJd dKd dLd dMd dNd dOd dPd dQd dRd i dSdTdUd dVd dWd dXd dYd dZdd[d d\d d]d d^d d_d d`d dad dbd dcd ddd i ded dfd dgd dhd did djd dkd dld dmd dndTdodTdpd dqd drd dsd dtd dud i dvd dwd dxd dyd dzd d{d d|d d}d d~d dd dd dd dd dd dd dddd i dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd i dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd i dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd i dd dd dd dddd dd dd dd dd dddd dd dd dd dd dd dd i dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd i dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd i dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd idd d d d d d dd dddd
d
d
d
d
d
d
d
d
dd di dd d d d d dd d i i dd	d
d d d dd i dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          dt          t          t          t          t
          t
          t          t          t          dddd t          t          d d d!d d d!d d d!d d d!d"d#d$	S (%  Nr  rg   	countriesenableRateLimitTr  rx   rx  	certifiedFproaliasdexr  	publicAPI
privateAPICORSr   spotmarginswapfutureoption	addMarginborrowCrossMarginborrowIsolatedMarginborrowMargincancelAllOrderscancelAllOrdersWscancelOrdercancelOrderWithClientOrderIdcancelOrderWscancelOrderscancelOrdersWithClientOrderIdcancelOrdersWscloseAllPositionsclosePositioncreateDepositAddresscreateLimitBuyOrdercreateLimitBuyOrderWscreateLimitOrdercreateLimitOrderWscreateLimitSellOrdercreateLimitSellOrderWscreateMarketBuyOrdercreateMarketBuyOrderWscreateMarketBuyOrderWithCostcreateMarketBuyOrderWithCostWscreateMarketOrdercreateMarketOrderWscreateMarketOrderWithCostcreateMarketOrderWithCostWscreateMarketSellOrdercreateMarketSellOrderWscreateMarketSellOrderWithCostcreateMarketSellOrderWithCostWscreateOrdercreateOrderWscreateOrders$createOrderWithTakeProfitAndStopLoss&createOrderWithTakeProfitAndStopLossWscreatePostOnlyOrdercreatePostOnlyOrderWscreateReduceOnlyOrdercreateReduceOnlyOrderWscreateStopLimitOrdercreateStopLimitOrderWscreateStopLossOrdercreateStopLossOrderWscreateStopMarketOrdercreateStopMarketOrderWscreateStopOrdercreateStopOrderWscreateTakeProfitOrdercreateTakeProfitOrderWscreateTrailingAmountOrdercreateTrailingAmountOrderWscreateTrailingPercentOrdercreateTrailingPercentOrderWscreateTriggerOrdercreateTriggerOrderWsr   	editOrderemulatededitOrderWithClientOrderId
editOrderseditOrderWsfetchAccountsfetchADLRankfetchBalancefetchBalanceWsfetchBidsAsksfetchBorrowInterestfetchBorrowRatefetchBorrowRateHistoriesfetchBorrowRateHistoryfetchBorrowRatesfetchBorrowRatesPerSymbolfetchCanceledAndClosedOrdersfetchCanceledOrdersfetchClosedOrderfetchClosedOrdersfetchClosedOrdersWsfetchConvertCurrenciesfetchConvertQuotefetchConvertTradefetchConvertTradeHistoryfetchCrossBorrowRatefetchCrossBorrowRatesr  fetchCurrenciesWsfetchDepositfetchDepositAddressfetchDepositAddressesfetchDepositAddressesByNetworkfetchDepositsfetchDepositsWithdrawalsfetchDepositsWsfetchDepositWithdrawFeefetchDepositWithdrawFeesfetchFundingHistoryfetchFundingRatefetchFundingRateHistoryfetchFundingIntervalfetchFundingIntervalsfetchFundingRatesfetchGreeksfetchIndexOHLCVfetchIsolatedBorrowRatefetchIsolatedBorrowRatesfetchMarginAdjustmentHistoryfetchIsolatedPositionsfetchL2OrderBookfetchL3OrderBookfetchLastPricesfetchLedgerfetchLedgerEntryfetchLeveragefetchLeveragesfetchLeverageTiersfetchLiquidationsfetchLongShortRatiofetchLongShortRatioHistoryfetchMarginModefetchMarginModesfetchMarketLeverageTiersfetchMarketsfetchMarketsWsfetchMarkOHLCVfetchMyLiquidationsfetchMySettlementHistoryfetchMyTradesfetchMyTradesWs
fetchOHLCVfetchOHLCVWsfetchOpenInterestfetchOpenInterestsfetchOpenInterestHistoryfetchOpenOrderfetchOpenOrdersfetchOpenOrdersWsfetchOptionfetchOptionChain
fetchOrderfetchOrderWithClientOrderIdfetchOrderBookfetchOrderBooksfetchOrderBookWsfetchOrdersfetchOrdersByStatusfetchOrdersWsfetchOrderTradesfetchOrderWsfetchPositionfetchPositionADLRankfetchPositionsADLRankfetchPositionHistoryfetchPositionsHistoryfetchPositionWsfetchPositionModefetchPositionsfetchPositionsWsfetchPositionsForSymbolfetchPositionsForSymbolWsfetchPositionsRiskfetchPremiumIndexOHLCVfetchSettlementHistoryfetchStatusfetchTickerfetchTickerWsfetchTickersfetchMarkPricesfetchTickersWs	fetchTimefetchTradesfetchTradesWsfetchTradingFeer  fetchTradingFeesWsfetchTradingLimitsfetchTransactionFeefetchTransactionFeesfetchTransactionsfetchTransferfetchTransfersfetchUnderlyingAssetsfetchVolatilityHistoryfetchWithdrawAddressesfetchWithdrawalfetchWithdrawalsfetchWithdrawalsWsfetchWithdrawalWhitelistreduceMarginrepayCrossMarginrepayIsolatedMarginsetLeverage	setMarginsetMarginModesetPositionModesignIntransferwatchBalancewatchMyTrades
watchOHLCVwatchOHLCVForSymbolswatchOrderBookwatchBidsAskswatchOrderBookForSymbolswatchOrderswatchOrdersForSymbolswatchPositionwatchPositionswatchStatuswatchTickerwatchTickerswatchTradeswatchTradesForSymbolswatchLiquidationswatchLiquidationsForSymbolswatchMyLiquidationsunWatchOrdersunWatchTradesunWatchTradesForSymbolsunWatchOHLCVForSymbolsunWatchOrderBookForSymbolsunWatchPositionsunWatchOrderBookunWatchTickersunWatchMyTradesunWatchTickerunWatchOHLCVwatchMyLiquidationsForSymbolsr   wsr  )logor  wwwdocfeesr  requiredCredentialsr   r  r   
timeframesr|   r   r   ok)statusupdatedetarc  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   i`  )	rX  r\  r   r\  commonCurrenciesprecisionModepaddingModer   rollingWindowSize)	rx  r   r	   r   r   r
   r   r   r   r  s    rr   r   zExchange.describe	  s\   P
$P
DP
 P
 t	P

 P
 t|P
 P
 5P
 UP
 5P
  pTpdp p 4	p
 p $p p $p $p Tp $Tp 'p p "4p $Tp  t!p" /#p p$  %p& 'p( 0)p* !$+p, $T-p.  /p0 '1p2 &t3p4 (5p6 #D7p8 %d9p: ';p< )$=p> '?p@ )$ApB /CpD 1$Ep p pF $TGpH &tIpJ ,TKpL .tMpN (OpP *4QpR 0SpT 24UpV tWpX  YpZ [p\ 7]p^ 9$_p` &tapb (cpd (epf *4gp p ph 'ipj )$kpl &tmpn (opp (qpr *4spt "4upv $Twpx (ypz *4{p| ,T}p~ .tp@ -dApB /CpD %dEpF 'GpH 4Ip p pJ ZKpL -dMpN dOpP tQpR  SpT UpV WpX !$YpZ  [p\ &t]p^ "4_p` +Dapb )$cpd #Depf ,Tgph /ipj &tkp p pl #Dmpn $Topp &tqpr )$spt $Tupv $Twpx +Dypz '{p| (}p~ ":p@ $ZApB CpD &tEpF (GpH 1$IpJ  KpL +DMp p pN "4OpP *4QpR +DSpT &tUpV #DWpX *4YpZ '[p\ (]p^ $T_p` tapb "4cpd *4epf +Dgph /ipj )$kpl #Dmpn #Dop p pp "4qpr tspt #Dupv  wpx !$ypz %d{p| $T}p~ &tp@ -dApB "4CpD #DEpF +DGpH IpJ !$KpL !$MpN &tOpP +DQp p pR  SpT "4UpV dWpX YpZ $T[p\ %d]p^ +D_p` !$apb "4cpd $Tepf tgph #Dipj dkpl .tmpn !$opp "4qpr #Dsp p pt tupv &twpx  ypz #D{p| }p~  p@ 'ApB (CpD 'EpF (GpH "4IpJ $TKpL !$MpN #DOpP *4QpR ,TSpT %dUp p pV )$WpX )$YpZ t[p\ t]p^  _p` apb "4cpd !$epf Tgph tipj  kpl "4mpn #Dopp %dqpr %dspt &tupv 'wp p px $Typz  {p| !$}p~ (p@ )$ApB )$CpD "4EpF #DGpH %dIpJ +DKpL MpN #DOpP &tQpR tSpT TUpV  WpX "4Yp p pZ $[p\ D]p^ _p`  apb dcpd 'epf !$gph  ipj +Dkpl tmpn (opp  qpr !$spt tupv twpx ypz t{p p p| (}p~ $Tp@ .tApB &tCpD  EpF  GpH *4IpJ )$KpL -dMpN #DOpP #DQpR !$SpT "4UpV  WpX YpZ 0[p\ D]p p^ d_p pP
x  yP
F 4GP
H ""!#!&$ $IP
` taP
b "cP
d $eP
j "&"&!!	  "&"& "!	   	  }~ ( +	
 + + + + + + + + + + +  +!" +#$ ,++%%***3  8 ! ! '%$(66"&t44!%d33 $T22	  "'_
P
 P
 P
 P	
rv   ru  rr  c                 b    |                      |||          }t          |t                    r|S |S zm
 @ignore
        safely extract boolean value from dictionary or list
        :returns bool | None:
        )r  rh   r  rp   dictionaryOrListru  rr  r  s        rr   safe_bool_nzExchange.safe_bool_n   s9     !!"2D,GGeT"" 	Lrv   r  r  c                 4    |                      |||g|          S rd  )rg  rp   r  r  r  rr  s        rr   safe_bool_2zExchange.safe_bool_2        
T4L,GGGrv   r  c                 b    |                      |||          }t          |t                    r|S |S rd  )r  rh   r  rp   r  r  rr  r  s        rr   r   zExchange.safe_bool  s6     
C>>eT"" 	Lrv   c                 j    |                      |||          }||S t          |t                    r|S |S zl
 @ignore
        safely extract a dictionary from dictionary or list
        :returns dict | None:
        )r  rh   r   re  s        rr   safe_dict_nzExchange.safe_dict_n  D     !!"2D,GG=eT"" 	Lrv   c                 j    |                      |||          }||S t          |t                    r|S |S ro  )r  rh   r   rm  s        rr   	safe_dictzExchange.safe_dict+  sA     
C>>=eT"" 	Lrv   c                 4    |                      |||g|          S ro  )rp  ri  s        rr   safe_dict_2zExchange.safe_dict_28  rk  rv   c                 j    |                      |||          }||S t          |t                    r|S |S zi
 @ignore
        safely extract an Array from dictionary or list
        :returns Array | None:
        )r  rh   r  re  s        rr   safe_list_nzExchange.safe_list_n@  rq  rv   c                 4    |                      |||g|          S rw  )rx  )rp   rf  r  r  rr  s        rr   safe_list_2zExchange.safe_list_2M  s!      04,MMMrv   c                 j    |                      |||          }||S t          |t                    r|S |S rw  )r  rh   r  )rp   rf  r  rr  r  s        rr   	safe_listzExchange.safe_listU  sB      0#|DD=eT"" 	Lrv   c                 ~    t          dt          |                    D ]}|                     |||                    d S r;  )rH  r  handle_delta)rp   	orderbookdeltasr   s       rr   handle_deltaszExchange.handle_deltasb  sH    q#f++&& 	4 	4Ai3333	4 	4rv   c                 0    t          | j        dz             )Nz handleDelta not supported yetr   r  )rp   booksidedeltas      rr   r~  zExchange.handle_deltaf      47%EEFFFrv   r9  bookSidepriceKey	amountKeycountOrIdKeyc                     t          dt          |                    D ]5}|                     ||         |||          }|                    |           6d S r;  )rH  r  parse_bid_ask
storeArray)rp   r  r  r  r  r  r   bidAsks           rr   handle_deltas_with_keysz Exchange.handle_deltas_with_keysi  s_    q#f++&& 	( 	(A''q	8YUUF''''	( 	(rv   c                     dS )Nr   r  )rp   r  r  s      rr   get_cache_indexzExchange.get_cache_indexn  s    rrv   arraysOfArraysc                     g }t          dt          |                    D ]}|                     |||                   }|S r;  )rH  r  rk  )rp   r  r?  r   s       rr   arrays_concatzExchange.arrays_concatr  sK    q#n--.. 	B 	BA&&v~a/@AAFFrv   c                     || j         }t          |                                          }t          dt	          |                    D ]}||         }||         |k    r|c S d S r;  )rZ  r  ru  rH  r  )rp   r  rZ  ru  r   r  s         rr   find_timeframezExchange.find_timeframex  sp    JJOO%%&&q#d))$$ 	 	Aq'C#)++


 ,trv   rc  rd  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  )	rp   rc  rd  r   r  usedProxiesr  r  joinedProxyNamess	            rr   r  z!Exchange.check_proxy_url_settings  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&tw1a'adt't  xQ  (Q  R  R  Rrv   	targetUrlc                 j    |                     d          dk    }|r|                     |          n|}|S )N?r   )r  r  )rp   r  includesQueryfinalUrls       rr   r  z"Exchange.url_encoder_for_proxy_url  s:    !s++q0;HW4,,Y777irv   c                    g }d }d }d }|                      | j                  }	|                      | j                  }
|	s|
r%|                    d           |	r| j        n| j        }|                      | j                  }|                      | j                  }|s|rG|                    d           |r|                     ||||          n|                     ||||          }|                      | j                  }|                      | j                  }|s|r%|                    d           |r| j        n| j        }|                      | j                  }|                      | j	                  }|s|rG|                    d           |r|                     ||||          n| 	                    ||||          }|                      | j
                  }|                      | j                  }|s|r%|                    d           |r| j
        n| j        }|                      | j                  }|                      | j                  }|s|rG|                    d           |r|                     ||||          n|                     ||||          }t          |          }|dk    r2d                    |          }t!          | j        d	z   |z   d
z             |||gS )Nr  httpProxyCallbackr  httpsProxyCallbackr  socksProxyCallbackr   r  r  zy), please use only one from: httpProxy, httpsProxy, httpProxyCallback, httpsProxyCallback, socksProxy, socksProxyCallback)rl  r  
http_proxyrQ  r  http_proxy_callbackr  https_proxyr  https_proxy_callbackr  socks_proxyr  socks_proxy_callbackr  r   r   r  )rp   rc  rd  r   r  r  r  r  r  isHttpProxyDefinedisHttp_proxy_definedishttpProxyCallbackDefinedishttp_proxy_callback_definedisHttpsProxyDefinedisHttps_proxy_definedishttpsProxyCallbackDefinedishttps_proxy_callback_definedisSocksProxyDefinedisSocks_proxy_definedissocksProxyCallbackDefinedissocks_proxy_callback_definedr  r  s                          rr   r  zExchange.check_proxy_settings  s   	

!224>BB#44T_EE 	R!5 	R{+++*<Q$/I%)%:%:4;Q%R%R"(,(=(=d>V(W(W%% 	c)F 	c2333Nh  c..sFGTJJJnr  oG  oG  HK  MS  U\  ^b  oc  ocI"33DODD $ 5 5d6F G G 	V"7 	V|,,,,?UTEUJ&*&;&;D<S&T&T#)-)>)>t?X)Y)Y&& 	g*H 	g3444Pk  g00fgtLLLqu  rK  rK  LO  QW  Y`  bf  rg  rgJ"33DODD $ 5 5d6F G G 	V"7 	V|,,,,?UTEUJ&*&;&;D<S&T&T#)-)>)>t?X)Y)Y&& 	g*H 	g3444Pk  g00fgtLLLqu  rK  rK  LO  QW  Y`  bf  rg  rgJ[!!A::"xx44&tw1a'adt't  xs  (s  t  t  t:z22rv   c                    g }d }d }d }|                      | j                  }|                      | j                  }|s|r%|                    d           |r| j        n| j        }|                      | j                  }|                      | j                  }|s|r%|                    d           |r| j        n| j        }|                      | j                  }	|                      | j                  }
|	s|
r%|                    d           |	r| j        n| j        }t          |          }|dk    r2d	                    |          }t          | j        dz   |z   dz             |||gS )NwsProxywssProxywsSocksProxyr   r  r  z<), please use only one from: wsProxy, wssProxy, wsSocksProxy)rl  r  ws_proxyrQ  r  	wss_proxyr  ws_socks_proxyr  r   r   r  )rp   r  r  r  r  isWsProxyDefinedis_ws_proxy_definedisWssProxyDefinedis_wss_proxy_definedisWsSocksProxyDefinedis_ws_socks_proxy_definedr  r  s                rr   check_ws_proxy_settingsz Exchange.check_ws_proxy_settings  s   00>>"33DMBB 	L2 	Ly)))'7KdlldmG 11$-@@#44T^DD 	P 4 	Pz***):Ot}}H $ 5 5d6G H H$($9$9$:M$N$N!  	a$= 	a~...1F`4,,TM`L[!!A::"xx44&tw1a'adt't  xv  (v  w  w  w<00rv   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  )rp   r  proxyUrlSets      rr   r  z"Exchange.check_conflicting_proxies  sP     	j[ 	j&tw  2i  (i  j  j  j	j 	j 	j 	jrv   rt  c                    |t          | j        dz             |                     |                     |                    }t	          |          }|dk    s1t	          |          | j        k     s|                    d          dk    rBt          | j        dz   t          | j                  z   dz   t          |          z   dz             |S )Nz address is Noner   r}  r   z% address is invalid or has less than z characters: "")r   r  r  rj  r  minFundingAddressLengthr  rW  )rp   rt  	uniqCharsr  s       rr   check_addresszExchange.check_address  s    ? +=!=>>>[[!;!;G!D!DEE	YQ;;#g,,)EEEVYIZIZ]_I_I_ +R!RUXY]YuUvUv!v  zJ  "J  MP  QX  MY  MY  "Y  \_  "_  `  `  `rv   r]  c                    g }t          |j                                                  }t          dt	          |                    D ]8}||         }|                    |          dk    r|                    |           9|S r;  )r  futuresru  rH  r  r  rQ  )rp   clientr]  r?  messageHashesr   messageHashs          rr   find_message_hasheszExchange.find_message_hashes  s~    V^002233q#m,,-- 	+ 	+A'*K((A--k***rv   r  r8  rW  	fromStartc                    |                      |          rt          |          }|dk    rd}||d         v r)|d         |         }||dz
           |         }||||k    }|r:||k    r|}|r|                     |d|          }nI|                     ||           }n1|r|                     ||           }n|                     |d|          }|S )Nr   Tr   )rl  r  ro  )	rp   r8  rW  r  r  arrayLength	ascendingrn  lasts	            rr   filter_by_limitzExchange.filter_by_limit  s     '' 	Be**KQ 	58OO!!HSME q1#6D(T-=$)TM	 B{** +  @ $ 0 05 A A $ 0 0 ? ? ! B $ 0 0 ? ? $ 0 05 A Arv   sincec                    |                      |          }|                     |          }|}|r]g }t          dt          |                    D ]=}	||	         }
|                     |
|          }|r||k    r|                    |
           >|r||                     ||           S | o|}|                     ||||          S r;  rl  rJ  rH  r  r  rQ  ro  r  )rp   r8  r  rW  r  tailsinceIsDefinedparsedArrayr?  r   rR  r  shouldFilterFromStarts                rr   filter_by_since_limitzExchange.filter_by_since_limit   s    ..u55mmE** 	)F1c+..// ) )#As33 )eunnMM%((( 	4E%##FUF333 %) ;^##FE38MNNNrv   fieldc                    |                      |          }|                      |          }	|                     |          }
|
}|s|	r}g }t          dt          |
                    D ]]}|
|         }||         |k    }|r|nd}|                     ||          }|o	|d uo||k    }|	r|nd}|r|r|                    |           ^|r||                     ||           S |                     ||||	          S )Nr   Tr  )rp   r8  r  r  r  rW  r  r  valueIsDefinedr  r  r?  r   rR  entryFiledEqualValuefirstConditionentryKeyValueentryKeyGESincesecondConditions                      rr   filter_by_value_since_limitz$Exchange.filter_by_value_since_limit2  s7   ..u55..u55mmE** 
	)^ 
	)F1c+..// ) )#A',U|u'<$9G!Q!5!5T $s ; ;#0"fuD7H"f}`eOe5C"M//! )o )MM%((( 	4E%##FUF333##FE3GGGrv   enabledc                    |rd| j         v rt          | j         d         t                    r+| j         d         | j         d<   | j         d         | j         d<   nh|                     | j         d                   | j         d<   |                     | j         d                   | j         d<   nt	          | j        dz             d| _        dS d| j         v rt          | j         d         t                    r| j         d         | j         d<   n(|                     | j         d                   | j         d<   |                     | j         d          }|| _         d| _        dS dS )z
        set the sandbox mode for the exchange
        :param boolean enabled: True to enable sandbox mode, False to disable it
        testr  	apiBackupz does not have a sandbox URLTFN)r  rh   rW  re  r   r  isSandboxModeEnabledr  )rp   r  newUrlss      rr   r   zExchange.set_sandbox_modeG  sO   
  	.""di.44 E-1Yu-=DIk*'+y'8DIe$$-1ZZ	%8H-I-IDIk*'+zz$)F2C'D'DDIe$$"47-K#KLLL(,D%%%DI%%$)E*C00 F#'9[#9	%  #'::di.D#E#E	% ii	;77GDI(-D%%% &%rv   enablec                 0   | j         rt          | j        dz             |r+| j        d         | j        d<   | j        d         | j        d<   n@d| j        v r7| j        d         | j        d<   |                     | j        d          }|| _        || j        d<   dS )z
        enables or disables demo trading mode
        :param boolean [enable]: True if demo trading should be enabled, False otherwise
        z demo trading does not support in sandbox environment. Please check https://www.binance.com/en/support/faq/detail/9be58f73e5e14338809e3b705b9687dd to see the differencesr  apiBackupDemoTradingdemoenableDemoTradingN)r  r   r  r  r  r   )rp   r  r  s      rr   enable_demo_tradingzExchange.enable_demo_tradingb  s    
 $ 	Vtw  *U   U  V  V  V 	 04	%0@DI,-#y0DIe#ty00#y)?@DIeii	+ABBGDI,2()))rv   r  r  r   r  c                     i S r   r  )rp   r%  r  rd  r  r   r  s          rr   r  zExchange.signr  r  rv   c                 0    t          | j        dz             )Nz% fetchAccounts() is not supported yetr  r  s     rr   fetch_accountszExchange.fetch_accountsu      47%LLMMMrv   symbolc                 0    t          | j        dz             )Nz# fetchTrades() is not supported yetr  rp   r  r  rW  r  s        rr   fetch_tradeszExchange.fetch_tradesx      47%JJKKKrv   c                 0    t          | j        dz             )Nz% fetchTradesWs() is not supported yetr  r  s        rr   fetch_trades_wszExchange.fetch_trades_ws{  r  rv   c                 |    | j         d         r|                     |g|||          S t          | j        dz             )NrF  z) watchLiquidations() is not supported yet)r  watch_liquidations_for_symbolsr   r  r  s        rr   watch_liquidationszExchange.watch_liquidations~  sE    812 	W66xvVVV47%PPQQQrv   symbolsc                 0    t          | j        dz             )Nz3 watchLiquidationsForSymbols() is not supported yetr  rp   r  r  rW  r  s        rr   r  z'Exchange.watch_liquidations_for_symbols      47%ZZ[[[rv   c                 |    | j         d         r|                     |g|||          S t          | j        dz             )NrS  z+ watchMyLiquidations() is not supported yet)r  !watch_my_liquidations_for_symbolsr   r  r  s        rr   watch_my_liquidationszExchange.watch_my_liquidations  sF    834 	Z996(E5RXYYY47%RRSSSrv   c                 0    t          | j        dz             )Nz5 watchMyLiquidationsForSymbols() is not supported yetr  r	  s        rr   r  z*Exchange.watch_my_liquidations_for_symbols  s    47%\\]]]rv   c                 0    t          | j        dz             )Nz# watchTrades() is not supported yetr  r  s        rr   watch_tradeszExchange.watch_trades  r  rv   c                 0    t          | j        dz             )Nz% unWatchOrders() is not supported yetr  rp   r  r  s      rr   un_watch_orderszExchange.un_watch_orders  r  rv   c                 0    t          | j        dz             )Nz% unWatchTrades() is not supported yetr  r  s      rr   un_watch_tradeszExchange.un_watch_trades  r  rv   c                 0    t          | j        dz             )Nz- watchTradesForSymbols() is not supported yetr  r	  s        rr   watch_trades_for_symbolsz!Exchange.watch_trades_for_symbols      47%TTUUUrv   c                 0    t          | j        dz             )Nz/ unWatchTradesForSymbols() is not supported yetr  rp   r  r  s      rr   un_watch_trades_for_symbolsz$Exchange.un_watch_trades_for_symbols      47%VVWWWrv   c                 0    t          | j        dz             )Nz/ watchMyTradesForSymbols() is not supported yetr  r	  s        rr   watch_my_trades_for_symbolsz$Exchange.watch_my_trades_for_symbols  r  rv   c                 0    t          | j        dz             )Nz- watchOrdersForSymbols() is not supported yetr  r	  s        rr   watch_orders_for_symbolsz!Exchange.watch_orders_for_symbols  r  rv   symbolsAndTimeframesc                 0    t          | j        dz             )Nz, watchOHLCVForSymbols() is not supported yetr  )rp   r!  r  rW  r  s        rr   watch_ohlcv_for_symbolsz Exchange.watch_ohlcv_for_symbols      47%SSTTTrv   c                 0    t          | j        dz             )Nz. unWatchOHLCVForSymbols() is not supported yetr  )rp   r!  r  s      rr   un_watch_ohlcv_for_symbolsz#Exchange.un_watch_ohlcv_for_symbols      47%UUVVVrv   c                 0    t          | j        dz             )Nz0 watchOrderBookForSymbols() is not supported yetr  rp   r  rW  r  s       rr   watch_order_book_for_symbolsz%Exchange.watch_order_book_for_symbols      47%WWXXXrv   c                 0    t          | j        dz             )Nz2 unWatchOrderBookForSymbols() is not supported yetr  r  s      rr   un_watch_order_book_for_symbolsz(Exchange.un_watch_order_book_for_symbols      47%YYZZZrv   c                 0    t          | j        dz             )Nz( unWatchPositions() is not supported yetr  r  s      rr   un_watch_positionszExchange.un_watch_positions      47%OOPPPrv   c                 0    t          | j        dz             )Nz% unWatchTicker() is not supported yetr  r  s      rr   un_watch_tickerzExchange.un_watch_ticker  r  rv   c                 0    t          | j        dz             )Nz( unWatchMarkPrice() is not supported yetr  r  s      rr   un_watch_mark_pricezExchange.un_watch_mark_price  r1  rv   c                 0    t          | j        dz             )Nz) unWatchMarkPrices() is not supported yetr  r  s      rr   un_watch_mark_priceszExchange.un_watch_mark_prices      47%PPQQQrv   codesc                 0    t          | j        dz             )Nz- fetchDepositAddresses() is not supported yetr  rp   r9  r  s      rr   fetch_deposit_addressesz Exchange.fetch_deposit_addresses  r  rv   c                 0    t          | j        dz             )Nz& fetchOrderBook() is not supported yetr  rp   r  rW  r  s       rr   fetch_order_bookzExchange.fetch_order_book      47%MMNNNrv   c                 0    t          | j        dz             )Nz( fetchOrderBookWs() is not supported yetr  r>  s       rr   fetch_order_book_wszExchange.fetch_order_book_ws  r1  rv   c                     | j         d         r-|                     |g|          }|                     ||          S t          | j        dz             )Nr  z' fetchMarginMode() is not supported yet)r  fetch_margin_modesrs  r   r  )rp   r  r  marginModess       rr   fetch_margin_modezExchange.fetch_margin_mode  sT    8&' 	T116(FCCK>>+v666tw)RRSSSrv   c                 0    t          | j        dz             )Nz( fetchMarginModes() is not supported yetr  r  s      rr   rD  zExchange.fetch_margin_modes  r1  rv   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 )Nr9  
maxRetriesr  r   r   )handle_optionrH  r?  ri   )rp   r  rW  r  fetchSnapshotMaxRetriesr   	orderBookr  s           rr   fetch_rest_order_book_safez#Exchange.fetch_rest_order_book_safe  s    "&"4"45E|UV"W"W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 yetr  r>  s       rr   watch_order_bookzExchange.watch_order_book  r@  rv   c                 0    t          | j        dz             )Nz( unWatchOrderBook() is not supported yetr  r  s      rr   un_watch_order_bookzExchange.un_watch_order_book  r1  rv   c                 0    t          | j        dz             )Nz! fetchTime() is not supported yetr  r  s     rr   
fetch_timezExchange.fetch_time      47%HHIIIrv   c                 0    t          | j        dz             )Nz* fetchTradingLimits() is not supported yetr  r  s      rr   fetch_trading_limitszExchange.fetch_trading_limits      47%QQRRRrv   rawCurrencyc                 0    t          | j        dz             )Nz% parseCurrency() is not supported yetr  )rp   rX  s     rr   parse_currencyzExchange.parse_currency  r  rv   c                     i }|                      |          }t          dt          |                    D ]*}|                     ||                   }|d         }|||<   +|S )Nr   ra  )rJ  rH  r  rZ  )rp   rawCurrenciesr?  arrr   r  ra  s          rr   parse_currencieszExchange.parse_currencies  sg    mmM**q#c((## 	" 	"A((Q00F&>D!F4LLrv   rX  c                 0    t          | j        dz             )Nz# parseMarket() is not supported yetr  )rp   rX  s     rr   parse_marketzExchange.parse_market  r  rv   c                     g }t          dt          |                    D ]0}|                    |                     ||                              1|S r;  )rH  r  rQ  r`  )rp   r  r?  r   s       rr   parse_marketszExchange.parse_markets  sR    q#g,,'' 	9 	9AMM$++GAJ778888rv   tickerc                 0    t          | j        dz             )Nz# parseTicker() is not supported yetr  )rp   rc  rX  s      rr   parse_tickerzExchange.parse_ticker  r  rv   currencyc                 0    t          | j        dz             )Nz+ parseDepositAddress() is not supported yetr  )rp   depositAddressrf  s      rr   parse_deposit_addresszExchange.parse_deposit_address      47%RRSSSrv   tradec                 0    t          | j        dz             )Nz" parseTrade() is not supported yetr  rp   rk  rX  s      rr   parse_tradezExchange.parse_trade       47%IIJJJrv   transactionc                 0    t          | j        dz             )Nz( parseTransaction() is not supported yetr  )rp   rp  rf  s      rr   parse_transactionzExchange.parse_transaction  r1  rv   r4  c                 0    t          | j        dz             )Nz% parseTransfer() is not supported yetr  )rp   r4  rf  s      rr   parse_transferzExchange.parse_transfer  r  rv   r<   c                 0    t          | j        dz             )Nz$ parseAccount() is not supported yetr  )rp   r<   s     rr   parse_accountzExchange.parse_account	      47%KKLLLrv   itemc                 0    t          | j        dz             )Nz( parseLedgerEntry() is not supported yetr  )rp   rx  rf  s      rr   parse_ledger_entryzExchange.parse_ledger_entry  r1  rv   r  c                 0    t          | j        dz             )Nz" parseOrder() is not supported yetr  rp   r  rX  s      rr   parse_orderzExchange.parse_order  ro  rv   c                 0    t          | j        dz             )Nz- fetchCrossBorrowRates() is not supported yetr  r  s     rr   fetch_cross_borrow_ratesz!Exchange.fetch_cross_borrow_rates  r  rv   c                 0    t          | j        dz             )Nz0 fetchIsolatedBorrowRates() is not supported yetr  r  s     rr   fetch_isolated_borrow_ratesz$Exchange.fetch_isolated_borrow_rates  r+  rv   c                 0    t          | j        dz             )Nz0 parseMarketLeverageTiers() is not supported yetr  rp   rJ  rX  s      rr   parse_market_leverage_tiersz$Exchange.parse_market_leverage_tiers  r+  rv   c                 0    t          | j        dz             )Nz* fetchLeverageTiers() is not supported yetr  r  s      rr   fetch_leverage_tierszExchange.fetch_leverage_tiers  rW  rv   positionc                 0    t          | j        dz             )Nz% parsePosition() is not supported yetr  )rp   r  rX  s      rr   parse_positionzExchange.parse_position  r  rv   c                 0    t          | j        dz             )Nz/ parseFundingRateHistory() is not supported yetr  r  s      rr   parse_funding_rate_historyz#Exchange.parse_funding_rate_history!  r  rv   rJ  c                 0    t          | j        dz             )Nz+ parseBorrowInterest() is not supported yetr  r  s      rr   parse_borrow_interestzExchange.parse_borrow_interest$  rj  rv   c                 0    t          | j        dz             )Nz/ parseIsolatedBorrowRate() is not supported yetr  r  s      rr   parse_isolated_borrow_ratez#Exchange.parse_isolated_borrow_rate'  r  rv   c                 0    t          | j        dz             )Nz$ parseWsTrade() is not supported yetr  rm  s      rr   parse_ws_tradezExchange.parse_ws_trade*  rw  rv   c                 0    t          | j        dz             )Nz$ parseWsOrder() is not supported yetr  r|  s      rr   parse_ws_orderzExchange.parse_ws_order-  rw  rv   c                 0    t          | j        dz             )Nz) parseWsOrderTrade() is not supported yetr  rm  s      rr   parse_ws_order_tradezExchange.parse_ws_order_trade0  r8  rv   c                 .    |                      ||          S r   )parse_ohlcvrp   r   rX  s      rr   parse_ws_ohlcvzExchange.parse_ws_ohlcv3  s    v...rv   c                 0    t          | j        dz             )Nz) fetchFundingRates() is not supported yetr  r  s      rr   fetch_funding_rateszExchange.fetch_funding_rates6  r8  rv   c                 0    t          | j        dz             )Nz- fetchFundingIntervals() is not supported yetr  r  s      rr   fetch_funding_intervalsz Exchange.fetch_funding_intervals9  r  rv   c                 0    t          | j        dz             )Nz( watchFundingRate() is not supported yetr  r  s      rr   watch_funding_ratezExchange.watch_funding_rate<  r1  rv   c                 0    t          | j        dz             )Nz) watchFundingRates() is not supported yetr  r  s      rr   watch_funding_rateszExchange.watch_funding_rates?  r8  rv   c                 0    t          | j        dz             )Nz+ unWatchFundingRates() is not supported yetr  r  s      rr   un_watch_funding_rateszExchange.un_watch_funding_ratesB  rj  rv   c                 .    |                      ||          S r   )r  r  s      rr   watch_funding_rates_for_symbolsz(Exchange.watch_funding_rates_for_symbolsE  s    ''888rv   ra  r   fromAccount	toAccountc                 0    t          | j        dz             )Nz  transfer() is not supported yetr  )rp   ra  r   r  r  r  s         rr   r4  zExchange.transferH      47%GGHHHrv   tagc                 0    t          | j        dz             )Nz  withdraw() is not supported yetr  rp   ra  r   rt  r  r  s         rr   r   zExchange.withdrawK  r  rv   c                 0    t          | j        dz             )Nz, createDepositAddress() is not supported yetr  rp   ra  r  s      rr   create_deposit_addresszExchange.create_deposit_addressN  r$  rv   r   c                 0    t          | j        dz             )Nz# setLeverage() is not supported yetr  )rp   r   r  r  s       rr   set_leveragezExchange.set_leverageQ  r  rv   c                     | j         d         r-|                     |g|          }|                     ||          S t          | j        dz             )Nr  z% fetchLeverage() is not supported yet)r  fetch_leveragesrs  r   r  )rp   r  r  	leveragess       rr   fetch_leveragezExchange.fetch_leverageT  sT    8$% 	R,,fXv>>I>>)V444tw)PPQQQrv   c                 0    t          | j        dz             )Nz& fetchLeverages() is not supported yetr  r  s      rr   r  zExchange.fetch_leverages[  r@  rv   hedgedc                 0    t          | j        dz             )Nz' setPositionMode() is not supported yetr  )rp   r  r  r  s       rr   set_position_modezExchange.set_position_mode^      47%NNOOOrv   c                 0    t          | j        dz             )Nz! addMargin() is not supported yetr  rp   r  r   r  s       rr   
add_marginzExchange.add_margina  rT  rv   c                 0    t          | j        dz             )Nz$ reduceMargin() is not supported yetr  r  s       rr   reduce_marginzExchange.reduce_margind  rw  rv   c                 0    t          | j        dz             )Nz! setMargin() is not supported yetr  r  s       rr   
set_marginzExchange.set_marging  rT  rv   r  c                 0    t          | j        dz             )Nz+ fetchLongShortRatio() is not supported yetr  rp   r  r  r  s       rr   fetch_long_short_ratiozExchange.fetch_long_short_ratioj  rj  rv   c                 0    t          | j        dz             )Nz2 fetchLongShortRatioHistory() is not supported yetr  rp   r  r  r  rW  r  s         rr   fetch_long_short_ratio_historyz'Exchange.fetch_long_short_ratio_historym  r.  rv   ro   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 yetr  )rp   r  ro   r  rW  r  s         rr   fetch_margin_adjustment_historyz(Exchange.fetch_margin_adjustment_historyp  s     47%[[\\\rv   
marginModec                 0    t          | j        dz             )Nz% setMarginMode() is not supported yetr  )rp   r  r  r  s       rr   set_margin_modezExchange.set_margin_mode|  r  rv   c                 0    t          | j        dz             )Nz6 fetchDepositAddressesByNetwork() is not supported yetr  r  s      rr   "fetch_deposit_addresses_by_networkz+Exchange.fetch_deposit_addresses_by_network  s    47%]]^^^rv   1hc                 0    t          | j        dz             )Nz0 fetchOpenInterestHistory() is not supported yetr  r  s         rr   fetch_open_interest_historyz$Exchange.fetch_open_interest_history  r+  rv   c                     | j         d         r-|                     |g|          }|                     ||          S t          | j        dz             )Nr  z) fetchOpenInterest() is not supported yet)r  fetch_open_interestsrs  r   r  )rp   r  r  openInterestss       rr   fetch_open_interestzExchange.fetch_open_interest  sT    8() 	V 55vhGGM>>-888tw)TTUUUrv   c                 0    t          | j        dz             )Nz* fetchOpenInterests() is not supported yetr  r  s      rr   r  zExchange.fetch_open_interests  rW  rv   c                 0    t          | j        dz             )Nz signIn() is not supported yetr  r  s     rr   sign_inzExchange.sign_in  r  rv   c                 0    t          | j        dz             )Nz+ fetchPaymentMethods() is not supported yetr  r  s     rr   fetch_payment_methodszExchange.fetch_payment_methods  rj  rv   c                 h    |                      |          }t          |          }t          |          S r   )r!   r  r  )rp   r   stringifiedNumberconvertedNumbers       rr   r  zExchange.parse_to_int  s4     !11&99 122?###rv   c                     |                      |          }|                    d          dk    rt          |          S t          |          S )Nr  r   )r!   r  r  r  )rp   r   stringVersions      rr   parse_to_numericzExchange.parse_to_numeric  sL    --f55
 c""a'''''=!!!rv   r  c                 >    |                      |dz            }|dk    S )Nr   r   )r  )rp   r  r  s      rr   is_round_numberzExchange.is_round_number  s$     ##UQY00axrv   c                 :    |                      |           p|dk    S r  )rl  rg  s     rr   is_empty_stringzExchange.is_empty_string  s"    ((///>5B;>rv   rq   c                     |                      ||          }|                     |                     |                    }||n|S r   )r  rR  rU  )rp   rq   r  rr  r  finals         rr   safe_number_omit_zerozExchange.safe_number_omit_zero  sD      c**!!$.."7"788 %||E9rv   c                 H    |                      |||          }||dk    rd S |S r;  )r  )rp   rq   r  rr  r  s        rr   safe_integer_omit_zerozExchange.safe_integer_omit_zero  s2    %%c3==		Q4rv   c                 ,   |                                   |                                  | j        r|                     | j                   |                                  |                     | j        ddd          }|r|                     |           d S d S )Nr   r   F)create_networks_by_id_objectfeatures_generatorr  r  init_rest_rate_limiterrj  r   r   )rp   	isSandboxs     rr   r   zExchange.after_construct  s    ))+++!!!< 	+T\***##%%%$$T\9iOO	 	-!!),,,,,	- 	-rv   c                 |   | j         | j        "| j         dk    rt          | j        dz             | j        }| j         dk    r
d| j         z  }| j        dk    p
| j        dk    }|rdnd}ddd||| j        | j         d	}| j        i n| j        }|                     ||          | _        |                                  d S )
Nr   z%.rateLimit property is not configuredr   r   rz   r{   rollingWindowgMbP?)r"  capacityr   
refillRater  
windowSizer  )	r  r  r   	MAX_VALUErb  rateLimiterAlgorithmtokenBucketrA  r  )rp   r  useLeakyr  defaultBucketexistingBuckets         rr   r  zExchange.init_rest_rate_limiter  s    >!dg&9dnPR>R>R*Q QRRR^
>AT^+J*c1bt7PTa7a%-BMM?	$"0
 
 !% 0 8t?O;;}nEErv   c                    | j         d S | j         }i | _         g d}ddg}t          dt          |                    D ]}||         }||vrd | j         |<   |dk    r |                     ||d           | j         |<   ?i | j         |<   t          dt          |                    D ]/}||         }|                     |||          | j         |         |<   0d S )N)rm  ro  rp  rq  linearinverser   rm  )featuresrH  r  features_mapper)rp   initialFeaturesunifiedMarketTypessubTypesr   
marketTypejsubTypes           rr   r  zExchange.features_generator  s    = F-AAAi(q#01122 	x 	xA+A.J/11,0j))''040D0D_V`bf0g0gDM*--02DM*-"1c(mm44 x x"*1+=A=Q=QRacmov=w=wj1'::x	x 	xrv   r  r  r  c                 "   |||         |         n||         }|d S |                      |d          }|B|                     |d          }|                     ||          }|                     ||          }d|v r|                     |d         d          }||d         d<   ||d         d<   |dk    r d|d         d<   d	|d         vrd|d         d	<   |                     |d         d
         d          d|d         d
         d<   t          |                                          }t          dt          |                    D ]J}	||	         }
||
         }| 
                    |
dg          s!|d|vr| 
                    |
g d          |d<   K|S )Nextendsr  attachedStopLossTakeProfitstopLoss
takeProfitrm  Fr  r   timeInForceGTCTr   r   symbolRequired)r  r  r  )r  r  r  r   rs  r   r  ru  rH  r  ro  )rp   r  r  r  featuresObj
extendsStr	extendObjr  ru  r   r  featureBlocks               rr   r  zExchange.features_mapper  s   ?F?Roj1'::YhisYt4**;	BB
!))K;;K,,_jIII**9kBBK
 K''NN;}#=?[\\E5:K&z27<K&|4V##7<M*84"k-&@@@=BK.z:~~k-8GOOWCGM*=9%@K$$&&''q#d))$$ 	w 	wAq'C&s+L==yk22 w|7O(L8859]]3HuHuHu5v5vL!12rv   
methodName	paramNamec                 v    |                      |          }|                     |d         |d         |||          S )a  
        self method is a very deterministic to help users to know what feature is supported by the exchange
        :param str [symbol]: unified symbol
        :param str [methodName]: view currently supported methods: https://docs.ccxt.com/#/README?id=features
        :param str [paramName]: unified param value, like: `triggerPrice`, `stopLoss.triggerPrice`(check docs for supported param names)
        :param dict [defaultValue]: return default value if no result found
        :returns dict: returns feature value
        ro   r  )rX  feature_value_by_type)rp   r  r  r  rr  rX  s         rr   feature_valuezExchange.feature_value(  s<     V$$))&.&:KZYbdpqqqrv   c                 0   | j         |S ||S || j         vr|S | j         |         |S | j         |         }|	|dk    r|S n9|| j         |         vr|S | j         |         |         |S | j         |         |         }|||n|S ||vr|S ||         }||S |||n|S |                    d          }|d         }	|                     |d          }
|	|vr|S |                     ||	          }|||	         S |
||	         S |
||	         vr|S ||	         |
         S )aB  
        self method is a very deterministic to help users to know what feature is supported by the exchange
        :param str [marketType]: supported only: "spot", "swap", "future"
        :param str [subType]: supported only: "linear", "inverse"
        :param str [methodName]: view currently supported methods: https://docs.ccxt.com/#/README?id=features
        :param str [paramName]: unified param value(check docs for supported param names)
        :param dict [defaultValue]: return default value if no result found
        :returns dict: returns feature value
        Nrm  r  r   r   )r  r   r  rs  )rp   r  r  r  r  rr  methodsContainer
methodDictsplited	parentKeysubKeyr  s               rr   r  zExchange.feature_value_by_type4  s    = dm++=$,=4?V#### $ t}Z888##}Z(19###}Z8A$0$<<<CSS...%j1
$0$<<<:M//#&&AJ	!!'1--Z''^^J	::
i(( ~!),,j333##i(00rv   c                     |dz   S )Nz	  = Falser  rp   r  s     rr   orderbook_checksum_messagez#Exchange.orderbook_checksum_messageq  s    ##rv   c                     |                      |                     | j        di                     }|                     ||                     | j        di                     | j        d<   d S )NnetworksnetworksById)invert_flat_string_dictionaryr  r   rA  )rp   networkIdsToCodesGenerateds     rr   r  z%Exchange.create_networks_by_id_objectt  sq    %)%G%GX\XdfprtHuHu%v%v"'+{{3Mt_c_km{}  PA  PA  (B  (B^$$$rv   c                 $    dddiddiddidd	id
iS )NdefaultNetworkCodeReplacementsERC20ETHTRC20TRXCRC20CRONOSBRC20r   )r'  r)  CROr,  r  r  s    rr   r   zExchange.get_default_optionsy  s9    ,''*!5)	/ /
 	
rv   rR  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afterr   outinr  r   r  rJ  r  r<   referenceIdreferenceAccountro   ra  r\  )r  r  r  r  r<   r3  r4  ro   rf  r   r/  r0  r\  r  rJ  )safe_currencyr  r"   
string_sub
string_add	string_gtr  r  r  rs  r  rR  )
rp   rR  rf  r  r/  r0  r   r  r  rJ  s
             rr   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
 
 	
rv   c                 	   |                      |di           }t          |                                          }t          |          }|dk    r
t	          d|          D ]}||         }||         }|                     |d          }|                     |d          }	|	|r||d<   |                     |d          }
|                     |d          }||
r|
|d<   |                     |d          }|+|r|
rd|d         |         d<   n||
d|d         |         d<   |                     |d         |         d          }|                     |d          }||r||d<   |                     |d          }|                     |d          }|t          j        ||          r| 	                    |          |d<   |                     |d	          }|                     |d	          }|t          j
        ||          r| 	                    |          |d	<   |                      |d
          }|                      |d
          }|i |d
<   |                      |d          }|                      |d          }|i |d
         d<   |                     |d          }|                     |d          }|                     |d          }|                     |d          }|t          j        ||          r$| 	                    |          |d
         d         d<   |t          j
        ||          r$| 	                    |          |d
         d         d<   |                      |d          }|                      |d          }|i |d
         d<   |                     |d          }|                     |d          }|                     |d          }|                     |d          }|t          j        ||          r$| 	                    |          |d
         d         d<   |t          j
        ||          r$| 	                    |          |d
         d         d<   |                     d d d d d d d d d d d i i d d dd d ddd|          S )Nr   r   r   r   activeTFr  r   r   r   r   r   )r   r   )rJ  r  	numericIdra  r   ro   rg   r;  r   r   r  rX  r   r   )rs  r  ru  r  rH  r   r  r"   	string_ltrR  r8  rA  ) rp   rf  r   ru  r  r   r  networkr   currencyDepositr   currencyWithdrawr;  currencyActiver  feeMainr   precisionMainr   
limitsMainlimitsDepositlimitsDepositMainlimitsDepositMinlimitsDepositMaxlimitsDepositMinMainlimitsDepositMaxMainlimitsWithdrawlimitsWithdrawMainlimitsWithdrawMinlimitsWithdrawMaxlimitsWithdrawMinMainlimitsWithdrawMaxMains                                    rr   safe_currency_structurez Exchange.safe_currency_structure  s   >>(J;;HMMOO$$TQ;;1f%% Ba Ba1g"3-..)<<"&..9"E"E"*g**1HY'>>':>>#'>>(J#G#G #+x++3HZ(::> D8 D>B,S1(;; ,1E>C,S1(;(<S(A8LL!%(!C!C!)V))/HX&&&w66**8U;;?g&7W&E&E?&*&7&7&<&<HUO ,,WkBB	 $ 0 0; G G (G,=i,W,W(,0,=,=i,H,HH[)::!^^Hh??
%)+HX& $vy A A$(NN:y$I$I!$,46HX&y1#'#3#3M5#I#I #'#3#3M5#I#I '+'7'78I5'Q'Q$'+'7'78I5'Q'Q$'/73DEUWk3l3l/;?;L;LM];^;^HX&y1%8'/73DEUWk3l3l/;?;L;LM];^;^HX&y1%8!%
!C!C%)^^J
%K%K"%-57HX&z2$($4$4^U$K$K!$($4$4^U$K$K!(,(8(89KU(S(S%(,(8(89KU(S(S%(0G4EFWYn4o4o0<@<M<MN_<`<`HX&z259(0G4EFWYn4o4o0<@<M<MN_<`<`HX&z259{{   
   	 	
 
0 1  	rv   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 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 }|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settleIdro   rm  rn  ro  rp  rq  rK  r;  contractr  r  r  r   r   contractSizeexpiryexpiryDatetimestrike
optionTyper   )r   r   r   r'  r  r   r   r   rE  )crossisolatedcreatedrJ  F)rA  )rp   rX  cleanStructurer?  s       rr   safe_market_structurezExchange.safe_market_structure  s   <
$<
4<
 d<
 D	<

 T<
 d<
 d<
 t<
 <
 D<
 D<
 d<
 D<
 d<
 d<
  T!<
" d#<
 <
$ %<
& d'<
( t)<
* t+<
, T-<
. T/<
0 D1<
2 d3<
4 d5<
6 d7<
8 $9<
:  ;<
H  
   
   
    I<
l   m<
t tu<
v Dw<
 <
z [[88Ff~ 
,*%-).F:&&>)%*F6N(#+',F8$(#+',F8$'?*&+F7OMrv   c                    g }|                                  | _        |                     |                     |          ddd          }t	          dt          |                    D ]}||         }|d         | j        v r9| j        |d                  }|                    |           || 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!          |
                                          | _        d}|0t!          |                                          }t          |          }|dk    r5|                     |                     | j        |                    | _        ng }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        tH          k    r|d         |d         k     r|n|}1|d         |d         k    r|n|}H|                    |           |                     |d          }|                     |                     | j        |                     |d                              | _        | %                    | j        d          | _&        |                     | j                  }t!          |                                          | _'        | j        S )Nrm  Tr   r  )r   r   r   r  r  r  r  r  z1e-8r   r'  rU  baseNumericIdr   )r  r<  ra  r   r  rV  quoteNumericIdr   ra  Fr   r   )(r  r   rd  rJ  rH  r  rQ  r   rb  r   r   rX  r  rY  r  r4  r  ru  r  idsr   r`  r   rR  rs  rQ  r  r  r  r  baseCurrenciesquoteCurrenciesrk  rS  r|  r  r   rZ  currencies_by_idr9  )rp   r  r   r\  marketValuesr   r  marketsByIdArrayrX  marketsSortedBySymbolmarketsSortedByIdnumCurrenciesru  rg  rh  defaultCurrencyPrecisionmarketPrecisionrf  allCurrenciesgroupedCurrenciesr9  resultingCurrenciesra  groupedCurrenciesCodehighestPrecisionCurrencyr  currentCurrencysortedCurrenciescurrenciesSortedByCodes                                rr   r  zExchange.set_markets]  sc   !88:: ||DMM'$:$:FD$OOq#l++,, 	" 	"A OET{d000$($6uT{$C  ''...2B"5;//38'"5;/%%d&@&@&B&B!^+E E y#U, ,F h )$,y!!	" )$-y!!$(y!MM&!!!!++DMM&(,K,KLL $T\ : : LL);<<1668899)..0011!
))**DIIM1"2243C3CDOU_3`3`aaDOO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"&"6"6t}}^U[7\7\"]"]D#'#7#7oW]8^8^#_#_D  --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"2243C3CDOUYUbUbcsu{U|U|3}3}~~DO $ 2 24?D I I!%do!>!>0557788
|rv   c                 <   | j         |j         k    r#t          | j         dz   |d         z   dz             |j        st          d          |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |                     |j        dg           }t          dt          |                    D ],}||         }|j        |         |j        |         | j        |<   -| S )NzK shareMarkets() can only share markets with exchanges of the same type(got r  )zosetMarketsFromExchange() source exchange must have loaded markets first. Can call by using loadMarkets functionmarketHelperPropsr   )r  r   r  r   r   r  rf  r   ri  rg  rh  r9  r|  r   rH  r  )rp   sourceExchangesourceExchangeHelpersr   helpers        rr   set_markets_from_exchangez"Exchange.set_markets_from_exchange  sO   7n'''#DG.{${  M  NR  S  %S  VY  %Y  Z  Z  Z% 	S  !R  S  S  S%-+9%-!%(3 . ?,;-=#)
 $~/EGZ\^ _ _q#34455 	F 	FA*1-F%f-9'5'=f'EV$rv   currentRestInstanceparentRestInstancewsBaseDescribec                     |                      |                                |                                          }|                      ||          }|S r   )r   r   )rp   r  r  r  extendedRestDescribesuperWithRestDescribes         rr   %get_describe_for_extended_ws_exchangez.Exchange.get_describe_for_extended_ws_exchange  sO    #//0B0K0K0M0MObOkOkOmOmnn $ 0 01E~ V V$$rv   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)rJ  r  r  freeusedr  r  r  r  r   debt)
r  r  ru  rH  r  r  r"   r7  r6  rR  )rp   r   balancesr9  debtBalancer   ra  r  r  r  r  debtBalanceArrayr  s                rr   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rv   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 }|                     |d          d up/|                     |d          d up|                     |d          d u}|s|s|r|                     |d|          }|                     |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#|s|                     |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 ))Nr   	remainingfilledr   averager   lastTradeTimestampr  rY  r\  r  rX  triggerPricestopLossPricetakeProfitPricer   r   rJ  r  ro   r  r  r  rater   closedr  FrY  rX  r
  postOnlyIOCPOlastUpdateTimestampr  	stopPriceclientOrderId
reduceOnly)r   r  r  r  r  r  r\  r  )rU  r  r  r  r|  parse_tradesrh   r  r  rH  r"   r7  r   rQ  rA  
reduceFeesreduce_fees_by_currencyr  r   r6  r   r!   r8  
string_mul
string_divstring_equalsrs  r  rR  r  ):rp   r  rX  r   r  r  r   r  r   lastTradeTimeTimestampr  rY  r\  parseFilled	parseCostparseLastTradeTimeTimestampr  parseFee	parseFeesparseSymbol	parseSideshouldParseFeesrX  r   isTriggerOrSLTpOrder	rawTrades
firstTradetradesAreParsedtradesLengthisArrayr   rk  tradeAmount	tradeCosttradeTimestamp	tradeFeesr  tradeFeereducedFeesreducedLengthfeeCopyr  rY  filledTimesContractSizecostPriceExistsmultiplyPrice	orderType
emptyPricerR  	entryFeesr
  r  r  r  r  r  r  r  s:                                                             rr   
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!%!1!1%!H!HPT!T  "OY]YiYijo  rA  ZB  ZB  JN  ZN  !L  UY  Ue  Ue  fk  m~  U  U  GK  UK ;	G) ;	G ;	Gx@@I
 A66J *$ 6kVz=QkX\`jXjO" #**9f=="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' $T-=-=eV-L-LPX-X-X# #""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#
 #
 #
   	rv   r  c                    g }t          |t                    rht          dt          |                    D ]I}|                     ||         |          }|                     ||          }	|                    |	           Jnt          |                                          }
t          dt          |
                    D ]i}|
|         }|                     d|i||                   }|                     ||          }|                     ||          }	|                    |	           j|                     |d          }||d         nd }| 	                    ||||          S )Nr   r  r  r  )
rh   r  rH  r  r}  rA  rQ  ru  rd  filter_by_symbol_since_limit)rp   r  rX  r  rW  r  resultsr   r  r  rf  r  
idExtendedparsedOrderr  s                  rr   parse_orderszExchange.parse_orders  sX   , fd## 	&1c&kk** & &))&)V<<FF33u%%%%&
 v{{}}%%C1c#hh'' & &V![[$VBZ@@
"..z6BBK88u%%%%,,w44&,&8!!t00&%OOOrv   r   rY  r   feeRatec	                 r   |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}||                     |          n|                     |	|          }t          j        ||          }||	|         |                     |          |                     |          dS )NrX  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  r   sellgivebuyr'  rm  rT  r   )ro   rf  r  r   )r   r  r  r  r!   r"   r  rR  )rp   r  ro   rY  r   r   takerOrMakerr  r  rX  r  useQuoter   r  priceStringr  s                   rr   calculate_fee_with_ratez Exchange.calculate_fee_with_rate  s   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"L292Et$$W---DL\L\]ceqLrLr!$-- s%%d++%%d++	
 
 	
rv   c           
      :    |                      ||||||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
        N)r  )rp   r  ro   rY  r   r   r  r  s           rr   calculate_feezExchange.calculate_fee  s(     ++FD$|]acijjjrv   liquidationc                 B   |                      |d          }|                      |d          }|                      |d          }|                      |d          }|                      |d          }||||t          j        ||          }|||t          j        ||          }|                     |          |d<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |S )N	contractsrY  r   	baseValue
quoteValue)r  r"   r  rR  )rp   r  rX  r  rY  r   r  r  s           rr   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!rv   c                 F   |                      |d          }|                      |d          }|                      |d          }|r|                      |d          }|}|C|                     |dd          }|rt          j        d|          }t          j        ||          }t          j        ||          }|                     |          \  }	}
|	|d<   |
|d	<   |                     |          |d<   |                     |          |d<   |                     |          |d<   |S )
Nr   r   r   rY  r  F1r  rX  )r  r   r"   r  r  parsed_fee_and_feesrR  )rp   rk  rX  r   r   r   rY  r  r  	resultFee
resultFeess              rr   
safe_tradezExchange.safe_trade<  s.   !!%22  00v..<++FNCCL!M'..EBB C$+$6sE$B$BM ' 2=, O O%mV<<D $ 8 8 ? ?	: e"f++F33h**511g))$//frv   c                     d }|c|                      |          }||d|z   z  }||d|                      |          z   z  }||d|                      |          z   z  }||d|z   z  }|S )Nr  r    )rp   r  rY  r   r   r  r  s          rr   create_ccxt_trade_idzExchange.create_ccxt_trade_idR  s     &&y11BcDj !cD11&9999 cD11%8888'cL((	rv   	containerc                    |                      |d          }|                     |d          }|d u}|d u}|p|}|r|r|                     |          }|s|g}| j        r|                     |          n|}t          |          }t          d|          D ] }	|                     ||	                   ||	<   !|}|dk    r	|d         }n|dk    rd }|d d d}|g }||gS )Nr  rX  r   r   )r   rf  )rs  r|  parse_fee_numericr  r  r  rH  )
rp   r  r  rX  
feeDefinedfeesDefinedr  r  r  r   s
             rr   r  zExchange.parsed_fee_and_feesa  s4   nnY..~~i00_
$&%4 	 2,,S11 u@DY$66t<<<UYK,,M1m,, H H!%!7!7A!G!GAD!!!!n!##;  C <DT{rv   r  c                 r    |                      |d          |d<   d|v r|                      |d          |d<   |S )Nr   r  )r  )rp   r  s     rr   r  zExchange.parse_fee_numeric  sB    &&sF33FS==**377CK
rv   r]  providedValuec                     t          |          }t          d|          D ]}||         }||k    r|c S ||dz
           S r.  )r  rH  )rp   r]  r  r  r   rF  s         rr   find_nearest_ceilingzExchange.find_nearest_ceiling  sV    Sq&!! 	 	A!fG'' (6A:rv   c                     i }t          |                                          }t          dt          |                    D ],}||         }||         }t	          |t
                    r|||<   -|S r;  )r  ru  rH  r  rh   rW  )rp   r   reversedru  r   r  r  s          rr   r"  z&Exchange.invert_flat_string_dictionary  sn    DIIKK  q#d))$$ 	& 	&Aq'CIE%%% &"%rv   c                 ~    d|                      |                     |                     |                              z   S )Nra  )r  r  r  r}  s     rr   string_to_base16zExchange.string_to_base16  s8    d++D,A,A$BWBWX[B\B\,],]^^^^rv   c                    i }t          dt          |                    D ]}||         }|                     |d          }||nt          |          }||                     |d          }|                     |d          }|d||vri ||<   |dn|}	|	||         v r7t	          j        ||         |	         d         |          ||         |	         d<   ||d||         |	<   ||||         |	         d<   g }
t          |                                          }t          dt          |                    D ]?}t          ||                                                   }|                     |
|          }
@|
S )Nr   rf  r  r   r   )rf  r   )	rH  r  r  rW  r"   r7  r  r\  rk  )rp   rX  reducedr   r  ra  feeCurrencyCoder  r   rateKeyr?  	feeValuesreducedFeeValuess                rr   r  z Exchange.reduce_fees_by_currency  s   \ q#d))$$ 	I 	IAq'C##C44D'+'7ddc!ffO*''V44''V44<'722/1GO,!%""Dgo666@G@RSZ[jSklsStu{S|  C  AD  ADGO,W5f== %) $9 9GO,W5 'DH09&A))**	q#i..)) 	A 	AA#IaL$7$7$9$9::&&v/?@@FFrv   c                 D   |                      |                     |d                    }|                      |                     |dd                    }|                      |                     |d                    }|                      |                     |d                    }|                      |                     |d                    }|                     |d          }|                     |d          }	|                     |d	          }
|(t          j        |                      |
          |	          }|F|*|(t          j        |t          j        |d
                    }||t          j        ||          }n|||t          j        |d
          }t          j        d
t          j        |d                    }||nt          j        ||          }t          j        |t          j        dt          j        |d                              }|=|;t          j        |t          j        dt          j        |d                              }|||t          j        ||          }nl|>|<t          j        t          j        |d          t          j        |d                    }n,|*|(t          j        |t          j        |d                    }||*|(t          j        t          j        ||          d          }||t          j        ||          }||t          j        |d
          }||d}|W|                                 rC| 	                    |d          }|                     |d          }|| 
                    |          }t          j        t          j        ||          d
|          }|                     |                      |                    }|                     |i d|                     |                      |                     |d                              d|                     |d          d|                     |                      |                     |d                              d|                     |d          d|                     |                      |                     |d                              d|                     |                      |                     |d                              d|                     |                      |                    d|d|d|                     |          d|                     |          d|                     |          d|                     |          d|                     |	          d	|                     |
          d|                     |d          d|                     |d          d|                     |d          i          S )Nr+  r  r  changer~   r  vwap
baseVolumequoteVolume2100r     r   r   bid	bidVolumeask	askVolumehighlowpreviousClose
indexPrice	markPrice)rU  r  r  r"   r  r7  r6  r  is_tick_precisionrs  r  rR  rA  r  )rp   rc  rX  r+  r  r  r~   r  r  r  r  openAddClosedenominatorcalcOpenr   rp  precisionPricecloseParseds                     rr   safe_tickerzExchange.safe_ticker  s   ~~d..vv>>??t11&'6JJKK 0 0 B BCC^^D$4$4V\$J$JKK
..!1!1&)!D!DEE//%%fl;;
&&v}==<%dnn[&A&A:NND}!4*7G4Fvs4S4STT| 1)%88#}!4&1'3??%0g6HUZ6[6[\\$($4447;Ml\g;h;h*8W5GWM_`jlqMrMr5s5stt| 1)%1CCI[\fhmInIn1o1opp> T%5 +E488"z'= +G,>z5,Q,QSZSefkmrSsSstt!j&< +D'2DZQV2W2WXX!f&8$/0B640P0PRWXX
}!3*488}!4*7C885#4	%$*@*@*B*B%&*nnV[&I&IO%)%5%5ow%O%ON%1$($>$>~$N$N	!,W-?e-L-LcS\]] ''u(=(=>>{{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%%dnnT&:&:;;$
 [$
 K$
 d''//$
 $++J77$
 t((11$
 D%%d++$
 $++J77$
 4,,[99$
  T--foFF!$
" $**6<@@#$
$ ))&+>>%$
 $
   	rv   c                 0    t          | j        dz             )Nzb fetchBorrowRate is deprecated, please use fetchCrossBorrowRate or fetchIsolatedBorrowRate insteadr  rp   ra  r   r  s       rr   fetch_borrow_ratezExchange.fetch_borrow_rate8  s'    47  &J  J  K  K  	Krv   c                 0    t          | j        dz             )Nz$ repayCrossMargin is not support yetr  r	  s       rr   repay_cross_marginzExchange.repay_cross_margin;  rw  rv   c                 0    t          | j        dz             )Nz' repayIsolatedMargin is not support yetr  rp   r  ra  r   r  s        rr   repay_isolated_marginzExchange.repay_isolated_margin>  r  rv   c                 0    t          | j        dz             )Nz% borrowCrossMargin is not support yetr  r	  s       rr   borrow_cross_marginzExchange.borrow_cross_marginA  r  rv   c                 0    t          | j        dz             )Nz( borrowIsolatedMargin is not support yetr  r	  s        rr   borrow_isolated_marginzExchange.borrow_isolated_marginD  r1  rv   c                 0    t          | j        dz             )NzY borrowMargin is deprecated, please use borrowCrossMargin or borrowIsolatedMargin insteadr  rp   ra  r   r  r  s        rr   borrow_marginzExchange.borrow_marginG  s'    47  &A  A  B  B  	Brv   c                 0    t          | j        dz             )NzV repayMargin is deprecated, please use repayCrossMargin or repayIsolatedMargin insteadr  r	  s        rr   repay_marginzExchange.repay_marginJ  s    47%}}~~~rv   1mc                 X    d}| j         d         rd}t          | j        dz   |z             )Nr   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  rp   r  r  r  rW  r  r\  s          rr   fetch_ohlcvzExchange.fetch_ohlcvM  s:    8M" 	r rG47%IIGSTTTrv   c                 0    t          | j        dz             )Nz& fetchSpotOHLCV() is not supported yetr  r  s         rr   fetch_spot_ohlcvzExchange.fetch_spot_ohlcvS  r@  rv   c                 0    t          | j        dz             )Nz* fetchContractOHLCV() is not supported yetr  r  s         rr   fetch_contract_ohlcvzExchange.fetch_contract_ohlcvV  rW  rv   c                 X    d}| j         d         rd}t          | j        dz   |z             )Nr   r  r"	  zC fetchOHLCVWs() is not supported yet. Try using fetchOHLCV instead.r#	  r$	  s          rr   fetch_ohlcv_wszExchange.fetch_ohlcv_wsY  s;    8O$ 	r rG47%jjmttuuurv   c                 0    t          | j        dz             )Nz" watchOHLCV() is not supported yetr  r  s         rr   watch_ohlcvzExchange.watch_ohlcv_  ro  rv   tr  r  lrJ  r  r   c	                    g }	|                      ||g           }
|                      ||g           }|                      ||g           }|                      ||g           }|                      ||g           }|                      ||g           }t          dt          |
                    D ]}|	                    |r|                     |
|          n|                     |
|          |                     ||          |                     ||          |                     ||          |                     ||          |                     ||          g           |	S r;  )r|  rH  r  rQ  r  r  r  )rp   r   r  r+  r	  r	  r  r  r  r?  
timestampsopenshighslowsclosesvolumesr   s                    rr   convert_trading_view_to_ohlcvz&Exchange.convert_trading_view_to_ohlcvb  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((**++     rv   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   rw  r   r9  r  r     )rH  r  r  rQ  )rp   r   r  r+  r	  r	  r  r  r  r?  r   tsresultTimestamp
resultOpen
resultHigh	resultLowresultCloseresultVolumes                     rr   convert_ohlcv_to_trading_viewz&Exchange.convert_ohlcv_to_trading_viewu  sm   yttsuvq#f++&& 	. 	.A!#O1):):6!9Q<$;N)O)OB$Y/O""2&&&JfQil+++JfQil+++sIVAYq\*** -Kvay|,,,!&>Lq	!----rv   c                    d}|                      | j        |i           }|                     |dd          }	 |                     |dd          durd S |                      |dd          }	d }
d}d}||	k     rJ	  t          | |          i           }
d}n-# t          $ r}|d	z   }||	k    r|Y d }~nd }~ww xY w|rn||	k     J|
}||                    |          }|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          |          )Nr   webApiMuteFailureTwebApiEnablewebApiRetriesr  r   Fr   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   r   r   ri   r   rh   rW  r  r`  r   r  )rp   rd  endpointMethodreturnAsJson
startRegexendRegexerrorMessager   muteOnFailurerI  rQ  retryshouldBreakr  r  splitted_by_startsplitted_by_endjsoneds                     rr   fetch_web_endpointzExchange.fetch_web_endpoint  s   //$,;;w0CTJJ#	o~~g~t<<DHHt/2FFJHEK*$$ <wt^<<R@@H"&K       !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 6B E 
B3B.)E .B33BE E 
E6E11E6c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r;  )rH  r  rQ  	market_idrp   r  r?  r   s       rr   
market_idszExchange.market_ids  sZ    ?Nq#g,,'' 	6 	6AMM$..445555rv   c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r;  )rH  r  rQ  currency_idrp   r9  r?  r   s       rr   currency_idszExchange.currency_ids  s\    =Lq#e**%% 	6 	6AMM$**58445555rv   c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r;  )rH  r  rQ  rX  rT	  s       rr   markets_for_symbolszExchange.markets_for_symbols  sZ    ?Nq#g,,'' 	3 	3AMM$++gaj112222rv   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   ro   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 requestrm  r  )r   r  r  rH  rX  r   r  rQ  )rp   r  ro   
allowEmptysameTypeOnlysameSubTypeOnlysymbolsLengthr?  r  isLinearSubTyper   rX  r  s                rr   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&!!!!rv   c                     ||S g }t          dt          |                    D ]0}|                    |                     ||                              1|S r;  )rH  r  rQ  common_currency_coderX	  s       rr   market_codeszExchange.market_codes  s\    =Lq#e**%% 	? 	?AMM$33E!H==>>>>rv   c           	          |                      |          }g }t          dt          |                    D ]3}|                    |                     ||         |||                     4|S r;  )rJ  rH  r  rQ  r  )rp   r  r  r  r  r?  r   s          rr   parse_bids_askszExchange.parse_bids_asks  sk    --((q#g,,'' 	] 	]AMM$,,WQZ9l[[\\\\rv   c           
         |                      |||          }|                     ||                     |                     |d                   d          |                     |                     |d                   dd          d          S )Nasksr   bidsT)ri	  rj	  )r?  rA  rd  r  )rp   r  rW  r  r  s        rr   fetch_l2_order_bookzExchange.fetch_l2_order_book  s    ))&%@@	{{9LL	&0A!B!BAFFLL	&0A!B!BAtLL'
 '
   	rv   c                     ||S g }t          dt          |                    D ]?}|                     ||         d          }||k    r|                    ||                    @|S Nr   r  )rH  r  r  rQ  )rp   objectsr  r?  r   objectSymbols         rr   filter_by_symbolzExchange.filter_by_symbol  sp    >Nq#g,,'' 	* 	*A++GAJAALv%%gaj)))rv   c           	      0   t          |t                    r|                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |d          gS |S )Nr   r   r9  r  r  r9	  )rh   r  r  r  r  s      rr   r  zExchange.parse_ohlcv  s    eT"" 	!!%++  **  **  **  **  **  rv   networkCodecurrencyCodec                    |dS |                      | j        di           }|                     ||          }||t          | j                                                  }t          dt          |                    D ]P}||         }|                     |d          }|                     ||          }	|                     |	d          }| nQn|                      | j        di           }
||
v rx|
|         }t          |	                                          }t          dt          |                    D ]0}||         }||         }||k    r|                     ||          } n1n]|                     | j        |          }|                     |d          }|                     ||          }	|                     |	d          }||}|S )a/  
 @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
        Nr   r   r  r%  )
r  r   r  r  r   r\  rH  r  rs  ru  )rp   rr	  rs	  networkIdsByCodes	networkIdr   r   rf  r   r>  r%  replacementObjectru  r  r  s                  rr   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)!}H#~~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 '	rv   rv	  c                    |dS |                      | j        di           }|                     |||          }|N|                      | j        di           }||v r.|                      ||i           }|                     |||          }|S )aM  
 @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
        Nr!  r%  rs  r   r  )rp   rv	  rs	  networkCodesByIdsrr	  r%  rw	  s          rr   network_id_to_codezExchange.network_id_to_codeL  s     4 NN4<LL&&'8)YOO#-1^^DLJjln-o-o*===$(NN3QS_ac$d$d!"../@+{[[rv   c                 l    |                      |dd          }||                     |ddg          }||gS )Nrr	  r>  r  r  )rp   r  networkCodeInParamss      rr   handle_network_code_and_paramsz'Exchange.handle_network_code_and_params`  sC    "00	RR*YYvy'ABBF#V,,rv   c                     d }|                      | j        di           }||v r	||         }n|                     | j        d          }||}|S )NdefaultNetworksdefaultNetworkrz	  )rp   rs	  defaultNetworkCoder	  r	  s        rr   default_network_codezExchange.default_network_codeg  se    !..7H"MM?**!0!> "--dl<LMMN)%3"!!rv   c                 2    |                      |||d          S r   select_network_key_from_networksrp   rs	  rr	  indexedNetworkEntriess       rr   )select_network_code_from_unified_networksz2Exchange.select_network_code_from_unified_networkst  s    44\;Pegklllrv   c                 2    |                      |||d          S r  r	  r	  s       rr   #select_network_id_from_raw_networksz,Exchange.select_network_id_from_raw_networksw  s    44\;Peglmmmrv   c                 r   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|
S t          | j        dz   d                    |          z             |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 zR - can not determine the default network, please pass param["network"] one from : )r  ru  r  r   r  rx	  r   r	  )rp   rs	  rr	  r	  isIndexedByUnifiedNetworkCodechosenNetworkIdavailableNetworkIdsresponseNetworksLengthnetworkIdOrCoder	  defaultNetworkIds              rr   r	  z)Exchange.select_network_key_from_networksz  s   "#8#=#=#?#?@@!$%8!9!9"%**"47U?[#@Cl#lo{#{||| 2O  #G++TXTkTklw  zF  UG  UG"&;;;&5OO&tw'HKh'hkw'w  {J  (J  MQ  MV  MV  Wj  Mk  Mk  (k  l  l  l%**"47-P#PS_#_``` &*%>%>|%L%L"9V  $V#5#5\`\s\s  uG  IU  ]V  ]V #'<<<++"47  .B  $B  EI  EN  EN  Ob  Ec  Ec  $c  d  d  drv   r  c                 \    |                      |||          }|                     ||          S r   )r  rR  )rp   r  r  r  r  r  s         rr   safe_number_2zExchange.safe_number_2  s/    "":tT::  ***rv   rj	  ri	  r  c	                 @   |                      |                     ||g           |||          }	|                      |                     ||g           |||          }
||                     |	dd          |                     |
d          ||                     |          d dS )Nr   T)r  rj	  ri	  r  r  r8  )rg	  r  rd  r  )rp   r  r  r  bidsKeyasksKeyr  r  r  rj	  ri	  s              rr   parse_order_bookzExchange.parse_order_book  s    ##DOOIw$K$KXW`bnoo##DOOIw$K$KXW`bnooLLq$//LLq))"Y//
 
 	
rv   r  c                    g }t          dt          |                    D ]1}|                    |                     ||         |                     2|                     |d          }	|                     |	||d|          S r;  )rH  r  rQ  r  rd  r  )
rp   r   rX  r  r  rW  r  r  r   r3  s
             rr   parse_ohlcvszExchange.parse_ohlcvs  s    q#f++&& 	@ 	@ANN4++F1Iv>>????gq))))&%4HHHrv   rQ  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   ro  r  rX  F)rb	  r  rh   r  rH  r  safe_marketr   ro  r  ru  )rp   rQ  r  marketIdKeytiersr`	  	noSymbolsr   rx  r  rX  r  rX  ru  marketIds                  rr   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rv   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   rV  rH  r  r   r  r  )rp   r  r  r  rQ  r   r  s          rr   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^,|rv   c                    |                      |d          }|                      |d          }|                     |d          }|E|C|At          j        t          j        ||d          d          }|                     |          |d<   |                     |d          }|                      |d          }d }||                     | j        |          }|||                     |d          }||d<   |S )NunrealisedPnlinitialMarginr~   r  r  rY  r  )r  r  r"   r  r  rR  r  r  )	rp   r  unrealizedPnlStringinitialMarginStringr~   percentageStringrY  r  rX  s	            rr   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^$rv   	positionsc                 T   |                      |          }|                     |          }g }t          dt          |                    D ]G}|                     |                     ||         d           |          }|                    |           H|                     |d|d          S Nr   r  F)rb	  rJ  rH  r  rA  r  rQ  filter_by_array_positions)rp   r	  r  r  r?  r   r  s          rr   parse_positionszExchange.parse_positions  s    %%g..MM),,	q#i..)) 	$ 	$A{{4#6#6y|T#J#JFSSHMM(####--fhOOOrv   c                 0    t          | j        dz             )Nz$ parseADLRank() is not supported yetr  r  s      rr   parse_adl_rankzExchange.parse_adl_rank  rw  rv   ranksc                 T   |                      |          }|                     |          }g }t          dt          |                    D ]G}|                     |                     ||         d           |          }|                    |           H|                     |d|d          S r	  )rb	  rJ  rH  r  rA  r	  rQ  r	  )rp   r	  r  r  r?  r   ranks          rr   parse_adl_rankszExchange.parse_adl_ranks  s    %%g..e$$q#e**%% 	  	 A;;t2258TBBFKKDMM$--fhOOOrv   accountsc                     |                      |          }g }t          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           G|S r;  )rJ  rH  r  rA  rv  rQ  )rp   r	  r  r?  r   r<   s         rr   parse_accountszExchange.parse_accounts  sv    ==**q#h--(( 	# 	#Akk$"4"4Xa["A"A6JJGMM'""""rv   isWsr   c                    |                      |          }g }t          dt          |                    D ]j}d }	|r|                     ||         |          }	n|                     ||         |          }	|                     |	|          }
|                    |
           k|                     |dd          }||d         nd }|                     ||||          S )Nr   r  r  r  )	rJ  rH  r  r  rn  rA  rQ  rg  r  )rp   r	  r   rX  r  rW  r  r?  r   r  rk  r  s               rr   parse_trades_helperzExchange.parse_trades_helper  s    v&&q#f++&& 	! 	!AF =,,VAY??))&)V<<KK//EMM%    T::&,&8!!t00NNNrv   c                 6    |                      d|||||          S r  r	  rp   r   rX  r  rW  r  s         rr   r  zExchange.parse_trades  s     ''vvueVTTTrv   c                 6    |                      d|||||          S r  r	  r	  s         rr   parse_ws_tradeszExchange.parse_ws_trades  s     ''ffeUFSSSrv   r   c                 n   |                      |          }g }t          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           H|                     |d          }||d         nd }	|                     ||	||          S Nr   r  ra  )rJ  rH  r  rA  rr  rQ  rd  filter_by_currency_since_limit)
rp   r   rf  r  rW  r  r?  r   rp  ra  s
             rr   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Nrv   	transfersc                 n   |                      |          }g }t          dt          |                    D ]G}|                     |                     ||         |          |          }|                    |           H|                     |d          }||d         nd }	|                     ||	||          S r	  )rJ  rH  r  rA  rt  rQ  rd  r	  )
rp   r	  rf  r  rW  r  r?  r   r4  ra  s
             rr   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Nrv   c                 8   g }|                      |          }t          dt          |                    D ]}|                     ||         |          }	t	          |	t
                    rPt          dt          |	                    D ]1}
|                    |                     |	|
         |                     2|                    |                     |	|                     |                     |d          }||d         nd }| 	                    ||||          S r	  )
rJ  rH  r  rz  rh   r  rQ  rA  rd  r	  )rp   r/  rf  r  rW  r  r?  	arrayDatar   itemOrItemsr  ra  s               rr   parse_ledgerzExchange.parse_ledger0  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Nrv   c                 *    |                                  S r   )r  r  s    rr   r8  zExchange.nonce>  s    ||~~rv   c                     |S r   r  )rp   r   s     rr   rX  zExchange.set_headersA  s    rv   c                 ~    |                      | j        |          }||                     |          }||d         S |S Nr  )rs  r   r5  )rp   ra  rf  s      rr   rW	  zExchange.currency_idD  sE    >>$/488))$//HD>!rv   c                 D    |                      |          }||d         S |S r	  rX  rp   r  rX  s      rr   rS	  zExchange.market_idL  s(    V$$$<rv   c                 Z    |                      |          }|                     |d|          S Nr  )rX  r  r	  s      rr   r  zExchange.symbolR  s+    V$$&999rv   r  c                 h    |                      |||          }||                     ||          }||gS r   )r  r  rp   r  r  rr  r  s        rr   handle_param_stringzExchange.handle_param_stringV  s<      LAAYYvy11Fvrv   
paramName1
paramName2c                 n    |                      ||||          }||                     |||g          }||gS r   r~	  rp   r  r	  r	  rr  r  s         rr   handle_param_string_2zExchange.handle_param_string_2\  sC    ""6:z<PPYYv
J'?@@Fvrv   c                 h    |                      |||          }||                     ||          }||gS r   )r  r  r	  s        rr   handle_param_integerzExchange.handle_param_integerb  s<    !!&)\BBYYvy11Fvrv   c                 n    |                      ||||          }||                     |||g          }||gS r   )r  r  r	  s         rr   handle_param_integer_2zExchange.handle_param_integer_2h  sC    ##FJ
LQQYYv
J'?@@Fvrv   c                 h    |                      |||          }||                     ||          }||gS r   )r   r  r	  s        rr   handle_param_boolzExchange.handle_param_booln  s:    vy,??YYvy11Fvrv   c                 n    |                      ||||          }||                     |||g          }||gS r   rj  r  r	  s         rr   handle_param_bool_2zExchange.handle_param_bool_2t  sC      ZNNYYv
J'?@@Fvrv   r  exchangeSpecificKey
isRequiredc                     d}|                      |          \  }}||                     ||          ||<   n|rt          | j        dz             ||gS )a   
        :param dict params: - extra parameters
        :param dict request: - existing dictionary of request
        :param str exchangeSpecificKey: - the key for chain id to be set in request
        :param dict currencyCode: - (optional) existing dictionary of request
        :param boolean isRequired: - (optional) whether that param is required to be present
        :returns dict[]: - returns [request, params] where request is the modified request object and params is the modified params object
        Nz/ - "network" param is required for self request)r	  rx	  r   r  )rp   r  r  r	  rs	  r	  rr	  s          rr   handle_request_networkzExchange.handle_request_networkz  sp     "AA&IIV"+/+B+B;P\+]+]G'(( 	a#DG._$_```  rv   c                     |                      ||          |                     ||                     |                    gS r   )r  r  r{  )rp   r%  r  s      rr   resolve_pathzExchange.resolve_path  s>    f--IIfd11$7788
 	
rv   c                     |}t          |t                    s|                     |          }g }t          dt	          |                    D ]#}|                    ||         |                    $|S r;  )rh   r  rJ  rH  r  rQ  )rp   rn	  r  newArrayr  r   s         rr   get_list_from_object_valuesz$Exchange.get_list_from_object_values  sq    '4(( 	.}}W--Hq#h--(( 	- 	-ANN8A;s+,,,,rv   symbolWithActiveStatussymbolWithUnknownStatusc                 d   | j         }||                     |d|          }|1|                     d|dg d           |                     |d|          }g }|r|                    d           |r|                    d            |                     |d|d          }|                     |d          S )	Nro   getSymbolsForMarketTyper  )r  r  quantoTr;  Fr  )r  rL  check_required_argumentrQ  filter_by_arrayr	  )rp   r  r  r	  r	  filteredMarketsactiveStatusess          rr   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Jrv   c                 Z   |                      |          }||s|r|                     ||          S |S g }t          dt          |                    D ]?}|                     ||         |         |          r|                    ||                    @|r|                     ||          S |S r;  )rJ  rY  rH  r  ro  rQ  )rp   rn	  r  r\  indexedr  r   s          rr   r	  zExchange.filter_by_array  s    --((>> }}Wc222q#g,,'' 	+ 	+A}}WQZ_f55 +wqz*** 	/==#...rv   c                    | j         r.|                     |||||          }|                     |           d }	|                     ||dd          \  }	}d }
|                     ||dd          \  }
}|                                 | _        |                     ||||||          }|d         | _        |d         | _        |d         | _	        t          d|	dz             D ]}	 |                     |d         |d         |d         |d                   c S # t          $ r}t          |t                    r||	k     rx| j        rS|dz   }|                     d	t#          |          z   d
z   t#          |          z   dz   t#          |	          z   dz              |
|
dk    r|                     |
           n||Y d }~d }~ww xY wd S )NmaxRetriesOnFailurer   maxRetriesOnFailureDelayr   r  rc  r   rd  zRequest failed with the error: z, retrying z of z...)re  calculate_rate_limiter_costr#  handle_option_and_paramsr  r  r  last_request_headerslast_request_bodylast_request_urlrH  r  ri   rh   r   r  r]  rW  r  )rp   r%  r  rd  r  r   r  r   r   retries
retryDelayr  r   r  rK  s                  rr   fetch2zExchange.fetch2  s    	 33CvvVVDMM$77F[]^__
!::64Icefgg
F(,(9(9(;(;%))D#vvwEE$+I$6!!( 'q'A+&& 	 	Azz'%.'(2CWYEWY`agYhiiiii   a11 
7{{< N$%EE HH%FQ%OR_%_befkblbl%lou%ux{  }D  yE  yE  &E  HM  &M  N  N  N&2q JJz222G ts    /D
F=BF88F=c           	      8    |                      |||||||          S r   )r	
  )rp   r%  r  rd  r  r   r  r   s           rr   r  zExchange.request  s     {{4ffgtVLLLrv   c                     |r|                      |          | _        n(| j        r| j        S |                      |          | _        |                     | j        d          | _        | j        S r	  )r  r	  rY  accountsById)rp   r  r  s      rr   load_accountszExchange.load_accounts  sh     	< //77DMM} <}$ $ 3 3F ; ; MM$->>}rv   r1  c           
         |                      |          dz  }g }d}d}d}	d}
d}d}t          |          }t          ||          }|                     | j        di           }|                     |d	d
          }t          d|          D ]u}||         }|d         }|d         }||k     r"t          t          j	        ||z                      |z  }||k     rPt          |          }|dz
  }|r|dk    s|dk     ss|dk    }|s&|| 
                    ||         |         |          k    r#|                    ||||||d         dg           t          ||         |         |          ||         |<   t          ||         |	         |          ||         |	<   |||         |
<   | 
                    ||         |         |d                   ||         |<   | 
                    ||         |         d          ||         |<   w|S )Nrw  r   r9  r  r  r9	  r  buildOHLCVCskipZeroPricesTr  r   r   r   r   )r  r  r   rs  r   r   rH  r  r  floorr  rQ  r   )rp   r   r  r  rW  r  r   i_timestampi_highi_lowi_closei_volumei_countr  oldestr   r
  r   rk  r:	  r   openingTimeohlcv_lengthcandleisFirstCandles                            rr   build_ohlcvczExchange.build_ohlcvc  s=    !!),,t36{{\5))..}bAA1A4HHq&!! 	O 	OA1IE{#B'NEEzzdjb1122R7KU""v;;L!A%F uqyy5199"bLM Otxxv{8SUW/X/X X X(O     *-VF^F-CU)K)Kvv&(+F6N5,A5(I(Ivu%*/vw'+/88F6N84LeT\o+^+^vx(*.((6&>'3JA*N*Nvw''rv   c                 ^    |                      |          }|                     |||||          S r   )r7	  r	  )rp   r   rX  r  r  rW  r?  s          rr   parse_trading_view_ohlcvz!Exchange.parse_trading_view_ohlcv  s1    33F;;  E5IIIrv   r  c                 6    |                      ||d|||          S )Nr  edit_limit_orderrp   r  r  r   r   r  s         rr   edit_limit_buy_orderzExchange.edit_limit_buy_order  s     $$RvNNNrv   c                 6    |                      ||d|||          S )Nr  r!
  r#
  s         rr   edit_limit_sell_orderzExchange.edit_limit_sell_order   s     $$ROOOrv   c           	      8    |                      ||d||||          S NrW  )
edit_order)rp   r  r  rY  r   r   r  s          rr   r"
  zExchange.edit_limit_order#  s     r67D&%PPPrv   c                 b    |                      ||           |                     ||||||          S r   )cancel_ordercreate_orderrp   r  r  ro   rY  r   r   r  s           rr   r)
  zExchange.edit_order&  s6    "f%%%  tVUFKKKrv   r  c           	      h    |                      |d|i          }|                     d||||||          S )Nr  r   )rA  r)
  )	rp   r  r  ro   rY  r   r   r  extendedParamss	            rr   edit_order_with_client_order_idz(Exchange.edit_order_with_client_order_id*  s8    Vo}-MNNr64vunUUUrv   c                 b    |                      ||           |                     ||||||          S r   )cancel_order_wscreate_order_wsr-
  s           rr   edit_order_wszExchange.edit_order_ws.  s6    R(((##FD$vNNNrv   c                 0    t          | j        dz             )Nz% fetchPosition() is not supported yetr  r  s      rr   fetch_positionzExchange.fetch_position2  r  rv   c                 0    t          | j        dz             )Nz' fetchPositionWs() is not supported yetr  r  s      rr   fetch_position_wszExchange.fetch_position_ws5  r  rv   c                 0    t          | j        dz             )Nz% watchPosition() is not supported yetr  r  s      rr   watch_positionzExchange.watch_position8  r  rv   c                 0    t          | j        dz             )Nz& watchPositions() is not supported yetr  r	  s        rr   watch_positionszExchange.watch_positions;  r@  rv   c                 2    |                      ||||          S r   )r<
  r	  s        rr   watch_position_for_symbolsz#Exchange.watch_position_for_symbols>  s    ##GUE6BBBrv   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 yetr  r  s      rr   fetch_positions_for_symbolz#Exchange.fetch_positions_for_symbolA       47%VVWWWrv   c                 0    t          | j        dz             r@
  r  r  s      rr   fetch_positions_for_symbol_wsz&Exchange.fetch_positions_for_symbol_wsJ  rB
  rv   c                 0    t          | j        dz             Nz& fetchPositions() is not supported yetr  r  s      rr   fetch_positionszExchange.fetch_positionsS  r@  rv   c                 0    t          | j        dz             rF
  r  r  s      rr   fetch_positions_wszExchange.fetch_positions_wsV  r@  rv   c                 0    t          | j        dz             )Nz* fetchPositionsRisk() is not supported yetr  r  s      rr   fetch_positions_riskzExchange.fetch_positions_riskY  rW  rv   c                 0    t          | j        dz             )Nz% fetchBidsAsks() is not supported yetr  r  s      rr   fetch_bids_askszExchange.fetch_bids_asks\  r  rv   c                 0    t          | j        dz             )Nz+ fetchBorrowInterest() is not supported yetr  )rp   ra  r  r  rW  r  s         rr   fetch_borrow_interestzExchange.fetch_borrow_interest_  rj  rv   c                 0    t          | j        dz             )Nz# fetchLedger() is not supported yetr  rp   ra  r  rW  r  s        rr   fetch_ledgerzExchange.fetch_ledgerb  r  rv   c                 0    t          | j        dz             )Nz( fetchLedgerEntry() is not supported yetr  rp   r  ra  r  s       rr   fetch_ledger_entryzExchange.fetch_ledger_entrye  r1  rv   c                     |                      ||          }|                      ||          }|                     ||          }||g}||                    |           |S r   )r  r  rQ  )	rp   bidaskr  r  r  r   r   	countOrIdr  s	            rr   r  zExchange.parse_bid_askh  sc    1133%%fl;;	 MM)$$$rv   
currencyIdc                     |||S | j         #|| j         v r| j         |         | j         |         S |}|'|                     |                                          }|                     ||d d          S )N)r  ra  r   )ri  rd	  r  rQ  )rp   rY
  rf  ra  s       rr   r5  zExchange.safe_currencyq  s    X%9O!-J$BW4W4W^b^st~^  _L(44!,,Z-=-=-?-?@@D++-
 -
   	rv   r	  	delimiterc                    |i| 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          }|
dk    r|                     |	d          |d	<   |                     |	d          |d
<   |                     |d	                   |d<   |                     |d
                   |d<   |d         dz   |d         z   |d<   |S ||S |                     ||d          S )Nr   r   z- safeMarket() requires a fourth argument for zB to disambiguate between different markets with the same market idro   r   )r  r	  r9  rU  rV  r'  r  /r  )	r   r  r   r  rH  r   rb  r  safe_currency_code)rp   r	  rX  r[
  r  r  
numMarketsr   currentMarketr  partsLengthr?  s               rr   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33& (5 5   !##'+'7'7q'A'AF8$(,(8(8(B(BF9%%)%<%<VH=M%N%NF6N&*&=&=fY>O&P&PF7O'-f~';fWo'MF8$M))X8*T*TUUUrv   c                 4    |d S |                      |          S r   r	  r  s     rr   market_or_nullzExchange.market_or_null  s    >4{{6"""rv   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  rY  ru  rH  r  r   r   r  )rp   r  ru  r   r  s        rr   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trv   c                 r    | j         |                     | j                   S t          | j        dz             )NzB exchange.twofa has not been set for 2FA Two-Factor Authentication)r   r7  r   r  r  s    rr   oathzExchange.oath  s4    :!99TZ(((*n nooorv   c                 0    t          | j        dz             )Nz$ fetchBalance() is not supported yetr  r  s     rr   fetch_balancezExchange.fetch_balance  rw  rv   c                 0    t          | j        dz             )Nz& fetchBalanceWs() is not supported yetr  r  s     rr   fetch_balance_wszExchange.fetch_balance_ws  r@  rv   c                 0    t          | j        dz             )Nz$ parseBalance() is not supported yetr  )rp   rQ  s     rr   parse_balancezExchange.parse_balance  rw  rv   c                 0    t          | j        dz             )Nz$ watchBalance() is not supported yetr  r  s     rr   watch_balancezExchange.watch_balance  rw  rv   c                 <    |                      |          }||         S r   )ri
  )rp   partr  r   s       rr   fetch_partial_balancezExchange.fetch_partial_balance  s    $$V,,t}rv   c                 .    |                      d|          S )Nr  rr
  r  s     rr   fetch_free_balancezExchange.fetch_free_balance      ))&&999rv   c                 .    |                      d|          S )Nr  rt
  r  s     rr   fetch_used_balancezExchange.fetch_used_balance  rv
  rv   c                 .    |                      d|          S )Nr  rt
  r  s     rr   fetch_total_balancezExchange.fetch_total_balance  s    ))'6:::rv   c                 0    t          | j        dz             )Nz# fetchStatus() is not supported yetr  r  s     rr   fetch_statuszExchange.fetch_status  r  rv   c                 x    | j         d         st          | j        dz             |                     |g|          S )Nr!  z+ fetchTransactionFee() is not supported yet)r  r   r  fetch_transaction_feesr  s      rr   fetch_transaction_feezExchange.fetch_transaction_fee  sA    x./ 	Xtw)VVWWW**D66:::rv   c                 0    t          | j        dz             )Nz, fetchTransactionFees() is not supported yetr  r;  s      rr   r~
  zExchange.fetch_transaction_fees  r$  rv   c                 0    t          | j        dz             )Nz0 fetchDepositWithdrawFees() is not supported yetr  r;  s      rr   fetch_deposit_withdraw_feesz$Exchange.fetch_deposit_withdraw_fees  r+  rv   c                     | j         d         st          | j        dz             |                     |g|          }|                     ||          S )Nr  z/ fetchDepositWithdrawFee() is not supported yet)r  r   r  r
  r  )rp   ra  r  rX  s       rr   fetch_deposit_withdraw_feez#Exchange.fetch_deposit_withdraw_fee  sT    x23 	\tw)ZZ[[[//??tT***rv   c                 T    ||v r||         S t          | j        dz   |z   dz             )Nr}  z! does not have a value in mappingr  )rp   r  mappings      rr   get_supported_mappingzExchange.get_supported_mapping  s4    '>>3<tw}s25XXYYYrv   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  r  r  r   )rp   ra  r  borrowRatesr  s        rr   fetch_cross_borrow_ratez Exchange.fetch_cross_borrow_rate  s    x*+ 	Ytw)WWXXX33F;;{D11<*u ux| |}}}rv   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  rs  r   )rp   r  r  r
  r  s        rr   fetch_isolated_borrow_ratez#Exchange.fetch_isolated_borrow_rate  s    x*+ 	\tw)ZZ[[[66v>>~~k622<*x x  |B  !B  C  C  Crv   
optionNamec                    d|                      |          z   }|                     |||          }||                     |||g          }nr|                     |d|          \  }}|                     | j        |          }||                     |||          }||                     | j        ||          }||n|}||gS )Nrm   callerMethodName)r   r  r  r	  r  r   )rp   r  r  r
  rr  defaultOptionNamer  exchangeWideMethodOptionss           rr   r
  z!Exchange.handle_option_and_params  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rv   methodName1optionName1optionName2c                     d }|                      |||          \  }}||                     ||          }||gS d }|                      ||||          \  }}||gS r   )r
  r  )rp   r  r
  r
  r
  rr  r  value2s           rr   handle_option_and_params_2z#Exchange.handle_option_and_params_2  ss    55fk;WWvYYv{33F6?"66v{KYeffrv   c                 ^    |                      i |||          }|                     |d          S r;  )r
  r  )rp   r  r
  rr  r  s        rr   rJ  zExchange.handle_option&  s/    ++B
JUUsA&&&rv   c                 x   |                      |dd          }||                     |ddg          }||gS |
|d         |gS |||gS |                     | j        |          }|6t	          |t
                    r||gS |                      |dd          }|||gS |                      | j        ddd          }||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
        defaultTypero   Nrm  )r  r  rs  r   rh   rW  )	rp   r  rX  r  rr  ro   methodOptionstypeFromMethodr
  s	            rr   handle_market_type_and_paramsz&Exchange.handle_market_type_and_params*  s     !!&-@@YYvv'>??F&>!6NF++# &))t|Z@@$--- 4%v..!%!3!3M=RX!Y!Y!-*F33((}ffUUV$$rv   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
  )rp   r  rX  r  rr  r  subTypeInParamsr\  s           rr   handle_sub_type_and_paramsz#Exchange.handle_sub_type_and_paramsK  s    ,,VY@PQQ&%GYYv	3C'DEEFF !(# (&GGI& ('G66r:yR^__ )  rv   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
  )rp   r  r  rr  s       rr   handle_margin_mode_and_paramsz&Exchange.handle_margin_mode_and_params`  s     ,,VZ|\\\rv   c                 8    |d S ||v r ||         |          d S r   r  )rp   exactr0  r\  s       rr   throw_exactly_matched_exceptionz(Exchange.throw_exactly_matched_exceptionh  s0    >FU??%-((( ?rv   c                 X    |                      ||          }| ||         |          d S r   )find_broadly_matched_key)rp   broadr0  r\  broadKeys        rr   throw_broadly_matched_exceptionz(Exchange.throw_broadly_matched_exceptionn  s9    00??!%/'***  rv   c                     t          |                                          }t          dt          |                    D ])}||         }||                    |          dk    r|c S *d S r;  )r  ru  rH  r  r  )rp   r
  r0  ru  r   r  s         rr   r
  z!Exchange.find_broadly_matched_keys  sk    EJJLL!!q#d))$$ 	 	Aq'C!;;s##q((JJJtrv   
statusCode
statusTextr|  responseBodyc
                     d S r   r  )
rp   r
  r
  rc  rd  r|  r
  rQ  requestHeadersrequestBodys
             rr   r  zExchange.handle_errors}  s	     trv   c                 0    |                      |dd          S )Nr   r   )r  )rp   r  rd  r%  r  r   s         rr   r
  z$Exchange.calculate_rate_limiter_cost  s    vvq111rv   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  rX  fetch_tickersrs  r   r  r   rp   r  r  rX  r   rc  s         rr   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Orv   c                 B   | j         d         r||                                  |                     |          }|d         }|                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr  r  z/ fetchMarkPrices() could not find a ticker for ' fetchMarkPrices() is not supported yet)r  r  rX  fetch_mark_pricesrs  r   r  r   r
  s         rr   fetch_mark_pricezExchange.fetch_mark_price  s    8%& 	T[[((FH%F,,fXv>>G^^GV44F~"47-^#^ag#ghhhtw)RRSSSrv   c                 B   | j         d         r||                                  |                     |          }|d         }|                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr  r  z- fetchTickerWs() could not find a ticker for z% fetchTickerWs() is not supported yet)r  r  rX  fetch_tickers_wsrs  r   r  r   r
  s         rr   fetch_ticker_wszExchange.fetch_ticker_ws  s    8$% 	R[[((FH%F++VHf==G^^GV44F~"47-\#\_e#effftw)PPQQQrv   c                 0    t          | j        dz             )Nz# watchTicker() is not supported yetr  r  s      rr   watch_tickerzExchange.watch_ticker  r  rv   c                 0    t          | j        dz             )Nz$ fetchTickers() is not supported yetr  r  s      rr   r
  zExchange.fetch_tickers  rw  rv   c                 0    t          | j        dz             )Nz( fetchSpotTickers() is not supported yetr  r  s      rr   fetch_spot_tickerszExchange.fetch_spot_tickers  r1  rv   c                 0    t          | j        dz             )Nz, fetchContractTickers() is not supported yetr  r  s      rr   fetch_contract_tickerszExchange.fetch_contract_tickers  r$  rv   c                 0    t          | j        dz             )Nr
  r  r  s      rr   r
  zExchange.fetch_mark_prices  r  rv   c                 0    t          | j        dz             )Nz& fetchTickersWs() is not supported yetr  r  s      rr   r
  zExchange.fetch_tickers_ws  r@  rv   c                 0    t          | j        dz             )Nz' fetchOrderBooks() is not supported yetr  r)  s       rr   fetch_order_bookszExchange.fetch_order_books  r  rv   c                 0    t          | j        dz             )Nz% watchBidsAsks() is not supported yetr  r  s      rr   watch_bids_askszExchange.watch_bids_asks  r  rv   c                 0    t          | j        dz             )Nz$ watchTickers() is not supported yetr  r  s      rr   watch_tickerszExchange.watch_tickers  rw  rv   c                 0    t          | j        dz             )Nz& unWatchTickers() is not supported yetr  r  s      rr   un_watch_tickerszExchange.un_watch_tickers  r@  rv   c                 0    t          | j        dz             )Nz* unWatchFundingRate() is not supported yetr  r  s      rr   un_watch_funding_ratezExchange.un_watch_funding_rate  rW  rv   c                 0    t          | j        dz             )Nz" fetchOrder() is not supported yetr  rp   r  r  r  s       rr   fetch_orderzExchange.fetch_order  ro  rv   c                 `    |                      |d|i          }|                     d||          S a{  
        create a market order by providing the symbol, side and cost
        :param str clientOrderId: client order Id
        :param str symbol: unified symbol of the market to create an order in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/?id=order-structure>`
        r  r   )rA  r
  rp   r  r  r  r/
  s        rr    fetch_order_with_client_order_idz)Exchange.fetch_order_with_client_order_id  s4     Vo}-MNNFN;;;rv   c                 0    t          | j        dz             )Nz$ fetchOrderWs() is not supported yetr  r
  s       rr   fetch_order_wszExchange.fetch_order_ws  rw  rv   c                 @    |                      |||          }|d         S )Nr\  )r
  )rp   r  r  r  r  s        rr   fetch_order_statuszExchange.fetch_order_status  s%       VV44Xrv   c                     |                      |                     |d          |                     |d          |          S Nr  r  )r
  r  rp   r  r  s      rr   fetch_unified_orderzExchange.fetch_unified_order  s=     0 0 = =t?O?OPUW_?`?`bhiiirv   c                 0    t          | j        dz             )Nz# createOrder() is not supported yetr  rp   r  ro   rY  r   r   r  s          rr   r,
  zExchange.create_order  r  rv   durationc                 0    t          | j        dz             )Nz' createTwapOrder() is not supported yetr  )rp   r  rY  r   r
  r  s         rr   create_twap_orderzExchange.create_twap_order  r  rv   fromCodetoCodec                 0    t          | j        dz             )Nz* createConvertTrade() is not supported yetr  )rp   r  r
  r
  r   r  s         rr   create_convert_tradezExchange.create_convert_trade  rW  rv   c                 0    t          | j        dz             )Nz) fetchConvertTrade() is not supported yetr  rT
  s       rr   fetch_convert_tradezExchange.fetch_convert_trade  r8  rv   c                 0    t          | j        dz             )Nz0 fetchConvertTradeHistory() is not supported yetr  rQ
  s        rr   fetch_convert_trade_historyz$Exchange.fetch_convert_trade_history  r+  rv   c                 0    t          | j        dz             )Nz) fetchPositionMode() is not supported yetr  r  s      rr   fetch_position_modezExchange.fetch_position_mode  r8  rv   c                 0    t          | j        dz             )Nz$ fetchADLRank() is not supported yetr  r  s      rr   fetch_adl_rankzExchange.fetch_adl_rank  rw  rv   c                 0    t          | j        dz             )N- fetchPositionsADLRank() is not supported yetr  r  s      rr   fetch_positions_adl_rankz!Exchange.fetch_positions_adl_rank  r  rv   c                 B   | j         d         r||                                  |                     |          }|d         }|                     |g|          }|                     |d          }|t          | j        dz   |z             |S t          | j        dz             )Nr  r  r   z3 fetchPositionsADLRank() could not find a rank for r
  )r  r  rX  r
  rs  r   r  r   )rp   r  r  rX  r	  r	  s         rr   fetch_position_adl_rankz Exchange.fetch_position_adl_rank  s    8+, 	Z[[((FH%F116(FCCE>>%++D|"47-b#bek#kllltw)XXYYYrv   trailingAmounttrailingTriggerPricec	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )  
        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 argumentr
  r
  r  z1 createTrailingAmountOrder() is not supported yetr   r  r  r,
  r   	rp   r  ro   rY  r   r   r
  r
  r  s	            rr   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Yrv   c	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )r
  NzA createTrailingAmountOrderWs() requires a trailingAmount argumentr
  r
  r  z3 createTrailingAmountOrderWs() is not supported yetr   r  r  r3
  r   r
  s	            rr   create_trailing_amount_order_wsz(Exchange.create_trailing_amount_order_ws&  s     !#DG.q$qrrr#1 +-AF)*812 	S''dFE6RRR47%ZZ[[[rv   trailingPercentc	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )  
        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 argumentr  r
  r  z2 createTrailingPercentOrder() is not supported yetr
  	rp   r  ro   rY  r   r   r  r
  r  s	            rr   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Zrv   c	                     |t          | j        dz             ||d<   |||d<   | j        d         r|                     ||||||          S t	          | j        dz             )r  NzC createTrailingPercentOrderWs() requires a trailingPercent argumentr  r
  r  z4 createTrailingPercentOrderWs() is not supported yetr   r  s	            rr    create_trailing_percent_order_wsz)Exchange.create_trailing_percent_order_wsR  s     "#DG.s$sttt$3 !+-AF)*823 	S''dFE6RRR47%[[\\\rv   r   c                     | j         d         s| j         d         r'| j         d         r|                     |d||d|          S t          | j        dz             )  
        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>`
        r  r  r  rX  r   z1 createMarketOrderWithCost() is not supported yet)r  r,
  r   r  rp   r  rY  r   r  s        rr   create_market_order_with_costz&Exchange.create_market_order_with_costh  ss     8/0 	NTX>\5] 	Nbfbj  lK  cL 	N$$VXtT1fMMM47%XXYYYrv   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  rX  r  r   z4 createMarketBuyOrderWithCost() is not supported yetr   r  r,
  r   r  rp   r  r   r  s       rr   !create_market_buy_order_with_costz*Exchange.create_market_buy_order_with_costu  sY     <;< 	OIg@h 	O$$VXudAvNNN47%[[\\\rv   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  rX  r  r   z5 createMarketSellOrderWithCost() is not supported yetr  r  s       rr   "create_market_sell_order_with_costz+Exchange.create_market_sell_order_with_cost  sY     <<= 	PJiAj 	P$$VXvtQOOO47%\\]]]rv   c                     | j         d         s| j         d         r'| j         d         r|                     |d||d|          S t          | j        dz             )r
  r  r  r  rX  r   z3 createMarketOrderWithCostWs() is not supported yet)r  r3
  r   r  r  s        rr    create_market_order_with_cost_wsz)Exchange.create_market_order_with_cost_ws  ss     812 	Qtx@`7a 	Qfjfn  pQ  gR 	Q''$aPPP47%ZZ[[[rv   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )  
        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  r  z* createTriggerOrder() is not supported yetr
  rp   r  ro   rY  r   r   r  r  s           rr   create_trigger_orderzExchange.create_trigger_order  so     #DG.f$fggg!-~8() 	P$$VT4OOO47%QQRRRrv   c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )r  Nz8 createTriggerOrderWs() requires a triggerPrice argumentr  r  z, createTriggerOrderWs() is not supported yetr   r  s           rr   create_trigger_order_wsz Exchange.create_trigger_order_ws  so     #DG.h$hiii!-~8*+ 	S''dFE6RRR47%SSTTTrv   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )  
        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  r  z+ createStopLossOrder() is not supported yetr
  rp   r  ro   rY  r   r   r  r  s           rr   create_stop_loss_orderzExchange.create_stop_loss_order  so      #DG.h$hiii"/8)* 	P$$VT4OOO47%RRSSSrv   c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )r  Nz: createStopLossOrderWs() requires a stopLossPrice argumentr  r  z- createStopLossOrderWs() is not supported yetr   r  s           rr   create_stop_loss_order_wsz"Exchange.create_stop_loss_order_ws  so      #DG.j$jkkk"/8+, 	S''dFE6RRR47%TTUUUrv   r  c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )  
        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  r  z- createTakeProfitOrder() is not supported yetr
  rp   r  ro   rY  r   r   r  r  s           rr   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Urv   c                     |t          | j        dz             ||d<   | j        d         r|                     ||||||          S t	          | j        dz             )r$  Nz> createTakeProfitOrderWs() requires a takeProfitPrice argumentr  r  z/ createTakeProfitOrderWs() is not supported yetr   r%  s           rr   create_take_profit_order_wsz$Exchange.create_take_profit_order_ws  sp     "#DG.n$nooo$3 !8-. 	S''dFE6RRR47%VVWWWrv   r	  r  c	           
          |                      ||||||||          }| j        d         r|                     ||||||          S t          | j        dz             )  
        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>`
        r  z< createOrderWithTakeProfitAndStopLoss() is not supported yet)$set_take_profit_and_stop_loss_paramsr  r,
  r   r  	rp   r  ro   rY  r   r   r	  r  r  s	            rr   +create_order_with_take_profit_and_stop_lossz4Exchange.create_order_with_take_profit_and_stop_loss  sn    * ::64vW\^hjrtz{{8:; 	P$$VT4OOO47%ccdddrv   c	                 X   ||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          }|S )NzY createOrderWithTakeProfitAndStopLoss() requires either a takeProfit or stopLoss argumentr  r	  r  takeProfitTypetakeProfitPriceTypetakeProfitLimitPricetakeProfitAmountstopLossTypestopLossPriceTypestopLossLimitPricestopLossAmountro   	priceTyper   r   )r/  r0  r1  r2  r3  r4  r5  r6  )r   r  r  r  r  )rp   r  ro   rY  r   r   r	  r  r  r/  r0  r1  r2  r3  r4  r5  r6  s                    rr   r+  z-Exchange.set_take_profit_and_stop_loss_params&  s)   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rv   c	           
          |                      ||||||||          }| j        d         r|                     ||||||          S t          | j        dz             )r*  r  z> createOrderWithTakeProfitAndStopLossWs() is not supported yet)r+  r  r3
  r   r  r,  s	            rr   .create_order_with_take_profit_and_stop_loss_wsz7Exchange.create_order_with_take_profit_and_stop_loss_wsL  sn    * ::64vW\^hjrtz{{8<= 	S''dFE6RRR47%eefffrv   c                 0    t          | j        dz             )Nz$ createOrders() is not supported yetr  rp   r  r  s      rr   create_orderszExchange.create_ordersf  rw  rv   c                 0    t          | j        dz             )Nz( createSpotOrders() is not supported yetr  r;  s      rr   create_spot_orderszExchange.create_spot_ordersi  r1  rv   c                 0    t          | j        dz             )Nz, createContractOrders() is not supported yetr  r;  s      rr   create_contract_orderszExchange.create_contract_ordersl  r$  rv   c                 0    t          | j        dz             )Nz" editOrders() is not supported yetr  r;  s      rr   edit_orderszExchange.edit_orderso  ro  rv   c                 0    t          | j        dz             )Nz% createOrderWs() is not supported yetr  r
  s          rr   r3
  zExchange.create_order_wsr  r  rv   c                 0    t          | j        dz             )Nz# cancelOrder() is not supported yetr  r
  s       rr   r+
  zExchange.cancel_orderu  r  rv   c                 0    t          | j        dz             )Nz' cancelSpotOrder() is not supported yetr  r
  s       rr   cancel_spot_orderzExchange.cancel_spot_orderx  r  rv   c                 0    t          | j        dz             )Nz+ cancelContractOrder() is not supported yetr  r
  s       rr   cancel_contract_orderzExchange.cancel_contract_order{  rj  rv   c                 `    |                      |d|i          }|                     d||          S r
  )rA  r+
  r
  s        rr   !cancel_order_with_client_order_idz*Exchange.cancel_order_with_client_order_id~  s4     Vo}-MNN  V^<<<rv   c                 0    t          | j        dz             )Nz% cancelOrderWs() is not supported yetr  r
  s       rr   r2
  zExchange.cancel_order_ws  r  rv   rf  c                 0    t          | j        dz             )Nz$ cancelOrders() is not supported yetr  rp   rf  r  r  s       rr   cancel_orderszExchange.cancel_orders  rw  rv   clientOrderIdsc                 `    |                      |d|i          }|                     g ||          S )a  
        create a market order by providing the symbol, side and cost
        :param str[] clientOrderIds: client order Ids
        :param str symbol: unified symbol of the market to create an order in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/?id=order-structure>`
        rO  )rA  rN  )rp   rO  r  r  r/
  s        rr   #cancel_orders_with_client_order_idsz,Exchange.cancel_orders_with_client_order_ids  s5     V.>-OPP!!"fn===rv   c                 0    t          | j        dz             )Nz& cancelOrdersWs() is not supported yetr  rM  s       rr   cancel_orders_wszExchange.cancel_orders_ws  r@  rv   c                 0    t          | j        dz             )Nz' cancelAllOrders() is not supported yetr  r  s      rr   cancel_all_orderszExchange.cancel_all_orders  r  rv   c                 0    t          | j        dz             )Nz+ cancelAllSpotOrders() is not supported yetr  r  s      rr   cancel_all_spot_orderszExchange.cancel_all_spot_orders  rj  rv   c                 0    t          | j        dz             )Nz/ cancelAllContractOrders() is not supported yetr  r  s      rr   cancel_all_contract_ordersz#Exchange.cancel_all_contract_orders  r  rv   rx  c                 0    t          | j        dz             )Nz, cancelAllOrdersAfter() is not supported yetr  )rp   rx  r  s      rr   cancel_all_orders_afterz Exchange.cancel_all_orders_after  r$  rv   c                 0    t          | j        dz             )Nz. cancelOrdersForSymbols() is not supported yetr  r;  s      rr   cancel_orders_for_symbolsz"Exchange.cancel_orders_for_symbols  r'  rv   c                 0    t          | j        dz             )Nz) cancelAllOrdersWs() is not supported yetr  r  s      rr   cancel_all_orders_wszExchange.cancel_all_orders_ws  r8  rv   c                     |                      |                     |d          |                     |d          |          S r
  )r+
  r  r
  s      rr   cancel_unified_orderzExchange.cancel_unified_order  s=      !1!1%!>!>@P@PQVX`@a@acijjjrv   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 yetr#	  r  s        rr   fetch_orderszExchange.fetch_orders  s^    8%& 	R484G+H 	Rtw  *Q   Q  R  R  R47%JJKKKrv   c                 0    t          | j        dz             )Nz% fetchOrdersWs() is not supported yetr  r  s        rr   fetch_orders_wszExchange.fetch_orders_ws  r  rv   c                 0    t          | j        dz             )Nz( fetchOrderTrades() is not supported yetr  )rp   r  r  r  rW  r  s         rr   fetch_order_tradeszExchange.fetch_order_trades  r1  rv   c                 0    t          | j        dz             )Nz# watchOrders() is not supported yetr  r  s        rr   watch_orderszExchange.watch_orders  r  rv   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr  r\  r+  z' fetchOpenOrders() is not supported yetr  rc  rL  r   r  rp   r  r  rW  r  r  s         rr   fetch_open_orderszExchange.fetch_open_orders  sV    8M" 	<&&vueVDDF>>&(F;;;47%NNOOOrv   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr  r\  r+  z) fetchOpenOrdersWs() is not supported yetr  re  rL  r   r  rl  s         rr   fetch_open_orders_wszExchange.fetch_open_orders_ws  sV    8O$ 	<))&%GGF>>&(F;;;47%PPQQQrv   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr  r\  r  z) fetchClosedOrders() is not supported yetrk  rl  s         rr   fetch_closed_orderszExchange.fetch_closed_orders  sV    8M" 	>&&vueVDDF>>&(H===47%PPQQQrv   c                 0    t          | j        dz             )Nz+ fetchCanceledOrders() is not supported yetr  r  s        rr   fetch_canceled_orderszExchange.fetch_canceled_orders  rj  rv   c                 0    t          | j        dz             )Nz4 fetchCanceledAndClosedOrders() is not supported yetr  r  s        rr    fetch_canceled_and_closed_ordersz)Exchange.fetch_canceled_and_closed_orders  s    47%[[\\\rv   c                     | j         d         r/|                     ||||          }|                     |dd          S t          | j        dz             )Nr  r\  r  z+ fetchClosedOrdersWs() is not supported yetro  rl  s         rr   fetch_closed_orders_wszExchange.fetch_closed_orders_ws  sV    8O$ 	>))&%GGF>>&(H===47%RRSSSrv   c                 0    t          | j        dz             )Nz% fetchMyTrades() is not supported yetr  r  s        rr   fetch_my_tradeszExchange.fetch_my_trades  r  rv   c                 0    t          | j        dz             )Nz+ fetchMyLiquidations() is not supported yetr  r  s        rr   fetch_my_liquidationszExchange.fetch_my_liquidations  rj  rv   c                 0    t          | j        dz             )Nz) fetchLiquidations() is not supported yetr  r  s        rr   fetch_liquidationszExchange.fetch_liquidations  r8  rv   c                 0    t          | j        dz             )Nz' fetchMyTradesWs() is not supported yetr  r  s        rr   fetch_my_trades_wszExchange.fetch_my_trades_ws  r  rv   c                 0    t          | j        dz             )Nz% watchMyTrades() is not supported yetr  r  s        rr   watch_my_tradeszExchange.watch_my_trades  r  rv   c                 0    t          | j        dz             )Nz# fetchGreeks() is not supported yetr  r  s      rr   fetch_greekszExchange.fetch_greeks  r  rv   c                 0    t          | j        dz             )Nz& fetchAllGreeks() is not supported yetr  r  s      rr   fetch_all_greekszExchange.fetch_all_greeks  r@  rv   c                 0    t          | j        dz             )Nz( fetchOptionChain() is not supported yetr  r  s      rr   fetch_option_chainzExchange.fetch_option_chain  r1  rv   c                 0    t          | j        dz             )Nz# fetchOption() is not supported yetr  r  s      rr   fetch_optionzExchange.fetch_option  r  rv   c                 0    t          | j        dz             )Nz) fetchConvertQuote() is not supported yetr  )rp   r
  r
  r   r  s        rr   fetch_convert_quotezExchange.fetch_convert_quote  r8  rv   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 yetr  rQ
  s        rr   fetch_deposits_withdrawalsz#Exchange.fetch_deposits_withdrawals  s     47%WWXXXrv   c                 0    t          | j        dz             )Nz% fetchDeposits() is not supported yetr  rQ
  s        rr   fetch_depositszExchange.fetch_deposits  r  rv   c                 0    t          | j        dz             )Nz( fetchWithdrawals() is not supported yetr  rQ
  s        rr   fetch_withdrawalszExchange.fetch_withdrawals
  r1  rv   c                 0    t          | j        dz             )Nz' fetchDepositsWs() is not supported yetr  rQ
  s        rr   fetch_deposits_wszExchange.fetch_deposits_ws  r  rv   c                 0    t          | j        dz             )Nz* fetchWithdrawalsWs() is not supported yetr  rQ
  s        rr   fetch_withdrawals_wszExchange.fetch_withdrawals_ws  rW  rv   c                 0    t          | j        dz             )Nz/ fetchFundingRateHistory() is not supported yetr  r  s        rr   fetch_funding_rate_historyz#Exchange.fetch_funding_rate_history  r  rv   c                 0    t          | j        dz             )Nz+ fetchFundingHistory() is not supported yetr  r  s        rr   fetch_funding_historyzExchange.fetch_funding_history  rj  rv   c                 0    t          | j        dz             )Nz% closePosition() is not supported yetr  )rp   r  rY  r  s       rr   close_positionzExchange.close_position  r  rv   c                 0    t          | j        dz             )Nz) closeAllPositions() is not supported yetr  r  s     rr   close_all_positionszExchange.close_all_positions  r8  rv   c                 0    t          | j        dz             )Nz( fetchL3OrderBook() is not supported yet)r   r  r>  s       rr   fetch_l3_order_bookzExchange.fetch_l3_order_book  s    #MMNNNrv   c                 0    t          | j        dz             )Nz& parseLastPrice() is not supported yetr  )rp   r   rX  s      rr   parse_last_pricezExchange.parse_last_price"  r@  rv   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  rs  r  ru  r   )	rp   ra  r  depositAddressesrh  r>  addressStructuresru  r  s	            rr   fetch_deposit_addresszExchange.fetch_deposit_address%  sA   8+, 	X#;;TFFKK!__-=tDDN%$TW/m%mpt%t  x]  &]  ^  ^  ^%%X67 	X&&vy99GYYvy11F $ G Gf U U"~~&7AAA-224455&&tQ//~~&7===tw)VVWWWrv   c                 0    t          | j        dz             )Nz3 fetchContractDepositAddress() is not supported yetr  r  s      rr   fetch_contract_deposit_addressz'Exchange.fetch_contract_deposit_address:  r
  rv   c                     d d d dS )N)r  r  r  r  r  s    rr   r<   zExchange.account=  s    
 
 	
rv   c                 L    | j         s|S |                     | j        ||          S r   )substituteCommonCurrencyCodesr  r_  )rp   ra  s     rr   rd	  zExchange.common_currency_codeD  s-    1 	K 5tTBBBrv   c                 \   t          | j                                                  }t          |          }|dk    rt	          | j        dz             t          |t                    r,|| j        v r| j        |         S || j        v r| j        |         S t	          | j        dz   |z             )Nr   z currencies not loadedz does not have currency code )	r  r   ru  r  r   r  rh   rW  ri  )rp   ra  ru  rn  s       rr   rf  zExchange.currencyI  s    DO((**++D		A*B BCCCdC   	3t&&t,,...,T22DG&EELMMMrv   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
  rm  r   z-Cz-PzC-zP-z does not have market symbol )r  r   r  r   r  r   rH  r  r<  rB  create_expired_option_marketr   )rp   r  r  r
  r   rX  s         rr   rX  zExchange.marketU  sB   <*? ?@@@T\!!<''t)))(0G,,T\=JZ\bccK1c'll++ " " +& "!MMM"1:ood## 	=)>)> 	=FDUDUVZD[D[ 	=agararswaxax 	=44V<<<"AAFJKKKrv   c                 0    t          | j        dz             )Nz1 createExpiredOptionMarket() is not supported yetr  r  s     rr   r  z%Exchange.create_expired_option_marketf  s    47%XXYYYrv   checkBaseCoinexistingCurrenciesc                     g d}t          dt          |                    D ]A}||         }|                    |          r"|s dS |                    |d          }||v r dS BdS )N)2L2S3L3S4L4S5L5SUPDOWNBULLBEARr   Tr   F)rH  r  r<  r  )rp   rs	  r  r  leverageSuffixesr   leverageSuffixbaseCurrencyCodes           rr   is_leveraged_currencyzExchange.is_leveraged_currencyi  s    
 
 

 q#.//00 		$ 		$A-a0N$$^44 $$ $44 (4';';NB'O'O$'+===#tturv   c                     |-t          |t                    r|                     ||          }d }|.|                     |d          }||                     |d          }||gS )Nr  )rh   r   rA  r  r  )rp   r  r  s      rr   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}rv   c                 6    |                      |d||||          S r(
  r,
  rp   r  rY  r   r   r  s         rr   create_limit_orderzExchange.create_limit_order  s       $vNNNrv   c                 6    |                      |d||||          S r(
  r3
  r  s         rr   create_limit_order_wszExchange.create_limit_order_ws  s     ##FGT65&QQQrv   c                 6    |                      |d||||          S NrX  r  r  s         rr   create_market_orderzExchange.create_market_order  s       4OOOrv   c                 6    |                      |d||||          S r  r  r  s         rr   create_market_order_wszExchange.create_market_order_ws  s     ##FHdFE6RRRrv   c                 6    |                      |dd|||          S NrW  r  r  rp   r  r   r   r  s        rr   create_limit_buy_orderzExchange.create_limit_buy_order  s       %OOOrv   c                 6    |                      |dd|||          S r  r  r  s        rr   create_limit_buy_order_wsz"Exchange.create_limit_buy_order_ws  s     ##FGUFE6RRRrv   c                 6    |                      |dd|||          S NrW  r  r  r  s        rr   create_limit_sell_orderz Exchange.create_limit_sell_order  s       &&%PPPrv   c                 6    |                      |dd|||          S r  r  r  s        rr   create_limit_sell_order_wsz#Exchange.create_limit_sell_order_ws  s     ##FGVVUFSSSrv   c                 6    |                      |dd|d |          S NrX  r  r  r  s       rr   create_market_buy_orderz Exchange.create_market_buy_order  s       5&$OOOrv   c                 6    |                      |dd|d |          S r  r  r  s       rr   create_market_buy_order_wsz#Exchange.create_market_buy_order_ws  s     ##FHeVT6RRRrv   c                 6    |                      |dd|d |          S NrX  r  r  r  s       rr   create_market_sell_orderz!Exchange.create_market_sell_order  s       664PPPrv   c                 6    |                      |dd|d |          S r  r  r  s       rr   create_market_sell_order_wsz$Exchange.create_market_sell_order_ws  s     ##FHffdFSSSrv   c                     |d S |                      |          }|                     |t          |d         d         | j        | j                  S Nr   r   )rX  r   r   r`  ra  )rp   r  r   rX  s       rr   cost_to_precisionzExchange.cost_to_precision  sK    <4V$$((x9LW9UW[Wikok{|||rv   c                 6   |d S |                      |          }|                     |t          |d         d         | j        | j                  }|dk    rEt          | j        dz   |d         z   dz   |                     |d         d                   z             |S )Nr   r   r  z
 price of r  z1 must be greater than minimum price precision of )rX  r   r   r`  ra  r   r  r!   )rp   r  r   rX  r?  s        rr   price_to_precisionzExchange.price_to_precision  s    =4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rv   c                 6   |d S |                      |          }|                     |t          |d         d         | j        | j                  }|dk    rEt          | j        dz   |d         z   dz   |                     |d         d                   z             |S )Nr   r   r  z amount of r  z2 must be greater than minimum amount precision of )rX  r   r   r`  ra  r   r  r!   )rp   r  r   rX  r?  s        rr   amount_to_precisionzExchange.amount_to_precision  s    >4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rv   c                     |d S |                      |          }|                     |t          |d         d         | j        | j                  S r  )rX  r   r   r`  ra  )rp   r  r  rX  s       rr   fee_to_precisionzExchange.fee_to_precision  sK    ;4V$$((eVK5H5QSWSegkgwxxxrv   c                    | j         |         }|                     |d          }|E|                     |di           }|                     ||i           }|                     |d|          }||                     |          S |                     | j        dt                    }|                     |||| j        | j	                  S )Nr   r   currencyToPrecisionRoundingMode)
r   r  rs  force_stringr  r   r   r   r`  ra  )	rp   ra  r  rr	  rf  r   r   networkItemroundingModes	            rr   currency_to_precisionzExchange.currency_to_precision  s    ?4(OOHk::	"~~h
B??H..;CCK[)LLI$$S))),,T\;\^cddL,,S,	4K]_c_oppprv   c                 Z    t          |t                    s|                     |          S |S r   )rh   rW  r!   rg  s     rr   r  zExchange.force_string  s-    %%% 	0((///rv   c                 "    | j         t          k    S r   )r`  r   r  s    rr   r	  zExchange.is_tick_precision  s    !Y..rv   c                 "    | j         t          k    S r   )r`  r   r  s    rr   is_decimal_precisionzExchange.is_decimal_precision  s    !^33rv   c                 "    | j         t          k    S r   )r`  r   r  s    rr   is_significant_precisionz!Exchange.is_significant_precision  s    !%777rv   defaultNumberc                 Z    |                      ||          }|                     ||          S r   )r  rR  )rp   rq   r  r  r  s        rr   r  zExchange.safe_number  s-      c**  666rv   c                 Z    |                      ||          }|                     ||          S r   )r  rR  )rp   rq   r]  r  r  s        rr   safe_number_nzExchange.safe_number_n  s-    ""3,,  666rv   r   c                     |dS t          |          }|dk    rdS |dk    r"d}t          d|dz
            D ]}|dz   }|dz   S d}t          d|dz  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  rH  )rp   r   precisionNumberparsedPrecisionr   s        rr   parse_precisionzExchange.parse_precision  s     4i..a3Q"O1o122 8 8"1C"7"S((!O1o2Q677 8 8"1C"7"S((rv   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  rH  )rp   r   positivePrecisionStringpositivePrecisionr  r   s         rr   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((rv   c                     |                      |          }|                                 }||z
  | j        d<   | j        d         S )NtimeDifference)rS  r  r   )rp   r  
serverTimer0  s       rr   load_time_differencezExchange.load_time_difference  sD    __V,,
!!##).);%&|,--rv   c                 <    |                      |d| j        i          S )Nhostname)r  r  )rp   rc  s     rr   r  zExchange.implode_hostname  s    ""3T](CDDDrv   c                 
   | j         d         r`|                     |          }|d         st          | j        dz             |                     |g          }|                     ||          S t          | j        dz             )Nr  rX  z: fetchMarketLeverageTiers() supports contract markets onlyz0 fetchMarketLeverageTiers() is not supported yet)r  rX  r   r  r  r  r   )rp   r  r  rX  r	  s        rr   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)[[\\\rv   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr  z+ createPostOnlyOrder() is not supported yetr  Tr  r   r  rA  r,
  rp   r  ro   rY  r   r   r  querys           rr   create_post_only_orderzExchange.create_post_only_order&  s_    x-. 	Xtw)VVWWWFZ$677  tVUEJJJrv   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr  z- createPostOnlyOrderWs() is not supported yetr  Tr  r   r  rA  r3
  r  s           rr   create_post_only_order_wsz"Exchange.create_post_only_order_ws,  s_    x/0 	Ztw)XXYYYFZ$677##FD$uMMMrv   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr  z- createReduceOnlyOrder() is not supported yetr  Tr  r  s           rr   create_reduce_only_orderz!Exchange.create_reduce_only_order2  s_    x/0 	Ztw)XXYYYF\4$899  tVUEJJJrv   c                     | j         d         st          | j        dz             |                     |ddi          }|                     ||||||          S )Nr  z/ createReduceOnlyOrderWs() is not supported yetr  Tr  r  s           rr   create_reduce_only_order_wsz$Exchange.create_reduce_only_order_ws8  s_    x12 	\tw)ZZ[[[F\4$899##FD$uMMMrv   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   rA  r,
  	rp   r  ro   rY  r   r   r  r  r  s	            rr   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Jrv   c                     | j         d         st          | j        dz             |t          | j        dz             |                     |d|i          }|                     ||||||          S )Nr  z) createStopOrderWs() is not supported yetz2 createStopOrderWs() requires a stopPrice argumentr  )r  r   r  r   rA  r3
  r  s	            rr   create_stop_order_wszExchange.create_stop_order_wsF  s{    x+, 	Vtw)TTUUU#DG.b$bcccF[,$?@@##FD$uMMMrv   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||||          S )Nr  z, createStopLimitOrder() is not supported yetr  rW  r  rp   r  rY  r   r   r  r  r  s           rr   create_stop_limit_orderz Exchange.create_stop_limit_orderN  s_    x./ 	Ytw)WWXXXF[,$?@@  $uMMMrv   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||||          S )Nr  z. createStopLimitOrderWs() is not supported yetr  rW  r  r#  s           rr   create_stop_limit_order_wsz#Exchange.create_stop_limit_order_wsT  s_    x01 	[tw)YYZZZF[,$?@@##FGT65%PPPrv   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||d |          S )Nr  z- createStopMarketOrder() is not supported yetr  rX  r  rp   r  rY  r   r  r  r  s          rr   create_stop_market_orderz!Exchange.create_stop_market_orderZ  s_    x/0 	Ztw)XXYYYF[,$?@@  4uMMMrv   c                     | j         d         st          | j        dz             |                     |d|i          }|                     |d||d |          S )Nr  z/ createStopMarketOrderWs() is not supported yetr  rX  r  r(  s          rr   create_stop_market_order_wsz$Exchange.create_stop_market_order_ws`  s_    x12 	\tw)ZZ[[[F[,$?@@##FHdFD%PPPrv   rg   c                 0    t          | j        dz             )Nz( createSubAccount() is not supported yetr  )rp   rg   r  s      rr   create_sub_accountzExchange.create_sub_accountf  r1  rv   c                 >    |                      ||          }|d         S )Nra  )r5  )rp   rY
  rf  s      rr   r^
  zExchange.safe_currency_codei  s"    %%j(;;rv   c           	      8    |                      |d|||d|          S )Nr  r  r  )rp   r8  r  r  rW  r  s         rr   r  z%Exchange.filter_by_symbol_since_limitm  s%    //xPUWbdhiiirv   c           	      8    |                      |d|||d|          S )Nrf  r  r0  )rp   r8  ra  r  rW  r  s         rr   r	  z'Exchange.filter_by_currency_since_limitp  s%    //z4PUWbdhiiirv   c                 d    |                      |d|d          }|                     |||d|          S )Nr  Fr  )r	  r  )rp   r8  r  r  rW  r  r?  s          rr   filter_by_symbols_since_limitz&Exchange.filter_by_symbols_since_limits  s7    %%eXwFF))&%TRRRrv   c                    g }t          |t                    ret          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           Gnt          |                                          }t          dt          |                    D ]d}||         }|                     |          }	|                     |                     ||         |	          |          }|                    |           e| 	                    |          }| 
                    |d|          S rm	  )rh   r  rH  r  rA  r  rQ  ru  r	  rb	  r	  )
rp   
pricesDatar  r  r  r   	priceData	marketIdsr	  rX  s
             rr   parse_last_priceszExchange.parse_last_pricesw  s7   ( j$'' 
	*1c*oo.. * * KK(=(=jm(L(LfUU	y))))* Z__..//I1c)nn-- * *$Q<))(33 KK(=(=j>RTZ([([]cdd	y))))%%g..##GXw???rv   c                    g }t          |t                    rgt          dt          |                    D ]H}|                     ||                   }|                     ||          }|                    |           Int          |                                          }t          dt          |                    D ]f}||         }	|                     |	          }
|                     ||	         |
          }|                     ||          }|                    |           g| 	                    |          }| 
                    |d|          S rm	  )rh   r  rH  r  re  rA  rQ  ru  r	  rb	  r	  )rp   r   r  r  r  r   parsedTickerrc  r7  r	  rX  r  s               rr   parse_tickerszExchange.parse_tickers  s=   . gt$$ 	'1c'll++ ' '#00<<\6::v&&&&'
 W\\^^,,I1c)nn-- ' '$Q<))(33**78+<fEEVV44v&&&&%%g..##GXw???rv   c                 :   g }t          dt          |                    D ]F}|                     |                     ||                   |          }|                    |           G||                     |d|d          }|r|                     |dd |          }|S )Nr   rf  F)rH  r  rA  ri  rQ  r	  )rp   	addressesr9  r	  r  r?  r   rt  s           rr   parse_deposit_addressesz Exchange.parse_deposit_addresses  s    q#i..)) 	# 	#Akk$"<"<Yq\"J"JFSSGMM'""""))&*eUKKF 	M))&*dGLLFrv   c                     g }t          dt          |                    D ]3}||         }|                    |                     ||                     4|S r;  )rH  r  rQ  r  )rp   rQ  rX  	interestsr   rows         rr   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rv   c                 0    t          | j        dz             )Nz' parseBorrowRate() is not supported yetr  )rp   rJ  rf  s      rr   parse_borrow_ratezExchange.parse_borrow_rate  r  rv   c                    g }t          dt          |                    D ]4}||         }|                     |          }|                    |           5|                     |d          }	|                     |	|||          S )Nr   r  )rH  r  rD  rQ  rd  r	  )
rp   rQ  ra  r  rW  r?  r   rx  
borrowRater3  s
             rr   parse_borrow_rate_historyz"Exchange.parse_borrow_rate_history  s    q#h--(( 	& 	&AA;D//55JMM*%%%%fk222264NNNrv   c                     i }t          dt          |                    D ]:}||         }|                     |          }|                     |d          }|||<   ;|S rm	  )rH  r  r  r  )rp   rJ  r?  r   rx  rF  r  s          rr   parse_isolated_borrow_ratesz$Exchange.parse_isolated_borrow_rates  sg    q#d))$$ 	( 	(A7D88>>J%%j(;;F'F6NNrv   c                    g }t          dt          |                    D ]3}||         }|                    |                     ||                     4|                     |d          }|d n|d         }	|                     ||	||          S Nr   r  r  )rH  r  rQ  r  rd  r  
rp   rQ  rX  r  rW  ratesr   rR  r3  r  s
             rr   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Nrv   c                 B    |                      ||||          }|d         S r	  )r	  )rp   r	  rX  r[
  r  s        rr   safe_symbolzExchange.safe_symbol  s&    !!(FIzJJhrv   rX  c                 0    t          | j        dz             )Nz( parseFundingRate() is not supported yetr  )rp   rX  rX  s      rr   parse_funding_ratezExchange.parse_funding_rate  r1  rv   c                     i }t          dt          |                    D ]*}||         }|                     |          }|||d         <   +|                     |d|          S rm	  )rH  r  rR  r	  )rp   rQ  r  r   r   rR  r  s          rr   parse_funding_rateszExchange.parse_funding_rates  sl    q#h--(( 	4 	4AQKE,,U33F-3L)**##L(GDDDrv   c                 0    t          | j        dz             )Nz+ parseLongShortRatio() is not supported yetr  r  s      rr   parse_long_short_ratiozExchange.parse_long_short_ratio  rj  rv   c                    g }t          dt          |                    D ]3}||         }|                    |                     ||                     4|                     |d          }|d n|d         }	|                     ||	||          S rK  )rH  r  rQ  rV  rd  r  rL  s
             rr   parse_long_short_ratio_historyz'Exchange.parse_long_short_ratio_history  s    q#h--(( 	E 	EAQKELL44UFCCDDDDe[11 .vh/?00NNNrv   c                    |                      |dd          }d }|                     |d          }d }|                     |d          }d }	|=|r|                     |ddg          }|                     |t	          |                    }|;|r|                     |d          }|                     |t	          |                    }|;|r|                     |d          }|                     |t	          |                    }	|||	|gS )Nr  r  r  r  )r  r  r  r  r  )
rp   r  r  
omitParamsr  triggerPriceStrr  stopLossPriceStrr  takeProfitPriceStrs
             rr    handle_trigger_prices_and_paramsz)Exchange.handle_trigger_prices_and_params  s)   ))&.+NN#((AA $**63DEE"&# J6NK+HII"55feL>Q>QRRO$ <6?;;#66vu]?S?STT& >6+<==!%!8!8AWAW!X!X!13EvNNrv   r]	  c                    |                      |d          }|duo||v }||                     |d          }|                     |g d          s|s|st          | j        dz             |dk    s|dk    rd}n|dk    s|d	k    rd
}||gS )z^
 @ignore
        :returns [str, dict]: the trigger-direction value and omited params
        triggerDirectionN)r  rc  updownabovebelowzk createOrder() : trigger orders require params["triggerDirection"] to be either "ascending" or "descending"ra  rc  r  rb  rd  rc  )r  r  ro  r   r  )rp   r  r	  r]	  r`  exchangeSpecificDefineds         rr   #handle_trigger_direction_and_paramsz,Exchange.handle_trigger_direction_and_params$  s    
  ++F4FGG#6d#B"gI\`fIf'YYv'9::F }}-/j/j/jkk 	]  uL 	]  U_ 	]#DG  /\  %\  ]  ]  ]t##'77'B'B*''+;w+F+F+ &))rv   c                 l    |                      |dd          }|r|                     |ddg          }||gS )Ntriggerstopr	  )rp   r  	isTriggers      rr   handle_trigger_and_paramsz"Exchange.handle_trigger_and_params9  sD    $$VY??	 	<YYv	6':;;F6""rv   c                 ,    |                      |          S r   )rk  r  s     rr   is_trigger_orderzExchange.is_trigger_order?  s    --f555rv   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 )z
 @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  rj  r   r  )	rp   rn  exchangeSpecificParamr  r
  r  iocfoktimeInForcePostOnlys	            rr   is_post_onlyzExchange.is_post_onlyC  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5rv   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  rq  r  rr  rs  T)r  r   r   r  r  )	rp   rn  ry  r  r
  r  ru  rv  pos	            rr   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rv   c                 0    t          | j        dz             )Nz' fetchLastPrices() is not supported yetr  r  s      rr   fetch_last_priceszExchange.fetch_last_pricesv  r  rv   c                 0    t          | j        dz             )Nz( fetchTradingFees() is not supported yetr  r  s     rr   r  zExchange.fetch_trading_feesy  r1  rv   c                 0    t          | j        dz             )Nz* fetchTradingFeesWs() is not supported yetr  r  s     rr   fetch_trading_fees_wszExchange.fetch_trading_fees_ws|  rW  rv   c                     | j         d         st          | j        dz             |                     |          }|                     ||          S )Nr  z' fetchTradingFee() is not supported yet)r  r   r  r  rs  )rp   r  r  rX  s       rr   fetch_trading_feezExchange.fetch_trading_fee  sP    x*+ 	Ttw)RRSSS&&v..~~dF+++rv   c                 0    t          | j        dz             )Nz. fetchConvertCurrencies() is not supported yetr  r  s     rr   fetch_convert_currenciesz!Exchange.fetch_convert_currencies  r'  rv   c                 0    t          | j        dz             )Nz) parseOpenInterest() is not supported yetr  )rp   interestrX  s      rr   parse_open_interestzExchange.parse_open_interest  r8  rv   c                     i }t          dt          |                    D ]*}||         }|                     |          }|||d         <   +|                     |d|          S rm	  )rH  r  r  r	  )rp   rQ  r  r?  r   rR  r  s          rr   parse_open_interestszExchange.parse_open_interests  sl    q#h--(( 	. 	.AQKE--e44F'-F6(#$$##FHg>>>rv   c                 4   g }t          dt          |                    D ]5}||         }|                     ||          }|                    |           6|                     |d          }	|                     |d          }
|                     |	|
||          S rK  )rH  r  r  rQ  rd  r  r  )rp   rQ  rX  r  rW  r@  r   rR  r  r3  r  s              rr   parse_open_interests_historyz%Exchange.parse_open_interests_history  s    	q#h--(( 	' 	'AQKE//v>>HX&&&&i55!!&(3300NNNrv   c                    | j         d         r|                                  |                     |          }|d         }|d         st          | j        dz             |                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr  r  rX  z2 fetchFundingRate() supports contract markets onlyz) fetchFundingRate() returned no data for z( fetchFundingRate() is not supported yet)	r  r  rX  r   r  r  r  r   r   rp   r  r  rX  rM  r  s         rr   fetch_funding_ratezExchange.fetch_funding_rate  s    8'( 	U[[((FH%F*% `*^ ^___,,fXv>>E??5&11D|"47-X#X[a#abbbtw)SSTTTrv   c                    | j         d         r|                                  |                     |          }|d         }|d         st          | j        dz             |                     |g|          }|                     ||          }|t          | j        dz   |z             |S t          | j        dz             )Nr  r  rX  z6 fetchFundingInterval() supports contract markets onlyz- fetchFundingInterval() returned no data for z, fetchFundingInterval() is not supported yet)	r  r  rX  r   r  r  r  r   r   r  s         rr   fetch_funding_intervalzExchange.fetch_funding_interval  s    8+, 	Y[[((FH%F*% d*b bccc00&6BBE??5&11D|"47-\#\_e#effftw)WWXXXrv   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  r   markz& fetchMarkOHLCV() is not supported yetr  r%	  rA  r   r  rp   r  r  r  rW  r  r  s          rr   fetch_mark_ohlcvzExchange.fetch_mark_ohlcv  se     8$% 	SG ##FIueT[[QXZ`EaEabbbtw)QQRRRrv   c           
          | j         d         r1ddi}|                     |||||                     ||                    S t          | j        dz             )a>  
        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  r   rK  z' fetchIndexOHLCV() is not supported yetr  r  s          rr   fetch_index_ohlcvzExchange.fetch_index_ohlcv  se     8%& 	TG ##FIueT[[QXZ`EaEabbbtw)RRSSSrv   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  r   premiumIndexz. fetchPremiumIndexOHLCV() is not supported yetr  r  s          rr   fetch_premium_index_ohlcvz"Exchange.fetch_premium_index_ohlcv  se     8,- 	[G ##FIueT[[QXZ`EaEabbbtw)YYZZZrv   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  )rp   r  r
  exchangeValues       rr   handle_time_in_forcezExchange.handle_time_in_force  sn     ,,V]CC" ,,T\--H+VVM$#DG.O$OR]$]`c$cddd  trv   c                     |                      | j        di           } |j                    }||v r||         S || j        v s	|| j        v r|                     |          }|d         S |S )z
 @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  )rs  r   r  r  r   rX  )rp   r<   r  lowercaseAccountrX  s        rr   convert_type_to_accountz Exchange.convert_type_to_account  s{     6FKK(7=??~--!"233%%7d6H+H+H[[))F$<Nrv   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 )
ao  
 @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	 argumentr   z
, one of (rz  )r  ro  r   r  r   )rp   r  argumentargumentNamer   optionsLengthmessageOptionsr\  s           rr   r	  z Exchange.check_required_argument  s     G=1#4#4t}}XW^?_?_#4!YYw//Ngmj03CClRU``G##,~=CC#G,,, $5#4#4#4rv   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'
        r_  Nr}  z1() requires a symbol argument for isolated marginr^  z1() cannot have a symbol argument for cross margin)r   r  )rp   r  r  r  s       rr   check_required_margin_argumentz'Exchange.check_required_margin_argument#  so     *$$6>#DGcMJ$>At$tuuuG##&*<#DGcMJ$>At$tuuu $#*<*<rv   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   ra  )	rh   r  ru  rH  r  r  r5  ro  parse_deposit_withdraw_fee)rp   rQ  r9  currencyIdKeydepositWithdrawFeesr  responseKeysr   rR  r  rY
  rf  ra  s                rr   parse_deposit_withdraw_feesz$Exchange.parse_deposit_withdraw_fees/  s     !Xt,, 	100Lq#l++,, 	b 	bA OE")>xJHOZ))*mDDDUZJ))*55H##Hf55D4==u#=#=,0,K,KJX`,a,a#D)""rv   c                 0    t          | j        dz             )Nz/ parseDepositWithdrawFee() is not supported yetr  )rp   r  rf  s      rr   r  z#Exchange.parse_deposit_withdraw_feeF  r  rv   c                     |d d dd d di dS )N)r  r~   )rJ  r   r   r   r  )rp   rJ  s     rr   deposit_withdraw_feezExchange.deposit_withdraw_feeI  s;    " 
 "  
 
 	
rv   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 )a?  
 @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
        r   r   r   r   r   ra  )r  ru  r  r  rH  )rp   r  rf  networkKeysnumNetworksrs	  r   r>  s           rr   $assign_default_deposit_withdraw_feesz-Exchange.assign_default_deposit_withdraw_feesW  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
rv   c                 0    t          | j        dz             )Nz# parseIncome() is not supported yetr  r  s      rr   parse_incomezExchange.parse_incomem  r  rv   c                 4   g }t          dt          |                    D ]5}||         }|                     ||          }|                    |           6|                     |d          }	|                     |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  )rH  r  r  rQ  rd  r  r  )rp   incomesrX  r  rW  r?  r   rR  r  r3  r  s              rr   parse_incomeszExchange.parse_incomesp  s     q#g,,'' 	" 	"AAJE&&uf55FMM&!!!!fk22!!&(3300NNNrv   c                 d    |d S |                      |d          }|                     |          }|S r;  )r  rX  )rp   r  firstMarketrX  s       rr   get_market_from_symbolsz Exchange.get_market_from_symbols  s7    ?4&&w22[))rv   c                     g }t          dt          |                    D ]1}|                    |                     ||         |                     2|S r;  )rH  r  rQ  r  )rp   r   rX  r  r  rW  r  r   s           rr   parse_ws_ohlcvszExchange.parse_ws_ohlcvs  sV    q#f++&& 	C 	CANN4..vay&AABBBBrv   c                 z    | j         d         r|                     ||||          S t          | j        dz             )a6  
 @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>`
        r  z) fetchTransactions() is not supported yet)r  r  r   r  rQ
  s        rr   fetch_transactionszExchange.fetch_transactions  sE     8./ 	V224vNNNtw)TTUUUrv   c                 2    |                      ||||          S )z[
 @ignore
        Typed wrapper for filterByArray that returns a list of positions
        r	  rp   rn	  r  r\  r	  s        rr   r	  z"Exchange.filter_by_array_positions      
 ##GS&'BBBrv   c                 2    |                      ||||          S )z_
 @ignore
        Typed wrapper for filterByArray that returns a dictionary of tickers
        r  r  s        rr   filter_by_array_tickersz Exchange.filter_by_array_tickers  r  rv   c                 2    |                      ||||          S )z[
 @ignore
        Typed wrapper for filterByArray that returns a list of ADL Ranks
        r  r  s        rr   filter_by_array_adl_ranksz"Exchange.filter_by_array_adl_ranks  r  rv   c                 *    i }i ||<   |||         |<   |S r   r  )rp   r  r  r/  r  s        rr   create_ohlcv_objectzExchange.create_ohlcv_object  s#    F!%FI
rv   maxEntriesPerRequestc                 ^    d }|                      ||d          \  }}|||k    r|}|d}||gS )Nr  rw  r
  )rp   rd  r  r  newMaxEntriesPerRequests        rr   )handle_max_entries_per_request_and_paramsz2Exchange.handle_max_entries_per_request_and_params  sV    "&*.*G*GPVXn*o*o'#/6MQe6e6e#: '#' $f--rv   c                    d }|                      ||dd          \  }}d }	|                      ||dd          \  }	}d }
|                      ||dd          \  }
}d }|}|                      ||d|          \  }}d}g }d}|                     |g 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     *|}|r|                     |          }|dk    rdnd}|                     ||          }|                     ||||          S )NpaginationCallsr  rI  r  paginationDirectionbackwardremoveRepeatedr   )untiluntilltillforwardzM pagination requires a since argument when paginationDirection set to forwardr   r  zDynamic pagination call  method  response length z timestamp r  r  )r
  r  r  r   r  r   r  r  r!   r]  rk  r  r  r  ri   #remove_repeated_elements_from_arrayrd  r  )rp   rd  r  r  rW  r  r  r  maxCallsrI  r  paginationTimestampremoveRepeatedOptioncallsr?  errorsr  rQ  responseLengthbackwardMessagefirstElementforwardMessager  r  uniqueResultsr  	sortedRess                              rr   fetch_paginated_call_dynamicz%Exchange.fetch_paginated_call_dynamic  s   88IZ\^__&
!::66<YZ[[
F"&*&C&CFFTiku&v&v#V"-'+'D'DVVUegu'v'v$f##F,G,G,GHH'+'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  	M DDVLLMl**aaLL44	)))UE3GGGs.   B1K AK B"K AK 
K7 K22K7c                 V   d }|                      ||dd          \  }}d}||k    r	 |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||k    g S )NrI  r  r   r  r   )r
  r   ri   rh   r   )
rp   rd  r  r  rW  r  r  rI  r  r  s
             rr   safe_deterministic_callz Exchange.safe_deterministic_call	  s   
!::66<YZ[[
F
""
 O+D!D!D07400E5RXYYY07400vNNN   a!233 G!J&&G '&&&&	 
"" 	s   $A( A( (
B 2$BB c                    d }|                      ||dd          \  }}|                     |||          \  }}|                                 }	g }
|                     |          dz  }||z  }|	||z  z
  dz
  }|t	          ||          }nt	          |d          }|                     |dd          }|gt          t          j        ||z
            |z            }||k    r:t          | j
        dz   t          |          z   d	z   t          |          z             t          d
|          D ]Z}|||k    r nO||	k    r nG|
                    |                     ||||||                     |                     ||          dz
  }[|
}g }t          d
t!          |                    D ]}|                     |||                   }|                     |          }|dk    rd
nd}|                     ||||          S )Nr  r  rw  r   l   82>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  r  r  r   r  r  r  ceilr   r  rW  rH  rQ  r  r  r  rk  r  r  )rp   rd  r  r  rW  r  r  r  r  rF  tasksr  stepcurrentSincer  requiredCallsr   r  r?  r  r  s                        rr   "fetch_paginated_call_deterministicz+Exchange.fetch_paginated_call_deterministic  s   88IZ\^__&'+'U'UV\^rtz'{'{$f##%%##I..5**(T/2Q6|U33LL|];;L##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!(=(=w&&LL55fflThjsu{||}}}88L$77!;LLq#g,,'' 	; 	;A&&vwqz::FF@@HHl**aa))-sKKKrv   c
                    d }
|                      ||dd          \  }
}d }|                      ||dd          \  }}|                     ||	|          \  }	}d }d}d}g }|                     |d          }|                     |d          }||
k     r	 |||                     |          |z   }|||<   d }|dk    r t          | |          |          }ng|dk    s|d	k    r t          | |          ||          }n@|d
k    r t          | |          ||||	|          }n t          | |          |||	|          }d}t          |          }| j        rQ|dn|}|dz   }dt          |          z   dz   |z   dz   t          |          z   dz   |z   }| 	                    |           |dk    rn| 
                    ||          }|                     ||dz
            }d }t          d|          D ]R}||z
  dz
  }|                     ||          }|                     |d          }|                     ||          }||} nS|nP|                     |d          }|||k     rn1n$# 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  rI  r  r   r  r  getLeverageTiersPaginatedr  r  r   r   zCursor pagination call r  r  z cursor rJ  r  r  )r
  r  r  r  r  r   r  r  rW  r]  rk  rs  rH  r  r  ri   sort_cursor_paginated_resultr  ) rp   rd  r  r  rW  r  cursorReceived
cursorSentcursorIncrementr  r  rI  cursorValuer   r  r?  r  rQ  r  cursorString	iterationcursorMessager  r  rK  rR  rJ  cursorlastTimestampr  r3  r  s                                    rr   fetch_paginated_call_cursorz$Exchange.fetch_paginated_call_cursor<  s   88IZ\^__&
!::66<YZ[[
F'+'U'UV\^rtz'{'{$f$$V[99	6;//(ll+*&2&*&7&7&D&D&V)4F:&_,,4wtV44V<<HH:::fHX>X>X4wtV44VVDDHH9994wtV44VYOcekllHH4wtV44VUDXZ`aaH!$X< ,*5*=22KL!"QI$=I$NQ[$[^d$dgz$z  ~A  BP  ~Q  ~Q  %Q  T^  %^  am  %mMHH]+++!Q&&**68<<~~h0BCC"q.11  A*Q.2E NN8U;;E>>%88D!__T>BBF)&, * & $ 1 1$ D D ,1F1F   !J&&G '&&&& FA[ (ll\ 226::l**aa))&%DDDs&   DI" +BI" I" "
J,I>>J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  rI  r  r   r   zIncremental pagination call r  r  r  r  )r
  r  r   r  r  rW  r]  rk  ri   r  r  )rp   rd  r  r  rW  r  pageKeyr  r  rI  r   r  r?  rQ  r  r  incrementalMessager  r3  r  s                       rr    fetch_paginated_call_incrementalz)Exchange.fetch_paginated_call_incrementalz  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$ 226::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  rd  )rp   r?  rn  s      rr   r  z%Exchange.sort_cursor_paginated_result  s`    **e##||FK>>>u}}||FD$777rv   fallbackToTimestampc                 ,   i }g }t          dt          |                    D ]Z}||         }|r|                     |g d          n|                     |d          }|||vrd||<   |                    |           [t          |          }|dk    r|S |S )Nr   )r  r  r   r  r   )rH  r  r  r  rQ  )	rp   r  r  	uniqueDicuniqueResultr   rR  	uniqValuevaluesLengths	            rr   r  z,Exchange.remove_repeated_elements_from_array  s    	q#e**%% 	+ 	+A!HEM`  D**52H2H2HIIIfjfvfvw|  C  gD  gDI$i9.D.D'(	)$##E***<((!rv   c                    i }t          dt          |                    D ]}||         }|                     |d          }|||                     |d          }|                     |d          }|                     |d          }|                     |d          }	dt          |          z   dz   |	z   dz   |z   dz   |z   }|	||vr|||<   t	          |                                          }
|
S )	Nr   r  r   r   r  rY  t_r   )rH  r  r  rW  r  r\  )rp   r  r  r   rR  r  r   r   r  rY  r\  s              rr   !remove_repeated_trades_from_arrayz*Exchange.remove_repeated_trades_from_array  s   q#e**%% 	) 	)A!HE!!%..Bz((88))%:: ,,UK@@	''v66C	NN*S047#=EKfT~r\'9'9#(R l))++,,rv   r   
removeKeysc                     t          |                                          }i }t          dt          |                    D ]+}||         }|                     ||          s||         ||<   ,|S r;  )r  ru  rH  r  ro  )rp   r   r  ru  newDictr   r  s          rr   remove_keys_from_dictzExchange.remove_keys_from_dict  sm    DIIKK  q#d))$$ 	) 	)Aq'C==j11 )#Cyrv   c                     |                      |dd          }|3|                     ||z            ||<   |                     |ddg          }||gS )Nr  r  )r  r  r  )rp   r  r  r  
multiplierr  s         rr   handle_until_optionzExchange.handle_until_option  s^    ##FGV<<,,UZ-?@@GCLYYv'899F  rv   r  c                    |                      |d          }||                      |d          }|                     |||                     |d          |                     |d          |                     |d          |                     |d          |                     |d          |                      |d          |                     |d          d	          S )
Nr  r  r  openInterestAmountopenInterestValuer  r  rJ  )r  r  r  r  r  r  r  rJ  )r  rA  r  r  r  )rp   r  rX  r  s       rr   safe_open_interestzExchange.safe_open_interest  s    !!(H55>%%fh77F{{8**8\BB++HmDD"&"2"28=Q"R"R!%!1!1(<O!P!P**8[AA((:>>OOHf55	&
 	&
 	 	 		rv   c                 0    t          | j        dz             )Nz( parseLiquidation() is not supported yetr  )rp   r  rX  s      rr   parse_liquidationzExchange.parse_liquidation  r1  rv   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  )rH  r  r  rQ  rd  r  r  )rp   r   rX  r  rW  r?  r   rR  r  r3  r  s              rr   parse_liquidationszExchange.parse_liquidations  s     q#l++,, 	" 	"A OE++E6::FMM&!!!!fk22!!&(3300NNNrv   greeksc                 0    t          | j        dz             )Nz# parseGreeks() is not supported yetr  )rp   r  rX  s      rr   parse_greekszExchange.parse_greeks  r  rv   c                    g }t          |t                    rgt          dt          |                    D ]H}|                     ||                   }|                     ||          }|                    |           Int          |                                          }t          dt          |                    D ]f}||         }	|                     |	          }
|                     ||	         |
          }|                     ||          }|                    |           g| 	                    |          }| 
                    |d|          S rm	  )rh   r  rH  r  r  rA  rQ  ru  r	  rb	  r	  )rp   r  r  r  r  r   r:  greekr7  r	  rX  r  s               rr   parse_all_greekszExchange.parse_all_greeks  s=    fd## 	&1c&kk** & &#00;;L&99u%%%%&
 V[[]]++I1c)nn-- & &$Q<))(33**6(+;VDDFF33u%%%%%%g..##GXw???rv   chainc                 0    t          | j        dz             )Nz# parseOption() is not supported yetr  )rp   r"  rf  rX  s       rr   parse_optionzExchange.parse_option  r  rv   currencyKey	symbolKeyc                 L   i }t          dt          |                    D ]}||         }|                     ||          }|                     |          }|                     ||          }	|                     |	d d d          }
|                     |||
          ||
d         <   |S )Nr   rq  r  )rH  r  r  r5  r	  r$  )rp   rQ  r%  r&  optionStructuresr   rJ  rY
  rf  r	  rX  s              rr   parse_option_chainzExchange.parse_option_chain  s    q#h--(( 	[ 	[AA;D))$<<J))*55H''i88H%%hdHEEF151B1B4SY1Z1ZVH-..rv   c                 8   i }|d}t          dt          |                    D ]u}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r|                     ||	          ||	d         <   v|S Nro  r   r  )rH  r  r  r	  ro  parse_margin_mode)
rp   rQ  r  r&  r  marginModeStructuresr   rJ  r	  rX  s
             rr   parse_margin_modeszExchange.parse_margin_modes  s    !Jq#h--(( 	^ 	^AA;D''i88H%%hdJGGFDMM&2BG$L$L9=9O9OPTV\9]9]$VH%56##rv   c                 0    t          | j        dz             )Nz' parseMarginMode() is not supported yetr  )rp   r  rX  s      rr   r,  zExchange.parse_margin_mode(  r  rv   c                 8   i }|d}t          dt          |                    D ]u}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r|                     ||	          ||	d         <   v|S r+  )rH  r  r  r	  ro  parse_leverage)
rp   rQ  r  r&  r  leverageStructuresr   rJ  r	  rX  s
             rr   parse_leverageszExchange.parse_leverages+  s    Jq#h--(( 	Y 	YAA;D''i88H%%hdJGGFDMM&2BG$L$L7;7J7J4QW7X7X"6(#34!!rv   c                 0    t          | j        dz             )Nz% parseLeverage() is not supported yetr  )rp   r   rX  s      rr   r1  zExchange.parse_leverage7  r  rv   conversionsfromCurrencyKeytoCurrencyKeyc                    |                      |          }g }d }	d }
t          dt          |                    D ]}||         }|                     ||          }|                     ||          }||                     |          }	||                     |          }
|                     |                     ||	|
          |          }|                    |           |                     |d          }d }||                     |          }|d         }|| 	                    |||          S | 
                    |d|          }| 
                    |d|          }|                     ||          }| 	                    |||          S )Nr   r  ra  fromCurrency
toCurrency)rJ  rH  r  r  r5  rA  parse_conversionrQ  rd  r  rL  rk  )rp   r5  ra  r6  r7  r  rW  r  r?  r9  r:  r   rR  fromIdtoId
conversionr3  rf  fromConversiontoConversionboths                        rr   parse_conversionszExchange.parse_conversions:  s   mmK00
q#k**++ 		& 		&ANE%%e_==F##E=99D!#11&99!//55
T%:%:5,PZ%[%[]cddJMM*%%%%fk22))$//HF#D<--feUCCCEE~~flDAA  >>))$u===rv   r>  r9  r:  c                 0    t          | j        dz             )Nz' parseConversion() is not supported yetr  )rp   r>  r9  r:  s       rr   r;  zExchange.parse_conversionU  r  rv   datec                 j    |dd         }|dd         }|dd         }d|z   dz   |z   dz   |z   dz   }|S )Nr   r9  r  r  20r  z
T00:00:00Zr  )rp   rD  r  r  r  reconstructedDates         rr   convert_expire_datezExchange.convert_expire_dateX  sR    AaCyQqS	1Q3i 4K#-5;cALP  rv   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   r9  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DECr  )rp   rD  r  monthRawr  r  rG  s          rr   %convert_expire_date_to_market_id_datez.Exchange.convert_expire_date_to_market_id_date`  s   AaCy!91Q3itEEEEEEEEEEEEEEEEEEEEEEE%K$.  rv   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 )NrJ  rL  rN  rP  rR  rT  rV  rX  rZ  r\  r^  r`  )rK  rM  rO  rQ  rS  rU  rW  rY  r[  r]  r_  ra  r  r  r   r9  r9	  rD  )r  r  )rp   rD  monthMapppingr  	monthNamer  r  rG  s           rr   convert_market_id_expire_datez&Exchange.convert_market_id_expire_date  s     
 
 t99>>:DAaCy1I	  	::1Q3i%K$.  rv   c                     | j         d         r|                     |g|||          }|S t          | j        dz             )  
        fetches the history of margin added or reduced from contract isolated positions
        :param str [symbol]: unified market symbol
        :param int [since]: timestamp in ms of the position
        :param int [limit]: the maximum amount of candles to fetch, default=1000
        :param dict params: extra parameters specific to the exchange api endpoint
        :returns dict[]: a list of `position structures <https://docs.ccxt.com/?id=position-structure>`
        r
  z, fetchPositionHistory() is not supported yet)r  fetch_positions_historyr   r  )rp   r  r  rW  r  r	  s         rr   fetch_position_historyzExchange.fetch_position_history  sL     8+, 	Y44fXueVTTItw)WWXXXrv   c                 V    |                                  |                                 g d S r   )r  r  r  s    rr   load_markets_and_sign_inz!Exchange.load_markets_and_sign_in  s'    					dllnn----rv   c                 0    t          | j        dz             )ri  z- fetchPositionsHistory() is not supported yetr  r	  s        rr   rj  z Exchange.fetch_positions_history  s     47%TTUUUrv   c                 0    t          | j        dz             )Nz/ parseMarginModification() is not supported yetr  )rp   r/  rX  s      rr   parse_margin_modificationz"Exchange.parse_margin_modification  r  rv   c                 D   g }t          dt          |                    D ]}||         }|                     ||          }|                     |d d |          }	||                     |	d         |          r)|                    |                     ||	                     |S rm	  )rH  r  r  r	  ro  rQ  rp  )
rp   rQ  r  r&  r  marginModificationsr   rJ  r	  rX  s
             rr   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""rv   c                 0    t          | j        dz             )a(  
        fetches a transfer
        :param str id: transfer id
        :param [str] code: unified currency code
        :param dict params: extra parameters specific to the exchange api endpoint
        :returns dict: a `transfer structure <https://docs.ccxt.com/?id=transfer-structure>`
        z% fetchTransfer() is not supported yetr  rT
  s       rr   fetch_transferzExchange.fetch_transfer  s     47%LLMMMrv   c                 0    t          | j        dz             )a  
        fetches a transfer
        :param str id: transfer id
        :param int [since]: timestamp in ms of the earliest transfer to fetch
        :param int [limit]: the maximum amount of transfers to fetch
        :param dict params: extra parameters specific to the exchange api endpoint
        :returns dict: a `transfer structure <https://docs.ccxt.com/?id=transfer-structure>`
        z& fetchTransfers() is not supported yetr  rQ
  s        rr   fetch_transferszExchange.fetch_transfers  s     47%MMNNNrv   c                 0    t          | j        dz             )a  
        watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
        :param str symbol: unified symbol of the market to fetch OHLCV data for
        :param str timeframe: the length of time each candle represents
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns int[][]: A list of candles ordered, open, high, low, close, volume
        z$ unWatchOHLCV() is not supported yetr  r  s       rr   un_watch_ohlcvzExchange.un_watch_ohlcv  s     47%KKLLLrv   c                 0    t          | j        dz             )a:  
        watches a mark price for a specific market
        :param str symbol: unified symbol of the market to fetch the ticker for
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `ticker structure <https://docs.ccxt.com/?id=ticker-structure>`
        z& watchMarkPrice() is not supported yetr  r  s      rr   watch_mark_pricezExchange.watch_mark_price       47%MMNNNrv   c                 0    t          | j        dz             )a9  
        watches the mark price for all markets
        :param str[] symbols: unified symbol of the market to fetch the ticker for
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `ticker structure <https://docs.ccxt.com/?id=ticker-structure>`
        z' watchMarkPrices() is not supported yetr  r  s      rr   watch_mark_priceszExchange.watch_mark_prices       47%NNOOOrv   c                 0    t          | j        dz             )a  
        make a withdrawal
        :param str code: unified currency code
        :param float amount: the amount to withdraw
        :param str address: the address to withdraw to
        :param str tag:
        :param dict [params]: extra parameters specific to the bitvavo api endpoint
        :returns dict: a `transaction structure <https://docs.ccxt.com/?id=transaction-structure>`
        z" withdrawWs() is not supported yetr  r  s         rr   withdraw_wszExchange.withdraw_ws  s     47%IIJJJrv   c                 0    t          | j        dz             )aU  
        unWatches information on multiple trades made by the user
        :param str symbol: unified market symbol of the market orders were made in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `order structures <https://docs.ccxt.com/?id=order-structure>`
        z' unWatchMyTrades() is not supported yetr  r  s      rr   un_watch_my_tradeszExchange.un_watch_my_trades  r  rv   c                 0    t          | j        dz             )a  
        create a list of trade orders
        :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/?id=order-structure>`
        z& createOrdersWs() is not supported yetr  r;  s      rr   create_orders_wszExchange.create_orders_ws  r|  rv   r\  c                 0    t          | j        dz             )a  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :param str symbol: unified symbol of the market to fetch the order book for
        :param int [limit]: the maximum amount of order book entries to return
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/?id=order-book-structure>` indexed by market symbols
        z- fetchOrdersByStatusWs() is not supported yetr  )rp   r\  r  r  rW  r  s         rr   fetch_orders_by_status_wsz"Exchange.fetch_orders_by_status_ws  s     47%TTUUUrv   c                 0    t          | j        dz             )a7  
        unWatches best bid & ask for symbols
        :param str[] symbols: unified symbol of the market to fetch the ticker for
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `ticker structure <https://docs.ccxt.com/?id=ticker-structure>`
        z' unWatchBidsAsks() is not supported yetr  r  s      rr   un_watch_bids_askszExchange.un_watch_bids_asks  r  rv   subHash	unsubHashc                    ||j         v r|j         |= |sK||j         v r|j         |= ||j        v r0t          | j        dz   |z             }|                    ||           nt          |j                                                   }t          dt          |                    D ]'}||         }|	                    |          r|j         |= (t          |j                                                  }	t          dt          |	                    D ]O}|	|         }
|
	                    |          r0t          | j        dz   |
z             }|                    ||
           P|
                    d|           d S )Nr}  r   T)subscriptionsr  r   r  rejectr  ru  rH  r  rB  resolve)rp   r  r  r  subHashIsPrefixr  clientSubscriptionsr   r  clientFuturesrp  s              rr   clean_unsubscriptionzExchange.clean_unsubscription'  s   ,,,$Y/ 	1&...(1&.(((3)@AAeW---"&v';'@'@'B'B"C"C1c"56677 2 2)!,>>'** 2,S1 !4!4!6!677M1c-0011 1 1&q)$$W-- 1,TWs]V-CDDEMM%000tY'''''rv   subscriptionc                    |                      |d          }|                     |dg           }t          |          }|dk    r|                     |dg           }t          dt          |                    D ]c}||         }|                      |d          }|                      |d          }	| j        &|| j        v r|	| j        |         v r| j        |         |	= dd S |dk    rt          dt          |                    D ]i}||         }|dk    r|| j        v r| j        |= "|dk    r|| j        v r| j        |= :|d	k    r|| j        v r| j        |= R|d
k    r|| j        v r| j        |= jd S |dk    r| j	        	d | _	        d S |dk    r| j
        	d | _
        d S |dk    rn| j        gd | _        t          | j                                                  }
t          dt          |
                    D ]}|
|         }|j        }|d|v r|d= d S |d	k    s|dk    rh| j        at          | j                                                  }t          dt          |                    D ]}||         }|| j        v r| j        |= d S |d
k    rf| j        at          | j                                                  }t          dt          |                    D ]}||         }|| j        v r| j        |= d S d S d S )Ntopicr  r   r!  r   r   r   r  rc  r   myTradesr  r	  fetchPositionsSnapshotr	  )r  r|  r  rH  r   r   r   r   r   r  r  r	  r  clientsr\  r  ru  )rp   r  r  r  r`	  r!  r   symbolAndTimeFramer  r  r  r  r  tickerSymbolstickerSymbolbidsaskSymbolsbidsaskSymbols                    rr   clean_cachezExchange.clean_cache>  s     w77..y"==GG#'>>,@VXZ#[#[ 1c"67788 ; ;%9!%<"))*<a@@ ,,-?CC	K+&DK2G2G DK$777 K/	:; ; Q1c'll++ 2 2 H$$,, K/k))00 OF3h&&-- L0j((.. M&12 2 
""(A $(""(?"+%%4>+E!%t|224455q#g,,// > >A$QZF$nG+2Jg2U2U#$<=	> >
 8##u';';$,BZ $T\%6%6%8%8 9 9q#m"4"455 7 7A#0#3L#t|33 L67 7 *$$$-*C!%dm&8&8&:&:!;!;q#n"5"566 9 9A$21$5M$55 M-8 %$*C*C9 9rv   r  c                     |dk    rdS d}d|z  }d|z  }d|z  }d|z  }||z  dk    r||z  dz   S ||z  dk    r||z  dz   S ||z  dk    r||z  d	z   S ||z  dk    r||z  d
z   S ||z  dk    r||z  dz   S dS )Nr   r   rw  r     rD  r1  r  r  r  r   r  )rp   r  r  r  r  r  weeks          rr   timeframe_from_millisecondsz$Exchange.timeframe_from_millisecondst  s    772fF{4i3w9>>9##8q==8s""9>>9##;!;#%%;!;#%%rrv   r   )r$  )rr  NN)r   )r  )r   )Fr   )F)r  )r  )r  T)r   )r}  )r  r	  )r-  )r;  NFr  )r7   F)r7   )T)r   r   r9  )NNNN)Nr  F)NNr  F)NNNr  F)NNN)NNNNN)r.	  r  r  r/	  rJ  r  F)NN)NNTFF)Nrj	  ri	  r   r   r9  )Nr 	  NNF)NNTTr  )r 	  r   r1  )Nr 	  NN)FN)NNNF)r   (x  rk   rs   rt   __doc__r  rg   rd  r}  rf  rg  rh  re  r  rx  r  aiohttp_proxyssl_contextr   r   r   r   tcp_connectoraiohttp_socks_connectorsocks_proxy_sessionsrz  r  validateClientSslr   r  r  r  r9  rZ  r  rb  r  rX  loaded_feesrf  r  r  parseJsonResponse	throttlerr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rV  r  r  r  r  r  r  
userAgentsr   r  r   r  r  ry  r  r   r   r   r   r   r   r   r   r   r   ri  r   r   r   r   r	   r   r   r
   r   r\  r   r   r   r  triggerOrdersr   r  r   r   r   r   r   r   base_currenciesquote_currenciesr   r   r  r	  r	  r\  rY  r  r  r   r`  r   ra  r  r  rm  r   r/   __annotations__handleContentTypeApplicationZipr  r  lastRestPollTimestamprestRequestQueuerestPollerLoopIsRunningrateLimitTokensrateLimitMaxTokensrateLimitUpdateTimer  r  r  r  r  r  r
  r
  r
  r  rF  rE  rG  r|  compilery  r_  r   r#   r	  r  r  r  r  r#  rW  r.  r3  r7  r?  r*  staticmethodrS  rY  r]  ri  rq  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  r9  rA  r   rL  rN  rS  rV  rZ  rY  rd  rg  rk  ro  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  
IGNORECASEr  r  r  r  r-  r  r  r  r#  r  r  r  r,  rL  r>  rV  r^  rm  rx  r  r  r>   r  r  r9   r  r  r  rA  r  ro  r  r  r  rJ  r  r  r  r  r  r  r  r  r  r   r  r  r#  rb  r7  r  r>  r?  r  r  rK  r  rR  rU  rZ  r  ra  re  rh  rj  rl  ro  rs  ru  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ   r
  r6  r:  r>  rC  rF  rI  rM  rT  rY  r^  rb  ra   r   rb   r&   r  rg  rj  r   r   rp  rs  ru  rx  rz  r|  r  r~  r  r  r  r  r-   r  r  r  r  r  r  r  objectrc   r  r  r  r   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r   r#  r&  r*  r-  r0   r0  r3  r5  r7  r<  r?  rB  rF  rD  rM  rO  rQ  rS  rV  rZ  r^  r`  rb  r+   re  r%   ri  rn  rr  rt  rv  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  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   r9  rQ  rb  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r  r  r	  r	  r	  r	  r	  r	  r	  r	  r%	  r'	  r)	  r+	  r-	  r7	  rA	  rQ	  rU	  rY	  r[	  rb	  re	  rg	  rk	  rp	  r  r  rx	  r|	  r	  r	  r	  r	  r	  r	  r	  r2   r	  r	  r	  r	  r	  r	  r	  r	  r	  r  r	  r	  r	  r	  r8  rX  rW	  rS	  r  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	
  r  r
  r)   r
  r
  r$
  r&
  r'   r"
  r(   r)
  r0
  r4
  r6
  r8
  r:
  r<
  r>
  rA
  rD
  rG
  rI
  rK
  rM
  rO
  rR
  rU
  r  r5  r	  rc
  re
  rg
  ri
  rk
  rm
  ro
  rr
  ru
  rx
  rz
  r|
  r
  r~
  r
  r
  r
  r
  r
  r
  r
  rJ  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+  r9  r*   r<  r>  r@  rB  r3
  r+
  rF  rH  rJ  r2
  rN  rQ  rS  rU  rW  rY  r[  r1   r]  r_  r3   ra  rc  re  rg  ri  rm  rp  rr  rt  rv  rx  rz  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$   r<   rd	  rf  rX  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	  r3  r8  r;  r>  rB  rD  rG  rI  rN  rP  rR  rT  rV  rX  r^  rf  rk  rm  rx  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,  r3  r1  rB  r;  rH  rc  rg  rk  rm  rj  rp  rs  ru  rw  ry  r{  r~  r  r  r  r  r  r  r  r  r  rv   rr   rU   rU      s	{        	BDIGI
CEOIGLMKIGM"FFGGGEJK( 	
 
 	
 
 D  $
 
 
	 K CD
CI EHIIJJKJKIJGHHILN G C Q J
 G!FeIGHFFH
CIJMEEMIJ 
 

 
 

 
 

 
 
 F&}~ 	  	#	
 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#  	#!" 	##$ $##"""3  N6 GLJFMNHFLFGLHOJG HIF   CH"MK$(!FG&+#J #O!" $ MNNRO%2:m44  
 K13 AR AR AR AR AR ARF  Z Z Z     ' ' ' ' c S     s #          = = =<# < < < <   \) ) ) )  % % %- - -S$ S$ S$ S$j  _ _ _
   \ ! ! ! \!    \ U U U \U U U U \U ! ! ! \! ! ! ! \! S S S \S    \ % % % \%    \ = = = \= = = = \= % % % \% % % % \% \ \ \ \\    \" ! ! ! \! B B B \B ) ) ) \) ) ) ) \) ! ! ! \!    \ Z Z Z \Z = = = \=   \  W W W \W
 @ @ @ \@    \ H H H \H H H H \H ! ! \! ; ; ; ; \;   \   \ 0 0 \0   \   \ &+     \> 9 9 9 \9 5 5 5 \5   \ - - \- - - \-   \" j j j \j Q Q Q \Q   \ " " \"   \  = = \=   \ 5u R R R \R *4L)A)A&+- e e e \e S S \S. % > > > \> 0 0 0 \0   \     \    \ F F \F     \  + + \+ ' ' \' 	 	 	 \	 I I I \I P P P \P
 5 5 5 \5 4 4 4 \4 F F F \F - - - \- ",	1 	" "    \< 
 
 
 \
 (/u    \   \   \ F F \F = = \= , , \, = = \= 4 4 \4 '/B !B !B !B \!BF q q q \q ' ' \' Y Y \Y   \ 
 
 \
,   \* / / \/   \   \ ; ; \; B
 B
 B
 \B
J -
 -
 -
 \-
^#% #C # # # # 4 4 4 \4 4 4 4 \4 L L L \L
   \ & & \& & & \& F F \F    \0! ! !      #(  5  5  5  5D $& + + + + ')    

 

 

   \* 8B I I I \I\ \ \W W W   \
   \  / / \/ , , \, ) ) \) < < \</ / / F F \F   \&   ! ! !U U Ur r r    \B B B? ? ?  ! ! !@ @ @ @R R R R& & &! ! ! !
< < <  = = =    N N N   @B  3    B @B  3    :L L L
 
 
     = = =8/& /& /& /&bD D D      f f f  (" " "." " "(
" 
" 
"" " "" " "
" 
" 
"" " "" " """ " "  " " "hQ
# Q
 Q
 Q
 Q
f
	 	$y/ 	QU 	 	 	 	H HI HY HVZ H H H H	 	 	$ 	 	 	 	 $y/ QU      $    H HI HS HPT H H H H $y/ QUVYQZ    N N) N3 NVZ[^V_ N N N N y S	    4 4 4G G G( ( (y (aj (  H ( ( ( (
  DI        C     83    +3 +3 +3C +3 +3 +3 +3Z1 1 1<j j j S    3     T&\ # 9 os    4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*. . . . .63$ 3 3 3 3  %-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 <@d[] R R RS R R R R R
 OSaenp \ \d3i \ \[^ \ \ \ \ ?CQU^` T TC T T3 T T T T
 RVdhqs ^ ^c ^3 ^^a ^ ^ ^ ^ 6:UW L L3 Ls L# L L L L -1 N Nc N N N N 35 N Nc N N N N IM[_hj V VS	 V# VUX V V V V FH X X49 X X X X 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 XZ W WtDI W W W W MQY[ Y YDI Yc Y Y Y Y JL [ [tCy [ [ [ [ 59 Q Q' Q Q Q Q 35 N Nc N N N N 79 Q Q# Q Q Q Q 7;2 R RG R R R R 8<B V VW V V V V :>b O Os O3 O O O O =A Q Q# Qc Q Q Q Q 57 T T T T T T 59 Q Q' Q Q Q Q 8<B 	 	 	 	 :>b O Os O3 O O O O 79 Q Q# Q Q Q Q !# J J J J 7;2 S SG S S S SN$ N N N N  L4 L L L L  L L4 L L L L LT Th T T T TK K Kv K K K KQ QT QX Q Q Q QN Nt Nx N N N NMT M M M MQ Qt Qx Q Q Q QK K Kv K K K K /1 V V V V 24 Y Y Y YY Y Y Y Y Y 7;2 S SG S S S SN Nt NV N N N NX Xv X X X XT T$ T T T T TX Xt XV X X X XM MD M& M M M MM MD M& M M M MR R$ R R R R R/ /F / / / / 6:" R R7 R R R R :>b V Vw V V V V 68 Q Q Q Q Q Q 6:" R R7 R R R R 9=R T Tg T T T T JL 9 9tCy 9 9 9 9 [] I IS I% Ic Ic I I I I KOWY I IS I% I# IC 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 26b O Ow 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 DHPR T TS TS T T T T <@RVeix|  FH [ [S [C [_b [ru [ [ [ [ =Adaetx  BD 
] 
]c 
] 
][^ 
]nq 
] 
] 
] 
] >B" N N# Ns N N N N DF _ _s _ _ _ _ IM[_nr{} Y Y# Y# YUX Yhk Y Y Y Y 79 V V# V V V V 7;2 S SG S S S S   G G G G ,. T T T T$ $ $" " "U    ? ? ?: : :i :s : : : :
 & y PS    - - -  *#x #x #xJ$ $s $ $c $ $ $ $L
r 
rC 
rS 
rC 
rfi 
r 
r 
r 
r;1 ;1 ;1c ;1s ;1fi ;1  AD ;1 ;1 ;1 ;1z$ $ $ $ $B B B

 
 
&
 &
v &
 &
 &
 &
 &
Pa a a a aFM MD M M M M^T T T Tl  2% %be %w{ % % % %
 D        DZ Z Zf Z Z Z Zx =Atbfoq &P &P6 &P6 &P &P\_ &P &P &P &PP t{  LP  Y[ $
 $
c $
 $
C $
QV $
_d $
  FI $
 $
 $
 $
L jqy{ k kC ks k# ku kUZ k k k k D &    "  f    ,   S    BS    U E      _ _ _J J JXL L$ L L L L L\ BD K Kc K5 K K K K CE M Ms ME M M M M SU P PC Ps PE 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 EIQS B B# Bu Bc B B B B DHPR   e S     9=4^bkm U U# U# US UX[ U U U U >BPTcgpr O Os Os O# O]` O O O O BFTXgktv S S3 S3 Sc Sad S S S S <@daenp v vS vS v v[^ v v v v 9=4^bkm K K# K# KS KX[ K K K K De4E    & De4E    0+, +, +, +,Z '     '     7     g C    < '      9 hq     =A  # c         
 
 
4 
 
 
 
. .c . . . . .` C c    (- - -" " " " "m m mn n n   6+ + +i +y + + + +

 

& 

# 

# 

  AJ 

  [d 

  xA 

 

 

 

I I4< I IPS Icf Ivy I  IM I I I I S 49    : 6:%PR  7    d    . JNVX P Pc PT#Y P P P PM M4 M M M M M FJRT P PT#Y Pc P P P P :<  tCy     SWeix|  FH O O Od3i O O_b Oru O O O O @DRVeirt U U49 Uf UC U_b U U U U CGUYhluw T Td3i T Ts Tbe T T T T 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     F  QT dg     6 c QT     V  RU eh      3 d     & c s bf    ! !T !D !WZ !jm !  CG ! ! ! !"
 
 
	    K Kc K3 Kos K  VZ K K K K I    $ '/uRX\jnwy   RU dg    < (0bY]koxz M M MSV Meh M M M M $) 	 	 	 	0 04; 03 0e 0`e 0 0 0 0d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 @D  SW  `b V VS V# VU^ Vfo Vy| V  MP V V V V cguy  CE O O OS O	 O O\_ Oor O O O O 24 N NS N N N N 57 P P P P P P ,0 N NS N N N N 26DW[df O Ow Oc OQT O O O O =Atbfoq C C' C C\_ C C C C >@ X X X X X X AC X XC X X X X 26b O Ow O O O O 59 O O' O O O O 7;2 S SG S S S S 26b N Nw 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    !V !VC !V !VRU !Vjm !V !V !V !VF# #S # # # #
    p p p $& M M M M ') O O O OM M M $& M M M M 24     )+ : : : : )+ : : : : *, ; ; ; ; #% L L L L 79 ; ;# ; ; ; ;
 7;2 U UG U U U U <@ Y Y Y Y Y Y <> + +s + + + + 24 Z Z Z Z 9;  C     >@       v 3 TW    ,
  
  
 c 
 X[ 
 jm 
  
  
  
 ' ' ' ' ' ' ' OS[]lp % % %V % % % %B BFb_c ! !S ! ! ! !* EGUY ] ] ] ] ] ]) ) )+ + +
    3 PS fj z}    
 MO 2 2 2 2 02 P P3 P P P P 46 T Ts T T T T 35 R Rc R R R R 02 L L3 L L L L 04B M MW M M M M 59 Q Q' Q Q Q Q 9=R U Ug U U U U 48 P P P P P P 37r O O O O O O 48dSU P P P P P P P 26b N Nw N N N N 04B M MW M M M M 37r O O O O O O 9; S SC S S S S 26b K Kc K3 K K K K RV^` 	< 	<c 	<3 	< 	< 	< 	< 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 fh P P P9 Pe PW\ P P P P W[ce S Ss Sc S3 SPS S S S S 8<B R Rc R R R R R 7;\`ik Y Y Y3 YVY Y Y Y Y 15R R R# R R R R 24 M MS M M M M ;?r V V V V V V ;= Z Zc Z Z Z Z w{  SW  uy  BD Z Z3 Zi Zy Zbg Zps Z  MP Z  or Z Z Z Z, z~  VZ  x|  EG \ \c \ \R[ \ej \sv \  PS \  ru \ \ \ \, x|  UY  w{  DF [ [C [y [PY [ch [qt [  OR [  qt [ [ [ [, {  X\  z~  GI ] ]s ]) ]S\ ]fk ]tw ]  RU ]  tw ] ] ] ], _a Z ZC Zy ZPU Z Z Z Z RT 
] 
] 
]5 
] 
] 
] 
] SU 
^ 
^ 
^E 
^ 
^ 
^ 
^ bd \ \s \) \SX \ \ \ \ os  IM  VX S S3 Si Sy SZ_ Shk S  CF S S S S& rv  LP  Y[ U Uc U U) U]b Ukn U  FI U U U U& qu  LP  Y[ T TS T	 T T\a Tjm T  FI T T T T& tx  OS  \^ V V V9 VI V_d Vmp V  IL V V V V& sw  PT  ]_ V Vs V) V9 V^c Vlo V  JM V V V V& vz  SW  `b X X# XY Xi Xaf Xor X  MP X X X X& 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4 C  W[  mq  z| $ $3 $i $W` $jo $x{ $  QT $  gj $ $ $ $L IM  ae  w{  DF g gS gPY gaj gty g  CF g  [^ g  qt g g g g4 @B M MD$6 M M M M EG Q Ql); Q Q Q Q IK U UT,-? U U U U >@ K K$|"4 K K K K 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 8<B P PC P P P P P <@ T T TS T T T T SW_a 	= 	=s 	=C 	= 	= 	= 	= 6:" N N# Ns N N N N ;?r M Mc MC M M M M \`hj 	> 	>$s) 	>UX 	> 	> 	> 	> >B" O ODI Os O O O O /32 P P P P P P 48 T TS T T T T 8<B X X X X X X <> U Us U U U U SU W W5H0I W W W W 26b R R3 R R R R 9; k k% k k k k *.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 37TX\eg T TC Ts TRU T T T T >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 37r O O O O O O 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 *.Dt\^ N N3 Nc N N N N N -1tRV_a Q Qc Q 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* @B \ \3 \ \ \ \
 
 
 
 
C C C C C

NS 
N 
N 
N 
NLS L L L L"Z3 Z Z Z Z  cg    $   df O O OI Ou OUZ O O O O gi R RC Ry R% RX] R R R R ]aik P P# PY P PVY P P P P `dln S SS S	 S5 SY\ S S S S WY P PS P% P P P P P Z\ S S SU S5 S S S S XZ Q Qc Q5 Q Q Q Q Q [] T T Te TE T T T T JL P Pc P5 P P P P MO S S Se S S S S KM Q Qs QE Q Q Q Q NP T T# Tu T T T T} } } } }    #    ys y y y yq q# q q q q  
/ / /4 4 48 8 87 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 tx  AC N N N9 NI N_d Nmp N N N N sw  @B K Ks K) K9 K^c Klo K K K K vz  CE N N# NY Ni Naf Nor N N N N lp  FJ  SU K K K9 KI KW\ Keh K  @C K K K K os  IM  VX N N3 Ni Ny NZ_ Nhk N  CF N N N N ~@ N Nc N NE NZ_ Not N N N N AC Q Q QI Qu Q]b Qrw Q Q Q Q qs N Ns N) NU Nbg N N N N tv Q Q# QY QPU Qej Q Q Q Q 46 Q Qs Q Q Q Q   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 9=R &@ &@g &@ &@ &@ &@P CGPT]_ 	 	 	 	 	 	 v    P P P P P PO OC OPS O O O O    O O O\_ O O O O   C    3  cf        Q Q3 Q Q Q Q QE EW E E E ET T4 T T T T TO O3 O^a O O O OO O O O.* *s *gk * * * **# # #6 6 6 OQ  $    2 ik  d TX be    4 48 P P 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? ?g ? ? ? ?O O O\_ O O O O 68 U U U U U U  :< Y YS Y Y Y Y  >BPTcgpr S Ss Ss S# S]` S S S S$ ?CQUdhqs T T T T3 T^a T T T T$ GKY]lpy{ [ [ [ [SV [fi [ [ [ [$ +-      " XZ - -# - - - -"
v 
vc 
vWZ 
v 
v 
v 
v# #7 # # # #.X X X X X X
 
 
   ,L L L L L LO O OC O O O O& w     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C Ci C C C C# #     bfnp . . .[^ . . . . GKY]lpy{  Z^  os DH DH3 DH DHSV DHfi DH  TW DH DH DH DHL 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B 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>   d      "$ DI    ! !s ! ! ! ! 4     Q QV Q Q Q QO OtDz O6 OY\ Olo O O O O&L L4 L L L L L ;?r @ @ @ @ @ @*L L$ L( L6 L L L L	  	 4< 	 c 	 ]` 	  	  	  	 
$ 
$4< 
$$s) 
$_b 
$  xB 
$ 
$ 
$ 
$P PD P& P P P P
" 
"V 
"tCy 
"\_ 
"t~ 
" 
" 
" 
"N Nt NV N N N N EIae  }A  PT  cg  pr > >T#Y >c >[^ >vy >  JM >  ]` > > > >6P P4 Px P\d P P P P! ! ! ! !!# ! ! ! !B!# ! ! ! !4 @DRV_a Y YS Y YC Y Y Y Y. . . :>D_cln 	V 	Vw 	Vc 	VY\ 	V 	V 	V 	VX Xd XF X X X X# #4< #' #eh #  ~H # # # # 37r N N NC N N N N +/TPT]_ 	O 	OC 	Os 	O# 	O 	O 	O 	O <@ M MS MS M M M M 46 O Os O O O O 48 P P P P P P NRZ\ 
K 
K 
KU 
KS 
Ks 
K 
K 
K 
K 04B P P P P P P CE O OtL'9 O O O O DHVZimvx V V VS VPS Vcf V V V V 59 P P' P P P P( (C (C ( ( ( (.49 49 49 49 49le      rv   )r  r  	tracebackr   ccxt.base.errorsr   r   r   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.   r/   r0   r1   r2   r3   cryptography.hazmatr4   cryptography.hazmat.primitivesr5   )cryptography.hazmat.primitives.asymmetricr6   r7   ,cryptography.hazmat.primitives.serializationr8   ccxt.static_dependenciesr9   r:   rc  ImportErroraxolotl_curve25519rA  !ccxt.static_dependencies.ethereumr;   r<    ccxt.static_dependencies.msgpackr>   ,ccxt.static_dependencies.starknet.ccxt_utilsr?   .ccxt.static_dependencies.starknet.hash.addressr@   /ccxt.static_dependencies.starknet.hash.selectorrA   ,ccxt.static_dependencies.starknet.hash.utilsrB   rC   2ccxt.static_dependencies.starknet.utils.typed_datarD   r  !ccxt.static_dependencies.mnemonicrE   "ccxt.static_dependencies.bip.bip44rF   Mccxt.static_dependencies.dydx_v4_client.cosmos.tx.signing.v1beta1.signing_pb2rG   @ccxt.static_dependencies.dydx_v4_client.cosmos.tx.v1beta1.tx_pb2rH   rI   rJ   rK   rL   rM   rN   rO   0ccxt.static_dependencies.dydx_v4_client.registryrP   apexpro.zklink_sdkr  r5  .ccxt.static_dependencies.lighter_client.signerrQ   rR   rS   rT   __all__r   r  r  r`  r  r<  r  email.utilsrV   rF  r  r  rO  r:  rn  ro  r  r   numbersrW   r|  requestsrX   requests.utilsrY   requests.exceptionsrZ   r[   r\   r]   r^   r  sslr_   r  r   rK  decimalr`   urllib.parseparser  typingra   rb   rc   JSONEncoderre   r  rU   r  rv   rr   <module>r     sI      ' & & & & & * * * * * * ) ) ) ) ) ) ) ) ) ) ) ) 0 0 0 0 0 0 + + + + + + + + + + + + 1 1 1 1 1 1 + + + + + + ) ) ) ) ) ) . . . . . . & & & & & & ) ) ) ) ) ) . . . . . . , , , , , , ' ' ' ' ' ' ( ( ( ( ( ( 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 ; ; ; ; ; ; % % % % % % N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N  N
 ) ( ( ( ( ( 1 1 1 1 1 1 F F F F F F F F M M M M M M
 + * * * * * + + + + + +   III&&&&&   EEE 2 1 1 1 1 1 5 5 5 5 5 5 2 2 2 2 2 2 \ [ [ [ [ [ J J J J J J R R R R R R ` ` ` ` ` ` ` ` ^ ^ ^ ^ ^ ^::::::888888ffffff	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	          MMM+++++++   JJJ 
			 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
            ! ! ! ! ! !    				  
	 	 	 	D	          				       - - - - - - C  C  C  C  C  C  C  C  C  C  C  C  C  C                ! ! ! ! ! !              ^ ^ ^ ^ ^d& ^ ^ ^_{ _{ _{ _{ _{v _{ _{ _{ _{ _{sZ   *C/ /C98C9=D DD,E/ /E98E9=F FFG" "G*)G*