Files
khadhroony-solana-project/deltas/0.2.6/pre.007.md
2026-08-21 10:50:36 +02:00

244 lines
6.0 KiB
Markdown

<!-- file: deltas/0.2.6/pre.007.md -->
<!-- version: 1 -->
# Delta `0.2.6-pre.007` — identité autorisée + balance HTTP
## Base requise
```text
0.2.6-pre.006-fix.001 appliquée
workspace.package.version = 0.2.6-pre.6.fix.1
```
Le checkpoint opérateur de `pre.006-fix.001` est entièrement vert : formatage, audit structurel, `cargo check`, Clippy, tests Wallet Desk, workspace complet et `cargo tauri dev`. Les quatre chemins d'unlock VIEW/OWNER manuel/configuré ont été vérifiés en runtime.
## Type de livraison
```text
ksp-general-0.2.6-pre.007.zip
```
Cette tranche modifie Config, le runtime Wallet Desk et le frontend. Le signal technique devient :
```text
workspace.package.version = 0.2.6-pre.7
commit = v0.2.6-pre.007
```
Aucun tag stable.
## Objet
Fermer le MVP obligatoire de Wallet Desk en composant réellement :
```text
Config composite
-> Wallet VIEW/OWNER autorisé
-> Pubkey Rust-only comme source RPC
-> HttpTransportPool
-> getBalance
-> balance sûre frontend
```
Aucun nouveau wrapper HTTP n'est ajouté : `ksp-onchain-transport-lib::HttpTransportPool::get_balance` est réutilisé directement.
## Config -> Transport avec provenance composite
`ksp-config-lib` ajoute :
```text
ConfigDocumentEngine::resolve_transport_config_profile
```
Cette API est l'équivalent Transport des adapters déjà disponibles pour Logging et Wallet. Elle accepte un `ResolvedConfigProfile` sélectionné par composite, impose `cfg.std.transport`, valide le descriptor et conserve :
```text
selection_source = Composite
```
Wallet Desk ne recharge donc pas `devnet_public` comme une sélection explicite indépendante du composite.
## Runtime Transport Wallet Desk
Nouveau module :
```text
src/transport_runtime.rs
```
Au bootstrap :
```text
cfg.composite.ksp-app-wallet-desk
-> component transport
-> resolve_transport_config_profile
-> HttpTransportPool::new
-> validation locale d'une route getBalance / role default
```
Le pool est conservé dans `AppState` et partagé par les refresh de balance.
Les diagnostics sûrs exposent uniquement :
```text
transport profile
role = default
cluster(s)
provider(s)
endpoint_count
available_endpoint_count
```
Les URLs Transport restent absentes des DTOs/frontend/logs applicatifs.
## Balance autorisée
Nouvelle commande :
```text
refresh_wallet_balance
```
Elle ne reçoit **aucun argument frontend**.
Rust verrouille brièvement `WalletSession`, accepte uniquement :
```text
View
Owner
```
puis copie :
```text
wallet_id
capability
Pubkey
```
Le mutex est libéré avant l'I/O réseau. `Locked`, `NoSelection` et `PrivilegedOperation` ne peuvent pas effectuer le RPC.
Appel :
```text
HttpTransportPool::get_balance(
role = default,
pubkey = issue du handle VIEW/OWNER Rust,
commitment = confirmed,
)
```
Après l'I/O, le backend vérifie que le même wallet/capability/Pubkey est encore autorisé. Si un Lock, Deselect ou changement de wallet est intervenu entre-temps, la réponse stale est rejetée au lieu d'être reprojetée.
## `WalletBalanceDto`
Le nouveau DTO expose :
```text
wallet_id
lamports decimal string exacte
sol decimal exact à 9 décimales
slot
api_version optionnelle
transport_profile
transport_role
```
`lamports` traverse IPC comme chaîne décimale afin d'éviter toute perte de précision JavaScript sur un `u64` supérieur à `Number.MAX_SAFE_INTEGER`.
La représentation SOL est dérivée sans floating point :
```text
0 -> 0.000000000
1 -> 0.000000001
1_000_000_000 -> 1.000000000
```
## Frontend
Le Dashboard affiche maintenant les diagnostics Transport sûrs.
La vue Details devient fonctionnelle après VIEW/OWNER :
```text
Pubkey
alias
notes
lamports
SOL
RPC slot
RPC api_version
Transport profile / role
Refresh balance
```
Le bouton `Refresh balance` reste désactivé tant que la session n'est pas VIEW ou OWNER.
Lock/Deselect/Refresh inventory/changement de wallet purgent la projection de balance avec les autres données autorisées.
Le frontend ignore également une réponse de balance qui ne correspond plus au `activeWalletId` courant, en complément de la vérification backend.
## Tests et canaris
Ajouts/renforcements :
```text
Config Transport adapter composite -> provenance Composite
composite Wallet Desk -> HttpTransportPool -> route getBalance
format lamports/SOL exact sans flottant
commande refresh_wallet_balance présente
Pubkey obtenue via wallet.pubkey() côté Rust
commitment confirmed
refresh frontend sans pubkey ni endpoint URL
UI Details / diagnostics Transport présents
```
Le smoke réseau réel reste effectué via `cargo tauri dev` avec un wallet VIEW/OWNER autorisé ; aucun wallet financé n'est requis, une réponse `0` lamport est valide.
## Dépendances
Wallet Desk consomme maintenant directement la crate KSP interne déjà présente dans le workspace :
```text
ksp-onchain-transport-lib
```
Aucune dépendance tierce Cargo ou npm n'est ajoutée et aucune capability Tauri supplémentaire n'est nécessaire.
**Aucune commande npm directe n'est nécessaire.**
## Validation opérateur requise
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-config-lib
cargo test -p ksp-app-wallet-desk
cargo test --workspace
KSP_WALLETS_DIRECTORY=var/wallet-desk-pre007 \
cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json
```
Dans l'application :
```text
créer ou sélectionner un vrai .kspwallet
-> unlock VIEW ou OWNER
-> Details
-> Refresh balance
-> vérifier lamports / SOL / slot / api_version
-> Lock
-> vérifier purge de la balance et bouton désactivé
```
Le RPC `getBalance` peut retourner `0` lamport : ce résultat doit être affiché comme un succès normal.
Toujours aucun `cargo tauri build` à ce stade.
## Suite
`pre.008` ajoutera l'import Solana CLI JSON / Base58 avec picker natif minimal, inspection sûre de la source, nouveaux credentials KSP et destination no-clobber sous la racine Wallet effective.