Источник: итерации v1→v8 (мокапы в
redesign/mockup/). Утверждено Rick. Превью: https://kb.szhub.space/poly/v8-all.png
Раскладка «Stand» (терминальная плотность) + палитра «Olympus» (navy + электрик-зелёный + моноцифры).
Основано на анализе реальных UI конкурентов (Olympus, Stand, Poly Syncer) — см. docs/COMPETITOR_ANALYSIS.md.
--bg: #0c1c22 (фон)
--panel:#0f2730 (карточки)
--bd: #18404a (бордер)
--bds: #163740 (бордер слабый)
--gr: #22e06a (акцент / электрик-зелёный)
--grd: #0d8f55 (тёмный зелёный, градиенты)
--tx: #eafff4 (текст)
--mu: #5b8a82 (muted)
--rd: #ff7a7a (негатив/убыток)
--bl: #7fd9ff (категории)
Шрифт: Inter (UI) + JetBrains Mono (цифры/метрики)
Тёмная — основная.
EDGE · ROI · Копируют · P&L.P&L $ · 🔥 N копируют · 📈 +% 7D.Позиции / Подписки / История / P&LСборка: на main-сервере (Node 22) → rsync
dist+srcна Malaysia. Демонcopy-trader-muНЕ трогается.
App.css/index.css :root → navy #0c1c22 + accent #22E06A, loss #ff7a7a; useTheme meta navy. (commit 0c802df)data-accent (хук useAccent), пикер в Настройках: green(деф)/ocean/nebula/cyber/sunset/crimson. Profit/loss всегда зелёный/красный; Privy не задет. (e822e64, dc6c37e)9801e59, b141bde)/whale) — +Total P&L, +Max Drawdown (вычислен из equity-серии), блок «🔒 Copy honesty» (реальная цена/лаг ~12с/non-custodial). (bfc6c99)b141bde)⚡ EDGE главный сорт (по умолчанию) + бейдж на карточке. Формула 0–10: win-rate 30% / бэктест-PF 30% / размер выборки 15% / realized PnL 15% / активность 10%. БЕЗ бэкенда/риска — детерминированная функция полей payload, клиентский ре-ранк пула. (commit 5631672)Находка: в БД уже ~2.5 мес истории (whale_trades с 7 апр, 124k строк), но cleanup >30д её уничтожал. Диск 100ГБ — место не проблема.
whales.rs cleanup_old_trades). Перестали терять историю; теперь firehose+ротация копят ≥3мес для всех. Rust пересобран, рестарт, демон restarts=0.fetch_user_trades: cap 30 страниц + стоп по дате 90д). Обычные киты добиваются до 90д при обновлении/открытии профиля.whales.rs refresh_tracked_whales): колонка history_backfilled_at, проход по топ-300-по-объёму + копируемым, 25/цикл, сортировка по самым старым (nulls first), отметка после каждого. Топ-300 покрывается за ~часы. Rust пересобран, рестарт, демон restarts=0. Проверено: курсор двигается (метки появляются).Rust-правки:
server-rust/src/whales.rsна Malaysia (источник истины) + staged вpolymarket-screener/_impl/.
5cb10f3).e6f3baa). Per-request подзапрос (последние 16 resolved-BUY pnl → json_group_array, ~328ms/300), кумулятив на фронте, мини-SVG в футере карточки. Rust пересобран, API рестарт, демон restarts=0.copy_subscriptions по leader), но =0 без юзеров → показывать «0 копируют» везде хуже, чем не показывать. Включить, когда появятся юзеры.Находка: whale_trades чистится до 30 дней (whales.rs cleanup_old_trades). trade_history пуст/не используется для китов. НО total_pnl/win_rate уже считаются из whale_trades⋈resolved (update_win_rates). Значит:
whale_trades до 90д (рост БД, нагрузка cleanup), илиtrade_history (внешняя зависимость, бэкфилл).✅ 7д-моментум — СДЕЛАНО и на проде (commit фронта 5cb10f3). Колонка whale_wallets.pnl_7d + агрегатор + payload + карточка «📈 7d» (реальные значения, 4784 кита наполнено). Rust-правки задеплоены на Malaysia (server-rust/src/{db,whales,routes}.rs) и staged локально в icbc-watcher→polymarket-screener/_impl/; источник истины — Malaysia. API пересобран (Node 22-сборка не при чём, это cargo на Malaysia), pm2 restart polymarket-screener, демон copy-trader-mu НЕ тронут (restarts=0).
Шаги, как делалось (для повторения):
db.rs: ALTER TABLE whale_wallets ADD COLUMN pnl_7d REAL (идемпотентно).whales.rs update_win_rates: UPDATE ... SET pnl_7d = (realized BUY pnl на resolved-рынках за -7 дней).routes.rs top_traders: добавить pnl_7d в SELECT + маппинг "pnl7d".Trader.pnl7d + 3-я метрика карточки = «📈 7д».pm2 restart polymarket-screener, проверить, что демон достучался (логи), copy-trader-mu не трогать.copy_subscriptions) — легко, но =0 без юзеров → отложено (как слоты).Диагноз (read-only): 3013/3520 закрытых copy_positions имеют realized_pnl=0 (свежие 299/300 — баг продолжается). PnL нет и в mark_pnl/pnl. Источник: off-box демон copy-trader-mu пишет позиции без realized PnL. Затрагивает UserAnalytics + «Мои сделки» P&L.
Ключевая находка безопасности: upsert демона (copytrade.rs) делает ON CONFLICT ... SET realized_pnl=excluded.realized_pnl → бэкфилл колонки демон ЗАТРЁТ. ⇒ считать realized на чтении (в SQL запросов), НЕ писать в copy_positions.
Scope: из 3013 нулевых — 1707 на resolved-рынках вычислимы (формула (outcome=winning_outcome ? size : 0) - cost), 1306 ранних выходов (market не resolved) — нельзя без exit-цены → ждут #1 (демон).
eff_realized = CASE WHEN COALESCE(realized_pnl,0)<>0 THEN realized_pnl WHEN m.resolved=1 THEN (CASE WHEN cp.outcome=m.winning_outcome COLLATE NOCASE THEN cp.size ELSE 0 END)-cp.cost ELSE 0 END.routes.rs analytics_users: total realized (2398) + per-user realized (2444) — через JOIN screener_markets.pm2 restart polymarket-screener → проверить демон restarts=0. Колонку НЕ трогаем.analytics_usersroutes.rs analytics_users: total realized (2398) + per-user realized (2444) теперь считают realized для закрытых BUY на resolved-рынках из резолва ((outcome=winning_outcome?size:0)-cost), сохраняя ненулевой realized_pnl. JOIN screener_markets. Колонку НЕ пишем (демон бы затёр). Rust пересобран, рестарт, демон restarts=0.
trade_history + Data API /activity (НЕ copy_positions) → багом realized=0 НЕ затронуты. Фикс не нужен.routes.rs на Malaysia + staged _impl/.copy-trader-mu — считать realized при резолве/закрытии (money-path, с Rick). Также покрыло бы ~1300 ранних выходов (нужна exit-цена, которую знает демон).