
    6irQ                         d dl mZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
mZ d dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lm Z  ddl!m"Z"  G d d      Z#y)    )	b64encode)PathN)DictOptionalListTupleUnionAny)RSAECC)SHA256)pkcs1_15eddsa)
itemgetter)	urlencode)WebsocketAPI   )get_loopc                      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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,e-e.d!<   d"Z/e0e.d#<   d$Z1d%Z2d&Z3d'Z4d(Z5d)Z6d*Z7d+Z8d,Z9d-Z:d.Z;d/Z<d0Z=d1Z>d2Z?d3Z@d4ZAd5ZBd6ZCd7ZDd8ZEd9ZFd:ZGd;ZHd<ZId=ZJd>ZKd?ZLd@ZMdAZNdBZOdCZPdDZQd>ZRd?ZSdEZTdFZUdBZVdGZWdDZXdHZYdIZZdJZ[dKZ\dLZ]dMZ^dNZ_dOZ`dPZadQZbdRZcdSZddTZedUZfdVZgdWZhdXZidYZjdZZkd[Zld\Zmd]Znd^Zod_Zpd`ZqdaZrdbZsdcZtddZudeZvdfZwdgZxdhZydidididje'dkdkdididididkfdleze{   dmeze{   dneze|e{e}f      doe{dpe{dqe~dre~dsezee{ef      dteze{   duezej                     dveze{   dwe~fdxZdye|fdzZd{ Z	 ddsezee{ef      dteze{   fd|Zd}efd~e{de~de{dye{fdZdd~e{de0dye{fdZdd~e{de0dye{fdZd~e{dye{fdZdd~e{de0dye{fdZd~e{dye{fdZdd~e{de0dye{fdZdd~e{de0dye{fdZd~e{dye{fdZde{fdZedd       Zed        Zdde{de{dydifdZde{fdZde{dye{fdZdde|dye{fdZd Zde|dye{fdZde{de~defdZde{de~defdZd Zde{de~defdZde{de~defdZede0dye0fd       Zedd       Zede|dyeee{e{f      fd       Z	 dde~de~dye|fdZyi)
BaseClientzhttps://api{}.binance.{}/apiz"https://testnet.binance.vision/apiz https://demo-api.binance.com/apizhttps://api{}.binance.{}/sapizhttps://www.binance.{}zhttps://fapi.binance.{}/fapiz&https://testnet.binancefuture.com/fapiz"https://demo-fapi.binance.com/fapiz$https://fapi.binance.{}/futures/dataz.https://testnet.binancefuture.com/futures/datazhttps://dapi.binance.{}/dapiz&https://testnet.binancefuture.com/dapiz"https://demo-dapi.binance.com/dapiz$https://dapi.binance.{}/futures/datazhttps://eapi.binance.{}/eapiz"https://testnet.binanceops.{}/eapizhttps://papi.binance.{}/papiz!wss://ws-api.binance.{}/ws-api/v3z-wss://ws-api.testnet.binance.vision/ws-api/v3z'wss://demo-ws-api.binance.com/ws-api/v3z#wss://ws-fapi.binance.{}/ws-fapi/v1z*wss://testnet.binancefuture.com/ws-fapi/v1v3v1v2v4 1234
   REQUEST_TIMEOUTi'  REQUEST_RECVWINDOWSPOTNEWPARTIALLY_FILLEDFILLEDCANCELEDPENDING_CANCELREJECTEDEXPIRED1s1m3m5m15m30m1h2h4h6h8h12h1d3d1w1MBUYSELLLIMITMARKET	STOP_LOSSSTOP_LOSS_LIMITTAKE_PROFITTAKE_PROFIT_LIMITLIMIT_MAKERSTOPSTOP_MARKETTAKE_PROFIT_MARKETGTCIOCFOKACKRESULTFULLapqflTmMMAIN_C2CMAIN_UMFUTUREMAIN_CMFUTUREMAIN_MARGINMAIN_MININGC2C_MAINC2C_UMFUTURE
C2C_MININGUMFUTURE_MAINUMFUTURE_C2CUMFUTURE_MARGINCMFUTURE_MAINMARGIN_MAINMARGIN_UMFUTUREMINING_MAINMINING_UMFUTURE
MINING_C2Cz
x-HNA2TXFJz
x-Cb7ytekJNcomFapi_key
api_secretrequests_paramstldbase_endpointtestnetdemoprivate_keyprivate_key_passloop	time_unitverbosec                    || _         || _        t        j                  t              | _        |r)| j
                  j                  t        j                         | j                  j                  ||      | _        | j                  j                  ||      | _
        | j                  j                  |      | _        | j                  j                  |      | _        | j                  j                  |      | _        | j                  j                  |      | _        | j                  j                  |      | _        | j                   j                  |      | _        | j"                  j                  |      | _        || _        || _        || _        d| _        | j-                  ||	      | _        | j1                         | _        || _        d| _        || _        || _        d| _        | j>                  j                  |      }|r| j@                  }n|r| jB                  }| j(                  r|d| j(                   z  }d}|r.d|v r*|d   jE                  d      xs |d   jE                  d      }tG        |||      | _$        | jJ                  j                  |      }|r| jL                  }n|r| jN                  }tG        |||      | _(        |
xs
 tS               | _*        y)	a{  Binance API Client constructor

        :param api_key: Api Key
        :type api_key: str.
        :param api_secret: Api Secret
        :type api_secret: str.
        :param requests_params: optional - Dictionary of requests params to use for all calls
        :type requests_params: dict.
        :param testnet: Use testnet environment - only available for vanilla options at the moment
        :type testnet: bool
        :param private_key: Path to private key, or string of file contents
        :type private_key: optional - str or Path
        :param private_key_pass: Password of private key
        :type private_key_pass: optional - str
        :param time_unit: Time unit to use for requests. Supported values: "MILLISECOND", "MICROSECOND"
        :type time_unit: optional - str
        :param verbose: Enable verbose logging for debugging
        :type verbose: bool

        FNr   z
?timeUnit=proxieshttpshttp)urlrj   https_proxy)+rj   rr   logging	getLogger__name__loggersetLevelDEBUGAPI_URLformatMARGIN_API_URLWEBSITE_URLFUTURES_URLFUTURES_DATA_URLFUTURES_COIN_URLFUTURES_COIN_DATA_URLOPTIONS_URLOPTIONS_TESTNET_URLAPI_KEY
API_SECRET	TIME_UNIT_is_rsa_init_private_keyPRIVATE_KEY_init_sessionsession_requests_paramsresponserl   rm   timestamp_offset
WS_API_URLWS_API_TESTNET_URLWS_API_DEMO_URLgetr   ws_apiWS_FUTURES_URLWS_FUTURES_TESTNET_URLWS_FUTURES_DEMO_URL	ws_futurer   rp   )selfrg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   
ws_api_urlrx   ws_future_urls                   Q/var/www/app/trading-bot/venv/lib/python3.12/site-packages/binance/base_client.py__init__zBaseClient.__init__   sq   H ''1 KK  /||**=#>"1188L++2237++2237 $ 5 5 < <S A $ 5 5 < <S A%)%?%?%F%Fs%K"++2237#'#;#;#B#B3#G $" $ 6 6{DT U))+ /	 !__++C0
00J--J>>Jt~~&677JyO;))488Ak_U^E_EcEcdjEkK"zsT++2237 77M 44M%-SkZ&HJ	    returnc                     dddd}| j                   r| j                   sJ | j                   |d<   | j                  r| j                  sJ | j                  |d<   |S )Nzapplication/jsonzhMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36)AcceptzContent-Typez
User-AgentzX-MBX-APIKEYzX-MBX-TIME-UNIT)r   r   )r   headerss     r   _get_headerszBaseClient._get_headers   s_    (. E

 <<<<<&*llGN#>>>>!>)-G%&r   c                     t         N)NotImplementedError)r   s    r   r   zBaseClient._init_session  s    !!r   c                    |sy t        |t              r%t        |d      5 }|j                         }d d d        t	        |      dkD  rd| _        t        j                  ||      S t        j                  |      S # 1 sw Y   JxY w)Nrx   T)
passphrase)	
isinstancer   openreadlenr   r   
import_keyr   )r   rn   ro   rP   s       r   r   zBaseClient._init_private_key  su    
 k4(k3' '1ffh'{c!DL>>+:JKK~~k**' 's   A::BTpathsignedversionc                     | j                   }| j                  r| j                  }n| j                  r| j                  }|r| j
                  n|}|dz   |z   dz   |z   S N/)r   rl   API_TESTNET_URLrm   API_DEMO_URLPRIVATE_API_VERSION)r   r   r   r   rw   vs         r   _create_api_urizBaseClient._create_api_uri  sX     ll<<&&CYY##C(.D$$GSy1}s"T))r   c                     | j                   | j                  | j                  | j                  d}| j                  dz   ||   z   dz   |z   S )N)r            r   )MARGIN_API_VERSIONMARGIN_API_VERSION2MARGIN_API_VERSION3MARGIN_API_VERSION4r   r   r   r   optionss       r   _create_margin_api_uriz!BaseClient._create_margin_api_uri  sT    &&''''''	
 ""S(77+;;cADHHr   c                     | j                   | j                  d}| j                  j                  | j                        dz   ||   z   dz   |z   S )N)r   r   r   )PORTFOLIO_API_VERSIONPORTFOLIO_API_VERSION2PAPI_URLr   rj   r   s       r   _create_papi_api_urizBaseClient._create_papi_api_uri(  sJ    00T5P5PQ}}##DHH-3gg6FFLtSSr   c                 &    | j                   dz   |z   S r   )r   )r   r   s     r   _create_website_urizBaseClient._create_website_uri,  s    #%,,r   c                     | j                   }| j                  r| j                  }n| j                  r| j                  }| j
                  | j                  | j                  d}|dz   ||   z   dz   |z   S N)r   r   r   r   )r   rl   FUTURES_TESTNET_URLrm   FUTURES_DEMO_URLFUTURES_API_VERSIONFUTURES_API_VERSION2FUTURES_API_VERSION3r   r   r   rw   r   s        r   _create_futures_api_uriz"BaseClient._create_futures_api_uri/  ss    <<**CYY''C''((((

 Sy77++c1D88r   c                 Z    | j                   }| j                  r| j                  }|dz   |z   S r   )r   rl   FUTURES_DATA_TESTNET_URLr   r   rw   s      r   _create_futures_data_api_uriz'BaseClient._create_futures_data_api_uri<  s.    ##<<//CSy4r   c                     | j                   }| j                  r| j                  }n| j                  r| j                  }| j
                  | j                  | j                  d}|dz   ||   z   dz   |z   S r   )r   rl   FUTURES_COIN_TESTNET_URLrm   FUTURES_COIN_DEMO_URLr   r   r   r   s        r   _create_futures_coin_api_urlz'BaseClient._create_futures_coin_api_urlB  ss    ##<<//CYY,,C''((((

 Sy77++c1D88r   c                 Z    | j                   }| j                  r| j                  }|dz   |z   S r   )r   rl   FUTURES_COIN_DATA_TESTNET_URL)r   r   r   rw   s       r   !_create_futures_coin_data_api_urlz,BaseClient._create_futures_coin_data_api_urlO  s.    ((<<44CSy4r   c                 z    | j                   }| j                  r| j                  }|dz   | j                  z   dz   |z   S r   )r   rl   r   OPTIONS_API_VERSIONr   s      r   _create_options_api_uriz"BaseClient._create_options_api_uriU  s>    <<**CSy4333c9D@@r   query_stringc                     | j                   sJ t        j                  |j                  d            }t	        j                  | j                         j                  |      }t        |      j                         }|S )Nutf-8)r   r   newencoder   signr   decode)r   r   h	signatureress        r   _rsa_signaturezBaseClient._rsa_signature[  sa    JJ|**734LL!1!1277:		"))+
r   c                 0    t        j                  | |      S )N)safe
_urlencodequote)urir   s     r   encode_uri_componentzBaseClient.encode_uri_componentc  s    $//r   c                 *    t        d | D              }|S )Nc              3   *   K   | ]  \  }}||f  y wr    ).0keyvalues      r   	<genexpr>z-BaseClient.convert_to_dict.<locals>.<genexpr>i  s     E:33,Es   )dict)list_tuples
dictionarys     r   convert_to_dictzBaseClient.convert_to_dictg  s    EEE
r   required_tldendpoint_namec                 V    | j                   |k7  rddlm}  ||| j                   |      y)a	  Validate client is configured for required TLD.

        :param required_tld: The required TLD (e.g., "us")
        :param endpoint_name: Description of the endpoint for error messages
        :raises BinanceRegionException: If the client TLD doesn't match
        r   )BinanceRegionExceptionN)rj   binance.exceptionsr  )r   r  r  r  s       r   _require_tldzBaseClient._require_tldl  s+     88|#A(txxOO $r   c                     | j                   sJ t        t        j                  | j                   d      j	                  |j                                     j                         }|S )Nrfc8032)r   r   r   r   r   r   r   )r   r   r   s      r   _ed25519_signaturezBaseClient._ed25519_signaturex  sT    IId&&	2778K8K8MN

&( 	 
r   c                     | j                   sJ d       t        j                  | j                   j                  d      |j                  d      t        j
                        }|j                         S )Nz)API Secret required for private endpointsr   )r   hmacr   r   hashlibsha256	hexdigest)r   r   rS   s      r   _hmac_signaturezBaseClient._hmac_signature  sW    K KKHHOO""7+(NN

 {{}r   datac                 r   | j                   }| j                  r%| j                  r| j                  }n| j                  }dj                  | j                  |      D cg c]/  }|d    d|d   dk(  rt        j                  |d         n|d    1 c}      } ||      }|r| j                  |      S |S c c}w )N&r   =symbolr   )
r  r   r   r   r  join_order_paramsr   r   r   )r   r  
uri_encodesig_funcdr   r   s          r   _generate_signaturezBaseClient._generate_signature  s    ''||..22xxkok}k}  C  lD  !EfgAaD6QqTXEU:+;+;AaD+A[\]^[_*`!a  !E  F|$1;t((-DD !Es   4B4c                     d|v r|S |j                  d| j                         |j                  dt        t        j                         dz  | j                  z                t        t        |j                                     }i |d ||      iS )Nr   apiKey	timestamp  )
setdefaultr   inttimer   r  sorteditems)r   paramssignature_funcs      r   _sign_ws_paramszBaseClient._sign_ws_params  sz    & M(DLL1+s499;+=@U@U+U'VWfV\\^,->&>+~f'=>>r   c                     | j                   }| j                  r%| j                  r| j                  }n| j                  }t        |      } ||      S r   )r  r   r   r   r  r   )r   r  r  r   s       r   _generate_ws_api_signaturez%BaseClient._generate_ws_api_signature  sG    ''||..22 %%r   methodr(  c                    K   |j                  d| j                               }|||d}|r| j                  || j                        |d<   | j                  j                  ||       d{   S 7 wz"Send request and wait for responseid)r0  r-  r(  r(  N)popuuid22r*  r  r   requestr   r-  r   r(  r0  payloads         r   _ws_futures_api_requestz"BaseClient._ws_futures_api_request  sk     ZZdkkm,

  $ 4 4VT=U=U VGH^^++B8888   A'A0)A.*A0c                 x    t               | _        | j                  j                  | j                  |||            S r   )r   rp   run_until_completer6  r   r-  r   r(  s       r   _ws_futures_api_request_syncz'BaseClient._ws_futures_api_request_sync  s4    J	yy++((@
 	
r   c                 4   K   t        j                  |      S wr   )asynciorun)r   r-  s     r   
_make_synczBaseClient._make_sync  s     {{6""s   c                    K   |j                  d| j                               }|||d}|r| j                  || j                        |d<   | j                  j                  ||       d{   S 7 wr/  )r1  r2  r*  r,  r   r3  r4  s         r   _ws_api_requestzBaseClient._ws_api_request  sp     ZZdkkm,

  $ 4 477!GH [[((W5555r7  c                 x    t               | _        | j                  j                  | j                  |||            S )z,Send request to WS API and wait for response)r   rp   r9  rA  r:  s       r   _ws_api_request_synczBaseClient._ws_api_request_sync  s4    J	yy++  8
 	
r   c                 T    d|v r#d|d   v r|d   j                  d      }|d   d= |S | S )Nr  r   )r   )r   kwargsversion_overrides      r   _get_versionzBaseClient._get_version  sA    V	VF^ ;%f~11)<vy)##r   c                 F    t        t        j                  | dz        d      S )Nr   x)r   randomgetrandbits)lengths    r   r2  zBaseClient.uuid22  s    f((!4c::r   c                 4   t        t        d | j                                     } d}g }| j                         D ])  \  }}|dk(  rd}|j                  |t	        |      f       + |j                  t        d             |r|j                  d| d   f       |S )zfConvert params to list with signature as last element

        :param data:
        :return:

        c                     | d   d uS )Nr   r   )els    r   <lambda>z*BaseClient._order_params.<locals>.<lambda>  s    be4&7 r   Fr   Tr   )r   )r  filterr'  appendstrsortr   )r  has_signaturer(  r   r   s        r   r  zBaseClient._order_params  s     F7FG**, 	1JCk! $sCJ/0		1 	
1&MM;[(9:;r   force_paramsc                 Z   | j                   |d<   | j                  r|j                  | j                         |j                  dd       }|r9t	        |t
              r)||d<   d|d   v r|j                  |d   d          |d   d= |rkt        t        j                         dz  | j                  z         |d   d<   | j                  r| j                  |d   d<   | j                  |d         |d   d<   |rU| j                  |d         |d<   t        |d         D cg c]  \  }\  }}|| }	}}}t        |	      D ]  }|d   |= 
 |r(|dk(  s|r!d	j                  d
 |d   D              |d<   |d= d|j                         v r d|d   v sd|d   v sd|d   v r|d   |d<   |d= |S c c}}}w )Ntimeoutr  ri   r"  r!  
recvWindowr   r   r  c              3   v   K   | ]1  }|d    d|d    dk(  rt        j                  |d         n|d    3 yw)r   r  r  r   Nr   )r   r  s     r   r   z1BaseClient._get_request_kwargs.<locals>.<genexpr>  sD      (gk47aHATJ$4$4T!W$=Z^_`Za$ab(s   79r(  batchOrdersorderidlistorigclientorderidlist)r!   r   updater   r   r  r$  r%  r   r"   r  r  	enumeratereversedr  keys)
r   r-  r   rV  rE  r  ir   r   	null_argss
             r   _get_request_kwargszBaseClient._get_request_kwargs  s    !00y   MM$//0zz&$'JtT*!F6N F6N2fVn->?@6N#45*-		d"T%:%::+F6N;' &&/3/F/Fv|,*.*B*B6&>*RF6N;' !//v?F6N *36&>)B %a#uemI  i( &6N1%& Vu_"xx (ouv|o}(  F8 v v{{}$!11 F8$44*fX.>>!'!1v8$/s   F&*F&r   )r   )z~()*!.')endpoint)T)   )F)r{   
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PUBLIC_API_VERSIONr   r   r   r   r   r   r   r   r   r   r   BASE_ENDPOINT_DEFAULTBASE_ENDPOINT_1BASE_ENDPOINT_2BASE_ENDPOINT_3BASE_ENDPOINT_4r!   float__annotations__r"   r$  SYMBOL_TYPE_SPOTORDER_STATUS_NEWORDER_STATUS_PARTIALLY_FILLEDORDER_STATUS_FILLEDORDER_STATUS_CANCELEDORDER_STATUS_PENDING_CANCELORDER_STATUS_REJECTEDORDER_STATUS_EXPIREDKLINE_INTERVAL_1SECONDKLINE_INTERVAL_1MINUTEKLINE_INTERVAL_3MINUTEKLINE_INTERVAL_5MINUTEKLINE_INTERVAL_15MINUTEKLINE_INTERVAL_30MINUTEKLINE_INTERVAL_1HOURKLINE_INTERVAL_2HOURKLINE_INTERVAL_4HOURKLINE_INTERVAL_6HOURKLINE_INTERVAL_8HOURKLINE_INTERVAL_12HOURKLINE_INTERVAL_1DAYKLINE_INTERVAL_3DAYKLINE_INTERVAL_1WEEKKLINE_INTERVAL_1MONTHSIDE_BUY	SIDE_SELLORDER_TYPE_LIMITORDER_TYPE_MARKETORDER_TYPE_STOP_LOSSORDER_TYPE_STOP_LOSS_LIMITORDER_TYPE_TAKE_PROFITORDER_TYPE_TAKE_PROFIT_LIMITORDER_TYPE_LIMIT_MAKERFUTURE_ORDER_TYPE_LIMITFUTURE_ORDER_TYPE_MARKETFUTURE_ORDER_TYPE_STOPFUTURE_ORDER_TYPE_STOP_MARKETFUTURE_ORDER_TYPE_TAKE_PROFIT$FUTURE_ORDER_TYPE_TAKE_PROFIT_MARKETFUTURE_ORDER_TYPE_LIMIT_MAKERTIME_IN_FORCE_GTCTIME_IN_FORCE_IOCTIME_IN_FORCE_FOKORDER_RESP_TYPE_ACKORDER_RESP_TYPE_RESULTORDER_RESP_TYPE_FULLAGG_ID	AGG_PRICEAGG_QUANTITYAGG_FIRST_TRADE_IDAGG_LAST_TRADE_IDAGG_TIMEAGG_BUYER_MAKESAGG_BEST_MATCHSPOT_TO_FIATSPOT_TO_USDT_FUTURESPOT_TO_COIN_FUTURESPOT_TO_MARGIN_CROSSSPOT_TO_MININGFIAT_TO_SPOTFIAT_TO_USDT_FUTUREFIAT_TO_MININGUSDT_FUTURE_TO_SPOTUSDT_FUTURE_TO_FIATUSDT_FUTURE_TO_MARGIN_CROSSCOIN_FUTURE_TO_SPOTMARGIN_CROSS_TO_SPOTMARGIN_CROSS_TO_USDT_FUTUREMINING_TO_SPOTMINING_TO_USDT_FUTUREMINING_TO_FIATSPOT_ORDER_PREFIXCONTRACT_ORDER_PREFIXr   rS  r   r
   boolr	   r   r=  AbstractEventLoopr   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r  r
  r  r  r  r*  r,  r  r6  r;  r?  rA  rC  rG  r2  r   r   r  rd  r   r   r   r   r      sX   ,G:O5L4N*K0KB;=O5G@B$T!0K>-H4JH?O:NIF !OOOOOU##$6!"&"2&$!!!!##! HI &!2*#6 *%'#$1!$1!+?($1!%! FILHON L))("NL(!N)("3)("3"N-!N %( "&$(48226*.48#'T'#T' SMT' "$sCx.1	T'
 T' T' T' T' eCI./T' #3-T' w001T' C=T' T'ld " +/+eCI./+ #3-+  )-=O	*	*!%	*7:	*		*I3 I IS IT Ts T3 T- - -9C 9# 9c 9     9 9s 93 9 c  C  PS  AC AC A3  0 0  
P 
PS 
PRV 
Ps C C 	E 	E# 	E?&t & &
9C 
9 
9t 
9
3 
 
d 
#6C 6 6t 6
3 
 
d 
 c    ; ; D T%S/%:  , :?8"8268	8r   r   )$base64r   pathlibr   rJ  typingr   r   r   r   r	   r
   r=  r  r  ry   r%  Crypto.PublicKeyr   r   Crypto.Hashr   Crypto.Signaturer   r   urllib.parseparser   operatorr   r   binance.ws.websocket_apir   helpersr   r   r   r   r   <module>r     sG       : :      %  , !  " 1 S Sr   