ncantu fe7f49b6cd Update API anchorage, services, and website skeleton
**Motivations:**
- Synchronisation des modifications sur l'API anchorage, les services et le website skeleton
- Ajout de scripts de monitoring et de diagnostic pour l'API anchorage
- Documentation des problèmes de mutex et de provisioning UTXO

**Root causes:**
- N/A (commit de synchronisation)

**Correctifs:**
- N/A (commit de synchronisation)

**Evolutions:**
- Ajout de scripts de monitoring et de diagnostic pour l'API anchorage
- Amélioration de la gestion des mutex et des UTXOs
- Mise à jour de la documentation

**Pages affectées:**
- api-anchorage/src/bitcoin-rpc.js
- api-anchorage/src/routes/anchor.js
- api-anchorage/src/routes/health.js
- api-anchorage/src/server.js
- api-anchorage/README-MONITORING.md
- api-anchorage/cleanup-stale-locks.mjs
- api-anchorage/diagnose.mjs
- api-anchorage/unlock-utxos.mjs
- service-login-verify/src/persistentNonceCache.ts
- signet-dashboard/src/server.js
- signet-dashboard/public/*
- userwallet/src/hooks/useChannel.ts
- userwallet/src/services/relayNotificationService.ts
- userwallet/src/utils/defaultContract.ts
- website-skeleton/src/*
- docs/DOMAINS_AND_PORTS.md
- docs/INTERFACES.md
- features/*
- fixKnowledge/*
2026-01-28 15:11:59 +01:00

56 lines
1.8 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* Script de diagnostic pour l'API d'ancrage
* Affiche l'état des UTXOs verrouillés, leur durée de verrouillage, etc.
*/
import { getDatabase } from './src/database.js';
const db = getDatabase();
// UTXOs verrouillés
const locked = db.prepare(`
SELECT txid, vout, address, amount, updated_at,
(julianday('now') - julianday(updated_at)) * 24 * 60 as minutes_locked
FROM utxos
WHERE is_locked_in_mutex = 1
ORDER BY updated_at
`).all();
console.log(`\n📊 UTXOs verrouillés: ${locked.length}`);
if (locked.length > 0) {
console.log('\nDétails des UTXOs verrouillés:');
locked.forEach((u, index) => {
const minutes = Math.round(u.minutes_locked * 100) / 100;
const status = minutes > 10 ? '⚠️ STALE' : '🔒';
console.log(`${status} [${index + 1}] ${u.txid.substring(0, 16)}... vout:${u.vout} amount:${u.amount} locked_for:${minutes}min`);
});
}
// UTXOs verrouillés depuis plus de 10 minutes
const stale = locked.filter(u => u.minutes_locked > 10);
if (stale.length > 0) {
console.log(`\n⚠️ UTXOs verrouillés depuis plus de 10 minutes: ${stale.length}`);
console.log(' Action recommandée: Exécuter cleanup-stale-locks.mjs');
}
// Statistiques générales
const stats = db.prepare(`
SELECT
COUNT(*) as total,
SUM(CASE WHEN is_locked_in_mutex = 1 THEN 1 ELSE 0 END) as locked,
SUM(CASE WHEN is_spent_onchain = 1 THEN 1 ELSE 0 END) as spent,
SUM(CASE WHEN is_spent_onchain = 0 AND is_locked_in_mutex = 0 AND confirmations > 0 THEN 1 ELSE 0 END) as available
FROM utxos
`).get();
console.log(`\n📈 Statistiques UTXOs:`);
console.log(` Total: ${stats.total}`);
console.log(` Verrouillés: ${stats.locked}`);
console.log(` Dépensés: ${stats.spent}`);
console.log(` Disponibles: ${stats.available}`);
db.close();