from typing import *

# extmod/modtrezorcrypto/modtrezorcrypto-bip32.h
class HDNode:
    '''
    BIP0032 HD node structure.
    '''

    def __init__(self,
                 depth: int,
                 fingerprint: int,
                 child_num: int,
                 chain_code: bytes,
                 private_key: bytes = None,
                 public_key: bytes = None,
                 curve_name: str = None) -> None:
        '''
        '''

    def derive(self, index: int, public: bool=False) -> None:
        '''
        Derive a BIP0032 child node in place.
        '''

    def derive_cardano(self, index: int) -> None:
        '''
        Derive a BIP0032 child node in place using Cardano algorithm.
        '''

    def derive_path(self, path: List[int]) -> None:
        '''
        Go through a list of indexes and iteratively derive a child node in place.
        '''

    def serialize_public(self, version: int) -> str:
        '''
        Serialize the public info from HD node to base58 string.
        '''

    def serialize_private(self, version: int) -> str:
        '''
        Serialize the private info HD node to base58 string.
        '''

    def clone(self) -> HDNode:
        '''
        Returns a copy of the HD node.
        '''

    def depth(self) -> int:
        '''
        Returns a depth of the HD node.
        '''

    def fingerprint(self) -> int:
        '''
        Returns a fingerprint of the HD node (hash of the parent public key).
        '''

    def child_num(self) -> int:
        '''
        Returns a child index of the HD node.
        '''

    def chain_code(self) -> bytes:
        '''
        Returns a chain code of the HD node.
        '''

    def private_key(self) -> bytes:
        '''
        Returns a private key of the HD node.
        '''

    def private_key_ext(self) -> bytes:
        '''
        Returns a private key extension of the HD node.
        '''

    def public_key(self) -> bytes:
        '''
        Returns a public key of the HD node.
        '''

    def address(self, version: int) -> str:
        '''
        Compute a base58-encoded address string from the HD node.
        '''

    def nem_address(self, network: int) -> str:
        '''
        Compute a NEM address string from the HD node.
        '''

    def nem_encrypt(self, transfer_public_key: bytes, iv: bytes, salt: bytes, payload: bytes) -> bytes:
        '''
        Encrypts payload using the transfer's public key
        '''

    def ethereum_pubkeyhash(self) -> bytes:
        '''
        Compute an Ethereum pubkeyhash (aka address) from the HD node.
        '''

    def deserialize(self, value: str, version_public: int, version_private: int) -> HDNode:
        '''
        Construct a BIP0032 HD node from a base58-serialized value.
        '''

    def from_seed(seed: bytes, curve_name: str) -> HDNode:
        '''
        Construct a BIP0032 HD node from a BIP0039 seed value.
        '''

    def from_mnemonic_cardano(mnemonic: str) -> bytes:
        '''
        Convert mnemonic to hdnode
        '''