import base58
import requests
from solders.keypair import Keypair
from concurrent.futures import ThreadPoolExecutor
from threading import Lock

# Переменные для настройки
telegram_bot_token = "<TRUFFLEHOG_REDACTED_TELEGRAMBOTTOKEN>"  # Токен вашего бота
telegram_chat_id = "-1002497172182"  # ID чата, куда будут отправляться уведомления

# Переменные для счетчика
wallet_counter = 0
counter_lock = Lock()

def send_telegram_notification(public_key, private_key):
    message = f"Found Wallet - PublicKey: {public_key} PrivateKey: {private_key}"
    requests.get(f"https://api.telegram.org/bot{telegram_bot_token}/sendMessage?chat_id={telegram_chat_id}&text={message}")

def check_wallet(search_terms, search_positions, valid_combinations):
    global wallet_counter
    local_count = 0

    while True:  # Бесконечный цикл
        # Создание новой пары ключей
        keypair = Keypair()

        # Получаем публичный ключ
        public_key = str(keypair.pubkey())  # Преобразуем Pubkey в строку

        # Кодируем приватный ключ в base58
        private_key = base58.b58encode(bytes(keypair)).decode("utf-8")

        # Преобразуем публичный ключ в нижний регистр
        public_key_lower = public_key.lower()

        for search_term, search_position in zip(search_terms, search_positions):
            search_term_lower = search_term.lower()  # Преобразуем строку поиска в нижний регистр
            match = False

            if search_position == "beginning" and public_key_lower.startswith(search_term_lower):
                match = True
            elif search_position == "end" and public_key_lower.endswith(search_term_lower):
                match = True
            elif search_position == "anywhere" and search_term_lower in public_key_lower:
                match = True

            if match:  # Если искомое слово найдено
                print(f"Found Wallet - PublicKey: {public_key} PrivateKey: {private_key}")
                send_telegram_notification(public_key, private_key)
                return  # Прекращаем выполнение потока, если кошелек найден

        # Проверяем допустимые комбинации для начала и конца
        for start_term, end_term in valid_combinations:
            if public_key_lower.startswith(start_term) and public_key_lower.endswith(end_term):
                print(f"Found Wallet with specific start and end - PublicKey: {public_key} PrivateKey: {private_key}")
                send_telegram_notification(public_key, private_key)
                return  # Прекращаем выполнение потока, если кошелек найден

        # Увеличиваем счетчик созданных кошельков
        with counter_lock:
            wallet_counter += 1
            local_count += 1
            if wallet_counter % 1_000_000 == 0:
                print(f"Created {wallet_counter} wallets.")

def create_wallets_in_threads(search_terms, search_positions, valid_combinations, num_threads=24):
    with ThreadPoolExecutor(max_workers=num_threads) as executor:
        futures = [executor.submit(check_wallet, search_terms, search_positions, valid_combinations) for _ in range(num_threads)]
        # Ожидаем завершения потоков
        for future in futures:
            future.result()

# Задайте параметры здесь (основные термины для поиска)
search_terms = ["sol1111", "Elonmusk"]  # Задайте список строк для поиска
search_positions = ["beginning", "beginning"]  # Позиции для поиска

# Допустимые комбинации для начала и конца
valid_combinations = [("sol111", "pump")]  # Допустимые пары

# Вызов функции с заданными параметрами
create_wallets_in_threads(search_terms, search_positions, valid_combinations)

print("Wallet search completed.")

добавь время на против уведомления о кол-во кошельков за которое он сгенерировал 1 миллион