
    (i,                        U d dl Z d dlmZ d dlZd dlmZmZmZ d dl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mZ g d
Zg dZ ee      j0                  dz  ZdZ e       Zeeee   f   ed<   dedee   fdZ G d d      Z y)    N)Path)DictListUnion)bitarray)ba2intint2ba)ValidationError)Language   )pbkdf2_hmac_sha512sha256unicode_decompose_string)                )            r   wordlisti   _cached_wordlistslanguagereturnc                 p   | t         j                         v r	t         |    S t        t        |  dz  d      5 }|j	                         D cg c]  }|j                          }}d d d        t              t        k7  rt        dt         dt        |       d      |t         | <   |S c c}w # 1 sw Y   JxY w)Nz.txtzutf-8)encodingzWordlist should contain z words, but it contains z words.)	r   keysopenWORDLIST_DIR	readlinesstriplenWORDLIST_LENr
   )r   fwr   s       O/var/www/br/venv/lib/python3.12/site-packages/eth_account/hdaccount/mnemonic.pyget_wordlistr)   @   s    $))++ **	lz..	A 6Q'({{}5!AGGI556
8}$&|n 5"8}oW6
 	
 #+hO 66 6s   B,
B'!B,'B,,B5c                      e Zd ZdZej
                  fdeeef   fdZe	de
e   fd       Ze	de
e   fd       Zededefd       Zdd	edefd
ZdedefdZdedefdZdedefdZdedefdZeddededefd       Zy)Mnemonica:  
    Creates and validates BIP39 mnemonics.

    .. doctest:: python

        >>> from eth_account.hdaccount import Language, Mnemonic

        >>> # Create a new Mnemonic instance with Czech language
        >>> cz_mnemonic = Mnemonic(Language.CZECH)

        >>> # English is the default language
        >>> en_mnemonic = Mnemonic()

        >>> # List available languages
        >>> available_languages = Mnemonic.list_languages()
        >>> print(available_languages)
        ['chinese_simplified', 'chinese_traditional', 'czech', 'english', 'french', 'italian', 'japanese', 'korean', 'spanish']

        >>> # List available enumerated languages
        >>> available_languages = Mnemonic.list_languages_enum()
        >>> print(available_languages)
        [<Language.CHINESE_SIMPLIFIED: 'chinese_simplified'>, <Language.CHINESE_TRADITIONAL: 'chinese_traditional'>, <Language.CZECH: 'czech'>, <Language.ENGLISH: 'english'>, <Language.FRENCH: 'french'>, <Language.ITALIAN: 'italian'>, <Language.JAPANESE: 'japanese'>, <Language.KOREAN: 'korean'>, <Language.SPANISH: 'spanish'>]

        >>> # Generate a new mnemonic phrase
        >>> mnemonic_phrase = en_mnemonic.generate()
        >>> print(mnemonic_phrase) # doctest: +SKIP
        'cabin raise oven oven knock fantasy flock letter click empty skate volcano'

        >>> # Validate a mnemonic phrase
        >>> is_valid = en_mnemonic.is_mnemonic_valid(mnemonic_phrase)
        >>> print(is_valid)
        True

        >>> # Convert mnemonic phrase to seed
        >>> seed = en_mnemonic.to_seed(mnemonic_phrase, passphrase="optional passphrase")
        >>> print(seed) # doctest: +SKIP
        b'\x97ii\x07\x12\xf0$\x81\x98\xb6?\x07\x08t7\x18d\x87\xe1\x7f\xbe\xbaL\xb4i%\xeb\x12\xce\xe2h\x1c\xb2\x19\x13\xfb9wtoV\x9c\xb8\xdf;5\xba4X\xa3\xd6b`|\xdc\xb1\x10\xb0\xeeS\x86\x95\xd75'
    raw_languagec                 H   t        |t              ret        j                  dt        d       |j                         j                  dd      }t        j                         }||vrt        d| d|       |j                  }|| _        t        | j                        | _        y )NzjThe language parameter should be a Language enum, not a string. This will be enforced in a future version.   )
stacklevel _zInvalid language choice 'z', must be one of )
isinstancestrwarningswarnDeprecationWarninglowerreplacer+   list_languagesr
   valuer   r)   r   )selfr,   r   	languagess       r(   __init__zMnemonic.__init__v   s    lC(MM="	 $))+33C=H //1Iy(%/z9KI;W  $))H $T]]3    r   c                  L    t        d t        j                  d      D              S )zK
        Returns a list of languages available for the seed phrase
        c              3   F   K   | ]  }t        |      j                    y wN)r   stem.0r&   s     r(   	<genexpr>z*Mnemonic.list_languages.<locals>.<genexpr>   s     Hqd1gllHs   !*.txtsortedr!   rglob r>   r(   r9   zMnemonic.list_languages   s     
 HL,>,>w,GHHHr>   c                  L    t        d t        j                  d      D              S )zR
        Returns a list of Language objects available for the seed phrase
        c              3   X   K   | ]"  }t        t        |      j                         $ y wrA   )r   r   rB   rC   s     r(   rE   z/Mnemonic.list_languages_enum.<locals>.<genexpr>   s     RhtAw||,Rs   (*rF   rG   rJ   r>   r(   list_languages_enumzMnemonic.list_languages_enum   s     
 Rl6H6H6QRRRr>   raw_mnemonicc                    t        |      }t        |j                  d            }t        j	                         D ch c]C  }t        |j                   | t        |            j                              t        |      k(  r|E }}t        |      dk  rt        d|       t        |      dk(  r"t        d |D              rt        j                  S t        |      dkD  rt        d|       |\  }t        |      S c c}w )Nr0   r   z#Language not detected for word(s): r.   c              3   $   K   | ]  }d |v  
 yw)chineseNrJ   )rD   langs     r(   rE   z+Mnemonic.detect_language.<locals>.<genexpr>   s      0
"&I0
s   z)Word(s) are valid in multiple languages: )r   setsplitr+   r9   r$   intersectionr   r   r
   allCHINESE_SIMPLIFIED)clsrN   mnemonicwordsrR   matching_languagesr   s          r(   detect_languagezMnemonic.detect_language   s   +L9HNN3'( !//1
5%%c(4.&9&B&BCDE
R 
 
 !"Q&!$G~"VWW
 !"a'C 0
*<0
 -
 ...
 !"Q&!;L>J  )!!7
s   AC=	num_wordsc                     |t         vrt        d| dt                | j                  t        j                  d|z  dz              S )zM
        Generate a new mnemonic with the specified number of words.
        z$Invalid choice for number of words: , should be one of       )VALID_WORD_COUNTSr
   to_mnemonicosurandom)r;   r]   s     r(   generatezMnemonic.generate   sT     --!6ykAT$%'  

1y=A+= >??r>   entropyc                     t        |      }|t        vrt        dt        |       dt               t               j	                  |       t               }|j	                  t        |             j                  |d |dz          t        fdt        t              dz        D              }t         fd|D              } j                  dk(  rdj                  |      }|S d	j                  |      }|S )
NzInvalid data length r_   r`   c              3   L   K   | ]  }t        |d z  |dz   d z           yw)   r   N)r   )rD   ibitss     r(   rE   z'Mnemonic.to_mnemonic.<locals>.<genexpr>   s.      
45F4B!a%2./
s   !$rj   c              3   <   K   | ]  }j                   |     y wrA   )r   )rD   idxr;   s     r(   rE   z'Mnemonic.to_mnemonic.<locals>.<genexpr>   s     <SdmmC(<s   japaneseu   　r0   )r$   VALID_ENTROPY_SIZESr
   r   	frombytesr   extendtupleranger   join)r;   rg   entropy_sizechecksumindicesrZ   phraserl   s   `      @r(   rc   zMnemonic.to_mnemonic   s    7|22!&s7|n4G&') 
 zw:6'?+ 	H0|q012 
9>s4yB9O
 
 <G<<==J&]]5)F  XXe_Fr>   rY   c                     t        |      j                  d      }t        |      }|t        vry	 t	         fd|D              }t               }|D ]  }|j                  t        |d               d|z  dz  }t               }|j                  t        |d|d	z   j                                      |dt        |      |d	z  z
   j                         }	||d	z  d j                         }
t        j                  |
|	      S # t
        $ r Y yw xY w)
z[
        Checks if mnemonic is valid

        :param str mnemonic: Mnemonic string
        r0   Fc              3   T   K   | ]  }j                   j                  |       ! y wrA   )r   index)rD   r'   r;   s     r(   rE   z-Mnemonic.is_mnemonic_valid.<locals>.<genexpr>   s      BqDMM//2Bs   %(rj   )lengthr`   ra   N   )r   rT   r$   rb   rs   
ValueErrorr   rr   r	   rq   r   tobytessecretscompare_digest)r;   rY   rZ   r]   rx   encoded_seedrn   rv   rw   computed_checksumstored_checksums   `          r(   is_mnemonic_validzMnemonic.is_mnemonic_valid   s     )288=J	--	BEBBG  z 	8Cs2 67	8 9}) :6,/A1A"B"J"J"LMN$%Ks<'8<!;K'KLTTV '|a'7'9:BBD %%o7HII)  		s   D   	DDprefixc                     || j                   v r|S | j                   D cg c]  }|j                  |      s| }}t        |      dk(  r|d   S |S c c}w )Nr   r   )r   
startswithr$   )r;   r   wordmatchess       r(   expand_wordzMnemonic.expand_word  sb    T]]"M "&"$//&2I"G " 7|q qz! "s
   AAc                 j    dj                  t        | j                  |j                  d                  S )Nr0   )ru   mapr   rT   )r;   rY   s     r(   expandzMnemonic.expand  s'    xxD,,hnnS.ABCCr>   checked_mnemonic
passphrasec                 V    t        |      }dt        |      z   }t        ||      }|dd S )z
        :param str checked_mnemonic: Must be a correct, fully-expanded BIP39 seed phrase
        :param str passphrase: Encryption passphrase used to secure the mnemonic
        :returns bytes: 64 bytes of raw seed material from PRNG
        rY   N@   )r   r   )rX   r   r   rY   salt	stretcheds         r(   to_seedzMnemonic.to_seed  s;     ,,<= 4Z@@
 'x6	"~r>   N)r   ) )__name__
__module____qualname____doc__r   ENGLISHr   r3   r=   staticmethodr   r9   rM   classmethodr\   intrf   bytesrc   boolr   r   r   r   rJ   r>   r(   r+   r+   N   s"   %N =E<L<L 4U8S=%9 4( IDI I I Sh S S "3 "8 " "B	@# 	@s 	@5 S 6"J# "J$ "JH# # Ds Ds D s  U  r>   r+   )!rd   pathlibr   r   typingr   r   r   r4   r   bitarray.utilr   r	   	eth_utilsr
   eth_account.typesr   _utilsr   r   r   rp   rb   __file__parentr!   r%   dictr   r3   __annotations__r)   r+   rJ   r>   r(   <module>r      s   . 
  
   + ( H~$$z1*.& 4T#Y' 03 49 X Xr>   