Всего: 23 находки (4 critical, 10 important, 9 nice-to-have)
Файл: server/index.js, строки 1746, 1757, 1769
POST /api/rate-limiter/reset — может сбросить rate limiter -> бан BinancePOST /api/log-levels — заполнить диск debug логамиPOST /api/reload-static — DoSreq.user.tier === 'admin'Файл: server/index.js, строка 1513
/api/oi-history принимает period без whitelist5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h, 1dФайл: server/signals.js, строки 867-873
db.prepare() вызывается каждый раз вместо кешированногоФайл: server/index.js, строки 1453-1470
POST /api/push/subscribe — любой бот может подписатьсяrequireAuthStatic serving, все API routes, warmup, density cache, proxy cache, resync, shutdown — всё в одном файле.
Строки 492-561 — можно заменить одним циклом.
index.js:getKlinesWithStats() — density scoringindex.js:/api/natr — NATR cachesignals.js:calcNatrFromKlines() — signal metadata
Любое исправление формулы — 3 места.Файл: server/treemap.js, строки 35-69
index.js напрямую модифицирует экспортированный массив из signals.js.
AbortController + timeout + try/finally — повторяется 10 раз без централизации.
modules/densities/detector.js — заглушка "TODO: implement"modules/densities/tracker.js — никто не require-итmodules/klines.js — не импортируетсяmodules/binance/api.js — не импортируетсяЗаменён на depth-store.js (SQLite), старый файл остался.
Auth flow, admin endpoints, push subscription, Density V2 — не покрыты.
trackAndEnrichBins() — полный перебор 5000 entries с startsWith(). Терпимо при cap 5000.
sendTelegramAlert(), calcScore(), groupCloseLevels(), filterLevelsByWindow(), calcNearestDensities(), getCacheKey()/getCached()/setCached()
path, fs уже импортированы top-level, но require-ятся повторно в функциях.
Объявлены но нигде не применяются.
logger.js + index.js оба регистрируют SIGTERM handler.
symbol — только !symbol, condition — произвольный JSON без schema.
escAttr() не везде. Данные от Binance, не от юзера — риск минимальный.
~100ms на hash. При малом кол-ве юзеров — ОК.
@fastify/cors, better-sqlite3, bcryptjs, jsonwebtoken — не в основном package.json.
При восстановлении из DB createdAt = now, а не оригинальный timestamp. Tracker живёт дольше 25h.