diff --git a/Cargo.toml b/Cargo.toml index 6f8f0e6..1e5d4a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ # file: Cargo.toml -# version: 19 +# version: 20 [workspace] resolver = "3" @@ -18,7 +18,7 @@ members = [ ] [workspace.package] -version = "0.4.7-pre.12" +version = "0.4.7-pre.13" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-bot3" diff --git a/docs/DEVNET_EXECUTION_GUIDE.md b/docs/DEVNET_EXECUTION_GUIDE.md index 4da205b..cf8e1e8 100644 --- a/docs/DEVNET_EXECUTION_GUIDE.md +++ b/docs/DEVNET_EXECUTION_GUIDE.md @@ -1,5 +1,5 @@ - + # Guide d’exécution Devnet @@ -14,7 +14,8 @@ Ce guide décrit la campagne Devnet de `kb-app-demo-desktop` et `kb-pipeline-dem 5. SPL Associated Token Account — mint Token-2022 ; 6. SPL Token classique ; 7. Token-2022 ; -8. registre ElGamal. +8. registre ElGamal ; +9. Metaplex Token Metadata — préparation de fixture, simulation puis soumission explicite. Les commandes réutilisables sont centralisées en section 4. Chaque scénario référence leur identifiant `Cxx` au lieu de les recopier. @@ -791,3 +792,21 @@ La campagne est clôturable uniquement lorsque : - le replay ciblé est sans échec ni erreur de traitement ; - les projections sont présentes et idempotentes ; - le présent guide reflète les commandes réellement exécutées. + +## 10. Metaplex Token Metadata + +Dans `demo_execution_metadata`, sélectionner un profil Devnet puis préparer sa base. Le panneau charge le même inventaire de profils que les démonstrations Solana Core et SPL. + +Pour `Create`, utiliser **Préparer la fixture Create**. Cette action : + +1. charge le wallet persistant du profil ; +2. crée ou réutilise un mint SPL classique à zéro décimale ; +3. dérive automatiquement les PDA `metadata` et `master edition` ; +4. génère l’intent typé prêt à simuler. + +Les placeholders entre chevrons ne sont jamais des valeurs exécutables. Toujours lancer une simulation RPC avant d’activer la soumission et la confirmation opérateur. Le journal du panneau et les blocs JSON titrés constituent les preuves applicatives immédiates ; la signature, le slot et les postconditions sont requis pour déclarer une validation réseau. + + +### Paramètres communs du panneau Metadata + +Le panneau Metaplex utilise le même modèle opérateur que Solana Core et SPL : profil Devnet préparé, limites de dépense visibles, journal commun avec une seule barre `Copier` / `Effacer`, bouton de simulation distinct du bouton de soumission et confirmation opérateur séparée. Une soumission construit un plan avec `dry_run = false`, mais la transaction ne peut être signée ou envoyée qu'après réussite de la simulation exacte du même message. diff --git a/docs/guides/DEVNET_VALIDATION.md b/docs/guides/DEVNET_VALIDATION.md index 286d7e5..68b7bfa 100644 --- a/docs/guides/DEVNET_VALIDATION.md +++ b/docs/guides/DEVNET_VALIDATION.md @@ -1,5 +1,5 @@ - + # Guide de validation Devnet @@ -63,3 +63,14 @@ Le registre ElGamal ne doit pas être déclaré validé sur Devnet ou Mainnet sa - `docs/DEVNET_EXECUTION_GUIDE.md` ; - `kb-pipeline-demo-scenarios/USAGE.md` ; - `kb-app-demo-desktop/USAGE.md`. + +## Metaplex Token Metadata + +Les scénarios Metadata utilisent un profil Devnet existant, le runner de `kb-pipeline-demo-scenarios` et le panneau `demo_execution_metadata`. Les PDA dérivables ne doivent pas être saisis manuellement. Une fixture `Create` prépare le mint et dérive les PDA canoniques. + +Une liste de profils vide est une erreur de configuration ou de raccordement et doit être signalée explicitement. Une validation réseau exige une simulation RPC réelle ; une soumission exige en plus confirmation opérateur, signature, confirmation et postconditions observées. + + +### Paramètres communs du panneau Metadata + +Le panneau Metaplex utilise le même modèle opérateur que Solana Core et SPL : profil Devnet préparé, limites de dépense visibles, journal commun avec une seule barre `Copier` / `Effacer`, bouton de simulation distinct du bouton de soumission et confirmation opérateur séparée. Une soumission construit un plan avec `dry_run = false`, mais la transaction ne peut être signée ou envoyée qu'après réussite de la simulation exacte du même message. diff --git a/docs/validation/V0_4_7_PRE_013_METAPLEX_DESKTOP_DEVNET_EXECUTION.md b/docs/validation/V0_4_7_PRE_013_METAPLEX_DESKTOP_DEVNET_EXECUTION.md new file mode 100644 index 0000000..48380c8 --- /dev/null +++ b/docs/validation/V0_4_7_PRE_013_METAPLEX_DESKTOP_DEVNET_EXECUTION.md @@ -0,0 +1,125 @@ + + + +# Validation `0.4.7-pre.013` — exécution Metadata Devnet desktop + +## Périmètre + +- adaptateurs Tauri minces vers `kb-pipeline-demo-scenarios` ; +- inventaire des 20 opérations courantes ; +- modèles JSON typés disponibles pour les parcours nommés ; +- simulation RPC Devnet réelle par défaut ; +- soumission uniquement avec `submit` et `operatorConfirmed` ; +- affichage distinct du plan, du préflight, de la simulation et des preuves stateful ; +- maintien des scénarios synthétiques. + +## Contrats de sécurité + +- profil obligatoirement classé Devnet ; +- opérations dépréciées rejetées par le runner réutilisable ; +- intent et lectures stateful désérialisés côté Rust ; +- une campagne Devnet déjà active bloque une seconde exécution ; +- aucune preuve réseau n’est produite par les scénarios synthétiques. + +## Correctif `pre.013-fix-001` + +- correction de la conversion de `MdSignature` vers la chaîne UI en lisant explicitement la valeur du newtype ; +- aucun changement du contrat réseau, du runner ou des DTO ; +- compilation et validations locales à rejouer après application. + +## Validation locale attendue + +```bash +cargo fmt --all +cargo check --workspace +cargo clippy --all-targets +python3 scripts/audit_rust_workspace_rules.py +cargo test -p kb-app-demo-desktop +cargo test -p kb-pipeline-demo-scenarios +cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json +``` + +La validation manuelle doit remplacer les placeholders par des comptes Devnet réels, lancer une simulation puis, pour un parcours maîtrisé, une soumission explicitement confirmée. Les signatures, slots et postconditions doivent être conservés comme preuves avant la clôture. + +## Correctif guide, fixture Create et profils Devnet + +- ajout du guide intégré et du journal d’exécution dans le panneau Metadata ; +- ajout des titres des blocs JSON ; +- ajout du préparateur de fixture `Create` avec mint SPL classique et PDA dérivés ; +- ajout des dépendances directes `mpl-token-metadata` et `solana-pubkey` dans `kb-pipeline-demo-scenarios` ; +- chargement des profils via une commande Metadata dédiée ; +- préparation automatique du profil sélectionné, comme dans les panneaux Solana Core et SPL ; +- diagnostic explicite lorsqu’aucun profil Devnet compatible n’est retourné. + +## Correctif d’initialisation frontend + +- les listes de profils, contrats et opérations restaient vides parce que l’initialisation `DOMContentLoaded` échouait avant les appels Tauri ; +- le TypeScript attendait `clearMetadataLogButton` et `metadataExecutionLogOutput`, absents du HTML ; +- les deux contrôles sont ajoutés au panneau ; +- un test de contrat vérifie désormais la présence de tous les identifiants nécessaires au chargement initial. + + +## Correctif fix-005 + +- suppression de la duplication des contrôles Copier/Effacer du journal ; +- ajout d’un panneau de paramètres communs Devnet avec limites du profil ; +- séparation des boutons Simuler et Soumettre ; +- autorisation de construire un plan de soumission avec `dry_run = false`, la simulation exacte restant obligatoire avant signature et envoi ; +- maintien du refus de soumission sans confirmation opérateur. + +## Correctif `pre.013-fix-006` — print supply NFT + +La campagne Devnet a atteint le programme Metaplex et exécuté l’instruction `Create` en simulation réelle. Le programme a refusé le modèle avec l’erreur `Print supply is required for non-fungibles` (`Custom(166)`) parce que `print_supply` était `null`. + +Le modèle nommé et le préparateur de fixture utilisent désormais `PrintSupply::Zero`, sérialisé sous la forme JSON `"Zero"`, pour le scénario `NonFungible`. Un test empêche la régression. La simulation et la soumission doivent être rejouées après application ; aucune soumission réussie n’est déclarée dans ce rapport. +## Correctif `pre.013-fix-007` — programme SPL Token requis + +La simulation réelle suivante a dépassé la validation de `PrintSupply::Zero`, puis le programme Metaplex a refusé l’instruction avec `Missing SPL token program` (`Custom(149)`). Le transport RPC, la compilation du message, l’estimation des frais et l’appel `simulateTransaction` ont donc été confirmés ; aucune soumission n’a eu lieu. + +Le modèle nommé et le préparateur de fixture `Create` renseignent désormais explicitement le programme SPL Token classique canonique : + +```text +TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA +``` + +Les tests vérifient conjointement `print_supply = "Zero"` et ce Program ID. La campagne doit être rejouée en simulation avant toute soumission. + + +## Correctif `fix-008` — préconditions réseau par opération + +- la fixture `Create` utilise un nouveau mint versionné créé avec freeze authority active ; +- owner, layout classique, décimales, supply, mint authority et freeze authority sont vérifiés avant génération de l’intent ; +- une opération sans modèle nommé efface l’intent courant et bloque simulation/soumission, au lieu de réutiliser le JSON précédent ; +- les requirements Metaplex sont documentés dans `kb-lib/USAGE.md` et `kb-pipeline/USAGE.md` ; +- les simulations observées avant ce correctif ont toutes échoué et ne sont pas déclarées validées. + +## Correctif 009 — parcours cohérents et matérialisation optionnelle + +La validation desktop n’utilise plus implicitement une opération isolée sans contexte de fixture. L’inventaire expose cinq parcours : NFT classique, SFT, fungible, collection parent/membre et pNFT. Chaque parcours précise la fixture, l’état initial, l’état terminal, les opérations applicables et les projections attendues. + +La matérialisation est désormais une option opérateur indépendante. Après confirmation, elle exige des lectures de postcondition, décode les comptes Metaplex bornés et produit les projections canoniques correspondantes. Elle ne télécharge pas les URI off-chain. + +La fixture NFT a été versionnée en `create-mint-profile-authority-v3.json` afin de ne pas réutiliser le mint déjà soumis. La mint authority et la freeze authority doivent être le wallet du profil, tandis que le keypair du mint ne sert qu’à signer la création du compte mint. + +## Correctif `0.4.7-pre.013-fix-010` — compatibilité de la CLI `spl-token` + +La CLI locale utilisée pour les validations ne prend pas en charge l’option `create-token --freeze-authority`. Le préparateur utilise donc le parcours compatible suivant : + +1. création du mint classique à `0` décimale avec `--enable-freeze` ; +2. transfert explicite de l’autorité `freeze` depuis le keypair du mint vers le wallet du profil ; +3. transfert explicite de l’autorité `mint` vers le même wallet ; +4. relecture du compte et validation stricte des deux autorités avant génération de l’intent Metaplex. + +La fixture est versionnée en `create-mint-profile-authority-v4.json` afin de ne pas réutiliser un mint absent ou partiellement préparé par le correctif précédent. + +### 0.4.7-pre.13 fix-011 + +- remplace la préparation Metaplex fondée sur `solana-keygen`, `solana` et `spl-token` par une transaction Rust native ; +- crée le mint par `SystemCreateAccount` puis `SPL Token InitializeMint2` dans un même message simulé, signé et confirmé ; +- utilise explicitement le wallet du profil comme mint authority et freeze authority ; +- conserve le keypair du mint dans `kb-wallet` sans exposer ni déléguer ses secrets à une CLI externe. + + +## Correctif fonctionnel fix-014 + +Le panneau n’expose plus les cinq parcours Devnet comme s’ils étaient tous préparables. Le premier parcours réellement exécutable est le NFT classique `create -> update`. La préparation d’étape génère conjointement l’intent, les lectures avant confirmation et les lectures après confirmation utilisées par la matérialisation. Les parcours collection, SFT, fungible et pNFT restent présents dans la matrice synthétique cible et devront être activés seulement après ajout de leurs fixtures complètes. diff --git a/kb-app-demo-desktop/CHANGELOG.md b/kb-app-demo-desktop/CHANGELOG.md index d99259f..bf22333 100644 --- a/kb-app-demo-desktop/CHANGELOG.md +++ b/kb-app-demo-desktop/CHANGELOG.md @@ -1,8 +1,57 @@ - + # CHANGELOG — kb-app-demo-desktop +## 0.4.7-pre.013-fix-015 + +- aligne les tests desktop sur le nombre réel de scénarios synthétiques et Devnet exposés par les registres réutilisables ; +- conserve explicitement au moins un scénario collection et un scénario programmable dans l’inventaire ; +- borne les lectures Metadata et Edition à `65536` octets conformément au contrat `getAccountInfo` ; +- sérialise les toggles Metaplex `Collection`, `CollectionDetails`, `Uses` et `RuleSet` avec la variante `None` au lieu de `null` dans l’étape Update. + +## 0.4.7-pre.013-fix-014 + +- remplace le flux global opération/modèle/fixture Create par une préparation contextuelle de l’étape du scénario ; +- remplit automatiquement l’intent et les lectures stateful avant/après ; +- ajoute la navigation étape précédente/suivante et refuse l’exécution d’un intent périmé ; +- rend la matérialisation utilisable sans saisie manuelle des comptes de postcondition ; +- expose uniquement le parcours Devnet NFT actuellement entièrement préparé (`create` puis `update`). + +### 0.4.7-pre.13 fix-011 + +- remplace la préparation Metaplex fondée sur `solana-keygen`, `solana` et `spl-token` par une transaction Rust native ; +- crée le mint par `SystemCreateAccount` puis `SPL Token InitializeMint2` dans un même message simulé, signé et confirmé ; +- utilise explicitement le wallet du profil comme mint authority et freeze authority ; +- conserve le keypair du mint dans `kb-wallet` sans exposer ni déléguer ses secrets à une CLI externe. + +### 0.4.7-pre.013-fix.009 + +- affiche les parcours, fixtures et états Metaplex dans le panneau Devnet ; +- ajoute l’option de matérialisation des snapshots confirmés ; +- expose le nombre de projections produites dans les résultats. + +## 0.4.7-pre.13-fix.008 — les fixtures `Create` utilisent un nouveau mint à freeze authority active, valident owner/layout/décimales/supply/autorités avant simulation et empêchent la réutilisation d’un intent précédent lorsqu’aucun modèle nommé n’existe. + +## 0.4.7-pre.13-fix.005 — alignement du panneau Metadata sur les paramètres communs Devnet, boutons simulation/soumission séparés et correction du contrat dry-run après simulation.-fix.4 + +- correction de l’initialisation du panneau Metadata : ajout des contrôles HTML du journal attendus par le TypeScript ; +- ajout d’un test de contrat empêchant la disparition des sélecteurs de profil, scénario, opération et journal. + +## 0.4.7-pre.13-fix.002 + +- Ajout du guide intégré, du journal d’exécution et de titres explicites pour les résultats JSON Metaplex. +- Ajout d’un préparateur idempotent de fixture `Create` : mint SPL classique Devnet, PDA metadata et master edition dérivés, intent JSON prêt à simuler. + +## 0.4.7-pre.013 — exécution Metadata Devnet réelle + +- ajout des commandes Tauri minces pour inventorier les opérations courantes, générer les modèles typés et appeler le runner Devnet réutilisable ; +- ajout de la simulation RPC réelle et de la soumission doublement autorisée depuis le panneau Metadata ; +- affichage séparé du plan, du préflight, de la simulation, de la signature, de la confirmation et des états avant/après ; +- conservation parallèle des scénarios synthétiques ; +- ajout des bindings TS-RS de requête et de résultat. +- correction de l’extraction de la signature réseau depuis le newtype `MdSignature` sans dépendre de `Display`. + ## 0.4.7-pre.011 — réouverture des démonstrations Devnet ### Documentation diff --git a/kb-app-demo-desktop/README.md b/kb-app-demo-desktop/README.md index 25cdf86..8a97811 100644 --- a/kb-app-demo-desktop/README.md +++ b/kb-app-demo-desktop/README.md @@ -1,5 +1,5 @@ - + # kb-app-demo-desktop @@ -12,7 +12,7 @@ - diagnostics PostgreSQL ; - backfill, extraction Core et replay ; - démonstrations Solana Core, SPL Memo, SPL Token, ATA et Token-2022 ; -- panneau Metadata avec scénarios synthétiques, sélection du profil Devnet, préparation de la base et affichage structuré par le JSON viewer commun ; +- panneau Metadata avec scénarios synthétiques, préparation du profil et de la base, intents typés, simulation RPC Devnet réelle et soumission explicitement confirmée ; - progression, annulation et restauration de l’état des fenêtres. ## Frontière architecturale @@ -23,10 +23,12 @@ Les scénarios UI Devnet/Testnet restent dans le desktop. Des tests automatisés ## Statut Metaplex `0.4.7` -Le panneau distingue correctement les contrats synthétiques et le contexte Devnet. Les exécutions RPC réelles des 20 opérations courantes seront raccordées pendant `pre.013`, après achèvement des campagnes réutilisables de `pre.011` et `pre.012`. +Le panneau conserve les scénarios synthétiques et appelle directement le runner réutilisable de `kb-pipeline-demo-scenarios` pour les opérations Metaplex courantes. La simulation RPC est réelle ; la soumission exige deux autorisations distinctes dans la requête desktop. ## Documentation - [Guide d’utilisation](USAGE.md) - [Travaux restant à réaliser](TODO.md) - [Historique des changements](CHANGELOG.md) + +- Le parcours Metaplex desktop fournit un guide intégré, un journal, des résultats JSON titrés et un préparateur de fixture `Create`. diff --git a/kb-app-demo-desktop/TODO.md b/kb-app-demo-desktop/TODO.md index 877b455..4c57209 100644 --- a/kb-app-demo-desktop/TODO.md +++ b/kb-app-demo-desktop/TODO.md @@ -1,14 +1,14 @@ - + # TODO — kb-app-demo-desktop ## `0.4.7-pre.013` — démonstrations Metadata Devnet -- [ ] Commandes Tauri - raccorder les campagnes Metaplex Devnet réutilisables sans dupliquer leur logique. -- [ ] Interface - permettre simulation et soumission explicitement confirmée pour les opérations courantes disponibles. -- [ ] Contexte - afficher profil, cluster, base, wallet, mode, signature, slot et preuves de postcondition. -- [ ] Cohérence - conserver en parallèle les scénarios synthétiques et empêcher qu’ils soient présentés comme preuves réseau. +- [x] Commandes Tauri - raccorder les campagnes Metaplex Devnet réutilisables sans dupliquer leur logique. +- [x] Interface - permettre simulation et soumission explicitement confirmée pour les opérations courantes disponibles. +- [x] Contexte - afficher profil, cluster, base, wallet, mode, signature, slot et preuves de postcondition. +- [x] Cohérence - conserver en parallèle les scénarios synthétiques et empêcher qu’ils soient présentés comme preuves réseau. - [ ] Validation manuelle - exécuter les parcours disponibles et confirmer la cohérence préflight, simulation, confirmation, soumission et postconditions. ## Versions ultérieures diff --git a/kb-app-demo-desktop/USAGE.md b/kb-app-demo-desktop/USAGE.md index 350c56c..a4adfc3 100644 --- a/kb-app-demo-desktop/USAGE.md +++ b/kb-app-demo-desktop/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de kb-app-demo-desktop @@ -194,6 +194,36 @@ console.log(scenarios); La simulation et l’envoi doivent rester explicitement distingués dans les requêtes. +### Exécution Metadata Devnet + +Le panneau Metadata charge les opérations courantes depuis `demo_execution_metadata_current_operations` et peut demander un modèle avec `demo_execution_metadata_operation_template`. + +```typescript +const operationJson = await invoke( + "demo_execution_metadata_operation_template", + { operation: "verify" } +); + +const summary = await invoke( + "demo_execution_metadata_execute", + { + request: { + profileName: "devnet", + intentId: `desktop-metaplex-${Date.now()}`, + operationJson, + preflightReadsJson: "[]", + postconditionReadsJson: "[]", + submit: false, + operatorConfirmed: false + } + } +); + +console.log(summary); +``` + +Les valeurs `<...>` d’un modèle doivent être remplacées par des comptes réels avant exécution. `submit: true` exige simultanément `operatorConfirmed: true`. Le résultat distingue le plan, le préflight stateful, la simulation RPC, la signature éventuelle, la confirmation et les états avant/après. + ### Diagnostics PostgreSQL ```typescript @@ -258,3 +288,7 @@ Depuis la fenêtre principale, choisir **Exécution Devnet → Exécution Metada Un contrat marqué Devnet n’est pas, à lui seul, une exécution réseau. Les champs `networkExecutionPerformed` et `networkEvidenceCollected` doivent rester faux tant qu’aucun appel RPC réel et aucune preuve correspondante n’ont été produits. Les commandes de simulation et de soumission Metaplex seront documentées ici après leur raccordement effectif pendant `0.4.7-pre.013`. + +### Préparation de la fixture Metaplex `Create` + +Le panneau desktop peut créer ou réutiliser un mint SPL classique Devnet à zéro décimale. Le préparateur dérive ensuite automatiquement les PDA `metadata` et `master edition` et génère un intent `Create` typé. Les valeurs entre chevrons des modèles génériques restent des placeholders non exécutables. diff --git a/kb-app-demo-desktop/capabilities/default.json b/kb-app-demo-desktop/capabilities/default.json index 41b298d..b0d0f3b 100644 --- a/kb-app-demo-desktop/capabilities/default.json +++ b/kb-app-demo-desktop/capabilities/default.json @@ -5,16 +5,16 @@ "windows": [ "splash", "main", - "demo_backfill", + "demo_config", "demo_http", "demo_ws", + "demo_backfill", + "demo_core_extraction", + "demo_decode_replay", "demo_sql_diag", "demo_sql_pg_raw", "demo_sql_pg_core", "demo_sql_replay_candidates", - "demo_config", - "demo_core_extraction", - "demo_decode_replay", "demo_execution_solana_core", "demo_execution_spl", "demo_execution_metadata" diff --git a/kb-app-demo-desktop/frontend/demo_execution_metadata.html b/kb-app-demo-desktop/frontend/demo_execution_metadata.html index 41ccc4a..17d4694 100644 --- a/kb-app-demo-desktop/frontend/demo_execution_metadata.html +++ b/kb-app-demo-desktop/frontend/demo_execution_metadata.html @@ -1,5 +1,5 @@ - + @@ -24,6 +24,23 @@
create puis update sur un NFT classique.${scenario.assetFamily}${scenario.mode}${networkMode ? selectedProfileName ?? "non chargé" : "non applicable"}${scenario.validationStatus}${scenario.assetFamily}${scenario.fixtureKind}${scenario.initialState}${scenario.resultingState}${scenario.mode}${networkMode ? selectedProfileName ?? "non chargé" : "non applicable"}${scenario.validationStatus}