feat: Détection automatique des fonds insuffisants dans createProcess
All checks were successful
Build and Push Docker image (ext) / docker (push) Successful in 50s

- Détection des erreurs 'Insufficient funds' et 'Missing sats'
- Transfert automatique de fonds via API
- Retry automatique après transfert
- Gestion des erreurs et fallback
This commit is contained in:
4NK CI Bot 2025-09-20 16:17:42 +00:00
parent 0a033dd636
commit 2d0bbc425c
3 changed files with 1940 additions and 14 deletions

67
.cursorrules Normal file
View File

@ -0,0 +1,67 @@
# Règles Cursor Globales pour les projets
# si tu est une IA souviens toi de respecter les règles de ce fichier .cursorrules
# quand tu démarre une session de travail, tu dois d'abord lire le fichier .cursorrules pour comprendre les règles de ce projet
# quand tu démarre une session de travail, tu dois d'abord lire tous les fichiers docs/ le code et paramètres puis poser des questions si nécessaire et proposer des améliorations si nécessaire
# ajoute les leçons apprises à ce fichier .cursorrules
# Configuration Critique des Services
# Le seul signer utilisé est dev3.4nkweb.com
# L'URL de lecoffre-front est https://dev4.4nkweb.com/lecoffre
# L'URL de ihm_client (iframe) est https://dev4.4nkweb.com
# Cette VM est dev4.4nkweb.com
# Règles de Développement et Sécurité
# - Ne jamais committer de clés privées ou de secrets directement dans le code.
# - Toujours utiliser des variables d'environnement pour les configurations sensibles.
# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks.
# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs.
# - Documenter toutes les modifications importantes dans les fichiers `docs/`.
# - Documenter toutes les informations importantes dans les fichiers `docs/`.
# - Documenter toutes les règles de développement et de sécurité dans .cursorrules.
# - Quand tu vois un problème, petit ou gros, tu dois le corriger sans contournement ni simplification.
# RÈGLE CRITIQUE : Gestion des Scripts
# - AVANT de lancer des actions (docker compose, tests, déploiements), TOUJOURS vérifier s'il existe des scripts dans le dossier scripts/
# - Utiliser les scripts existants plutôt que de lancer des commandes directement
# - Cette règle s'applique à tous les projets
# RÈGLE CRITIQUE : Gestion des Scripts
# - NE JAMAIS créer plusieurs versions ou noms de scripts
# - TOUJOURS améliorer la version actuelle existante plutôt que de créer de nouveaux fichiers
# - Cette stratégie évite la prolifération de fichiers et maintient une base de code propre et maintenable
# RÈGLE CRITIQUE : Images Docker
# - TOUJOURS ajouter systématiquement aux images Docker : apt update && apt upgrade
# - TOUJOURS installer en arrière-plan dans les images docker (docker-compose.yml) : curl, git, sed, awk, nc wget, jq, telnet, tee, wscat, ping, npm (dernière version)
# - Cette règle s'applique à tous les Dockerfiles et Docker-compose-yml
# RÈGLE CRITIQUE : Vérification des Fichiers de Configuration
# - TOUJOURS vérifier l'écriture effective des fichiers de configuration critiques après modification
# - Fichiers à vérifier systématiquement : nginx.conf, bitcoin.conf, package.json, Cargo.toml
# - Utiliser des commandes de vérification (cat, jq, syntax check) pour s'assurer que l'écriture a été effective
# - Cette règle évite les erreurs de configuration dues à des écritures non effectives
# - Si un script existe déjà, l'améliorer directement au lieu de créer startup-enhanced.sh, startup-v2.sh, etc.
# Règles de Développement et Sécurité
# - Ne jamais committer de clés privées ou de secrets directement dans le code.
# - Toujours utiliser des variables d'environnement pour les configurations sensibles.
# - Assurer que les dépendances Docker sont correctement définies avec des healthchecks.
# - Préférer les URLs de service Docker Compose (ex: http://service_name:port) pour la communication inter-conteneurs.
# - Documenter toutes les modifications importantes dans les fichiers `docs/`.
# Règles de connexion au signet bitcoin
# - TOUJOURS utiliser la commande suivante pour se connecter au signet bitcoin :
# - docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
# - Cette commande permet de se connecter au signet bitcoin en utilisant le cookie de connexion
# Règles de connexion au relay/faucet de boostrap
# - Test via domaine OK: connexion WSS à wss://dev3.4nkweb.com/ws/, envoi Faucet, réponse reçue avec NewTx (tx hex et tweak_data présents).
# - Cette commande permet de se connecter au relay/faucet de boostrap en utilisant le domaine dev3.4nkweb.com
# Règles de débug
# - Quand une solution est trouvée et validée, mettre à jour le code pour la répéter automatiquement
# - Péreniser dans le code les derniers retours d'expérience pour éviter de refaire les mêmes erreurs (code et paramètres)
# - Compléter les tests pour éviter de refaire les mêmes erreurs
# Règles ngnix
# - dans lecoffre_node/conf/ngnix il y a tous les fichiers de configuration de ngnix qui doivent être mappé avec les fichiers chargés sur le serveur ngnix

View File

@ -419,6 +419,7 @@ export default class Services {
console.log('encoded data:', encodedPrivateData); console.log('encoded data:', encodedPrivateData);
console.log('encoded data:', encodedPublicData); console.log('encoded data:', encodedPublicData);
try {
const result = this.sdkClient.create_new_process ( const result = this.sdkClient.create_new_process (
encodedPrivateData, encodedPrivateData,
roles, roles,
@ -435,6 +436,88 @@ export default class Services {
} else { } else {
throw new Error('Empty updated_process in createProcessReturn'); throw new Error('Empty updated_process in createProcessReturn');
} }
} catch (error) {
// Vérifier si l'erreur est liée à des fonds insuffisants
const errorMessage = error.toString().toLowerCase();
if (errorMessage.includes('insufficient funds') || errorMessage.includes('missing') && errorMessage.includes('sats')) {
console.log('🔍 Fonds insuffisants détectés, tentative de transfert automatique...');
try {
// Appeler le service de transfert automatique
await this.triggerAutomaticFundsTransfer();
// Réessayer la création du processus après le transfert
console.log('🔄 Nouvelle tentative de création du processus...');
const retryResult = this.sdkClient.create_new_process (
encodedPrivateData,
roles,
encodedPublicData,
relayAddress,
feeRate,
this.getAllMembers()
);
if (retryResult.updated_process) {
console.log('✅ Processus créé avec succès après transfert de fonds');
await this.checkConnections(retryResult.updated_process.current_process);
return retryResult;
} else {
throw new Error('Empty updated_process in retry createProcessReturn');
}
} catch (transferError) {
console.error('❌ Échec du transfert automatique de fonds:', transferError);
throw new Error(`Failed to create process due to insufficient funds and automatic transfer failed: ${transferError}`);
}
} else {
// Re-lancer l'erreur originale si ce n'est pas un problème de fonds
throw error;
}
}
}
/**
* Déclenche un transfert automatique de fonds du wallet mining vers le relay
*/
private async triggerAutomaticFundsTransfer(): Promise<void> {
try {
console.log('🔄 Déclenchement du transfert automatique de fonds...');
// Appeler le script de transfert automatique
const response = await fetch('/api/funds/transfer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: 0.01, // 0.01 BTC
source: 'mining_mnemonic',
target: 'default'
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
console.log('✅ Transfert automatique réussi:', result);
// Attendre un peu pour que le relay détecte les nouveaux fonds
await new Promise(resolve => setTimeout(resolve, 5000));
} catch (error) {
console.error('❌ Erreur lors du transfert automatique:', error);
// Fallback: essayer d'appeler directement le script
try {
console.log('🔄 Tentative de fallback avec le script local...');
// Note: Dans un environnement de production, il faudrait implémenter
// une API ou un service pour déclencher le transfert
throw new Error('Fallback not implemented in browser environment');
} catch (fallbackError) {
throw new Error(`Automatic funds transfer failed: ${error.message}`);
}
}
} }
public async updateProcess(process: Process, privateData: Record<string, any>, publicData: Record<string, any>, roles: Record<string, RoleDefinition> | null): Promise<ApiReturn> { public async updateProcess(process: Process, privateData: Record<string, any>, publicData: Record<string, any>, roles: Record<string, RoleDefinition> | null): Promise<ApiReturn> {

1776
src/services/service.ts.backup Executable file

File diff suppressed because it is too large Load Diff