Личный Telegram-бот для дешёвых переводов USDT TRC-20 через сервис аренды энергии. Бот — надстройка для удобства над сторонним сервисом @TRXerer: проверяет получателя, считает тариф, собирает ссылки для TronLink, следит за приходом энергии и вовремя напоминает пополнить TRX.
Бот работает только с публичными данными: никаких приватных ключей и сид-фраз в проекте нет. Все подтверждения переводов — в кошельке TronLink.
Пришли боту адрес получателя и сумму USDT через пробел:
TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX 25
Дальше бот сам:
- Проверит получателя: баланс USDT, активацию, нужный тариф аренды.
- Проверит твой кошелёк: хватает ли USDT на перевод и TRX на оплату аренды.
- Шаг 1 из 2 — пришлёт оплату аренды (1.5 или 3 TRX на адрес сервиса) с кнопками.
- Дождётся, когда энергия придёт на твой кошелёк (обычно секунды,
следит до 3 минут;
/cancel— отменить). - Шаг 2 из 2 — пришлёт сам перевод USDT с кнопками.
Сумму можно не писать — тогда бот спросит её отдельным вопросом. На вопрос можно не отвечать: если ты просто проверял адрес или делаешь перевод вручную, ничего не сломается. Аренда энергии при этом всё равно предлагается — «только адрес» подходит и для сценария «куплю энергию, а перевод сделаю сам».
| Кнопка | Что делает |
|---|---|
| Открыть ссылку | основной путь: страница-мостик мгновенно передаёт готовый перевод в TronLink (на телефоне — в приложение, на компьютере — в расширение) |
| QR ссылки | та же ссылка картинкой — сканируй камерой телефона (удобно, когда Telegram на компьютере, а подтверждать хочешь с телефона) |
| QR приложения | аварийный вариант: QR с чистым адресом для сканера внутри TronLink; сумму вводишь руками |
Рядом с кнопками всегда есть адрес и сумма моноширинным текстом — копируются тапом, если хочется совсем вручную.
| Ситуация у получателя | Энергия | Цена |
|---|---|---|
| USDT уже есть на балансе | 65 000 | 1.5 TRX |
| USDT нет или аккаунт не активирован | 131 000 | 3 TRX |
Если баланс получателя ненулевой, но меньше 1 USDT — бот предупредит: баланс могут обнулить, и к моменту перевода может понадобиться двойной тариф.
TRX нужны на оплату аренды. Когда запас тает (порог — TRX_LOW_BALANCE_WARN
в .env), бот отдельным сообщением предупредит и предложит кнопку
«Обменять USDT → TRX». Предупреждение показывается только рядом с шагом
аренды — там, где TRX нужны; возле шага перевода лишних денежных кнопок нет,
чтобы не перепутать перевод с обменом. Кнопка «Обменять»: спросит сумму и оформит обмен как обычный
перевод по полной двухшаговой схеме (аренда энергии → перевод USDT на
адрес обмена) — ведь перевод на обмен тоже требует энергию, без неё сеть
сожгла бы ~13+ TRX комиссии. TRX вернутся автоматически. Если TRX не
хватает уже на текущую аренду — предупреждение станет жёстким (
Перед выдачей ссылки на перевод бот также сверяет твой баланс USDT: неудачный перевод откатился бы и сжёг арендованную энергию впустую.
/start— инструкция;/wallet— задать или сменить свой кошелёк (диалогом; нужно один раз);/config— тарифы, адреса, твой кошелёк;/cancel— отменить всё, что бот сейчас ждёт (настройку кошелька, вопрос про сумму, обмен, ожидание энергии);/help— список команд.
- Человек пишет боту → получает отказ со своим Telegram ID («сообщите его разработчику»).
- Ты добавляешь ID в
ALLOWED_USER_IDS(локальный.env→bash deploy.sh; список также перечитывается на лету раз в минуту). - Бот сам пишет новичку «тебя добавили», присылает список команд и просит адрес его кошелька.
- Человек присылает адрес — готов к работе. Кошельки хранятся в
wallets.jsonна сервере, у каждого пользователя свой.
- Проверка получателя: TronGrid (
getaccount— активация,triggerconstantcontract → balanceOf— баланс USDT официального контрактаTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t); при недоступности — фолбэк на Tronscan. Адреса валидируются локально (base58check) без сети. - Ожидание энергии: опрос
getaccountresourceтвоего кошелька каждые 2 с, до 3 минут. Уведомления шлются с повторами (5 попыток) — секундный сбой сети не теряет готовое сообщение. Ожидание всегда одно на пользователя: сервис аренды не суммирует энергию (одна аренда за раз), поэтому новый запрос явно отменяет прежнее ожидание — бот сообщает об этом и предупреждает не оплачивать аренду повторно. - Мостик (
bridge/index.html, захощен на Cloudflare) — статическая страница-трамплин. Прямой deeplink TronLinkaction=transferработает только для dApp из whitelist самого TronLink (иначе «cannot be called up»), поэтому используетсяaction=open: страница открывается во встроенном браузере TronLink и передаёт перевод через стандартный dApp-API (window.tronLink). На компьютере тот же API даёт расширение TronLink. Страница проверяет, что в кошельке выбран адрес, заданный через/wallet, ничего не подписывает и не отправляет данные — подтверждение всегда в кошельке. - Движок бота: aiogram v3. Сетевые сбои переживаются молча: ретраи старта, повторы уведомлений, компактный лог вместо трейсбеков.
| Переменная | Что это |
|---|---|
TELEGRAM_BOT_TOKEN |
токен бота от @BotFather (обязательно) |
ALLOWED_USER_IDS |
whitelist: Telegram ID через запятую; правки подхватываются за минуту без перезапуска |
ENERGY_SERVICE_PAYMENT_ADDRESS |
платёжный адрес сервиса аренды (куда уходят 1.5/3 TRX) |
EXCHANGE_PAYMENT_ADDRESS |
адрес автообмена USDT → TRX того же сервиса (опционально) |
TRX_LOW_BALANCE_WARN |
порог предупреждения «запас TRX тает» (по умолчанию 30) |
BRIDGE_BASE_URL |
адрес захощенной страницы-мостика |
TRONGRID_API_KEY |
опционально, поднимает лимиты TronGrid |
DEPLOY_HOST, DEPLOY_KEY |
для deploy.sh: IP сервера и путь к ssh-ключу (бот их не читает) |
Кошельки пользователей в .env не хранятся — каждый задаёт свой через
/wallet, бот пишет их в wallets.json.
Где брать актуальные адреса сервиса: группа Telegram @TRXerer (там посты с адресами аренды и обмена, курсом и тарифами), бот сервиса @TrxBaoBaobot, поддержка @erjie8. Автосинхронизации нет намеренно: адреса, по которым ходят деньги, обновляются только руками (автопроверку сделать нельзя: это группа, а не канал — веб-превью у неё нет, а посты в ней публикует их бот, которого чужие боты не видят). Если сервис сменит адрес аренды — оплата на старый просто не принесёт энергию, вотчер скажет «не дождался», и это сигнал свериться с группой.
Статическая страница bridge/index.html на любом https-хостинге.
Проще всего Cloudflare: dash.cloudflare.com → Workers & Pages → Create →
«Upload assets» → перетащить папку bridge/ → адрес вида
https://имя.workers.dev вписать в BRIDGE_BASE_URL.
Обновление страницы: страница проекта → Deployments → новая заливка той же
папки (адрес не меняется). Без мостика бот тоже работает: адреса и суммы
копируются текстом, QR приложения — для сканера TronLink.
Двойной клик по run.bat: сам создаст venv, поставит зависимости, создаст
.env из шаблона при первом запуске. Не запускай локального бота, пока
работает серверный — два бота на одном токене дерутся за сообщения
(409 Conflict). Для отладки: останови сервис на сервере, работай локально,
потом задеплой и запусти сервис обратно.
Бот живёт на сервере в /root/tron-bot под systemd-сервисом tron-bot
(автозапуск после ребута, авторестарт при падении). Нужен Python 3.10+
и пакет python3-venv. Юнит — по образцу:
[Unit]
Description=tron energy rental Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/tron-bot
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONUTF8=1
ExecStart=/root/tron-bot/.venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetДозаливка — с ноута, из Git Bash:
bash deploy.shСкрипт пакует код и .env, копирует на сервер, обновляет зависимости и
перезапускает сервис. Правило «один писатель — один файл», чтобы не было
рассинхрона:
| Файл | Кто пишет | Источник истины |
|---|---|---|
код (*.py, bridge/) |
разработчик | локально |
.env |
владелец, только локально | локально (deploy перевозит) |
wallets.json, users.json |
только бот | сервер (deploy не трогает) |
Если серверный .env правили напрямую, deploy остановится и покажет
разницу (снимок последнего деплоя — .env.deployed); осознанно затереть:
FORCE_ENV=1 bash deploy.sh.
Логи:
ssh -i ~/.ssh/<ключ> root@<сервер> 'journalctl -u tron-bot -f'Плюс bot.log рядом с ботом (ротация 1 МБ × 3). Сетевые сбои Telegram —
одна строка WARNING, это норма.
bot.py— Telegram-слой: обработчики, диалоги, кнопки, вотчер энергии, приветствия, фоновая перечитка whitelist;tron.py— валидация адресов, TronGrid/Tronscan, балансы и энергия;deeplink.py— сборка deeplink-ссылок TronLink и ссылок на мостик;bridge/index.html— страница-мостик (самодостаточная, без зависимостей);config.py— инженерные константы (контракт USDT, тарифы, таймауты) и чтение.env;wallets.py,users.py— json-хранилища кошельков и памяти о пользователях;pluralize.py— склонение русских слов при числительных (1 перевод / 2 перевода / 7 переводов);deploy.sh— дозаливка на сервер (адрес сервера и ключ берёт из.env:DEPLOY_HOST,DEPLOY_KEY);run.bat/run.sh— локальный запуск;.env— настройки эксплуатации (не в git),.env.example— шаблон.