#!/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();