
    (iq                         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
 erd dlmZmZ d dlmZmZmZmZmZmZ  G d d      Z G d d	e      Zee   Ze
eef   Zy
)    )abstractmethod)TYPE_CHECKINGAnyListTupleTypeUnion)NamedElementOnion)	AsyncWeb3Web3)AsyncMakeBatchRequestFnAsyncMakeRequestFnMakeBatchRequestFnMakeRequestFnRPCEndpointRPCResponsec                       e Zd ZU dZed   ed<   ded   ddfdZdefdZd	e	de
fd
ZddZ	 	 	 	 ddZddde	de	fdZ	 	 	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 ddZddde	de	fdZ	 	 	 	 	 	 ddZy)Web3Middlewarezy
    Base class for web3.py middleware. This class is not meant to be used directly,
    but instead inherited from.
    zAsyncWeb3[Any]r   _w3w3returnNc                     || _         y N)r   )selfr   s     E/var/www/br/venv/lib/python3.12/site-packages/web3/middleware/base.py__init__zWeb3Middleware.__init__(   s	        c                 r    t        | j                  j                   dt        | j                         d      S )N())hash	__class____name__str__dict__)r   s    r   __hash__zWeb3Middleware.__hash__+   s/    t~~../qT]]1C0DAFGGr   otherc                 f    t        |t              sy| j                         |j                         k(  S )NF)
isinstancer   r'   )r   r(   s     r   __eq__zWeb3Middleware.__eq__.   s'    %0}}%.."222r   c                 ,     dddt         ddf fd}|S )Nmethodr   paramsr   r   c                 `    j                  | |      \  } }j                  |  | |            S r   )request_processorresponse_processorr-   r.   make_requestr   s     r   
middlewarez4Web3Middleware.wrap_make_request.<locals>.middleware6   s3    !33FFCNFF**6<3OPPr   r   r   r3   r4   s   `` r   wrap_make_requestz Web3Middleware.wrap_make_request5   s)    	Q} 	Qc 	Qm 	Q r   c                 h     dt         t        dt        f      dt        t         d   df   f fd}|S )Nrequests_infor   r   r   c                    | D cg c]  \  }}j                  ||       }}} 
|      }t        |t              s|S t        | \  }}t        ||      D cg c]  \  }}j	                  ||       }	}}|	S c c}}w c c}}w r   )r0   r*   listzipr1   r9   r-   r.   req_processedresponsemethods_paramsmrformatted_responsesmake_batch_requestr   s             r   r4   z:Web3Middleware.wrap_make_batch_request.<locals>.middleware?   s    
 )6$VV &&vv6M  *-8Hh-"M2GW:=gx:P#26!Q''1-# # '&#s   A;Br   r   r   r	   r   rE   r4   s   `` r   wrap_make_batch_requestz&Web3Middleware.wrap_make_batch_request<   s>    	'mS&8 9:	'4&56	'$ r   r-   r   r.   c                 
    ||fS r    r   r-   r.   s      r   r0   z Web3Middleware.request_processorS   s    v~r   c                     |S r   rJ   r   r-   r?   s      r   r1   z!Web3Middleware.response_processorV   s	     r   c                 4    K   dddt         ddf fd}|S w)Nr-   r   r.   r   r   c                    K   j                  | |       d {   \  } }j                  |  | |       d {          d {   S 7 07 7 wr   )async_request_processorasync_response_processorr2   s     r   r4   z:Web3Middleware.async_wrap_make_request.<locals>.middleware`   sZ     #'#?#?#OONFF66"6622   P 3s1   AA
AA
AAAAAr5   r6   s   `` r   async_wrap_make_requestz&Web3Middleware.async_wrap_make_request]   s)     	] 	C 	M 	 s   c                 p    K   dt         t        dt        f      dt        t         d   df   f fd}|S w)Nr9   r   r   r   c                 R  K   | D cg c]  \  }}j                  ||       d {   ! }}} 
|       d {   }t        |t              s|S t        | \  }}t        ||      D cg c]  \  }}j	                  ||       d {   ! }	}}|	S 7 nc c}}w 7 a7 c c}}w wr   )rP   r*   r;   r<   rQ   r=   s             r   r4   z@Web3Middleware.async_wrap_make_batch_request.<locals>.middlewarel   s     
 )6$VV 2266BBBM  0>>Hh-"M2GW  2#Aq 33Aq999# # '& C ? :#sS   B'BBBB'B0B',B!	B
B!B'BB'B!!B'rF   rG   s   `` r   async_wrap_make_batch_requestz,Web3Middleware.async_wrap_make_batch_requesti   sB     	'mS&8 9:	'4&56	'& s   26c                    K   ||fS wr   rJ   rK   s      r   rP   z&Web3Middleware.async_request_processor   s     
 v~s   c                    K   |S wr   rJ   rM   s      r   rQ   z'Web3Middleware.async_response_processor   s     
 s   )r3   r   r   r   )rE   r   r   r   )r-   r   r?   r   r   r   )r3   r   r   r   )rE   r   r   r   )r$   
__module____qualname____doc__r	   __annotations__r   intr'   r   boolr+   r7   rH   r0   r1   rR   rU   rP   rQ   rJ   r   r   r   r       s   
 
'	((5!9: t H# H3C 3D 3"6	. s s #/<	
0
	
";	"0  
	   
	r   r   c            
       >    e Zd Zeeded   dededefd              Zy)Web3MiddlewareBuilderr   r   argskwargsr   c                     t        d      )a  
        Implementation should initialize the middleware class that implements it,
        load it with any of the necessary properties that it needs for processing,
        and curry for the ``w3`` argument since it isn't initially present when building
        the middleware.

        example implementation:

        ```py
        class MyMiddleware(Web3BuilderMiddleware):
            internal_property: str = None

            @staticmethod
            @curry
            def builder(user_provided_argument, w3):
                middleware = MyMiddleware(w3)
                middleware.internal_property = user_provided_argument
                return middleware

            def request_processor(self, method, params):
                ...

            def response_processor(self, method, response):
                ...

        construct_my_middleware = MyMiddleware.builder

        w3 = Web3(provider)
        my_middleware = construct_my_middleware("my argument")
        w3.middleware_onion.inject(my_middleware, layer=0)
        ```
        z!Must be implemented by subclasses)NotImplementedError)r   r`   ra   s      r   buildzWeb3MiddlewareBuilder.build   s    N ""EFFr   N)	r$   rX   rY   staticmethodr   r	   r   r   rd   rJ   r   r   r_   r_      sL    %G*+%G%G %G 
	%G  %Gr   r_   N)abcr   typingr   r   r   r   r   r	   web3.datastructuresr
   web3r   r   
web3.typesr   r   r   r   r   r   r   r_   
Middlewarer%   MiddlewareOnionrJ   r   r   <module>rm      sc      m m`(GN (GZ .!
#CO4r   