Initial commit: Predictalytics solution
Clean Architecture .NET 8 solution (Domain/Application/Infrastructure/Api/Worker/WinFormsHost) for analyzing Polymarket traders for copytrading/strategy-replication candidates. Includes EF Core InitialBaseline migration and DB secrets removed from source/config in preparation for version control.
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="description" content="Predictalytics — Multi-Platform Prediction Market Smart-Money Tracker & Analytics">
|
||||
<title>Predictalytics</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<aside class="sidebar" id="sidebar">
|
||||
<div class="sidebar-logo">
|
||||
<div class="logo-icon">P</div>
|
||||
<span class="logo-text">Predictalytics</span>
|
||||
</div>
|
||||
<nav class="sidebar-nav">
|
||||
<a href="#" class="nav-item active" data-page="dashboard">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
|
||||
<span>Dashboard</span>
|
||||
</a>
|
||||
<a href="#" class="nav-item" data-page="traders">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>
|
||||
<span>Traders</span>
|
||||
</a>
|
||||
<a href="#" class="nav-item" data-page="markets">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
|
||||
<span>Markets</span>
|
||||
</a>
|
||||
<a href="#" class="nav-item" data-page="alerts">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
|
||||
<span>Alerts</span>
|
||||
<span class="badge" id="alertBadge" style="display:none">0</span>
|
||||
</a>
|
||||
</nav>
|
||||
<div class="sidebar-footer">
|
||||
<a href="/swagger" target="_blank" class="nav-item">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
|
||||
<span>API Docs</span>
|
||||
</a>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="main-content">
|
||||
<!-- Top Bar -->
|
||||
<header class="topbar">
|
||||
<div class="topbar-left">
|
||||
<select id="platformSelect" class="platform-select">
|
||||
<option value="All">All Platforms</option>
|
||||
<option value="Polymarket">Polymarket</option>
|
||||
<option value="Limitless">Limitless</option>
|
||||
<option value="Azuro">Azuro</option>
|
||||
</select>
|
||||
<div class="search-box">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||
<input type="text" id="searchInput" placeholder="Search traders, markets..." autocomplete="off">
|
||||
</div>
|
||||
<select id="sortSelect" class="platform-select">
|
||||
<option value="default">Sort by: Default</option>
|
||||
<option value="score">Sort by: Score/Vol</option>
|
||||
<option value="name">Sort by: Name/Date</option>
|
||||
<option value="pnl">Sort by: PnL/Liq</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="topbar-right">
|
||||
<div class="timeframe-toggle">
|
||||
<button class="tf-btn active" data-tf="24h">24H</button>
|
||||
<button class="tf-btn" data-tf="7d">7D</button>
|
||||
<button class="tf-btn" data-tf="30d">30D</button>
|
||||
</div>
|
||||
<div class="theme-toggle" id="themeToggle" title="Toggle Dark/Light Mode">
|
||||
<svg class="icon-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>
|
||||
<svg class="icon-moon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Page Content -->
|
||||
<div class="page-content" id="pageContent">
|
||||
<!-- Dashboard Page -->
|
||||
<section class="page active" id="page-dashboard">
|
||||
<h1 class="page-title">Dashboard</h1>
|
||||
<!-- Metric Cards -->
|
||||
<div class="metrics-grid" id="metricsGrid">
|
||||
<div class="metric-card"><div class="metric-label">Total Traders</div><div class="metric-value" id="metricTraders">—</div><div class="metric-delta positive">tracking</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Active (24h)</div><div class="metric-value" id="metricActive">—</div><div class="metric-delta positive">live</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Total Trades</div><div class="metric-value" id="metricTrades">—</div><div class="metric-delta">all time</div></div>
|
||||
<div class="metric-card accent"><div class="metric-label">Volume (24h)</div><div class="metric-value" id="metricVolume">—</div><div class="metric-delta positive">USD</div></div>
|
||||
</div>
|
||||
<!-- Charts Row -->
|
||||
<div class="charts-row">
|
||||
<div class="card chart-card">
|
||||
<div class="card-header"><h2>Platform Breakdown</h2></div>
|
||||
<div class="chart-container"><canvas id="platformChart"></canvas></div>
|
||||
</div>
|
||||
<div class="card chart-card">
|
||||
<div class="card-header"><h2>Trader Tiers</h2></div>
|
||||
<div class="chart-container"><canvas id="tierChart"></canvas></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Top Traders Table -->
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Top Traders</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table" id="topTradersTable">
|
||||
<thead><tr><th>#</th><th>Trader</th><th>Platform</th><th>Score</th><th>Win Rate</th><th>PnL</th><th>Tier</th><th>Trades</th></tr></thead>
|
||||
<tbody id="topTradersBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Recent Trades -->
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Recent Trades</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table" id="recentTradesTable">
|
||||
<thead><tr><th>Time</th><th>Trader</th><th>Market</th><th>Side</th><th>Price</th><th>Size</th><th>Amount</th></tr></thead>
|
||||
<tbody id="recentTradesBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Traders Page -->
|
||||
<section class="page" id="page-traders">
|
||||
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:24px;">
|
||||
<h1 class="page-title" style="margin-bottom:0">Traders</h1>
|
||||
<div class="card" style="margin-bottom:0; padding:12px 20px; display:flex; gap:12px; align-items:center;">
|
||||
<span style="font-size:13px; font-weight:600">Add Trader:</span>
|
||||
<select id="addPlatform" class="platform-select">
|
||||
<option value="Polymarket">Polymarket</option>
|
||||
<option value="Limitless">Limitless</option>
|
||||
</select>
|
||||
<input type="text" id="addWallet" placeholder="Wallet Address" class="platform-select" style="width:300px">
|
||||
<button class="btn-sm" onclick="manualAddTrader()" style="padding:6px 16px; background:var(--accent); color:white; border:none">Add</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="table-wrap">
|
||||
<table class="data-table"><thead><tr><th>#</th><th>Name</th><th>Platform</th><th>Score</th><th>Win Rate</th><th>PnL</th><th>Tier</th><th>Strategy</th><th>Actions</th></tr></thead>
|
||||
<tbody id="allTradersBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Markets Page -->
|
||||
<section class="page" id="page-markets"><h1 class="page-title">Markets</h1><div class="card"><div class="table-wrap"><table class="data-table"><thead><tr><th>Platform</th><th>Question</th><th>Volume</th><th>Liquidity</th><th>End Date</th><th>Status</th></tr></thead><tbody id="allMarketsBody"></tbody></table></div></div></section>
|
||||
|
||||
<!-- Alerts Page -->
|
||||
<section class="page" id="page-alerts"><h1 class="page-title">Alerts</h1><div class="card" id="alertsList"></div></section>
|
||||
|
||||
<!-- Search Results Page -->
|
||||
<section class="page" id="page-search">
|
||||
<h1 class="page-title" id="search-title">Search Results</h1>
|
||||
<div id="searchResults">
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Traders</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table">
|
||||
<thead><tr><th>#</th><th>Name</th><th>Platform</th><th>Score</th><th>Tier</th><th>Actions</th></tr></thead>
|
||||
<tbody id="searchTradersBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Markets</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table">
|
||||
<thead><tr><th>Platform</th><th>Question</th><th>Volume</th><th>Status</th><th>Actions</th></tr></thead>
|
||||
<tbody id="searchMarketsBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Trader Detail Page -->
|
||||
<section class="page" id="page-trader-detail">
|
||||
<div class="detail-header" style="justify-content:space-between">
|
||||
<div style="display:flex; align-items:center; gap:16px">
|
||||
<button class="btn-back" onclick="navigateBack()">← Back</button>
|
||||
<h1 class="page-title" id="td-name" style="margin-bottom:0">Trader Name</h1>
|
||||
</div>
|
||||
<button class="btn-sm" id="btn-refresh-trader" style="padding:8px 16px; background:var(--bg-input)">Sync History</button>
|
||||
</div>
|
||||
<div class="detail-grid">
|
||||
<div class="card detail-sidebar">
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Platform</div>
|
||||
<div class="stat-value" id="td-platform">—</div>
|
||||
</div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Platform ID</div>
|
||||
<div class="stat-value small" id="td-platformId">—</div>
|
||||
</div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Tier</div>
|
||||
<div class="stat-value" id="td-tier">—</div>
|
||||
</div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Strategy</div>
|
||||
<div class="stat-value" id="td-strategy">—</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-main">
|
||||
<div class="metrics-grid">
|
||||
<div class="metric-card"><div class="metric-label">Win Rate</div><div class="metric-value" id="td-winrate">—</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Total PnL</div><div class="metric-value" id="td-pnl">—</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Total Trades</div><div class="metric-value" id="td-trades">—</div></div>
|
||||
<div class="metric-card accent"><div class="metric-label">Score</div><div class="metric-value" id="td-score">—</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Recent Trades</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table">
|
||||
<thead><tr><th>Time</th><th>Market</th><th>Side</th><th>Price</th><th>Size</th><th>Amount</th></tr></thead>
|
||||
<tbody id="td-tradesBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Market Detail Page -->
|
||||
<section class="page" id="page-market-detail">
|
||||
<div class="detail-header">
|
||||
<button class="btn-back" onclick="navigateBack()">← Back</button>
|
||||
<h1 class="page-title" id="md-question">Market Question</h1>
|
||||
</div>
|
||||
<div class="detail-grid">
|
||||
<div class="card detail-sidebar">
|
||||
<div id="md-image" class="market-img-container"></div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Platform</div>
|
||||
<div class="stat-value" id="md-platform">—</div>
|
||||
</div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Category</div>
|
||||
<div class="stat-value" id="md-category">—</div>
|
||||
</div>
|
||||
<div class="stat-group">
|
||||
<div class="stat-label">Ends</div>
|
||||
<div class="stat-value" id="md-ends">—</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-main">
|
||||
<div class="metrics-grid">
|
||||
<div class="metric-card"><div class="metric-label">Volume</div><div class="metric-value" id="md-volume">—</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Liquidity</div><div class="metric-value" id="md-liquidity">—</div></div>
|
||||
<div class="metric-card"><div class="metric-label">Status</div><div class="metric-value" id="md-status">—</div></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Outcomes</h2></div>
|
||||
<div class="outcomes-list" id="md-outcomes"></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header"><h2>Recent Trades</h2></div>
|
||||
<div class="table-wrap">
|
||||
<table class="data-table">
|
||||
<thead><tr><th>Time</th><th>Trader</th><th>Side</th><th>Price</th><th>Size</th><th>Amount</th></tr></thead>
|
||||
<tbody id="md-tradesBody"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
<script src="js/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user