**Motivations:** - Ajouter dates manquantes dans hash_list.txt et compléter historique - Compléter blockTime manquants dans utxo_list.txt et compléter historique - Récupérer frais depuis transactions d'ancrage (OP_RETURN) et les stocker - Bouton UI pour déclencher récupération frais - Diagnostic Bloc Rewards (pourquoi ~4700 BTC au lieu de 50 BTC) **Root causes:** - hash_list.txt sans date (format ancien) - utxo_list.txt blockTime souvent vide - Frais absents du fichier (métadonnées OP_RETURN non stockées) - Pas de moyen de récupérer/compléter frais depuis UI **Correctifs:** - hash_list.txt : format étendu avec date (rétrocompatible) - utxo_list.txt : blockTime complété automatiquement lors écritures - fees_list.txt : nouveau fichier pour stocker frais - updateFeesFromAnchors() : récupère frais depuis OP_RETURN ancrages - Endpoint /api/utxo/fees/update pour déclencher récupération - Bouton "Récupérer les frais depuis les ancrages" dans section Frais (spinner) - Scripts batch : complete-hash-list-dates.js, complete-utxo-list-blocktime.js - Script diagnostic : diagnose-bloc-rewards.js (subsidy, coinbase, listunspent) **Evolutions:** - Frais chargés depuis fees_list.txt dans getUtxoList - Complétion automatique dates/blockTime lors écritures futures **Pages affectées:** - signet-dashboard/src/bitcoin-rpc.js - signet-dashboard/src/server.js - signet-dashboard/public/utxo-list.html - scripts/complete-hash-list-dates.js - scripts/complete-utxo-list-blocktime.js - scripts/diagnose-bloc-rewards.js - features/utxo-list-fees-update-and-historical-completion.md
48 lines
994 B
TypeScript
48 lines
994 B
TypeScript
import { useState, useCallback } from 'react';
|
|
|
|
export interface AppError {
|
|
message: string;
|
|
code?: string;
|
|
details?: unknown;
|
|
timestamp: number;
|
|
}
|
|
|
|
export function useErrorHandler() {
|
|
const [error, setError] = useState<AppError | null>(null);
|
|
|
|
const handleError = useCallback((err: unknown, context?: string): void => {
|
|
let errorMessage = 'Une erreur est survenue';
|
|
let errorCode: string | undefined;
|
|
|
|
if (err instanceof Error) {
|
|
errorMessage = err.message;
|
|
errorCode = err.name;
|
|
} else if (typeof err === 'string') {
|
|
errorMessage = err;
|
|
}
|
|
|
|
if (context !== undefined) {
|
|
errorMessage = `${context}: ${errorMessage}`;
|
|
}
|
|
|
|
console.error('Error:', err);
|
|
|
|
setError({
|
|
message: errorMessage,
|
|
code: errorCode,
|
|
details: err,
|
|
timestamp: Date.now(),
|
|
});
|
|
}, []);
|
|
|
|
const clearError = useCallback((): void => {
|
|
setError(null);
|
|
}, []);
|
|
|
|
return {
|
|
error,
|
|
handleError,
|
|
clearError,
|
|
};
|
|
}
|