fix(avatar/desktop) + feat(wallet): asset spam, member name & on-demand wallet sync

Summary

Three independent changes (+ a CLAUDE.md note), each in its own commit:

🐛 fix(avatar): stop passing file paths to Image.asset

A wallet/safe imagePath can be either a bundled asset (assets/…) or an avatar file saved on disk. Two views passed disk paths straight to Image.asset, which can't read files → Unable to load asset: <path>.png log spam (blank fallback avatar). File paths now route through CachedAvatarImage (reads the bytes), matching the existing canonical handling. Files: wallet_header.dart, safe_selection_screen.dart.

🏷️ fix(desktop): show the member name in the wallet-options modal title

The desktop wallet-options modal title used WalletNameService.displayName(wallet.name) → always "Portefeuille principal" for the main wallet, even for a validated member account. It now mirrors the mobile app-bar logic (prefer the on-chain indexed identity name). File: wallet_options_modal.dart.

🔄 feat(wallet): on-demand "Synchronize wallets"

A new action in the shared safe-options screen (mobile + desktop) re-runs the HD derivation scan on demand and imports funded derivation wallets that are missing locally — e.g. after creating a derivation on another device.

A dedicated syncActiveSafe() was written rather than reusing scanDerivations() (which is import-only: it re-imports every derivation and deletes the safe on error). The new method:

  • skips addresses already imported in any safe (no duplicates, never touches a shared safe);
  • never deletes the safe.

A derivation is only detected when its address holds ≥ 1 Ğ1. Localized in fr/en/es/it/eo/de.

Testing

  • flutter analyze clean.
  • Verified on Windows desktop: #2 (closed) the title shows the member name; #3 (closed) syncs a wallet created on another device and produces no duplicates on re-sync.

Pre-MR audit

A full multi-agent audit (security, performance, regressions, clean code, redundancy, coherence, pertinence) was run: no blocking/major issues. Applied findings: shared _createWallets helper (de-duplication), removed dead onStatusChanged plumbing, balance-scan timeout now reported as a timeout. Follow-up noted: add a unit test for syncActiveSafe invariants.

🤖 Generated with Claude Code

Merge request reports

Loading