
    (i%              	          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
 d dlmZ d dlmZmZmZ d dl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!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d d
l*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 	 d/dededee2   defdZ3dede2defdZ4dede2defdZ5dede2defdZ6dedefdZ7ede8de2de8de8fd       Z9 e9d      Z:edede;f   de
eee;f   de;fd        Z<ededef   d!e
eee;f   defd"       Z= G d# d$      Z>d%e
ee;e8e2f   defd&Z? G d' d(e      Z@d)edede8fd*ZA G d+ d,e j                        ZCd-eeef   de;fd.ZDy)0    N)AnyCallableDictIterableOptionalSequenceTypeUnion)BaseArrayEncoder)HexStr
PrimitivesTypeStr)add_0x_prefix
encode_hexis_bytesis_hexis_list_likeremove_0x_prefixto_bytesto_hex)curry)HexBytes)	BaseModel)	is_address_typeis_array_typeis_bool_typeis_bytes_typeis_int_typeis_string_typeis_uint_typesize_of_typesub_type_of_array_type)validate_abi_typevalidate_abi_value)AttributeDict)Web3TypeErrorWeb3ValueErrorabi_typevalue
force_sizereturnc                 D   t        |        t        | |       |xs t        |       }t        |       rGt	        |       }t        dj                  |D cg c]  }t        t        ||d             c}            S t        |       rt        ||      S t        |       rt        ||      S t        |       rt        ||      S t        |       rt        ||      S t!        |       rt#        |      rt%        |      S |S t'        |       rt)        |      S t+        d|        c c}w )z?
    Encodes value into a hex string in format of abi_type
        textzUnsupported ABI type: )r#   r$   r!   r   r"   r   joinr   hex_encode_abi_typer   to_hex_with_sizer    r   to_hex_twos_complimentr   pad_hexr   r   r   r   r   r'   )r(   r)   r*   	data_sizesub_typevs         E/var/www/br/venv/lib/python3.12/site-packages/web3/_utils/encoding.pyr2   r2   C   s    hx'4l84IX)(3GGRWXQ!"5h3"GHX
 	

 
h	y11	h	y11	X	%eY77		"ui((	x	 E?e$$L		!5!!5hZ@AA' Ys   Dbit_sizec                     | dk\  rt        | |      S d|z  | z   } t        |       }t        |j                  d            }|S )zZ
    Converts integer value to twos compliment hex representation with given bit_size
    r      L)r3   hexr   rstrip)r)   r:   	hex_values      r9   r4   r4   g   sJ     zx00(]e#EE
Iy'',-I    c                 ,    t        t        |       |      S )z6
    Converts a value to hex with given bit_size:
    )r5   r   r)   r:   s     r9   r3   r3   t   s     6%=(++rA   c                 d    t        |       } t        | j                  t        |dz                    S )z4
    Pads a hex string up to the given bit_size
       )r   r   zfillintrC   s     r9   r5   r5   {   s+     U#ESA%6788rA   hexstrc                     | j                  d      r0t        t        j                  dd|             } | dk(  rt        d      } | S )N0x0z^0x0+0x)
startswithr   resubrH   s    r9   trim_hexrP      s<    wf56T>E]FMrA   	fill_with	num_bytesunpaddedc                 &    |j                  ||       S N)rjust)rQ   rR   rS   s      r9   	pad_bytesrW      s    >>)Y//rA       to_type.text_or_primitivec                 H    t        |t              rd|}}n|d}} | ||      S )a#  
    Convert to a type, assuming that strings can be only unicode text (not a hexstr)

    @param to_type is a function that takes the arguments (primitive, hexstr=hexstr,
        text=text), eg~ to_bytes, to_text, to_hex, to_int, etc
    @param text_or_primitive in bytes, str, or int.
    Nr/   )
isinstancestr)rY   rZ   	primitiver0   s       r9   text_if_strr_      s/     #S)!#4D.D94((rA   hexstr_or_primitivec                     t        |t              r1d|}}t        t        |            rt	        |      st        d|      |d}} | ||      S )a#  
    Convert to a type, assuming that strings can be only hexstr (not unicode text)

    @param to_type is a function that takes the arguments (primitive, hexstr=hexstr,
        text=text), eg~ to_bytes, to_text, to_hex, to_int, etc
    @param hexstr_or_primitive in bytes, str, or int.
    Nz2when sending a str, it must be a hex string. Got: rO   )r\   r]   r   r   r   r'   )rY   r`   r^   rH   s       r9   hexstr_if_strrb      s`     %s+#%8FF6N+F6N +.0 
  3DF9V,,rA   c                       e Zd ZdZdeeef   dee   fdZdee   dee   fdZ		 ddeeef   d	e
eej                        defd
Zdedeeef   fdZ	 ddeeef   d	e
eej                        defdZy)FriendlyJsonSerdez
    Friendly JSON serializer & deserializer

    When encoding or decoding fails, this class collects
    information on which fields failed, to show more
    helpful information in the raised error messages.
    mappingr+   c              #      K   |j                         D ]  \  }}	 | j                  |        y # t        $ r}|d| d Y d }~3d }~ww xY wwNz: because ())items_friendly_json_encode	TypeError)selfre   keyvalexcs        r9   _json_mapping_errorsz&FriendlyJsonSerde._json_mapping_errors   sV      	2HC2**3/	2  2{3%q112s*   A.A	A
AAAAiterablec              #      K   t        |      D ]  \  }}	 | j                  |        y # t        $ r}| d| d Y d }~3d }~ww xY wwrg   )	enumeraterj   rk   )rl   rq   indexelementro   s        r9   _json_list_errorsz#FriendlyJsonSerde._json_list_errors   sU     '1 	2NE72**73	2  2{3%q112s)   A	)A		A
AA	AA	Nobjclsc                 F   	 t        j                  ||      }|S # t        $ r|}t        |d      r/dj	                  | j                  |            }t        d| d      t        |      r/dj	                  | j                  |            }t        d| d      |d }~ww xY w)Nrx   ri   z; z%dict had unencodable value at keys: {}z&list had unencodable value at index: [])	jsondumpsrk   hasattrr1   rp   r&   r   rv   )rl   rw   rx   encodedfull_exceptionitem_errorselement_errorss          r9   rj   z'FriendlyJsonSerde._friendly_json_encode   s    	%jj#.GN 	%sG$"ii(A(A#(FG#<[ML  c"!%4+A+A#+F!G#<^<LAN  %$	%s    	B A7BB json_strc                     	 t        j                  |      }|S # t         j                  j                  $ rC}d|d| d}t         j                  j                  ||j                  |j
                        d }~ww xY w)NzCould not decode z because of .)r}   loadsdecoderJSONDecodeErrordocpos)rl   r   decodedro   err_msgs        r9   json_decodezFriendlyJsonSerde.json_decode   sn    	Jjj*GN||++ 	J)(\#aHG ,,..wII		Js    A9>A44A9c                 h    	 | j                  ||      S # t        $ r}t        d|       d }~ww xY w)Nrz   zCould not encode to JSON: )rj   rk   r&   )rl   rw   rx   ro   s       r9   json_encodezFriendlyJsonSerde.json_encode   sC    	D--cs-;; 	D"<SE BCC	Ds    	1,1rU   )__name__
__module____qualname____doc__r   r   r   r]   rp   rv   r   r	   r}   JSONEncoderrj   r   r    rA   r9   rd   rd      s    2DcN 2x} 22(3- 2HSM 2 LP%S>%(0d6F6F1G(H%	%(JC JDcN J LPDS>D(0d6F6F1G(HD	DrA   rd   hex_or_str_or_bytesc                     d}t        t        |       }t        |      dkD  rt        dt        |       d      t	        |      }t        ||      S )N    rE   z%expected value of size 4 bytes. Got: z bytes)rb   r   lenr'   r   r5   )r   size_of_4bytesbyte_strhex_strs       r9   to_4byte_hexr      sV    NX':;H
8}q3CM?&I
 	
 "G7N++rA   c                   &    e Zd ZdZdee   defdZy)DynamicArrayPackedEncoderTr)   r+   c                 ,    | j                  |      }|}|S rU   )encode_elements)rl   r)   encoded_elementsencoded_values       r9   encodez DynamicArrayPackedEncoder.encode  s    //6(rA   N)r   r   r   
is_dynamicr   r   bytesr   r   rA   r9   r   r     s    JHSM e rA   r   _typec                    dd l }ddlm} ddlm}m} |j                  |       } ||       ra|j                  |j                  j                               }|j                  d   dk7  rt        |      j                  |      S t        d      |j                  dk(  r|j                  |d	      S |j                  d
k(  r|S y )Nr   )grammar)has_arrlistregistryr<   )item_encoderzAFixed arrays are not implemented in this packed encoder prototypestringutf8r   )codecseth_abir   eth_abi.registryr   r   parseget_encoder	item_typeto_type_strarrlistr   r   NotImplementedErrorbase)r   r)   r   abi_type_parserr   r   r(   r   s           r9   encode_single_packedr     s    
 $$U+H5++H,>,>,J,J,LMB1$,,GNNuUU%S  
(	"}}UF++	'	!rA   c                   0    e Zd Zdedeeeef   ef   fdZy)Web3JsonEncoderrw   r+   c                     t        |t              r|j                  S t        |t        t        f      rt        |      S t        |t              r|j                  d      S t        j                  j                  | |      S )NT)by_alias)r\   r%   __dict__r   r   r   r   
model_dumpr}   r   default)rl   rw   s     r9   r   zWeb3JsonEncoder.default,  se    c=)<<h./#;Y' >>4>00''c22rA   N)r   r   r   r   r
   r   r   r   r   rA   r9   r   r   +  s'    
33 
35c3h)?#@ 
3rA   r   rw   c                 @    t               j                  | t              S )zO
    Convert a complex object (like a transaction object) to a JSON string
    rz   )rd   r   r   )rw   s    r9   to_jsonr   9  s     **3O*DDrA   rU   )Er}   rM   typingr   r   r   r   r   r   r	   r
   eth_abi.encodingr   
eth_typingr   r   r   	eth_utilsr   r   r   r   r   r   r   r   eth_utils.toolzr   hexbytesr   pydanticr   web3._utils.abir   r   r   r   r   r   r    r!   r"   web3._utils.validationr#   r$   web3.datastructuresr%   web3.exceptionsr&   r'   rG   r2   r4   r3   r5   rP   r   rW   
zpad_bytesr]   r_   rb   rd   r   r   r   r   r   r   r   rA   r9   <module>r      s@    		 	 	 
	 	 	
 
 
 @D!B!B!!B/7}!B!BH
# 
 
 
,C ,3 ,6 ,93 9# 9& 9V   0 03 0% 0E 0 0 u
 )c3h)49*fc:Q4R)) )" -c6k"-9>z6SV?V9W-- -,;D ;D|,eFC,C&D , , 0    63d&& 3Ec3h EC ErA   