
    (iv                     <   d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dlZd dl	m
Z
 d dlmZmZmZmZ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mZ ddlmZ dde de!dej                  fdZ" G d d      Z#de fdZ$de fdZ% G d de      Z&de'de(fdZ)y)    )JSONDecodeErrorN)Path)TracebackType)AnyListTupleTypeUnioncast)Timeout)RPCEndpointRPCResponse   )#sort_batch_response_by_response_ids)handle_request_caching)Web3TypeErrorWeb3ValueError   )JSONBaseProvideripc_pathtimeoutreturnc                     t         j                  dk(  rddlm}  ||       S t	        j                  t        j
                  t        j                        }|j                  |        |j                  |       |S )Nwin32r   )	NamedPipe)	sysplatformweb3._utils.windowsr   socketAF_UNIXSOCK_STREAMconnect
settimeout)r   r   r   socks       C/var/www/br/venv/lib/python3.12/site-packages/web3/providers/ipc.pyget_ipc_socketr&   /   sW    
||w	
 ""}}V^^V-?-?@X     c                       e Zd ZdZdeddfdZdej                  fdZdee	   de	de
ddfd	Zdej                  fd
Zdej                  fdZy)PersistentSocketNr   r   c                     || _         y N)r   )selfr   s     r%   __init__zPersistentSocket.__init__A   s	     r'   c                     | j                   st        d| j                         | j                  s| j                         | _        | j                  S )Nz&cannot connect to IPC socket at path: )r   FileNotFoundErrorr$   _openr,   s    r%   	__enter__zPersistentSocket.__enter__D   sE    }}#88IJ  yy

DIyyr'   exc_type	exc_value	tracebackc                 l    |#	 | j                   j                          d | _         y y # t        $ r Y w xY wr+   )r$   close	Exception)r,   r3   r4   r5   s       r%   __exit__zPersistentSocket.__exit__N   s?      		! DI !  s   ' 	33c                 ,    t        | j                        S r+   )r&   r   r1   s    r%   r0   zPersistentSocket._open\   s    dmm,,r'   c                 x    | j                   j                          | j                         | _         | j                   S r+   )r$   r7   r0   r1   s    r%   resetzPersistentSocket.reset_   s'    		JJL	yyr'   )__name__
__module____qualname__r$   strr-   r   r2   r	   BaseExceptionr   r9   r0   r<    r'   r%   r)   r)   >   sz    D! ! !6== }% ! !	
 
-v}} -v}} r'   r)   c                      t         j                  dk(  r?t        j                  j	                  t        j                  j                  dddd            S t         j                  j                  d      st         j                  j                  d      r>t        j                  j	                  t        j                  j                  ddd            S t         j                  d	k(  ry
t        dt         j                   d      )Ndarwin~LibraryEthereumgeth.ipclinuxfreebsdz	.ethereumr   \\.\pipe\geth.ipcUnsupported platform 'P'. Only darwin/linux/win32/freebsd are supported.  You must specify the ipc_path)r   r   ospath
expanduserjoin
startswithr   rB   r'   r%   get_default_ipc_pathrS   e   s    
||xww!!"'',,sIz:"VWW		 	 	)S\\-D-DY-Oww!!"'',,sK"LMM		 # $S\\N 3D D
 	
r'   c                     t         j                  j                  dd      } | rd| v r| S t        j                  dk(  st        j                  j                  d      r]t         j                  j                  dd      }t         j                  j                  t         j                  j                  |d            S t        j                  j                  d      r=t         j                  j                  t         j                  j                  dd            S t        j                  d	k(  ry
t        dt        j                   d      )NWEB3_PROVIDER_URI rH   rD   rI   TMPDIRz/tmprJ   r   rK   rL   rM   )rN   environgetr   r   rR   rO   rP   rQ   endswithr   )web3_provider_uritmpdirs     r%   get_dev_ipc_pathr]   v   s    

':B?Z+<<  		!S\\%<%<W%E&1ww!!"'',,vz"BCC			y	)ww!!"'',,vz"BCC		 # $S\\N 3D D
 	
r'   c            	            e Zd Z ej                  d      ZdZ	 	 ddeee	f   de
deddf fdZdefdZd	edefd
Zedededefd       Zdeeeef      dee   fdZ xZS )IPCProviderzweb3.providers.IPCProviderNr   r   kwargsr   c                 ~   t        |   di | |t               | _        nat	        |t
              st	        |t              r6t        t        |      j                         j                               | _        nt        d      || _
        t        j                         | _        t        | j                        | _        y )Nz/ipc_path must be of type string or pathlib.PathrB   )superr-   rS   r   
isinstancer@   r   rP   resolver   r   	threadingLock_lockr)   _socket)r,   r   r   r`   	__class__s       r%   r-   zIPCProvider.__init__   s     	"6"02DM#&*Xt*DX 9 9 ; C C EFDM QRR^^%
'6r'   c                 P    d| j                   j                   d| j                   dS )N< >)ri   r=   r   r1   s    r%   __str__zIPCProvider.__str__   s&    4>>**+1T]]O1==r'   requestc                    | j                   5  | j                  5 }	 |j                  |dz          d}t        | j                        5 }	 	 ||j                  d      z  }|dk(  r|j                  d       nLt        |      r/	 | j                  |      }|cd d d        cd d d        cd d d        S |j                  d       yy# t        $ r. | j                  j	                         }|j                  |       Y w xY w# t        j                  $ r |j                  d       Y w xY w# t        $ r |j                  d       Y w xY w# 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)N   
r'   i   r   )rg   rh   sendallBrokenPipeErrorr<   r   r   recvr   sleephas_valid_json_rpc_endingdecode_rpc_responser   )r,   ro   r$   raw_responser   responses         r%   _make_requestzIPCProvider._make_request   sl   ZZ 	! 	!&Wu_- L& !'!$		$7 $s*a(2<@,'+'?'?'MH
 $,!! !	! 	! 	!6  a( %  # &||))+W%& ">> !a( !  / %#MM!,$%! ! !	! 	! 	! 	! 	! 	!s   E1ECEE
C<"ED&E	E	E1/E4C96E8C99E<$D#	 E"D#	#E&E	 EE	EEE	E1E%	!E11E:methodparamsc                     | j                   j                  d| j                  |       | j                  ||      }| j	                  |      S )Nz(Making request IPC. Path: %s, Method: %s)loggerdebugr   encode_rpc_requestrz   )r,   r{   r|   ro   s       r%   make_requestzIPCProvider.make_request   sD    6v	
 ))&&9!!'**r'   requestsc                     | j                   j                  d| j                         | j                  |      }t	        t
        t           | j                  |            }t        |      S )Nz"Making batch request IPC. Path: %s)	r~   r   r   encode_batch_rpc_requestr   r   r   rz   r   )r,   r   request_datary   s       r%   make_batch_requestzIPCProvider.make_batch_request   sT     	>N44X>[)4+=+=l+KL28<<r'   )N   )r=   r>   r?   logging	getLoggerr~   rh   r
   r@   r   intr   r-   rn   bytesr   rz   r   r   r   r   r   r   __classcell__)ri   s   @r%   r_   r_      s    W;<FG &*7T	"7 7 	7
 
7$> >!U !{ !> +; + + + +=U;#345=	k	=r'   r_   rx   c                 X    | j                         }dD ]  }|j                  |      s y y)N)   }   ]TF)rstriprZ   )rx   stripped_raw_responsevalid_endings      r%   rv   rv      s6    (//1$  )),7 r'   )g       @)*jsonr   r   rN   pathlibr   r   r   re   typesr   typingr   r   r   r	   r
   r   web3._utils.threadsr   
web3.typesr   r   _utils.batchingr   _utils.cachingr   
exceptionsr   r   baser   r@   floatr&   r)   rS   r]   r_   r   boolrv   rB   r'   r%   <module>r      s     	  
  

S 5 6== $ $N
c 
"
# 
,F=" F=TE d r'   