Разработка Telegram-бота мониторинга портфеля
Стандартная проблема: у человека активы на нескольких сетях, в нескольких протоколах, и чтобы понять текущую картину — нужно зайти в 5 разных интерфейсов. Telegram-бот с командами /portfolio и алертами при движении цены или при liquidation risk — это удобнее любого дашборда для мобильного пользования.
Что отслеживать и откуда брать данные
Ботов мониторинга портфеля можно разделить по сложности:
Базовый (token balances) — балансы токенов на указанных адресах. Источники данных:
- Moralis Web3 API / Alchemy Token API — балансы по всем ERC-20 за один запрос
- CoinGecko / CoinMarketCap API — текущие цены для расчёта USD стоимости
Расширенный (DeFi positions) — учитываем LP позиции в Uniswap, collateral/debt в Aave/Compound, staking. Здесь нужны либо протокол-специфичные вызовы, либо агрегаторы:
- DeBank API — агрегирует позиции по 100+ протоколам, но платный для серьёзных объёмов
- Zerion API — аналогично, лучший coverage для EVM сетей
- Прямые вызовы к контрактам Aave (
getUserAccountData), Uniswap V3 (positions)
Алерты: основные сценарии
Price alert: токен X упал/вырос на Y%
Liquidation: health factor в Aave < 1.2
Large tx: входящая/исходящая транзакция > $N
Whale movement: кошелёк из watchlist совершил транзакцию
New token: на кошелёк поступил неизвестный токен
Для price alerts — не поллите API каждую минуту. Подпишитесь на WebSocket стрим с биржи (Binance, Bybit имеют бесплатные WebSocket feeds) или используйте Chainlink price feed события.
Для on-chain событий — Alchemy/QuickNode webhooks на адреса пользователей надёжнее самостоятельного поллинга.
Архитектура бота
Telegram Bot API (polling или webhook)
↓
Bot handler (Python/aiogram или Node.js/grammY)
↓
Portfolio aggregator service
├── Price service (CoinGecko/биржа WebSocket)
├── Balance fetcher (Moralis/Alchemy)
└── DeFi positions (DeBank/прямые вызовы)
↓
Database (PostgreSQL / Redis)
├── user wallets
├── alert configs
└── cached portfolio snapshots
↓
Alert scheduler (cron / event-driven)
Redis используется для кэша цен и балансов — не нужно ходить в API при каждом /portfolio запросе. TTL кэша: цены 30 секунд, балансы 2–5 минут.
Реализация базовых команд
@router.message(Command("portfolio"))
async def portfolio_command(message: Message):
user = await get_user(message.from_user.id)
if not user.wallets:
await message.answer("Добавьте кошелёк: /addwallet 0x...")
return
portfolio = await aggregator.get_portfolio(user.wallets)
text = format_portfolio(portfolio) # форматирование с эмодзи и таблицей
await message.answer(text, parse_mode="HTML")
Для multi-chain пользователей — параллельные запросы через asyncio.gather, иначе время ответа будет неприемлемым.
Безопасность: что важно
Пользователь передаёт публичные адреса — никаких приватных ключей. Это нужно явно обозначать в onboarding. Храните адреса в БД, никогда не просите seed phrase или private key — и добавьте сообщение предупреждения если пользователь пытается отправить нечто похожее на private key.
Rate limiting на команды — Telegram имеет лимит на отправку сообщений (30/сек на бота, 1/сек на пользователя), при превышении бот получит 429 Too Many Requests.
Что делается за 2–3 дня
Telegram бот с командами добавления/удаления кошельков, команда /portfolio с агрегацией балансов и USD стоимостью, price alerts по заданным порогам, настройка хостинга (Railway, Fly.io или ваш VPS), подключение к выбранным API для данных. Поддержка сетей — Ethereum + любые EVM-совместимые, Bitcoin/Solana — по запросу, требуют отдельных адаптеров.







