import base58
import hashlib
import binascii
from bitcoinaddress import Wallet

def decode_wif_private_key(wif_key):
    """
    Декодирует WIF-формат приватного ключа в HEX
    """
    try:
        # Декодируем base58
        decoded = base58.b58decode(wif_key)
        
        # Проверяем версию байт (mainnet: 0x80, testnet: 0xEF)
        version_byte = decoded[0]
        
        # Для форматов, начинающихся с K, L (сжатые)
        if version_byte == 0x80 and len(decoded) == 37:
            # Проверяем checksum
            payload = decoded[:-4]
            checksum = decoded[-4:]
            computed_checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
            
            if checksum == computed_checksum:
                # Убираем версионный байт и checksum, получаем 32 байта приватного ключа
                private_key_bytes = decoded[1:33]
                return private_key_bytes.hex()
        
        # Для форматов, начинающихся с 5 (несжатые)
        elif version_byte == 0x80 and len(decoded) == 38:
            # Проверяем checksum
            payload = decoded[:-4]
            checksum = decoded[-4:]
            computed_checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
            
            if checksum == computed_checksum:
                # Убираем версионный байт и checksum, получаем 32 байта приватного ключа
                private_key_bytes = decoded[1:33]
                return private_key_bytes.hex()
    
    except Exception as e:
        pass
    
    return None

def is_hex_string(s):
    """
    Проверяет, является ли строка валидным HEX-числом
    """
    try:
        int(s, 16)
        return True
    except ValueError:
        return False

def is_wif_private_key(s):
    """
    Проверяет, является ли строка WIF приватным ключом
    """
    if len(s) in [51, 52] and s[0] in ['5', 'K', 'L']:
        return True
    return False

def process_private_input(user_input):
    """
    Обрабатывает ввод пользователя и возвращает HEX приватного ключа
    """
    # Если это HEX
    if is_hex_string(user_input):
        return user_input.zfill(64)
    
    # Если это WIF формат
    elif is_wif_private_key(user_input):
        hex_key = decode_wif_private_key(user_input)
        if hex_key:
            return hex_key.zfill(64)
        else:
            raise ValueError("Неверный WIF формат приватного ключа")
    
    else:
        raise ValueError("Неверный формат. Введите HEX (64 символа) или WIF (начинается с 5,K,L)")

# Пример использования
while True:
    private_input = input('Введите HEX или WIF приватный ключ: ').strip()
    
    try:
        private_key_hex = process_private_input(private_input)
        wallet = Wallet(private_key_hex)
        print(wallet)
        print("-" * 50)
        
    except Exception as e:
        print(f"Ошибка: {e}")
        print("Пожалуйста, введите корректный HEX или WIF приватный ключ")
        print("-" * 50)