ncantu b3973ddc41 Add transaction statistics endpoints and systemd services
**Motivations:**
- Add transaction statistics endpoints (avg-fee, avg-amount) for dashboard display
- Fix difficulty parsing issue when Bitcoin RPC returns string instead of number
- Add systemd service files for proper service management
- Update dashboard UI to display transaction statistics

**Root causes:**
- Bitcoin RPC can return difficulty as string, causing type issues
- Missing API endpoints for transaction statistics in dashboard

**Correctifs:**
- Fix difficulty parsing to handle both string and number types
- Add proper type conversion for blockchainInfo.difficulty

**Evolutions:**
- Add /api/transactions/avg-fee endpoint returning fixed 1200 sats fee
- Add /api/transactions/avg-amount endpoint returning fixed 1000 sats amount
- Add systemd service files for api-faucet and signet-dashboard
- Enhance dashboard UI with transaction statistics display
- Update anchor_count.txt

**Pages affectées:**
- signet-dashboard/src/server.js
- signet-dashboard/public/app.js
- signet-dashboard/public/index.html
- signet-dashboard/signet-dashboard.service
- api-faucet/faucet-api.service
- anchor_count.txt
2026-01-25 03:55:26 +01:00

142 lines
6.5 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bitcoin Ancrage - Dashboard de Supervision</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<header>
<h1>Bitcoin Ancrage - Dashboard de Supervision</h1>
<p class="subtitle">Surveillance de la blockchain et outils de test</p>
<p class="external-links">
<a href="https://mempool.4nkweb.com/fr/" target="_blank" rel="noopener noreferrer" class="external-link">
🔗 Explorer Mempool
</a>
</p>
</header>
<main>
<!-- Section Supervision -->
<section class="supervision-section">
<h2>État de la Blockchain</h2>
<div class="grid">
<div class="card">
<h3>Hauteur de Bloc</h3>
<p class="value" id="block-height">-</p>
</div>
<div class="card">
<h3>Dernier Bloc Miné</h3>
<p class="value" id="last-block-time">-</p>
</div>
<div class="card">
<h3>Transactions dans le Dernier Bloc</h3>
<p class="value" id="last-block-tx-count">-</p>
</div>
<div class="card">
<h3>Balance Mature</h3>
<p class="value" id="balance-mature">-</p>
</div>
<div class="card">
<h3>Balance Immature</h3>
<p class="value" id="balance-immature">-</p>
</div>
<div class="card">
<h3>Nombre d'Ancrages</h3>
<p class="value" id="anchor-count">
<span id="anchor-count-value">-</span>
<span id="anchor-count-spinner" class="spinner" style="display: none;"></span>
</p>
</div>
<div class="card">
<h3>Nombre de Pairs</h3>
<p class="value" id="peer-count">-</p>
</div>
<div class="card">
<h3>Difficulté de Minage</h3>
<p class="value" id="mining-difficulty">-</p>
</div>
<div class="card">
<h3>Temps Moyen entre Blocs</h3>
<p class="value" id="avg-block-time">
<span id="avg-block-time-value">-</span>
<span id="avg-block-time-spinner" class="spinner" style="display: none;"></span>
</p>
</div>
<div class="card">
<h3>Frais Moyens</h3>
<p class="value" id="avg-fee">
<span id="avg-fee-value">-</span>
<span id="avg-fee-spinner" class="spinner" style="display: none;"></span>
</p>
</div>
<div class="card">
<h3>Montant Moyen des Transactions</h3>
<p class="value" id="avg-tx-amount">
<span id="avg-tx-amount-value">-</span>
<span id="avg-tx-amount-spinner" class="spinner" style="display: none;"></span>
</p>
</div>
</div>
</section>
<!-- Section Test d'Ancrage -->
<section class="anchor-section">
<h2>Test de l'API d'Ancrage</h2>
<div class="card">
<div class="tabs">
<button class="tab-button active" onclick="switchTab('text', this)">Saisie de Texte</button>
<button class="tab-button" onclick="switchTab('file', this)">Sélection de Fichier</button>
</div>
<div id="text-tab" class="tab-content active">
<label for="anchor-text">Texte à ancrer :</label>
<textarea id="anchor-text" rows="5" placeholder="Entrez le texte à ancrer..."></textarea>
<button onclick="generateHashFromText()">Générer le Hash</button>
</div>
<div id="file-tab" class="tab-content">
<label for="anchor-file">Fichier à ancrer :</label>
<input type="file" id="anchor-file" onchange="handleFileSelect(event)">
<div id="file-info" class="file-info"></div>
<button onclick="generateHashFromFile()">Générer le Hash</button>
</div>
<div class="hash-section">
<label for="anchor-hash">Hash SHA256 :</label>
<input type="text" id="anchor-hash" placeholder="Le hash sera généré automatiquement...">
<div class="hash-buttons">
<button onclick="verifyHash()">Vérifier le Hash</button>
<button onclick="anchorDocument()">Ancrer le Document</button>
</div>
</div>
<div id="anchor-result" class="result"></div>
</div>
</section>
<!-- Section Faucet -->
<section class="faucet-section">
<h2>Faucet Bitcoin Ancrage</h2>
<div class="card">
<p>Recevez 50 000 ✅ (0.0005 🛡) sur votre adresse Bitcoin Ancrage</p>
<label for="faucet-address">Adresse Bitcoin :</label>
<input type="text" id="faucet-address" placeholder="tb1q..." pattern="^(tb1|bcrt1|2|3)[a-zA-HJ-NP-Z0-9]{25,62}$">
<button onclick="requestFaucet()">Demander des Sats</button>
<div id="faucet-result" class="result"></div>
</div>
</section>
</main>
<footer>
<p>Bitcoin Ancrage Dashboard - Équipe 4NK</p>
<p>Dernière mise à jour : <span id="last-update">-</span></p>
</footer>
</div>
<script src="app.js?v=20260124"></script>
</body>
</html>