
    (iqX                        d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZ d dl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 d d
lmZ d dl m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; erd dl<m=Z=m>Z> d dl,m?Z? d dl1m@Z@mAZA d dlBmCZC d ed      dgZD G d d      ZE G d d      ZFy)    N)TYPE_CHECKINGAnyAsyncGeneratorCallable	CoroutineDictListOptionalSequenceTupleUnioncast)pipe)HexBytes)RequestBatcher)generate_cache_key)Self)apply_null_result_formatters)raise_error_for_batch_response(validate_rpc_response_and_raise_if_error)NamedElementOnion)ProviderConnectionErrorTaskNotRunningWeb3TypeError)Method)AttributeDictMiddlewareBufferedGasEstimateMiddlewareENSNameToAddressMiddlewareGasPriceStrategyMiddlewareValidationMiddleware)
MiddlewareMiddlewareOnion)apply_result_formatters)AutoProviderJSONBaseProviderPersistentConnectionProvider)AsyncJSONBaseProvider) FormattedEthSubscriptionResponseRPCEndpoint
RPCRequestRPCResponse)	AsyncWeb3Web3)Web3Middleware)AsyncBaseProviderBaseProvider)RequestProcessor0xc                   n   e Zd ZU  ej                  d      Zeded   f   ed<   	 	 dded   de	ed	      d
e	e
eeef         ddfdZeded	   fd       Zej"                  ded	   ddfd       Zedeeeef      fd       Zdeeedef   f   dedefdZdeeedef   f   dedefdZ	 	 ddedede	edef      de	edef      def
dZ	 	 ddeeedef   f   dede	edef      de	edef      def
dZ	 	 ddeeedef   f   dede	edef      de	edef      def
dZdeeedef         fdZ deeedef   eedf   f      dee   fdZ!dee"eeeedef   ee   f   f      dee   fdZ#d eedef      dee$   fd!Z%d ee$   dee   fd"Z&dee"eeeedef   eedf   f   f      dee   fd#Z'deeeef   e
e   f   dedefd$Z(	 d/deded%e	ee)eedef   f   edef   edef   f      defd&Z*dedede$fd'Z+d(e$defd)Z,deee-f   fd*Z.d0d+Z/de-fd,Z0de1e-df   fd-Z2dedeee-f   fd.Z3y)1RequestManagerzweb3.manager.RequestManagerr"   )NNmiddleware_onionNw3)AsyncWeb3[Any]r-   provider)r0   r/   
middlewarereturnc                     || _         |t               | _        n|| _        || j                         }t	        |      | _        t        |t              r,t        t        | j                        }|j                  | _	        y y N)
r6   r$   r8   get_default_middlewarer   r5   
isinstancer&   r   _request_processor)selfr6   r8   r9   s       =/var/www/br/venv/lib/python3.12/site-packages/web3/manager.py__init__zRequestManager.__init__j   ss     (NDM$DM446J 1* =h <= 8$--HH8@8S8SD#	 >    c                     | j                   S r<   	_providerr@   s    rA   r8   zRequestManager.provider   s    ~~rC   c                     || _         y r<   rE   )r@   r8   s     rA   r8   zRequestManager.provider   s	    !rC   c                  L    t         dft        dft        dft        dft        dfgS )z
        List the default middleware for the request manager.
        Documentation should remain in sync with these defaults.
        gas_price_strategyens_name_to_addressattrdict
validationgas_estimate)r   r   r   r    r    rC   rA   r=   z%RequestManager.get_default_middleware   s8     ()=>')>?$j1!<0*N;
 	
rC   method.paramsc                     t        d| j                        }|j                  t        d| j                        t        d| j                              }| j
                  j                  d|        |||      S )Nr0   r-   r"   Making request. Method: %sr   r8   request_funcr6   r5   loggerdebugr@   rP   rQ   r8   rU   s        rA   _make_requestzRequestManager._make_request   sf     6,,!4(94;P;P#Q
 	6?FF++rC   c                   K   t        d| j                        }|j                  t        d| j                        t        d| j                               d {   }| j
                  j                  d|        |||       d {   S 7 17 w)Nr/   r7   r"   rS   rT   rX   s        rA   _coro_make_requestz!RequestManager._coro_make_request   s      +T]];%22!477+"D$9$9:
 
 	6?!&&111

 2s$   ABB,BB
B
Bresponseerror_formattersnull_result_formattersc                    |j                  d      dk(  xrC |j                  d      d uxr. |d   j                  d      d uxr |d   j                  d      d u}t        |||| j                  |       d|v r6|j                  dd      t        v rt	        |||       |j                  d      S |r|d   d   |d   d   dS y )	NrP   eth_subscriptionrQ   subscriptionresultis_subscription_responserV   rQ   F)ra   rb   )getr   rV   NULL_RESPONSESr   )r@   r\   rQ   r]   r^   rd   s         rA   formatted_responsez!RequestManager.formatted_response   s     LL"&88 =X&d2="&&~6dB= "&&x0<	 	! 	1%=;;	
 x ||He,>,-CXvV<<)) & ( 2> B"8,X6  &rC   c                 N    | j                  ||      }| j                  ||||      S )z?
        Make a synchronous request using the provider
        )rY   rg   r@   rP   rQ   r]   r^   r\   s         rA   request_blockingzRequestManager.request_blocking   s4     %%ff5&&f.0F
 	
rC   c                 j   K   | j                  ||       d{   }| j                  ||||      S 7 w)zC
        Coroutine for making a request using the provider
        N)r[   rg   ri   s         rA   coro_requestzRequestManager.coro_request   sA      00@@&&f.0F
 	
 As   313c                     t        | j                  t        t        t        f      st        d      t        | j                        S )z;
        Context manager for making batch requests
        z2Batch requests are not supported by this provider.)r>   r8   r'   r%   r$   r   r   r6   rG   s    rA   _batch_requestszRequestManager._batch_requests   s;     MM13C\R
   TUUdgg&&rC   requests_infor)   c                    t        t        | j                        }|j                  t        d| j                        t        d| j
                              } ||D cg c]  \  \  }}}||f c}}}      }t        |t              rGt        ||      D 	cg c]%  \  }}	| j                  |t        t        |	            ' }
}}	t        |
      S t        || j                         yc c}}}w c c}	}w )z9
        Make a batch request using the provider
        r-   r"   N)r   r%   r8   batch_request_funcr6   r5   r>   listzip_format_batched_responser+   r   rV   )r@   ro   r8   rU   rP   rQ   _response_formattersr\   inforespformatted_responsess              rA   _make_batch_requestz"RequestManager._make_batch_request  s     ($--822!4(94;P;P#Q
   ?L :$VV&:  
 h% #&mX">#D$ --dDd4KL# # +,, +8T[[A#s   C%*C,c           
      ^  K   t        t        | j                        }|j                  t        d| j                        t        d| j
                               d{   }t        j                  |  d{   } ||D cg c]  \  \  }}}||f c}}}       d{   }t        |t              rPt        t        t           |      }t        ||      D 	
cg c]  \  }	}
| j                  |	|
       }}	}
t        |      S t        || j                         y7 7 c c}}}w 7 c c}
}	w w)zG
        Make an asynchronous batch request using the provider
        r7   r"   N)r   r'   r8   rq   r6   r5   asynciogatherr>   rr   r	   r+   rs   rt   r   rV   )r@   ro   r8   rU   unpacked_requests_inforP   rQ   ru   r\   rv   rw   rx   s               rA   _async_make_batch_requestz(RequestManager._async_make_batch_request$  s-     -t}}=%88!477+"D$9$9:
 
 (/~~}'E!E% ?U :$VV&:  
 
 h%D-x8H #&&<h"G#D$ --dD9# # +,, +8T[[A1
 "F
#sT   AD-DD-4D5D-DD-D%:D-D'5&D-D-D-'D-requestsc                 |  K   t        | j                  t              st        d      | j                  j	                  t        d| j                        t        d| j                               d{   }| j                  j                  d| j                  j                                 ||       d{   S 7 H7 w)z2
        Send a batch request via socket.
        zTOnly providers that maintain an open, persistent connection can send batch requests.r7   r"   Nz3Sending batch request to open socket connection: %s)r>   rF   r&   r   send_batch_funcr   r6   r5   rV   rW   get_endpoint_uri_or_ipc_path)r@   r   	send_funcs      rA   _async_send_batchz RequestManager._async_send_batchH  s      $..*FG+  ..88!477+"D$9$9:
 
	 	ANN779	
 x(((
 )%   A-B</B80AB<3B:4B<:B<c                 |  K   t        | j                  t              st        d      | j                  j	                  t        d| j                        t        d| j                               d{   }| j                  j                  d| j                  j                                 ||       d{   S 7 H7 w)z5
        Receive a batch request via socket.
        zWOnly providers that maintain an open, persistent connection can receive batch requests.r7   r"   Nz7Receiving batch request from open socket connection: %s)r>   rF   r&   r   recv_batch_funcr   r6   r5   rV   rW   r   )r@   r   	recv_funcs      rA   _async_recv_batchz RequestManager._async_recv_batch]  s      $..*FG.  ..88!477+"D$9$9:
 
	 	ENN779	
 x(((
 )r   c           	        K   t        | j                  t              st        d      t	        j
                  |  d{   }|D cg c]  \  }}|	 }}}|D cg c]  \  }}|	 }}}| j                  |       d{   }t        |      D ]:  \  }	}
| j                  j                  j                  |
d   |
d   |
d   ||	          < | j                  |       d{   }t        |t              r5|D cg c])  }t        t        | j                  |       d{         + c}S t        || j                          y7 c c}}w c c}}w 7 7 q7 7c c}w w)z@
        Send and receive a batch request via a socket.
        z`Only providers that maintain an open, persistent connection can send and receive batch requests.NidrP   rQ   response_formatters)r>   rF   r&   r   r{   r|   r   	enumerater?   cache_request_informationr   rr   r   r+   _process_responser   rV   )r@   ro   r}   req_reqsresp_fr   r   irequest	responsesrw   s                rA    _async_make_socket_batch_requestz/RequestManager._async_make_socket_batch_requestp  sV     $..*FG7 
 (/~~}'E!E"89Q997MN)!VvNN//55#H- 	JAwNN--GG!!$7$:	 H 	 00::	i& & [(>(>t(D"DE  +9dkkB/ "F9N5 ; #Esp   ;EE 	EEEE	'E>E?A EE E8#EE
E&EEEEEc           	          |d   \  }}}t        ||d| j                  |d   d          t        || j                  ||d   d   ||            S )N   Fr   rc   )r   rV   r#   rg   )r@   ro   r\   result_formattersr]   r^   s         rA   rt   z'RequestManager._format_batched_response  sv    
 GTTUFVC+-C0%*;; #A&	
 '##a # &	
 	
rC   r   c                 \  K   t        t        | j                        }| j                  j	                  d|j                         ||       | j                  ||       d {   }|j                  j                  |d   |d   |d   |xs d       | j                  |       d {   S 7 I7 w)NzeMaking request to open socket connection and waiting for response: %s,
    method: %s,
    params: %sr   rP   rQ   )rO   rO   rO   r   )
r   r&   rF   rV   rW   r   sendr?   r   recv_for_request)r@   rP   rQ   r   r8   rpc_requests         rA   socket_requestzRequestManager.socket_request  s      4dnnE 113	
 !IIff55##==!! 3 C|	 	> 	
 **;777 6 8s%   AB,B(AB,#B*$B,*B,c                 L  K   t        t        | j                        }t        d| j                        }t        d| j                        }|j                  ||       d {   }| j                  j                  d|j                         ||        |||       d {   S 7 A7 w)Nr7   r"   zMSending request to open socket connection: %s,
    method: %s,
    params: %s)	r   r&   rF   r6   r5   r   rV   rW   r   )r@   rP   rQ   r8   async_w3r5   r   s          rA   r   zRequestManager.send  s     4dnnE($''2 143H3HI",,
 
	 	 113	
 vv...
 /s$   AB$B <B$B"B$"B$r   c                    K   t        t        | j                        }t        d| j                        }t        d| j                        }|j                  ||       d {   }| j                  j                  d|        ||       d {   }	 t        t        | j                  |       d {         S 7 X7 .7 # t        $ r5 t        |d         }|j                  j                  j                  |        w xY ww)Nr7   r"   zIGetting response for request from open socket connection:
    request: %sr   )r   r&   rF   r6   r5   r   rV   rW   r+   r   	Exceptionr   r?   _request_information_cachepop)r@   r   r8   r   r5   r   r\   response_id_keys           rA   r   zRequestManager.recv_for_request  s     4dnnE($''2 143H3HI",,
 
	 		

 #;//	4+A+A(+K%KLL
 0%K 	0$@O''BBFFW	sN   AC>B7+C>
B9C>B= .B;
/B= 6C>9C>;B= =>C;;C>c                 H  K   t        t        | j                        }| j                  j	                  d|j                                | j                  j                  }|j                  d|j                         d {   \  }}| j                  |       d {   S 7  7 w)Nz5Getting next response from open socket connection: %sF)lasttimeout)r   r&   rF   rV   rW   r   r?   _request_response_cacheasync_await_and_popitemrequest_timeoutr   )r@   r8   request_response_cache_keyr\   s        rA   recvzRequestManager.recv  s     4dnnEC113	
 "&!8!8!P!P5MM,,  N  
 
h ++H555	
 6s$   A;B"=B>B"B B" B"c                     t        |       S r<   )_AsyncPersistentMessageStreamrG   s    rA   _persistent_message_streamz)RequestManager._persistent_message_stream  s    ,T22rC   c                 Z   K   | j                         j                          d {   S 7 wr<   )_message_stream	__anext__rG   s    rA   _get_next_messagez RequestManager._get_next_message  s$     ))+557777s   "+)+c                  K   t        | j                  t              st        d      t	        d| j
                        }| j                  j                  t        d      	 	 | j                  j                  d       d {   }|j                  d|j                  di       j                  d            }|j                  j                  |      r-t	        t        | j                  |       d {         }| n	 7 7 # t        $ rh}t!        j"                  d       d {  7   | j                  j%                          | j&                  j)                  d	|j*                         Y d }~y d }~ww xY ww)
NzROnly providers that maintain an open, persistent connection can listen to streams.r7   z,No listener found for persistent connection.T)ra   ra   rQ   r   zStopping message stream: %s)r>   rF   r&   r   r   r6   _message_listener_taskr   r?   pop_raw_responsere   subscription_manager	get_by_idr(   r   r   r{   sleep _handle_listener_task_exceptionsrV   errormessage)r@   r   r\   sub_idformatted_sub_responsees         rA   r   zRequestManager._message_stream  s[     $..*FG)  ($''2>>008)>  !%!8!8!I!I!% "J " 
 ""HLL2$>$B$B>$R 00::6B-18"44X>>.* 10  1!  ? " mmA&&&??A!!"?K	sb   AE9!D  DA.D /D
0D >E9D D 	E6E1&D)'AE1,E91E66E9c                   K   t        t        | j                        }| j                  j	                  |      }|| j
                  j                  d       |S |j                  dk(  rd|j                         v r||d   }t        |      }|| j                  j                  vrT||_        |j
                  j                  d||j                         | j                  j                  j                  ||       t        |j                        dkD  rt!        |g|j                   }|j"                  \  }}}| j%                  ||j&                  ||      }	t)        ||	      S w)Nz7No cache key found for response, returning raw responseeth_subscriberb   zDCaching eth_subscription info:
    cache_key=%s,
    request_info=%sr   )r   r&   rF   r?   $get_request_information_for_responserV   rW   rP   keysr   r   subscription_id__dict__cachelenmiddleware_response_processorsr   r   rg   rQ   r#   )
r@   r\   r8   request_infor   	cache_keyr   r]   null_formatterspartly_formatted_responses
             rA   r   z RequestManager._process_response0  s_     4dnnE..SS
 KKWXO""o5(hmmo:U #+8"4.?	D$;$;$V$VV 4CL0OO)). "$-- ++FFLL!<
 <>>?!CW<+V+VW 00	! (,(?(?## 	)% ++<>WXXs   EEr<   )r:   r   )4__name__
__module____qualname__logging	getLoggerrV   r   r   __annotations__r
   r   r   r!   strrB   propertyr8   setterstaticmethodr	   r=   r)   r   r   r+   rY   r[   rg   rj   rl   r   r   rn   ry   r   r~   r*   r   r   r   rt   r   r   r   r   r(   r   r   r   r   r   r   rO   rC   rA   r4   r4   e   s   W<=F-/@/LLMM
 JNAE	T*+T 5!DEFT XeJO&<=>	T
 
T0 % CD   __"'J!K "PT " " 
Dz3)?$@ 
 
 ,K#{2B)CCD,NQ,	,	2K#{2B)CCD	2NQ	2		20 :>?C## # #8CH#56	#
 !)#s(); <# 
#R :>?C
k8C,<#==>
 
 #8CH#56	

 !)#s(); <
 

& :>?C
k8C,<#==>
 
 #8CH#56	

 !)#s(); <
 

"'xS7I0J!K 'B!%mS.@(A5c?(R"STB	k	B8"Bc3eM3,>&?s&K LLM
"B
 
k	"BH)U=##567)	j	)*)Z0@ )T+EV )&&Cc3eM3,>&?sCx&P QQR
&C
 
k	&CP
U;#34hsmCD
 
 
	
> 88 8 &$sHS#X../#s(1CXcSVhEWWX
	8 
84/ /c /j /$*  *6E+/O"OP 638)I 8'	8$>	?'R/Y#/Y	{<<	=/YrC   r4   c                   L     e Zd ZdZdedededdf fdZdefdZde	fd	Z
 xZS )
r   z
    Async generator for pulling subscription responses from the request processor
    subscription queue. This abstraction is necessary to define the `__aiter__()`
    method required for use with "async for" loops.
    managerargskwargsr:   Nc                 p    || _         t        t        |j                        | _        t        |   |i | y r<   )r   r   r&   rF   r8   superrB   )r@   r   r   r   	__class__s       rA   rB   z&_AsyncPersistentMessageStream.__init__i  s5    6:('*;*;7
 	$)&)rC   c                     | S r<   rO   rG   s    rA   	__aiter__z'_AsyncPersistentMessageStream.__aiter__p  s    rC   c                 R   K   | j                   j                          d {   S 7 wr<   )r   r   rG   s    rA   r   z'_AsyncPersistentMessageStream.__anext__s  s     \\335555s   '%')r   r   r   __doc__r4   r   rB   r   r   r(   r   __classcell__)r   s   @rA   r   r   b  sB    * *s *c *d *4 6!A 6rC   r   )Gr{   r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   eth_utils.toolzr   hexbytesr   web3._utils.batchingr   web3._utils.cachingr   web3._utils.compatr   web3._utils.formattersr   web3._utils.validationr   r   web3.datastructuresr   web3.exceptionsr   r   r   web3.methodr   web3.middlewarer   r   r   r   r    web3.middleware.baser!   r"   web3.moduler#   web3.providersr$   r%   r&   web3.providers.async_baser'   
web3.typesr(   r)   r*   r+   	web3.mainr,   r-   r.   r/   r0   +web3.providers.persistent.request_processorr1   rf   r4   r   rO   rC   rA   <module>r      s         
  
  
 -zY zYz6 6rC   