
    (i,                     b   d dl mZ d dlm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mZmZ d dlmZ d dlmZmZmZ  ed      Z ede      Z ed	      Z G d
 de
eef         Z G d deeef   eeef         Z G d deeef   e      Zde
eef   deeef   fdZ G d de
eef         Z y)    )OrderedDict)Hashable)AnyCallableDictIteratorListMappingMutableMappingOptionalSequenceTupleTypeVarUnion
ValuesViewcast)
is_integer)Web3AssertionErrorWeb3TypeErrorWeb3ValueErrorTTKey)boundTValuec                       e Zd ZdZdeeef   dededdfdZdedefd	Z	de
e   fd
ZdefdZdefdZdededdfdZededefd       Zy)ReadableAttributeDictz9
    The read attributes for the AttributeDict types
    
dictionaryargskwargsreturnNc                 l    t        |      | _        | j                  j                  t        |i |       y N)dict__dict__update)selfr   r   r   s       D/var/www/br/venv/lib/python3.12/site-packages/web3/datastructures.py__init__zReadableAttributeDict.__init__1   s,     Z(T42623    keyc                      | j                   |   S r"   r$   r&   r*   s     r'   __getitem__z!ReadableAttributeDict.__getitem__8   s    }}S!!r)   c                 ,    t        | j                        S r"   )iterr$   r&   s    r'   __iter__zReadableAttributeDict.__iter__;   s    DMM""r)   c                 ,    t        | j                        S r"   )lenr$   r1   s    r'   __len__zReadableAttributeDict.__len__>   s    4==!!r)   c                 P    | j                   j                  d| j                  dz   S )N())	__class____name__r$   r1   s    r'   __repr__zReadableAttributeDict.__repr__A   s%    ~~&&1T]],=Q)???r)   buildercyclec                     |j                  | j                  j                  dz          |r|j                  d       n|j                  | j                         |j                  d       y)z
        Custom pretty output for the IPython console
        https://ipython.readthedocs.io/en/stable/api/generated/IPython.lib.pretty.html#extending  # noqa: E501
        r7   z<cycle>r8   N)textr9   r:   prettyr$   )r&   r<   r=   s      r'   _repr_pretty_z#ReadableAttributeDict._repr_pretty_D   sJ    
 	T^^,,s23LL#NN4==)Sr)   valuec           
         t        |t              r9 | |j                         D ci c]  \  }}|| j                  |       c}}      S t        |t              rDt        |t
        t        f      s. t        |      |D cg c]  }| j                  |       c}      S t        |t              r|D ch c]  }| j                  |       c}S |S c c}}w c c}w c c}w )z
        Recursively convert mappings to ReadableAttributeDict instances and
        process nested collections (e.g., lists, sets, and dictionaries).
        )	
isinstancer
   items	recursiver   strbytestypeset)clsrB   kvs       r'   rF   zReadableAttributeDict.recursiveP   s     eW%F13==++FGGx(EC<1P4;%@Qa 0@AAs#.34CMM!$44 G@4s   C
?C2C)r:   
__module____qualname____doc__r   r   r   r   r(   r.   r   r2   intr5   rG   r;   boolrA   classmethodrF    r)   r'   r   r   ,   s    4tV|,4584DG4	4"t " "#(3- #" "@# @
S 
 
$ 
 f   r)   r   c                   0    e Zd ZdededdfdZdeddfdZy)MutableAttributeDictr*   valr    Nc                 "    || j                   |<   y r"   r,   r&   r*   rW   s      r'   __setitem__z MutableAttributeDict.__setitem__b   s     cr)   c                     | j                   |= y r"   r,   r-   s     r'   __delitem__z MutableAttributeDict.__delitem__e   s    MM#r)   )r:   rN   rO   r   rZ   r\   rT   r)   r'   rV   rV   _   s/    !s ! ! !s t r)   rV   c                   \     e Zd ZdZdededdf fdZdeddfdZdefd	Z	d
e
defdZ xZS )AttributeDictzI
    Provides superficial immutability, someone could hack around it
    attrrW   r    Nc                 F    |dk(  rt         |   ||       y t        d      )Nr$   <This data is immutable -- create a copy instead of modifying)super__setattr__r   )r&   r_   rW   r9   s      r'   rc   zAttributeDict.__setattr__n   s*    :Gc*N r)   r*   c                     t        d      )Nra   )r   r-   s     r'   __delattr__zAttributeDict.__delattr__v   s    J
 	
r)   c           	      j    t        t        t        t        |       j	                                           S r"   )hashtuplesortedtupleize_lists_nestedrE   r1   s    r'   __hash__zAttributeDict.__hash__{   s&    E&!6t!<!B!B!DEFGGr)   otherc                     t        |t              rt        |       t        |      k(  S t        |t              r| j                  t        |      k(  S y)NF)rD   r^   rg   r
   r$   r#   )r&   rl   s     r'   __eq__zAttributeDict.__eq__~   s?    e]+:e,,w'==DK//r)   )r:   rN   rO   rP   rG   r   rc   re   rQ   rk   r   rR   rn   __classcell__)r9   s   @r'   r^   r^   i   sV     & T 
s 
t 

H# HC D r)   r^   dr    c                    dt         t        t           t        t        df   f   dt        ffdt	               }| j                         D ]  \  }}t        |t        t        f      r |      ||<   (t        |t              rt        |      ||<   Gt        |t              s$t        dt        |      j                   d|       |||<    t        |      S )z
    Unhashable types inside dicts will throw an error if attempted to be hashed.
    This method converts lists to tuples, rendering them hashable.
    Other unhashable types found will raise a TypeError
    rB   .r    c                 ,    t        fd| D              S )Nc              3   ^   K   | ]$  }t        |t        t        f      r |      n| & y wr"   )rD   listrh   ).0i	_to_tuples     r'   	<genexpr>z;tupleize_lists_nested.<locals>._to_tuple.<locals>.<genexpr>   s'     XQZD%=%AYq\qHXs   *-)rh   )rB   rw   s    r'   rw   z(tupleize_lists_nested.<locals>._to_tuple   s    XRWXXXr)   zFound unhashable type 'z': )r   r	   r   r   r#   rE   rD   rt   rh   r
   rj   r   r   rI   r:   r^   )rp   retrL   rM   rw   s       @r'   rj   rj      s    YtCy%S/9: Ys Y &C	 1a$'q\CF7#*1-CFAx("9$q':J:J9K3qc RSSCF r)   c            	          e Zd ZdZefdee   dedef   ddfdZ	d!de
d	ee   ddfd
Z	 d"de
d	ee   dee   ddfdZd#dZdedede
fdZededefd       ZdeddfdZedee   fd       ZdededdfdZdeddfdZdedefdZdede
fdZdefdZdee
   fdZdee
   fdZdee
df   fdZ dee   fdZ!de"e
   fd Z#y)$NamedElementOnionz
    Add layers to an onion-shaped structure. Optionally, inject to a specific layer.
    This structure is iterable, where the outermost layer is first, and innermost
    is last.
    init_elementsvalid_element.r    Nc                     t               | _        t        |      D ]+  } ||      r| j                  |        | j                  |  - y r"   )r   _queuereversedadd)r&   r|   r}   elements       r'   r(   zNamedElementOnion.__init__   sC    
 0;}. 	#GW%!'"		#r)   r   namec                     |t        t        |      }| j                  |      }|| j                  v r||u rt	        d      t	        d      || j                  |<   y )Nz.You can't add the same un-named instance twicez6You can't add the same name again, use replace instead)r   r   _build_namer   r   )r&   r   r   s      r'   r   zNamedElementOnion.add   sb    <g&D%4;;w$%UVV$L  $Dr)   layerc           
         t        |      st        d      |dk7  rI|t        | j                        k7  r1t	        dt        |        d| dt        | j                         d      | j                  ||       |dk(  rA|t        t        |      }| j                  |      }| j                  j                  |d	
       y|t        | j                        k(  ryt        d      )a  
        Inject a named element to an arbitrary layer in the onion.

        The current implementation only supports insertion at the innermost layer,
        or at the outermost layer. Note that inserting to the outermost is equivalent
        to calling :meth:`add` .
        z'The layer for insertion must be an int.r   z1You can only insert to the beginning or end of a z$, currently. You tried to insert to z, but only 0 and z are permitted. )r   NF)lastz7Impossible to reach: earlier validation raises an error)r   r   r4   r   NotImplementedErrorrI   r   r   r   r   move_to_endr   )r&   r   r   r   s       r'   injectzNamedElementOnion.inject   s     %  IJJaZES%55%CDJ< P55:G;Lt{{#$$46  	t$A:|D'*##D)DKK##Du#5c$++&&$I r)   c                 8    | j                   j                          y r"   )r   clearr1   s    r'   r   zNamedElementOnion.clear   s    r)   oldnewc                     | j                  |      }|| j                  vrt        d      | j                  |   }||u r| j                  ||       |S || j                  |<   |S )Nz<You can't replace unless one already exists, use add instead)r   r   r   _replace_with_new_name)r&   r   r   old_nameto_be_replaceds        r'   replacezNamedElementOnion.replace   st    ##C(4;;& N  X.S ''S1  %(DKK!r)   rB   c                     	 | j                          | S # t        $ r[ t        |       st        dt	        |               | d       }t        t        |j                   d|j                          d      cY S w xY w)Nz*Expected a callable or hashable type, got <>)rk   	TypeErrorcallabler   rI   r   r   r9   )rB   rM   s     r'   r   zNamedElementOnion._build_name   sy    	@NNL 
	@E?#@eN  dAQqzz|nA>??
	@s    A!A87A8c                 r    | j                  |      }|| j                  vrt        d      | j                  |= y )Nz1You can only remove something that has been added)r   r   r   )r&   r   r   s      r'   removezNamedElementOnion.remove  s6    ##C(4;;& !TUUKK!r)   c                 ~    t        | j                  j                               D cg c]	  \  }}||f c}}S c c}}w )z
        Returns middleware in the appropriate order to be imported into a new Web3
        instance (reversed _queue order) as a list of (middleware, name) tuples.
        )r   r   rE   rY   s      r'   
middlewarezNamedElementOnion.middleware  s2     ,4DKK4E4E4G+HIxsCc
IIIs   9c                 *   | j                  |      }| j                  |      }|| j                  |<   d}t        | j                  j                               D ]-  }|s||k(  rd}||k7  s| j                  j	                  |       / | j                  |= y )NFT)r   r   rt   keysr   )r&   r   r   r   new_name	found_oldr*   s          r'   r   z(NamedElementOnion._replace_with_new_name  s    ##C(##C( #H	((*+ 	-C(? $I'',	- KK!r)   rl   zNamedElementOnion[TKey, TValue]c                     t        |t              st        S | j                  j	                         }|j                  |j                         t        t        t        t           |j                                     S r"   )
rD   r{   NotImplementedr   copyr%   r   r	   r   rE   )r&   rl   combineds      r'   __add__zNamedElementOnion.__add__%  sR    %!23!!;;##%% d3i1A!BCCr)   c                 @    | j                  |      }|| j                  v S r"   r   r   r&   r   element_names      r'   __contains__zNamedElementOnion.__contains__-  s!    ''0t{{**r)   c                 B    | j                  |      }| j                  |   S r"   r   r   s      r'   r.   zNamedElementOnion.__getitem__1  s!    ''0{{<((r)   c                 ,    t        | j                        S r"   )r4   r   r1   s    r'   r5   zNamedElementOnion.__len__5  s    4;;r)   c                     t        t        t           | j                  j	                               }t        |t              st        |      }t        |      S r"   )	r   r	   r   r   valuesrD   r   rt   r0   r&   elementss     r'   __reversed__zNamedElementOnion.__reversed__8  s<    S	4;;#5#5#78(H-H~HH~r)   c                     | j                   j                         }t        |t              st	        |      }t        |      S r"   )r   r   rD   r   rt   r   r   s     r'   _reversed_middlewarez&NamedElementOnion._reversed_middleware@  s2    ;;%%'(H-H~H!!r)   c                 4    t        | j                               S )z
        Helps with type hinting since we return `Iterator[TKey]` type, though it's
        actually a `Iterator[TValue]` type, for the `__iter__()` method. This is in
        order to satisfy the `Mapping` interface.
        )rh   r   r1   s    r'   as_tuple_of_middlewarez(NamedElementOnion.as_tuple_of_middlewareG  s     T..011r)   c                 4    t        | j                               S r"   )r0   r   r1   s    r'   r2   zNamedElementOnion.__iter__O  s    
 D--/00r)   c                 ,    t        | j                        S r"   )r   r   r1   s    r'   r   zNamedElementOnion.valuesV  s    $++&&r)   r"   )NN)r    N)$r:   rN   rO   rP   r   r   r   r   rR   r(   r   r   r   r   rQ   r   r   r   staticmethodr   r   propertyr   r   r   r   r.   r5   r   r   r   r   r   r2   r   r   rT   r)   r'   r{   r{      s    .6
#}
#  T	*
# 
	
#$6 $$ $4 $" TX!!%-d^!CKC=!	!F4 d v   @4 @D @ @ "$ "4 " JHSM J J"$ "T "d "DS D%F D+C +D +)4 )F )   hv. "hv&6 "2fck(: 21(4. 1'
6* 'r)   r{   N)!collectionsr   collections.abcr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   	eth_utilsr   web3.exceptionsr   r   r   r   r   r   r   rV   r^   rj   r{   rT   r)   r'   <module>r      s      "  CLvX&		0GD&L1 0f4< "7f"E)$,7 <WT6\2 }T6\7R .y'f- y'r)   