o
    èó·iB  ã                   @   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Úsha512N)ÚbytesÚBIP39_SALT_MODIFIERÚhashlibÚpbkdf2_hmacÚBIP39_PBKDF2_ROUNDS)r   Ú
passphraseZsalt© r   ú\C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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   é   é   N)Ú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J ‚t |ƒdksJ ‚|}|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 rm|dkrmt
|ƒjddd�}	 ||fS d	|dd…  t d|¡ }q*)
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>LTNr   r   ó   )ÚlenÚ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   Úsha256r   )Ú
public_keyr   r   r   Úfingerprintf   s   "r:   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*   N©r	   Úchrr    r%   r   )Úparent_fingerprintr'   ÚchainÚdepthÚchildnrÚrawr   r   r   Úb58xprvl   s   ÿÿÿÿrC   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   Nr<   )r>   r9   r?   r@   rA   rB   r   r   r   Úb58xpubu   s   ÿÿÿrD   c                 C   sh   g }| dd… dkrt dƒ‚|  d¡ d¡D ]}d|v r*| 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   rN   Ú 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

    N)rN   r   r   r6   )
r   rL   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   r:   rC   rD   rN   r   r   r   r   r   Ú<module>   s.   þ
		