v0.8 — TRON онлайн-парсинг транзакций
Дата: 2026-05-15 Цель: автоматически тянуть транзакции с трёх TRC20-кошельков, обновлять балансы, видеть всё в UI.
✅ Что сделано
Бэкенд
- Таблица
raw_blockchain_tx+ Alembic-миграция. UNIQUE по(chain, tx_hash, from, to, amount)— событие транзакции уникально. app/jobs/tron_sync.py— парсер TronGrid:- GET
/v1/accounts/{addr}→ TRC20 баланс USDT - GET
/v1/accounts/{addr}/transactions/trc20→ история (пагинация поfingerprint, до 2000 tx за прогон на кошелёк). - Идемпотентный батч-upsert через PostgreSQL
INSERT ... ON CONFLICT DO NOTHING. Первый прогон: 624 новых tx. Второй прогон: 0 (всё уже в БД). - Retry с exponential backoff на HTTP 429 (rate-limit).
- Audit-запись после каждого кошелька.
UI
/wallets— таблица с реальными балансами, счётчиком Tx за 24ч, временем последней транзакции, бейджем «Sync» (зелёный <65 мин / жёлтый <3 ч / красный больше)./wallets/{id}— карточка кошелька:- 4 KPI: on-chain баланс / всего tx / приход / расход.
- Прямая ссылка на TronScan для адреса.
- Список последних 100 транзакций с направлением (↓ IN / ↑ OUT), суммой, контрагентом, ссылкой на конкретный tx hash на TronScan.
Автоматизация
- systemd timer
obmenka-tron-sync.timer:OnBootSec=2min,OnUnitActiveSec=1h,Persistent=true. - Service выполнился вручную при первом запуске (LAST 25 сек назад в моменте релиза), следующий — через ~1 час.
📊 Реальные данные в системе
CryptoDom (TR2V4nd...EEk): балaнс 86 456.31 USDT | 165 tx | оборот ~2.62M USDT
Лиман (TDobDuw...HPz): балaнс 94 067.94 USDT | 341 tx | оборот ~4.57M USDT
Лара (TVfQRY...A2y): балaнс 49 146.04 USDT | 118 tx | оборот ~717k USDT
───────────────────────────────────────────────────────────────
Итого: 229 670.30 USDT на трёх кошельках, 624 транзакции с 2026-05-05
⚠ Что несовершенно (нашёл и исправил во время реализации)
-
Баг с rollback на дубликатах. Первая реализация делала
db.rollback()при IntegrityError per-row — это откатывало ВСЮ открытую транзакцию SQLAlchemy, теряя предыдущие inserts. После первого прогона в БД было только 413 из 624 транзакций. Исправил: перешёл на batch-upsert черезpg_insert(...).on_conflict_do_nothing()— теперь дубли просто пропускаются без отката. -
Rate-limit TronGrid без API-ключа очень строгий. Второй прогон сразу же дал 429. Добавил: - 3 сек паузу между кошельками - 1 сек между balance и transfers одного кошелька - 0.5 сек между страницами пагинации - Retry с exponential backoff (5/10/20/40 сек) на 429 - На часовой интервал этого хватает с большим запасом.
⚠ Известные ограничения (на будущее)
-
Только TRC20 USDT. Если появятся другие токены/сети (ERC20, BEP20, BTC) — нужно расширить
CONTRACT_BY_ASSETи/или добавить ETH-коннектор (Etherscan API). -
Старая история ограничена 2000 tx на кошелёк за прогон (10 страниц × 200). Все три текущих кошелька укладываются. Если объём вырастет — увеличить
MAX_PAGESили добавить инкрементальный sync (использоватьmin_timestampпараметр TronGrid). -
Нет связи raw_blockchain_tx ↔ deals. Все 624 транзакции пока не привязаны к сделкам —
matched_deal_idвсегда NULL. Это задача сверки: матчить блокчейн-tx с операциями сделок поwallet_id + amount + occurred_at ± окно. Сделаем в следующем шаге. -
API без ключа — TronGrid даёт ~5 запросов в секунду анонимно. Для одного-двух прогонов в час этого достаточно. Если будем добавлять кошельки — взять бесплатный ключ на trongrid.io (увеличит лимит до 100к запросов в день).
-
Дашборд пока не использует
raw_blockchain_tx— там KPI всё ещё считаются изdeals. Реальные обороты с блокчейна видны только на странице кошелька. Подключить on-chain объёмы к дашборду — на следующей итерации.
Покрытие ТЗ партнёра после v0.8
| Модуль ТЗ | v0.7 | v0.8 |
|---|---|---|
| M1 учёт сделок | ✅ | ✅ |
| M1 клиенты | ✅ | ✅ |
| M2 касса | ✅ | ✅ |
| M2 прибыль | ручная | ручная |
| (наш E2.5) on-chain ETL | — | ✅ полностью автоматически каждый час |
| M3 парсинг курсов TG | — | — (следующий шаг) |
| M4 автопостинг TG | — | — |
| M5 клиент-бот | — | — |
| M6 карточка-заявка ⭐ | — | — |
Следующие шаги
- Сверка
raw_blockchain_tx ↔ deals— авто-матчинг по wallet/amount/time. На странице сверки покажем непривязанные блокчейн-tx (потенциально незакрытые сделки) и непривязанные сделки (потенциально левак). - M3 — парсинг курсов из TG-каналов (если у тебя есть список каналов и формат сообщений).
- M4 — автопостинг наших курсов в каналы.
- M5 + M6 — клиент-бот и автокарточка-заявка менеджеру.