Розробка Telegram-бота мониторинга портфеля
Стандартна проблема: у людини активи на кількох мережах, у кількох протоколах, і щоб розуміти поточну картину—потрібно зайти в 5 різних інтерфейсів. Telegram-бот з командами /portfolio та алертами при русі ціни або при ризику liquidation—це зручніше будь-якого мобільного дашборду.
Що відстежувати та звідки брати дані
Ботів мониторинга портфеля можна поділити за складністю:
Базовий (balances токенів)—балансі токенів на вказаних адресах. Джерела даних:
- Moralis Web3 API / Alchemy Token API—балансі всіх ERC-20 за один запит
- CoinGecko / CoinMarketCap API—поточні ціни для розрахунку USD вартості
Розширений (DeFi позиції)—враховуємо 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—за запитом, вимагають окремих адаптерів.







