U
    2ÄcB  ã                   @   s¢   d dl Z d dlZd dlZd dlmZ d dlmZ dZdZdZ	eZ
dZdZd	d
gZdd	„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedfdd
„ZdS )é    N)Úb58encode_check)Ú	SECP256k1i   Úmnemonicl        s   Bitcoin seedzm/44'/60'/0'/0Úmnemonic_to_bip39seedÚmnemonic_to_private_keyc                 C   s(   t | dƒ} t t| dƒ}t d| |t¡S )zg BIP39 seed from a mnemonic key.
        Logic adapted from https://github.com/trezor/python-mnemonic. Úutf8Úsha512)ÚbytesÚBIP39_SALT_MODIFIERÚhashlibZpbkdf2_hmacÚBIP39_PBKDF2_ROUNDS)r   Ú
passphraseZsalt© r   úX/var/www/html/NKSPORTS/school/venv/lib/python3.8/site-packages/autobahn/xbr/_mnemonic.pyr   2   s    
c                 C   s6   t  t| tj¡ ¡ }|dd… |dd…  }}||fS )z— BIP32 master node derivation from a bip39 seed.
        Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. Né    )ÚhmacÚnewÚBIP32_SEED_MODIFIERr   r   Údigest)ÚseedÚhÚkeyÚ
chain_coder   r   r   Úbip39seed_to_bip32masternode:   s    r   c                 C   sP   t j| dd�tj }t | ¡ ƒjddd�}| ¡ d@ }t d| ƒjddd�| S )z† Public key from a private key.
        Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. Úbig©Ú	byteorderr   é   é   )ÚintÚ
from_bytesÚBIP32_CURVEÚ	generatorÚxÚto_bytesÚy)Úprivate_keyÚQZxstrZparityr   r   r   Úderive_public_keyB   s    r(   c           
      C   sö   t | ƒdkst‚t |ƒdks t‚|}|t@ dkr:d|  }nt| ƒ}|t d|¡ }t ||tj	¡ 
¡ }|dd… |dd…  }}tj|dd�}tj| dd�}	||	 tj }|tjk rÐ|dkrÐt|ƒjddd�}qîd|dd…  t d|¡ }qR||fS )	z´ Derives a child key from an existing key, i is current derivation parameter.
        Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. r   r   ó    z>LNr   r   ó   )ÚlenÚAssertionErrorÚBIP32_PRIVDEVr(   ÚstructÚpackr   r   r   r   r   r   r    r!   Úorderr$   )
Z
parent_keyZparent_chain_codeÚiÚkr   Údr   r   ÚaÚbr   r   r   Úderive_bip32childkeyL   s"    
r6   c                 C   s"   t  dt  | ¡ ¡ ¡ ¡ dd… S )z< BIP32 fingerprint formula, used to get b58 serialized key. Z	ripemd160Né   )r   r   Zsha256r   )Ú
public_keyr   r   r   Úfingerprintf   s    r9   c                 C   s<   dt t|ƒdƒ |  t|ƒjddd� | d | }t|ƒS )z' Private key b58 serialization format. s   ˆ­äúutf-8r7   r   r   r)   ©r	   Úchrr   r$   r   )Úparent_fingerprintr&   ÚchainÚdepthÚchildnrÚrawr   r   r   Úb58xprvl   s     ÿÿÿÿrB   c                 C   s8   dt t|ƒdƒ |  t|ƒjddd� | | }t|ƒS )z& Public key b58 serialization format. s   ˆ²r:   r7   r   r   r;   )r=   r8   r>   r?   r@   rA   r   r   r   Úb58xpubu   s     ÿÿÿrC   c                 C   sh   g }| dd… dkrt dƒ‚|  d¡ d¡D ]6}d|krT| tt|dd… ƒ ¡ q,| t|ƒ¡ q,|S )	zq Parses a derivation path such as "m/44'/60/0'/0" and returns
        list of integers for each element in path. r   r   zm/zECan't recognize derivation path. It should look like "m/44'/60/0'/0".ú/ú'Néÿÿÿÿ)Ú
ValueErrorÚlstripÚsplitÚappendr-   r   )Ústr_derivation_pathÚpathr1   r   r   r   Úparse_derivation_path~   s    rM   Ú c           
      C   sF   t |ƒ}t| |ƒ}t|ƒ\}}|| }}|D ]}	t|||	ƒ\}}q,|S )aÙ   Performs all convertions to get a private key from a mnemonic sentence, including:

            BIP39 mnemonic to seed
            BIP32 seed to master key
            BIP32 child derivation of a path provided

        Parameters:
            mnemonic -- seed wordlist, usually with 24 words, that is used for ledger wallet backup
            str_derivation_path -- string that directs BIP32 key derivation, defaults to path
                used by ledger ETH wallet

    )rM   r   r   r6   )
r   rK   r   Zderivation_pathZ	bip39seedZmaster_private_keyZmaster_chain_coder&   r   r1   r   r   r   r   Ž   s    

)r   r   r.   Zbase58r   Zecdsa.curvesr   r   r
   r-   r!   r   ZLEDGER_ETH_DERIVATION_PATHÚ__all__r   r   r(   r6   r9   rB   rC   rM   r   r   r   r   r   Ú<module>   s,   þ
		