o
    ¢ØÆh,  ã                   @   sæ   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ƒjd ZdZeƒ Zeeee f ed< dedee fdd„ZG dd„ dƒZ dS )é    N)ÚPath)ÚDictÚListÚUnion)Úbitarray)Úba2intÚint2ba)ÚValidationError)ÚLanguageé   )Úpbkdf2_hmac_sha512Úsha256Úunicode_decompose_string)é   é   é   é   é    )é   é   é   é   r   Úwordlisti   Ú_cached_wordlistsÚlanguageÚreturnc                 C   sŽ   | t  ¡ v r
t |  S tt| › d� dd��}dd„ | ¡ D ƒ}W d   ƒ n1 s)w   Y  t|ƒtkrAtdt› dt|ƒ› d�ƒ‚|t | < |S )	Nz.txtzutf-8)Úencodingc                 S   s   g | ]}|  ¡ ‘qS © )Ústrip©Ú.0Úwr   r   úk/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/eth_account/hdaccount/mnemonic.pyÚ
<listcomp>D   s    z get_wordlist.<locals>.<listcomp>zWordlist should contain z words, but it contains z words.)r   ÚkeysÚopenÚWORDLIST_DIRÚ	readlinesÚlenÚWORDLIST_LENr	   )r   Úfr   r   r   r"   Úget_wordlist@   s   ÿÿÿr+   c                   @   sæ   e Zd ZdZejfdeeef fdd„Ze	de
e fdd„ƒZe	de
e fdd	„ƒZed
edefdd„ƒZd"dedefdd„Zdedefdd„Zdedefdd„Zdedefdd„Zdedefdd„Zed#dededefdd „ƒZd!S )$Ú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                 C   sl   t |tƒr(tjdtdd� | ¡  dd¡}t ¡ }||vr't	d|› d|› �ƒ‚n|j
}|| _t| jƒ| _d S )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   Ú	languagesr   r   r"   Ú__init__v   s    
üÿÿzMnemonic.__init__r   c                   C   ó   t dd„ t d¡D ƒƒS )zK
        Returns a list of languages available for the seed phrase
        c                 s   s   � | ]}t |ƒjV  qd S ©N)r   Ústem©r    r*   r   r   r"   Ú	<genexpr>�   ó   € z*Mnemonic.list_languages.<locals>.<genexpr>ú*.txt©Úsortedr&   Úrglobr   r   r   r"   r9   Š   ó   zMnemonic.list_languagesc                   C   r>   )zR
        Returns a list of Language objects available for the seed phrase
        c                 s   s   � | ]
}t t|ƒjƒV  qd S r?   )r
   r   r@   rA   r   r   r"   rB   –   s   € z/Mnemonic.list_languages_enum.<locals>.<genexpr>rD   rE   r   r   r   r"   Úlist_languages_enum‘   rH   zMnemonic.list_languages_enumÚraw_mnemonicc                    s”   t |ƒ}t| d¡ƒ‰‡ ‡fdd„t ¡ D ƒ}t|ƒdk r$td|› �ƒ‚t|ƒdkr6tdd„ |D ƒƒr6tj	S t|ƒdkrCtd	|› �ƒ‚|\}t|ƒS )
Nr0   c                    s0   h | ]}t ˆ ˆ t|ƒƒj¡ƒt ˆƒkr|’qS r   )r(   Úintersectionr
   r   ©r    Úlang©ÚclsÚwordsr   r"   Ú	<setcomp>�   s
     þz+Mnemonic.detect_language.<locals>.<setcomp>r   z#Language not detected for word(s): r.   c                 s   s   � | ]}d |v V  qdS )ÚchineseNr   rL   r   r   r"   rB   ª   s   € 
ÿz+Mnemonic.detect_language.<locals>.<genexpr>z)Word(s) are valid in multiple languages: )
r   ÚsetÚsplitr,   r9   r(   r	   Úallr
   ÚCHINESE_SIMPLIFIED)rO   rJ   ÚmnemonicÚmatching_languagesr   r   rN   r"   Údetect_language˜   s"   þÿÿzMnemonic.detect_languager   Ú	num_wordsc                 C   s4   |t vrtd|› dt › �ƒ‚|  t d| d ¡¡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;   rZ   r   r   r"   Úgenerateº   s   ÿÿzMnemonic.generateÚentropyc                    sÀ   t |ƒ}|tvrtdt |ƒ› dt› �ƒ‚tƒ ‰ ˆ  |¡ tƒ }| t|ƒ¡ ˆ  |d |d … ¡ t‡ fdd„tt ˆ ƒd ƒD ƒƒ}t‡fdd„|D ƒƒ}ˆj	dkrYd	 
|¡}|S d
 
|¡}|S )NzInvalid data length r[   r\   c                 3   s,   � | ]}t ˆ |d  |d d  … ƒV  qdS )é   r   N)r   )r    Úi)Úbitsr   r"   rB   Õ   s   € 
ÿz'Mnemonic.to_mnemonic.<locals>.<genexpr>rd   c                 3   s   � | ]}ˆ j | V  qd S r?   )r   )r    Úidx©r;   r   r"   rB   Ø   rC   Újapaneseu   ã€€r0   )r(   ÚVALID_ENTROPY_SIZESr	   r   Ú	frombytesr   ÚextendÚtupleÚranger   Újoin)r;   rc   Úentropy_sizeÚchecksumÚindicesrP   Úphraser   )rf   r;   r"   r_   Å   s*   ÿÿ
ÿ


ÿzMnemonic.to_mnemonicrW   c                    sà   t |ƒ d¡}t|ƒ}|tvrdS zt‡ fdd„|D ƒƒ}W n
 ty(   Y dS w tƒ }|D ]}| t|dd�¡ q.d| d }tƒ }| 	t
|d	|d
 …  ¡ ƒ¡ |d	t|ƒ|d
  …  ¡ }	||d
 d	…  ¡ }
t |
|	¡S )z[
        Checks if mnemonic is valid

        :param str mnemonic: Mnemonic string
        r0   Fc                 3   s   � | ]	}ˆ j  |¡V  qd S r?   )r   Úindexr   rh   r   r"   rB   í   s   € z-Mnemonic.is_mnemonic_valid.<locals>.<genexpr>rd   )Úlengthr\   r]   Né   )r   rT   r(   r^   rm   Ú
ValueErrorr   rl   r   rk   r   ÚtobytesÚsecretsÚcompare_digest)r;   rW   rP   rZ   rr   Úencoded_seedrg   rp   rq   Úcomputed_checksumÚstored_checksumr   rh   r"   Úis_mnemonic_validà   s$   ÿzMnemonic.is_mnemonic_validÚprefixc                    s:   ˆ | j v rˆ S ‡ fdd„| j D ƒ}t|ƒdkr|d S ˆ S )Nc                    s   g | ]	}|  ˆ ¡r|‘qS r   )Ú
startswith)r    Úword©r   r   r"   r#     s
    
ÿÿz(Mnemonic.expand_word.<locals>.<listcomp>r   r   )r   r(   )r;   r   Úmatchesr   r‚   r"   Úexpand_word  s   

ÿzMnemonic.expand_wordc                 C   s   d  t| j| d¡ƒ¡S )Nr0   )ro   Úmapr„   rT   )r;   rW   r   r   r"   Úexpand  s   zMnemonic.expandÚ Úchecked_mnemonicÚ
passphrasec                 C   s*   t |ƒ}dt |ƒ }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
        rW   Né@   )r   r   )rO   rˆ   r‰   rW   ÚsaltÚ	stretchedr   r   r"   Úto_seed  s   
zMnemonic.to_seedN)r   )r‡   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   ÚENGLISHr   r3   r=   Ústaticmethodr   r9   rI   ÚclassmethodrY   Úintrb   Úbytesr_   Úboolr~   r„   r†   r�   r   r   r   r"   r,   N   s     '!$r,   )!r`   Úpathlibr   ry   Útypingr   r   r   r4   r   Úbitarray.utilr   r   Ú	eth_utilsr	   Úeth_account.typesr
   Ú_utilsr   r   r   rj   r^   Ú__file__Úparentr&   r)   Údictr   r3   Ú__annotations__r+   r,   r   r   r   r"   Ú<module>   s"   
