From 93ddfcbb76e4b5b1f2d316e3dcd66409abe680d3 Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Wed, 29 Oct 2025 13:29:07 +0100 Subject: [PATCH] fix: replace declarative logs with verified checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivations :** - Les logs étaient déclaratifs (juste des messages sans vérification réelle) - Il faut vérifier réellement que les opérations sont réussies avant de logger le succès - Les logs doivent refléter la réalité et non juste des déclarations **Modifications :** - Ajout de vérifications réelles dans updateDeviceBlockHeight() pour vérifier que le device est bien restauré en mémoire et sauvegardé en base - Ajout de vérification dans saveDeviceInDatabase() pour vérifier que le wallet est bien sauvegardé après l'opération - Ajout de vérifications dans birthday-setup.ts pour vérifier que les relais sont connectés, que le handshake est reçu, et que le birthday est bien mis à jour - Les logs de succès sont maintenant émis uniquement après vérification réelle des résultats - Amélioration de la gestion des erreurs avec messages explicites si les vérifications échouent **Pages affectées :** - src/services/service.ts (updateDeviceBlockHeight et saveDeviceInDatabase avec vérifications réelles) - src/pages/birthday-setup/birthday-setup.ts (vérifications réelles des prérequis et du birthday) --- IA_agents/all.md | 5 ++ src/pages/birthday-setup/birthday-setup.ts | 45 ++++++++-- src/services/service.ts | 97 ++++++++++++++++++---- 3 files changed, 122 insertions(+), 25 deletions(-) diff --git a/IA_agents/all.md b/IA_agents/all.md index b950238..14ad09b 100644 --- a/IA_agents/all.md +++ b/IA_agents/all.md @@ -56,6 +56,11 @@ voir docs/INITIALIZATION_FLOW.md * **Lint :** Corrige les erreurs de lint, vérifie apres chaque fichier modifié * **Fallbacks :** Ne fait pas et supprime les fallbacks +#### Logs + +* **Données vérifiées :** Vérifiant que les logs reflètent des vérifications réelles et non des déclarations. +* **Log abondamment :** Log les informations et étapes ou états clés ainsi que les identifiants clés. + #### 🧪 Tests * **Couverture des tests :** Rédiger des tests unitaires et d'intégration pour toute nouvelle fonctionnalité ou correction de bug. diff --git a/src/pages/birthday-setup/birthday-setup.ts b/src/pages/birthday-setup/birthday-setup.ts index c9ba7fe..a678dd7 100644 --- a/src/pages/birthday-setup/birthday-setup.ts +++ b/src/pages/birthday-setup/birthday-setup.ts @@ -93,19 +93,39 @@ document.addEventListener('DOMContentLoaded', async () => { return; } } - console.log('✅ Wallet found in database'); - console.log('✅ All prerequisites verified'); + // Vérifier que le wallet contient bien les données attendues + if (wallet.sp_wallet && wallet.sp_wallet.birthday !== undefined) { + console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday); + } else { + throw new Error('Wallet found but missing required data (sp_wallet or birthday)'); + } + + // Vérifier que tous les prérequis sont remplis + const prerequisitesOk = wallet && pbkdf2KeyFound; + if (prerequisitesOk) { + console.log('✅ All prerequisites verified'); + } else { + throw new Error('Prerequisites verification failed'); + } // Connexion aux relais await services.connectAllRelays(); - console.log('✅ Relays connected successfully'); - - // Étape 2: Mise à jour de la date anniversaire - updateStatus('🎂 Mise à jour de la date anniversaire...', 'loading'); - updateProgress(40); + + // Vérifier que les relais sont connectés + const currentBlockHeight = services.getCurrentBlockHeight(); + if (currentBlockHeight !== -1) { + console.log('✅ Relays connected successfully, chain_tip:', currentBlockHeight); + } else { + throw new Error('Relays connected but chain_tip not set'); + } // Les relais sont déjà prêts après connectAllRelays - console.log('✅ Communication handshake completed'); + // Vérifier que le handshake a été reçu + if (currentBlockHeight > 0) { + console.log('✅ Communication handshake completed, chain_tip:', currentBlockHeight); + } else { + throw new Error('Handshake not received or chain_tip not set'); + } // Attendre que la hauteur de bloc soit définie avant de mettre à jour la date anniversaire updateStatus('⏳ Attente de la synchronisation avec le réseau...', 'loading'); @@ -132,7 +152,14 @@ document.addEventListener('DOMContentLoaded', async () => { // Mettre à jour la date anniversaire du wallet await services.updateDeviceBlockHeight(); - console.log('✅ Birthday updated successfully'); + + // Vérifier que le birthday a bien été mis à jour en récupérant le wallet depuis la base + const updatedWallet = await services.getDeviceFromDatabase(); + if (updatedWallet?.sp_wallet?.birthday && updatedWallet.sp_wallet.birthday > 0) { + console.log('✅ Birthday updated successfully:', updatedWallet.sp_wallet.birthday); + } else { + throw new Error(`Birthday update verification failed: expected birthday > 0, got ${updatedWallet?.sp_wallet?.birthday}`); + } // Redirection vers la page de synchronisation des blocs updateStatus('🔄 Redirection vers la synchronisation des blocs...', 'loading'); diff --git a/src/services/service.ts b/src/services/service.ts index 403d177..e5a697f 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -1886,7 +1886,7 @@ export default class Services { // Sauvegarder avec le format chiffré console.log('💾 Saving encrypted device to database...'); - + // Utiliser directement IndexedDB au lieu du service Database pour éviter les problèmes de service worker const db = await new Promise((resolve, reject) => { const request = indexedDB.open(DATABASE_CONFIG.name, DATABASE_CONFIG.version); @@ -1895,12 +1895,12 @@ export default class Services { }); const walletStore = DATABASE_CONFIG.stores.wallet.name; - + // Sauvegarder le wallet chiffré directement avec IndexedDB await new Promise((resolve, reject) => { const transaction = db.transaction([walletStore], 'readwrite'); const store = transaction.objectStore(walletStore); - + // Sauvegarder le nouveau wallet chiffré (put écrase automatiquement si existe) const walletObject: any = { pre_id: '1', @@ -1912,23 +1912,60 @@ export default class Services { walletObject.encrypted_wallet = encryptedWallet; } + // Définir les handlers de transaction avant le put + transaction.oncomplete = async () => { + console.log('✅ Transaction completed for wallet save'); + + // Vérifier que le wallet a bien été sauvegardé en le récupérant depuis la base + try { + const verificationDb = await new Promise((resolveDb, rejectDb) => { + const request = indexedDB.open(DATABASE_CONFIG.name, DATABASE_CONFIG.version); + request.onsuccess = () => resolveDb(request.result); + request.onerror = () => rejectDb(request.error); + }); + + const verificationTx = verificationDb.transaction([walletStore], 'readonly'); + const verificationStore = verificationTx.objectStore(walletStore); + const verifyRequest = verificationStore.get('1'); + + await new Promise((resolveVerify, rejectVerify) => { + verifyRequest.onsuccess = () => { + const savedData = verifyRequest.result; + if (savedData && savedData.encrypted_device === encryptedDevice) { + console.log('✅ Verified: Device correctly saved in database'); + resolveVerify(); + } else { + console.error('❌ Verification failed: Device not found or encrypted data mismatch'); + rejectVerify(new Error('Device save verification failed')); + } + }; + + verifyRequest.onerror = () => { + console.error('❌ Verification failed: Could not retrieve saved device', verifyRequest.error); + rejectVerify(verifyRequest.error); + }; + }); + + resolve(); + } catch (verifyError) { + reject(verifyError); + } + }; + + transaction.onerror = () => { + console.error('❌ Transaction failed:', transaction.error); + reject(transaction.error); + }; + const putRequest = store.put(walletObject); putRequest.onsuccess = () => { console.log('✅ Device saved to database with encryption'); - resolve(); + // La vérification se fera dans transaction.oncomplete }; putRequest.onerror = () => { console.error('❌ Failed to save wallet:', putRequest.error); reject(putRequest.error); }; - - transaction.oncomplete = () => { - console.log('✅ Transaction completed for wallet save'); - }; - transaction.onerror = () => { - console.error('❌ Transaction failed:', transaction.error); - reject(transaction.error); - }; }); } catch (e) { console.error('❌ Error saving device to database:', e); @@ -2265,21 +2302,49 @@ export default class Services { try { // First set the updated device in memory this.sdkClient.restore_device(device); - console.log('✅ Device restored in memory with updated birthday'); + + // Vérifier que le device a été restauré en mémoire + const restoredDevice = this.dumpDeviceFromMemory(); + if (restoredDevice?.sp_wallet?.birthday === device.sp_wallet.birthday) { + console.log('✅ Device restored in memory with updated birthday:', device.sp_wallet.birthday); + } else { + throw new Error(`Device restoration failed: expected birthday ${device.sp_wallet.birthday}, got ${restoredDevice?.sp_wallet?.birthday}`); + } // Then save it to database await this.saveDeviceInDatabase(device); - console.log('✅ Device saved to database with updated birthday'); + + // Vérifier que le device a été sauvegardé en base de données + const savedDevice = await this.getDeviceFromDatabase(); + if (savedDevice?.sp_wallet?.birthday === device.sp_wallet.birthday) { + console.log('✅ Device saved to database with updated birthday:', device.sp_wallet.birthday); + } else { + throw new Error(`Device save verification failed: expected birthday ${device.sp_wallet.birthday}, got ${savedDevice?.sp_wallet?.birthday}`); + } // For new wallets, perform initial scan to catch any existing transactions console.log(`🔄 Performing initial scan for new wallet from block ${device.sp_wallet.birthday} to ${this.currentBlockHeight}...`); await this.sdkClient.scan_blocks(this.currentBlockHeight, BLINDBITURL); - console.log('✅ Initial scan completed for new wallet'); + + // Vérifier que le scan est terminé en vérifiant last_scan + const deviceAfterScan = this.dumpDeviceFromMemory(); + if (deviceAfterScan?.sp_wallet?.last_scan === this.currentBlockHeight) { + console.log('✅ Initial scan completed for new wallet'); + } else { + console.warn(`⚠️ Initial scan may not be complete: expected last_scan ${this.currentBlockHeight}, got ${deviceAfterScan?.sp_wallet?.last_scan}`); + } // Update last_scan to current block height device.sp_wallet.last_scan = this.currentBlockHeight; await this.saveDeviceInDatabase(device); - console.log('✅ New wallet initial scan completed'); + + // Vérifier que le device a été sauvegardé avec last_scan mis à jour + const finalDevice = await this.getDeviceFromDatabase(); + if (finalDevice?.sp_wallet?.last_scan === this.currentBlockHeight) { + console.log('✅ New wallet initial scan completed and saved'); + } else { + throw new Error(`Final save verification failed: expected last_scan ${this.currentBlockHeight}, got ${finalDevice?.sp_wallet?.last_scan}`); + } } catch (e) { throw new Error(`Failed to save updated device: ${e}`); }