Files
2026-08-21 10:50:36 +02:00

6.0 KiB

Delta 0.2.6-pre.007 — identité autorisée + balance HTTP

Base requise

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

ksp-general-0.2.6-pre.007.zip

Cette tranche modifie Config, le runtime Wallet Desk et le frontend. Le signal technique devient :

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 :

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 :

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 :

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 :

src/transport_runtime.rs

Au bootstrap :

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 :

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 :

refresh_wallet_balance

Elle ne reçoit aucun argument frontend.

Rust verrouille brièvement WalletSession, accepte uniquement :

View
Owner

puis copie :

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 :

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 :

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 :

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 :

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 :

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 :

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

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 :

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.