# Delta `0.2.6-pre.008` — import natif Solana CLI JSON / Base58 ## Base et version - Base : `0.2.6-pre.007-fix.002`. - Version Cargo : `0.2.6-pre.8`. - Commit attendu : `v0.2.6-pre.008`. - Aucun tag prerelease. ## Objet Cette tranche matérialise l'import d'un keypair Solana externe vers un nouveau Wallet natif `.kspwallet` sans donner au frontend la propriété d'un chemin filesystem ni du contenu secret importé. Les formats pris en charge sont les deux formats de transfert déjà possédés par `ksp-wallet-lib` : - Solana CLI keypair JSON ; - keypair Solana Base58 canonique. ## Picker natif backend-only `tauri-plugin-dialog` est ajouté comme dépendance Rust workspace et initialisé par Wallet Desk. Le frontend ne dépend pas de `@tauri-apps/plugin-dialog` et aucune permission guest Dialog/FS n'est ajoutée. Le frontend transmet uniquement le format attendu à `inspect_import_source`. Rust ouvre le picker natif, convertit la sélection en chemin local et ne renvoie jamais ce chemin par IPC. Une annulation du picker est une sortie normale sans source staged. ## Staging borné et secret `wallet_import.rs` lit uniquement un fichier régulier non-symlink et applique avant parsing les bornes publiques de `ksp-wallet-lib` : - `KSPWALLET_TRANSFER_MAX_SOLANA_CLI_JSON_BYTES` ; - `KSPWALLET_TRANSFER_MAX_BASE58_BYTES`. Les octets sont conservés dans `Zeroizing>` côté Rust. La validation utilise `ksp-wallet-lib::inspect_wallet_transfer` et la projection frontend ne contient que : - format ; - Pubkey dérivée ; - basename de la source. Le parent du chemin, les octets du keypair et tout secret restent hors IPC/logs. ## Import vers `.kspwallet` `import_wallet` consomme atomiquement la source staged et appelle `ksp-wallet-lib::import_wallet_transfer_v1` en mémoire. Le fichier destination : - est dérivé uniquement de la racine Wallet effective possédée par Config et du filename root-scoped validé ; - hérite des garanties no-clobber de Wallet ; - reçoit un nouveau password OWNER et, optionnellement, un nouveau password VIEW ; - peut recevoir alias et note initiale protégés ; - conserve la même identité Solana que la source validée. Après succès, le `WalletOwner` importé est conservé uniquement dans `AppState` et la session devient OWNER ouverte. La source staged est consommée et zéroïsée à sa destruction. ## Frontend La vue `Create / Import` ajoute : - sélection du format de transfert ; - bouton d'ouverture du picker natif ; - aperçu sûr basename / format / Pubkey ; - filename `.kspwallet` destination ; - alias optionnel ; - password OWNER ; - VIEW optionnel + password VIEW ; - note initiale optionnelle ; - action d'import. Changer le format purge la projection et la source staged Rust. Après import ou erreur, les inputs sensibles et la projection de source sont purgés ; une nouvelle sélection native est nécessaire après un échec d'import. ## Sécurité / frontières - aucun chemin source dans les DTO frontend ; - aucun contenu keypair dans les DTO ou logs ; - aucun accès filesystem guest ; - aucun dialogue navigateur natif ; - aucune dépendance npm Dialog ; - le frontend ne choisit jamais la destination absolue ; - `ksp-wallet-lib` reste propriétaire du décodage/import et de la publication no-clobber. ## Fichiers principaux Ajouts : - `crates/ksp-app-wallet-desk/src/wallet_import.rs` ; - `crates/ksp-app-wallet-desk/unit_tests/wallet_import.rs` ; - `deltas/0.2.6/pre.008.md`. Modifications principales : - dépendances/version workspace et Wallet Desk ; - `AppState` pour staging/import ; - commandes/plugins Tauri ; - shell Create / Import et bindings frontend ; - canaris desktop contract/security ; - plan `0.2.6`, séquence fonctionnelle et roadmap. ## Validation opérateur attendue ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-app-wallet-desk cargo test --workspace KSP_WALLETS_DIRECTORY=var/wallet-desk-pre008 \ cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json ``` Ne pas exécuter `cargo tauri build` dans cette tranche.