Steam Trade Integration
Интеграция Steam торговых офферов для вывода скинов пользователями.
1. Summary
Goal: Автоматическая отправка Steam трейд-офферов при выводе скинов пользователями.
User Value:
- Пользователи могут вывести выигранные скины на свой Steam аккаунт
- Автоматическая обработка — без ручного вмешательства администраторов
- Защита от дублирования через idempotency checks
2. Business Logic
Trade Flow
1. Withdrawal Request
- Пользователь выбирает скин из инвентаря
- Указывает Steam Trade URL
- Система проверяет наличие скина в боте
2. Trade Offer Creation
- Бот создаёт трейд-оффер с выбранным скином
- Сохраняет
tradeOfferIdвWithdrawalзапись - Логирует операцию для аудита
3. Trade Confirmation
- Бот автоматически подтверждает оффер через mobile authenticator
- Steam отправляет уведомление пользователю
- Пользователь принимает трейд в Steam клиенте
4. Status Tracking
- Система отслеживает статус оффера
- Обновляет
Withdrawal.statusпри изменениях - Уведомляет пользователя о завершении
Каждый withdrawal имеет уникальный ID. Повторные запросы для того же withdrawal не создают новый трейд-оффер.
Edge Cases
| Ситуация | Поведение | Код |
|---|---|---|
| ❌ Bot offline | Error 503 | BOT_OFFLINE |
| ❌ Invalid Trade URL | Error 400 | INVALID_TRADE_URL |
| ❌ Item not in bot inventory | Error 404 | ITEM_NOT_FOUND |
| ⏱️ Trade offer expired | Update status to EXPIRED | — |
| ✅ Trade accepted | Update status to COMPLETED | — |
3. ADR (Architectural Decisions)
Steam Library Choice
Problem: Нужна библиотека для управления Steam трейдами.
Decision: Используем steam-tradeoffer-manager от DoctorMcKay.
Rationale:
- ✅ Официальная библиотека от создателя Steam Node.js экосистемы
- ✅ Активно поддерживается (последнее обновление: август 2025)
- ✅ Широко используется в community
- ✅ Полная документация и примеры
Alternatives (rejected):
- Custom implementation — слишком сложно (Steam API недокументирован)
- Другие библиотеки — unmaintained или incomplete
Security Vulnerabilities (Accepted Risk)
Problem: Transitive dependencies содержат уязвимости через request@2.88.2.
Decision: Accept as calculated risk with mitigation controls.
See: ADR 004: Steam Trade Library Security
Mitigation:
- Docker container isolation
- No direct user input to trade manager
- Weekly vulnerability monitoring
4. Architecture
Services Overview
Key Components
| Компонент | Путь | Описание |
|---|---|---|
| SteamBotService | backend/src/domains/steam-trade-bot/services/steam-bot.service.ts | Управление Steam клиентом, логин, сессии |
| TradeManagerService | backend/src/domains/steam-trade-bot/services/trade-manager.service.ts | Создание и управление трейд-офферами |
| TradeStatusTrackerService | backend/src/domains/steam-trade-bot/services/trade-status-tracker.service.ts | Отслеживание статуса офферов |
| BotInventoryCacheService | backend/src/domains/steam-trade-bot/services/bot-inventory-cache.service.ts | Кэширование инвентаря бота |
| IncomingTradeService | backend/src/domains/steam-trade-bot/services/incoming-trade.service.ts | Обработка входящих трейдов |
5. Database Schema
Models
| Модель | Описание | Ключевые поля |
|---|---|---|
| Withdrawal | История выводов скинов | tradeOfferId, status, itemId |
Withdrawal Status Flow
6. API Endpoints
Admin API
| Метод | Эндпоинт | Описание | Docs |
|---|---|---|---|
| GET | /admin/steam-trade/inventory | Получить инвентарь бота | — |
| GET | /admin/steam-trade/status | Статус бота (online/offline) | — |
| POST | /admin/steam-trade/refresh-inventory | Обновить кэш инвентаря | — |
User API
| Метод | Эндпоинт | Описание | Docs |
|---|---|---|---|
| POST | /api/withdrawals | Создать запрос на вывод | → |
| GET | /api/withdrawals/:id | Статус вывода | → |
7. Configuration
Environment Variables
| Переменная | Описание | Обязательна |
|---|---|---|
STEAM_BOT_USERNAME | Steam логин бота | ✅ |
STEAM_BOT_PASSWORD | Steam пароль | ✅ |
STEAM_BOT_SHARED_SECRET | Mobile authenticator secret | ✅ |
STEAM_BOT_IDENTITY_SECRET | Identity secret для подтверждений | ✅ |
STEAM_API_KEY | Steam Web API ключ | ✅ |
Все credentials хранятся в .env и НЕ КОММИТЯТСЯ в git. Production secrets управляются через Dokploy environment variables.
8. Known Vulnerabilities (Accepted Risk)
Transitive Dependencies via request@2.88.2
Vulnerabilities:
form-data- CRITICAL (RCE)nth-check- HIGH (ReDoS)lodash.pick- HIGH (Prototype pollution)
Status: ✅ Accepted as calculated risk
Mitigation:
- Bot runs in isolated Docker container
- No direct user input to trade manager
- Monitored for security updates from DoctorMcKay
- Weekly
pnpm auditreview - Re-evaluate if CRITICAL exploit published
Why not fixed:
- All Steam libraries in ecosystem depend on
request@2.88.2 - Libraries are actively maintained (last update: August 2025)
- No migration path exists until maintainer rewrites to remove
request
Monitoring:
cd backend
pnpm audit | grep -E "CRITICAL|HIGH"
See: ADR 004: Steam Trade Library Security
9. Dependencies
Core Libraries
| Package | Version | Status | Author |
|---|---|---|---|
steam-tradeoffer-manager | 2.12.2 | ✅ Maintained | DoctorMcKay |
steamcommunity | 3.49.0 | ✅ Maintained | DoctorMcKay |
steam-user | 5.0.0 | ✅ Maintained | DoctorMcKay |
steam-totp | 2.1.2 | ✅ Maintained | DoctorMcKay |
Last verified: 2026-02-16
All libraries are actively maintained by the original creator (DoctorMcKay) and receive regular updates.