
    !h[1                         d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m	Z	 d dl
mZ d dlmZ 	 d dlmZmZ dZn# e$ r	 dZdZdZY nw xY wd	d
lmZmZ  G d d          ZdS )    N)DictListOptionalAny)datetime)Decimal)logger)ProxyConnector	ProxyTypeTF   )P2POrderOrderBookSnapshotc                      e Zd ZdZddee         defdZddZdefd	Zded
         fdZ	ddededede
de
dee         fdZdeeef         dedededef
dZddee         dededeeef         fdZdee         fdZdS )BinanceP2PClientz>Binance P2P client with demo mode (real P2P API is deprecated)Nhttp	proxy_url
proxy_typec                 8   d| _         || _        |                                | _        ddddddddd	d
d
| _        | j        rY|                                  t          j        d| j                                         d| 	                                            dS dS )a  
        Initialize Binance P2P client with optional proxy support
        
        Args:
            proxy_url: Proxy URL in format 'login:password@ip:port' or 'ip:port'
            proxy_type: Proxy type - 'http', 'https', or 'socks5' (default: 'http')
        z;https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/searchz*/*zen-US,en;q=0.9c2c_webwebzapplication/jsonenzhttps://p2p.binance.comzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 )
AcceptzAccept-LanguageC2CType
ClientTypezContent-TypeLangOriginRefererz
User-AgentzX-Passthrough-TokenzConfigured  proxy: N)
base_urlr   lowerr   headers_validate_proxy_configr	   infoupper_mask_proxy_url)selfr   r   s      "/app/src/api/binance_p2p_client.py__init__zBinanceP2PClient.__init__   s     V"$**,, / ./0 L#%
 
 > 	a'')))K_do&;&;&=&=__tG[G[G]G]__`````	a 	a    returnc                 p   | j         sdS g d}| j        |vrt          d| j         d|           | j        dk    r"t          st	          j        d           d| _        d| j         v r7| j                             dd	          \  }}d
|vsd
|vrt          d          dS d
| j         vrt          d          dS )zValidate proxy configurationN)r   httpssocks5zInvalid proxy type 'z'. Must be one of: r.   u[   ⚠️  SOCKS5 proxy requested but aiohttp-socks not installed. Falling back to HTTP proxy.r   @   :z<Invalid proxy URL format. Expected: 'login:password@ip:port'zIInvalid proxy URL format. Expected: 'ip:port' or 'login:password@ip:port')r   r   
ValueErrorSOCKS_AVAILABLEr	   warningsplit)r'   valid_types	auth_part	host_parts       r(   r#   z'BinanceP2PClient._validate_proxy_config8   s    ~ 	F111?+--eDOeeXceefff ?h&&&Nxyyy$DO $.  #'>#7#7Q#?#? Iy)##s)';'; !_``` (<'; $.(( !lmmm )(r*   c                     | j         sdS d| j         v r@| j                             dd          \  }}|                    d          d         }| d| S | j         S )z3Mask sensitive credentials in proxy URL for loggingNoner/   r0   r1   r   z:***@)r   r5   )r'   r7   r8   usernames       r(   r&   z BinanceP2PClient._mask_proxy_urlQ   sl    ~ 	6$.  #'>#7#7Q#?#? Iy s++A.H00Y000~r*   r
   c                 @   | j         rt          sdS 	 | j        dk    rd| j         v r{| j                             dd          \  }}|                    dd          \  }}|                    dd          \  }}t	          t
          j        |t          |          ||          S | j                             dd          \  }}t	          t
          j        |t          |                    S dS # t          t          f$ r"}t          j        d|            Y d}~dS d}~ww xY w)	z9Create appropriate proxy connector based on configurationNr.   r/   r0   r1   )r   hostportr;   password)r   r=   r>   z"Failed to create proxy connector: )r   r3   r   r5   r
   r   SOCKS5intr2   
IndexErrorr	   error)r'   r7   r8   r;   r?   r=   r>   es           r(   _create_proxy_connectorz(BinanceP2PClient._create_proxy_connector]   sH   ~ 	_ 	4	(**$.((+/>+?+?Q+G+G(Iy)2a)@)@&Hh!*a!8!8JD$)#,#3! YY!)!)    "&!5!5c1!=!=JD$)#,#3! YY    tJ' 	 	 	LAaAABBB44444	s   BC* !AC* *D;DDSELLUSDr0      asset
trade_typefiatpagerowsc                   K   |||||g dddddg ddgd}	 |                                  }d}| j        rj| j        dv rad	| j        v rd
| j         }n
d
| j         }t          j        d| j                                         d|                                             i }	|r.||	d<   t          j        d|                                             t          j        d i |	4 d{V }
t          | j
                  }d| d| |d<   ||t          j        d          d}|r||d<    |
j        | j        fi |4 d{V }|j        dk    r\t          j        d|j         d|                                 d{V             	 ddd          d{V  ddd          d{V  dS |                                 d{V }|                    dd          s<t          j        d|            	 ddd          d{V  ddd          d{V  dS |                     ||||          cddd          d{V  cddd          d{V  S # 1 d{V swxY w Y   	 ddd          d{V  dS # 1 d{V swxY w Y   dS # t(          j        $ r t          j        d| d| d           Y dS t,          $ r(}t          j        d| d| d|            Y d}~dS d}~ww xY w)!a#  
        Get P2P order book for specified asset
        
        Args:
            asset: Crypto asset (USDT, USDC, BTC, ETH)
            trade_type: SELL or BUY
            fiat: Fiat currency (USD, EUR, etc.)
            page: Page number
            rows: Number of rows per page
        Fallr   Nmass
profession)rK   rL   rM   	tradeTyperI   	countriesproMerchantAdsshieldMerchantAds
filterTypeadditionalKycVerifyFilterpublisherTypepayTypes
classifiesr   r-   r/   http://zUsing r   	connectorzUsing SOCKS5 proxy connector: z+https://p2p.binance.com/trade/all-payments/z?fiat=r   
   total)r"   jsontimeoutproxy   zHTTP error : successzAPI returned error: zTimeout fetching  z order bookzError fetching z order book:  )rE   r   r   r	   r$   r%   r&   aiohttpClientSessiondictr"   ClientTimeoutpostr    statusrC   textra   get_parse_order_bookasyncioTimeoutError	Exception)r'   rI   rJ   rK   rL   rM   payloadr]   r   session_kwargssessiondynamic_headersrequest_kwargsresponsedatarD   s                   r(   get_order_bookzBinanceP2PClient.get_order_book   sC      ##!&)*!!<0
 
 6	4466II ~ `$/5F"F"F$.(( :$. : :II !;$. : :I^T_%:%:%<%<^^dFZFZF\F\^^___N W.7{+UT=Q=Q=S=SUUVVV,>>~>> Q Q Q Q Q Q Q'"&t|"4"4-n[`-n-nhl-n-n	*  /#&42>>>" "  8.7N7+'7<HHHH Q Q Q Q Q Q QH#--%]8?%]%]HMMOOF[F[F[F[F[F[%]%]^^^#	Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q* "*000000D88Iu55 $%BD%B%BCCC#Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q6  11$z4PPQ Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q QQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q: # 	 	 	LLULLZLLLMMM44 	 	 	LO5OO:OOAOOPPP44444	s   CJ &AI4?AII4J 'AI/I4 J I*I4<J 
I	I4I	I4!J 4
I>>J I>J *K%4	K%=K  K%r{   c                 t   g }|                     dg           D ]}|                     di           }|                     di           }t          |                     dd          |                     dd          |                     dd          |                     d|          |                     d	|          t          |                     d
d                    t          |                     dd                    t          |                     dd                    t          |                     dd                    |                     d|          d |                     dg           D             |                     d          r#t          |                     dd                    ndt          |                     dd                    |                     dd                    }	|                    |	           t          |||t          j                                                    |          S )z)Parse API response into OrderBookSnapshotr{   adv
advertiseradvNor   userNonickNamerI   fiatUnitpricer   surplusAmountminSingleTransAmountmaxSingleTransAmountrR   c                 :    g | ]}|                     d d          S )	payTypeIdr   )rp   ).0methods     r(   
<listcomp>z6BinanceP2PClient._parse_order_book.<locals>.<listcomp>   s&     g g gK!<!< g g gr*   tradeMethodsorderCompleteRatemonthOrderCount
isMerchantF)order_idmerchant_idmerchant_namerI   rK   r   available_amountmin_single_trans_amountmax_single_trans_amountrJ   payment_methodscompletion_rateorders_completedis_merchant)rI   rK   rJ   	timestamporders)	rp   r   floatrA   appendr   rr   get_event_looptime)
r'   r{   rI   rJ   rK   r   itemr~   r   orders
             r(   rq   z"BinanceP2PClient._parse_order_book   s    HHVR(( 	! 	!D((5"%%C,33J"--&NN8R88(nnZ<<gggu--WWZ..CGGGQ//00!&sww'B'B!C!C(-cgg6La.P.P(Q(Q(-cgg6La.P.P(Q(Q77;
;; g g377SaceKfKf g g gQ[Q_Q_`sQtQt {jnn5H!&L&L M M Mz{!$Z^^4Eq%I%I!J!J&NN<??  E  MM%     !,..3355
 
 
 	
r*   assetsc                 R  K   g }|D ].}|                      |||          }|                    |           /t          j        |ddi d{V }i }t	          |          D ]H\  }	}
t          |
t                    r!t          j        d||	          d|
            ;|
r|
|||	         <   I|S )z0Get order books for multiple assets concurrentlyreturn_exceptionsTNzFailed to fetch re   )	r|   r   rr   gather	enumerate
isinstancert   r	   rC   )r'   r   rJ   rK   tasksrI   taskresultsorder_booksiresults              r(   get_multi_asset_ordersz'BinanceP2PClient.get_multi_asset_orders   s        	 	E&&uj$??DLLFFFFFFFFF"7++ 	0 	0IAv&),, Eq	EEVEEFFF 0)/F1I&r*   c                 v  K   	 |                                  }d}| j        r'| j        dv rd| j        v rd| j         }n
d| j         }i }|r||d<   t          j        di |4 d{V }dt          j        d          i}|r||d	<    |j        di |4 d{V }|j        dk    rm|                                 d{V }|                    dd          }t          j
        d|            |cddd          d{V  cddd          d{V  S t          j        d|j                    	 ddd          d{V  ddd          d{V  dS # 1 d{V swxY w Y   	 ddd          d{V  dS # 1 d{V swxY w Y   dS # t          $ r"}	t          j        d|	            Y d}	~	dS d}	~	ww xY w)z3Check current IP address to verify proxy is workingNr[   r/   r\   r]   rb   r^   r_   rc   https://httpbin.org/iprd   originUnknownzCurrent IP address: zFailed to check IP: HTTP zError checking IP address: rh   )r   )rE   r   r   ri   rj   rl   rp   rn   ra   r	   r$   rC   rt   )
r'   r]   r   rv   rw   ry   rz   r{   iprD   s
             r(   check_ip_addressz!BinanceP2PClient.check_ip_address  s     $	4466II~ ;$/5F"F"F$.(( :$. : :II :$. : :IN 8.7{+,>>~>> $ $ $ $ $ $ $'w42>>>"  8.7N7+ '7;RR>RR $ $ $ $ $ $ $V^#--%-]]__444444!XXh	::$?2$?$?@@@!$ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ $ $ $ $ $ $ $ $ $  %R%R%RSSS#$ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $&  	 	 	L:q::;;;44444	sy   A$F (2E9AE.E9 F E0E9F 
E	E9!E	"E9&F 9
FF FF 
F8F33F8)Nr   )r+   N)rF   rG   r0   rH   )rF   rG   )__name__
__module____qualname____doc__r   strr)   r#   r&   rE   rA   r   r|   r   r   rq   r   r   r   rh   r*   r(   r   r      s       HHa a(3- aC a a a a>n n n n2
 
 
 
 
"2B)C " " " "HR R# R3 Rs Rbe Rqt R  G  HY  Z R R R Rh!
d38n !
S !
c !
Y\ !
ar !
 !
 !
 !
F 49 # ^a nrsv  yJ  tJ  oK    *& & & & & & &r*   r   )rr   ri   randomra   typingr   r   r   r   r   decimalr   logurur	   aiohttp_socksr
   r   r3   ImportErrormodels.orderr   r   r   rh   r*   r(   <module>r      s+       , , , , , , , , , , , ,                  77777777OO   NIOOO
 7 6 6 6 6 6 6 6] ] ] ] ] ] ] ] ] ]s   
; A	A	